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());
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>
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>
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;
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>
1418 JUCE_API
String JUCE_CALLTYPE operator+ (
const char* string1,
const String& string2);
1420 JUCE_API
String JUCE_CALLTYPE operator+ (
const wchar_t* string1,
const String& string2);
1422 JUCE_API
String JUCE_CALLTYPE operator+ (
char string1,
const String& string2);
1424 JUCE_API
String JUCE_CALLTYPE operator+ (
wchar_t string1,
const String& string2);
1425 #if ! JUCE_NATIVE_WCHAR_IS_UTF32 1427 JUCE_API
String JUCE_CALLTYPE operator+ (juce_wchar string1,
const String& string2);
1433 JUCE_API
String JUCE_CALLTYPE operator+ (
String string1,
const char* string2);
1435 JUCE_API
String JUCE_CALLTYPE operator+ (
String string1,
const wchar_t* string2);
1437 JUCE_API
String JUCE_CALLTYPE operator+ (
String string1,
const std::string& string2);
1439 JUCE_API
String JUCE_CALLTYPE operator+ (
String string1,
char characterToAppend);
1441 JUCE_API
String JUCE_CALLTYPE operator+ (
String string1,
wchar_t characterToAppend);
1442 #if ! JUCE_NATIVE_WCHAR_IS_UTF32 1444 JUCE_API
String JUCE_CALLTYPE operator+ (
String string1, juce_wchar characterToAppend);
1449 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
char characterToAppend);
1451 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
wchar_t characterToAppend);
1452 #if ! JUCE_NATIVE_WCHAR_IS_UTF32 1454 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1, juce_wchar characterToAppend);
1458 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
const char* string2);
1460 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
const wchar_t* string2);
1466 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
const std::string& string2);
1469 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1, uint8 number);
1471 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
short number);
1473 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
int number);
1475 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
long number);
1477 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
unsigned long number);
1479 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1, int64 number);
1481 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1, uint64 number);
1483 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
float number);
1485 JUCE_API
String& JUCE_CALLTYPE operator<< (
String& string1,
double number);
1490 String& JUCE_CALLTYPE operator<< (
String&,
bool) =
delete;
1495 JUCE_API
bool JUCE_CALLTYPE operator== (
const String& string1,
const String& string2) noexcept;
1497 JUCE_API
bool JUCE_CALLTYPE operator== (
const String& string1,
const char* string2) noexcept;
1499 JUCE_API
bool JUCE_CALLTYPE operator== (
const String& string1,
const wchar_t* string2) noexcept;
1508 JUCE_API
bool JUCE_CALLTYPE operator!= (
const String& string1,
const String& string2) noexcept;
1510 JUCE_API
bool JUCE_CALLTYPE operator!= (
const String& string1,
const char* string2) noexcept;
1512 JUCE_API
bool JUCE_CALLTYPE operator!= (
const String& string1,
const wchar_t* string2) noexcept;
1524 template <
class traits>
1525 std::basic_ostream <char, traits>& JUCE_CALLTYPE operator<< (std::basic_ostream <char, traits>& stream,
const String& stringToWrite)
1527 return stream << stringToWrite.
toRawUTF8();
1533 template <
class traits>
1534 std::basic_ostream <wchar_t, traits>& JUCE_CALLTYPE operator<< (std::basic_ostream <wchar_t, traits>& stream,
const String& stringToWrite)
1550 template <>
struct hash<juce::
String>
1552 size_t operator() (
const juce::String& s)
const noexcept {
return s.
hash(); }
const char * toRawUTF8() const
static String toDecimalStringWithSignificantFigures(DecimalType number, int numberOfSignificantFigures)
bool isNotEmpty() const noexcept
void appendCharPointer(CharPointer textToAppend, size_t maxCharsToTake)
CharPointerType getCharPointer() const noexcept
void appendCharPointer(CharPointer textToAppend)
const wchar_t * toWideCharPointer() const
bool isEmpty() const noexcept
static String toHexString(IntegerType number)
bool isEmpty() const noexcept
static String formatted(const String &formatStr, Args... args)
void appendCharPointer(CharPointer startOfTextToAppend, CharPointer endOfTextToAppend)
size_t hash() const noexcept
CharType * getAddress() const noexcept