LCOV - code coverage report
Current view: top level - include/rtl - ustring.hxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 185 400 46.2 %
Date: 2014-04-14 Functions: 180 1834 9.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #ifndef INCLUDED_RTL_USTRING_HXX
      21             : #define INCLUDED_RTL_USTRING_HXX
      22             : 
      23             : #include <sal/config.h>
      24             : 
      25             : #include <cassert>
      26             : #include <new>
      27             : #include <ostream>
      28             : #include <string.h>
      29             : 
      30             : #include <osl/diagnose.h>
      31             : #include <rtl/ustring.h>
      32             : #include <rtl/string.hxx>
      33             : #include <rtl/stringutils.hxx>
      34             : #include <rtl/textenc.h>
      35             : #include <sal/log.hxx>
      36             : 
      37             : #ifdef RTL_FAST_STRING
      38             : #include <rtl/stringconcat.hxx>
      39             : #endif
      40             : 
      41             : // The unittest uses slightly different code to help check that the proper
      42             : // calls are made. The class is put into a different namespace to make
      43             : // sure the compiler generates a different (if generating also non-inline)
      44             : // copy of the function and does not merge them together. The class
      45             : // is "brought" into the proper rtl namespace by a typedef below.
      46             : #ifdef RTL_STRING_UNITTEST
      47             : #define rtl rtlunittest
      48             : #endif
      49             : 
      50             : namespace rtl
      51             : {
      52             : 
      53             : #ifdef RTL_STRING_UNITTEST
      54             : #undef rtl
      55             : #endif
      56             : 
      57             : /* ======================================================================= */
      58             : 
      59             : /**
      60             :   This String class provides base functionality for C++ like Unicode
      61             :   character array handling. The advantage of this class is that it
      62             :   handles all the memory management for you - and it does it
      63             :   more efficiently. If you assign a string to another string, the
      64             :   data of both strings are shared (without any copy operation or
      65             :   memory allocation) as long as you do not change the string. This class
      66             :   also stores the length of the string, so that many operations are
      67             :   faster than the C-str-functions.
      68             : 
      69             :   This class provides only readonly string handling. So you could create
      70             :   a string and you could only query the content from this string.
      71             :   It provides also functionality to change the string, but this results
      72             :   in every case in a new string instance (in the most cases with a
      73             :   memory allocation). You don't have functionality to change the
      74             :   content of the string. If you want to change the string content, then
      75             :   you should use the OStringBuffer class, which provides these
      76             :   functionalities and avoids too much memory allocation.
      77             : 
      78             :   The design of this class is similar to the string classes in Java so
      79             :   less people should have understanding problems when they use this class.
      80             : */
      81             : 
      82             : class SAL_WARN_UNUSED OUString
      83             : {
      84             : public:
      85             :     /// @cond INTERNAL
      86             :     rtl_uString * pData;
      87             :     /// @endcond
      88             : 
      89             :     /**
      90             :       New string containing no characters.
      91             :     */
      92    22495646 :     OUString() SAL_THROW(())
      93             :     {
      94    22495646 :         pData = 0;
      95    22495646 :         rtl_uString_new( &pData );
      96    22495646 :     }
      97             : 
      98             :     /**
      99             :       New string from OUString.
     100             : 
     101             :       @param    str         a OUString.
     102             :     */
     103     6779385 :     OUString( const OUString & str ) SAL_THROW(())
     104             :     {
     105     6779385 :         pData = str.pData;
     106     6779385 :         rtl_uString_acquire( pData );
     107     6779385 :     }
     108             : 
     109             :     /**
     110             :       New string from OUString data.
     111             : 
     112             :       @param    str         a OUString data.
     113             :     */
     114     5231456 :     OUString( rtl_uString * str )  SAL_THROW(())
     115             :     {
     116     5231456 :         pData = str;
     117     5231456 :         rtl_uString_acquire( pData );
     118     5231456 :     }
     119             : 
     120             :     /** New OUString from OUString data without acquiring it.  Takeover of ownership.
     121             : 
     122             :         The SAL_NO_ACQUIRE dummy parameter is only there to distinguish this
     123             :         from other constructors.
     124             : 
     125             :         @param str
     126             :                OUString data
     127             :     */
     128     8214280 :     inline OUString( rtl_uString * str, __sal_NoAcquire ) SAL_THROW(())
     129     8214280 :         { pData = str; }
     130             : 
     131             :     /**
     132             :       New string from a single Unicode character.
     133             : 
     134             :       @param    value       a Unicode character.
     135             :     */
     136          46 :     explicit OUString( sal_Unicode value ) SAL_THROW(())
     137          46 :         : pData (0)
     138             :     {
     139          46 :         rtl_uString_newFromStr_WithLength( &pData, &value, 1 );
     140          46 :     }
     141             : 
     142             :     /**
     143             :       New string from a Unicode character buffer array.
     144             : 
     145             :       @param    value       a NULL-terminated Unicode character array.
     146             :     */
     147      255244 :     OUString( const sal_Unicode * value ) SAL_THROW(())
     148             :     {
     149      255244 :         pData = 0;
     150      255244 :         rtl_uString_newFromStr( &pData, value );
     151      255244 :     }
     152             : 
     153             :     /**
     154             :       New string from a Unicode character buffer array.
     155             : 
     156             :       @param    value       a Unicode character array.
     157             :       @param    length      the number of character which should be copied.
     158             :                             The character array length must be greater than
     159             :                             or equal to this value.
     160             :     */
     161      255390 :     OUString( const sal_Unicode * value, sal_Int32 length ) SAL_THROW(())
     162             :     {
     163      255390 :         pData = 0;
     164      255390 :         rtl_uString_newFromStr_WithLength( &pData, value, length );
     165      255390 :     }
     166             : 
     167             :     /**
     168             :       New string from an 8-Bit string literal that is expected to contain only
     169             :       characters in the ASCII set (i.e. first 128 characters). This constructor
     170             :       allows an efficient and convenient way to create OUString
     171             :       instances from ASCII literals. When creating strings from data that
     172             :       is not pure ASCII, it needs to be converted to OUString by explicitly
     173             :       providing the encoding to use for the conversion.
     174             : 
     175             :       If there are any embedded \0's in the string literal, the result is undefined.
     176             :       Use the overload that explicitly accepts length.
     177             : 
     178             :       @param    literal         the 8-bit ASCII string literal
     179             : 
     180             :       @since LibreOffice 3.6
     181             :     */
     182             :     template< typename T >
     183     1575110 :     OUString( T& literal, typename internal::ConstCharArrayDetector< T, internal::Dummy >::Type = internal::Dummy() )
     184             :     {
     185             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
     186     1575110 :         pData = 0;
     187             :         if( internal::ConstCharArrayDetector< T, void >::size - 1 == 0 ) // empty string
     188           1 :             rtl_uString_new( &pData );
     189             :         else
     190     1575109 :             rtl_uString_newFromLiteral( &pData, literal, internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
     191             : #ifdef RTL_STRING_UNITTEST
     192             :         rtl_string_unittest_const_literal = true;
     193             : #endif
     194     1575110 :     }
     195             : 
     196             : #ifdef RTL_STRING_UNITTEST
     197             :     /**
     198             :      * Only used by unittests to detect incorrect conversions.
     199             :      * @internal
     200             :      */
     201             :     template< typename T >
     202             :     OUString( T&, typename internal::ExceptConstCharArrayDetector< T >::Type = internal::Dummy() )
     203             :     {
     204             :         pData = 0;
     205             :         rtl_uString_newFromLiteral( &pData, "!!br0ken!!", 10, 0 ); // set to garbage
     206             :         rtl_string_unittest_invalid_conversion = true;
     207             :     }
     208             :     /**
     209             :      * Only used by unittests to detect incorrect conversions.
     210             :      * @internal
     211             :      */
     212             :     template< typename T >
     213             :     OUString( const T&, typename internal::ExceptCharArrayDetector< T >::Type = internal::Dummy() )
     214             :     {
     215             :         pData = 0;
     216             :         rtl_uString_newFromLiteral( &pData, "!!br0ken!!", 10, 0 ); // set to garbage
     217             :         rtl_string_unittest_invalid_conversion = true;
     218             :     }
     219             : #endif
     220             : 
     221             :     /**
     222             :       New string from an 8-Bit character buffer array.
     223             : 
     224             :       @param    value           An 8-Bit character array.
     225             :       @param    length          The number of character which should be converted.
     226             :                                 The 8-Bit character array length must be
     227             :                                 greater than or equal to this value.
     228             :       @param    encoding        The text encoding from which the 8-Bit character
     229             :                                 sequence should be converted.
     230             :       @param    convertFlags    Flags which control the conversion.
     231             :                                 see RTL_TEXTTOUNICODE_FLAGS_...
     232             : 
     233             :       @exception std::bad_alloc is thrown if an out-of-memory condition occurs
     234             :     */
     235     4039975 :     OUString( const sal_Char * value, sal_Int32 length,
     236             :               rtl_TextEncoding encoding,
     237             :               sal_uInt32 convertFlags = OSTRING_TO_OUSTRING_CVTFLAGS )
     238             :     {
     239     4039975 :         pData = 0;
     240     4039975 :         rtl_string2UString( &pData, value, length, encoding, convertFlags );
     241     4039975 :         if (pData == 0) {
     242           0 :             throw std::bad_alloc();
     243             :         }
     244     4039975 :     }
     245             : 
     246             :     /** Create a new string from an array of Unicode code points.
     247             : 
     248             :         @param codePoints
     249             :         an array of at least codePointCount code points, which each must be in
     250             :         the range from 0 to 0x10FFFF, inclusive.  May be null if codePointCount
     251             :         is zero.
     252             : 
     253             :         @param codePointCount
     254             :         the non-negative number of code points.
     255             : 
     256             :         @exception std::bad_alloc
     257             :         is thrown if either an out-of-memory condition occurs or the resulting
     258             :         number of UTF-16 code units would have been larger than SAL_MAX_INT32.
     259             : 
     260             :         @since UDK 3.2.7
     261             :     */
     262           0 :     inline explicit OUString(
     263             :         sal_uInt32 const * codePoints, sal_Int32 codePointCount):
     264           0 :         pData(NULL)
     265             :     {
     266           0 :         rtl_uString_newFromCodePoints(&pData, codePoints, codePointCount);
     267           0 :         if (pData == NULL) {
     268           0 :             throw std::bad_alloc();
     269             :         }
     270           0 :     }
     271             : 
     272             : #ifdef RTL_FAST_STRING
     273             :     /**
     274             :      @overload
     275             :      @internal
     276             :     */
     277             :     template< typename T1, typename T2 >
     278       86929 :     OUString( const OUStringConcat< T1, T2 >& c )
     279             :     {
     280       86929 :         const sal_Int32 l = c.length();
     281       86929 :         pData = rtl_uString_alloc( l );
     282       86929 :         if (l != 0)
     283             :         {
     284       86929 :             sal_Unicode* end = c.addData( pData->buffer );
     285       86929 :             pData->length = end - pData->buffer;
     286       86929 :             *end = '\0';
     287             :             // TODO realloc in case pData->length is noticeably smaller than l?
     288             :         }
     289       86929 :     }
     290             : #endif
     291             : 
     292             :     /**
     293             :       Release the string data.
     294             :     */
     295    44889141 :     ~OUString() SAL_THROW(())
     296             :     {
     297    44889141 :         rtl_uString_release( pData );
     298    44889141 :     }
     299             : 
     300             :     /** Provides an OUString const & passing a storage pointer of an
     301             :         rtl_uString * handle.
     302             :         It is more convenient to use C++ OUString member functions when dealing
     303             :         with rtl_uString * handles.  Using this function avoids unnecessary
     304             :         acquire()/release() calls for a temporary OUString object.
     305             : 
     306             :         @param ppHandle
     307             :                pointer to storage
     308             :         @return
     309             :                OUString const & based on given storage
     310             :     */
     311          24 :     static inline OUString const & unacquired( rtl_uString * const * ppHandle )
     312          24 :         { return * reinterpret_cast< OUString const * >( ppHandle ); }
     313             : 
     314             :     /**
     315             :       Assign a new string.
     316             : 
     317             :       @param    str         a OUString.
     318             :     */
     319    13355492 :     OUString & operator=( const OUString & str ) SAL_THROW(())
     320             :     {
     321    13355492 :         rtl_uString_assign( &pData, str.pData );
     322    13355492 :         return *this;
     323             :     }
     324             : 
     325             :     /**
     326             :       Assign a new string from an 8-Bit string literal that is expected to contain only
     327             :       characters in the ASCII set (i.e. first 128 characters). This operator
     328             :       allows an efficient and convenient way to assign OUString
     329             :       instances from ASCII literals. When assigning strings from data that
     330             :       is not pure ASCII, it needs to be converted to OUString by explicitly
     331             :       providing the encoding to use for the conversion.
     332             : 
     333             :       @param    literal         the 8-bit ASCII string literal
     334             : 
     335             :       @since LibreOffice 3.6
     336             :     */
     337             :     template< typename T >
     338       42509 :     typename internal::ConstCharArrayDetector< T, OUString& >::Type operator=( T& literal )
     339             :     {
     340             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
     341             :         if( internal::ConstCharArrayDetector< T, void >::size - 1 == 0 ) // empty string
     342           0 :             rtl_uString_new( &pData );
     343             :         else
     344       42509 :             rtl_uString_newFromLiteral( &pData, literal, internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
     345       42509 :         return *this;
     346             :     }
     347             : 
     348             :     /**
     349             :       Append a string to this string.
     350             : 
     351             :       @param    str         a OUString.
     352             :     */
     353       42643 :     OUString & operator+=( const OUString & str ) SAL_THROW(())
     354             :     {
     355       42643 :         rtl_uString_newConcat( &pData, pData, str.pData );
     356       42643 :         return *this;
     357             :     }
     358             : 
     359             : #ifdef RTL_FAST_STRING
     360             :     /**
     361             :      @overload
     362             :      @internal
     363             :     */
     364             :     template< typename T1, typename T2 >
     365           0 :     OUString& operator+=( const OUStringConcat< T1, T2 >& c )
     366             :     {
     367           0 :         const int l = c.length();
     368           0 :         if( l == 0 )
     369           0 :             return *this;
     370           0 :         rtl_uString_ensureCapacity( &pData, pData->length + l );
     371           0 :         sal_Unicode* end = c.addData( pData->buffer + pData->length );
     372           0 :         *end = '\0';
     373           0 :         pData->length = end - pData->buffer;
     374           0 :         return *this;
     375             :     }
     376             : #endif
     377             : 
     378             :     /**
     379             :       Returns the length of this string.
     380             : 
     381             :       The length is equal to the number of Unicode characters in this string.
     382             : 
     383             :       @return   the length of the sequence of characters represented by this
     384             :                 object.
     385             :     */
     386   105265202 :     sal_Int32 getLength() const SAL_THROW(()) { return pData->length; }
     387             : 
     388             :     /**
     389             :       Checks if a string is empty.
     390             : 
     391             :       @return   true if the string is empty;
     392             :                 false, otherwise.
     393             : 
     394             :       @since LibreOffice 3.4
     395             :     */
     396     2306701 :     bool isEmpty() const SAL_THROW(())
     397             :     {
     398     2306701 :         return pData->length == 0;
     399             :     }
     400             : 
     401             :     /**
     402             :       Returns a pointer to the Unicode character buffer for this string.
     403             : 
     404             :       It isn't necessarily NULL terminated.
     405             : 
     406             :       @return   a pointer to the Unicode characters buffer for this object.
     407             :     */
     408   100667498 :     const sal_Unicode * getStr() const SAL_THROW(()) { return pData->buffer; }
     409             : 
     410             :     /**
     411             :       Access to individual characters.
     412             : 
     413             :       @param index must be non-negative and less than length.
     414             : 
     415             :       @return the character at the given index.
     416             : 
     417             :       @since LibreOffice 3.5
     418             :     */
     419    95771279 :     sal_Unicode operator [](sal_Int32 index) const {
     420             :         // silence spurious -Werror=strict-overflow warnings from GCC 4.8.2
     421             :         assert(index >= 0 && static_cast<sal_uInt32>(index) < static_cast<sal_uInt32>(getLength()));
     422    95771279 :         return getStr()[index];
     423             :     }
     424             : 
     425             :     /**
     426             :       Compares two strings.
     427             : 
     428             :       The comparison is based on the numeric value of each character in
     429             :       the strings and return a value indicating their relationship.
     430             :       This function can't be used for language specific sorting.
     431             : 
     432             :       @param    str         the object to be compared.
     433             :       @return   0 - if both strings are equal
     434             :                 < 0 - if this string is less than the string argument
     435             :                 > 0 - if this string is greater than the string argument
     436             :     */
     437       31507 :     sal_Int32 compareTo( const OUString & str ) const SAL_THROW(())
     438             :     {
     439             :         return rtl_ustr_compare_WithLength( pData->buffer, pData->length,
     440       31507 :                                             str.pData->buffer, str.pData->length );
     441             :     }
     442             : 
     443             :     /**
     444             :       Compares two strings with a maximum count of characters.
     445             : 
     446             :       The comparison is based on the numeric value of each character in
     447             :       the strings and return a value indicating their relationship.
     448             :       This function can't be used for language specific sorting.
     449             : 
     450             :       @param    str         the object to be compared.
     451             :       @param    maxLength   the maximum count of characters to be compared.
     452             :       @return   0 - if both strings are equal
     453             :                 < 0 - if this string is less than the string argument
     454             :                 > 0 - if this string is greater than the string argument
     455             : 
     456             :       @since UDK 3.2.7
     457             :     */
     458           0 :     sal_Int32 compareTo( const OUString & str, sal_Int32 maxLength ) const SAL_THROW(())
     459             :     {
     460             :         return rtl_ustr_shortenedCompare_WithLength( pData->buffer, pData->length,
     461           0 :                                                      str.pData->buffer, str.pData->length, maxLength );
     462             :     }
     463             : 
     464             :     /**
     465             :       Compares two strings in reverse order.
     466             : 
     467             :       The comparison is based on the numeric value of each character in
     468             :       the strings and return a value indicating their relationship.
     469             :       This function can't be used for language specific sorting.
     470             : 
     471             :       @param    str         the object to be compared.
     472             :       @return   0 - if both strings are equal
     473             :                 < 0 - if this string is less than the string argument
     474             :                 > 0 - if this string is greater than the string argument
     475             :     */
     476           0 :     sal_Int32 reverseCompareTo( const OUString & str ) const SAL_THROW(())
     477             :     {
     478             :         return rtl_ustr_reverseCompare_WithLength( pData->buffer, pData->length,
     479           0 :                                                    str.pData->buffer, str.pData->length );
     480             :     }
     481             : 
     482             :     /**
     483             :      @overload
     484             :      This function accepts an ASCII string literal as its argument.
     485             :      @since LibreOffice 4.1
     486             :     */
     487             :     template< typename T >
     488             :     typename internal::ConstCharArrayDetector< T, sal_Int32 >::Type reverseCompareTo( T& literal ) const SAL_THROW(())
     489             :     {
     490             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
     491             :         return rtl_ustr_asciil_reverseCompare_WithLength( pData->buffer, pData->length,
     492             :             literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
     493             :     }
     494             : 
     495             :     /**
     496             :       Perform a comparison of two strings.
     497             : 
     498             :       The result is true if and only if second string
     499             :       represents the same sequence of characters as the first string.
     500             :       This function can't be used for language specific comparison.
     501             : 
     502             :       @param    str         the object to be compared.
     503             :       @return   true if the strings are equal;
     504             :                 false, otherwise.
     505             :     */
     506    19806430 :     bool equals( const OUString & str ) const SAL_THROW(())
     507             :     {
     508    19806430 :         if ( pData->length != str.pData->length )
     509    17676427 :             return false;
     510     2130003 :         if ( pData == str.pData )
     511          48 :             return true;
     512             :         return rtl_ustr_reverseCompare_WithLength( pData->buffer, pData->length,
     513     2129955 :                                                    str.pData->buffer, str.pData->length ) == 0;
     514             :     }
     515             : 
     516             :     /**
     517             :       Perform a ASCII lowercase comparison of two strings.
     518             : 
     519             :       The result is true if and only if second string
     520             :       represents the same sequence of characters as the first string,
     521             :       ignoring the case.
     522             :       Character values between 65 and 90 (ASCII A-Z) are interpreted as
     523             :       values between 97 and 122 (ASCII a-z).
     524             :       This function can't be used for language specific comparison.
     525             : 
     526             :       @param    str         the object to be compared.
     527             :       @return   true if the strings are equal;
     528             :                 false, otherwise.
     529             :     */
     530       85012 :     bool equalsIgnoreAsciiCase( const OUString & str ) const SAL_THROW(())
     531             :     {
     532       85012 :         if ( pData->length != str.pData->length )
     533           0 :             return false;
     534       85012 :         if ( pData == str.pData )
     535           0 :             return true;
     536             :         return rtl_ustr_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length,
     537       85012 :                                                            str.pData->buffer, str.pData->length ) == 0;
     538             :     }
     539             : 
     540             :     /**
     541             :       Perform a ASCII lowercase comparison of two strings.
     542             : 
     543             :       Compare the two strings with uppercase ASCII
     544             :       character values between 65 and 90 (ASCII A-Z) interpreted as
     545             :       values between 97 and 122 (ASCII a-z).
     546             :       This function can't be used for language specific comparison.
     547             : 
     548             :       @param    str         the object to be compared.
     549             :       @return   0 - if both strings are equal
     550             :                 < 0 - if this string is less than the string argument
     551             :                 > 0 - if this string is greater than the string argument
     552             : 
     553             :       @since LibreOffice 4.0
     554             :     */
     555           8 :     sal_Int32 compareToIgnoreAsciiCase( const OUString & str ) const SAL_THROW(())
     556             :     {
     557             :         return rtl_ustr_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length,
     558           8 :                                                            str.pData->buffer, str.pData->length );
     559             :     }
     560             : 
     561             : 
     562             :     /**
     563             :      @overload
     564             :      This function accepts an ASCII string literal as its argument.
     565             :      @since LibreOffice 3.6
     566             :     */
     567             :     template< typename T >
     568           0 :     typename internal::ConstCharArrayDetector< T, bool >::Type equalsIgnoreAsciiCase( T& literal ) const SAL_THROW(())
     569             :     {
     570             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
     571           0 :         if ( pData->length != internal::ConstCharArrayDetector< T, void >::size - 1 )
     572           0 :             return false;
     573             : 
     574           0 :         return rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, literal ) == 0;
     575             :     }
     576             : 
     577             :    /**
     578             :       Match against a substring appearing in this string.
     579             : 
     580             :       The result is true if and only if the second string appears as a substring
     581             :       of this string, at the given position.
     582             :       This function can't be used for language specific comparison.
     583             : 
     584             :       @param    str         the object (substring) to be compared.
     585             :       @param    fromIndex   the index to start the comparion from.
     586             :                             The index must be greater than or equal to 0
     587             :                             and less or equal as the string length.
     588             :       @return   true if str match with the characters in the string
     589             :                 at the given position;
     590             :                 false, otherwise.
     591             :     */
     592         168 :     bool match( const OUString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
     593             :     {
     594         168 :         return rtl_ustr_shortenedCompare_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
     595         336 :                                                      str.pData->buffer, str.pData->length, str.pData->length ) == 0;
     596             :     }
     597             : 
     598             :     /**
     599             :      @overload
     600             :      This function accepts an ASCII string literal as its argument.
     601             :      @since LibreOffice 3.6
     602             :     */
     603             :     template< typename T >
     604           5 :     typename internal::ConstCharArrayDetector< T, bool >::Type match( T& literal, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
     605             :     {
     606             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
     607           5 :         return rtl_ustr_ascii_shortenedCompare_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
     608          10 :             literal, internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
     609             :     }
     610             : 
     611             :     /**
     612             :       Match against a substring appearing in this string, ignoring the case of
     613             :       ASCII letters.
     614             : 
     615             :       The result is true if and only if the second string appears as a substring
     616             :       of this string, at the given position.
     617             :       Character values between 65 and 90 (ASCII A-Z) are interpreted as
     618             :       values between 97 and 122 (ASCII a-z).
     619             :       This function can't be used for language specific comparison.
     620             : 
     621             :       @param    str         the object (substring) to be compared.
     622             :       @param    fromIndex   the index to start the comparion from.
     623             :                             The index must be greater than or equal to 0
     624             :                             and less than or equal to the string length.
     625             :       @return   true if str match with the characters in the string
     626             :                 at the given position;
     627             :                 false, otherwise.
     628             :     */
     629           0 :     bool matchIgnoreAsciiCase( const OUString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
     630             :     {
     631           0 :         return rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
     632             :                                                                     str.pData->buffer, str.pData->length,
     633           0 :                                                                     str.pData->length ) == 0;
     634             :     }
     635             : 
     636             :     /**
     637             :      @overload
     638             :      This function accepts an ASCII string literal as its argument.
     639             :      @since LibreOffice 3.6
     640             :     */
     641             :     template< typename T >
     642      127519 :     typename internal::ConstCharArrayDetector< T, bool >::Type matchIgnoreAsciiCase( T& literal, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
     643             :     {
     644             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
     645      127519 :         return rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
     646      255038 :             literal, internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
     647             :     }
     648             : 
     649             :     /**
     650             :       Compares two strings.
     651             : 
     652             :       The comparison is based on the numeric value of each character in
     653             :       the strings and return a value indicating their relationship.
     654             :       Since this method is optimized for performance, the ASCII character
     655             :       values are not converted in any way. The caller has to make sure that
     656             :       all ASCII characters are in the allowed range between 0 and
     657             :       127. The ASCII string must be NULL-terminated.
     658             :       This function can't be used for language specific sorting.
     659             : 
     660             :       @param  asciiStr      the 8-Bit ASCII character string to be compared.
     661             :       @return   0 - if both strings are equal
     662             :                 < 0 - if this string is less than the string argument
     663             :                 > 0 - if this string is greater than the string argument
     664             :     */
     665           0 :     sal_Int32 compareToAscii( const sal_Char* asciiStr ) const SAL_THROW(())
     666             :     {
     667           0 :         return rtl_ustr_ascii_compare_WithLength( pData->buffer, pData->length, asciiStr );
     668             :     }
     669             : 
     670             :     /**
     671             :       Compares two strings with a maximum count of characters.
     672             : 
     673             :       The comparison is based on the numeric value of each character in
     674             :       the strings and return a value indicating their relationship.
     675             :       Since this method is optimized for performance, the ASCII character
     676             :       values are not converted in any way. The caller has to make sure that
     677             :       all ASCII characters are in the allowed range between 0 and
     678             :       127. The ASCII string must be NULL-terminated.
     679             :       This function can't be used for language specific sorting.
     680             : 
     681             :       @deprecated  This is a confusing overload with unexpectedly different
     682             :       semantics from the one-parameter form, so it is marked as deprecated.
     683             :       Practically all uses compare the return value against zero and can thus
     684             :       be replaced with uses of startsWith.
     685             : 
     686             :       @param  asciiStr          the 8-Bit ASCII character string to be compared.
     687             :       @param  maxLength         the maximum count of characters to be compared.
     688             :       @return   0 - if both strings are equal
     689             :                 < 0 - if this string is less than the string argument
     690             :                 > 0 - if this string is greater than the string argument
     691             :     */
     692             :     SAL_DEPRECATED(
     693             :         "replace s1.compareToAscii(s2, strlen(s2)) == 0 with s1.startsWith(s2)")
     694             :     sal_Int32 compareToAscii( const sal_Char * asciiStr, sal_Int32 maxLength ) const SAL_THROW(())
     695             :     {
     696             :         return rtl_ustr_ascii_shortenedCompare_WithLength( pData->buffer, pData->length,
     697             :                                                            asciiStr, maxLength );
     698             :     }
     699             : 
     700             :     /**
     701             :       Compares two strings in reverse order.
     702             : 
     703             :       This could be useful, if normally both strings start with the same
     704             :       content. The comparison is based on the numeric value of each character
     705             :       in the strings and return a value indicating their relationship.
     706             :       Since this method is optimized for performance, the ASCII character
     707             :       values are not converted in any way. The caller has to make sure that
     708             :       all ASCII characters are in the allowed range between 0 and 127.
     709             :       The ASCII string must be NULL-terminated and must be greater than
     710             :       or equal to asciiStrLength.
     711             :       This function can't be used for language specific sorting.
     712             : 
     713             :       @param    asciiStr        the 8-Bit ASCII character string to be compared.
     714             :       @param    asciiStrLength  the length of the ascii string
     715             :       @return   0 - if both strings are equal
     716             :                 < 0 - if this string is less than the string argument
     717             :                 > 0 - if this string is greater than the string argument
     718             :     */
     719           0 :     sal_Int32 reverseCompareToAsciiL( const sal_Char * asciiStr, sal_Int32 asciiStrLength ) const SAL_THROW(())
     720             :     {
     721             :         return rtl_ustr_asciil_reverseCompare_WithLength( pData->buffer, pData->length,
     722           0 :                                                           asciiStr, asciiStrLength );
     723             :     }
     724             : 
     725             :     /**
     726             :       Perform a comparison of two strings.
     727             : 
     728             :       The result is true if and only if second string
     729             :       represents the same sequence of characters as the first string.
     730             :       Since this method is optimized for performance, the ASCII character
     731             :       values are not converted in any way. The caller has to make sure that
     732             :       all ASCII characters are in the allowed range between 0 and
     733             :       127. The ASCII string must be NULL-terminated.
     734             :       This function can't be used for language specific comparison.
     735             : 
     736             :       @param    asciiStr        the 8-Bit ASCII character string to be compared.
     737             :       @return   true if the strings are equal;
     738             :                 false, otherwise.
     739             :     */
     740          40 :     bool equalsAscii( const sal_Char* asciiStr ) const SAL_THROW(())
     741             :     {
     742             :         return rtl_ustr_ascii_compare_WithLength( pData->buffer, pData->length,
     743          40 :                                                   asciiStr ) == 0;
     744             :     }
     745             : 
     746             :     /**
     747             :       Perform a comparison of two strings.
     748             : 
     749             :       The result is true if and only if second string
     750             :       represents the same sequence of characters as the first string.
     751             :       Since this method is optimized for performance, the ASCII character
     752             :       values are not converted in any way. The caller has to make sure that
     753             :       all ASCII characters are in the allowed range between 0 and
     754             :       127. The ASCII string must be NULL-terminated and must be greater than
     755             :       or equal to asciiStrLength.
     756             :       This function can't be used for language specific comparison.
     757             : 
     758             :       @param    asciiStr         the 8-Bit ASCII character string to be compared.
     759             :       @param    asciiStrLength   the length of the ascii string
     760             :       @return   true if the strings are equal;
     761             :                 false, otherwise.
     762             :     */
     763    19595963 :     bool equalsAsciiL( const sal_Char* asciiStr, sal_Int32 asciiStrLength ) const SAL_THROW(())
     764             :     {
     765    19595963 :         if ( pData->length != asciiStrLength )
     766    17810722 :             return false;
     767             : 
     768             :         return rtl_ustr_asciil_reverseEquals_WithLength(
     769     1785241 :                     pData->buffer, asciiStr, asciiStrLength );
     770             :     }
     771             : 
     772             :     /**
     773             :       Perform a ASCII lowercase comparison of two strings.
     774             : 
     775             :       The result is true if and only if second string
     776             :       represents the same sequence of characters as the first string,
     777             :       ignoring the case.
     778             :       Character values between 65 and 90 (ASCII A-Z) are interpreted as
     779             :       values between 97 and 122 (ASCII a-z).
     780             :       Since this method is optimized for performance, the ASCII character
     781             :       values are not converted in any way. The caller has to make sure that
     782             :       all ASCII characters are in the allowed range between 0 and
     783             :       127. The ASCII string must be NULL-terminated.
     784             :       This function can't be used for language specific comparison.
     785             : 
     786             :       @param    asciiStr        the 8-Bit ASCII character string to be compared.
     787             :       @return   true if the strings are equal;
     788             :                 false, otherwise.
     789             :     */
     790           0 :     bool equalsIgnoreAsciiCaseAscii( const sal_Char * asciiStr ) const SAL_THROW(())
     791             :     {
     792           0 :         return rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, asciiStr ) == 0;
     793             :     }
     794             : 
     795             :     /**
     796             :       Compares two ASCII strings ignoring case
     797             : 
     798             :       The comparison is based on the numeric value of each character in
     799             :       the strings and return a value indicating their relationship.
     800             :       Since this method is optimized for performance, the ASCII character
     801             :       values are not converted in any way. The caller has to make sure that
     802             :       all ASCII characters are in the allowed range between 0 and
     803             :       127. The ASCII string must be NULL-terminated.
     804             :       This function can't be used for language specific sorting.
     805             : 
     806             :       @param  asciiStr      the 8-Bit ASCII character string to be compared.
     807             :       @return   0 - if both strings are equal
     808             :                 < 0 - if this string is less than the string argument
     809             :                 > 0 - if this string is greater than the string argument
     810             : 
     811             :       @since LibreOffice 3.5
     812             :     */
     813           0 :     sal_Int32 compareToIgnoreAsciiCaseAscii( const sal_Char * asciiStr ) const SAL_THROW(())
     814             :     {
     815           0 :         return rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, asciiStr );
     816             :     }
     817             : 
     818             :     /**
     819             :       Perform an ASCII lowercase comparison of two strings.
     820             : 
     821             :       The result is true if and only if second string
     822             :       represents the same sequence of characters as the first string,
     823             :       ignoring the case.
     824             :       Character values between 65 and 90 (ASCII A-Z) are interpreted as
     825             :       values between 97 and 122 (ASCII a-z).
     826             :       Since this method is optimized for performance, the ASCII character
     827             :       values are not converted in any way. The caller has to make sure that
     828             :       all ASCII characters are in the allowed range between 0 and 127.
     829             :       The ASCII string must be NULL-terminated and must be greater than
     830             :       or equal to asciiStrLength.
     831             :       This function can't be used for language specific comparison.
     832             : 
     833             :       @param    asciiStr        the 8-Bit ASCII character string to be compared.
     834             :       @param    asciiStrLength  the length of the ascii string
     835             :       @return   true if the strings are equal;
     836             :                 false, otherwise.
     837             :     */
     838           0 :     bool equalsIgnoreAsciiCaseAsciiL( const sal_Char * asciiStr, sal_Int32 asciiStrLength ) const SAL_THROW(())
     839             :     {
     840           0 :         if ( pData->length != asciiStrLength )
     841           0 :             return false;
     842             : 
     843           0 :         return rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, asciiStr ) == 0;
     844             :     }
     845             : 
     846             :     /**
     847             :       Match against a substring appearing in this string.
     848             : 
     849             :       The result is true if and only if the second string appears as a substring
     850             :       of this string, at the given position.
     851             :       Since this method is optimized for performance, the ASCII character
     852             :       values are not converted in any way. The caller has to make sure that
     853             :       all ASCII characters are in the allowed range between 0 and
     854             :       127. The ASCII string must be NULL-terminated and must be greater than or
     855             :       equal to asciiStrLength.
     856             :       This function can't be used for language specific comparison.
     857             : 
     858             :       @param    asciiStr    the object (substring) to be compared.
     859             :       @param    asciiStrLength the length of asciiStr.
     860             :       @param    fromIndex   the index to start the comparion from.
     861             :                             The index must be greater than or equal to 0
     862             :                             and less than or equal to the string length.
     863             :       @return   true if str match with the characters in the string
     864             :                 at the given position;
     865             :                 false, otherwise.
     866             :     */
     867           0 :     bool matchAsciiL( const sal_Char* asciiStr, sal_Int32 asciiStrLength, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
     868             :     {
     869           0 :         return rtl_ustr_ascii_shortenedCompare_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
     870           0 :                                                            asciiStr, asciiStrLength ) == 0;
     871             :     }
     872             : 
     873             :     // This overload is left undefined, to detect calls of matchAsciiL that
     874             :     // erroneously use RTL_CONSTASCII_USTRINGPARAM instead of
     875             :     // RTL_CONSTASCII_STRINGPARAM (but would lead to ambiguities on 32 bit
     876             :     // platforms):
     877             : #if SAL_TYPES_SIZEOFLONG == 8
     878             :     void matchAsciiL(char const *, sal_Int32, rtl_TextEncoding) const;
     879             : #endif
     880             : 
     881             :     /**
     882             :       Match against a substring appearing in this string, ignoring the case of
     883             :       ASCII letters.
     884             : 
     885             :       The result is true if and only if the second string appears as a substring
     886             :       of this string, at the given position.
     887             :       Character values between 65 and 90 (ASCII A-Z) are interpreted as
     888             :       values between 97 and 122 (ASCII a-z).
     889             :       Since this method is optimized for performance, the ASCII character
     890             :       values are not converted in any way. The caller has to make sure that
     891             :       all ASCII characters are in the allowed range between 0 and
     892             :       127. The ASCII string must be NULL-terminated and must be greater than or
     893             :       equal to asciiStrLength.
     894             :       This function can't be used for language specific comparison.
     895             : 
     896             :       @param    asciiStr        the 8-Bit ASCII character string to be compared.
     897             :       @param    asciiStrLength  the length of the ascii string
     898             :       @param    fromIndex       the index to start the comparion from.
     899             :                                 The index must be greater than or equal to 0
     900             :                                 and less than or equal to the string length.
     901             :       @return   true if str match with the characters in the string
     902             :                 at the given position;
     903             :                 false, otherwise.
     904             :     */
     905           0 :     bool matchIgnoreAsciiCaseAsciiL( const sal_Char* asciiStr, sal_Int32 asciiStrLength, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
     906             :     {
     907           0 :         return rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
     908           0 :                                                                           asciiStr, asciiStrLength ) == 0;
     909             :     }
     910             : 
     911             :     // This overload is left undefined, to detect calls of
     912             :     // matchIgnoreAsciiCaseAsciiL that erroneously use
     913             :     // RTL_CONSTASCII_USTRINGPARAM instead of RTL_CONSTASCII_STRINGPARAM (but
     914             :     // would lead to ambiguities on 32 bit platforms):
     915             : #if SAL_TYPES_SIZEOFLONG == 8
     916             :     void matchIgnoreAsciiCaseAsciiL(char const *, sal_Int32, rtl_TextEncoding)
     917             :         const;
     918             : #endif
     919             : 
     920             :     /**
     921             :       Check whether this string starts with a given substring.
     922             : 
     923             :       @param str the substring to be compared
     924             : 
     925             :       @param rest if non-null, and this function returns true, then assign a
     926             :       copy of the remainder of this string to *rest. Available since
     927             :       LibreOffice 4.2
     928             : 
     929             :       @return true if and only if the given str appears as a substring at the
     930             :       start of this string
     931             : 
     932             :       @since LibreOffice 4.0
     933             :     */
     934           0 :     bool startsWith(OUString const & str, OUString * rest = 0) const {
     935           0 :         bool b = match(str, 0);
     936           0 :         if (b && rest != 0) {
     937           0 :             *rest = copy(str.getLength());
     938             :         }
     939           0 :         return b;
     940             :     }
     941             : 
     942             :     /**
     943             :      @overload
     944             :      This function accepts an ASCII string literal as its argument.
     945             :      @since LibreOffice 4.0
     946             :     */
     947             :     template< typename T >
     948      297633 :     typename internal::ConstCharArrayDetector< T, bool >::Type startsWith(
     949             :         T & literal, OUString * rest = 0) const
     950             :     {
     951             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
     952             :         bool b = internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length
     953             :             && rtl_ustr_asciil_reverseEquals_WithLength( pData->buffer, literal,
     954      297633 :                 internal::ConstCharArrayDetector< T, void >::size - 1);
     955      297633 :         if (b && rest != 0) {
     956       42516 :             *rest = copy(internal::ConstCharArrayDetector< T, void >::size - 1);
     957             :         }
     958      297633 :         return b;
     959             :     }
     960             : 
     961             :     /**
     962             :       Check whether this string starts with a given string, ignoring the case of
     963             :       ASCII letters.
     964             : 
     965             :       Character values between 65 and 90 (ASCII A-Z) are interpreted as
     966             :       values between 97 and 122 (ASCII a-z).
     967             :       This function can't be used for language specific comparison.
     968             : 
     969             :       @param str the substring to be compared
     970             : 
     971             :       @param rest if non-null, and this function returns true, then assign a
     972             :       copy of the remainder of this string to *rest. Available since
     973             :       LibreOffice 4.2
     974             : 
     975             :       @return true if and only if the given str appears as a substring at the
     976             :       start of this string, ignoring the case of ASCII letters ("A"--"Z" and
     977             :       "a"--"z")
     978             : 
     979             :       @since LibreOffice 4.0
     980             :     */
     981           0 :     bool startsWithIgnoreAsciiCase(OUString const & str, OUString * rest = 0)
     982             :         const
     983             :     {
     984           0 :         bool b = matchIgnoreAsciiCase(str, 0);
     985           0 :         if (b && rest != 0) {
     986           0 :             *rest = copy(str.getLength());
     987             :         }
     988           0 :         return b;
     989             :     }
     990             : 
     991             :     /**
     992             :      @overload
     993             :      This function accepts an ASCII string literal as its argument.
     994             :      @since LibreOffice 4.0
     995             :     */
     996             :     template< typename T >
     997             :     typename internal::ConstCharArrayDetector< T, bool >::Type
     998           0 :     startsWithIgnoreAsciiCase(T & literal, OUString * rest = 0) const
     999             :     {
    1000             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1001             :         bool b = (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
    1002             :                     pData->buffer,
    1003             :                     internal::ConstCharArrayDetector< T, void >::size - 1, literal,
    1004           0 :                     internal::ConstCharArrayDetector< T, void >::size - 1)
    1005           0 :                 == 0);
    1006           0 :         if (b && rest != 0) {
    1007           0 :             *rest = copy(internal::ConstCharArrayDetector< T, void >::size - 1);
    1008             :         }
    1009           0 :         return b;
    1010             :     }
    1011             : 
    1012             :     /**
    1013             :       Check whether this string ends with a given substring.
    1014             : 
    1015             :       @param str the substring to be compared
    1016             : 
    1017             :       @param rest if non-null, and this function returns true, then assign a
    1018             :       copy of the remainder of this string to *rest. Available since
    1019             :       LibreOffice 4.2
    1020             : 
    1021             :       @return true if and only if the given str appears as a substring at the
    1022             :       end of this string
    1023             : 
    1024             :       @since LibreOffice 3.6
    1025             :     */
    1026           3 :     bool endsWith(OUString const & str, OUString * rest = 0) const {
    1027           3 :         bool b = str.getLength() <= getLength()
    1028           3 :             && match(str, getLength() - str.getLength());
    1029           3 :         if (b && rest != 0) {
    1030           0 :             *rest = copy(0, getLength() - str.getLength());
    1031             :         }
    1032           3 :         return b;
    1033             :     }
    1034             : 
    1035             :     /**
    1036             :      @overload
    1037             :      This function accepts an ASCII string literal as its argument.
    1038             :      @since LibreOffice 3.6
    1039             :     */
    1040             :     template< typename T >
    1041             :     typename internal::ConstCharArrayDetector< T, bool >::Type
    1042         102 :     endsWith(T & literal, OUString * rest = 0) const
    1043             :     {
    1044             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1045             :         bool b = internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length
    1046             :             && rtl_ustr_asciil_reverseEquals_WithLength(
    1047         102 :                 pData->buffer + pData->length - ( internal::ConstCharArrayDetector< T, void >::size - 1 ), literal,
    1048         204 :                 internal::ConstCharArrayDetector< T, void >::size - 1);
    1049         102 :         if (b && rest != 0) {
    1050           0 :             *rest = copy(
    1051             :                 0,
    1052           0 :                 (getLength()
    1053             :                  - (internal::ConstCharArrayDetector< T, void >::size - 1)));
    1054             :         }
    1055         102 :         return b;
    1056             :     }
    1057             : 
    1058             :     /**
    1059             :       Check whether this string ends with a given ASCII string.
    1060             : 
    1061             :       @param asciiStr a sequence of at least asciiStrLength ASCII characters
    1062             :           (bytes in the range 0x00--0x7F)
    1063             :       @param asciiStrLength the length of asciiStr; must be non-negative
    1064             :       @return true if this string ends with asciiStr; otherwise, false is
    1065             :       returned
    1066             : 
    1067             :       @since UDK 3.2.7
    1068             :      */
    1069           0 :     inline bool endsWithAsciiL(char const * asciiStr, sal_Int32 asciiStrLength)
    1070             :         const
    1071             :     {
    1072           0 :         return asciiStrLength <= pData->length
    1073           0 :             && rtl_ustr_asciil_reverseEquals_WithLength(
    1074           0 :                 pData->buffer + pData->length - asciiStrLength, asciiStr,
    1075           0 :                 asciiStrLength);
    1076             :     }
    1077             : 
    1078             :     /**
    1079             :       Check whether this string ends with a given string, ignoring the case of
    1080             :       ASCII letters.
    1081             : 
    1082             :       Character values between 65 and 90 (ASCII A-Z) are interpreted as
    1083             :       values between 97 and 122 (ASCII a-z).
    1084             :       This function can't be used for language specific comparison.
    1085             : 
    1086             :       @param str the substring to be compared
    1087             : 
    1088             :       @param rest if non-null, and this function returns true, then assign a
    1089             :       copy of the remainder of this string to *rest. Available since
    1090             :       LibreOffice 4.2
    1091             : 
    1092             :       @return true if and only if the given str appears as a substring at the
    1093             :       end of this string, ignoring the case of ASCII letters ("A"--"Z" and
    1094             :       "a"--"z")
    1095             : 
    1096             :       @since LibreOffice 3.6
    1097             :     */
    1098           0 :     bool endsWithIgnoreAsciiCase(OUString const & str, OUString * rest = 0) const
    1099             :     {
    1100           0 :         bool b =  str.getLength() <= getLength()
    1101           0 :             && matchIgnoreAsciiCase(str, getLength() - str.getLength());
    1102           0 :         if (b && rest != 0) {
    1103           0 :             *rest = copy(0, getLength() - str.getLength());
    1104             :         }
    1105           0 :         return b;
    1106             :     }
    1107             : 
    1108             :     /**
    1109             :      @overload
    1110             :      This function accepts an ASCII string literal as its argument.
    1111             :      @since LibreOffice 3.6
    1112             :     */
    1113             :     template< typename T >
    1114             :     typename internal::ConstCharArrayDetector< T, bool >::Type
    1115           0 :     endsWithIgnoreAsciiCase(T & literal, OUString * rest = 0) const
    1116             :     {
    1117             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1118             :         bool b = internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length
    1119             :             && (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
    1120           0 :                     pData->buffer + pData->length - ( internal::ConstCharArrayDetector< T, void >::size - 1 ),
    1121             :                     internal::ConstCharArrayDetector< T, void >::size - 1, literal,
    1122           0 :                     internal::ConstCharArrayDetector< T, void >::size - 1)
    1123           0 :                 == 0);
    1124           0 :         if (b && rest != 0) {
    1125           0 :             *rest = copy(
    1126             :                 0,
    1127           0 :                 (getLength()
    1128             :                  - (internal::ConstCharArrayDetector< T, void >::size - 1)));
    1129             :         }
    1130           0 :         return b;
    1131             :     }
    1132             : 
    1133             :     /**
    1134             :       Check whether this string ends with a given ASCII string, ignoring the
    1135             :       case of ASCII letters.
    1136             : 
    1137             :       @param asciiStr a sequence of at least asciiStrLength ASCII characters
    1138             :           (bytes in the range 0x00--0x7F)
    1139             :       @param asciiStrLength the length of asciiStr; must be non-negative
    1140             :       @return true if this string ends with asciiStr, ignoring the case of ASCII
    1141             :       letters ("A"--"Z" and "a"--"z"); otherwise, false is returned
    1142             :      */
    1143           0 :     inline bool endsWithIgnoreAsciiCaseAsciiL(
    1144             :         char const * asciiStr, sal_Int32 asciiStrLength) const
    1145             :     {
    1146           0 :         return asciiStrLength <= pData->length
    1147           0 :             && (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
    1148           0 :                     pData->buffer + pData->length - asciiStrLength,
    1149           0 :                     asciiStrLength, asciiStr, asciiStrLength)
    1150           0 :                 == 0);
    1151             :     }
    1152             : 
    1153    17637688 :     friend bool     operator == ( const OUString& rStr1,    const OUString& rStr2 ) SAL_THROW(())
    1154    17637688 :                         { return rStr1.equals(rStr2); }
    1155           0 :     friend bool     operator == ( const OUString& rStr1,    const sal_Unicode * pStr2 ) SAL_THROW(())
    1156           0 :                         { return rStr1.compareTo( pStr2 ) == 0; }
    1157           0 :     friend bool     operator == ( const sal_Unicode * pStr1,    const OUString& rStr2 ) SAL_THROW(())
    1158           0 :                         { return OUString( pStr1 ).compareTo( rStr2 ) == 0; }
    1159             : 
    1160          13 :     friend bool     operator != ( const OUString& rStr1,        const OUString& rStr2 ) SAL_THROW(())
    1161          13 :                         { return !(operator == ( rStr1, rStr2 )); }
    1162           0 :     friend bool     operator != ( const OUString& rStr1,    const sal_Unicode * pStr2 ) SAL_THROW(())
    1163           0 :                         { return !(operator == ( rStr1, pStr2 )); }
    1164           0 :     friend bool     operator != ( const sal_Unicode * pStr1,    const OUString& rStr2 ) SAL_THROW(())
    1165           0 :                         { return !(operator == ( pStr1, rStr2 )); }
    1166             : 
    1167       31507 :     friend bool     operator <  ( const OUString& rStr1,    const OUString& rStr2 ) SAL_THROW(())
    1168       31507 :                         { return rStr1.compareTo( rStr2 ) < 0; }
    1169           0 :     friend bool     operator >  ( const OUString& rStr1,    const OUString& rStr2 ) SAL_THROW(())
    1170           0 :                         { return rStr1.compareTo( rStr2 ) > 0; }
    1171           0 :     friend bool     operator <= ( const OUString& rStr1,    const OUString& rStr2 ) SAL_THROW(())
    1172           0 :                         { return rStr1.compareTo( rStr2 ) <= 0; }
    1173           0 :     friend bool     operator >= ( const OUString& rStr1,    const OUString& rStr2 ) SAL_THROW(())
    1174           0 :                         { return rStr1.compareTo( rStr2 ) >= 0; }
    1175             : 
    1176             :     /**
    1177             :      * Compare string to an ASCII string literal.
    1178             :      *
    1179             :      * This operator is equal to calling equalsAsciiL().
    1180             :      *
    1181             :      * @since LibreOffice 3.6
    1182             :      */
    1183             :     template< typename T >
    1184    19510758 :     friend inline typename internal::ConstCharArrayDetector< T, bool >::Type operator==( const OUString& string, T& literal )
    1185             :     {
    1186             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1187    19510758 :         return string.equalsAsciiL( literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
    1188             :     }
    1189             :     /**
    1190             :      * Compare string to an ASCII string literal.
    1191             :      *
    1192             :      * This operator is equal to calling equalsAsciiL().
    1193             :      *
    1194             :      * @since LibreOffice 3.6
    1195             :      */
    1196             :     template< typename T >
    1197           0 :     friend inline typename internal::ConstCharArrayDetector< T, bool >::Type operator==( T& literal, const OUString& string )
    1198             :     {
    1199             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1200           0 :         return string.equalsAsciiL( literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
    1201             :     }
    1202             :     /**
    1203             :      * Compare string to an ASCII string literal.
    1204             :      *
    1205             :      * This operator is equal to calling !equalsAsciiL().
    1206             :      *
    1207             :      * @since LibreOffice 3.6
    1208             :      */
    1209             :     template< typename T >
    1210       85021 :     friend inline typename internal::ConstCharArrayDetector< T, bool >::Type operator!=( const OUString& string, T& literal )
    1211             :     {
    1212             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1213       85021 :         return !string.equalsAsciiL( literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
    1214             :     }
    1215             :     /**
    1216             :      * Compare string to an ASCII string literal.
    1217             :      *
    1218             :      * This operator is equal to calling !equalsAsciiL().
    1219             :      *
    1220             :      * @since LibreOffice 3.6
    1221             :      */
    1222             :     template< typename T >
    1223             :     friend inline typename internal::ConstCharArrayDetector< T, bool >::Type operator!=( T& literal, const OUString& string )
    1224             :     {
    1225             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1226             :         return !string.equalsAsciiL( literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
    1227             :     }
    1228             : 
    1229             :     /**
    1230             :       Returns a hashcode for this string.
    1231             : 
    1232             :       @return   a hash code value for this object.
    1233             : 
    1234             :       @see rtl::OUStringHash for convenient use of boost::unordered_map
    1235             :     */
    1236     1147776 :     sal_Int32 hashCode() const SAL_THROW(())
    1237             :     {
    1238     1147776 :         return rtl_ustr_hashCode_WithLength( pData->buffer, pData->length );
    1239             :     }
    1240             : 
    1241             :     /**
    1242             :       Returns the index within this string of the first occurrence of the
    1243             :       specified character, starting the search at the specified index.
    1244             : 
    1245             :       @param    ch          character to be located.
    1246             :       @param    fromIndex   the index to start the search from.
    1247             :                             The index must be greater than or equal to 0
    1248             :                             and less than or equal to the string length.
    1249             :       @return   the index of the first occurrence of the character in the
    1250             :                 character sequence represented by this string that is
    1251             :                 greater than or equal to fromIndex, or
    1252             :                 -1 if the character does not occur.
    1253             :     */
    1254         184 :     sal_Int32 indexOf( sal_Unicode ch, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
    1255             :     {
    1256         184 :         sal_Int32 ret = rtl_ustr_indexOfChar_WithLength( pData->buffer+fromIndex, pData->length-fromIndex, ch );
    1257         184 :         return (ret < 0 ? ret : ret+fromIndex);
    1258             :     }
    1259             : 
    1260             :     /**
    1261             :       Returns the index within this string of the last occurrence of the
    1262             :       specified character, searching backward starting at the end.
    1263             : 
    1264             :       @param    ch          character to be located.
    1265             :       @return   the index of the last occurrence of the character in the
    1266             :                 character sequence represented by this string, or
    1267             :                 -1 if the character does not occur.
    1268             :     */
    1269      808108 :     sal_Int32 lastIndexOf( sal_Unicode ch ) const SAL_THROW(())
    1270             :     {
    1271      808108 :         return rtl_ustr_lastIndexOfChar_WithLength( pData->buffer, pData->length, ch );
    1272             :     }
    1273             : 
    1274             :     /**
    1275             :       Returns the index within this string of the last occurrence of the
    1276             :       specified character, searching backward starting before the specified
    1277             :       index.
    1278             : 
    1279             :       @param    ch          character to be located.
    1280             :       @param    fromIndex   the index before which to start the search.
    1281             :       @return   the index of the last occurrence of the character in the
    1282             :                 character sequence represented by this string that
    1283             :                 is less than fromIndex, or -1
    1284             :                 if the character does not occur before that point.
    1285             :     */
    1286           0 :     sal_Int32 lastIndexOf( sal_Unicode ch, sal_Int32 fromIndex ) const SAL_THROW(())
    1287             :     {
    1288           0 :         return rtl_ustr_lastIndexOfChar_WithLength( pData->buffer, fromIndex, ch );
    1289             :     }
    1290             : 
    1291             :     /**
    1292             :       Returns the index within this string of the first occurrence of the
    1293             :       specified substring, starting at the specified index.
    1294             : 
    1295             :       If str doesn't include any character, always -1 is
    1296             :       returned. This is also the case, if both strings are empty.
    1297             : 
    1298             :       @param    str         the substring to search for.
    1299             :       @param    fromIndex   the index to start the search from.
    1300             :       @return   If the string argument occurs one or more times as a substring
    1301             :                 within this string at the starting index, then the index
    1302             :                 of the first character of the first such substring is
    1303             :                 returned. If it does not occur as a substring starting
    1304             :                 at fromIndex or beyond, -1 is returned.
    1305             :     */
    1306           0 :     sal_Int32 indexOf( const OUString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
    1307             :     {
    1308           0 :         sal_Int32 ret = rtl_ustr_indexOfStr_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
    1309           0 :                                                         str.pData->buffer, str.pData->length );
    1310           0 :         return (ret < 0 ? ret : ret+fromIndex);
    1311             :     }
    1312             : 
    1313             :     /**
    1314             :      @overload
    1315             :      This function accepts an ASCII string literal as its argument.
    1316             :      @since LibreOffice 3.6
    1317             :     */
    1318             :     template< typename T >
    1319          10 :     typename internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
    1320             :     {
    1321             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1322             :         sal_Int32 ret = rtl_ustr_indexOfAscii_WithLength(
    1323          10 :             pData->buffer + fromIndex, pData->length - fromIndex, literal,
    1324          20 :             internal::ConstCharArrayDetector< T, void >::size - 1);
    1325          10 :         return ret < 0 ? ret : ret + fromIndex;
    1326             :     }
    1327             : 
    1328             :     /**
    1329             :        Returns the index within this string of the first occurrence of the
    1330             :        specified ASCII substring, starting at the specified index.
    1331             : 
    1332             :        @param str
    1333             :        the substring to be searched for.  Need not be null-terminated, but must
    1334             :        be at least as long as the specified len.  Must only contain characters
    1335             :        in the ASCII range 0x00--7F.
    1336             : 
    1337             :        @param len
    1338             :        the length of the substring; must be non-negative.
    1339             : 
    1340             :        @param fromIndex
    1341             :        the index to start the search from.  Must be in the range from zero to
    1342             :        the length of this string, inclusive.
    1343             : 
    1344             :        @return
    1345             :        the index (starting at 0) of the first character of the first occurrence
    1346             :        of the substring within this string starting at the given fromIndex, or
    1347             :        -1 if the substring does not occur.  If len is zero, -1 is returned.
    1348             : 
    1349             :        @since UDK 3.2.7
    1350             :     */
    1351           0 :     sal_Int32 indexOfAsciiL(
    1352             :         char const * str, sal_Int32 len, sal_Int32 fromIndex = 0) const
    1353             :         SAL_THROW(())
    1354             :     {
    1355             :         sal_Int32 ret = rtl_ustr_indexOfAscii_WithLength(
    1356           0 :             pData->buffer + fromIndex, pData->length - fromIndex, str, len);
    1357           0 :         return ret < 0 ? ret : ret + fromIndex;
    1358             :     }
    1359             : 
    1360             :     // This overload is left undefined, to detect calls of indexOfAsciiL that
    1361             :     // erroneously use RTL_CONSTASCII_USTRINGPARAM instead of
    1362             :     // RTL_CONSTASCII_STRINGPARAM (but would lead to ambiguities on 32 bit
    1363             :     // platforms):
    1364             : #if SAL_TYPES_SIZEOFLONG == 8
    1365             :     void indexOfAsciiL(char const *, sal_Int32 len, rtl_TextEncoding) const;
    1366             : #endif
    1367             : 
    1368             :     /**
    1369             :       Returns the index within this string of the last occurrence of
    1370             :       the specified substring, searching backward starting at the end.
    1371             : 
    1372             :       The returned index indicates the starting index of the substring
    1373             :       in this string.
    1374             :       If str doesn't include any character, always -1 is
    1375             :       returned. This is also the case, if both strings are empty.
    1376             : 
    1377             :       @param    str         the substring to search for.
    1378             :       @return   If the string argument occurs one or more times as a substring
    1379             :                 within this string, then the index of the first character of
    1380             :                 the last such substring is returned. If it does not occur as
    1381             :                 a substring, -1 is returned.
    1382             :     */
    1383         204 :     sal_Int32 lastIndexOf( const OUString & str ) const SAL_THROW(())
    1384             :     {
    1385             :         return rtl_ustr_lastIndexOfStr_WithLength( pData->buffer, pData->length,
    1386         204 :                                                    str.pData->buffer, str.pData->length );
    1387             :     }
    1388             : 
    1389             :     /**
    1390             :       Returns the index within this string of the last occurrence of
    1391             :       the specified substring, searching backward starting before the specified
    1392             :       index.
    1393             : 
    1394             :       The returned index indicates the starting index of the substring
    1395             :       in this string.
    1396             :       If str doesn't include any character, always -1 is
    1397             :       returned. This is also the case, if both strings are empty.
    1398             : 
    1399             :       @param    str         the substring to search for.
    1400             :       @param    fromIndex   the index before which to start the search.
    1401             :       @return   If the string argument occurs one or more times as a substring
    1402             :                 within this string before the starting index, then the index
    1403             :                 of the first character of the last such substring is
    1404             :                 returned. Otherwise, -1 is returned.
    1405             :     */
    1406           0 :     sal_Int32 lastIndexOf( const OUString & str, sal_Int32 fromIndex ) const SAL_THROW(())
    1407             :     {
    1408             :         return rtl_ustr_lastIndexOfStr_WithLength( pData->buffer, fromIndex,
    1409           0 :                                                    str.pData->buffer, str.pData->length );
    1410             :     }
    1411             : 
    1412             :     /**
    1413             :      @overload
    1414             :      This function accepts an ASCII string literal as its argument.
    1415             :      @since LibreOffice 3.6
    1416             :     */
    1417             :     template< typename T >
    1418           0 :     typename internal::ConstCharArrayDetector< T, sal_Int32 >::Type lastIndexOf( T& literal ) const SAL_THROW(())
    1419             :     {
    1420             :         assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1421             :         return rtl_ustr_lastIndexOfAscii_WithLength(
    1422           0 :             pData->buffer, pData->length, literal, internal::ConstCharArrayDetector< T, void >::size - 1);
    1423             :     }
    1424             : 
    1425             :     /**
    1426             :        Returns the index within this string of the last occurrence of the
    1427             :        specified ASCII substring.
    1428             : 
    1429             :        @param str
    1430             :        the substring to be searched for.  Need not be null-terminated, but must
    1431             :        be at least as long as the specified len.  Must only contain characters
    1432             :        in the ASCII range 0x00--7F.
    1433             : 
    1434             :        @param len
    1435             :        the length of the substring; must be non-negative.
    1436             : 
    1437             :        @return
    1438             :        the index (starting at 0) of the first character of the last occurrence
    1439             :        of the substring within this string, or -1 if the substring does not
    1440             :        occur.  If len is zero, -1 is returned.
    1441             : 
    1442             :        @since UDK 3.2.7
    1443             :     */
    1444           0 :     sal_Int32 lastIndexOfAsciiL(char const * str, sal_Int32 len) const
    1445             :         SAL_THROW(())
    1446             :     {
    1447             :         return rtl_ustr_lastIndexOfAscii_WithLength(
    1448           0 :             pData->buffer, pData->length, str, len);
    1449             :     }
    1450             : 
    1451             :     /**
    1452             :       Returns a new string that is a substring of this string.
    1453             : 
    1454             :       The substring begins at the specified beginIndex. If
    1455             :       beginIndex is negative or be greater than the length of
    1456             :       this string, behaviour is undefined.
    1457             : 
    1458             :       @param     beginIndex   the beginning index, inclusive.
    1459             :       @return    the specified substring.
    1460             :     */
    1461      212713 :     SAL_WARN_UNUSED_RESULT OUString copy( sal_Int32 beginIndex ) const SAL_THROW(())
    1462             :     {
    1463      212713 :         rtl_uString *pNew = 0;
    1464      212713 :         rtl_uString_newFromSubString( &pNew, pData, beginIndex, getLength() - beginIndex );
    1465      212713 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1466             :     }
    1467             : 
    1468             :     /**
    1469             :       Returns a new string that is a substring of this string.
    1470             : 
    1471             :       The substring begins at the specified beginIndex and contains count
    1472             :       characters.  If either beginIndex or count are negative,
    1473             :       or beginIndex + count are greater than the length of this string
    1474             :       then behaviour is undefined.
    1475             : 
    1476             :       @param     beginIndex   the beginning index, inclusive.
    1477             :       @param     count        the number of characters.
    1478             :       @return    the specified substring.
    1479             :     */
    1480     2890665 :     SAL_WARN_UNUSED_RESULT OUString copy( sal_Int32 beginIndex, sal_Int32 count ) const SAL_THROW(())
    1481             :     {
    1482     2890665 :         rtl_uString *pNew = 0;
    1483     2890665 :         rtl_uString_newFromSubString( &pNew, pData, beginIndex, count );
    1484     2890665 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1485             :     }
    1486             : 
    1487             :     /**
    1488             :       Concatenates the specified string to the end of this string.
    1489             : 
    1490             :       @param    str   the string that is concatenated to the end
    1491             :                       of this string.
    1492             :       @return   a string that represents the concatenation of this string
    1493             :                 followed by the string argument.
    1494             :     */
    1495           0 :     SAL_WARN_UNUSED_RESULT OUString concat( const OUString & str ) const SAL_THROW(())
    1496             :     {
    1497           0 :         rtl_uString* pNew = 0;
    1498           0 :         rtl_uString_newConcat( &pNew, pData, str.pData );
    1499           0 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1500             :     }
    1501             : 
    1502             : #ifndef RTL_FAST_STRING
    1503             :     friend OUString operator+( const OUString& rStr1, const OUString& rStr2  ) SAL_THROW(())
    1504             :     {
    1505             :         return rStr1.concat( rStr2 );
    1506             :     }
    1507             : #endif
    1508             : 
    1509             :     /**
    1510             :       Returns a new string resulting from replacing n = count characters
    1511             :       from position index in this string with newStr.
    1512             : 
    1513             :       @param  index   the replacing index in str.
    1514             :                       The index must be greater than or equal to 0 and
    1515             :                       less than or equal to the length of the string.
    1516             :       @param  count   the count of characters that will be replaced
    1517             :                       The count must be greater than or equal to 0 and
    1518             :                       less than or equal to the length of the string minus index.
    1519             :       @param  newStr  the new substring.
    1520             :       @return the new string.
    1521             :     */
    1522           0 :     SAL_WARN_UNUSED_RESULT OUString replaceAt( sal_Int32 index, sal_Int32 count, const OUString& newStr ) const SAL_THROW(())
    1523             :     {
    1524           0 :         rtl_uString* pNew = 0;
    1525           0 :         rtl_uString_newReplaceStrAt( &pNew, pData, index, count, newStr.pData );
    1526           0 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1527             :     }
    1528             : 
    1529             :     /**
    1530             :       Returns a new string resulting from replacing all occurrences of
    1531             :       oldChar in this string with newChar.
    1532             : 
    1533             :       If the character oldChar does not occur in the character sequence
    1534             :       represented by this object, then the string is assigned with
    1535             :       str.
    1536             : 
    1537             :       @param    oldChar     the old character.
    1538             :       @param    newChar     the new character.
    1539             :       @return   a string derived from this string by replacing every
    1540             :                 occurrence of oldChar with newChar.
    1541             :     */
    1542           0 :     SAL_WARN_UNUSED_RESULT OUString replace( sal_Unicode oldChar, sal_Unicode newChar ) const SAL_THROW(())
    1543             :     {
    1544           0 :         rtl_uString* pNew = 0;
    1545           0 :         rtl_uString_newReplace( &pNew, pData, oldChar, newChar );
    1546           0 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1547             :     }
    1548             : 
    1549             :     /**
    1550             :       Returns a new string resulting from replacing the first occurrence of a
    1551             :       given substring with another substring.
    1552             : 
    1553             :       @param from  the substring to be replaced
    1554             : 
    1555             :       @param to  the replacing substring
    1556             : 
    1557             :       @param[in,out] index  pointer to a start index; if the pointer is
    1558             :       non-null: upon entry to the function, its value is the index into this
    1559             :       string at which to start searching for the \p from substring, the value
    1560             :       must be non-negative and not greater than this string's length; upon exiting
    1561             :       the function its value is the index into this string at which the
    1562             :       replacement took place or -1 if no replacement took place; if the pointer
    1563             :       is null, searching always starts at index 0
    1564             : 
    1565             :       @since LibreOffice 3.6
    1566             :     */
    1567           0 :     SAL_WARN_UNUSED_RESULT OUString replaceFirst(
    1568             :         OUString const & from, OUString const & to, sal_Int32 * index = 0) const
    1569             :     {
    1570           0 :         rtl_uString * s = 0;
    1571           0 :         sal_Int32 i = 0;
    1572             :         rtl_uString_newReplaceFirst(
    1573           0 :             &s, pData, from.pData, to.pData, index == 0 ? &i : index);
    1574           0 :         return OUString(s, SAL_NO_ACQUIRE);
    1575             :     }
    1576             : 
    1577             :     /**
    1578             :       Returns a new string resulting from replacing the first occurrence of a
    1579             :       given substring with another substring.
    1580             : 
    1581             :       @param from  ASCII string literal, the substring to be replaced
    1582             : 
    1583             :       @param to  the replacing substring
    1584             : 
    1585             :       @param[in,out] index  pointer to a start index; if the pointer is
    1586             :       non-null: upon entry to the function, its value is the index into the this
    1587             :       string at which to start searching for the \p from substring, the value
    1588             :       must be non-negative and not greater than this string's length; upon exiting
    1589             :       the function its value is the index into this string at which the
    1590             :       replacement took place or -1 if no replacement took place; if the pointer
    1591             :       is null, searching always starts at index 0
    1592             : 
    1593             :       @since LibreOffice 3.6
    1594             :     */
    1595             :     template< typename T >
    1596           0 :     SAL_WARN_UNUSED_RESULT typename internal::ConstCharArrayDetector< T, OUString >::Type replaceFirst( T& from, OUString const & to,
    1597             :                                                                                                         sal_Int32 * index = 0) const
    1598             :     {
    1599           0 :         rtl_uString * s = 0;
    1600           0 :         sal_Int32 i = 0;
    1601             :         assert( strlen( from ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1602           0 :         rtl_uString_newReplaceFirstAsciiL(
    1603           0 :             &s, pData, from, internal::ConstCharArrayDetector< T, void >::size - 1, to.pData, index == 0 ? &i : index);
    1604           0 :         return OUString(s, SAL_NO_ACQUIRE);
    1605             :     }
    1606             : 
    1607             :     /**
    1608             :       Returns a new string resulting from replacing the first occurrence of a
    1609             :       given substring with another substring.
    1610             : 
    1611             :       @param from  ASCII string literal, the substring to be replaced
    1612             : 
    1613             :       @param to  ASCII string literal, the substring to be replaced
    1614             : 
    1615             :       @param[in,out] index  pointer to a start index; if the pointer is
    1616             :       non-null: upon entry to the function, its value is the index into the this
    1617             :       string at which to start searching for the \p from substring, the value
    1618             :       must be non-negative and not greater than this string's length; upon exiting
    1619             :       the function its value is the index into this string at which the
    1620             :       replacement took place or -1 if no replacement took place; if the pointer
    1621             :       is null, searching always starts at index 0
    1622             : 
    1623             :       @since LibreOffice 3.6
    1624             :     */
    1625             :     template< typename T1, typename T2 >
    1626             :         SAL_WARN_UNUSED_RESULT typename internal::ConstCharArrayDetector< T1, typename internal::ConstCharArrayDetector< T2, OUString >::Type >::Type
    1627           0 :         replaceFirst( T1& from, T2& to, sal_Int32 * index = 0) const
    1628             :     {
    1629           0 :         rtl_uString * s = 0;
    1630           0 :         sal_Int32 i = 0;
    1631             :         assert( strlen( from ) == internal::ConstCharArrayDetector< T1 >::size - 1 );
    1632             :         assert( strlen( to ) == internal::ConstCharArrayDetector< T2 >::size - 1 );
    1633           0 :         rtl_uString_newReplaceFirstAsciiLAsciiL(
    1634             :             &s, pData, from, internal::ConstCharArrayDetector< T1, void >::size - 1, to,
    1635           0 :             internal::ConstCharArrayDetector< T2, void >::size - 1, index == 0 ? &i : index);
    1636           0 :         return OUString(s, SAL_NO_ACQUIRE);
    1637             :     }
    1638             : 
    1639             :     /**
    1640             :       Returns a new string resulting from replacing all occurrences of a given
    1641             :       substring with another substring.
    1642             : 
    1643             :       Replacing subsequent occurrences picks up only after a given replacement.
    1644             :       That is, replacing from "xa" to "xx" in "xaa" results in "xxa", not "xxx".
    1645             : 
    1646             :       @param from  the substring to be replaced
    1647             : 
    1648             :       @param to  the replacing substring
    1649             : 
    1650             :       @param fromIndex  the position in the string where we will begin searching
    1651             : 
    1652             :       @since LibreOffice 4.0
    1653             :     */
    1654           0 :     SAL_WARN_UNUSED_RESULT OUString replaceAll(
    1655             :         OUString const & from, OUString const & to, sal_Int32 fromIndex = 0) const
    1656             :     {
    1657           0 :         rtl_uString * s = 0;
    1658           0 :         rtl_uString_newReplaceAllFromIndex(&s, pData, from.pData, to.pData, fromIndex);
    1659           0 :         return OUString(s, SAL_NO_ACQUIRE);
    1660             :     }
    1661             : 
    1662             :     /**
    1663             :       Returns a new string resulting from replacing all occurrences of a given
    1664             :       substring with another substring.
    1665             : 
    1666             :       Replacing subsequent occurrences picks up only after a given replacement.
    1667             :       That is, replacing from "xa" to "xx" in "xaa" results in "xxa", not "xxx".
    1668             : 
    1669             :       @param from ASCII string literal, the substring to be replaced
    1670             : 
    1671             :       @param to  the replacing substring
    1672             : 
    1673             :       @since LibreOffice 3.6
    1674             :     */
    1675             :     template< typename T >
    1676           0 :     SAL_WARN_UNUSED_RESULT typename internal::ConstCharArrayDetector< T, OUString >::Type replaceAll( T& from, OUString const & to) const
    1677             :     {
    1678           0 :         rtl_uString * s = 0;
    1679             :         assert( strlen( from ) == internal::ConstCharArrayDetector< T >::size - 1 );
    1680           0 :         rtl_uString_newReplaceAllAsciiL(&s, pData, from, internal::ConstCharArrayDetector< T, void >::size - 1, to.pData);
    1681           0 :         return OUString(s, SAL_NO_ACQUIRE);
    1682             :     }
    1683             : 
    1684             :     /**
    1685             :       Returns a new string resulting from replacing all occurrences of a given
    1686             :       substring with another substring.
    1687             : 
    1688             :       Replacing subsequent occurrences picks up only after a given replacement.
    1689             :       That is, replacing from "xa" to "xx" in "xaa" results in "xxa", not "xxx".
    1690             : 
    1691             :       @param from  ASCII string literal, the substring to be replaced
    1692             : 
    1693             :       @param to  ASCII string literal, the substring to be replaced
    1694             : 
    1695             :       @since LibreOffice 3.6
    1696             :     */
    1697             :     template< typename T1, typename T2 >
    1698             :     SAL_WARN_UNUSED_RESULT typename internal::ConstCharArrayDetector< T1, typename internal::ConstCharArrayDetector< T2, OUString >::Type >::Type
    1699           0 :         replaceAll( T1& from, T2& to ) const
    1700             :     {
    1701           0 :         rtl_uString * s = 0;
    1702             :         assert( strlen( from ) == internal::ConstCharArrayDetector< T1 >::size - 1 );
    1703             :         assert( strlen( to ) == internal::ConstCharArrayDetector< T2 >::size - 1 );
    1704           0 :         rtl_uString_newReplaceAllAsciiLAsciiL(
    1705             :             &s, pData, from, internal::ConstCharArrayDetector< T1, void >::size - 1,
    1706           0 :             to, internal::ConstCharArrayDetector< T2, void >::size - 1);
    1707           0 :         return OUString(s, SAL_NO_ACQUIRE);
    1708             :     }
    1709             : 
    1710             :     /**
    1711             :       Converts from this string all ASCII uppercase characters (65-90)
    1712             :       to ASCII lowercase characters (97-122).
    1713             : 
    1714             :       This function can't be used for language specific conversion.
    1715             :       If the string doesn't contain characters which must be converted,
    1716             :       then the new string is assigned with str.
    1717             : 
    1718             :       @return   the string, converted to ASCII lowercase.
    1719             :     */
    1720           8 :     SAL_WARN_UNUSED_RESULT OUString toAsciiLowerCase() const SAL_THROW(())
    1721             :     {
    1722           8 :         rtl_uString* pNew = 0;
    1723           8 :         rtl_uString_newToAsciiLowerCase( &pNew, pData );
    1724           8 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1725             :     }
    1726             : 
    1727             :     /**
    1728             :       Converts from this string all ASCII lowercase characters (97-122)
    1729             :       to ASCII uppercase characters (65-90).
    1730             : 
    1731             :       This function can't be used for language specific conversion.
    1732             :       If the string doesn't contain characters which must be converted,
    1733             :       then the new string is assigned with str.
    1734             : 
    1735             :       @return   the string, converted to ASCII uppercase.
    1736             :     */
    1737           8 :     SAL_WARN_UNUSED_RESULT OUString toAsciiUpperCase() const SAL_THROW(())
    1738             :     {
    1739           8 :         rtl_uString* pNew = 0;
    1740           8 :         rtl_uString_newToAsciiUpperCase( &pNew, pData );
    1741           8 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1742             :     }
    1743             : 
    1744             :     /**
    1745             :       Returns a new string resulting from removing white space from both ends
    1746             :       of the string.
    1747             : 
    1748             :       All characters that have codes less than or equal to
    1749             :       32 (the space character) are considered to be white space.
    1750             :       If the string doesn't contain white spaces at both ends,
    1751             :       then the new string is assigned with str.
    1752             : 
    1753             :       @return   the string, with white space removed from the front and end.
    1754             :     */
    1755      340146 :     SAL_WARN_UNUSED_RESULT OUString trim() const SAL_THROW(())
    1756             :     {
    1757      340146 :         rtl_uString* pNew = 0;
    1758      340146 :         rtl_uString_newTrim( &pNew, pData );
    1759      340146 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1760             :     }
    1761             : 
    1762             :     /**
    1763             :       Returns a token in the string.
    1764             : 
    1765             :       Example:
    1766             :         sal_Int32 nIndex = 0;
    1767             :         do
    1768             :         {
    1769             :             ...
    1770             :             OUString aToken = aStr.getToken( 0, ';', nIndex );
    1771             :             ...
    1772             :         }
    1773             :         while ( nIndex >= 0 );
    1774             : 
    1775             :       @param    token       the number of the token to return
    1776             :       @param    cTok        the character which separate the tokens.
    1777             :       @param    index       the position at which the token is searched in the
    1778             :                             string.
    1779             :                             The index must not be greater than the length of the
    1780             :                             string.
    1781             :                             This param is set to the position of the
    1782             :                             next token or to -1, if it is the last token.
    1783             :       @return   the token; if either token or index is negative, an empty token
    1784             :                 is returned (and index is set to -1)
    1785             :     */
    1786      382633 :     OUString getToken( sal_Int32 token, sal_Unicode cTok, sal_Int32& index ) const SAL_THROW(())
    1787             :     {
    1788      382633 :         rtl_uString * pNew = 0;
    1789      382633 :         index = rtl_uString_getToken( &pNew, pData, token, cTok, index );
    1790      382633 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1791             :     }
    1792             : 
    1793             :     /**
    1794             :       Returns a token from the string.
    1795             : 
    1796             :       The same as getToken(sal_Int32, sal_Unicode, sal_Int32 &), but always
    1797             :       passing in 0 as the start index in the third argument.
    1798             : 
    1799             :       @param count  the number of the token to return, starting with 0
    1800             :       @param separator  the character which separates the tokens
    1801             : 
    1802             :       @return  the given token, or an empty string
    1803             : 
    1804             :       @since LibreOffice 3.6
    1805             :      */
    1806           0 :     OUString getToken(sal_Int32 count, sal_Unicode separator) const {
    1807           0 :         sal_Int32 n = 0;
    1808           0 :         return getToken(count, separator, n);
    1809             :     }
    1810             : 
    1811             :     /**
    1812             :       Returns the Boolean value from this string.
    1813             : 
    1814             :       This function can't be used for language specific conversion.
    1815             : 
    1816             :       @return   true, if the string is 1 or "True" in any ASCII case.
    1817             :                 false in any other case.
    1818             :     */
    1819           0 :     bool toBoolean() const SAL_THROW(())
    1820             :     {
    1821           0 :         return rtl_ustr_toBoolean( pData->buffer );
    1822             :     }
    1823             : 
    1824             :     /**
    1825             :       Returns the first character from this string.
    1826             : 
    1827             :       @return   the first character from this string or 0, if this string
    1828             :                 is emptry.
    1829             :     */
    1830           0 :     sal_Unicode toChar() const SAL_THROW(())
    1831             :     {
    1832           0 :         return pData->buffer[0];
    1833             :     }
    1834             : 
    1835             :     /**
    1836             :       Returns the int32 value from this string.
    1837             : 
    1838             :       This function can't be used for language specific conversion.
    1839             : 
    1840             :       @param    radix       the radix (between 2 and 36)
    1841             :       @return   the int32 represented from this string.
    1842             :                 0 if this string represents no number or one of too large
    1843             :                 magnitude.
    1844             :     */
    1845           0 :     sal_Int32 toInt32( sal_Int16 radix = 10 ) const SAL_THROW(())
    1846             :     {
    1847           0 :         return rtl_ustr_toInt32( pData->buffer, radix );
    1848             :     }
    1849             : 
    1850             :     /**
    1851             :       Returns the uint32 value from this string.
    1852             : 
    1853             :       This function can't be used for language specific conversion.
    1854             : 
    1855             :       @param    radix       the radix (between 2 and 36)
    1856             :       @return   the uint32 represented from this string.
    1857             :                 0 if this string represents no number or one of too large
    1858             :                 magnitude.
    1859             : 
    1860             :       @since LibreOffice 4.2
    1861             :     */
    1862           0 :     sal_uInt32 toUInt32( sal_Int16 radix = 10 ) const SAL_THROW(())
    1863             :     {
    1864           0 :         return rtl_ustr_toUInt32( pData->buffer, radix );
    1865             :     }
    1866             : 
    1867             :     /**
    1868             :       Returns the int64 value from this string.
    1869             : 
    1870             :       This function can't be used for language specific conversion.
    1871             : 
    1872             :       @param    radix       the radix (between 2 and 36)
    1873             :       @return   the int64 represented from this string.
    1874             :                 0 if this string represents no number or one of too large
    1875             :                 magnitude.
    1876             :     */
    1877      170016 :     sal_Int64 toInt64( sal_Int16 radix = 10 ) const SAL_THROW(())
    1878             :     {
    1879      170016 :         return rtl_ustr_toInt64( pData->buffer, radix );
    1880             :     }
    1881             : 
    1882             :     /**
    1883             :       Returns the uint64 value from this string.
    1884             : 
    1885             :       This function can't be used for language specific conversion.
    1886             : 
    1887             :       @param    radix       the radix (between 2 and 36)
    1888             :       @return   the uint64 represented from this string.
    1889             :                 0 if this string represents no number or one of too large
    1890             :                 magnitude.
    1891             : 
    1892             :       @since LibreOffice 4.1
    1893             :     */
    1894           0 :     sal_uInt64 toUInt64( sal_Int16 radix = 10 ) const SAL_THROW(())
    1895             :     {
    1896           0 :         return rtl_ustr_toUInt64( pData->buffer, radix );
    1897             :     }
    1898             : 
    1899             :     /**
    1900             :       Returns the float value from this string.
    1901             : 
    1902             :       This function can't be used for language specific conversion.
    1903             : 
    1904             :       @return   the float represented from this string.
    1905             :                 0.0 if this string represents no number.
    1906             :     */
    1907           0 :     float toFloat() const SAL_THROW(())
    1908             :     {
    1909           0 :         return rtl_ustr_toFloat( pData->buffer );
    1910             :     }
    1911             : 
    1912             :     /**
    1913             :       Returns the double value from this string.
    1914             : 
    1915             :       This function can't be used for language specific conversion.
    1916             : 
    1917             :       @return   the double represented from this string.
    1918             :                 0.0 if this string represents no number.
    1919             :     */
    1920           0 :     double toDouble() const SAL_THROW(())
    1921             :     {
    1922           0 :         return rtl_ustr_toDouble( pData->buffer );
    1923             :     }
    1924             : 
    1925             : 
    1926             :     /**
    1927             :        Return a canonical representation for a string.
    1928             : 
    1929             :        A pool of strings, initially empty is maintained privately
    1930             :        by the string class. On invocation, if present in the pool
    1931             :        the original string will be returned. Otherwise this string,
    1932             :        or a copy thereof will be added to the pool and returned.
    1933             : 
    1934             :        @return
    1935             :        a version of the string from the pool.
    1936             : 
    1937             :        @exception std::bad_alloc is thrown if an out-of-memory condition occurs
    1938             : 
    1939             :        @since UDK 3.2.7
    1940             :     */
    1941           0 :     OUString intern() const
    1942             :     {
    1943           0 :         rtl_uString * pNew = 0;
    1944           0 :         rtl_uString_intern( &pNew, pData );
    1945           0 :         if (pNew == 0) {
    1946           0 :             throw std::bad_alloc();
    1947             :         }
    1948           0 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1949             :     }
    1950             : 
    1951             :     /**
    1952             :        Return a canonical representation for a converted string.
    1953             : 
    1954             :        A pool of strings, initially empty is maintained privately
    1955             :        by the string class. On invocation, if present in the pool
    1956             :        the original string will be returned. Otherwise this string,
    1957             :        or a copy thereof will be added to the pool and returned.
    1958             : 
    1959             :        @param    value           a 8-Bit character array.
    1960             :        @param    length          the number of character which should be converted.
    1961             :                                  The 8-Bit character array length must be
    1962             :                                  greater than or equal to this value.
    1963             :        @param    encoding        the text encoding from which the 8-Bit character
    1964             :                                  sequence should be converted.
    1965             :        @param    convertFlags    flags which controls the conversion.
    1966             :                                  see RTL_TEXTTOUNICODE_FLAGS_...
    1967             :        @param    pInfo           pointer to return conversion status or NULL.
    1968             : 
    1969             :        @return
    1970             :        a version of the converted string from the pool.
    1971             : 
    1972             :        @exception std::bad_alloc is thrown if an out-of-memory condition occurs
    1973             : 
    1974             :        @since UDK 3.2.7
    1975             :     */
    1976           0 :     static OUString intern( const sal_Char * value, sal_Int32 length,
    1977             :                             rtl_TextEncoding encoding,
    1978             :                             sal_uInt32 convertFlags = OSTRING_TO_OUSTRING_CVTFLAGS,
    1979             :                             sal_uInt32 *pInfo = NULL )
    1980             :     {
    1981           0 :         rtl_uString * pNew = 0;
    1982             :         rtl_uString_internConvert( &pNew, value, length, encoding,
    1983           0 :                                    convertFlags, pInfo );
    1984           0 :         if (pNew == 0) {
    1985           0 :             throw std::bad_alloc();
    1986             :         }
    1987           0 :         return OUString( pNew, SAL_NO_ACQUIRE );
    1988             :     }
    1989             : 
    1990             :     /**
    1991             :       Converts to an OString, signalling failure.
    1992             : 
    1993             :       @param pTarget
    1994             :       An out parameter receiving the converted OString.  Must not be null; the
    1995             :       contents are not modified if conversion fails (convertToOString returns
    1996             :       false).
    1997             : 
    1998             :       @param nEncoding
    1999             :       The text encoding to convert into.  Must be an octet encoding (i.e.,
    2000             :       rtl_isOctetTextEncoding(nEncoding) must return true).
    2001             : 
    2002             :       @param nFlags
    2003             :       A combination of RTL_UNICODETOTEXT_FLAGS that detail how to do the
    2004             :       conversion (see rtl_convertUnicodeToText).  RTL_UNICODETOTEXT_FLAGS_FLUSH
    2005             :       need not be included, it is implicitly assumed.  Typical uses are either
    2006             :       RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
    2007             :       RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR (fail if a Unicode character cannot
    2008             :       be converted to the target nEncoding) or OUSTRING_TO_OSTRING_CVTFLAGS
    2009             :       (make a best efforts conversion).
    2010             : 
    2011             :       @return
    2012             :       True if the conversion succeeded, false otherwise.
    2013             :      */
    2014           4 :     inline bool convertToString(OString * pTarget, rtl_TextEncoding nEncoding,
    2015             :                                 sal_uInt32 nFlags) const
    2016             :     {
    2017             :         return rtl_convertUStringToString(&pTarget->pData, pData->buffer,
    2018           4 :                                             pData->length, nEncoding, nFlags);
    2019             :     }
    2020             : 
    2021             :     /** Iterate through this string based on code points instead of UTF-16 code
    2022             :         units.
    2023             : 
    2024             :         See Chapter 3 of The Unicode Standard 5.0 (Addison--Wesley, 2006) for
    2025             :         definitions of the various terms used in this description.
    2026             : 
    2027             :         This string is interpreted as a sequence of zero or more UTF-16 code
    2028             :         units.  For each index into this sequence (from zero to one less than
    2029             :         the length of the sequence, inclusive), a code point represented
    2030             :         starting at the given index is computed as follows:
    2031             : 
    2032             :         - If the UTF-16 code unit addressed by the index constitutes a
    2033             :         well-formed UTF-16 code unit sequence, the computed code point is the
    2034             :         scalar value encoded by that UTF-16 code unit sequence.
    2035             : 
    2036             :         - Otherwise, if the index is at least two UTF-16 code units away from
    2037             :         the end of the sequence, and the sequence of two UTF-16 code units
    2038             :         addressed by the index constitutes a well-formed UTF-16 code unit
    2039             :         sequence, the computed code point is the scalar value encoded by that
    2040             :         UTF-16 code unit sequence.
    2041             : 
    2042             :         - Otherwise, the computed code point is the UTF-16 code unit addressed
    2043             :         by the index.  (This last case catches unmatched surrogates as well as
    2044             :         indices pointing into the middle of surrogate pairs.)
    2045             : 
    2046             :         @param indexUtf16
    2047             :         pointer to a UTF-16 based index into this string; must not be null.  On
    2048             :         entry, the index must be in the range from zero to the length of this
    2049             :         string (in UTF-16 code units), inclusive.  Upon successful return, the
    2050             :         index will be updated to address the UTF-16 code unit that is the given
    2051             :         incrementCodePoints away from the initial index.
    2052             : 
    2053             :         @param incrementCodePoints
    2054             :         the number of code points to move the given *indexUtf16.  If
    2055             :         non-negative, moving is done after determining the code point at the
    2056             :         index.  If negative, moving is done before determining the code point
    2057             :         at the (then updated) index.  The value must be such that the resulting
    2058             :         UTF-16 based index is in the range from zero to the length of this
    2059             :         string (in UTF-16 code units), inclusive.
    2060             : 
    2061             :         @return
    2062             :         the code point (an integer in the range from 0 to 0x10FFFF, inclusive)
    2063             :         that is represented within this string starting at the index computed as
    2064             :         follows:  If incrementCodePoints is non-negative, the index is the
    2065             :         initial value of *indexUtf16; if incrementCodePoints is negative, the
    2066             :         index is the updated value of *indexUtf16.  In either case, the computed
    2067             :         index must be in the range from zero to one less than the length of this
    2068             :         string (in UTF-16 code units), inclusive.
    2069             : 
    2070             :         @since UDK 3.2.7
    2071             :     */
    2072           0 :     inline sal_uInt32 iterateCodePoints(
    2073             :         sal_Int32 * indexUtf16, sal_Int32 incrementCodePoints = 1) const
    2074             :     {
    2075             :         return rtl_uString_iterateCodePoints(
    2076           0 :             pData, indexUtf16, incrementCodePoints);
    2077             :     }
    2078             : 
    2079             :     /**
    2080             :       Returns the string representation of the integer argument.
    2081             : 
    2082             :       This function can't be used for language specific conversion.
    2083             : 
    2084             :       @param    i           an integer value
    2085             :       @param    radix       the radix (between 2 and 36)
    2086             :       @return   a string with the string representation of the argument.
    2087             :       @since LibreOffice 4.1
    2088             :     */
    2089       42505 :     static OUString number( int i, sal_Int16 radix = 10 )
    2090             :     {
    2091             :         sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFINT32];
    2092       42505 :         rtl_uString* pNewData = 0;
    2093       42505 :         rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfInt32( aBuf, i, radix ) );
    2094       42505 :         return OUString( pNewData, SAL_NO_ACQUIRE );
    2095             :     }
    2096             :     /// @overload
    2097             :     /// @since LibreOffice 4.1
    2098           0 :     static OUString number( unsigned int i, sal_Int16 radix = 10 )
    2099             :     {
    2100           0 :         return number( static_cast< unsigned long long >( i ), radix );
    2101             :     }
    2102             :     /// @overload
    2103             :     /// @since LibreOffice 4.1
    2104          22 :     static OUString number( long i, sal_Int16 radix = 10)
    2105             :     {
    2106          22 :         return number( static_cast< long long >( i ), radix );
    2107             :     }
    2108             :     /// @overload
    2109             :     /// @since LibreOffice 4.1
    2110           0 :     static OUString number( unsigned long i, sal_Int16 radix = 10 )
    2111             :     {
    2112           0 :         return number( static_cast< unsigned long long >( i ), radix );
    2113             :     }
    2114             :     /// @overload
    2115             :     /// @since LibreOffice 4.1
    2116          22 :     static OUString number( long long ll, sal_Int16 radix = 10 )
    2117             :     {
    2118             :         sal_Unicode aBuf[RTL_STR_MAX_VALUEOFINT64];
    2119          22 :         rtl_uString* pNewData = 0;
    2120          22 :         rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfInt64( aBuf, ll, radix ) );
    2121          22 :         return OUString( pNewData, SAL_NO_ACQUIRE );
    2122             :     }
    2123             :     /// @overload
    2124             :     /// @since LibreOffice 4.1
    2125           2 :     static OUString number( unsigned long long ll, sal_Int16 radix = 10 )
    2126             :     {
    2127             :         sal_Unicode aBuf[RTL_STR_MAX_VALUEOFUINT64];
    2128           2 :         rtl_uString* pNewData = 0;
    2129           2 :         rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfUInt64( aBuf, ll, radix ) );
    2130           2 :         return OUString( pNewData, SAL_NO_ACQUIRE );
    2131             :     }
    2132             : 
    2133             :     /**
    2134             :       Returns the string representation of the float argument.
    2135             : 
    2136             :       This function can't be used for language specific conversion.
    2137             : 
    2138             :       @param    f           a float.
    2139             :       @return   a string with the string representation of the argument.
    2140             :       @since LibreOffice 4.1
    2141             :     */
    2142           0 :     static OUString number( float f )
    2143             :     {
    2144             :         sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFFLOAT];
    2145           0 :         rtl_uString* pNewData = 0;
    2146           0 :         rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfFloat( aBuf, f ) );
    2147           0 :         return OUString( pNewData, SAL_NO_ACQUIRE );
    2148             :     }
    2149             : 
    2150             :     /**
    2151             :       Returns the string representation of the double argument.
    2152             : 
    2153             :       This function can't be used for language specific conversion.
    2154             : 
    2155             :       @param    d           a double.
    2156             :       @return   a string with the string representation of the argument.
    2157             :       @since LibreOffice 4.1
    2158             :     */
    2159           0 :     static OUString number( double d )
    2160             :     {
    2161             :         sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFDOUBLE];
    2162           0 :         rtl_uString* pNewData = 0;
    2163           0 :         rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfDouble( aBuf, d ) );
    2164           0 :         return OUString( pNewData, SAL_NO_ACQUIRE );
    2165             :     }
    2166             : 
    2167             :     /**
    2168             :       Returns the string representation of the sal_Bool argument.
    2169             : 
    2170             :       If the sal_Bool is true, the string "true" is returned.
    2171             :       If the sal_Bool is false, the string "false" is returned.
    2172             :       This function can't be used for language specific conversion.
    2173             : 
    2174             :       @param    b   a sal_Bool.
    2175             :       @return   a string with the string representation of the argument.
    2176             :       @deprecated use boolean()
    2177             :     */
    2178             :     SAL_DEPRECATED("use boolean()") static OUString valueOf( sal_Bool b ) SAL_THROW(())
    2179             :     {
    2180             :         return boolean(b);
    2181             :     }
    2182             : 
    2183             :     /**
    2184             :       Returns the string representation of the boolean argument.
    2185             : 
    2186             :       If the argument is true, the string "true" is returned.
    2187             :       If the argument is false, the string "false" is returned.
    2188             :       This function can't be used for language specific conversion.
    2189             : 
    2190             :       @param    b   a bool.
    2191             :       @return   a string with the string representation of the argument.
    2192             :       @since LibreOffice 4.1
    2193             :     */
    2194           0 :     static OUString boolean( bool b ) SAL_THROW(())
    2195             :     {
    2196             :         sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFBOOLEAN];
    2197           0 :         rtl_uString* pNewData = 0;
    2198           0 :         rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfBoolean( aBuf, b ) );
    2199           0 :         return OUString( pNewData, SAL_NO_ACQUIRE );
    2200             :     }
    2201             : 
    2202             :     /**
    2203             :       Returns the string representation of the char argument.
    2204             : 
    2205             :       @param    c   a character.
    2206             :       @return   a string with the string representation of the argument.
    2207             :       @deprecated use operator, function or constructor taking char or sal_Unicode argument
    2208             :     */
    2209             :     SAL_DEPRECATED("convert to OUString or use directly") static OUString valueOf( sal_Unicode c ) SAL_THROW(())
    2210             :     {
    2211             :         return OUString( &c, 1 );
    2212             :     }
    2213             : 
    2214             :     /**
    2215             :       Returns the string representation of the int argument.
    2216             : 
    2217             :       This function can't be used for language specific conversion.
    2218             : 
    2219             :       @param    i           a int32.
    2220             :       @param    radix       the radix (between 2 and 36)
    2221             :       @return   a string with the string representation of the argument.
    2222             :       @deprecated use number()
    2223             :     */
    2224             :     SAL_DEPRECATED("use number()") static OUString valueOf( sal_Int32 i, sal_Int16 radix = 10 ) SAL_THROW(())
    2225             :     {
    2226             :         return number( i, radix );
    2227             :     }
    2228             : 
    2229             :     /**
    2230             :       Returns the string representation of the long argument.
    2231             : 
    2232             :       This function can't be used for language specific conversion.
    2233             : 
    2234             :       @param    ll          a int64.
    2235             :       @param    radix       the radix (between 2 and 36)
    2236             :       @return   a string with the string representation of the argument.
    2237             :       @deprecated use number()
    2238             :     */
    2239             :     SAL_DEPRECATED("use number()") static OUString valueOf( sal_Int64 ll, sal_Int16 radix = 10 ) SAL_THROW(())
    2240             :     {
    2241             :         return number( ll, radix );
    2242             :     }
    2243             : 
    2244             :     /**
    2245             :       Returns the string representation of the float argument.
    2246             : 
    2247             :       This function can't be used for language specific conversion.
    2248             : 
    2249             :       @param    f           a float.
    2250             :       @return   a string with the string representation of the argument.
    2251             :       @deprecated use number()
    2252             :     */
    2253             :     SAL_DEPRECATED("use number()") static OUString valueOf( float f ) SAL_THROW(())
    2254             :     {
    2255             :         return number(f);
    2256             :     }
    2257             : 
    2258             :     /**
    2259             :       Returns the string representation of the double argument.
    2260             : 
    2261             :       This function can't be used for language specific conversion.
    2262             : 
    2263             :       @param    d           a double.
    2264             :       @return   a string with the string representation of the argument.
    2265             :       @deprecated use number()
    2266             :     */
    2267             :     SAL_DEPRECATED("use number()") static OUString valueOf( double d ) SAL_THROW(())
    2268             :     {
    2269             :         return number(d);
    2270             :     }
    2271             : 
    2272             :     /**
    2273             :       Returns a OUString copied without conversion from an ASCII
    2274             :       character string.
    2275             : 
    2276             :       Since this method is optimized for performance, the ASCII character
    2277             :       values are not converted in any way. The caller has to make sure that
    2278             :       all ASCII characters are in the allowed range between 0 and
    2279             :       127. The ASCII string must be NULL-terminated.
    2280             : 
    2281             :       Note that for string literals it is simpler and more efficient
    2282             :       to directly use the OUString constructor.
    2283             : 
    2284             :       @param    value       the 8-Bit ASCII character string
    2285             :       @return   a string with the string representation of the argument.
    2286             :      */
    2287          53 :     static OUString createFromAscii( const sal_Char * value ) SAL_THROW(())
    2288             :     {
    2289          53 :         rtl_uString* pNew = 0;
    2290          53 :         rtl_uString_newFromAscii( &pNew, value );
    2291          53 :         return OUString( pNew, SAL_NO_ACQUIRE );
    2292             :     }
    2293             : };
    2294             : 
    2295             : /* ======================================================================= */
    2296             : 
    2297             : #ifdef RTL_FAST_STRING
    2298             : /**
    2299             : A simple wrapper around string literal. It is usually not necessary to use, can
    2300             : be mostly used to force OUString operator+ working with operands that otherwise would
    2301             : not trigger it.
    2302             : 
    2303             : This class is not part of public API and is meant to be used only in LibreOffice code.
    2304             : @since LibreOffice 4.0
    2305             : */
    2306             : struct SAL_WARN_UNUSED OUStringLiteral
    2307             : {
    2308             :     template< int N >
    2309             :     OUStringLiteral( const char (&str)[ N ] ) : size( N - 1 ), data( str ) { assert( strlen( str ) == N - 1 ); }
    2310             :     int size;
    2311             :     const char* data;
    2312             : };
    2313             : 
    2314             : /**
    2315             :  @internal
    2316             : */
    2317             : template<>
    2318             : struct ToStringHelper< OUString >
    2319             :     {
    2320      132761 :     static int length( const OUString& s ) { return s.getLength(); }
    2321      132761 :     static sal_Unicode* addData( sal_Unicode* buffer, const OUString& s ) { return addDataHelper( buffer, s.getStr(), s.getLength()); }
    2322             :     static const bool allowOStringConcat = false;
    2323             :     static const bool allowOUStringConcat = true;
    2324             :     };
    2325             : 
    2326             : /**
    2327             :  @internal
    2328             : */
    2329             : template<>
    2330             : struct ToStringHelper< OUStringLiteral >
    2331             :     {
    2332             :     static int length( const OUStringLiteral& str ) { return str.size; }
    2333             :     static sal_Unicode* addData( sal_Unicode* buffer, const OUStringLiteral& str ) { return addDataLiteral( buffer, str.data, str.size ); }
    2334             :     static const bool allowOStringConcat = false;
    2335             :     static const bool allowOUStringConcat = true;
    2336             :     };
    2337             : 
    2338             : /**
    2339             :  @internal
    2340             : */
    2341             : template< typename charT, typename traits, typename T1, typename T2 >
    2342             : inline std::basic_ostream<charT, traits> & operator <<(
    2343             :     std::basic_ostream<charT, traits> & stream, const OUStringConcat< T1, T2 >& concat)
    2344             : {
    2345             :     return stream << OUString( concat );
    2346             : }
    2347             : #else
    2348             : // non-RTL_FAST_STRING needs this to compile
    2349             : /// @cond INTERNAL
    2350             : typedef OUString OUStringLiteral;
    2351             : /// @endcond
    2352             : #endif
    2353             : 
    2354             : /** A helper to use OUStrings with hash maps.
    2355             : 
    2356             :     Instances of this class are unary function objects that can be used as
    2357             :     hash function arguments to boost::unordered_map and similar constructs.
    2358             :  */
    2359             : struct OUStringHash
    2360             : {
    2361             :     /** Compute a hash code for a string.
    2362             : 
    2363             :         @param rString
    2364             :         a string.
    2365             : 
    2366             :         @return
    2367             :         a hash code for the string.  This hash code should not be stored
    2368             :         persistently, as its computation may change in later revisions.
    2369             :      */
    2370     1147735 :     size_t operator()(const OUString& rString) const
    2371     1147735 :         { return (size_t)rString.hashCode(); }
    2372             : };
    2373             : 
    2374             : /* ======================================================================= */
    2375             : 
    2376             : /** Convert an OString to an OUString, using a specific text encoding.
    2377             : 
    2378             :     The lengths of the two strings may differ (e.g., for double-byte
    2379             :     encodings, UTF-7, UTF-8).
    2380             : 
    2381             :     @param rStr
    2382             :     an OString to convert.
    2383             : 
    2384             :     @param encoding
    2385             :     the text encoding to use for conversion.
    2386             : 
    2387             :     @param convertFlags
    2388             :     flags which control the conversion.  Either use
    2389             :     OSTRING_TO_OUSTRING_CVTFLAGS, or see
    2390             :     <http://udk.openoffice.org/cpp/man/spec/textconversion.html> for more
    2391             :     details.
    2392             :  */
    2393     4038158 : inline OUString OStringToOUString( const OString & rStr,
    2394             :                                    rtl_TextEncoding encoding,
    2395             :                                    sal_uInt32 convertFlags = OSTRING_TO_OUSTRING_CVTFLAGS )
    2396             : {
    2397     4038158 :     return OUString( rStr.getStr(), rStr.getLength(), encoding, convertFlags );
    2398             : }
    2399             : 
    2400             : /** Convert an OUString to an OString, using a specific text encoding.
    2401             : 
    2402             :     The lengths of the two strings may differ (e.g., for double-byte
    2403             :     encodings, UTF-7, UTF-8).
    2404             : 
    2405             :     @param rUnicode
    2406             :     an OUString to convert.
    2407             : 
    2408             :     @param encoding
    2409             :     the text encoding to use for conversion.
    2410             : 
    2411             :     @param convertFlags
    2412             :     flags which control the conversion.  Either use
    2413             :     OUSTRING_TO_OSTRING_CVTFLAGS, or see
    2414             :     <http://udk.openoffice.org/cpp/man/spec/textconversion.html> for more
    2415             :     details.
    2416             :  */
    2417     1872179 : inline OString OUStringToOString( const OUString & rUnicode,
    2418             :                                   rtl_TextEncoding encoding,
    2419             :                                   sal_uInt32 convertFlags = OUSTRING_TO_OSTRING_CVTFLAGS )
    2420             : {
    2421     1872179 :     return OString( rUnicode.getStr(), rUnicode.getLength(), encoding, convertFlags );
    2422             : }
    2423             : 
    2424             : /* ======================================================================= */
    2425             : 
    2426             : /**
    2427             :     Support for rtl::OUString in std::ostream (and thus in
    2428             :     CPPUNIT_ASSERT or SAL_INFO macros, for example).
    2429             : 
    2430             :     The rtl::OUString is converted to UTF-8.
    2431             : 
    2432             :     @since LibreOffice 3.5.
    2433             : */
    2434             : template< typename charT, typename traits >
    2435           0 : inline std::basic_ostream<charT, traits> & operator <<(
    2436             :     std::basic_ostream<charT, traits> & stream, OUString const & string)
    2437             : {
    2438           0 :     return stream <<
    2439           0 :         OUStringToOString(string, RTL_TEXTENCODING_UTF8).getStr();
    2440             :         // best effort; potentially loses data due to conversion failures
    2441             :         // (stray surrogate halves) and embedded null characters
    2442             : }
    2443             : 
    2444             : } // namespace
    2445             : 
    2446             : #ifdef RTL_STRING_UNITTEST
    2447             : namespace rtl
    2448             : {
    2449             : typedef rtlunittest::OUString OUString;
    2450             : }
    2451             : #endif
    2452             : 
    2453             : // RTL_USING is defined by gbuild for all modules except those with stable public API
    2454             : // (as listed in ure/source/README). It allows to use classes like OUString without
    2455             : // having to explicitly refer to the rtl namespace, which is kind of superfluous
    2456             : // given that OUString itself is namespaced by its OU prefix.
    2457             : #ifdef RTL_USING
    2458             : using ::rtl::OUString;
    2459             : using ::rtl::OUStringHash;
    2460             : using ::rtl::OStringToOUString;
    2461             : using ::rtl::OUStringToOString;
    2462             : using ::rtl::OUStringLiteral;
    2463             : #endif
    2464             : 
    2465             : #endif /* _RTL_USTRING_HXX */
    2466             : 
    2467             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10