DotNetDupe 4.0.6
C++17/20 Implementation of the .NET Base Class Library (BCL)
Loading...
Searching...
No Matches
String.h
Go to the documentation of this file.
1
3
4#pragma once
5
11#include "Utils.h"
12
13// Forward declaration moved
15#include <initializer_list>
16#include <ctype.h>
17#include <wctype.h>
18#include <cstring>
19
20namespace DotNetDupe {
21 namespace System {
22 template<typename T> class Array;
23
30
33 static bool Equals(char c1, char c2) {
34 return tolower(static_cast<unsigned char>(c1)) == tolower(static_cast<unsigned char>(c2));
35 }
36 };
37
40 static bool Equals(wchar_t c1, wchar_t c2) {
41 return towlower(c1) == towlower(c2);
42 }
43 };
44
45 class DateTimeOffset;
46
48 static constexpr const char* True = "True";
49 static constexpr const char* False = "False";
50 };
51
53 static constexpr const wchar_t* True = L"True";
54 static constexpr const wchar_t* False = L"False";
55 };
56
58 static constexpr const char* Message = "Input string was not in a correct format.";
59 };
60
62 static constexpr const wchar_t* Message = L"Input string was not in a correct format.";
63 };
64
74 class String {
75 public:
78
81 DOTNETDUPE_API String(const char* pStr);
82
85 DOTNETDUPE_API String(const String& sStr);
86
91
94 DOTNETDUPE_API String(String&& sStr) noexcept;
95
99 DOTNETDUPE_API String& operator=(String&& sStr) noexcept;
100
104 DOTNETDUPE_API String& operator=(const char* pStr);
105
107
108 // Converting constructor & assignment for opposite character pointer type
109
110 DOTNETDUPE_API String(const wchar_t* pStr);
111 DOTNETDUPE_API String& operator=(const wchar_t* pStr);
112
113 // std::nullptr_t & int (0/NULL) constructors & assignments to throw ArgumentException
114 DOTNETDUPE_API String(std::nullptr_t) { throw ArgumentException("Invalid input pointer"); }
115 DOTNETDUPE_API String& operator=(std::nullptr_t) { throw ArgumentException("Invalid input pointer"); }
117 if (nNull == 0) throw ArgumentException("Invalid input pointer");
118 throw ArgumentException("Invalid input integer");
119 }
120 DOTNETDUPE_API const char* GetRawString() const;
121 DOTNETDUPE_API const char* GetChars() const;
122 operator const char* () const { return GetRawString(); }
123 DOTNETDUPE_API int GetHashCode() const;
124 DOTNETDUPE_API int GetLength() const;
126
127 DOTNETDUPE_API bool operator<(const String& sStr) const {
128 const char* p1 = GetRawString();
129 const char* p2 = sStr.GetRawString();
130 if (!p1 && !p2) return false;
131 if (!p1) return true;
132 if (!p2) return false;
133 return strcmp(p1, p2) < 0;
134 }
135
136 friend bool operator==(const String& sStr1, const String& sStr2) {
137 const char* p1 = sStr1.GetRawString();
138 const char* p2 = sStr2.GetRawString();
139 if (p1 == p2) return true;
140 if (!p1 || !p2) return false;
141 return strcmp(p1, p2) == 0;
142 }
143 friend bool operator==(const String& sStr1, const char* pStr2) {
144 const char* p1 = sStr1.GetRawString();
145 if (p1 == pStr2) return true;
146 if (!p1 || !pStr2) return false;
147 return strcmp(p1, pStr2) == 0;
148 }
149 friend bool operator==(const char* pStr1, const String& sStr2) {
150 return sStr2 == pStr1;
151 }
152
153 friend bool operator!=(const String& sStr1, const String& sStr2) {
154 return !(sStr1 == sStr2);
155 }
156 friend bool operator!=(const String& sStr1, const char* pStr2) {
157 return !(sStr1 == pStr2);
158 }
159 friend bool operator!=(const char* pStr1, const String& sStr2) {
160 return !(pStr1 == sStr2);
161 }
162 DOTNETDUPE_API char operator[](int iIndex) const;
163 DOTNETDUPE_API static int Compare(const String& sStr1, int iIndex1,
164 const String& sStr2, int iIndex2, int iLength,
165 bool bIgnoreCase);
166 DOTNETDUPE_API int CompareTo(const String& sStr) const;
167 DOTNETDUPE_API String operator+(const String& sStr) const;
168 DOTNETDUPE_API String operator+(const char* pStr) const;
169 DOTNETDUPE_API String operator+(char ch) const;
170
172 DOTNETDUPE_API String& operator+=(const char* pStr);
174
175 DOTNETDUPE_API friend String operator+(const char* pStr, const String& sStr);
176 DOTNETDUPE_API friend String operator+(char ch, const String& sStr);
178 const std::initializer_list<String> sStrs) const;
179
180 DOTNETDUPE_API bool Contains(char ch) const;
181 DOTNETDUPE_API bool Contains(const String& sStr) const;
182
183 DOTNETDUPE_API void CopyTo(int iSourceIndex, char* pDestination, int iDestinationIndex,
184 int iDestArraySize, int iCount) const;
185
186 DOTNETDUPE_API bool EndsWith(char ch, bool bIgnoreCase) const;
187 DOTNETDUPE_API bool EndsWith(const String& sSuffix, bool bIgnoreCase) const;
188
189 DOTNETDUPE_API static bool Equals(const String& sStr1,
190 const String& sStr2);
191 DOTNETDUPE_API bool Equals(const String& sStr) const;
192
193 DOTNETDUPE_API int IndexOf(const String& sSubstring) const;
194 DOTNETDUPE_API int IndexOf(const String& sSubstring, bool bIgnoreCase) const;
195 DOTNETDUPE_API int IndexOf(const String& sSubstring, int iStartIndex,
196 bool bIgnoreCase) const;
197 DOTNETDUPE_API int IndexOfAny(int iStartIndex, std::initializer_list<char> chChars);
198
199 DOTNETDUPE_API String& Append(const char ch);
200 DOTNETDUPE_API String& Append(const String& sStr);
201 DOTNETDUPE_API String& Insert(int iIndex, const String& sStr);
202
203 DOTNETDUPE_API bool IsEmpty() const;
204
206 char chSeparator, std::initializer_list<String> sStrings);
208 char chSeparator, std::initializer_list<String> sStrings,
209 int iStartIndex, int iCount);
211 const String& sSeparator,
212 std::initializer_list<String> sStrings);
214 const String& sSeparator,
215 std::initializer_list<String> sStrings, int iStartIndex,
216 int iCount);
217
218 static String FormatArgHelper(bool b) { return b ? "True" : "False"; }
219 static String FormatArgHelper(std::nullptr_t) { return ""; }
220 static String FormatArgHelper(const String& s) { return s; }
221 static String FormatArgHelper(const char* s) { return String(s); }
222 static String FormatArgHelper(char c) { char arr[2] = {c, 0}; return String(arr); }
223 static String FormatArgHelper(short i) { return String::FromInt(i); }
224 static String FormatArgHelper(unsigned short i) { return String::FromInt(i); }
225 static String FormatArgHelper(int i) { return String::FromInt(i); }
226 static String FormatArgHelper(unsigned int u) { return String::ValueOf((long long)u); }
227 static String FormatArgHelper(long l) { return String::ValueOf((long long)l); }
228 static String FormatArgHelper(unsigned long ul) { return String::ValueOf((long long)ul); }
229 static String FormatArgHelper(long long ll) { return String::ValueOf(ll); }
230 static String FormatArgHelper(unsigned long long ull) { return String::ValueOf((long long)ull); }
231 static String FormatArgHelper(float f) { return String::ValueOf((double)f); }
232 static String FormatArgHelper(double d) { return String::ValueOf(d); }
233 template<typename T>
234 static String FormatArgHelper(const T& arg) { return arg.ToString(); }
235
236 DOTNETDUPE_API static String InternalFormat(const char* pFormat, const String* pArgs, int iArgCount);
237
238 template <typename Arg1, typename... Args>
239 static String Format(const char* pFormat, const Arg1& arg1, const Args&... args) {
240 String arrArgs[] = { FormatArgHelper(arg1), FormatArgHelper(args)... };
241 return InternalFormat(pFormat, arrArgs, 1 + sizeof...(Args));
242 }
243 static String Format(const char* pFormat) {
244 return InternalFormat(pFormat, nullptr, 0);
245 }
246 static String Format(const String& sFormat) {
247 return Format(sFormat.GetRawString() ? sFormat.GetRawString() : "");
248 }
249 template <typename Arg1, typename... Args>
250 static String Format(const String& sFormat, const Arg1& arg1, const Args&... args) {
251 return Format(sFormat.GetRawString() ? sFormat.GetRawString() : "", arg1, args...);
252 }
253
254 DOTNETDUPE_API int LastIndexOf(const String& sStr, bool bIgnoreCase);
255 DOTNETDUPE_API int LastIndexOfAny(int iStartIndex, std::initializer_list<char> chChars,
256 bool bIgnoreCase);
257
258 DOTNETDUPE_API String PadLeft(int iTotalWidth);
259 DOTNETDUPE_API String PadLeft(int iTotalWidth, char ch);
260 DOTNETDUPE_API String PadRight(int iTotalWidth);
261 DOTNETDUPE_API String PadRight(int iTotalWidth, char ch);
262
263 DOTNETDUPE_API String Remove(int iStartIndex) const;
264 DOTNETDUPE_API String Remove(int iStartIndex, int iCount) const;
265
266 DOTNETDUPE_API String Replace(char chOriginalChar, char chReplaceChar) const;
267 DOTNETDUPE_API String Replace(const String& sOriginalStr,
268 const String& sReplaceStr) const;
269 DOTNETDUPE_API Array<String> Split(char chSeparator) const;
270 DOTNETDUPE_API Array<String> Split(const Array<String>& arrSeparators,
272 DOTNETDUPE_API Array<String> Split(const String* pSeparator, int iCount,
273 StringSplitOptions eOptions) const;
274 DOTNETDUPE_API bool StartsWith(const String& sPrefix) const;
275 DOTNETDUPE_API bool StartsWith(const String& sPrefix, bool bIgnoreCase) const;
276 DOTNETDUPE_API String Substring(int iStartIndex) const;
277 DOTNETDUPE_API String Substring(int iStartIndex, int iLength) const;
278
279 DOTNETDUPE_API static String FromInt(int iValue);
280 DOTNETDUPE_API static String ValueOf(int iValue);
281 DOTNETDUPE_API static String ValueOf(long long llValue);
282 DOTNETDUPE_API static String ValueOf(double dValue);
283 DOTNETDUPE_API static String ToString(int iValue);
284 DOTNETDUPE_API static String ToString(long long llValue);
285 DOTNETDUPE_API static String ToString(double dValue);
286 DOTNETDUPE_API static String ToString(bool bValue);
287
290 DOTNETDUPE_API String Trim() const;
293
294 DOTNETDUPE_API void* operator new(size_t size);
295 DOTNETDUPE_API void operator delete(void* p);
296 DOTNETDUPE_API void* operator new[](size_t size);
297 DOTNETDUPE_API void operator delete[](void* p);
298
299 private:
300 struct StringImpl;
301 StringImpl* m_pImpl;
302 };
303 }
304}
305
306
Defines the exception thrown when an invalid argument is provided to a method.
Defines the exception thrown when an argument value is outside the acceptable range of values.
#define DOTNETDUPE_API
Platform-specific linkage decoration for exporting or importing library symbols.
Definition Common.h:20
Defines the exception thrown when the format of an argument is invalid or not compliant with specific...
Defines the exception thrown when a requested method or operation is not implemented.
Defines the exception thrown when an arithmetic, casting, or conversion operation results in an overf...
Utility routines for high-performance UTF-8, UTF-16, and wide-character string conversions.
ArgumentException(const String &sMessage)
Initializes a new instance of the ArgumentException class with a specified error message.
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the ba...
Definition Array.h:29
Represents text as a sequence of UTF-8 code units with culture-invariant operations.
Definition String.h:74
String(std::nullptr_t)
Definition String.h:114
static String ValueOf(int iValue)
Definition String.cpp:628
static String Join(char chSeparator, std::initializer_list< String > sStrings)
Definition String.cpp:402
static String Format(const String &sFormat, const Arg1 &arg1, const Args &... args)
Definition String.h:250
String & operator+=(const String &sStr)
Definition String.cpp:159
static String FormatArgHelper(const T &arg)
Definition String.h:234
static String Format(const String &sFormat)
Definition String.h:246
String & operator=(const String &sStr)
Copy assignment operator.
Definition String.cpp:196
String Concat(const std::initializer_list< String > sStrs) const
Definition String.cpp:280
static String FormatArgHelper(long l)
Definition String.h:227
String Substring(int iStartIndex) const
Definition String.cpp:659
friend bool operator!=(const String &sStr1, const char *pStr2)
Definition String.h:156
String ToLower() const
Definition String.cpp:672
static String FormatArgHelper(std::nullptr_t)
Definition String.h:219
static String FormatArgHelper(long long ll)
Definition String.h:229
friend bool operator==(const String &sStr1, const char *pStr2)
Definition String.h:143
const char * GetChars() const
Definition String.cpp:233
static String FormatArgHelper(float f)
Definition String.h:231
friend bool operator==(const char *pStr1, const String &sStr2)
Definition String.h:149
int CompareTo(const String &sStr) const
Definition String.cpp:277
bool StartsWith(const String &sPrefix) const
Definition String.cpp:610
static String FormatArgHelper(const String &s)
Definition String.h:220
String PadLeft(int iTotalWidth)
Definition String.cpp:488
bool operator<(const String &sStr) const
Definition String.h:127
static int Compare(const String &sStr1, int iIndex1, const String &sStr2, int iIndex2, int iLength, bool bIgnoreCase)
Definition String.cpp:268
String Replace(char chOriginalChar, char chReplaceChar) const
Definition String.cpp:533
String & Insert(int iIndex, const String &sStr)
Definition String.cpp:389
void CopyTo(int iSourceIndex, char *pDestination, int iDestinationIndex, int iDestArraySize, int iCount) const
Definition String.cpp:299
static String FromInt(int iValue)
Definition String.cpp:624
String Remove(int iStartIndex) const
Definition String.cpp:519
static String FormatArgHelper(int i)
Definition String.h:225
friend bool operator!=(const char *pStr1, const String &sStr2)
Definition String.h:159
static String FormatArgHelper(unsigned int u)
Definition String.h:226
bool EndsWith(char ch, bool bIgnoreCase) const
Definition String.cpp:315
int LastIndexOfAny(int iStartIndex, std::initializer_list< char > chChars, bool bIgnoreCase)
Definition String.cpp:478
static String ToString(int iValue)
Definition String.cpp:643
String()
Initializes a new instance of the String class to an empty string.
Definition String.cpp:64
friend bool operator==(const String &sStr1, const String &sStr2)
Definition String.h:136
static String FormatArgHelper(unsigned long long ull)
Definition String.h:230
String ToUpper() const
Definition String.cpp:680
static String FormatArgHelper(unsigned long ul)
Definition String.h:228
static String Format(const char *pFormat, const Arg1 &arg1, const Args &... args)
Definition String.h:239
String & Append(const char ch)
Definition String.cpp:380
static String FormatArgHelper(short i)
Definition String.h:223
static String FormatArgHelper(char c)
Definition String.h:222
int IndexOfAny(int iStartIndex, std::initializer_list< char > chChars)
Definition String.cpp:369
static bool Equals(const String &sStr1, const String &sStr2)
Definition String.cpp:334
int IndexOf(const String &sSubstring) const
Definition String.cpp:341
static String InternalFormat(const char *pFormat, const String *pArgs, int iArgCount)
Definition String.cpp:106
const char * GetRawString() const
Definition String.cpp:230
int LastIndexOf(const String &sStr, bool bIgnoreCase)
Definition String.cpp:450
static String FormatArgHelper(bool b)
Definition String.h:218
bool Contains(char ch) const
Definition String.cpp:292
char operator[](int iIndex) const
Definition String.cpp:256
String & operator=(std::nullptr_t)
Definition String.h:115
static String Format(const char *pFormat)
Definition String.h:243
Array< String > Split(char chSeparator) const
Definition String.cpp:552
friend bool operator!=(const String &sStr1, const String &sStr2)
Definition String.h:153
static String FormatArgHelper(unsigned short i)
Definition String.h:224
String TrimStart() const
Definition String.cpp:692
static String FormatArgHelper(const char *s)
Definition String.h:221
String PadRight(int iTotalWidth)
Definition String.cpp:504
static String FormatArgHelper(double d)
Definition String.h:232
String TrimEnd() const
Definition String.cpp:700
StringSplitOptions
Specifies whether applicable Overload:Split methods include or omit empty substrings.
Definition String.h:25
@ None
Include empty substrings in the returned array.
Definition String.h:26
@ TrimEntries
Trim white-space characters from each element in the array.
Definition String.h:28
@ RemoveEmptyEntries
Omit substrings that contain an empty string from the array.
Definition String.h:27
String operator+(const char *pStr, const String &sStr)
Definition String.cpp:176
static constexpr const char * True
Definition String.h:48
static constexpr const char * False
Definition String.h:49
static constexpr const wchar_t * False
Definition String.h:54
static constexpr const wchar_t * True
Definition String.h:53
Helper for portable ASCII case-insensitive comparison.
Definition String.h:32
static bool Equals(char c1, char c2)
Definition String.h:33
Helper for portable wide-character case-insensitive comparison.
Definition String.h:39
static bool Equals(wchar_t c1, wchar_t c2)
Definition String.h:40
static constexpr const char * Message
Definition String.h:58
static constexpr const wchar_t * Message
Definition String.h:62