26static const int minNumberOfStringsForGarbageCollection = 300;
27static const uint32 garbageCollectionInterval = 30000;
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
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();
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)
Holds a resizable array of primitive or copy-by-value objects.
bool isEmpty() const noexcept
Returns true if the array is empty, false otherwise.
int size() const noexcept
Returns the current number of elements in the array.
ElementType & getReference(int index) const noexcept
Returns a direct reference to one of the elements in the array, without checking the index passed in.
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.
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.
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().