20 #ifndef _RTL_USTRBUF_HXX_
21 #define _RTL_USTRBUF_HXX_
33 #ifdef RTL_FAST_STRING
42 #ifdef RTL_STRING_UNITTEST
43 #define rtl rtlunittest
49 #ifdef RTL_STRING_UNITTEST
113 , nCapacity( value.nCapacity )
126 , nCapacity( length )
143 , nCapacity( value.getLength() + 16 )
148 #ifdef HAVE_SFINAE_ANONYMOUS_BROKEN // see OUString ctors
152 , nCapacity( N - 1 + 16 )
154 assert( strlen( literal ) == N - 1 );
156 #ifdef RTL_STRING_UNITTEST
157 rtl_string_unittest_const_literal =
true;
166 OUStringBuffer(
char (&value)[ N ] )
167 #ifndef RTL_STRING_UNITTEST
175 rtl_string_unittest_invalid_conversion =
true;
178 #else // HAVE_SFINAE_ANONYMOUS_BROKEN
179 template<
typename T >
182 , nCapacity( internal::ConstCharArrayDetector< T, void >::size - 1 + 16 )
186 #ifdef RTL_STRING_UNITTEST
187 rtl_string_unittest_const_literal =
true;
190 #endif // HAVE_SFINAE_ANONYMOUS_BROKEN
192 #ifdef RTL_STRING_UNITTEST
197 template<
typename T >
203 rtl_string_unittest_invalid_conversion =
true;
209 template<
typename T >
210 OUStringBuffer(
const T&,
typename internal::ExceptCharArrayDetector< T >::Type = internal::Dummy() )
215 rtl_string_unittest_invalid_conversion =
true;
219 #ifdef RTL_FAST_STRING
220 template<
typename T1,
typename T2 >
221 OUStringBuffer(
const OUStringConcat< T1, T2 >& c )
223 const sal_Int32 l = c.length();
224 rtl_uString* buffer = NULL;
229 buffer->length = end - buffer->buffer;
236 OUStringBuffer& operator = (
const OUStringBuffer& value )
243 nCapacity = value.nCapacity;
276 sal_Int32 getLength()
const
278 return pData->length;
291 sal_Int32 getCapacity()
const
307 void ensureCapacity(sal_Int32 minimumCapacity)
330 void setLength(sal_Int32 newLength)
332 assert(newLength >= 0);
334 if( newLength != pData->length )
336 if( newLength > nCapacity )
339 pData->buffer[newLength] = 0;
340 pData->length = newLength;
360 assert(index >= 0 && index < pData->length);
361 return pData->buffer[ index ];
377 assert(index >= 0 && index < pData->length);
378 pData->buffer[ index ] = ch;
396 sal_Unicode & operator [](sal_Int32 index) {
return pData->buffer[index]; }
404 return OUString(pData->buffer, pData->length);
434 OUStringBuffer & append(
const OUStringBuffer &str)
484 template<
typename T >
509 OUStringBuffer & appendAscii(
const sal_Char * str )
532 OUStringBuffer & appendAscii(
const sal_Char * str, sal_Int32 len)
567 OUStringBuffer & append(
char c)
569 assert(static_cast< unsigned char >(c) <= 0x7F);
585 return append( &c, 1 );
599 OUStringBuffer & append(sal_Int32 i, sal_Int16 radix = 10 )
616 OUStringBuffer & append(sal_Int64 l, sal_Int16 radix = 10 )
633 OUStringBuffer & append(
float f)
650 OUStringBuffer & append(
double d)
670 return insertUtf32(getLength(), c);
688 OUStringBuffer & insert(sal_Int32 offset,
const OUString & str)
710 OUStringBuffer & insert( sal_Int32 offset,
const sal_Unicode * str )
733 OUStringBuffer & insert( sal_Int32 offset,
const sal_Unicode * str, sal_Int32 len)
745 template<
typename T >
771 OUStringBuffer & insert(sal_Int32 offset,
sal_Bool b)
795 OUStringBuffer & insert(sal_Int32 offset,
char c)
798 return insert( offset, &u, 1 );
819 return insert( offset, &c, 1 );
841 OUStringBuffer & insert(sal_Int32 offset, sal_Int32 i, sal_Int16 radix = 10 )
866 OUStringBuffer & insert(sal_Int32 offset, sal_Int64 l, sal_Int16 radix = 10 )
890 OUStringBuffer insert(sal_Int32 offset,
float f)
914 OUStringBuffer & insert(sal_Int32 offset,
double d)
952 OUStringBuffer &
remove( sal_Int32 start, sal_Int32 len )
968 OUStringBuffer & truncate( sal_Int32 start = 0 )
987 while((index = indexOf(oldChar, index)) >= 0)
989 pData->buffer[ index ] = newChar;
1009 inline void accessInternals(rtl_uString *** pInternalData,
1010 sal_Int32 ** pInternalCapacity)
1012 *pInternalData = &pData;
1013 *pInternalCapacity = &nCapacity;
1035 return (ret < 0 ? ret : ret+fromIndex);
1093 str.pData->buffer, str.pData->length );
1094 return (ret < 0 ? ret : ret+fromIndex);
1103 template<
typename T >
1108 pData->buffer + fromIndex, pData->length - fromIndex, literal,
1110 return ret < 0 ? ret : ret + fromIndex;
1133 str.pData->buffer, str.pData->length );
1158 str.pData->buffer, str.pData->length );
1166 template<
typename T >
1186 for(index = 0; index < getLength() ; index++)
1188 if(pData->buffer[ index ] != c)
1211 sal_Int32 result = getLength();
1213 for(index = getLength(); index > 0 ; index--)
1215 if(pData->buffer[ index - 1 ] != c)
1220 if(index < getLength())
1224 return result - getLength();
1237 return stripStart(c) + stripEnd(c);
1244 rtl_uString * pData;
1249 sal_Int32 nCapacity;
1252 #ifdef RTL_FAST_STRING
1254 struct ToStringHelper< OUStringBuffer >
1256 static int length(
const OUStringBuffer& s ) {
return s.getLength(); }
1257 static sal_Unicode* addData(
sal_Unicode* buffer,
const OUStringBuffer& s ) {
return addDataHelper( buffer, s.getStr(), s.getLength()); }
1258 static const bool allowOStringConcat =
false;
1259 static const bool allowOUStringConcat =
true;
1265 #ifdef RTL_STRING_UNITTEST
1268 typedef rtlunittest::OUStringBuffer OUStringBuffer;
1273 using ::rtl::OUStringBuffer;