26static const int minNumberOfStringsForGarbageCollection = 300;
27static const uint32 garbageCollectionInterval = 30000;
40static int compareStrings (
const String& s1,
const String& s2)
noexcept {
return s1.compare (s2); }
41static int compareStrings (CharPointer_UTF8 s1,
const String& s2)
noexcept {
return s1.compare (s2.getCharPointer()); }
43static int compareStrings (
const StartEndString& string1,
const String& string2)
noexcept
49 const int c1 = s1 < string1.end ? (
int) s1.getAndAdvance() : 0;
50 const int c2 = (
int) s2.getAndAdvance();
51 const int diff = c1 - c2;
53 if (diff != 0)
return diff < 0 ? -1 : 1;
60template <
typename NewStringType>
61static String addPooledString (Array<String>& strings,
const NewStringType& newString)
64 int end = strings.size();
68 const String& startString = strings.getReference (start);
69 const int startComp = compareStrings (newString, startString);
74 const int halfway = (start +
end) / 2;
84 const String& halfwayString = strings.getReference (halfway);
85 const int halfwayComp = compareStrings (newString, halfwayString);
96 strings.insert (start, newString);
97 return strings.getReference (start);
102 if (newString ==
nullptr || *newString == 0)
106 garbageCollectIfNeeded();
116 garbageCollectIfNeeded();
126 garbageCollectIfNeeded();
127 return addPooledString (strings, newString.
text);
136 garbageCollectIfNeeded();
137 return addPooledString (strings, newString);
140void StringPool::garbageCollectIfNeeded()
142 if (strings.size() > minNumberOfStringsForGarbageCollection
151 for (
int i = strings.size(); --i >= 0;)
152 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().
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Returns a default-constructed sentinel value.
unsigned int uint32
A platform-independent 32-bit unsigned integer type.