20 #ifndef _RTL_STRING_HXX_
21 #define _RTL_STRING_HXX_
34 #ifdef RTL_FAST_STRING
40 #if !defined EXCEPTIONS_OFF
49 #ifdef RTL_STRING_UNITTEST
50 #define rtl rtlunittest
56 #ifdef RTL_STRING_UNITTEST
59 #define RTL_STRING_CONST_FUNCTION rtl_string_unittest_const_literal_function = true;
61 #define RTL_STRING_CONST_FUNCTION
168 template<
typename T >
175 template<
typename T >
192 template<
typename T >
201 #ifdef RTL_STRING_UNITTEST
202 rtl_string_unittest_const_literal =
true;
241 #if defined EXCEPTIONS_OFF
244 throw std::bad_alloc();
249 #ifdef RTL_FAST_STRING
254 template<
typename T1,
typename T2 >
255 OString(
const OStringConcat< T1, T2 >& c )
257 const sal_Int32 l = c.length();
261 char* end = c.addData( pData->buffer );
262 pData->length = end - pData->buffer;
292 template<
typename T >
315 #ifdef RTL_FAST_STRING
320 template<
typename T1,
typename T2 >
321 OString& operator+=(
const OStringConcat< T1, T2 >& c )
323 const int l = c.length();
327 char* end = c.addData( pData->buffer + pData->length );
329 pData->length = end - pData->buffer;
353 return pData->length == 0;
379 assert(index >= 0 && index <= getLength());
384 return getStr()[index];
402 str.pData->buffer, str.pData->length );
421 rObj.pData->buffer, rObj.pData->length, maxLength );
439 str.pData->buffer, str.pData->length );
455 if ( pData->length != str.pData->length )
457 if ( pData == str.pData )
460 str.pData->buffer, str.pData->length ) == 0;
480 if ( pData->length != length )
484 value, length ) == 0;
503 if ( pData->length != str.pData->length )
505 if ( pData == str.pData )
508 str.pData->buffer, str.pData->length ) == 0;
532 template<
typename T >
538 template<
typename T >
549 template<
typename T >
581 if ( pData->length != asciiStrLength )
585 asciiStr, asciiStrLength ) == 0;
606 str.pData->buffer, str.pData->length, str.pData->length ) == 0;
614 template<
typename T >
620 pData->buffer + fromIndex, pData->length - fromIndex,
641 char const * str, sal_Int32 strLength, sal_Int32 fromIndex = 0)
645 pData->buffer + fromIndex, pData->length - fromIndex,
646 str, strLength, strLength) == 0;
653 #if SAL_TYPES_SIZEOFLONG == 8
678 str.pData->buffer, str.pData->length,
679 str.pData->length ) == 0;
687 template<
typename T >
707 return match(str, 0);
715 template<
typename T >
719 return match(literal, 0);
734 && match(str, getLength() - str.
getLength());
742 template<
typename T >
764 bool endsWithL(
char const * str, sal_Int32 strLength)
const {
765 return strLength <= getLength()
766 && matchL(str, strLength, getLength() - strLength);
770 {
return rStr1.equals(rStr2); }
774 {
return rStr1.compareTo( rStr2 ) < 0; }
776 {
return rStr1.compareTo( rStr2 ) > 0; }
778 {
return rStr1.compareTo( rStr2 ) <= 0; }
780 {
return rStr1.compareTo( rStr2 ) >= 0; }
782 template<
typename T >
785 return rStr1.compareTo( value ) == 0;
788 template<
typename T >
791 return rStr1.compareTo( value ) == 0;
794 template<
typename T >
797 return rStr2.compareTo( value ) == 0;
800 template<
typename T >
803 return rStr2.compareTo( value ) == 0;
811 template<
typename T >
826 template<
typename T >
836 template<
typename T >
842 template<
typename T >
848 template<
typename T >
854 template<
typename T >
865 template<
typename T >
868 return !( rStr == literal );
876 template<
typename T >
879 return !( literal == rStr );
910 return (ret < 0 ? ret : ret+fromIndex);
962 str.pData->buffer, str.pData->length );
963 return (ret < 0 ? ret : ret+fromIndex);
971 template<
typename T >
978 return n < 0 ? n : n + fromIndex;
999 sal_Int32 indexOfL(
char const * str, sal_Int32 len, sal_Int32 fromIndex = 0)
1003 pData->buffer + fromIndex, pData->length - fromIndex, str, len);
1004 return n < 0 ? n : n + fromIndex;
1011 #if SAL_TYPES_SIZEOFLONG == 8
1033 str.pData->buffer, str.pData->length );
1056 str.pData->buffer, str.pData->length );
1071 rtl_String *pNew = 0;
1073 return OString( pNew, (DO_NOT_ACQUIRE*)0 );
1090 rtl_String *pNew = 0;
1092 return OString( pNew, (DO_NOT_ACQUIRE*)0 );
1105 rtl_String* pNew = 0;
1107 return OString( pNew, (DO_NOT_ACQUIRE*)0 );
1110 #ifndef RTL_FAST_STRING
1113 return str1.concat( str2 );
1132 rtl_String* pNew = 0;
1134 return OString( pNew, (DO_NOT_ACQUIRE*)0 );
1152 rtl_String* pNew = 0;
1154 return OString( pNew, (DO_NOT_ACQUIRE*)0 );
1176 OString const & from,
OString const & to, sal_Int32 * index = 0)
const
1181 &s, pData, from.pData->buffer, from.pData->length,
1182 to.pData->buffer, to.pData->length, index == 0 ? &i : index);
1202 &s, pData, from.pData->buffer, from.pData->length,
1203 to.pData->buffer, to.pData->length);
1219 rtl_String* pNew = 0;
1221 return OString( pNew, (DO_NOT_ACQUIRE*)0 );
1236 rtl_String* pNew = 0;
1238 return OString( pNew, (DO_NOT_ACQUIRE*)0 );
1254 rtl_String* pNew = 0;
1256 return OString( pNew, (DO_NOT_ACQUIRE*)0 );
1285 rtl_String * pNew = 0;
1287 return OString( pNew, (DO_NOT_ACQUIRE *)0 );
1305 return getToken(count, separator, n);
1329 return pData->buffer[0];
1342 sal_Int32 toInt32( sal_Int16 radix = 10 ) const
SAL_THROW(())
1357 sal_Int64 toInt64( sal_Int16 radix = 10 ) const
SAL_THROW(())
1374 sal_uInt64 toUInt64( sal_Int16 radix = 10 ) const
SAL_THROW(())
1415 static OString number(
int i, sal_Int16 radix = 10 )
1417 return number( static_cast< long long >( i ), radix );
1421 static OString number(
unsigned int i, sal_Int16 radix = 10 )
1423 return number( static_cast< unsigned long long >( i ), radix );
1427 static OString number(
long i, sal_Int16 radix = 10 )
1429 return number( static_cast< long long >( i ), radix );
1433 static OString number(
unsigned long i, sal_Int16 radix = 10 )
1435 return number( static_cast< unsigned long long >( i ), radix );
1439 static OString number(
long long ll, sal_Int16 radix = 10 )
1442 rtl_String* pNewData = 0;
1444 return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
1448 static OString number(
unsigned long long ll, sal_Int16 radix = 10 )
1451 rtl_String* pNewData = 0;
1453 return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
1468 rtl_String* pNewData = 0;
1470 return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
1485 rtl_String* pNewData = 0;
1487 return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
1520 rtl_String* pNewData = 0;
1522 return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
1549 return number( i, radix );
1564 return number( ll, radix );
1599 #ifdef RTL_FAST_STRING
1611 OStringLiteral(
const char (&str)[ N ] ) : size( N - 1 ), data( str ) { assert( strlen( str ) == N - 1 ); }
1620 struct ToStringHelper< OString >
1622 static int length(
const OString& s ) {
return s.getLength(); }
1623 static char* addData(
char* buffer,
const OString& s ) {
return addDataHelper( buffer, s.getStr(), s.getLength()); }
1624 static const bool allowOStringConcat =
true;
1625 static const bool allowOUStringConcat =
false;
1634 static int length(
const OStringLiteral& str ) {
return str.size; }
1635 static char* addData(
char* buffer,
const OStringLiteral& str ) {
return addDataHelper( buffer, str.data, str.size ); }
1636 static const bool allowOStringConcat =
true;
1637 static const bool allowOUStringConcat =
false;
1643 template<
typename charT,
typename traits,
typename T1,
typename T2 >
1644 inline std::basic_ostream<charT, traits> &
operator <<(
1645 std::basic_ostream<charT, traits> & stream,
const OStringConcat< T1, T2 >& concat)
1647 return stream << OString( concat );
1672 {
return (
size_t)rString.
hashCode(); }
1697 template<
typename charT,
typename traits > std::basic_ostream<charT, traits> &
1699 std::basic_ostream<charT, traits> & stream,
OString const &
string)
1701 return stream <<
string.getStr();
1707 #ifdef RTL_STRING_UNITTEST
1710 typedef rtlunittest::OString OString;
1712 #undef RTL_STRING_CONST_FUNCTION
1716 using ::rtl::OString;
1717 using ::rtl::OStringHash;