26 static const int minNumberOfStringsForGarbageCollection = 300;
27 static const uint32 garbageCollectionInterval = 30000;
41 static int compareStrings (
const String& s1,
const String& s2) noexcept {
return s1.compare (s2); }
42 static int compareStrings (CharPointer_UTF8 s1,
const String& s2) noexcept {
return s1.compare (s2.getCharPointer()); }
44 static int compareStrings (
const StartEndString& string1,
const String& string2) noexcept
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;
61 template <
typename NewStringType>
62 static 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);
103 if (newString ==
nullptr || *newString == 0)
107 garbageCollectIfNeeded();
113 if (start.
isEmpty() || start == end)
117 garbageCollectIfNeeded();
127 garbageCollectIfNeeded();
128 return addPooledString (strings, newString.
text);
137 garbageCollectIfNeeded();
138 return addPooledString (strings, newString);
141 void StringPool::garbageCollectIfNeeded()
143 if (strings.size() > minNumberOfStringsForGarbageCollection
152 for (
int i = strings.size(); --i >= 0;)
153 if (strings.getReference(i).getReferenceCount() == 1)
Wraps a pointer to a null-terminated UTF-8 character string, and provides various methods to operate ...
bool isEmpty() const noexcept
Returns true if this pointer is pointing to a null character.
Automatically locks and unlocks a mutex object.
A StringPool holds a set of shared strings, which reduces storage overheads and improves comparison s...
String getPooledString(const String &original)
Returns a pointer to a shared copy of the string that is passed in.
StringPool() noexcept
Creates an empty pool.
static StringPool & getGlobalPool() noexcept
Returns a shared global pool which is used for things like Identifiers, XML parsing.
void garbageCollect()
Scans the pool, and removes any strings that are unreferenced.
A simple class for holding temporary references to a string literal or String.
String::CharPointerType text
The text that is referenced.
bool isEmpty() const noexcept
Returns true if the string is empty.
bool isEmpty() const noexcept
Returns true if the string contains no characters.
CharPointer_UTF8 CharPointerType
This is the character encoding type used internally to store the string.
static uint32 getApproximateMillisecondCounter() noexcept
Less-accurate but faster version of getMillisecondCounter().