26static const int minNumberOfStringsForGarbageCollection = 300;
27static const uint32 garbageCollectionInterval = 30000;
35 StartEndString (String::CharPointerType s, String::CharPointerType
e)
noexcept : start (s), end (
e) {}
36 operator String()
const {
return String (start, end); }
38 String::CharPointerType start, end;
41static int compareStrings (
const String& s1,
const String& s2)
noexcept {
return s1.compare (s2); }
42static int compareStrings (CharPointer_UTF8 s1,
const String& s2)
noexcept {
return s1.compare (s2.getCharPointer()); }
44static int compareStrings (
const StartEndString& string1,
const String& string2)
noexcept
46 String::CharPointerType s1 (string1.start), s2 (string2.getCharPointer());
50 const int c1 = s1 < string1.end ? (int) s1.getAndAdvance() : 0;
51 const int c2 = (int) s2.getAndAdvance();
52 const int diff = c1 - c2;
54 if (diff != 0)
return diff < 0 ? -1 : 1;
61template <
typename NewStringType>
62static String addPooledString (Array<String>& strings,
const NewStringType& newString)
65 int end = strings.
size();
69 const String& startString = strings.
getReference (start);
70 const int startComp = compareStrings (newString, startString);
75 const int halfway = (start + end) / 2;
85 const String& halfwayString = strings.getReference (halfway);
86 const int halfwayComp = compareStrings (newString, halfwayString);
97 strings.insert (start, newString);
98 return strings.getReference (start);
107 garbageCollectIfNeeded();
113 if (start.isEmpty() || start == end)
117 garbageCollectIfNeeded();
118 return addPooledString (strings, StartEndString (start, end));
127 garbageCollectIfNeeded();
128 return addPooledString (strings,
newString.text);
137 garbageCollectIfNeeded();
138 return addPooledString (strings,
newString);
141void StringPool::garbageCollectIfNeeded()
143 if (strings.size() > minNumberOfStringsForGarbageCollection
152 for (
int i = strings.size(); --i >= 0;)
153 if (strings.getReference(i).getReferenceCount() == 1)
bool isEmpty() const noexcept
int size() const noexcept
ElementType & getReference(int index) noexcept
String getPooledString(const String &original)
static StringPool & getGlobalPool() noexcept
static uint32 getApproximateMillisecondCounter() noexcept