OpenShot Audio Library | OpenShotAudio  0.6.0
juce_String.h
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2022 - Raw Material Software Limited
6 
7  JUCE is an open source library subject to commercial or open-source
8  licensing.
9 
10  The code included in this file is provided under the terms of the ISC license
11  http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12  To use, copy, modify, and/or distribute this software for any purpose with or
13  without fee is hereby granted provided that the above copyright notice and
14  this permission notice appear in all copies.
15 
16  JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17  EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18  DISCLAIMED.
19 
20  ==============================================================================
21 */
22 
23 #if ! defined (DOXYGEN) && (JUCE_MAC || JUCE_IOS)
24  // Annoyingly we can only forward-declare a typedef by forward-declaring the
25  // aliased type
26  #if __has_attribute(objc_bridge)
27  #define JUCE_CF_BRIDGED_TYPE(T) __attribute__ ((objc_bridge (T)))
28  #else
29  #define JUCE_CF_BRIDGED_TYPE(T)
30  #endif
31 
32  typedef const struct JUCE_CF_BRIDGED_TYPE(NSString) __CFString * CFStringRef;
33 
34  #undef JUCE_CF_BRIDGED_TYPE
35 #endif
36 
37 namespace juce
38 {
39 
40 //==============================================================================
52 class JUCE_API String final
53 {
54 public:
55  //==============================================================================
59  String() noexcept;
60 
62  String (const String&) noexcept;
63 
65  String (String&&) noexcept;
66 
80  String (const char* text);
81 
98  String (const char* text, size_t maxChars);
99 
103  String (const wchar_t* text);
104 
108  String (const wchar_t* text, size_t maxChars);
109 
110  //==============================================================================
112  String (CharPointer_UTF8 text);
113 
115  String (CharPointer_UTF8 text, size_t maxChars);
116 
119 
120  //==============================================================================
122  String (CharPointer_UTF16 text);
123 
125  String (CharPointer_UTF16 text, size_t maxChars);
126 
129 
130  //==============================================================================
132  String (CharPointer_UTF32 text);
133 
135  String (CharPointer_UTF32 text, size_t maxChars);
136 
139 
140  //==============================================================================
142  String (CharPointer_ASCII text);
143 
145  String (const std::string&);
146 
148  String (StringRef);
149 
150  //==============================================================================
152  static String charToString (juce_wchar character);
153 
155  ~String() noexcept;
156 
169  #if (JUCE_STRING_UTF_TYPE == 32)
170  using CharPointerType = CharPointer_UTF32;
171  #elif (JUCE_STRING_UTF_TYPE == 16)
172  using CharPointerType = CharPointer_UTF16;
173  #elif (DOXYGEN || JUCE_STRING_UTF_TYPE == 8)
174  using CharPointerType = CharPointer_UTF8;
175  #else
176  #error "You must set the value of JUCE_STRING_UTF_TYPE to be either 8, 16, or 32!"
177  #endif
178 
179  //==============================================================================
181  int hashCode() const noexcept;
182 
184  int64 hashCode64() const noexcept;
185 
187  size_t hash() const noexcept;
188 
190  int length() const noexcept;
191 
192  //==============================================================================
193  // Assignment and concatenation operators..
194 
196  String& operator= (const String& other) noexcept;
197 
199  String& operator= (String&& other) noexcept;
200 
202  String& operator+= (const String& stringToAppend);
204  String& operator+= (const char* textToAppend);
206  String& operator+= (const wchar_t* textToAppend);
208  String& operator+= (StringRef textToAppend);
210  String& operator+= (int numberToAppend);
212  String& operator+= (long numberToAppend);
214  String& operator+= (int64 numberToAppend);
216  String& operator+= (uint64 numberToAppend);
218  String& operator+= (char characterToAppend);
220  String& operator+= (wchar_t characterToAppend);
221  #if ! JUCE_NATIVE_WCHAR_IS_UTF32
223  String& operator+= (juce_wchar characterToAppend);
224  #endif
225 
231  void append (const String& textToAppend, size_t maxCharsToTake);
232 
238  void appendCharPointer (CharPointerType startOfTextToAppend,
239  CharPointerType endOfTextToAppend);
240 
246  template <class CharPointer>
247  void appendCharPointer (CharPointer startOfTextToAppend,
248  CharPointer endOfTextToAppend)
249  {
250  jassert (startOfTextToAppend.getAddress() != nullptr && endOfTextToAppend.getAddress() != nullptr);
251 
252  size_t extraBytesNeeded = 0, numChars = 1;
253 
254  for (auto t = startOfTextToAppend; t != endOfTextToAppend && ! t.isEmpty(); ++numChars)
255  extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance());
256 
257  if (extraBytesNeeded > 0)
258  {
259  auto byteOffsetOfNull = getByteOffsetOfEnd();
260 
261  preallocateBytes (byteOffsetOfNull + extraBytesNeeded);
262  CharPointerType (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull))
263  .writeWithCharLimit (startOfTextToAppend, (int) numChars);
264  }
265  }
266 
268  void appendCharPointer (CharPointerType textToAppend);
269 
275  template <class CharPointer>
276  void appendCharPointer (CharPointer textToAppend, size_t maxCharsToTake)
277  {
278  if (textToAppend.getAddress() != nullptr)
279  {
280  size_t extraBytesNeeded = 0, numChars = 1;
281 
282  for (auto t = textToAppend; numChars <= maxCharsToTake && ! t.isEmpty(); ++numChars)
283  extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance());
284 
285  if (extraBytesNeeded > 0)
286  {
287  auto byteOffsetOfNull = getByteOffsetOfEnd();
288 
289  preallocateBytes (byteOffsetOfNull + extraBytesNeeded);
290  CharPointerType (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull))
291  .writeWithCharLimit (textToAppend, (int) numChars);
292  }
293  }
294  }
295 
297  template <class CharPointer>
298  void appendCharPointer (CharPointer textToAppend)
299  {
300  appendCharPointer (textToAppend, std::numeric_limits<size_t>::max());
301  }
302 
303  //==============================================================================
304  // Comparison methods..
305 
310  bool isEmpty() const noexcept { return text.isEmpty(); }
311 
316  bool isNotEmpty() const noexcept { return ! text.isEmpty(); }
317 
319  void clear() noexcept;
320 
322  bool equalsIgnoreCase (const String& other) const noexcept;
323 
325  bool equalsIgnoreCase (StringRef other) const noexcept;
326 
328  bool equalsIgnoreCase (const wchar_t* other) const noexcept;
329 
331  bool equalsIgnoreCase (const char* other) const noexcept;
332 
337  int compare (const String& other) const noexcept;
338 
343  int compare (const char* other) const noexcept;
344 
349  int compare (const wchar_t* other) const noexcept;
350 
355  int compareIgnoreCase (const String& other) const noexcept;
356 
365  int compareNatural (StringRef other, bool isCaseSensitive = false) const noexcept;
366 
371  bool startsWith (StringRef text) const noexcept;
372 
377  bool startsWithChar (juce_wchar character) const noexcept;
378 
383  bool startsWithIgnoreCase (StringRef text) const noexcept;
384 
389  bool endsWith (StringRef text) const noexcept;
390 
395  bool endsWithChar (juce_wchar character) const noexcept;
396 
401  bool endsWithIgnoreCase (StringRef text) const noexcept;
402 
407  bool contains (StringRef text) const noexcept;
408 
412  bool containsChar (juce_wchar character) const noexcept;
413 
417  bool containsIgnoreCase (StringRef text) const noexcept;
418 
425  bool containsWholeWord (StringRef wordToLookFor) const noexcept;
426 
433  bool containsWholeWordIgnoreCase (StringRef wordToLookFor) const noexcept;
434 
442  int indexOfWholeWord (StringRef wordToLookFor) const noexcept;
443 
451  int indexOfWholeWordIgnoreCase (StringRef wordToLookFor) const noexcept;
452 
459  bool containsAnyOf (StringRef charactersItMightContain) const noexcept;
460 
468  bool containsOnly (StringRef charactersItMightContain) const noexcept;
469 
477  bool containsNonWhitespaceChars() const noexcept;
478 
486  bool matchesWildcard (StringRef wildcard, bool ignoreCase) const noexcept;
487 
488  //==============================================================================
489  // Substring location methods..
490 
496  int indexOfChar (juce_wchar characterToLookFor) const noexcept;
497 
505  int indexOfChar (int startIndex, juce_wchar characterToLookFor) const noexcept;
506 
519  int indexOfAnyOf (StringRef charactersToLookFor,
520  int startIndex = 0,
521  bool ignoreCase = false) const noexcept;
522 
528  int indexOf (StringRef textToLookFor) const noexcept;
529 
537  int indexOf (int startIndex, StringRef textToLookFor) const noexcept;
538 
544  int indexOfIgnoreCase (StringRef textToLookFor) const noexcept;
545 
553  int indexOfIgnoreCase (int startIndex, StringRef textToLookFor) const noexcept;
554 
559  int lastIndexOfChar (juce_wchar character) const noexcept;
560 
566  int lastIndexOf (StringRef textToLookFor) const noexcept;
567 
573  int lastIndexOfIgnoreCase (StringRef textToLookFor) const noexcept;
574 
587  int lastIndexOfAnyOf (StringRef charactersToLookFor,
588  bool ignoreCase = false) const noexcept;
589 
590 
591  //==============================================================================
592  // Substring extraction and manipulation methods..
593 
605  juce_wchar operator[] (int index) const noexcept;
606 
610  juce_wchar getLastCharacter() const noexcept;
611 
612  //==============================================================================
623  String substring (int startIndex, int endIndex) const;
624 
633  String substring (int startIndex) const;
634 
644  String dropLastCharacters (int numberToDrop) const;
645 
653  String getLastCharacters (int numCharacters) const;
654 
655  //==============================================================================
671  String fromFirstOccurrenceOf (StringRef substringToStartFrom,
672  bool includeSubStringInResult,
673  bool ignoreCase) const;
674 
683  String fromLastOccurrenceOf (StringRef substringToFind,
684  bool includeSubStringInResult,
685  bool ignoreCase) const;
686 
700  String upToFirstOccurrenceOf (StringRef substringToEndWith,
701  bool includeSubStringInResult,
702  bool ignoreCase) const;
703 
711  String upToLastOccurrenceOf (StringRef substringToFind,
712  bool includeSubStringInResult,
713  bool ignoreCase) const;
714 
715  //==============================================================================
717  String trim() const;
718 
720  String trimStart() const;
721 
723  String trimEnd() const;
724 
731  String trimCharactersAtStart (StringRef charactersToTrim) const;
732 
739  String trimCharactersAtEnd (StringRef charactersToTrim) const;
740 
741  //==============================================================================
743  String toUpperCase() const;
744 
746  String toLowerCase() const;
747 
748  //==============================================================================
764  String replaceSection (int startIndex,
765  int numCharactersToReplace,
766  StringRef stringToInsert) const;
767 
775  String replace (StringRef stringToReplace,
776  StringRef stringToInsertInstead,
777  bool ignoreCase = false) const;
778 
786  String replaceFirstOccurrenceOf (StringRef stringToReplace,
787  StringRef stringToInsertInstead,
788  bool ignoreCase = false) const;
789 
791  String replaceCharacter (juce_wchar characterToReplace,
792  juce_wchar characterToInsertInstead) const;
793 
804  String replaceCharacters (StringRef charactersToReplace,
805  StringRef charactersToInsertInstead) const;
806 
816  String retainCharacters (StringRef charactersToRetain) const;
817 
827  String removeCharacters (StringRef charactersToRemove) const;
828 
834  String initialSectionContainingOnly (StringRef permittedCharacters) const;
835 
842  String initialSectionNotContaining (StringRef charactersToStopAt) const;
843 
844  //==============================================================================
851  bool isQuotedString() const;
852 
863  String unquoted() const;
864 
876  String quoted (juce_wchar quoteCharacter = '"') const;
877 
878 
879  //==============================================================================
885  static String repeatedString (StringRef stringToRepeat,
886  int numberOfTimesToRepeat);
887 
891  String paddedLeft (juce_wchar padCharacter, int minimumLength) const;
892 
896  String paddedRight (juce_wchar padCharacter, int minimumLength) const;
897 
906  static String createStringFromData (const void* data, int size);
907 
919  template <typename... Args>
920  static String formatted (const String& formatStr, Args... args) { return formattedRaw (formatStr.toRawUTF8(), args...); }
921 
923  CharPointerType begin() const { return getCharPointer(); }
924 
949  CharPointerType end() const { return begin().findTerminatingNull(); }
950 
951  //==============================================================================
952  // Numeric conversions..
953 
957  explicit String (int decimalInteger);
958 
962  explicit String (unsigned int decimalInteger);
963 
967  explicit String (short decimalInteger);
968 
972  explicit String (unsigned short decimalInteger);
973 
977  explicit String (int64 largeIntegerValue);
978 
982  explicit String (uint64 largeIntegerValue);
983 
987  explicit String (long decimalInteger);
988 
992  explicit String (unsigned long decimalInteger);
993 
998  explicit String (float floatValue);
999 
1004  explicit String (double doubleValue);
1005 
1016  String (float floatValue, int numberOfDecimalPlaces, bool useScientificNotation = false);
1017 
1027  String (double doubleValue, int numberOfDecimalPlaces, bool useScientificNotation = false);
1028 
1029  #ifndef DOXYGEN
1030  // Automatically creating a String from a bool opens up lots of nasty type conversion edge cases.
1031  // If you want a String representation of a bool you can cast the bool to an int first.
1032  explicit String (bool) = delete;
1033  #endif
1034 
1040  int getIntValue() const noexcept;
1041 
1045  int64 getLargeIntValue() const noexcept;
1046 
1057  int getTrailingIntValue() const noexcept;
1058 
1064  float getFloatValue() const noexcept;
1065 
1071  double getDoubleValue() const noexcept;
1072 
1082  int getHexValue32() const noexcept;
1083 
1093  int64 getHexValue64() const noexcept;
1094 
1096  template <typename IntegerType>
1097  static String toHexString (IntegerType number) { return createHex (number); }
1098 
1108  static String toHexString (const void* data, int size, int groupSize = 1);
1109 
1115  template <typename DecimalType>
1116  static String toDecimalStringWithSignificantFigures (DecimalType number, int numberOfSignificantFigures)
1117  {
1118  jassert (numberOfSignificantFigures > 0);
1119 
1120  if (exactlyEqual (number, DecimalType()))
1121  {
1122  if (numberOfSignificantFigures > 1)
1123  {
1124  String result ("0.0");
1125 
1126  for (int i = 2; i < numberOfSignificantFigures; ++i)
1127  result += "0";
1128 
1129  return result;
1130  }
1131 
1132  return "0";
1133  }
1134 
1135  auto numDigitsBeforePoint = (int) std::ceil (std::log10 (number < 0 ? -number : number));
1136 
1137  auto shift = numberOfSignificantFigures - numDigitsBeforePoint;
1138  auto factor = std::pow (10.0, shift);
1139  auto rounded = std::round (number * factor) / factor;
1140 
1141  std::stringstream ss;
1142  ss << std::fixed << std::setprecision (std::max (shift, 0)) << rounded;
1143  return ss.str();
1144  }
1145 
1146  //==============================================================================
1153  CharPointerType getCharPointer() const noexcept { return text; }
1154 
1166  CharPointer_UTF8 toUTF8() const;
1167 
1179  const char* toRawUTF8() const;
1180 
1192  CharPointer_UTF16 toUTF16() const;
1193 
1202  CharPointer_UTF32 toUTF32() const;
1203 
1216  const wchar_t* toWideCharPointer() const;
1217 
1219  std::string toStdString() const;
1220 
1221  //==============================================================================
1225  static String fromUTF8 (const char* utf8buffer, int bufferSizeBytes = -1);
1226 
1231  size_t getNumBytesAsUTF8() const noexcept;
1232 
1233  //==============================================================================
1249  size_t copyToUTF8 (CharPointer_UTF8::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept;
1250 
1266  size_t copyToUTF16 (CharPointer_UTF16::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept;
1267 
1283  size_t copyToUTF32 (CharPointer_UTF32::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept;
1284 
1285  //==============================================================================
1300  void preallocateBytes (size_t numBytesNeeded);
1301 
1305  void swapWith (String& other) noexcept;
1306 
1307  //==============================================================================
1308  #if JUCE_MAC || JUCE_IOS || DOXYGEN
1310  static String fromCFString (CFStringRef cfString);
1311 
1316  CFStringRef toCFString() const;
1317 
1320  String convertToPrecomposedUnicode() const;
1321  #endif
1322 
1326  int getReferenceCount() const noexcept;
1327 
1328  //==============================================================================
1329  #if JUCE_ALLOW_STATIC_NULL_VARIABLES && ! defined (DOXYGEN)
1330  [[deprecated ("This was a static empty string object, but is now deprecated as it's too easy to accidentally "
1331  "use it indirectly during a static constructor, leading to hard-to-find order-of-initialisation "
1332  "problems. If you need an empty String object, just use String() or {}. For returning an empty "
1333  "String from a function by reference, use a function-local static String object and return that.")]]
1334  static const String empty;
1335  #endif
1336 
1337 private:
1338  //==============================================================================
1339  CharPointerType text;
1340 
1341  //==============================================================================
1342  struct PreallocationBytes
1343  {
1344  explicit PreallocationBytes (size_t) noexcept;
1345  size_t numBytes;
1346  };
1347 
1348  explicit String (const PreallocationBytes&); // This constructor preallocates a certain amount of memory
1349  size_t getByteOffsetOfEnd() const noexcept;
1350 
1351  // This private cast operator should prevent strings being accidentally cast
1352  // to bools (this is possible because the compiler can add an implicit cast
1353  // via a const char*)
1354  operator bool() const noexcept { return false; }
1355 
1356  //==============================================================================
1357  static String formattedRaw (const char*, ...);
1358 
1359  static String createHex (uint8);
1360  static String createHex (uint16);
1361  static String createHex (uint32);
1362  static String createHex (uint64);
1363 
1364  template <typename Type>
1365  static String createHex (Type n) { return createHex (static_cast<typename TypeHelpers::UnsignedTypeWithSize<(int) sizeof (n)>::type> (n)); }
1366 };
1367 
1368 //==============================================================================
1370 JUCE_API String JUCE_CALLTYPE operator+ (const char* string1, const String& string2);
1372 JUCE_API String JUCE_CALLTYPE operator+ (const wchar_t* string1, const String& string2);
1374 JUCE_API String JUCE_CALLTYPE operator+ (char string1, const String& string2);
1376 JUCE_API String JUCE_CALLTYPE operator+ (wchar_t string1, const String& string2);
1377 #if ! JUCE_NATIVE_WCHAR_IS_UTF32
1379 JUCE_API String JUCE_CALLTYPE operator+ (juce_wchar string1, const String& string2);
1380 #endif
1381 
1383 JUCE_API String JUCE_CALLTYPE operator+ (String string1, const String& string2);
1385 JUCE_API String JUCE_CALLTYPE operator+ (String string1, const char* string2);
1387 JUCE_API String JUCE_CALLTYPE operator+ (String string1, const wchar_t* string2);
1389 JUCE_API String JUCE_CALLTYPE operator+ (String string1, const std::string& string2);
1391 JUCE_API String JUCE_CALLTYPE operator+ (String string1, char characterToAppend);
1393 JUCE_API String JUCE_CALLTYPE operator+ (String string1, wchar_t characterToAppend);
1394 #if ! JUCE_NATIVE_WCHAR_IS_UTF32
1396 JUCE_API String JUCE_CALLTYPE operator+ (String string1, juce_wchar characterToAppend);
1397 #endif
1398 
1399 //==============================================================================
1401 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, char characterToAppend);
1403 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, wchar_t characterToAppend);
1404 #if ! JUCE_NATIVE_WCHAR_IS_UTF32
1406 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, juce_wchar characterToAppend);
1407 #endif
1408 
1410 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const char* string2);
1412 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const wchar_t* string2);
1414 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const String& string2);
1416 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, StringRef string2);
1418 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const std::string& string2);
1419 
1421 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, uint8 number);
1423 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, short number);
1425 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, int number);
1427 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, long number);
1429 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, unsigned long number);
1431 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, int64 number);
1433 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, uint64 number);
1435 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, float number);
1437 JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, double number);
1438 
1439 #ifndef DOXYGEN
1440 // Automatically creating a String from a bool opens up lots of nasty type conversion edge cases.
1441 // If you want a String representation of a bool you can cast the bool to an int first.
1442 String& JUCE_CALLTYPE operator<< (String&, bool) = delete;
1443 #endif
1444 
1445 //==============================================================================
1447 JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const String& string2) noexcept;
1449 JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const char* string2) noexcept;
1451 JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const wchar_t* string2) noexcept;
1453 JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, CharPointer_UTF8 string2) noexcept;
1455 JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, CharPointer_UTF16 string2) noexcept;
1457 JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, CharPointer_UTF32 string2) noexcept;
1458 
1460 JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const String& string2) noexcept;
1462 JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const char* string2) noexcept;
1464 JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const wchar_t* string2) noexcept;
1466 JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, CharPointer_UTF8 string2) noexcept;
1468 JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, CharPointer_UTF16 string2) noexcept;
1470 JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, CharPointer_UTF32 string2) noexcept;
1471 
1472 //==============================================================================
1476 template <class traits>
1477 std::basic_ostream <char, traits>& JUCE_CALLTYPE operator<< (std::basic_ostream <char, traits>& stream, const String& stringToWrite)
1478 {
1479  return stream << stringToWrite.toRawUTF8();
1480 }
1481 
1485 template <class traits>
1486 std::basic_ostream <wchar_t, traits>& JUCE_CALLTYPE operator<< (std::basic_ostream <wchar_t, traits>& stream, const String& stringToWrite)
1487 {
1488  return stream << stringToWrite.toWideCharPointer();
1489 }
1490 
1492 JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const String& stringToWrite);
1493 
1495 JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, StringRef stringToWrite);
1496 
1497 } // namespace juce
1498 
1499 #ifndef DOXYGEN
1500 namespace std
1501 {
1502  template <> struct hash<juce::String>
1503  {
1504  size_t operator() (const juce::String& s) const noexcept { return s.hash(); }
1505  };
1506 }
1507 #endif
CharPointerType getCharPointer() const noexcept
Definition: juce_String.h:1153
CharPointerType begin() const
Definition: juce_String.h:923
bool isEmpty() const noexcept
Definition: juce_String.h:310
static String toDecimalStringWithSignificantFigures(DecimalType number, int numberOfSignificantFigures)
Definition: juce_String.h:1116
void appendCharPointer(CharPointer startOfTextToAppend, CharPointer endOfTextToAppend)
Definition: juce_String.h:247
CharPointerType end() const
Definition: juce_String.h:949
void appendCharPointer(CharPointer textToAppend, size_t maxCharsToTake)
Definition: juce_String.h:276
void appendCharPointer(CharPointer textToAppend)
Definition: juce_String.h:298
bool isNotEmpty() const noexcept
Definition: juce_String.h:316