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;
     }
 
     /**

Reply via email to