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.