8#if !defined(ALIB_C20_MODULES) || ((ALIB_C20_MODULES != 0) && (ALIB_C20_MODULES != 1))
9# error "Symbol ALIB_C20_MODULES has to be given to the compiler as either 0 or 1"
47 bool astringCheckReported=
false;
50template<
typename TChar>
51requires alib::characters::IsCharacter<TChar>
55 if ( !astringCheckReported )
57 astringCheckReported=
true;
58 ALIB_MESSAGE(
"STRINGS",
"ALIB_DEBUG_STRINGS is enabled" )
62 "Nulled string has a length of ", length )
64 for (
integer i= length -1 ; i >= 0 ; --i)
65 if ( buffer[i] ==
'\0' )
67 ALIB_ERROR(
"STRINGS",
"Found termination character '\\0' in buffer. Index=", i )
78template<
typename TChar>
79requires alib::characters::IsCharacter<TChar>
80template<lang::Case TSensitivity>
88 "Illegal start index given: 0 <= {} < {}.", startIdx, length )
90 "Illegal end index given: {} > {}.", endIdx, length -nLen + 1 )
91 const TChar* buf= buffer + startIdx;
92 const TChar* bufEnd= buffer + endIdx;
93 const TChar* nBuf= needle.Buffer();
94 const TChar* nBufEnd= nBuf + nLen;
96 while ( buf < bufEnd )
108template<
typename TChar>
109requires alib::characters::IsCharacter<TChar>
113 while( idx < length )
115 if( buffer[idx] == opener ) ++openCnt;
116 if( buffer[idx] == closer && --openCnt == 0 )
122 return openCnt == 0 ? idx : -openCnt;
128template<
typename TChar>
129requires alib::characters::IsCharacter<TChar>
136 if ( newIdx ==
nullptr )
137 indexPointer= &startIdx;
140 indexPointer= newIdx;
141 *indexPointer= startIdx;
148template<
typename TChar>
149requires alib::characters::IsCharacter<TChar>
156 if ( newIdx ==
nullptr )
157 indexPointer= &startIdx;
160 indexPointer= newIdx;
161 *indexPointer= startIdx;
168template<
typename TChar>
169requires alib::characters::IsCharacter<TChar>
176 if ( newIdx ==
nullptr )
177 indexPointer= &startIdx;
180 indexPointer= newIdx;
181 *indexPointer= startIdx;
188template<
typename TChar>
189requires alib::characters::IsCharacter<TChar>
196 if ( newIdx ==
nullptr )
197 indexPointer= &startIdx;
200 indexPointer= newIdx;
201 *indexPointer= startIdx;
208template<
typename TChar>
209requires alib::characters::IsCharacter<TChar>
216 if ( newIdx ==
nullptr )
217 indexPointer= &startIdx;
220 indexPointer= newIdx;
221 *indexPointer= startIdx;
228template<
typename TChar>
229requires alib::characters::IsCharacter<TChar>
236 if ( newIdx ==
nullptr )
237 indexPointer= &startIdx;
240 indexPointer= newIdx;
241 *indexPointer= startIdx;
248template<
typename TChar>
249requires alib::characters::IsCharacter<TChar>
256 if ( newIdx ==
nullptr )
257 indexPointer= &startIdx;
260 indexPointer= newIdx;
261 *indexPointer= startIdx;
278 const nchar* cs= buffer;
281 #if defined( _WIN32 )
283 int conversionSize= MultiByteToWideChar( CP_UTF8, 0, cs,
int( length ),
nullptr, 0 );
287 if ( conversionSize == 0 )
290 int error= GetLastError();
292 NString128 msg(
"AString: Conversion to wide character string failed (Error: " );
293 if ( error == ERROR_INSUFFICIENT_BUFFER ) msg._(
"ERROR_INSUFFICIENT_BUFFER." );
294 else if ( error == ERROR_INVALID_FLAGS ) msg._(
"ERROR_INVALID_FLAGS." );
295 else if ( error == ERROR_INVALID_PARAMETER ) msg._(
"ERROR_INVALID_PARAMETER" );
296 else if ( error == ERROR_NO_UNICODE_TRANSLATION ) msg._(
"ERROR_NO_UNICODE_TRANSLATION" );
304 if( conversionSize > length )
306 ALIB_ERROR(
"STRINGS",
"MBCS to WCS conversion failed. Conversion length=",
312 return conversionSize;
315 #elif defined (__GLIBCXX__) || defined(_LIBCPP_VERSION) || defined(__APPLE__) || defined(__ANDROID_NDK__)
317 size_t conversionSize= mbsnrtowcs(
nullptr, &cs,
size_t(length), 0,
nullptr );
318 if ( conversionSize ==
size_t(-1) )
320 ALIB_WARNING(
"STRINGS",
"MBCS to WCS conversion failed. Illegal MBC sequence. "
321 "Probably UTF-8 is not set in locale" )
326 "MBCS to WCS conversion failed. Conversion length=", conversionSize )
328 return
integer(conversionSize);
332 #pragma message ("Unknown Platform in file: " __FILE__ )
373 const xchar* src= buffer;
374 const xchar* srcEnd= buffer + length;
376#if ALIB_SIZEOF_WCHAR_T == 4
381 const char32_t uc =
static_cast<char32_t>( *src++ );
382 if ((uc - 0xd800) >= 2048)
387 && ((uc & 0xfffffc00) == 0xd800)
388 && ((
char32_t(*src++) & 0xfffffc00) == 0xdc00),
389 "STRINGS",
"Error decoding UTF16" )
403 || ( uc >= 0xe000 && uc <= 0x10ffff ),
"STRINGS",
404 "Illegal unicode 32 bit codepoint" )
434template<
typename TChar>
435requires alib::characters::IsCharacter<TChar>
438 return std::hash<std::basic_string_view<TChar>>()(
439 std::basic_string_view<TChar>( Buffer(),
size_t(
Length() ) ) );
447template<
typename TChar>
448requires alib::characters::IsCharacter<TChar>
451 std::size_t result= 68460391ul * ( size_t(length) + 1 );
454 auto* end = buffer + length;
455 while( begin != end )
456 result = 199ul * result + std::size_t(
ToUpper<TChar>( *begin++ ) );
467#if ALIB_DEBUG_STRINGS
ALIB_DLL uint64_t ParseDec(integer startIdx=0, TNumberFormat< TChar > *numberFormat=nullptr, integer *newIdx=nullptr) const
constexpr integer Length() const
ALIB_DLL double ParseFloat(integer startIdx=0, TNumberFormat< TChar > *numberFormat=nullptr, integer *newIdx=nullptr) const
ALIB_DLL int64_t ParseInt(integer startIdx=0, TNumberFormat< TChar > *numberFormat=nullptr, integer *newIdx=nullptr) const
std::size_t HashcodeIgnoreCase() const
ALIB_DLL integer indexOfString(const TString &needle, integer startIdx, integer endIdx) const
std::size_t Hashcode() const
ALIB_DLL uint64_t ParseHex(integer startIdx=0, TNumberFormat< TChar > *numberFormat=nullptr, integer *newIdx=nullptr) const
ALIB_DLL uint64_t ParseBin(integer startIdx=0, TNumberFormat< TChar > *numberFormat=nullptr, integer *newIdx=nullptr) const
integer WStringLength() const
integer IndexOfSegmentEnd(TChar opener, TChar closer, integer idx) const
ALIB_DLL uint64_t ParseDecDigits(integer startIdx=0, integer *newIdx=nullptr) const
ALIB_DLL uint64_t ParseOct(integer startIdx=0, TNumberFormat< TChar > *numberFormat=nullptr, integer *newIdx=nullptr) const
#define ALIB_MESSAGE(domain,...)
#define ALIB_WARNING(domain,...)
#define ALIB_ERROR(domain,...)
#define ALIB_ASSERT_ERROR(cond, domain,...)
integer Length(const TChar *cstring)
bool Equal(TChar lhs, TRhs rhs)
ALIB_DLL uint64_t ParseDec(const TString< TChar > &src, integer &idx, const TNumberFormat< TChar > &nf)
ALIB_DLL double ParseFloat(const TString< TChar > &src, integer &idx, const TNumberFormat< TChar > &nf)
ALIB_DLL uint64_t ParseHex(const TString< TChar > &src, integer &idx, const TNumberFormat< TChar > &nf)
ALIB_DLL uint64_t ParseOct(const TString< TChar > &src, integer &idx, const TNumberFormat< TChar > &nf)
ALIB_DLL int64_t ParseInt(const TString< TChar > &src, integer &idx, const TNumberFormat< TChar > &nf)
uint64_t ParseDecDigits(const TString< TChar > &src, integer &idx)
ALIB_DLL uint64_t ParseBin(const TString< TChar > &src, integer &idx, const TNumberFormat< TChar > &nf)
NLocalString< 128 > NString128
Type alias name for TLocalString<nchar,128>.
characters::wchar wchar
Type alias in namespace alib.
lang::integer integer
Type alias in namespace alib.
characters::nchar nchar
Type alias in namespace alib.
characters::xchar xchar
Type alias in namespace alib.
lang::uinteger uinteger
Type alias in namespace alib.