20 #ifndef INCLUDED_RTL_USTRING_HXX
21 #define INCLUDED_RTL_USTRING_HXX
36 #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
45 #ifdef RTL_STRING_UNITTEST
46 #define rtl rtlunittest
52 #ifdef RTL_STRING_UNITTEST
56 #if defined LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
70 explicit SAL_CONSTEXPR OUStringLiteral(
const char (&str)[ N ] ) : size( N - 1 ), data( str )
83 static_cast<unsigned char>(C) < 0x80,
84 "non-ASCII character in OUStringLiteral1");
215 template<
typename T >
224 #ifdef RTL_STRING_UNITTEST
225 rtl_string_unittest_const_literal =
true;
229 #ifdef RTL_STRING_UNITTEST
234 template<
typename T >
239 rtl_string_unittest_invalid_conversion =
true;
245 template<
typename T >
246 OUString(
const T&,
typename libreoffice_internal::ExceptCharArrayDetector< T >::Type = libreoffice_internal::Dummy() )
250 rtl_string_unittest_invalid_conversion =
true;
254 #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
271 OUString(OUStringLiteral literal): pData(0) {
298 throw std::bad_alloc();
319 sal_uInt32
const * codePoints, sal_Int32 codePointCount):
324 throw std::bad_alloc();
328 #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
333 template<
typename T1,
typename T2 >
334 OUString(
const OUStringConcat< T1, T2 >& c )
336 const sal_Int32 l = c.length();
341 pData->length = end - pData->buffer;
368 {
return *
reinterpret_cast< OUString const *
>( ppHandle ); }
393 template<
typename T >
404 #if defined LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
410 template<
char C>
OUString & operator =(OUStringLiteral1<C>) {
429 #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
434 template<
typename T1,
typename T2 >
435 OUString& operator+=(
const OUStringConcat< T1, T2 >& c )
437 const int l = c.length();
441 sal_Unicode* end = c.addData( pData->buffer + pData->length );
443 pData->length = end - pData->buffer;
477 return pData->length == 0;
500 assert(index >= 0 && static_cast<sal_uInt32>(index) < static_cast<sal_uInt32>(getLength()));
501 return getStr()[index];
519 str.pData->buffer, str.pData->length );
540 str.pData->buffer, str.pData->length, maxLength );
558 str.pData->buffer, str.pData->length );
566 template<
typename T >
587 if ( pData->length != str.pData->length )
589 if ( pData == str.pData )
592 str.pData->buffer, str.pData->length ) == 0;
611 if ( pData->length != str.pData->length )
613 if ( pData == str.pData )
616 str.pData->buffer, str.pData->length ) == 0;
637 str.pData->buffer, str.pData->length );
646 template<
typename T >
674 str.pData->buffer, str.pData->length, str.pData->length ) == 0;
682 template<
typename T >
711 str.pData->buffer, str.pData->length,
712 str.pData->length ) == 0;
720 template<
typename T >
772 "replace s1.compareToAscii(s2, strlen(s2)) == 0 with s1.startsWith(s2)")
773 sal_Int32 compareToAscii( const
sal_Char * asciiStr, sal_Int32 maxLength )
const
776 asciiStr, maxLength );
801 asciiStr, asciiStrLength );
844 if ( pData->length != asciiStrLength )
848 pData->buffer, asciiStr, asciiStrLength );
919 if ( pData->length != asciiStrLength )
949 asciiStr, asciiStrLength ) == 0;
956 #if SAL_TYPES_SIZEOFLONG == 8
987 asciiStr, asciiStrLength ) == 0;
994 #if SAL_TYPES_SIZEOFLONG == 8
1014 bool b = match(str, 0);
1015 if (b && rest != 0) {
1026 template<
typename T >
1028 T & literal,
OUString * rest = 0)
const
1034 if (b && rest != 0) {
1063 bool b = matchIgnoreAsciiCase(str, 0);
1064 if (b && rest != 0) {
1075 template<
typename T >
1085 if (b && rest != 0) {
1107 && match(str, getLength() - str.
getLength());
1108 if (b && rest != 0) {
1109 *rest = copy(0, getLength() - str.
getLength());
1119 template<
typename T >
1128 if (b && rest != 0) {
1151 return asciiStrLength <= pData->length
1153 pData->buffer + pData->length - asciiStrLength, asciiStr,
1180 && matchIgnoreAsciiCase(str, getLength() - str.
getLength());
1181 if (b && rest != 0) {
1182 *rest = copy(0, getLength() - str.
getLength());
1192 template<
typename T >
1203 if (b && rest != 0) {
1223 char const * asciiStr, sal_Int32 asciiStrLength)
const
1225 return asciiStrLength <= pData->length
1227 pData->buffer + pData->length - asciiStrLength,
1228 asciiStrLength, asciiStr, asciiStrLength)
1233 {
return rStr1.
equals(rStr2); }
1235 {
return rStr1.
compareTo( pStr2 ) == 0; }
1247 {
return rStr1.
compareTo( rStr2 ) < 0; }
1249 {
return rStr1.
compareTo( rStr2 ) > 0; }
1251 {
return rStr1.
compareTo( rStr2 ) <= 0; }
1253 {
return rStr1.
compareTo( rStr2 ) >= 0; }
1262 template<
typename T >
1275 template<
typename T >
1288 template<
typename T >
1301 template<
typename T >
1308 #if defined LIBO_INTERNAL_ONLY
1320 friend bool operator !=(OUString
const & lhs, OUStringLiteral
const & rhs) {
1321 return !lhs.equalsAsciiL(rhs.data, rhs.size);
1324 friend bool operator <(OUString
const & lhs, OUStringLiteral
const & rhs) {
1327 lhs.pData->buffer, lhs.pData->length, rhs.data))
1331 friend bool operator <=(OUString
const & lhs, OUStringLiteral
const & rhs) {
1334 lhs.pData->buffer, lhs.pData->length, rhs.data))
1338 friend bool operator >(OUString
const & lhs, OUStringLiteral
const & rhs) {
1341 lhs.pData->buffer, lhs.pData->length, rhs.data))
1345 friend bool operator >=(OUString
const & lhs, OUStringLiteral
const & rhs) {
1348 lhs.pData->buffer, lhs.pData->length, rhs.data))
1352 friend bool operator ==(OUStringLiteral
const & lhs, OUString
const & rhs) {
1353 return rhs.equalsAsciiL(lhs.data, lhs.size);
1356 friend bool operator !=(OUStringLiteral
const & lhs, OUString
const & rhs) {
1357 return !rhs.equalsAsciiL(lhs.data, lhs.size);
1360 friend bool operator <(OUStringLiteral
const & lhs, OUString
const & rhs) {
1363 rhs.pData->buffer, rhs.pData->length, lhs.data))
1367 friend bool operator <=(OUStringLiteral
const & lhs, OUString
const & rhs) {
1370 rhs.pData->buffer, rhs.pData->length, lhs.data))
1374 friend bool operator >(OUStringLiteral
const & lhs, OUString
const & rhs) {
1377 rhs.pData->buffer, rhs.pData->length, lhs.data))
1381 friend bool operator >=(OUStringLiteral
const & lhs, OUString
const & rhs) {
1384 rhs.pData->buffer, rhs.pData->length, lhs.data))
1419 return (ret < 0 ? ret : ret+fromIndex);
1471 str.pData->buffer, str.pData->length );
1472 return (ret < 0 ? ret : ret+fromIndex);
1480 template<
typename T >
1485 pData->buffer + fromIndex, pData->length - fromIndex, literal,
1487 return ret < 0 ? ret : ret + fromIndex;
1514 char const * str, sal_Int32 len, sal_Int32 fromIndex = 0)
const
1517 pData->buffer + fromIndex, pData->length - fromIndex, str, len);
1518 return ret < 0 ? ret : ret + fromIndex;
1525 #if SAL_TYPES_SIZEOFLONG == 8
1547 str.pData->buffer, str.pData->length );
1570 str.pData->buffer, str.pData->length );
1578 template<
typename T >
1608 pData->buffer, pData->length, str, len);
1623 rtl_uString *pNew = 0;
1642 rtl_uString *pNew = 0;
1657 rtl_uString* pNew = 0;
1662 #ifndef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
1665 return rStr1.
concat( rStr2 );
1684 rtl_uString* pNew = 0;
1704 rtl_uString* pNew = 0;
1730 rtl_uString * s = 0;
1733 &s, pData, from.pData, to.pData, index == 0 ? &i : index);
1755 template<
typename T >
1757 sal_Int32 * index = 0)
const
1759 rtl_uString * s = 0;
1785 template<
typename T1,
typename T2 >
1789 rtl_uString * s = 0;
1817 rtl_uString * s = 0;
1835 template<
typename T >
1838 rtl_uString * s = 0;
1857 template<
typename T1,
typename T2 >
1861 rtl_uString * s = 0;
1882 rtl_uString* pNew = 0;
1899 rtl_uString* pNew = 0;
1917 rtl_uString* pNew = 0;
1948 rtl_uString * pNew = 0;
1968 return getToken(count, separator, n);
1992 return pData->buffer[0];
2103 rtl_uString * pNew = 0;
2106 throw std::bad_alloc();
2139 sal_uInt32 *pInfo = NULL )
2141 rtl_uString * pNew = 0;
2143 convertFlags, pInfo );
2145 throw std::bad_alloc();
2175 sal_uInt32 nFlags)
const
2178 pData->length, nEncoding, nFlags);
2233 sal_Int32 * indexUtf16, sal_Int32 incrementCodePoints = 1)
const
2236 pData, indexUtf16, incrementCodePoints);
2297 rtl_uString* pNewData = 0;
2305 return number( static_cast< unsigned long long >( i ), radix );
2311 return number( static_cast< long long >( i ), radix );
2317 return number( static_cast< unsigned long long >( i ), radix );
2324 rtl_uString* pNewData = 0;
2333 rtl_uString* pNewData = 0;
2350 rtl_uString* pNewData = 0;
2367 rtl_uString* pNewData = 0;
2402 rtl_uString* pNewData = 0;
2431 return number( i, radix );
2446 return number( ll, radix );
2494 rtl_uString* pNew = 0;
2500 #if defined LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
2507 template<
char C>
bool operator ==(OUString
const &
string, OUStringLiteral1<C>)
2510 return string.equalsAsciiL(&c, 1);
2518 OUString
const &
string, OUStringLiteral1<C> literal)
2520 return !(
string == literal);
2527 struct ToStringHelper< OUString >
2529 static int length(
const OUString& s ) {
return s.getLength(); }
2530 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUString& s ) {
return addDataHelper( buffer, s.getStr(), s.getLength()); }
2531 static const bool allowOStringConcat =
false;
2532 static const bool allowOUStringConcat =
true;
2539 struct ToStringHelper< OUStringLiteral >
2541 static int length(
const OUStringLiteral& str ) {
return str.size; }
2542 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUStringLiteral& str ) {
return addDataLiteral( buffer, str.data, str.size ); }
2543 static const bool allowOStringConcat =
false;
2544 static const bool allowOUStringConcat =
true;
2550 template<
char C>
struct ToStringHelper<OUStringLiteral1<C>>
2552 static int length(OUStringLiteral1<C>) {
return 1; }
2554 { *buffer++ = C;
return buffer; }
2555 static const bool allowOStringConcat =
false;
2556 static const bool allowOUStringConcat =
true;
2562 template<
typename charT,
typename traits,
typename T1,
typename T2 >
2563 inline std::basic_ostream<charT, traits> &
operator <<(
2564 std::basic_ostream<charT, traits> & stream,
const OUStringConcat< T1, T2 >& concat)
2566 return stream << OUString( concat );
2589 {
return (
size_t)rString.
hashCode(); }
2652 template<
typename charT,
typename traits >
2654 std::basic_ostream<charT, traits> & stream,
OUString const &
string)
2664 #ifdef RTL_STRING_UNITTEST
2667 typedef rtlunittest::OUString OUString;
2674 #if defined LIBO_INTERNAL_ONLY && !defined RTL_STRING_UNITTEST
2675 using ::rtl::OUString;
2676 using ::rtl::OUStringHash;
2679 using ::rtl::OUStringLiteral;
2680 using ::rtl::OUStringLiteral1;