diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/foundation/StringTable.cpp | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/src/foundation/StringTable.cpp b/src/foundation/StringTable.cpp index f4dc574..7833639 100644 --- a/src/foundation/StringTable.cpp +++ b/src/foundation/StringTable.cpp @@ -319,6 +319,16 @@ public: return theFind->second; } + SCharAndHandle justFindStrDontRegister(SCharAndHash hashCode) + { + if (isTrivial(hashCode.m_Data)) + return SCharAndHandle(); + TMapType::iterator theFind = m_HashToStrMap.find(hashCode); + if (theFind == m_HashToStrMap.end()) + return SCharAndHandle(); + return theFind->second; + } + const CRegisteredString FindStr(SCharAndHash hashCode) { SCharAndHandle result = DoFindStr(hashCode); @@ -657,18 +667,23 @@ public: DynamicString *theStr = nullptr; if (!handle) { - if (m_dynamicFreeHandlesMap.isEmpty()) { - handle = ++m_nextFreeDynamicHandle; - theStr = new DynamicString; + handle = m_FileData.justFindStrDontRegister(str.constData()).m_Handle; + if (!handle) { + if (m_dynamicFreeHandlesMap.isEmpty()) { + handle = ++m_nextFreeDynamicHandle; + theStr = new DynamicString; + } else { + auto first = m_dynamicFreeHandlesMap.begin(); + handle = first.key(); + theStr = first.value(); + m_dynamicFreeHandlesMap.erase(first); + } + theStr->str = str; + m_dynamicStringToHandleMap.insert(str, handle); + m_dynamicUsedHandlesMap.insert(handle, theStr); } else { - auto first = m_dynamicFreeHandlesMap.begin(); - handle = first.key(); - theStr = first.value(); - m_dynamicFreeHandlesMap.erase(first); + return CStringHandle::ISwearThisHasBeenRegistered(handle); } - theStr->str = str; - m_dynamicStringToHandleMap.insert(str, handle); - m_dynamicUsedHandlesMap.insert(handle, theStr); } else { theStr = m_dynamicUsedHandlesMap.value(handle); } |