37 void clear(
const uint64_t pos);
39 struct HashLimaStringPtr
44 struct EquaLimaStringPtr
49 typedef std::unordered_map<
53 EquaLimaStringPtr > LimaStringPtrHashMap;
54 LimaStringPtrHashMap m_hashPool;
55 LimaStringPtrHashMap m_resourcesHashPool;
56 std::vector< LimaString* > m_vecPool;
60 uint64_t m_resourcesPoolIndex;
62 std::set< void* > m_users;
67StringsPoolPrivate::StringsPoolPrivate():
69 m_resourcesHashPool(),
71 m_resourcesPoolIndex(0),
75 StringsPoolIndex newPosition =
static_cast<StringsPoolIndex
>(m_vecPool.size());
77 const_cast< std::vector< LimaString* >*
>(&m_vecPool)->push_back(newString);
78 const_cast< StringsPoolPrivate::LimaStringPtrHashMap*
>(&m_hashPool)->insert(std::make_pair(newString, newPosition));
79 m_resourcesPoolIndex=1;
83StringsPoolPrivate::~StringsPoolPrivate()
101 return m_d->m_vecPool.size()==1;
106 return m_d->m_vecPool.size();
111 m_d->m_resourcesPoolIndex=m_d->m_vecPool.size();
112 m_d->m_resourcesHashPool=m_d->m_hashPool;
119 if (m_d->m_hashPool.find(&str) == m_d->m_hashPool.end())
121 StringsPoolIndex newPosition =
static_cast<StringsPoolIndex
>(m_d->m_vecPool.size());
123 const_cast< std::vector< LimaString* >*
>(&m_d->m_vecPool)->push_back(newString);
124 const_cast< StringsPoolPrivate::LimaStringPtrHashMap*
>(&m_d->m_hashPool)->insert(std::make_pair(newString, newPosition));
130 StringsPoolIndex pos = (*(
const_cast< StringsPoolPrivate::LimaStringPtrHashMap*
>(&m_d->m_hashPool)))[&str];
140 if (m_d->m_hashPool.find(&str) == m_d->m_hashPool.end())
142 QMutexLocker locker(&m_d->m_mutex);
143 StringsPoolIndex newPosition =
static_cast<StringsPoolIndex
>(m_d->m_vecPool.size());
145 m_d->m_vecPool.push_back(newString);
146 m_d->m_hashPool.insert(std::make_pair(newString, newPosition));
152 StringsPoolIndex pos = m_d->m_hashPool[&str];
162 if (ind >=
static_cast<StringsPoolIndex
>(m_d->m_vecPool.size()))
164 std::ostringstream oss;
165 oss <<
"stringspool(size = " << m_d->m_vecPool.size() <<
"): Out of bounds (" << ind <<
")";
166 throw std::runtime_error(oss.str());
169 return *(m_d->m_vecPool[ind]);
176 if (ind >=
static_cast<StringsPoolIndex
>(m_d->m_vecPool.size()))
178 std::ostringstream oss;
179 oss <<
"stringspool(size = " << m_d->m_vecPool.size() <<
"): Out of bounds (" << ind <<
")";
180 throw std::runtime_error(oss.str());
183 return *(m_d->m_vecPool[ind]);
190 m_d->m_users.insert(p);
197 std::set< void* >::iterator it = m_d->m_users.find(p);
198 if ( it != m_d->m_users.end() )
199 m_d->m_users.erase(it);
201 if (m_d->m_users.empty())
205void StringsPoolPrivate::clear()
207 clear(m_resourcesPoolIndex);
211void StringsPoolPrivate::clear(
const uint64_t pos)
216 m_hashPool=m_resourcesHashPool;
220 uint64_t i(pos),size(m_vecPool.size());
221 for (; i != size; i++)
223 delete (m_vecPool[i]);
226 m_vecPool.resize(pos);
230size_t StringsPoolPrivate::HashLimaStringPtr::operator()(
const Lima::LimaString* s)
const
232 const int shift[] = {0,8,16,24};
233 uint64_t key = 0x55555555;
235 int depth = s->length();
238 for (
int i=0; i<depth; i++) {
239 oneChar = ((uint64_t) ((*s)[i].unicode()) )<<shift[i%4];
245bool StringsPoolPrivate::EquaLimaStringPtr::operator()(
249 return ((*s1) == (*s2));
StringsPoolIndex operator[](const LimaString &str) const
void registerUser(void *p)
void unregisterUser(void *p)