17template <
class StringTraits = T2StringTraits<TCHAR>>
21 using CharType =
typename StringTraits::CharType;
25 : m_pszString( a_pszString )
29 : m_pszString(
TNULL )
33 : m_pszString( a_rOther.m_pszString )
48 m_pszString = a_pszString;
56 m_pszString += a_iSize;
61 m_pszString -= a_iSize;
67 return StringTraits::Compare( m_pszString, a_otherString.m_pszString ) == 0;
84template <TSIZE Size,
typename TStringTraits = T2StringTraits<TCHAR>>
92 using CharType =
typename StringTraits::CharType;
98 m_szBuffer[ 0 ] = CharTraits::NullChar;
122 TINT uiStringPos = 0;
125 if ( a_uiSize == -1 )
128 while ( uiPos < Size && uiStringPos < a_uiSize && a_szString[ uiStringPos ] !=
'\0' )
130 if ( a_szString[ uiStringPos ] !=
'\n' )
133 if ( !bTextStarted && a_bTrimStartSpaces )
135 bTextStarted = !CharTraits::IsSpace( (
UCharType)a_szString[ uiStringPos ] );
144 m_szBuffer[ uiPos++ ] = a_szString[ uiStringPos++ ];
154 if ( a_bTrimEndSpaces )
156 while ( uiPos >= 0 && m_szBuffer[ uiPos ] !=
'\n' && CharTraits::IsSpace( (
UCharType)m_szBuffer[ uiPos ] ) )
162 m_szBuffer[ uiPos + 1 ] = CharTraits::NullChar;
164 if ( a_pStringLength )
166 *a_pStringLength = uiPos + 1;
169 return uiStringPos + 1;
176 va_start( args, a_szFormat );
180 m_szBuffer[ Size - 1 ] = CharTraits::NullChar;
186 m_szBuffer[ Size - 1 ] = CharTraits::NullChar;
196 m_szBuffer[ 0 ] = CharTraits::NullChar;
217 return &m_szBuffer[ a_uiIndex ];
223 return &m_szBuffer[ a_uiIndex ];
228 return *
Get( a_uiIndex );
233 return *
Get( a_uiIndex );
262template <
class StringTraits = T2StringTraits<TCHAR>>
272 SetBuffer( a_pchBuffer, a_uiBufferSize );
282 m_Buffer = a_pchBuffer;
283 m_BufferPos = a_pchBuffer;
286 m_uiBufferSize = ( a_uiBufferSize == -1 ) ? a_pchBuffer.Length() : a_uiBufferSize;
290 m_BufferEnd = m_Buffer + m_uiBufferSize;
295 m_BufferPos = m_Buffer;
300 return m_BufferPos - m_Buffer;
305 m_BufferPos = m_Buffer + a_uiPos;
311 TASSERT( a_uiTokenMaxSize > 1 );
313 TSIZE uiSizeLeft = a_uiTokenMaxSize;
314 CharType* pchCopyCursor = a_pszToken;
322 while ( uiSizeLeft > 1 && cursor < m_BufferEnd )
325 TBOOL bIsEscapeChar = cChar ==
'\\';
326 TBOOL bIsBreakToken = isspace( cChar );
328 if ( !bIsPrevCharEscape && ( cChar ==
'"' || cChar ==
'\'' ) )
330 bIsInQuotes = !bIsInQuotes;
340 else if ( !bIsInQuotes && bIsBreakToken )
350 *( pchCopyCursor++ ) = cChar;
354 bIsPrevCharEscape = bIsEscapeChar;
357 if ( cursor >= m_BufferEnd && !bIsInQuotes )
360 m_BufferLastPeek = cursor;
361 *pchCopyCursor =
'\0';
368 m_BufferPos = m_BufferLastPeek;
375 return m_BufferPos >= m_BufferEnd;
383 TSIZE m_uiBufferSize;
393template <
class StringTraits = T2StringTraits<TCHAR>>
402 return StringTraits::Compare( a, b ) == 0;
407 return StringTraits::Compare( a, b ) > 0;
412 return StringTraits::Compare( a, b ) < 0;
417 return StringTraits::Compare( a, b ) <= 0;
422 return StringTraits::Compare( a, b ) >= 0;
429template <TINT Size,
typename TStringTraits = T2StringTraits<TCHAR>>
442 m_szBuffer[ 0 ] = CharTraits::NullChar;
453 StringTraits::CopySafe( m_szBuffer, a_szString, Size );
454 m_iPosition = StringTraits::Length( a_szString );
461 va_start( args, a_szFormat );
462 m_iPosition = StringTraits::FormatV( m_szBuffer, Size, a_szFormat, args );
465 m_szBuffer[ Size - 1 ] = CharTraits::NullChar;
470 m_iPosition = StringTraits::FormatV( m_szBuffer, Size, a_szFormat, a_Args );
471 m_szBuffer[ Size - 1 ] = CharTraits::NullChar;
476 if ( Size - m_iPosition - 1 <= 0 )
return;
480 va_start( args, a_szFormat );
481 m_iPosition += StringTraits::FormatV( m_szBuffer + m_iPosition, Size - m_iPosition, a_szFormat, args );
487 if ( Size - m_iPosition - 1 <= 0 )
return;
488 m_iPosition += StringTraits::FormatV( m_szBuffer + m_iPosition, Size - m_iPosition, a_szFormat, a_Args );
493 TINT iStringLength = StringTraits::Length( a_szString );
494 if ( Size - m_iPosition - iStringLength - 1 <= 0 )
return;
496 StringTraits::Concat( m_szBuffer + m_iPosition, a_szString, iStringLength );
497 m_iPosition += StringTraits::Length( a_szString );
502 m_szBuffer[ 0 ] = CharTraits::NullChar;
524 return &m_szBuffer[ a_uiIndex ];
530 return &m_szBuffer[ a_uiIndex ];
535 return *
Get( a_uiIndex );
540 return *
Get( a_uiIndex );
#define TOSHI_NAMESPACE_START
#define TOSHI_NAMESPACE_END
T2FormatString< 256, T2StringTraits< TWCHAR > > T2FormatWString256
T2FormatString< 512, T2StringTraits< TCHAR > > T2FormatString512
T2FormatString< 512, T2StringTraits< TWCHAR > > T2FormatWString512
T2FormatString< 1024, T2StringTraits< TCHAR > > T2FormatString1024
T2StringParser< T2StringTraits< TWCHAR > > T2String16Parser
T2StringComparator< T2StringTraits< TCHAR > > T2String8Comparator
T2StringParser< T2StringTraits< TCHAR > > T2String8Parser
T2StringComparator< T2StringTraits< TWCHAR > > T2String16Comparator
T2FormatString< 4096, T2StringTraits< TCHAR > > T2FormatString4096
T2FormatString< 2048, T2StringTraits< TWCHAR > > T2FormatWString2048
T2StringViewBase< T2StringTraits< TWCHAR > > T2StringView16
T2FormatString< 128, T2StringTraits< TCHAR > > T2FormatString128
T2FormatString< 128, T2StringTraits< TWCHAR > > T2FormatWString128
T2FormatString< 256, T2StringTraits< TCHAR > > T2FormatString256
T2FormatString< 1024, T2StringTraits< TWCHAR > > T2FormatWString1024
T2FormatString< 32, T2StringTraits< TCHAR > > T2FormatString32
T2FormatString< 2048, T2StringTraits< TCHAR > > T2FormatString2048
T2FormatString< 32, T2StringTraits< TWCHAR > > T2FormatWString32
T2FormatString< 64, T2StringTraits< TWCHAR > > T2FormatWString64
T2FormatString< 4096, T2StringTraits< TWCHAR > > T2FormatWString4096
T2StringViewBase< T2StringTraits< TCHAR > > T2StringView
T2FormatString< 64, T2StringTraits< TCHAR > > T2FormatString64
TFORCEINLINE constexpr const CharType * Get() const
TFORCEINLINE TSIZE Length() const
TFORCEINLINE TBOOL IsEqualNoCase(T2StringViewBase a_otherString)
TFORCEINLINE constexpr T2StringViewBase & operator=(const CharType *a_pszString)
TFORCEINLINE constexpr T2StringViewBase operator-=(int a_iSize)
TFORCEINLINE constexpr T2StringViewBase operator+=(int a_iSize)
TFORCEINLINE constexpr T2StringViewBase operator+(int a_iSize) const
TFORCEINLINE TBOOL operator==(T2StringViewBase a_otherString)
TFORCEINLINE const CharType * SkipSpaces()
TFORCEINLINE TBOOL IsEqual(T2StringViewBase a_otherString)
TFORCEINLINE const CharType * FindString(const CharType *a_pszSubstr)
TFORCEINLINE constexpr T2StringViewBase(const CharType *a_pszString)
TFORCEINLINE const CharType * FindChar(CharType a_cCharacter)
typename StringTraits::CharType CharType
TFORCEINLINE constexpr T2StringViewBase()
TFORCEINLINE constexpr T2StringViewBase operator-(int a_iSize) const
TFORCEINLINE TBOOL IsLowerCase() const
TFORCEINLINE TBOOL IsUpperCase() const
TFORCEINLINE constexpr T2StringViewBase(const T2StringViewBase &a_rOther)
void Format(const CharType *a_szFormat,...)
constexpr const CharType & operator[](TUINT a_uiIndex) const
void Copy(const CharType *a_szString)
TStringTraits StringTraits
constexpr CharType * Get()
void Append(const CharType *a_szString)
constexpr CharType & operator[](TUINT a_uiIndex)
typename StringTraits::CharTraits CharTraits
T2FormatString(const CharType *a_szString)
constexpr const CharType * Get() const
constexpr const CharType * Get(TUINT a_uiIndex) const
constexpr T2FormatString()
TINT ParseLine(const CharType *a_szString, TINT a_uiSize=-1, TINT *a_pStringLength=nullptr, TBOOL a_bTrimStartSpaces=true, TBOOL a_bTrimEndSpaces=true)
Parses a line from specified buffer and saves it.
void FormatV(const CharType *a_szFormat, va_list a_Args)
typename StringTraits::CharType CharType
constexpr CharType * Get(TUINT a_uiIndex)
typename StringTraits::UCharType UCharType
typename T2StringViewBase< StringTraits > ConstString
typename StringTraits::CharType CharType
TBOOL PeekToken(CharType *a_pszToken, TSIZE a_uiTokenMaxSize)
void SetBuffer(ConstString a_pchBuffer, TSIZE a_uiBufferSize=-1)
TBOOL ReadToken(CharType *a_pszToken, TSIZE a_uiTokenMaxSize)
T2StringParser(ConstString a_pchBuffer, TSIZE a_uiBufferSize=-1)
static TBOOL IsEqual(const CharType *a, const CharType *b)
static TBOOL IsGreater(const CharType *a, const CharType *b)
static TBOOL IsLessOrEqual(const CharType *a, const CharType *b)
static TBOOL IsLess(const CharType *a, const CharType *b)
static TBOOL IsGreaterOrEqual(const CharType *a, const CharType *b)
typename StringTraits::CharType CharType
void Copy(const CharType *a_szString)
T2StringBuffer(const CharType *a_szString)
constexpr const CharType * Get() const
void Append(const CharType *a_szString)
void AppendFormat(const CharType *a_szFormat,...)
void Format(const CharType *a_szFormat,...)
TStringTraits StringTraits
constexpr const CharType & operator[](TUINT a_uiIndex) const
constexpr CharType & operator[](TUINT a_uiIndex)
constexpr T2StringBuffer()
void FormatV(const CharType *a_szFormat, va_list a_Args)
constexpr const CharType * Get(TUINT a_uiIndex) const
typename StringTraits::CharTraits CharTraits
void AppendFormatV(const CharType *a_szFormat, va_list a_Args)
constexpr CharType * Get()
T2StringBuffer & operator+=(const CharType *a_szString)
typename StringTraits::CharType CharType
constexpr CharType * Get(TUINT a_uiIndex)
static CharType * Concat(CharType *dst, const CharType *src, TSIZE size=-1)
static TSIZE Length(const CharType *str)
static TINT FormatV(CharType *a_pcString, TINT size, const CharType *a_pcFormat, va_list args)
static CharType * CopySafe(CharType *dst, const CharType *src, TSIZE size)