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>
87 "Illegal start index given: 0 <= {} < {}.", startIdx, length )
89 "Illegal end index given: {} > {}.", endIdx, length -nLen + 1 )
90 const TChar* buf= buffer + startIdx;
91 const TChar* bufEnd= buffer + endIdx;
92 const TChar* nBuf= needle.Buffer();
93 const TChar* nBufEnd= nBuf + nLen;
95 while ( buf < bufEnd ) {
106template<
typename TChar>
107requires alib::characters::IsCharacter<TChar>
110 while( idx < length ) {
111 if( buffer[idx] == opener ) ++openCnt;
112 if( buffer[idx] == closer && --openCnt == 0 )
118 return openCnt == 0 ? idx : -openCnt;
124template<
typename TChar>
125requires alib::characters::IsCharacter<TChar>
131 if ( newIdx ==
nullptr )
132 indexPointer= &startIdx;
134 indexPointer= newIdx;
135 *indexPointer= startIdx;
142template<
typename TChar>
143requires alib::characters::IsCharacter<TChar>
149 if ( newIdx ==
nullptr )
150 indexPointer= &startIdx;
152 indexPointer= newIdx;
153 *indexPointer= startIdx;
160template<
typename TChar>
161requires alib::characters::IsCharacter<TChar>
167 if ( newIdx ==
nullptr )
168 indexPointer= &startIdx;
170 indexPointer= newIdx;
171 *indexPointer= startIdx;
178template<
typename TChar>
179requires alib::characters::IsCharacter<TChar>
185 if ( newIdx ==
nullptr )
186 indexPointer= &startIdx;
188 indexPointer= newIdx;
189 *indexPointer= startIdx;
196template<
typename TChar>
197requires alib::characters::IsCharacter<TChar>
203 if ( newIdx ==
nullptr )
204 indexPointer= &startIdx;
206 indexPointer= newIdx;
207 *indexPointer= startIdx;
214template<
typename TChar>
215requires alib::characters::IsCharacter<TChar>
221 if ( newIdx ==
nullptr )
222 indexPointer= &startIdx;
224 indexPointer= newIdx;
225 *indexPointer= startIdx;
232template<
typename TChar>
233requires alib::characters::IsCharacter<TChar>
239 if ( newIdx ==
nullptr )
240 indexPointer= &startIdx;
242 indexPointer= newIdx;
243 *indexPointer= startIdx;
259 const nchar* cs= buffer;
262 #if defined( _WIN32 )
264 int conversionSize= MultiByteToWideChar( CP_UTF8, 0, cs,
int( length ),
nullptr, 0 );
268 if ( conversionSize == 0 ) {
270 int error= GetLastError();
272 NString128 msg(
"AString: Conversion to wide character string failed (Error: " );
273 if ( error == ERROR_INSUFFICIENT_BUFFER ) msg._(
"ERROR_INSUFFICIENT_BUFFER." );
274 else if ( error == ERROR_INVALID_FLAGS ) msg._(
"ERROR_INVALID_FLAGS." );
275 else if ( error == ERROR_INVALID_PARAMETER ) msg._(
"ERROR_INVALID_PARAMETER" );
276 else if ( error == ERROR_NO_UNICODE_TRANSLATION ) msg._(
"ERROR_NO_UNICODE_TRANSLATION" );
284 if( conversionSize > length ) {
285 ALIB_ERROR(
"STRINGS",
"MBCS to WCS conversion failed. Conversion length=",
291 return conversionSize;
294 #elif defined (__GLIBCXX__) || defined(_LIBCPP_VERSION) || defined(__APPLE__) || defined(__ANDROID_NDK__)
296 size_t conversionSize= mbsnrtowcs(
nullptr, &cs,
size_t(length), 0,
nullptr );
297 if ( conversionSize ==
size_t(-1) ) {
298 ALIB_WARNING(
"STRINGS",
"MBCS to WCS conversion failed. Illegal MBC sequence. "
299 "Probably UTF-8 is not set in locale" )
304 "MBCS to WCS conversion failed. Conversion length=", conversionSize )
306 return
integer(conversionSize);
310 #pragma message ("Unknown Platform in file: " __FILE__ )
350 const xchar* src= buffer;
351 const xchar* srcEnd= buffer + length;
353#if ALIB_SIZEOF_WCHAR_T == 4
356 while (src < srcEnd) {
357 const char32_t uc =
static_cast<char32_t>( *src++ );
358 if ((uc - 0xd800) >= 2048)
362 && ((uc & 0xfffffc00) == 0xd800)
363 && ((
char32_t(*src++) & 0xfffffc00) == 0xdc00),
364 "STRINGS",
"Error decoding UTF16" )
373 while (src < srcEnd) {
376 || ( uc >= 0xe000 && uc <= 0x10ffff ),
"STRINGS",
377 "Illegal unicode 32 bit codepoint" )
405template<
typename TChar>
406requires alib::characters::IsCharacter<TChar>
409 return std::hash<std::basic_string_view<TChar>>()(
410 std::basic_string_view<TChar>( Buffer(),
size_t(
Length() ) ) );
418template<
typename TChar>
419requires alib::characters::IsCharacter<TChar>
421 std::size_t result= 68460391ul * ( size_t(length) + 1 );
424 auto* end = buffer + length;
425 while( begin != end )
426 result = 199ul * result + std::size_t(
ToUpper<TChar>( *begin++ ) );
437#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.