include/rtl/strbuf.hxx | 75 ++++++++++++---------------------- include/rtl/ustrbuf.hxx | 103 ++++++++++++++---------------------------------- sal/rtl/strtmpl.hxx | 12 ----- 3 files changed, 59 insertions(+), 131 deletions(-)
New commits: commit 1db728a70cd2378bfd31c5ea76facd223175f823 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri May 5 20:54:37 2023 +0200 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Sat May 6 07:24:52 2023 +0200 Simplify a bit No need to use different temporary objects here Change-Id: I1b47cae8b80adea5426c780003bddf68310a0060 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151380 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sal/rtl/strtmpl.hxx b/sal/rtl/strtmpl.hxx index aa126faac1e8..ba182f87817e 100644 --- a/sal/rtl/strtmpl.hxx +++ b/sal/rtl/strtmpl.hxx @@ -724,16 +724,6 @@ template <typename T, class S> T toInt(S str, sal_Int16 nRadix) /* ======================================================================= */ template <class rtl_tString> using Char_T = std::remove_extent_t<decltype(rtl_tString::buffer)>; -template <typename C> struct STRINGDATA_; -template <> struct STRINGDATA_<char> -{ - using T = rtl_String; -}; -template <> struct STRINGDATA_<sal_Unicode> -{ - using T = rtl_uString; -}; -template <typename C> using STRINGDATA = typename STRINGDATA_<C>::T; template <typename rtl_tString> rtl_tString* Alloc(sal_Int32 nLen) { @@ -1756,7 +1746,7 @@ void doubleToString(rtl_tString** pResult, sal_Int32* pResultCapacity, sal_Int32 template <sal_Int32 maxLen, typename C, typename T> sal_Int32 SAL_CALL valueOfFP(C* pStr, T f) { assert(pStr); - STRINGDATA<C>* pResult = nullptr; + rtl_String* pResult = nullptr; doubleToString(&pResult, nullptr, 0, f, rtl_math_StringFormat_G, maxLen - std::size("-x.E-xxx") + 1, '.', nullptr, 0, true); const sal_Int32 nLen = pResult->length; commit e15e809e331e9fdb7a7ed46937f2ad5f83e27dc5 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri May 5 16:18:28 2023 +0200 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Sat May 6 07:24:47 2023 +0200 Simplify O(U)StringBuffer's append - delegate to insert This limits the number of places that know how to deal with a given type. O(U)StringNumber doesn't need an own overload, because it has operator basic_string_view. Change-Id: I6e82dc2cef103b578153fbc3ce16e96247ea9d74 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151379 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/include/rtl/strbuf.hxx b/include/rtl/strbuf.hxx index cb842bb5839e..780923ebf67b 100644 --- a/include/rtl/strbuf.hxx +++ b/include/rtl/strbuf.hxx @@ -348,8 +348,7 @@ public: template<std::size_t N> OStringBuffer & operator =(OStringNumber<N> && n) { - *this = OStringBuffer( std::move ( n )); - return *this; + return operator =(std::string_view(n)); } #endif @@ -543,7 +542,7 @@ public: */ OStringBuffer & append(const OString &str) { - return append( str.getStr(), str.getLength() ); + return insert(getLength(), str); } #endif @@ -561,13 +560,13 @@ public: template< typename T > typename libreoffice_internal::CharPtrDetector< T, OStringBuffer& >::Type append( const T& str ) { - return append( str, rtl_str_getLength( str ) ); + return insert(getLength(), str); } template< typename T > typename libreoffice_internal::NonConstCharArrayDetector< T, OStringBuffer& >::Type append( T& str ) { - return append( str, rtl_str_getLength( str ) ); + return insert(getLength(), str); } /** @@ -578,12 +577,7 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, OStringBuffer& >::Type append( T& literal ) { - RTL_STRING_CONST_FUNCTION - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - return append( - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + return insert(getLength(), literal); } /** @@ -601,9 +595,7 @@ public: */ OStringBuffer & append( const char * str, sal_Int32 len) { - assert( len == 0 || str != NULL ); // cannot assert that in rtl_stringbuffer_insert - rtl_stringbuffer_insert( &pData, &nCapacity, getLength(), str, len ); - return *this; + return insert(getLength(), str, len); } #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING" @@ -615,33 +607,18 @@ public: OStringBuffer& append( OStringConcat< T1, T2 >&& c ) { sal_Int32 l = c.length(); - if( l == 0 ) - return *this; - l += pData->length; - rtl_stringbuffer_ensureCapacity( &pData, &nCapacity, l ); - char* end = c.addData( pData->buffer + pData->length ); - *end = '\0'; - pData->length = l; + if (l != 0) + c.addData(appendUninitialized(l)); return *this; } - /** - @overload - @internal - */ - template< std::size_t N > - OStringBuffer& append( OStringNumber< N >&& c ) - { - return append( c.buf, c.length ); - } - /** @overload @internal */ OStringBuffer& append( std::string_view s ) { - return append( s.data(), s.size() ); + return insert(getLength(), s); } #endif @@ -659,8 +636,7 @@ public: */ OStringBuffer & append(sal_Bool b) { - char sz[RTL_STR_MAX_VALUEOFBOOLEAN]; - return append( sz, rtl_str_valueOfBoolean( sz, b ) ); + return insert(getLength(), b); } /** @@ -678,8 +654,7 @@ public: */ OStringBuffer & append(bool b) { - char sz[RTL_STR_MAX_VALUEOFBOOLEAN]; - return append( sz, rtl_str_valueOfBoolean( sz, b ) ); + return insert(getLength(), b); } /// @cond INTERNAL @@ -704,7 +679,7 @@ public: */ OStringBuffer & append(char c) { - return append( &c, 1 ); + return insert(getLength(), c); } /** @@ -721,8 +696,7 @@ public: */ OStringBuffer & append(sal_Int32 i, sal_Int16 radix = 10 ) { - char sz[RTL_STR_MAX_VALUEOFINT32]; - return append( sz, rtl_str_valueOfInt32( sz, i, radix ) ); + return insert(getLength(), i, radix); } /** @@ -739,8 +713,7 @@ public: */ OStringBuffer & append(sal_Int64 l, sal_Int16 radix = 10 ) { - char sz[RTL_STR_MAX_VALUEOFINT64]; - return append( sz, rtl_str_valueOfInt64( sz, l, radix ) ); + return insert(getLength(), l, radix); } /** diff --git a/include/rtl/ustrbuf.hxx b/include/rtl/ustrbuf.hxx index 227eed842443..54a4b3730b8b 100644 --- a/include/rtl/ustrbuf.hxx +++ b/include/rtl/ustrbuf.hxx @@ -384,8 +384,7 @@ public: template<std::size_t N> OUStringBuffer & operator =(OUStringNumber<N> && n) { - *this = OUStringBuffer( std::move( n ) ); - return *this; + return operator =(std::u16string_view(n)); } #endif @@ -592,17 +591,12 @@ public: */ #if !defined LIBO_INTERNAL_ONLY OUStringBuffer & append(const OUString &str) - { - return append( str.getStr(), str.getLength() ); - } #else - OUStringBuffer & append(std::u16string_view sv) { - if (sv.size() > sal_uInt32(std::numeric_limits<sal_Int32>::max())) { - throw std::bad_alloc(); - } - return append(sv.data(), sv.size()); - } + OUStringBuffer & append(std::u16string_view str) #endif + { + return insert(getLength(), str); + } #if !defined LIBO_INTERNAL_ONLY /** @@ -646,7 +640,7 @@ public: OUStringBuffer & append( const sal_Unicode * str ) #endif { - return append( str, rtl_ustr_getLength( str ) ); + return insert(getLength(), str); } /** @@ -664,9 +658,7 @@ public: */ OUStringBuffer & append( const sal_Unicode * str, sal_Int32 len) { - assert( len == 0 || str != NULL ); // cannot assert that in rtl_uStringbuffer_insert - rtl_uStringbuffer_insert( &pData, &nCapacity, getLength(), str, len ); - return *this; + return insert(getLength(), str, len); } /** @@ -677,11 +669,7 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, OUStringBuffer& >::Type append( T& literal ) { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - return appendAscii( - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + return insert(getLength(), literal); } #if defined LIBO_INTERNAL_ONLY @@ -694,9 +682,7 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, OUStringBuffer &>::TypeUtf16 append(T & literal) { - return append( - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + return insert(getLength(), literal); } #endif @@ -708,25 +694,7 @@ public: template< typename T1, typename T2 > OUStringBuffer& append( OUStringConcat< T1, T2 >&& c ) { - sal_Int32 l = c.length(); - if( l == 0 ) - return *this; - l += pData->length; - rtl_uStringbuffer_ensureCapacity( &pData, &nCapacity, l ); - sal_Unicode* end = c.addData( pData->buffer + pData->length ); - *end = '\0'; - pData->length = l; - return *this; - } - - /** - @overload - @internal - */ - template< std::size_t N > - OUStringBuffer& append( OUStringNumber< N >&& c ) - { - return append( c.buf, c.length ); + return insert(getLength(), std::move(c)); } #endif @@ -789,8 +757,7 @@ public: */ OUStringBuffer & append(bool b) { - sal_Unicode sz[RTL_USTR_MAX_VALUEOFBOOLEAN]; - return append( sz, rtl_ustr_valueOfBoolean( sz, b ) ); + return insert(getLength(), b); } /// @cond INTERNAL @@ -810,7 +777,7 @@ public: */ OUStringBuffer & append(rtl_uString* str) { - return append( OUString( str )); + return append( OUString::unacquired( &str )); } /** @@ -826,8 +793,7 @@ public: */ OUStringBuffer & append(sal_Bool b) { - sal_Unicode sz[RTL_USTR_MAX_VALUEOFBOOLEAN]; - return append( sz, rtl_ustr_valueOfBoolean( sz, b ) ); + return insert(getLength(), b); } /** @@ -845,7 +811,7 @@ public: OUStringBuffer & append(char c) { assert(static_cast< unsigned char >(c) <= 0x7F); - return append(sal_Unicode(c)); + return insert(getLength(), c); } /** @@ -860,7 +826,7 @@ public: */ OUStringBuffer & append(sal_Unicode c) { - return append( &c, 1 ); + return insert(getLength(), c); } #if defined LIBO_INTERNAL_ONLY @@ -881,8 +847,7 @@ public: */ OUStringBuffer & append(sal_Int32 i, sal_Int16 radix = 10 ) { - sal_Unicode sz[RTL_USTR_MAX_VALUEOFINT32]; - return append( sz, rtl_ustr_valueOfInt32( sz, i, radix ) ); + return insert(getLength(), i, radix); } /** @@ -899,8 +864,7 @@ public: */ OUStringBuffer & append(sal_Int64 l, sal_Int16 radix = 10 ) { - sal_Unicode sz[RTL_USTR_MAX_VALUEOFINT64]; - return append( sz, rtl_ustr_valueOfInt64( sz, l, radix ) ); + return insert(getLength(), l, radix); } /** @@ -1005,6 +969,9 @@ public: #if defined LIBO_INTERNAL_ONLY OUStringBuffer & insert(sal_Int32 offset, std::u16string_view str) { + if (str.size() > sal_uInt32(std::numeric_limits<sal_Int32>::max())) { + throw std::bad_alloc(); + } return insert( offset, str.data(), str.length() ); } #else @@ -1034,16 +1001,6 @@ public: c.addData(pData->buffer + offset); return *this; } - - /** - @overload - @internal - */ - template <std::size_t N> - OUStringBuffer& insert(sal_Int32 offset, OUStringNumber<N>&& c) - { - return insert(offset, c.buf, c.length); - } #endif /** commit 73ede24746ce7d06487ca34e20af436c2a119cbf Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri May 5 14:24:04 2023 +0200 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Sat May 6 07:24:38 2023 +0200 Optimize O(U)StringBuffer's append/insert taking float/double rtl_(u)str_valueOf(Float/Double) are the most inefficient choice: their implementations call rtl_math_doubleTo(U)String, asking to allocate a new rtl_(u)String; then copy the string to the provided buffer on stack, and destroy the rtl_(u)String; and then copy the buffer into self. Even using O(U)String::number() would be more efficient, avoiding the intermediate stack buffer copy. But rtl_math_doubleTo(U)String can take also the O(U)StringBuffer's data directly, allowing to insert efficiently. Use that. Change-Id: I720ea7be6f4b2b92865a18eafcdb9ca9a089b854 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151377 Tested-by: Mike Kaganski <mike.kagan...@collabora.com> Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/include/rtl/strbuf.hxx b/include/rtl/strbuf.hxx index e5ae1ebd0a7b..cb842bb5839e 100644 --- a/include/rtl/strbuf.hxx +++ b/include/rtl/strbuf.hxx @@ -756,8 +756,7 @@ public: */ OStringBuffer & append(float f) { - char sz[RTL_STR_MAX_VALUEOFFLOAT]; - return append( sz, rtl_str_valueOfFloat( sz, f ) ); + return insert(getLength(), f); } /** @@ -773,8 +772,7 @@ public: */ OStringBuffer & append(double d) { - char sz[RTL_STR_MAX_VALUEOFDOUBLE]; - return append( sz, rtl_str_valueOfDouble( sz, d ) ); + return insert(getLength(), d); } /** @@ -1032,8 +1030,11 @@ public: */ OStringBuffer & insert(sal_Int32 offset, float f) { - char sz[RTL_STR_MAX_VALUEOFFLOAT]; - return insert( offset, sz, rtl_str_valueOfFloat( sz, f ) ); + // Same as rtl::str::valueOfFP, used for rtl_str_valueOfFloat + rtl_math_doubleToString(&pData, &nCapacity, offset, f, rtl_math_StringFormat_G, + RTL_STR_MAX_VALUEOFFLOAT - SAL_N_ELEMENTS("-x.E-xxx") + 1, '.', + NULL, 0, true); + return *this; } /** @@ -1055,8 +1056,11 @@ public: */ OStringBuffer & insert(sal_Int32 offset, double d) { - char sz[RTL_STR_MAX_VALUEOFDOUBLE]; - return insert( offset, sz, rtl_str_valueOfDouble( sz, d ) ); + // Same as rtl::str::valueOfFP, used for rtl_str_valueOfDouble + rtl_math_doubleToString(&pData, &nCapacity, offset, d, rtl_math_StringFormat_G, + RTL_STR_MAX_VALUEOFDOUBLE - SAL_N_ELEMENTS("-x.E-xxx") + 1, '.', + NULL, 0, true); + return *this; } /** diff --git a/include/rtl/ustrbuf.hxx b/include/rtl/ustrbuf.hxx index 363b4f24757f..227eed842443 100644 --- a/include/rtl/ustrbuf.hxx +++ b/include/rtl/ustrbuf.hxx @@ -916,8 +916,7 @@ public: */ OUStringBuffer & append(float f) { - sal_Unicode sz[RTL_USTR_MAX_VALUEOFFLOAT]; - return append( sz, rtl_ustr_valueOfFloat( sz, f ) ); + return insert(getLength(), f); } /** @@ -933,8 +932,7 @@ public: */ OUStringBuffer & append(double d) { - sal_Unicode sz[RTL_USTR_MAX_VALUEOFDOUBLE]; - return append( sz, rtl_ustr_valueOfDouble( sz, d ) ); + return insert(getLength(), d); } /** @@ -1288,8 +1286,11 @@ public: */ OUStringBuffer & insert(sal_Int32 offset, float f) { - sal_Unicode sz[RTL_USTR_MAX_VALUEOFFLOAT]; - return insert( offset, sz, rtl_ustr_valueOfFloat( sz, f ) ); + // Same as rtl::str::valueOfFP, used for rtl_ustr_valueOfFloat + rtl_math_doubleToUString(&pData, &nCapacity, offset, f, rtl_math_StringFormat_G, + RTL_USTR_MAX_VALUEOFFLOAT - SAL_N_ELEMENTS("-x.E-xxx") + 1, '.', + NULL, 0, true); + return *this; } /** @@ -1312,8 +1313,11 @@ public: */ OUStringBuffer & insert(sal_Int32 offset, double d) { - sal_Unicode sz[RTL_USTR_MAX_VALUEOFDOUBLE]; - return insert( offset, sz, rtl_ustr_valueOfDouble( sz, d ) ); + // Same as rtl::str::valueOfFP, used for rtl_ustr_valueOfDouble + rtl_math_doubleToUString(&pData, &nCapacity, offset, d, rtl_math_StringFormat_G, + RTL_USTR_MAX_VALUEOFDOUBLE - SAL_N_ELEMENTS("-x.E-xxx") + 1, '.', + NULL, 0, true); + return *this; } /**