84 String (
const char* text,
size_t maxChars);
89 String (
const wchar_t* text);
94 String (
const wchar_t* text,
size_t maxChars);
131 String (
const std::string&);
138 static String charToString (juce_wchar character);
155 #if (JUCE_STRING_UTF_TYPE == 32)
157 #elif (JUCE_STRING_UTF_TYPE == 16)
159 #elif (DOXYGEN || JUCE_STRING_UTF_TYPE == 8)
162 #error "You must set the value of JUCE_STRING_UTF_TYPE to be either 8, 16, or 32!"
167 int hashCode()
const noexcept;
170 int64 hashCode64()
const noexcept;
173 size_t hash()
const noexcept;
176 int length()
const noexcept;
190 String& operator+= (
const char* textToAppend);
192 String& operator+= (
const wchar_t* textToAppend);
196 String& operator+= (
int numberToAppend);
198 String& operator+= (
long numberToAppend);
200 String& operator+= (int64 numberToAppend);
202 String& operator+= (uint64 numberToAppend);
204 String& operator+= (
char characterToAppend);
206 String& operator+= (
wchar_t characterToAppend);
207 #if ! JUCE_NATIVE_WCHAR_IS_UTF32
209 String& operator+= (juce_wchar characterToAppend);
217 void append (
const String& textToAppend,
size_t maxCharsToTake);
224 void appendCharPointer (CharPointerType startOfTextToAppend,
225 CharPointerType endOfTextToAppend);
232 template <
class CharPo
inter>
234 CharPointer endOfTextToAppend)
236 jassert (startOfTextToAppend.getAddress() !=
nullptr && endOfTextToAppend.getAddress() !=
nullptr);
238 size_t extraBytesNeeded = 0, numChars = 1;
240 for (
auto t = startOfTextToAppend; t != endOfTextToAppend && ! t.isEmpty(); ++numChars)
241 extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance());
243 if (extraBytesNeeded > 0)
245 auto byteOffsetOfNull = getByteOffsetOfEnd();
247 preallocateBytes (byteOffsetOfNull + extraBytesNeeded);
248 CharPointerType (addBytesToPointer (text.getAddress(), (
int) byteOffsetOfNull))
249 .writeWithCharLimit (startOfTextToAppend, (
int) numChars);
254 void appendCharPointer (CharPointerType textToAppend);
261 template <
class CharPo
inter>
264 if (textToAppend.getAddress() !=
nullptr)
266 size_t extraBytesNeeded = 0, numChars = 1;
268 for (
auto t = textToAppend; numChars <= maxCharsToTake && ! t.isEmpty(); ++numChars)
269 extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance());
271 if (extraBytesNeeded > 0)
273 auto byteOffsetOfNull = getByteOffsetOfEnd();
275 preallocateBytes (byteOffsetOfNull + extraBytesNeeded);
276 CharPointerType (addBytesToPointer (text.getAddress(), (
int) byteOffsetOfNull))
277 .writeWithCharLimit (textToAppend, (
int) numChars);
283 template <
class CharPo
inter>
286 appendCharPointer (textToAppend, std::numeric_limits<size_t>::max());
296 inline bool isEmpty() const noexcept {
return text.isEmpty(); }
302 inline bool isNotEmpty() const noexcept {
return ! text.isEmpty(); }
305 void clear() noexcept;
308 bool equalsIgnoreCase (const
String& other) const noexcept;
311 bool equalsIgnoreCase (
StringRef other) const noexcept;
314 bool equalsIgnoreCase (const
wchar_t* other) const noexcept;
317 bool equalsIgnoreCase (const
char* other) const noexcept;
323 int compare (const
String& other) const noexcept;
329 int compare (const
char* other) const noexcept;
335 int compare (const
wchar_t* other) const noexcept;
341 int compareIgnoreCase (const
String& other) const noexcept;
351 int compareNatural (
StringRef other,
bool isCaseSensitive = false) const noexcept;
357 bool startsWith (
StringRef text) const noexcept;
363 bool startsWithChar (juce_wchar character) const noexcept;
369 bool startsWithIgnoreCase (
StringRef text) const noexcept;
375 bool endsWith (
StringRef text) const noexcept;
381 bool endsWithChar (juce_wchar character) const noexcept;
387 bool endsWithIgnoreCase (
StringRef text) const noexcept;
393 bool contains (
StringRef text) const noexcept;
398 bool containsChar (juce_wchar character) const noexcept;
403 bool containsIgnoreCase (
StringRef text) const noexcept;
411 bool containsWholeWord (
StringRef wordToLookFor) const noexcept;
419 bool containsWholeWordIgnoreCase (
StringRef wordToLookFor) const noexcept;
428 int indexOfWholeWord (
StringRef wordToLookFor) const noexcept;
437 int indexOfWholeWordIgnoreCase (
StringRef wordToLookFor) const noexcept;
445 bool containsAnyOf (
StringRef charactersItMightContain) const noexcept;
454 bool containsOnly (
StringRef charactersItMightContain) const noexcept;
463 bool containsNonWhitespaceChars() const noexcept;
472 bool matchesWildcard (
StringRef wildcard,
bool ignoreCase) const noexcept;
482 int indexOfChar (juce_wchar characterToLookFor) const noexcept;
491 int indexOfChar (
int startIndex, juce_wchar characterToLookFor) const noexcept;
505 int indexOfAnyOf (
StringRef charactersToLookFor,
507 bool ignoreCase = false) const noexcept;
514 int indexOf (
StringRef textToLookFor) const noexcept;
523 int indexOf (
int startIndex,
StringRef textToLookFor) const noexcept;
530 int indexOfIgnoreCase (
StringRef textToLookFor) const noexcept;
539 int indexOfIgnoreCase (
int startIndex,
StringRef textToLookFor) const noexcept;
545 int lastIndexOfChar (juce_wchar character) const noexcept;
552 int lastIndexOf (
StringRef textToLookFor) const noexcept;
559 int lastIndexOfIgnoreCase (
StringRef textToLookFor) const noexcept;
573 int lastIndexOfAnyOf (
StringRef charactersToLookFor,
574 bool ignoreCase = false) const noexcept;
591 juce_wchar operator[] (
int index) const noexcept;
596 juce_wchar getLastCharacter() const noexcept;
609 String substring (
int startIndex,
int endIndex) const;
619 String substring (
int startIndex) const;
630 String dropLastCharacters (
int numberToDrop) const;
639 String getLastCharacters (
int numCharacters) const;
658 bool includeSubStringInResult,
659 bool ignoreCase) const;
670 bool includeSubStringInResult,
671 bool ignoreCase) const;
687 bool includeSubStringInResult,
688 bool ignoreCase) const;
698 bool includeSubStringInResult,
699 bool ignoreCase) const;
729 String toUpperCase() const;
732 String toLowerCase() const;
750 String replaceSection (
int startIndex,
751 int numCharactersToReplace,
763 bool ignoreCase = false) const;
774 bool ignoreCase = false) const;
777 String replaceCharacter (juce_wchar characterToReplace,
778 juce_wchar characterToInsertInstead) const;
791 StringRef charactersToInsertInstead) const;
820 String initialSectionContainingOnly (
StringRef permittedCharacters) const;
828 String initialSectionNotContaining (
StringRef charactersToStopAt) const;
837 bool isQuotedString() const;
862 String quoted (juce_wchar quoteCharacter = '"') const;
872 int numberOfTimesToRepeat);
877 String paddedLeft (juce_wchar padCharacter,
int minimumLength) const;
882 String paddedRight (juce_wchar padCharacter,
int minimumLength) const;
892 static
String createStringFromData (const
void* data,
int size);
905 template <typename... Args>
906 static
String formatted (const
String& formatStr, Args... args) {
return formattedRaw (formatStr.toRawUTF8(), args...); }
914 explicit String (
int decimalInteger);
919 explicit String (
unsigned int decimalInteger);
924 explicit String (
short decimalInteger);
929 explicit String (
unsigned short decimalInteger);
934 explicit String (int64 largeIntegerValue);
939 explicit String (uint64 largeIntegerValue);
944 explicit String (
long decimalInteger);
949 explicit String (
unsigned long decimalInteger);
955 explicit String (
float floatValue);
961 explicit String (
double doubleValue);
973 String (
float floatValue,
int numberOfDecimalPlaces,
bool useScientificNotation =
false);
984 String (
double doubleValue,
int numberOfDecimalPlaces,
bool useScientificNotation =
false);
989 explicit String (
bool) =
delete;
997 int getIntValue() const noexcept;
1002 int64 getLargeIntValue() const noexcept;
1013 int getTrailingIntValue() const noexcept;
1020 float getFloatValue() const noexcept;
1027 double getDoubleValue() const noexcept;
1038 int getHexValue32() const noexcept;
1049 int64 getHexValue64() const noexcept;
1052 template <typename IntegerType>
1053 static
String toHexString (IntegerType number) {
return createHex (number); }
1064 static String toHexString (
const void* data,
int size,
int groupSize = 1);
1071 template <
typename DecimalType>
1074 jassert (numberOfSignificantFigures > 0);
1078 if (numberOfSignificantFigures > 1)
1082 for (
int i = 2; i < numberOfSignificantFigures; ++i)
1091 auto numDigitsBeforePoint = (int) std::ceil (std::log10 (number < 0 ? -number : number));
1093 #if JUCE_PROJUCER_LIVE_BUILD
1094 auto doubleNumber = (double) number;
1095 constexpr int bufferSize = 311;
1096 char buffer[bufferSize];
1097 auto* ptr = &(buffer[0]);
1098 auto*
const safeEnd = ptr + (bufferSize - 1);
1099 auto numSigFigsParsed = 0;
1101 auto writeToBuffer = [safeEnd] (
char* destination,
char data)
1103 *destination++ = data;
1105 if (destination == safeEnd)
1107 *destination =
'\0';
1114 auto truncateOrRound = [numberOfSignificantFigures] (
double fractional,
int sigFigsParsed)
1116 return (sigFigsParsed == numberOfSignificantFigures - 1) ? (int) std::round (fractional)
1120 if (doubleNumber < 0)
1126 if (numDigitsBeforePoint > 0)
1128 doubleNumber /= std::pow (10.0, numDigitsBeforePoint);
1130 while (numDigitsBeforePoint-- > 0)
1132 if (numSigFigsParsed == numberOfSignificantFigures)
1134 if (writeToBuffer (ptr++,
'0'))
1141 auto digit = truncateOrRound (doubleNumber, numSigFigsParsed);
1143 if (writeToBuffer (ptr++, (
char) (
'0' + digit)))
1147 doubleNumber -= digit;
1150 if (numSigFigsParsed == numberOfSignificantFigures)
1161 if (writeToBuffer (ptr++,
'.'))
1164 while (numSigFigsParsed < numberOfSignificantFigures)
1167 auto digit = truncateOrRound (doubleNumber, numSigFigsParsed);
1169 if (writeToBuffer (ptr++, (
char) (
'0' + digit)))
1172 if (numSigFigsParsed != 0 || digit != 0)
1175 doubleNumber -= digit;
1181 auto shift = numberOfSignificantFigures - numDigitsBeforePoint;
1182 auto factor = std::pow (10.0, shift);
1183 auto rounded = std::round (number * factor) / factor;
1185 std::stringstream ss;
1186 ss << std::fixed << std::setprecision (std::max (shift, 0)) << rounded;
1224 const char* toRawUTF8()
const;
1261 const wchar_t* toWideCharPointer()
const;
1264 std::string toStdString()
const;
1270 static String fromUTF8 (
const char* utf8buffer,
int bufferSizeBytes = -1);
1276 size_t getNumBytesAsUTF8() const noexcept;
1294 size_t copyToUTF8 (
CharPointer_UTF8::CharType* destBuffer,
size_t maxBufferSizeBytes) const noexcept;
1311 size_t copyToUTF16 (
CharPointer_UTF16::CharType* destBuffer,
size_t maxBufferSizeBytes) const noexcept;
1328 size_t copyToUTF32 (
CharPointer_UTF32::CharType* destBuffer,
size_t maxBufferSizeBytes) const noexcept;
1345 void preallocateBytes (
size_t numBytesNeeded);
1350 void swapWith (
String& other) noexcept;
1353 #if JUCE_MAC || JUCE_IOS || DOXYGEN
1355 static String fromCFString (CFStringRef cfString);
1361 CFStringRef toCFString()
const;
1365 String convertToPrecomposedUnicode()
const;
1371 int getReferenceCount() const noexcept;
1382 JUCE_DEPRECATED_STATIC (static const
String empty;)
1386 CharPointerType text;
1389 struct PreallocationBytes
1391 explicit PreallocationBytes (
size_t)
noexcept;
1395 explicit String (
const PreallocationBytes&);
1396 size_t getByteOffsetOfEnd() const noexcept;
1397 JUCE_DEPRECATED (String (const String&,
size_t));
1402 operator
bool() const noexcept {
return false; }
1405 static String formattedRaw (
const char*, ...);
1407 static String createHex (uint8);
1408 static String createHex (uint16);
1409 static String createHex (uint32);
1410 static String createHex (uint64);
1412 template <
typename Type>
1413 static String createHex (Type n) {
return createHex (
static_cast<typename TypeHelpers::UnsignedTypeWithSize<(
int) sizeof (n)
>::type> (n)); }
1418JUCE_API String JUCE_CALLTYPE operator+ (
const char* string1,
const String& string2);
1420JUCE_API String JUCE_CALLTYPE operator+ (
const wchar_t* string1,
const String& string2);
1422JUCE_API String JUCE_CALLTYPE operator+ (
char string1,
const String& string2);
1424JUCE_API String JUCE_CALLTYPE operator+ (
wchar_t string1,
const String& string2);
1425#if ! JUCE_NATIVE_WCHAR_IS_UTF32
1427JUCE_API String JUCE_CALLTYPE operator+ (juce_wchar string1,
const String& string2);
1431JUCE_API String JUCE_CALLTYPE operator+ (String string1,
const String& string2);
1433JUCE_API String JUCE_CALLTYPE operator+ (String string1,
const char* string2);
1435JUCE_API String JUCE_CALLTYPE operator+ (String string1,
const wchar_t* string2);
1437JUCE_API String JUCE_CALLTYPE operator+ (String string1,
const std::string& string2);
1439JUCE_API String JUCE_CALLTYPE operator+ (String string1,
char characterToAppend);
1441JUCE_API String JUCE_CALLTYPE operator+ (String string1,
wchar_t characterToAppend);
1442#if ! JUCE_NATIVE_WCHAR_IS_UTF32
1444JUCE_API String JUCE_CALLTYPE operator+ (String string1, juce_wchar characterToAppend);
1449JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
char characterToAppend);
1451JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
wchar_t characterToAppend);
1452#if ! JUCE_NATIVE_WCHAR_IS_UTF32
1454JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, juce_wchar characterToAppend);
1458JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
const char* string2);
1460JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
const wchar_t* string2);
1462JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
const String& string2);
1464JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, StringRef string2);
1466JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
const std::string& string2);
1469JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, uint8 number);
1471JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
short number);
1473JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
int number);
1475JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
long number);
1477JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
unsigned long number);
1479JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, int64 number);
1481JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, uint64 number);
1483JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
float number);
1485JUCE_API String& JUCE_CALLTYPE operator<< (String& string1,
double number);
1490String& JUCE_CALLTYPE operator<< (String&,
bool) =
delete;
1495JUCE_API
bool JUCE_CALLTYPE operator== (
const String& string1,
const String& string2)
noexcept;
1497JUCE_API
bool JUCE_CALLTYPE operator== (
const String& string1,
const char* string2)
noexcept;
1499JUCE_API
bool JUCE_CALLTYPE operator== (
const String& string1,
const wchar_t* string2)
noexcept;
1501JUCE_API
bool JUCE_CALLTYPE operator== (
const String& string1, CharPointer_UTF8 string2)
noexcept;
1503JUCE_API
bool JUCE_CALLTYPE operator== (
const String& string1, CharPointer_UTF16 string2)
noexcept;
1505JUCE_API
bool JUCE_CALLTYPE operator== (
const String& string1, CharPointer_UTF32 string2)
noexcept;
1508JUCE_API
bool JUCE_CALLTYPE operator!= (
const String& string1,
const String& string2)
noexcept;
1510JUCE_API
bool JUCE_CALLTYPE operator!= (
const String& string1,
const char* string2)
noexcept;
1512JUCE_API
bool JUCE_CALLTYPE operator!= (
const String& string1,
const wchar_t* string2)
noexcept;
1514JUCE_API
bool JUCE_CALLTYPE operator!= (
const String& string1, CharPointer_UTF8 string2)
noexcept;
1516JUCE_API
bool JUCE_CALLTYPE operator!= (
const String& string1, CharPointer_UTF16 string2)
noexcept;
1518JUCE_API
bool JUCE_CALLTYPE operator!= (
const String& string1, CharPointer_UTF32 string2)
noexcept;
1524template <
class traits>
1525std::basic_ostream <char, traits>& JUCE_CALLTYPE operator<< (std::basic_ostream <char, traits>& stream,
const String& stringToWrite)
1527 return stream << stringToWrite.toRawUTF8();
1533template <
class traits>
1534std::basic_ostream <wchar_t, traits>& JUCE_CALLTYPE operator<< (std::basic_ostream <wchar_t, traits>& stream,
const String& stringToWrite)
1536 return stream << stringToWrite.toWideCharPointer();
1540JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream,
const String& stringToWrite);
1543JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, StringRef stringToWrite);
1550 template <>
struct hash<juce::String>
1552 size_t operator() (
const juce::String& s)
const noexcept {
return s.hash(); }
CharPointerType getCharPointer() const noexcept
bool isEmpty() const noexcept
static String toDecimalStringWithSignificantFigures(DecimalType number, int numberOfSignificantFigures)
void appendCharPointer(CharPointer startOfTextToAppend, CharPointer endOfTextToAppend)
void appendCharPointer(CharPointer textToAppend, size_t maxCharsToTake)
void appendCharPointer(CharPointer textToAppend)
bool isNotEmpty() const noexcept