Plasma Engine  2.0
Loading...
Searching...
No Matches
StringUtils.h
1#pragma once
2
3#ifndef PL_INCLUDING_BASICS_H
4# error "Please don't include StringUtils.h directly, but instead include Foundation/Basics.h"
5#endif
6
7#include <Foundation/Strings/UnicodeUtils.h>
8
10class PL_FOUNDATION_DLL plStringUtils
11{
12public:
14 template <typename T>
15 static constexpr bool IsNullOrEmpty(const T* pString); // [tested]
16
19 template <typename T>
20 static bool IsNullOrEmpty(const T* pString, const T* pStringEnd);
21
23 template <typename T>
24 static void UpdateStringEnd(const T* pStringStart, const T*& ref_pStringEnd);
25
32 template <typename T>
33 static constexpr plUInt32 GetStringElementCount(const T* pString); // [tested]
34
41 template <typename T>
42 static plUInt32 GetStringElementCount(const T* pString, const T* pStringEnd); // [tested]
43
44
47 static plUInt32 GetCharacterCount(const char* szUtf8, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
48
50 static void GetCharacterAndElementCount(const char* szUtf8, plUInt32& ref_uiCharacterCount, plUInt32& ref_uiElementCount, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
51
58 static plUInt32 Copy(char* szDest, plUInt32 uiDstSize, const char* szSource, const char* pSourceEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
59
66 static plUInt32 CopyN(char* szDest, plUInt32 uiDstSize, const char* szSource, plUInt32 uiCharsToCopy, const char* pSourceEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
67
69 static plUInt32 ToUpperChar(plUInt32 uiChar); // [tested]
70
72 static plUInt32 ToLowerChar(plUInt32 uiChar); // [tested]
73
77 static plUInt32 ToUpperString(char* szString, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
78
82 static plUInt32 ToLowerString(char* szString, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
83
89 static plInt32 CompareChars(plUInt32 uiCharacter1, plUInt32 uiCharacter2); // [tested]
90
96 static plInt32 CompareChars(const char* szUtf8Char1, const char* szUtf8Char2); // [tested]
97
103 static plInt32 CompareChars_NoCase(plUInt32 uiCharacter1, plUInt32 uiCharacter2); // [tested]
104
110 static plInt32 CompareChars_NoCase(const char* szUtf8Char1, const char* szUtf8Char2); // [tested]
111
113 static bool IsEqual(const char* pString1, const char* pString2, const char* pString1End = plUnicodeUtils::GetMaxStringEnd<char>(), const char* pString2End = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
114
118 static bool IsEqualN(const char* pString1, const char* pString2, plUInt32 uiCharsToCompare, const char* pString1End = plUnicodeUtils::GetMaxStringEnd<char>(), const char* pString2End = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
119
121 static bool IsEqual_NoCase(const char* pString1, const char* pString2, const char* pString1End = plUnicodeUtils::GetMaxStringEnd<char>(), const char* pString2End = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
122
126 static bool IsEqualN_NoCase(const char* pString1, const char* pString2, plUInt32 uiCharsToCompare, const char* pString1End = plUnicodeUtils::GetMaxStringEnd<char>(), const char* pString2End = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
127
134 static plInt32 Compare(const char* pString1, const char* pString2, const char* pString1End = plUnicodeUtils::GetMaxStringEnd<char>(), const char* pString2End = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
135
142 static plInt32 CompareN(const char* pString1, const char* pString2, plUInt32 uiCharsToCompare, const char* pString1End = plUnicodeUtils::GetMaxStringEnd<char>(), const char* pString2End = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
143
150 static plInt32 Compare_NoCase(const char* pString1, const char* pString2, const char* pString1End = plUnicodeUtils::GetMaxStringEnd<char>(), const char* pString2End = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
151
158 static plInt32 CompareN_NoCase(const char* pString1, const char* pString2, plUInt32 uiCharsToCompare, const char* pString1End = plUnicodeUtils::GetMaxStringEnd<char>(), const char* pString2End = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
159
160
170 static plInt32 snprintf(char* szDst, plUInt32 uiDstSize, const char* szFormat, ...); // [tested]
171
181 static plInt32 vsnprintf(char* szDst, plUInt32 uiDstSize, const char* szFormat, va_list szAp); // [tested]
182
184 static bool StartsWith(const char* szString, const char* szStartsWith, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>(), const char* szStartsWithEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
185
187 static bool StartsWith_NoCase(const char* szString, const char* szStartsWith, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>(), const char* szStartsWithEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
188
190 static bool EndsWith(const char* szString, const char* szEndsWith, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>(), const char* szEndsWithEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
191
193 static bool EndsWith_NoCase(const char* szString, const char* szEndsWith, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>(), const char* szEndsWithEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
194
195
197 static const char* FindSubString(const char* szSource, const char* szStringToFind, const char* pSourceEnd = plUnicodeUtils::GetMaxStringEnd<char>(), const char* szStringToFindEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
198
200 static const char* FindSubString_NoCase(const char* szSource, const char* szStringToFind, const char* pSourceEnd = plUnicodeUtils::GetMaxStringEnd<char>(), const char* szStringToFindEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
201
203 static const char* FindLastSubString(const char* szSource, const char* szStringToFind, const char* szStartSearchAt = nullptr, const char* pSourceEnd = plUnicodeUtils::GetMaxStringEnd<char>(), const char* szStringToFindEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
204
206 static const char* FindLastSubString_NoCase(const char* szSource, const char* szStringToFind, const char* szStartSearchAt = nullptr, const char* pSourceEnd = plUnicodeUtils::GetMaxStringEnd<char>(), const char* szStringToFindEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
207
209 using PL_CHARACTER_FILTER = bool (*)(plUInt32 uiChar);
210
217 static const char* SkipCharacters(const char* szString, PL_CHARACTER_FILTER skipCharacterCB, bool bAlwaysSkipFirst = false); // [tested]
218
223 static const char* FindWordEnd(const char* szString, PL_CHARACTER_FILTER isDelimiterCB, bool bAlwaysSkipFirst = true); // [tested]
224
232 static void Trim(const char*& ref_pString, const char*& ref_pStringEnd, const char* szTrimCharsStart, const char* szTrimCharsEnd); // [tested] via plStringView and plStringBuilder
233
236 static bool IsWhiteSpace(plUInt32 uiChar); // [tested]
237
239 static bool IsDecimalDigit(plUInt32 uiChar); // [tested]
240
242 static bool IsHexDigit(plUInt32 uiChar); // [tested]
243
245 static bool IsWordDelimiter_English(plUInt32 uiChar); // [tested]
246
248 static bool IsIdentifierDelimiter_C_Code(plUInt32 uiChar); // [tested]
249
251 static bool IsValidIdentifierName(const char* pString, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
252
255 static const char* FindWholeWord(const char* szString, const char* szSearchFor, PL_CHARACTER_FILTER isDelimiterCB, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
256
259 static const char* FindWholeWord_NoCase(const char* szString, const char* szSearchFor, PL_CHARACTER_FILTER isDelimiterCB, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>()); // [tested]
260
264 static plResult FindUIntAtTheEnd(const char* szString, plUInt32& out_uiValue, plUInt32* pStringLengthBeforeUInt = nullptr); // [tested]
265
267 static void OutputFormattedInt(char* szOutputBuffer, plUInt32 uiBufferSize, plUInt32& ref_uiWritePos, plInt64 value, plUInt8 uiWidth, bool bPadZeros, plUInt8 uiBase);
269 static void OutputFormattedUInt(char* szOutputBuffer, plUInt32 uiBufferSize, plUInt32& ref_uiWritePos, plUInt64 value, plUInt8 uiWidth, bool bPadZeros, plUInt8 uiBase, bool bUpperCase);
271 static void OutputFormattedFloat(char* szOutputBuffer, plUInt32 uiBufferSize, plUInt32& ref_uiWritePos, double value, plUInt8 uiWidth, bool bPadZeros, plInt8 iPrecision, bool bScientific, bool bRemoveTrailingZeroes = false);
272
277 static plUInt32 CalculateLineNumber(const char* szString, const char* szOffset, const char* pStringEnd = plUnicodeUtils::GetMaxStringEnd<char>());
278};
279
280
281#include <Foundation/Strings/Implementation/StringUtils_inl.h>
Helper functions to work with UTF-8 strings (which include pure ASCII strings)
Definition StringUtils.h:11
static void UpdateStringEnd(const T *pStringStart, const T *&ref_pStringEnd)
Recomputes the end pointer of a string (szStringEnd), if that is currently set to plMaxStringEnd....
static bool IsNullOrEmpty(const T *pString, const T *pStringEnd)
Returns true, if the given string is a nullptr pointer, is equal to its end or a string that immediat...
bool(*)(plUInt32 uiChar) PL_CHARACTER_FILTER
Function Definition for a function that determines whether a (Utf32) character belongs to a certain c...
Definition StringUtils.h:209
static constexpr bool IsNullOrEmpty(const T *pString)
Returns true, if the given string is a nullptr pointer or a string that immediately terminates with a...
static constexpr T * GetMaxStringEnd()
[internal] Returns the max string end pointer for the given type
Definition UnicodeUtils_inl.h:261
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54