14 #ifndef EASTL_CHAR_TRAITS_H
15 #define EASTL_CHAR_TRAITS_H
17 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
21 #include <EASTL/internal/config.h>
22 #include <EASTL/type_traits.h>
24 EA_DISABLE_ALL_VC_WARNINGS()
27 EA_RESTORE_ALL_VC_WARNINGS()
36 EASTL_API
bool DecodePart(
const char*& pSrc,
const char* pSrcEnd,
char*& pDest,
char* pDestEnd);
37 EASTL_API
bool DecodePart(
const char*& pSrc,
const char* pSrcEnd, char16_t*& pDest, char16_t* pDestEnd);
38 EASTL_API
bool DecodePart(
const char*& pSrc,
const char* pSrcEnd, char32_t*& pDest, char32_t* pDestEnd);
40 EASTL_API
bool DecodePart(
const char16_t*& pSrc,
const char16_t* pSrcEnd,
char*& pDest,
char* pDestEnd);
41 EASTL_API
bool DecodePart(
const char16_t*& pSrc,
const char16_t* pSrcEnd, char16_t*& pDest, char16_t* pDestEnd);
42 EASTL_API
bool DecodePart(
const char16_t*& pSrc,
const char16_t* pSrcEnd, char32_t*& pDest, char32_t* pDestEnd);
44 EASTL_API
bool DecodePart(
const char32_t*& pSrc,
const char32_t* pSrcEnd,
char*& pDest,
char* pDestEnd);
45 EASTL_API
bool DecodePart(
const char32_t*& pSrc,
const char32_t* pSrcEnd, char16_t*& pDest, char16_t* pDestEnd);
46 EASTL_API
bool DecodePart(
const char32_t*& pSrc,
const char32_t* pSrcEnd, char32_t*& pDest, char32_t* pDestEnd);
48 EASTL_API
bool DecodePart(
const int*& pSrc,
const int* pSrcEnd,
char*& pDest,
char* pDestEnd);
49 EASTL_API
bool DecodePart(
const int*& pSrc,
const int* pSrcEnd, char16_t*& pDest, char16_t* pDestEnd);
50 EASTL_API
bool DecodePart(
const int*& pSrc,
const int* pSrcEnd, char32_t*& pDest, char32_t* pDestEnd);
53 bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd);
55 bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd,
char*& pDest,
char* pDestEnd);
56 bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd, char16_t*& pDest, char16_t* pDestEnd);
57 bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd, char32_t*& pDest, char32_t* pDestEnd);
59 bool DecodePart(
const char*& pSrc,
const char* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd);
60 bool DecodePart(
const char16_t*& pSrc,
const char16_t* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd);
61 bool DecodePart(
const char32_t*& pSrc,
const char32_t* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd);
65 bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd);
67 bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd,
char*& pDest,
char* pDestEnd);
68 bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd, char16_t*& pDest, char16_t* pDestEnd);
69 bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd, char32_t*& pDest, char32_t* pDestEnd);
71 bool DecodePart(
const char*& pSrc,
const char* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd);
72 bool DecodePart(
const char16_t*& pSrc,
const char16_t* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd);
73 bool DecodePart(
const char32_t*& pSrc,
const char32_t* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd);
76 #if EA_CHAR8_UNIQUE && EA_WCHAR_UNIQUE
77 bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd);
78 bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd);
83 inline bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd)
85 return DecodePart(
reinterpret_cast<const char*&
>(pSrc),
reinterpret_cast<const char*
>(pSrcEnd),
reinterpret_cast<char*&
>(pDest),
reinterpret_cast<char*&
>(pDestEnd));
88 inline bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd,
char*& pDest,
char* pDestEnd)
90 #if (EA_WCHAR_SIZE == 2)
91 return DecodePart(
reinterpret_cast<const char16_t*&
>(pSrc),
reinterpret_cast<const char16_t*
>(pSrcEnd), pDest, pDestEnd);
92 #elif (EA_WCHAR_SIZE == 4)
93 return DecodePart(
reinterpret_cast<const char32_t*&
>(pSrc),
reinterpret_cast<const char32_t*
>(pSrcEnd), pDest, pDestEnd);
97 inline bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd, char16_t*& pDest, char16_t* pDestEnd)
99 #if (EA_WCHAR_SIZE == 2)
100 return DecodePart(
reinterpret_cast<const char16_t*&
>(pSrc),
reinterpret_cast<const char16_t*
>(pSrcEnd), pDest, pDestEnd);
101 #elif (EA_WCHAR_SIZE == 4)
102 return DecodePart(
reinterpret_cast<const char32_t*&
>(pSrc),
reinterpret_cast<const char32_t*
>(pSrcEnd), pDest, pDestEnd);
106 inline bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd, char32_t*& pDest, char32_t* pDestEnd)
108 #if (EA_WCHAR_SIZE == 2)
109 return DecodePart(
reinterpret_cast<const char16_t*&
>(pSrc),
reinterpret_cast<const char16_t*
>(pSrcEnd), pDest, pDestEnd);
110 #elif (EA_WCHAR_SIZE == 4)
111 return DecodePart(
reinterpret_cast<const char32_t*&
>(pSrc),
reinterpret_cast<const char32_t*
>(pSrcEnd), pDest, pDestEnd);
115 inline bool DecodePart(
const char*& pSrc,
const char* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd)
117 #if (EA_WCHAR_SIZE == 2)
118 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char16_t*&
>(pDest),
reinterpret_cast<char16_t*
>(pDestEnd));
119 #elif (EA_WCHAR_SIZE == 4)
120 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char32_t*&
>(pDest),
reinterpret_cast<char32_t*
>(pDestEnd));
124 inline bool DecodePart(
const char16_t*& pSrc,
const char16_t* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd)
126 #if (EA_WCHAR_SIZE == 2)
127 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char16_t*&
>(pDest),
reinterpret_cast<char16_t*
>(pDestEnd));
128 #elif (EA_WCHAR_SIZE == 4)
129 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char32_t*&
>(pDest),
reinterpret_cast<char32_t*
>(pDestEnd));
133 inline bool DecodePart(
const char32_t*& pSrc,
const char32_t* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd)
135 #if (EA_WCHAR_SIZE == 2)
136 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char16_t*&
>(pDest),
reinterpret_cast<char16_t*
>(pDestEnd));
137 #elif (EA_WCHAR_SIZE == 4)
138 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char32_t*&
>(pDest),
reinterpret_cast<char32_t*
>(pDestEnd));
144 inline bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd)
146 return DecodePart(
reinterpret_cast<const char*&
>(pSrc),
reinterpret_cast<const char*
>(pSrcEnd),
reinterpret_cast<char*&
>(pDest),
reinterpret_cast<char*&
>(pDestEnd));
149 inline bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd,
char*& pDest,
char* pDestEnd)
151 return DecodePart(
reinterpret_cast<const char*&
>(pSrc),
reinterpret_cast<const char*
>(pSrcEnd), pDest, pDestEnd);
154 inline bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd, char16_t*& pDest, char16_t* pDestEnd)
156 return DecodePart(
reinterpret_cast<const char*&
>(pSrc),
reinterpret_cast<const char*
>(pSrcEnd), pDest, pDestEnd);
159 inline bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd, char32_t*& pDest, char32_t* pDestEnd)
161 return DecodePart(
reinterpret_cast<const char*&
>(pSrc),
reinterpret_cast<const char*
>(pSrcEnd), pDest, pDestEnd);
164 inline bool DecodePart(
const char*& pSrc,
const char* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd)
166 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char*&
>(pDest),
reinterpret_cast<char*&
>(pDestEnd));
169 inline bool DecodePart(
const char16_t*& pSrc,
const char16_t* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd)
171 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char*&
>(pDest),
reinterpret_cast<char*&
>(pDestEnd));
174 inline bool DecodePart(
const char32_t*& pSrc,
const char32_t* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd)
176 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char*&
>(pDest),
reinterpret_cast<char*&
>(pDestEnd));
180 #if EA_CHAR8_UNIQUE && EA_WCHAR_UNIQUE
181 inline bool DecodePart(
const char8_t*& pSrc,
const char8_t* pSrcEnd,
wchar_t*& pDest,
wchar_t* pDestEnd)
183 #if (EA_WCHAR_SIZE == 2)
184 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char16_t*&
>(pDest),
reinterpret_cast<char16_t*
>(pDestEnd));
185 #elif (EA_WCHAR_SIZE == 4)
186 return DecodePart(pSrc, pSrcEnd,
reinterpret_cast<char32_t*&
>(pDest),
reinterpret_cast<char32_t*
>(pDestEnd));
190 inline bool DecodePart(
const wchar_t*& pSrc,
const wchar_t* pSrcEnd, char8_t*& pDest, char8_t* pDestEnd)
192 #if (EA_WCHAR_SIZE == 2)
193 return DecodePart(
reinterpret_cast<const char16_t*&
>(pSrc),
reinterpret_cast<const char16_t*
>(pSrcEnd),
reinterpret_cast<char*&
>(pDest),
reinterpret_cast<char*
>(pDestEnd));
194 #elif (EA_WCHAR_SIZE == 4)
195 return DecodePart(
reinterpret_cast<const char32_t*&
>(pSrc),
reinterpret_cast<const char32_t*
>(pSrcEnd),
reinterpret_cast<char*&
>(pDest),
reinterpret_cast<char*
>(pDestEnd));
203 inline char CharToLower(
char c)
204 {
return (
char)tolower((uint8_t)c); }
207 inline T CharToLower(T c)
208 {
if((
unsigned)c <= 0xff)
return (T)tolower((uint8_t)c);
return c; }
211 inline char CharToUpper(
char c)
212 {
return (
char)toupper((uint8_t)c); }
215 inline T CharToUpper(T c)
216 {
if((
unsigned)c <= 0xff)
return (T)toupper((uint8_t)c);
return c; }
219 template <
typename T>
220 int Compare(
const T* p1,
const T* p2,
size_t n)
222 for(; n > 0; ++p1, ++p2, --n)
225 return (
static_cast<typename make_unsigned<T>::type
>(*p1) <
226 static_cast<typename make_unsigned<T>::type
>(*p2)) ? -1 : 1;
231 inline int Compare(
const char* p1,
const char* p2,
size_t n)
233 return memcmp(p1, p2, n);
237 template <
typename T>
238 inline int CompareI(
const T* p1,
const T* p2,
size_t n)
240 for(; n > 0; ++p1, ++p2, --n)
242 const T c1 = CharToLower(*p1);
243 const T c2 = CharToLower(*p2);
246 return (
static_cast<typename make_unsigned<T>::type
>(c1) <
247 static_cast<typename make_unsigned<T>::type
>(c2)) ? -1 : 1;
254 inline const T* Find(
const T* p, T c,
size_t n)
256 for(; n > 0; --n, ++p)
265 inline const char* Find(
const char* p,
char c,
size_t n)
267 return (
const char*)memchr(p, c, n);
272 inline EA_CPP14_CONSTEXPR
size_t CharStrlen(
const T* p)
274 const auto* pCurrent = p;
277 return (
size_t)(pCurrent - p);
281 template <
typename T>
282 inline T* CharStringUninitializedCopy(
const T* pSource,
const T* pSourceEnd, T* pDestination)
284 memmove(pDestination, pSource, (
size_t)(pSourceEnd - pSource) *
sizeof(T));
285 return pDestination + (pSourceEnd - pSource);
289 template <
typename T>
290 const T* CharTypeStringFindEnd(
const T* pBegin,
const T* pEnd, T c)
292 const T* pTemp = pEnd;
293 while(--pTemp >= pBegin)
303 template <
typename T>
304 const T* CharTypeStringRSearch(
const T* p1Begin,
const T* p1End,
305 const T* p2Begin,
const T* p2End)
309 if((p1Begin == p1End) || (p2Begin == p2End))
313 if((p2Begin + 1) == p2End)
314 return CharTypeStringFindEnd(p1Begin, p1End, *p2Begin);
317 if((p2End - p2Begin) > (p1End - p1Begin))
321 const T* pSearchEnd = (p1End - (p2End - p2Begin) + 1);
325 while(pSearchEnd != p1Begin)
328 pCurrent1 = CharTypeStringFindEnd(p1Begin, pSearchEnd, *p2Begin);
329 if(pCurrent1 == pSearchEnd)
334 while(*pCurrent1++ == *pCurrent2++)
336 if(pCurrent2 == p2End)
337 return (pCurrent1 - (p2End - p2Begin));
349 template <
typename T>
350 inline const T* CharTypeStringFindFirstOf(
const T* p1Begin,
const T* p1End,
const T* p2Begin,
const T* p2End)
352 for (; p1Begin != p1End; ++p1Begin)
354 for (
const T* pTemp = p2Begin; pTemp != p2End; ++pTemp)
356 if (*p1Begin == *pTemp)
364 template <
typename T>
365 inline const T* CharTypeStringRFindFirstNotOf(
const T* p1RBegin,
const T* p1REnd,
const T* p2Begin,
const T* p2End)
367 for (; p1RBegin != p1REnd; --p1RBegin)
370 for (pTemp = p2Begin; pTemp != p2End; ++pTemp)
372 if (*(p1RBegin - 1) == *pTemp)
382 template <
typename T>
383 inline const T* CharTypeStringFindFirstNotOf(
const T* p1Begin,
const T* p1End,
const T* p2Begin,
const T* p2End)
385 for (; p1Begin != p1End; ++p1Begin)
388 for (pTemp = p2Begin; pTemp != p2End; ++pTemp)
390 if (*p1Begin == *pTemp)
400 template <
typename T>
401 inline const T* CharTypeStringRFindFirstOf(
const T* p1RBegin,
const T* p1REnd,
const T* p2Begin,
const T* p2End)
403 for (; p1RBegin != p1REnd; --p1RBegin)
405 for (
const T* pTemp = p2Begin; pTemp != p2End; ++pTemp)
407 if (*(p1RBegin - 1) == *pTemp)
415 template <
typename T>
416 inline const T* CharTypeStringRFind(
const T* pRBegin,
const T* pREnd,
const T c)
418 while (pRBegin > pREnd)
420 if (*(pRBegin - 1) == c)
428 inline char* CharStringUninitializedFillN(
char* pDestination,
size_t n,
const char c)
431 memset(pDestination, (uint8_t)c, (
size_t)n);
432 return pDestination + n;
436 inline T* CharStringUninitializedFillN(T* pDestination,
size_t n,
const T c)
438 T * pDest = pDestination;
439 const T*
const pEnd = pDestination + n;
442 return pDestination + n;
446 inline char* CharTypeAssignN(
char* pDestination,
size_t n,
char c)
449 return (
char*)memset(pDestination, c, (
size_t)n);
454 inline T* CharTypeAssignN(T* pDestination,
size_t n, T c)
456 T* pDest = pDestination;
457 const T*
const pEnd = pDestination + n;
EA Standard Template Library.
Definition: algorithm.h:288
EASTL_API bool DecodePart(const char *&pSrc, const char *pSrcEnd, char *&pDest, char *pDestEnd)
Definition: string.cpp:283