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