Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
#include <tstringid.h>
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
#include <QMutex>
Ivan Mahonin 6e237b
#include <QMutexLocker>
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
//---------------------------------------------------------
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
struct TStringId::StaticData {
Ivan Mahonin 6e237b
  Map map;
Ivan Mahonin 6e237b
  std::vector<Iterator> iterators;
Ivan Mahonin 6e237b
  Iterator none;
Ivan Mahonin 6e237b
  QMutex mutex;
Ivan Mahonin 6e237b
  StaticData() {
Ivan Mahonin 6e237b
    map[std::string()] = 0;
Ivan Mahonin 6e237b
    none = map.begin();
Ivan Mahonin 6e237b
    iterators.push_back(none);
Ivan Mahonin 6e237b
  }
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
  static StaticData& instance() {
Ivan Mahonin 6e237b
    static StaticData data;
Ivan Mahonin 6e237b
    return data;
Ivan Mahonin 6e237b
  }
Ivan Mahonin 6e237b
};
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
//---------------------------------------------------------
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
const TStringId::Iterator&
Ivan Mahonin 6e237b
TStringId::none()
Ivan Mahonin 6e237b
  { return StaticData::instance().none; }
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
//---------------------------------------------------------
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
TStringId::Iterator
Ivan Mahonin 6e237b
TStringId::genIter(const std::string &str) {
Ivan Mahonin 6e237b
  StaticData &data = StaticData::instance();
Ivan Mahonin 6e237b
  if (str.empty()) return data.none;
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
  QMutexLocker lock(&data.mutex);
Ivan Mahonin 6e237b
  Iterator i = data.map.find(str);
Ivan Mahonin 6e237b
  if (i == data.map.end()) {
Ivan Mahonin 6e237b
    i = data.map.insert(std::pair<std::string, int>(str, (int)data.iterators.size())).first;
Ivan Mahonin 6e237b
    data.iterators.push_back(i);
Ivan Mahonin 6e237b
  }
Ivan Mahonin 6e237b
  return i;
Ivan Mahonin 6e237b
}
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
//---------------------------------------------------------
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
TStringId::Iterator
Ivan Mahonin 6e237b
TStringId::findIter(int id) {
Ivan Mahonin 6e237b
  StaticData &data = StaticData::instance();
Ivan Mahonin 6e237b
  if (id <= 0) return data.none;
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
  QMutexLocker lock(&data.mutex);
Ivan Mahonin 6e237b
  return id < (int)data.iterators.size() ? data.iterators[id] : data.none;
Ivan Mahonin 6e237b
}
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
//---------------------------------------------------------
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
TStringId::Iterator
Ivan Mahonin 6e237b
TStringId::findIter(const std::string &str) {
Ivan Mahonin 6e237b
  StaticData &data = StaticData::instance();
Ivan Mahonin 6e237b
  if (str.empty()) return data.none;
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
  QMutexLocker lock(&data.mutex);
Ivan Mahonin 6e237b
  Iterator i = data.map.find(str);
Ivan Mahonin 6e237b
  return i == data.map.end() ? data.none : i;
Ivan Mahonin 6e237b
}
Ivan Mahonin 6e237b
Ivan Mahonin 6e237b
//---------------------------------------------------------