20 #ifndef INCLUDED_RTL_USTRING_HXX
21 #define INCLUDED_RTL_USTRING_HXX
36 #ifdef RTL_FAST_STRING
45 #ifdef RTL_STRING_UNITTEST
46 #define rtl rtlunittest
52 #ifdef RTL_STRING_UNITTEST
181 template<
typename T >
190 #ifdef RTL_STRING_UNITTEST
191 rtl_string_unittest_const_literal =
true;
195 #ifdef RTL_STRING_UNITTEST
200 template<
typename T >
205 rtl_string_unittest_invalid_conversion =
true;
211 template<
typename T >
212 OUString(
const T&,
typename libreoffice_internal::ExceptCharArrayDetector< T >::Type = libreoffice_internal::Dummy() )
216 rtl_string_unittest_invalid_conversion =
true;
241 throw std::bad_alloc();
262 sal_uInt32
const * codePoints, sal_Int32 codePointCount):
267 throw std::bad_alloc();
271 #ifdef RTL_FAST_STRING
276 template<
typename T1,
typename T2 >
277 OUString(
const OUStringConcat< T1, T2 >& c )
279 const sal_Int32 l = c.length();
284 pData->length = end - pData->buffer;
311 {
return *
reinterpret_cast< OUString const *
>( ppHandle ); }
336 template<
typename T >
358 #ifdef RTL_FAST_STRING
363 template<
typename T1,
typename T2 >
364 OUString& operator+=(
const OUStringConcat< T1, T2 >& c )
366 const int l = c.length();
370 sal_Unicode* end = c.addData( pData->buffer + pData->length );
372 pData->length = end - pData->buffer;
406 return pData->length == 0;
429 assert(index >= 0 && static_cast<sal_uInt32>(index) < static_cast<sal_uInt32>(getLength()));
430 return getStr()[index];
448 str.pData->buffer, str.pData->length );
469 str.pData->buffer, str.pData->length, maxLength );
487 str.pData->buffer, str.pData->length );
495 template<
typename T >
516 if ( pData->length != str.pData->length )
518 if ( pData == str.pData )
521 str.pData->buffer, str.pData->length ) == 0;
540 if ( pData->length != str.pData->length )
542 if ( pData == str.pData )
545 str.pData->buffer, str.pData->length ) == 0;
566 str.pData->buffer, str.pData->length );
575 template<
typename T >
603 str.pData->buffer, str.pData->length, str.pData->length ) == 0;
611 template<
typename T >
640 str.pData->buffer, str.pData->length,
641 str.pData->length ) == 0;
649 template<
typename T >
701 "replace s1.compareToAscii(s2, strlen(s2)) == 0 with s1.startsWith(s2)")
702 sal_Int32 compareToAscii( const
sal_Char * asciiStr, sal_Int32 maxLength )
const
705 asciiStr, maxLength );
730 asciiStr, asciiStrLength );
773 if ( pData->length != asciiStrLength )
777 pData->buffer, asciiStr, asciiStrLength );
848 if ( pData->length != asciiStrLength )
878 asciiStr, asciiStrLength ) == 0;
885 #if SAL_TYPES_SIZEOFLONG == 8
916 asciiStr, asciiStrLength ) == 0;
923 #if SAL_TYPES_SIZEOFLONG == 8
943 bool b = match(str, 0);
944 if (b && rest != 0) {
955 template<
typename T >
957 T & literal,
OUString * rest = 0)
const
963 if (b && rest != 0) {
992 bool b = matchIgnoreAsciiCase(str, 0);
993 if (b && rest != 0) {
1004 template<
typename T >
1014 if (b && rest != 0) {
1036 && match(str, getLength() - str.
getLength());
1037 if (b && rest != 0) {
1038 *rest = copy(0, getLength() - str.
getLength());
1048 template<
typename T >
1057 if (b && rest != 0) {
1080 return asciiStrLength <= pData->length
1082 pData->buffer + pData->length - asciiStrLength, asciiStr,
1109 && matchIgnoreAsciiCase(str, getLength() - str.
getLength());
1110 if (b && rest != 0) {
1111 *rest = copy(0, getLength() - str.
getLength());
1121 template<
typename T >
1132 if (b && rest != 0) {
1152 char const * asciiStr, sal_Int32 asciiStrLength)
const
1154 return asciiStrLength <= pData->length
1156 pData->buffer + pData->length - asciiStrLength,
1157 asciiStrLength, asciiStr, asciiStrLength)
1162 {
return rStr1.
equals(rStr2); }
1164 {
return rStr1.
compareTo( pStr2 ) == 0; }
1176 {
return rStr1.
compareTo( rStr2 ) < 0; }
1178 {
return rStr1.
compareTo( rStr2 ) > 0; }
1180 {
return rStr1.
compareTo( rStr2 ) <= 0; }
1182 {
return rStr1.
compareTo( rStr2 ) >= 0; }
1191 template<
typename T >
1204 template<
typename T >
1217 template<
typename T >
1230 template<
typename T >
1265 return (ret < 0 ? ret : ret+fromIndex);
1317 str.pData->buffer, str.pData->length );
1318 return (ret < 0 ? ret : ret+fromIndex);
1326 template<
typename T >
1331 pData->buffer + fromIndex, pData->length - fromIndex, literal,
1333 return ret < 0 ? ret : ret + fromIndex;
1360 char const * str, sal_Int32 len, sal_Int32 fromIndex = 0)
const
1363 pData->buffer + fromIndex, pData->length - fromIndex, str, len);
1364 return ret < 0 ? ret : ret + fromIndex;
1371 #if SAL_TYPES_SIZEOFLONG == 8
1393 str.pData->buffer, str.pData->length );
1416 str.pData->buffer, str.pData->length );
1424 template<
typename T >
1454 pData->buffer, pData->length, str, len);
1469 rtl_uString *pNew = 0;
1488 rtl_uString *pNew = 0;
1503 rtl_uString* pNew = 0;
1508 #ifndef RTL_FAST_STRING
1511 return rStr1.
concat( rStr2 );
1530 rtl_uString* pNew = 0;
1550 rtl_uString* pNew = 0;
1576 rtl_uString * s = 0;
1579 &s, pData, from.pData, to.pData, index == 0 ? &i : index);
1601 template<
typename T >
1603 sal_Int32 * index = 0)
const
1605 rtl_uString * s = 0;
1631 template<
typename T1,
typename T2 >
1635 rtl_uString * s = 0;
1663 rtl_uString * s = 0;
1681 template<
typename T >
1684 rtl_uString * s = 0;
1703 template<
typename T1,
typename T2 >
1707 rtl_uString * s = 0;
1728 rtl_uString* pNew = 0;
1745 rtl_uString* pNew = 0;
1763 rtl_uString* pNew = 0;
1794 rtl_uString * pNew = 0;
1814 return getToken(count, separator, n);
1838 return pData->buffer[0];
1949 rtl_uString * pNew = 0;
1952 throw std::bad_alloc();
1985 sal_uInt32 *pInfo = NULL )
1987 rtl_uString * pNew = 0;
1989 convertFlags, pInfo );
1991 throw std::bad_alloc();
2021 sal_uInt32 nFlags)
const
2024 pData->length, nEncoding, nFlags);
2079 sal_Int32 * indexUtf16, sal_Int32 incrementCodePoints = 1)
const
2082 pData, indexUtf16, incrementCodePoints);
2143 rtl_uString* pNewData = 0;
2151 return number( static_cast< unsigned long long >( i ), radix );
2157 return number( static_cast< long long >( i ), radix );
2163 return number( static_cast< unsigned long long >( i ), radix );
2170 rtl_uString* pNewData = 0;
2179 rtl_uString* pNewData = 0;
2196 rtl_uString* pNewData = 0;
2213 rtl_uString* pNewData = 0;
2248 rtl_uString* pNewData = 0;
2277 return number( i, radix );
2292 return number( ll, radix );
2340 rtl_uString* pNew = 0;
2348 #ifdef RTL_FAST_STRING
2360 OUStringLiteral(
const char (&str)[ N ] ) : size( N - 1 ), data( str ) { assert( strlen( str ) == N - 1 ); }
2369 struct ToStringHelper< OUString >
2371 static int length(
const OUString& s ) {
return s.getLength(); }
2372 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUString& s ) {
return addDataHelper( buffer, s.getStr(), s.getLength()); }
2373 static const bool allowOStringConcat =
false;
2374 static const bool allowOUStringConcat =
true;
2381 struct ToStringHelper< OUStringLiteral >
2383 static int length(
const OUStringLiteral& str ) {
return str.size; }
2384 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUStringLiteral& str ) {
return addDataLiteral( buffer, str.data, str.size ); }
2385 static const bool allowOStringConcat =
false;
2386 static const bool allowOUStringConcat =
true;
2392 template<
typename charT,
typename traits,
typename T1,
typename T2 >
2393 inline std::basic_ostream<charT, traits> &
operator <<(
2394 std::basic_ostream<charT, traits> & stream,
const OUStringConcat< T1, T2 >& concat)
2396 return stream << OUString( concat );
2401 typedef OUString OUStringLiteral;
2422 {
return (
size_t)rString.
hashCode(); }
2485 template<
typename charT,
typename traits >
2487 std::basic_ostream<charT, traits> & stream,
OUString const &
string)
2497 #ifdef RTL_STRING_UNITTEST
2500 typedef rtlunittest::OUString OUString;
2509 using ::rtl::OUString;
2510 using ::rtl::OUStringHash;
2513 using ::rtl::OUStringLiteral;