LMMS
Loading...
Searching...
No Matches
String.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the Water library.
5 Copyright (c) 2016 ROLI Ltd.
6 Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
7
8 Permission is granted to use this software under the terms of the ISC license
9 http://www.isc.org/downloads/software-support-policy/isc-license/
10
11 Permission to use, copy, modify, and/or distribute this software for any
12 purpose with or without fee is hereby granted, provided that the above
13 copyright notice and this permission notice appear in all copies.
14
15 THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
16 TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
18 OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
19 USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
21 OF THIS SOFTWARE.
22
23 ==============================================================================
24*/
25
26#ifndef WATER_STRING_H_INCLUDED
27#define WATER_STRING_H_INCLUDED
28
29#include "CharPointer_UTF8.h"
30#include "../memory/Memory.h"
31
32#include <limits>
33#include <string>
34
35namespace water {
36
37//==============================================================================
47class String
48{
49public:
50 //==============================================================================
54 String() noexcept;
55
57 String (const String& other) noexcept;
58
72 String (const char* text);
73
90 String (const char* text, size_t maxChars);
91
92 //==============================================================================
95
97 String (const CharPointer_UTF8 text, size_t maxChars);
98
101
102 //==============================================================================
104 String (const std::string&);
105
107 String (StringRef);
108
109 //==============================================================================
111 static String charToString (water_uchar character);
112
114 ~String() noexcept;
115
116 //==============================================================================
118 int hashCode() const noexcept;
119
121 int64 hashCode64() const noexcept;
122
124 size_t hash() const noexcept;
125
127 int length() const noexcept;
128
129 //==============================================================================
130 // Assignment and concatenation operators..
131
133 String& operator= (const String& other) noexcept;
134
136 String& operator+= (const String& stringToAppend);
138 String& operator+= (const char* textToAppend);
140 String& operator+= (StringRef textToAppend);
142 String& operator+= (int numberToAppend);
144 String& operator+= (long numberToAppend);
146 String& operator+= (int64 numberToAppend);
148 String& operator+= (uint64 numberToAppend);
150 String& operator+= (char characterToAppend);
152 String& operator+= (water_uchar characterToAppend);
153
159 void append (const String& textToAppend, size_t maxCharsToTake);
160
166 void appendCharPointer (const CharPointer_UTF8 startOfTextToAppend,
167 const CharPointer_UTF8 endOfTextToAppend);
168
174 template <class CharPointer>
175 void appendCharPointer (const CharPointer startOfTextToAppend,
176 const CharPointer endOfTextToAppend)
177 {
178 wassert (startOfTextToAppend.getAddress() != nullptr && endOfTextToAppend.getAddress() != nullptr);
179
180 size_t extraBytesNeeded = 0, numChars = 1;
181
182 for (CharPointer t (startOfTextToAppend); t != endOfTextToAppend && ! t.isEmpty(); ++numChars)
183 extraBytesNeeded += CharPointer_UTF8::getBytesRequiredFor (t.getAndAdvance());
184
185 if (extraBytesNeeded > 0)
186 {
187 const size_t byteOffsetOfNull = getByteOffsetOfEnd();
188
189 preallocateBytes (byteOffsetOfNull + extraBytesNeeded);
190 CharPointer_UTF8 (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull))
191 .writeWithCharLimit (startOfTextToAppend, (int) numChars);
192 }
193 }
194
196 void appendCharPointer (const CharPointer_UTF8 textToAppend);
197
203 template <class CharPointer>
204 void appendCharPointer (const CharPointer textToAppend, size_t maxCharsToTake)
205 {
206 if (textToAppend.getAddress() != nullptr)
207 {
208 size_t extraBytesNeeded = 0, numChars = 1;
209
210 for (CharPointer t (textToAppend); numChars <= maxCharsToTake && ! t.isEmpty(); ++numChars)
211 extraBytesNeeded += CharPointer_UTF8::getBytesRequiredFor (t.getAndAdvance());
212
213 if (extraBytesNeeded > 0)
214 {
215 const size_t byteOffsetOfNull = getByteOffsetOfEnd();
216
217 preallocateBytes (byteOffsetOfNull + extraBytesNeeded);
218 CharPointer_UTF8 (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull))
219 .writeWithCharLimit (textToAppend, (int) numChars);
220 }
221 }
222 }
223
225 template <class CharPointer>
226 void appendCharPointer (const CharPointer textToAppend)
227 {
228 appendCharPointer (textToAppend, std::numeric_limits<size_t>::max());
229 }
230
231 //==============================================================================
232 // Comparison methods..
233
238 inline bool isEmpty() const noexcept { return text.isEmpty(); }
239
244 inline bool isNotEmpty() const noexcept { return ! text.isEmpty(); }
245
247 void clear() noexcept;
248
251
254
256 bool equalsIgnoreCase (const char* other) const noexcept;
257
262 int compare (const String& other) const noexcept;
263
268 int compare (const char* other) const noexcept;
269
275
284 int compareNatural (StringRef other, bool isCaseSensitive = false) const noexcept;
285
291
296 bool startsWithChar (water_uchar character) const noexcept;
297
303
309
314 bool endsWithChar (water_uchar character) const noexcept;
315
321
327
331 bool containsChar (water_uchar character) const noexcept;
332
337
344 bool containsWholeWord (StringRef wordToLookFor) const noexcept;
345
353
361 int indexOfWholeWord (StringRef wordToLookFor) const noexcept;
362
371
378 bool containsAnyOf (StringRef charactersItMightContain) const noexcept;
379
387 bool containsOnly (StringRef charactersItMightContain) const noexcept;
388
397
405 bool matchesWildcard (StringRef wildcard, bool ignoreCase) const noexcept;
406
407 //==============================================================================
408 // Substring location methods..
409
415 int indexOfChar (water_uchar characterToLookFor) const noexcept;
416
424 int indexOfChar (int startIndex, water_uchar characterToLookFor) const noexcept;
425
438 int indexOfAnyOf (StringRef charactersToLookFor,
439 int startIndex = 0,
440 bool ignoreCase = false) const noexcept;
441
447 int indexOf (StringRef textToLookFor) const noexcept;
448
456 int indexOf (int startIndex, StringRef textToLookFor) const noexcept;
457
463 int indexOfIgnoreCase (StringRef textToLookFor) const noexcept;
464
472 int indexOfIgnoreCase (int startIndex, StringRef textToLookFor) const noexcept;
473
479
485 int lastIndexOf (StringRef textToLookFor) const noexcept;
486
492 int lastIndexOfIgnoreCase (StringRef textToLookFor) const noexcept;
493
506 int lastIndexOfAnyOf (StringRef charactersToLookFor,
507 bool ignoreCase = false) const noexcept;
508
509
510 //==============================================================================
511 // Substring extraction and manipulation methods..
512
524 water_uchar operator[] (int index) const noexcept;
525
530
531 //==============================================================================
542 String substring (int startIndex, int endIndex) const;
543
552 String substring (int startIndex) const;
553
563 String dropLastCharacters (int numberToDrop) const;
564
572 String getLastCharacters (int numCharacters) const;
573
574 //==============================================================================
590 String fromFirstOccurrenceOf (StringRef substringToStartFrom,
591 bool includeSubStringInResult,
592 bool ignoreCase) const;
593
602 String fromLastOccurrenceOf (StringRef substringToFind,
603 bool includeSubStringInResult,
604 bool ignoreCase) const;
605
619 String upToFirstOccurrenceOf (StringRef substringToEndWith,
620 bool includeSubStringInResult,
621 bool ignoreCase) const;
622
630 String upToLastOccurrenceOf (StringRef substringToFind,
631 bool includeSubStringInResult,
632 bool ignoreCase) const;
633
634 //==============================================================================
636 String trim() const;
637
640
643
650 String trimCharactersAtStart (StringRef charactersToTrim) const;
651
658 String trimCharactersAtEnd (StringRef charactersToTrim) const;
659
660 //==============================================================================
663
666
667 //==============================================================================
683 String replaceSection (int startIndex,
684 int numCharactersToReplace,
685 StringRef stringToInsert) const;
686
694 String replace (StringRef stringToReplace,
695 StringRef stringToInsertInstead,
696 bool ignoreCase = false) const;
697
699 String replaceCharacter (water_uchar characterToReplace,
700 water_uchar characterToInsertInstead) const;
701
712 String replaceCharacters (StringRef charactersToReplace,
713 StringRef charactersToInsertInstead) const;
714
724 String retainCharacters (StringRef charactersToRetain) const;
725
735 String removeCharacters (StringRef charactersToRemove) const;
736
743
751
752 //==============================================================================
759 bool isQuotedString() const;
760
772
781 String quoted (water_uchar quoteCharacter = '"') const;
782
783 //==============================================================================
789 static String repeatedString (StringRef stringToRepeat,
790 int numberOfTimesToRepeat);
791
795 String paddedLeft (water_uchar padCharacter, int minimumLength) const;
796
800 String paddedRight (water_uchar padCharacter, int minimumLength) const;
801
810 static String createStringFromData (const void* data, int size);
811
821 static String formatted (const String formatString, ... );
822
823 //==============================================================================
824 // Numeric conversions..
825
829 explicit String (int decimalInteger);
830
834 explicit String (unsigned int decimalInteger);
835
839 explicit String (short decimalInteger);
840
844 explicit String (unsigned short decimalInteger);
845
849 explicit String (int64 largeIntegerValue);
850
854 explicit String (uint64 largeIntegerValue);
855
859 explicit String (long decimalInteger);
860
864 explicit String (unsigned long decimalInteger);
865
870 explicit String (float floatValue);
871
876 explicit String (double doubleValue);
877
885 String (float floatValue, int numberOfDecimalPlaces);
886
894 String (double doubleValue, int numberOfDecimalPlaces);
895
902
907
918
925
932
943
954
956 static String toHexString (int number);
957
959 static String toHexString (int64 number);
960
962 static String toHexString (short number);
963
973 static String toHexString (const void* data, int size, int groupSize = 1);
974
975 //==============================================================================
983
995 CharPointer_UTF8 toUTF8() const;
996
997 #ifdef CARLA_OS_WIN
999 std::wstring toUTF16() const;
1000 #endif
1001
1013 const char* toRawUTF8() const;
1014
1016 std::string toStdString() const;
1017
1018 //==============================================================================
1022 static String fromUTF8 (const char* utf8buffer, int bufferSizeBytes = -1);
1023
1029
1030 //==============================================================================
1046 size_t copyToUTF8 (CharPointer_UTF8::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept;
1047
1048 //==============================================================================
1063 void preallocateBytes (size_t numBytesNeeded);
1064
1068 void swapWith (String& other) noexcept;
1069
1070 //==============================================================================
1071 #if 0 //def CARLA_OS_MAC
1073 static String fromCFString (CFStringRef cfString);
1074
1079 CFStringRef toCFString() const;
1080 #endif
1081
1082 #ifdef CARLA_OS_MAC
1085 String convertToPrecomposedUnicode() const;
1086 #endif
1087
1092
1093private:
1094 //==============================================================================
1096
1097 //==============================================================================
1099 {
1100 explicit PreallocationBytes (size_t) noexcept;
1101 size_t numBytes;
1102 };
1103
1104 explicit String (const PreallocationBytes&); // This constructor preallocates a certain amount of memory
1106};
1107
1108//==============================================================================
1110String operator+ (const char* string1, const String& string2);
1112String operator+ (char string1, const String& string2);
1114String operator+ (water_uchar string1, const String& string2);
1115
1117String operator+ (String string1, const String& string2);
1119String operator+ (String string1, const char* string2);
1121String operator+ (String string1, char characterToAppend);
1123String operator+ (String string1, water_uchar characterToAppend);
1124
1125//==============================================================================
1127String& operator<< (String& string1, char characterToAppend);
1129String& operator<< (String& string1, water_uchar characterToAppend);
1130
1132String& operator<< (String& string1, const char* string2);
1134String& operator<< (String& string1, const String& string2);
1136String& operator<< (String& string1, StringRef string2);
1137
1139String& operator<< (String& string1, short number);
1141String& operator<< (String& string1, int number);
1143String& operator<< (String& string1, long number);
1145String& operator<< (String& string1, int64 number);
1147String& operator<< (String& string1, uint64 number);
1149String& operator<< (String& string1, float number);
1151String& operator<< (String& string1, double number);
1152
1153//==============================================================================
1155bool operator== (const String& string1, const String& string2) noexcept;
1157bool operator== (const String& string1, const char* string2) noexcept;
1159bool operator== (const String& string1, const CharPointer_UTF8 string2) noexcept;
1160
1162bool operator!= (const String& string1, const String& string2) noexcept;
1164bool operator!= (const String& string1, const char* string2) noexcept;
1166bool operator!= (const String& string1, const CharPointer_UTF8 string2) noexcept;
1167
1169bool operator> (const String& string1, const String& string2) noexcept;
1171bool operator< (const String& string1, const String& string2) noexcept;
1173bool operator>= (const String& string1, const String& string2) noexcept;
1175bool operator<= (const String& string1, const String& string2) noexcept;
1176
1177//==============================================================================
1181template <class traits>
1182std::basic_ostream <char, traits>& operator<< (std::basic_ostream <char, traits>& stream, const String& stringToWrite)
1183{
1184 return stream << stringToWrite.toRawUTF8();
1185}
1186
1188OutputStream& operator<< (OutputStream& stream, const String& stringToWrite);
1189
1191OutputStream& operator<< (OutputStream& stream, StringRef stringToWrite);
1192
1193//==============================================================================
1199
1200}
1201
1202#include "StringRef.h"
1203
1204#endif // WATER_STRING_H_INCLUDED
#define noexcept
Definition DistrhoDefines.h:72
int64_t int64
Definition basics.h:91
uint32 water_uchar
Definition CharacterFunctions.h:38
Definition String.h:48
CharPointer_UTF8 text
Definition String.h:1095
String() noexcept
Definition String.cpp:217
Definition CharPointer_UTF8.h:45
static size_t getBytesRequiredFor(const water_uchar charToWrite) noexcept
Definition CharPointer_UTF8.h:294
void writeWithCharLimit(const CharPointer src, const int maxChars) noexcept
Definition CharPointer_UTF8.h:400
Definition String.h:48
String replaceSection(int startIndex, int numCharactersToReplace, StringRef stringToInsert) const
Definition String.cpp:1099
~String() noexcept
Definition String.cpp:221
String fromFirstOccurrenceOf(StringRef substringToStartFrom, bool includeSubStringInResult, bool ignoreCase) const
Definition String.cpp:1439
bool isQuotedString() const
Definition String.cpp:1487
static String charToString(water_uchar character)
Definition String.cpp:311
bool startsWithChar(water_uchar character) const noexcept
Definition String.cpp:1276
int indexOfAnyOf(StringRef charactersToLookFor, int startIndex=0, bool ignoreCase=false) const noexcept
Definition String.cpp:788
String trimEnd() const
Definition String.cpp:1572
String trimCharactersAtStart(StringRef charactersToTrim) const
Definition String.cpp:1586
int indexOfWholeWord(StringRef wordToLookFor) const noexcept
Definition String.cpp:931
String trimCharactersAtEnd(StringRef charactersToTrim) const
Definition String.cpp:1596
void append(const String &textToAppend, size_t maxCharsToTake)
Definition String.cpp:628
bool containsChar(water_uchar character) const noexcept
Definition String.cpp:921
static String toHexString(int number)
Definition String.cpp:1830
String upToFirstOccurrenceOf(StringRef substringToEndWith, bool includeSubStringInResult, bool ignoreCase) const
Definition String.cpp:1463
CharPointer_UTF8 toUTF8() const
Definition String.cpp:1906
size_t getByteOffsetOfEnd() const noexcept
Definition String.cpp:461
static String formatted(const String formatString,...)
Definition String.cpp:1747
bool equalsIgnoreCase(const String &other) const noexcept
Definition String.cpp:518
bool isNotEmpty() const noexcept
Definition String.h:244
size_t getNumBytesAsUTF8() const noexcept
Definition String.cpp:1956
bool containsWholeWord(StringRef wordToLookFor) const noexcept
Definition String.cpp:975
float getFloatValue() const noexcept
Definition String.cpp:1783
String retainCharacters(StringRef charactersToRetain) const
Definition String.cpp:1620
bool endsWithIgnoreCase(StringRef text) const noexcept
Definition String.cpp:1313
double getDoubleValue() const noexcept
Definition String.cpp:1784
int length() const noexcept
Definition String.cpp:451
String toUpperCase() const
Definition String.cpp:1331
int64 getLargeIntValue() const noexcept
Definition String.cpp:1782
String substring(int startIndex, int endIndex) const
Definition String.cpp:1373
bool endsWithChar(water_uchar character) const noexcept
Definition String.cpp:1284
String paddedLeft(water_uchar padCharacter, int minimumLength) const
Definition String.cpp:1042
void appendCharPointer(const CharPointer textToAppend)
Definition String.h:226
static String createStringFromData(const void *data, int size)
Definition String.cpp:1721
String trimStart() const
Definition String.cpp:1559
bool containsWholeWordIgnoreCase(StringRef wordToLookFor) const noexcept
Definition String.cpp:980
int lastIndexOfAnyOf(StringRef charactersToLookFor, bool ignoreCase=false) const noexcept
Definition String.cpp:904
String & operator+=(const String &stringToAppend)
Definition String.cpp:665
String trim() const
Definition String.cpp:1540
static String repeatedString(StringRef stringToRepeat, int numberOfTimesToRepeat)
Definition String.cpp:1028
String quoted(water_uchar quoteCharacter='"') const
Definition String.cpp:1509
CharPointer_UTF8 text
Definition String.h:1095
String upToLastOccurrenceOf(StringRef substringToFind, bool includeSubStringInResult, bool ignoreCase) const
Definition String.cpp:1475
String unquoted() const
Definition String.cpp:1495
int getHexValue32() const noexcept
Definition String.cpp:1862
void appendCharPointer(const CharPointer_UTF8 startOfTextToAppend, const CharPointer_UTF8 endOfTextToAppend)
Definition String.cpp:639
String dropLastCharacters(int numberToDrop) const
Definition String.cpp:1429
bool endsWith(StringRef text) const noexcept
Definition String.cpp:1296
const char * toRawUTF8() const
Definition String.cpp:1925
String fromLastOccurrenceOf(StringRef substringToFind, bool includeSubStringInResult, bool ignoreCase) const
Definition String.cpp:1451
int indexOfIgnoreCase(StringRef textToLookFor) const noexcept
Definition String.cpp:813
int hashCode() const noexcept
Definition String.cpp:489
bool matchesWildcard(StringRef wildcard, bool ignoreCase) const noexcept
Definition String.cpp:1022
bool startsWithIgnoreCase(StringRef text) const noexcept
Definition String.cpp:1271
int getIntValue() const noexcept
Definition String.cpp:1781
bool startsWith(StringRef text) const noexcept
Definition String.cpp:1266
int compareNatural(StringRef other, bool isCaseSensitive=false) const noexcept
Definition String.cpp:622
String() noexcept
Definition String.cpp:217
void swapWith(String &other) noexcept
Definition String.cpp:231
String replace(StringRef stringToReplace, StringRef stringToInsertInstead, bool ignoreCase=false) const
Definition String.cpp:1159
bool containsNonWhitespaceChars() const noexcept
Definition String.cpp:1699
int lastIndexOfChar(water_uchar character) const noexcept
Definition String.cpp:776
int compare(const String &other) const noexcept
Definition String.cpp:524
void appendCharPointer(const CharPointer textToAppend, size_t maxCharsToTake)
Definition String.h:204
void preallocateBytes(size_t numBytesNeeded)
Definition String.cpp:255
bool containsAnyOf(StringRef charactersItMightContain) const noexcept
Definition String.cpp:1690
String getLastCharacters(int numCharacters) const
Definition String.cpp:1434
int getTrailingIntValue() const noexcept
Definition String.cpp:1786
int64 hashCode64() const noexcept
Definition String.cpp:490
water_uchar getLastCharacter() const noexcept
Definition String.cpp:1368
String & operator=(const String &other) noexcept
Definition String.cpp:242
size_t copyToUTF8(CharPointer_UTF8::CharType *destBuffer, size_t maxBufferSizeBytes) const noexcept
Definition String.cpp:1950
bool containsOnly(StringRef charactersItMightContain) const noexcept
Definition String.cpp:1681
static String fromUTF8(const char *utf8buffer, int bufferSizeBytes=-1)
Definition String.cpp:1961
int compareIgnoreCase(const String &other) const noexcept
Definition String.cpp:526
int64 getHexValue64() const noexcept
Definition String.cpp:1863
int lastIndexOf(StringRef textToLookFor) const noexcept
Definition String.cpp:860
int lastIndexOfIgnoreCase(StringRef textToLookFor) const noexcept
Definition String.cpp:882
String toLowerCase() const
Definition String.cpp:1349
void clear() noexcept
Definition String.cpp:236
String replaceCharacters(StringRef charactersToReplace, StringRef charactersToInsertInstead) const
Definition String.cpp:1240
bool containsIgnoreCase(StringRef text) const noexcept
Definition String.cpp:926
int indexOf(StringRef textToLookFor) const noexcept
Definition String.cpp:808
int getReferenceCount() const noexcept
Definition String.cpp:260
String replaceCharacter(water_uchar characterToReplace, water_uchar characterToInsertInstead) const
Definition String.cpp:1217
bool isEmpty() const noexcept
Definition String.h:238
size_t hash() const noexcept
Definition String.cpp:491
bool contains(StringRef text) const noexcept
Definition String.cpp:916
int indexOfChar(water_uchar characterToLookFor) const noexcept
Definition String.cpp:751
String initialSectionContainingOnly(StringRef permittedCharacters) const
Definition String.cpp:1663
String removeCharacters(StringRef charactersToRemove) const
Definition String.cpp:1642
String initialSectionNotContaining(StringRef charactersToStopAt) const
Definition String.cpp:1672
String paddedRight(water_uchar padCharacter, int minimumLength) const
Definition String.cpp:1069
void appendCharPointer(const CharPointer startOfTextToAppend, const CharPointer endOfTextToAppend)
Definition String.h:175
CharPointer_UTF8 getCharPointer() const noexcept
Definition String.h:982
int indexOfWholeWordIgnoreCase(StringRef wordToLookFor) const noexcept
Definition String.cpp:953
std::string toStdString() const
Definition String.cpp:1930
Definition StringRef.h:67
* e
Definition inflate.c:1404
struct huft * t
Definition inflate.c:943
unsigned s
Definition inflate.c:1555
virtual ASIOError start()=0
JSAMPIMAGE data
Definition jpeglib.h:945
#define wassert(expression)
Definition juce_Uuid.h:141
Definition AudioSampleBuffer.h:33
unsigned long long uint64
Definition water.h:102
OutputStream & operator<<(OutputStream &stream, const MemoryOutputStream &streamToRead)
Definition MemoryOutputStream.cpp:194
long long int64
Definition water.h:100
Type * addBytesToPointer(Type *basePointer, IntegerType bytes) noexcept
Definition Memory.h:56
uint32 water_uchar
Definition CharacterFunctions.h:38
#define false
Definition ordinals.h:83
PreallocationBytes(size_t) noexcept
Definition String.cpp:248
StartEndString(CharPointer_UTF8 s, CharPointer_UTF8 e) noexcept
Definition String.h:1195
CharPointer_UTF8 end
Definition String.h:1197
CharPointer_UTF8 start
Definition String.h:1197
Definition String.h:1099
size_t numBytes
Definition String.h:1101
const char * text
Definition swell-functions.h:167
ulg size
Definition extract.c:2350
#define const
Definition zconf.h:137