20 #ifndef _RTL_USTRING_HXX_
21 #define _RTL_USTRING_HXX_
36 #ifdef RTL_FAST_STRING
40 #if defined EXCEPTIONS_OFF
51 #ifdef RTL_STRING_UNITTEST
52 #define rtl rtlunittest
58 #ifdef RTL_STRING_UNITTEST
95 class DO_NOT_ACQUIRE{};
196 #ifdef HAVE_SFINAE_ANONYMOUS_BROKEN
200 OUString(
const char (&literal)[ N ] )
204 assert( strlen( literal ) == N - 1 );
207 #ifdef RTL_STRING_UNITTEST
208 rtl_string_unittest_const_literal =
true;
217 OUString(
char (&value)[ N ] )
218 #ifndef RTL_STRING_UNITTEST
225 rtl_string_unittest_invalid_conversion =
true;
228 #else // HAVE_SFINAE_ANONYMOUS_BROKEN
229 template<
typename T >
235 #ifdef RTL_STRING_UNITTEST
236 rtl_string_unittest_const_literal =
true;
240 #endif // HAVE_SFINAE_ANONYMOUS_BROKEN
243 #ifdef RTL_STRING_UNITTEST
248 template<
typename T >
253 rtl_string_unittest_invalid_conversion =
true;
259 template<
typename T >
260 OUString(
const T&,
typename internal::ExceptCharArrayDetector< T >::Type = internal::Dummy() )
264 rtl_string_unittest_invalid_conversion =
true;
289 #if defined EXCEPTIONS_OFF
292 throw std::bad_alloc();
314 sal_uInt32
const * codePoints, sal_Int32 codePointCount):
319 #if defined EXCEPTIONS_OFF
322 throw std::bad_alloc();
327 #ifdef RTL_FAST_STRING
328 template<
typename T1,
typename T2 >
329 OUString(
const OUStringConcat< T1, T2 >& c )
331 const sal_Int32 l = c.length();
332 rtl_uString* buffer = NULL;
337 buffer->length = end - buffer->buffer;
363 static inline OUString const & unacquired( rtl_uString *
const * ppHandle )
364 {
return *
reinterpret_cast< OUString const *
>( ppHandle ); }
389 template<
typename T >
428 return pData->length == 0;
449 sal_Unicode operator [](sal_Int32 index)
const {
return getStr()[index]; }
466 str.pData->buffer, str.pData->length );
487 str.pData->buffer, str.pData->length, maxLength );
505 str.pData->buffer, str.pData->length );
521 if ( pData->length != str.pData->length )
523 if ( pData == str.pData )
526 str.pData->buffer, str.pData->length ) == 0;
545 if ( pData->length != str.pData->length )
547 if ( pData == str.pData )
550 str.pData->buffer, str.pData->length ) == 0;
571 str.pData->buffer, str.pData->length );
580 template<
typename T >
608 str.pData->buffer, str.pData->length, str.pData->length ) == 0;
616 template<
typename T >
645 str.pData->buffer, str.pData->length,
646 str.pData->length ) == 0;
654 template<
typename T >
703 asciiStr, maxLength );
725 sal_Int32 reverseCompareToAsciiL(
const sal_Char * asciiStr, sal_Int32 asciiStrLength )
const SAL_THROW(())
728 asciiStr, asciiStrLength );
771 if ( pData->length != asciiStrLength )
775 pData->buffer, asciiStr, asciiStrLength );
846 if ( pData->length != asciiStrLength )
876 asciiStr, asciiStrLength ) == 0;
883 #if SAL_TYPES_SIZEOFLONG == 8
914 asciiStr, asciiStrLength ) == 0;
921 #if SAL_TYPES_SIZEOFLONG == 8
937 return match(str, 0);
945 template<
typename T >
969 return matchIgnoreAsciiCase(str, 0);
977 template<
typename T >
1000 && match(str, getLength() - str.
getLength());
1008 template<
typename T >
1029 inline bool endsWithAsciiL(
char const * asciiStr, sal_Int32 asciiStrLength)
1032 return asciiStrLength <= pData->length
1034 pData->buffer + pData->length - asciiStrLength, asciiStr,
1053 return str.getLength() <= getLength()
1054 && matchIgnoreAsciiCase(str, getLength() - str.getLength());
1062 template<
typename T >
1084 inline bool endsWithIgnoreAsciiCaseAsciiL(
1085 char const * asciiStr, sal_Int32 asciiStrLength)
const
1087 return asciiStrLength <= pData->length
1089 pData->buffer + pData->length - asciiStrLength,
1090 asciiStrLength, asciiStr, asciiStrLength)
1095 {
return rStr1.equals(rStr2); }
1097 {
return rStr1.compareTo( pStr2 ) == 0; }
1109 {
return rStr1.compareTo( rStr2 ) < 0; }
1111 {
return rStr1.compareTo( rStr2 ) > 0; }
1113 {
return rStr1.compareTo( rStr2 ) <= 0; }
1115 {
return rStr1.compareTo( rStr2 ) >= 0; }
1124 template<
typename T >
1137 template<
typename T >
1150 template<
typename T >
1163 template<
typename T >
1198 return (ret < 0 ? ret : ret+fromIndex);
1250 str.pData->buffer, str.pData->length );
1251 return (ret < 0 ? ret : ret+fromIndex);
1259 template<
typename T >
1264 pData->buffer + fromIndex, pData->length - fromIndex, literal,
1266 return ret < 0 ? ret : ret + fromIndex;
1292 sal_Int32 indexOfAsciiL(
1293 char const * str, sal_Int32 len, sal_Int32 fromIndex = 0) const
1297 pData->buffer + fromIndex, pData->length - fromIndex, str, len);
1298 return ret < 0 ? ret : ret + fromIndex;
1305 #if SAL_TYPES_SIZEOFLONG == 8
1327 str.pData->buffer, str.pData->length );
1350 str.pData->buffer, str.pData->length );
1358 template<
typename T >
1385 sal_Int32 lastIndexOfAsciiL(
char const * str, sal_Int32 len)
const
1389 pData->buffer, pData->length, str, len);
1404 rtl_uString *pNew = 0;
1406 return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
1423 rtl_uString *pNew = 0;
1425 return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
1438 rtl_uString* pNew = 0;
1440 return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
1443 #ifndef RTL_FAST_STRING
1446 return rStr1.concat( rStr2 );
1465 rtl_uString* pNew = 0;
1467 return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
1485 rtl_uString* pNew = 0;
1487 return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
1511 rtl_uString * s = 0;
1514 &s, pData, from.pData, to.pData, index == 0 ? &i : index);
1536 template<
typename T >
1538 sal_Int32 * index = 0)
const
1540 rtl_uString * s = 0;
1566 template<
typename T1,
typename T2 >
1568 replaceFirst( T1& from, T2& to, sal_Int32 * index = 0)
const
1570 rtl_uString * s = 0;
1596 rtl_uString * s = 0;
1614 template<
typename T >
1617 rtl_uString * s = 0;
1636 template<
typename T1,
typename T2 >
1638 replaceAll( T1& from, T2& to )
const
1640 rtl_uString * s = 0;
1661 rtl_uString* pNew = 0;
1663 return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
1678 rtl_uString* pNew = 0;
1680 return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
1696 rtl_uString* pNew = 0;
1698 return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
1727 rtl_uString * pNew = 0;
1729 return OUString( pNew, (DO_NOT_ACQUIRE *)0 );
1747 return getToken(count, separator, n);
1771 return pData->buffer[0];
1783 sal_Int32 toInt32( sal_Int16 radix = 10 ) const
SAL_THROW(())
1797 sal_Int64 toInt64( sal_Int16 radix = 10 ) const
SAL_THROW(())
1846 rtl_uString * pNew = 0;
1849 #if defined EXCEPTIONS_OFF
1852 throw std::bad_alloc();
1855 return OUString( pNew, (DO_NOT_ACQUIRE *)0 );
1886 sal_uInt32 *pInfo = NULL )
1888 rtl_uString * pNew = 0;
1890 convertFlags, pInfo );
1892 #if defined EXCEPTIONS_OFF
1895 throw std::bad_alloc();
1898 return OUString( pNew, (DO_NOT_ACQUIRE *)0 );
1926 sal_uInt32 nFlags)
const
1929 pData->length, nEncoding, nFlags);
1983 inline sal_uInt32 iterateCodePoints(
1984 sal_Int32 * indexUtf16, sal_Int32 incrementCodePoints = 1)
const
1987 pData, indexUtf16, incrementCodePoints);
2003 rtl_uString* pNewData = 0;
2005 return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
2031 rtl_uString* pNewData = 0;
2033 return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
2048 rtl_uString* pNewData = 0;
2050 return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
2064 rtl_uString* pNewData = 0;
2066 return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
2080 rtl_uString* pNewData = 0;
2082 return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
2102 rtl_uString* pNew = 0;
2104 return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
2107 template<
typename T1,
typename T2 >
2108 friend struct OUStringConcat;
2113 #ifdef RTL_FAST_STRING
2125 OUStringLiteral(
const char (&str)[ N ] ) : size( N - 1 ), data( str ) { assert( strlen( str ) == N - 1 ); }
2131 struct ToStringHelper< OUString >
2133 static int length(
const OUString& s ) {
return s.getLength(); }
2134 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUString& s ) {
return addDataHelper( buffer, s.getStr(), s.getLength()); }
2135 static const bool allowOStringConcat =
false;
2136 static const bool allowOUStringConcat =
true;
2144 static const bool allowOStringConcat =
false;
2145 static const bool allowOUStringConcat =
true;
2148 template<
typename charT,
typename traits,
typename T1,
typename T2 >
2149 inline std::basic_ostream<charT, traits> &
operator <<(
2150 std::basic_ostream<charT, traits> & stream,
const OUStringConcat< T1, T2 >& concat)
2152 return stream << OUString( concat );
2161 #ifdef RTL_STRING_UNITTEST
2164 typedef rtlunittest::OUString OUString;
2188 {
return (
size_t)rString.
hashCode(); }
2245 #ifdef RTL_STRING_UNITTEST
2246 #define rtl rtlunittest
2250 #ifdef RTL_STRING_UNITTEST
2262 template<
typename charT,
typename traits >
2264 std::basic_ostream<charT, traits> & stream,
OUString const &
string)
2279 using ::rtl::OUString;
2280 using ::rtl::OUStringHash;