compilerplugins/clang/stringview.cxx        |    4 
 compilerplugins/clang/test/stringview.cxx   |    4 
 include/com/sun/star/uno/Any.h              |    4 
 include/com/sun/star/uno/Any.hxx            |   16 +--
 include/rtl/strbuf.hxx                      |   12 +-
 include/rtl/string.hxx                      |   47 +++++----
 include/rtl/stringconcat.hxx                |  132 +++-------------------------
 include/rtl/ustrbuf.hxx                     |   16 +--
 include/rtl/ustring.hxx                     |   51 +++++-----
 sal/qa/rtl/strings/test_ostring_concat.cxx  |   10 +-
 sal/qa/rtl/strings/test_oustring_concat.cxx |   10 +-
 11 files changed, 105 insertions(+), 201 deletions(-)

New commits:
commit 90c590812eecb3a0eb2748a132e304fa6c0ea0ad
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Wed Apr 5 07:22:35 2023 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Wed Apr 5 09:57:04 2023 +0200

    Simplify O(U)String::number implementation
    
    Change-Id: I059f0324597a90aee01c95170a48ac5578f3caee
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150037
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/compilerplugins/clang/stringview.cxx 
b/compilerplugins/clang/stringview.cxx
index 7d6d38ba3b60..4978c802c55b 100644
--- a/compilerplugins/clang/stringview.cxx
+++ b/compilerplugins/clang/stringview.cxx
@@ -196,9 +196,7 @@ void StringView::handleCXXConstructExpr(CXXConstructExpr 
const* expr)
                 break;
             }
             loplugin::TypeCheck tc(t);
-            if 
(tc.RvalueReference().Struct("StringNumberBase").Namespace("rtl").GlobalNamespace()
-                || 
tc.RvalueReference().Struct("OStringNumber").Namespace("rtl").GlobalNamespace()
-                || 
tc.RvalueReference().Struct("OUStringNumber").Namespace("rtl").GlobalNamespace()
+            if 
(tc.RvalueReference().Struct("StringNumber").Namespace("rtl").GlobalNamespace()
                 || tc.ClassOrStruct("basic_string_view").StdNamespace())
             {
                 argType = expr->getArg(0)->IgnoreImplicit()->getType();
diff --git a/compilerplugins/clang/test/stringview.cxx 
b/compilerplugins/clang/test/stringview.cxx
index f1a63a058bdf..d9e0508c0835 100644
--- a/compilerplugins/clang/test/stringview.cxx
+++ b/compilerplugins/clang/test/stringview.cxx
@@ -164,7 +164,7 @@ void f5(char const* s1, sal_Int32 n1, char16_t const* s2, 
sal_Int32 n2, OString
     call_view(OString(l1));
     // expected-error-re@+1 {{instead of an '{{(rtl::)?}}OString' constructed 
from a 'std::string_view' (aka 'basic_string_view<char>'), pass a 
'std::string_view' [loplugin:stringview]}}
     call_view(OString(std::string_view("foo")));
-    // expected-error-re@+1 {{instead of an '{{(rtl::)?}}OString' constructed 
from a 'OStringNumber<int>', pass a 'std::string_view' [loplugin:stringview]}}
+    // expected-error-re@+1 {{instead of an '{{(rtl::)?}}OString' constructed 
from a '{{(rtl::)?}}StringNumber<char, 33>', pass a 'std::string_view' 
[loplugin:stringview]}}
     call_view(OString(OString::number(0)));
     // expected-error-re@+1 {{instead of an '{{(rtl::)?}}OString' constructed 
from a 'OStringConcat<{{(rtl::)?}}OString, {{(rtl::)?}}OString>' (aka 
'StringConcat<char, rtl::OString, rtl::OString>'), pass a 'std::string_view' 
via 'rtl::Concat2View' [loplugin:stringview]}}
     call_view(OString(s3 + s3));
@@ -188,7 +188,7 @@ void f5(char const* s1, sal_Int32 n1, char16_t const* s2, 
sal_Int32 n2, OString
     call_view(OUString(l2));
     // expected-error-re@+1 {{instead of an '{{(rtl::)?}}OUString' constructed 
from a 'std::u16string_view' (aka 'basic_string_view<char16_t>'), pass a 
'std::u16string_view' [loplugin:stringview]}}
     call_view(OUString(std::u16string_view(u"foo")));
-    // expected-error-re@+1 {{instead of an '{{(rtl::)?}}OUString' constructed 
from a 'OUStringNumber<int>', pass a 'std::u16string_view' 
[loplugin:stringview]}}
+    // expected-error-re@+1 {{instead of an '{{(rtl::)?}}OUString' constructed 
from a '{{(rtl::)?}}StringNumber<char16_t, 33>', pass a 'std::u16string_view' 
[loplugin:stringview]}}
     call_view(OUString(OUString::number(0)));
     // expected-error-re@+1 {{instead of an '{{(rtl::)?}}OUString' constructed 
from a 'OUStringConcat<{{(rtl::)?}}OUString, {{(rtl::)?}}OUString>' (aka 
'StringConcat<char16_t, rtl::OUString, rtl::OUString>'), pass a 
'std::u16string_view' via 'rtl::Concat2View' [loplugin:stringview]}}
     call_view(OUString(s4 + s4));
diff --git a/include/com/sun/star/uno/Any.h b/include/com/sun/star/uno/Any.h
index 181b58ae4b4a..14eb9035495f 100644
--- a/include/com/sun/star/uno/Any.h
+++ b/include/com/sun/star/uno/Any.h
@@ -87,8 +87,8 @@ public:
     explicit inline Any(rtl::OUStringConcat<T1, T2> && value);
     template<typename T1, typename T2>
     explicit Any(rtl::OUStringConcat<T1, T2> const &) = delete;
-    template<typename T> explicit inline Any(rtl::OUStringNumber<T> && value);
-    template<typename T> explicit Any(rtl::OUStringNumber<T> const &) = delete;
+    template<std::size_t nBufSize> explicit inline 
Any(rtl::StringNumber<sal_Unicode, nBufSize> && value);
+    template<std::size_t nBufSize> explicit Any(rtl::StringNumber<sal_Unicode, 
nBufSize> const &) = delete;
     template <std::size_t N> explicit inline Any(const 
rtl::OUStringLiteral<N>& value);
 #endif
 
diff --git a/include/com/sun/star/uno/Any.hxx b/include/com/sun/star/uno/Any.hxx
index 6267d41e733c..7909f1cb239e 100644
--- a/include/com/sun/star/uno/Any.hxx
+++ b/include/com/sun/star/uno/Any.hxx
@@ -84,8 +84,8 @@ template<typename T1, typename T2>
 Any::Any(rtl::OUStringConcat<T1, T2> && value):
     Any(rtl::OUString(std::move(value)))
 {}
-template<typename T>
-Any::Any(rtl::OUStringNumber<T> && value): 
Any(rtl::OUString(std::move(value))) {}
+template<std::size_t nBufSize>
+Any::Any(rtl::StringNumber<sal_Unicode, nBufSize> && value): 
Any(rtl::OUString(std::move(value))) {}
 template <std::size_t N>
 Any::Any(const rtl::OUStringLiteral<N>& value): Any(rtl::OUString(value)) {}
 #endif
@@ -254,8 +254,8 @@ template<typename T1, typename T2>
 Any toAny(rtl::OUStringConcat<T1, T2> && value)
 { return Any(std::move(value)); }
 
-template<typename T>
-Any toAny(rtl::OUStringNumber<T> && value)
+template<std::size_t nBufSize>
+Any toAny(rtl::StringNumber<sal_Unicode, nBufSize> && value)
 { return Any(std::move(value)); }
 
 template<typename T> bool fromAny(Any const & any, T * value) {
@@ -304,8 +304,8 @@ inline void operator <<= ( Any & rAny, rtl::OUStringConcat< 
C1, C2 >&& value )
 }
 template<typename T1, typename T2>
 void operator <<=(Any &, rtl::OUStringConcat<T1, T2> const &) = delete;
-template< class C >
-inline void operator <<= ( Any & rAny, rtl::OUStringNumber< C >&& value )
+template< std::size_t nBufSize >
+inline void operator <<= ( Any & rAny, rtl::StringNumber< sal_Unicode, 
nBufSize >&& value )
 {
     const rtl::OUString str( std::move(value) );
     const Type & rType = ::cppu::getTypeFavourUnsigned(&str);
@@ -313,8 +313,8 @@ inline void operator <<= ( Any & rAny, rtl::OUStringNumber< 
C >&& value )
         &rAny, const_cast< rtl::OUString * >( &str ), rType.getTypeLibType(),
         cpp_acquire, cpp_release );
 }
-template<typename T>
-void operator <<=(Any &, rtl::OUStringNumber<T> const &) = delete;
+template<std::size_t nBufSize>
+void operator <<=(Any &, rtl::StringNumber<sal_Unicode, nBufSize> const &) = 
delete;
 #endif
 
 #if defined LIBO_INTERNAL_ONLY
diff --git a/include/rtl/strbuf.hxx b/include/rtl/strbuf.hxx
index 97368ce3ca4d..b448228d6053 100644
--- a/include/rtl/strbuf.hxx
+++ b/include/rtl/strbuf.hxx
@@ -257,8 +257,8 @@ public:
      @overload
      @internal
     */
-    template< typename T, std::size_t N >
-    OStringBuffer( StringNumberBase< char, T, N >&& n )
+    template< std::size_t N >
+    OStringBuffer( OStringNumber< N >&& n )
         : OStringBuffer( n.buf, n.length)
     {}
 #endif
@@ -345,8 +345,8 @@ public:
     }
 
     /** @overload @internal */
-    template<typename T, std::size_t N>
-    OStringBuffer & operator =(StringNumberBase<char, T, N> && n)
+    template<std::size_t N>
+    OStringBuffer & operator =(OStringNumber<N> && n)
     {
         *this = OStringBuffer( std::move ( n ));
         return *this;
@@ -629,8 +629,8 @@ public:
      @overload
      @internal
     */
-    template< typename T, std::size_t N >
-    OStringBuffer& append( StringNumberBase< char, T, N >&& c )
+    template< std::size_t N >
+    OStringBuffer& append( OStringNumber< N >&& c )
     {
         return append( c.buf, c.length );
     }
diff --git a/include/rtl/string.hxx b/include/rtl/string.hxx
index 9c2c6ae61f60..5b01df33e71f 100644
--- a/include/rtl/string.hxx
+++ b/include/rtl/string.hxx
@@ -439,8 +439,8 @@ public:
      @overload
      @internal
     */
-    template< typename T, std::size_t N >
-    OString( StringNumberBase< char, T, N >&& n )
+    template< std::size_t N >
+    OString( OStringNumber< N >&& n )
         : OString( n.buf, n.length )
     {}
 #endif
@@ -622,12 +622,12 @@ public:
      @overload
      @internal
     */
-    template< typename T, std::size_t N >
-    OString& operator+=( StringNumberBase< char, T, N >&& n ) & {
+    template< std::size_t N >
+    OString& operator+=( OStringNumber< N >&& n ) & {
         return operator +=(std::string_view(n.buf, n.length));
     }
-    template<typename T, std::size_t N> void operator +=(
-        StringNumberBase<char, T, N> &&) && = delete;
+    template<std::size_t N> void operator +=(
+        OStringNumber<N> &&) && = delete;
 #endif
 
     /**
@@ -1997,37 +1997,37 @@ public:
 
 #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
 
-    static OStringNumber< int > number( int i, sal_Int16 radix = 10 )
+    static auto number( int i, sal_Int16 radix = 10 )
     {
-        return OStringNumber< int >( i, radix );
+        return OStringNumber<RTL_STR_MAX_VALUEOFINT32>(rtl_str_valueOfInt32, 
i, radix);
     }
-    static OStringNumber< long long > number( long long ll, sal_Int16 radix = 
10 )
+    static auto number( long long ll, sal_Int16 radix = 10 )
     {
-        return OStringNumber< long long >( ll, radix );
+        return OStringNumber<RTL_STR_MAX_VALUEOFINT64>(rtl_str_valueOfInt64, 
ll, radix);
     }
-    static OStringNumber< unsigned long long > number( unsigned long long ll, 
sal_Int16 radix = 10 )
+    static auto number( unsigned long long ll, sal_Int16 radix = 10 )
     {
-        return OStringNumber< unsigned long long >( ll, radix );
+        return OStringNumber<RTL_STR_MAX_VALUEOFUINT64>(rtl_str_valueOfUInt64, 
ll, radix);
     }
-    static OStringNumber< unsigned long long > number( unsigned int i, 
sal_Int16 radix = 10 )
+    static auto number( unsigned int i, sal_Int16 radix = 10 )
     {
         return number( static_cast< unsigned long long >( i ), radix );
     }
-    static OStringNumber< long long > number( long i, sal_Int16 radix = 10)
+    static auto number( long i, sal_Int16 radix = 10)
     {
         return number( static_cast< long long >( i ), radix );
     }
-    static OStringNumber< unsigned long long > number( unsigned long i, 
sal_Int16 radix = 10 )
+    static auto number( unsigned long i, sal_Int16 radix = 10 )
     {
         return number( static_cast< unsigned long long >( i ), radix );
     }
-    static OStringNumber< float > number( float f )
+    static auto number( float f )
     {
-        return OStringNumber< float >( f );
+        return OStringNumber<RTL_STR_MAX_VALUEOFFLOAT>(rtl_str_valueOfFloat, 
f);
     }
-    static OStringNumber< double > number( double d )
+    static auto number( double d )
     {
-        return OStringNumber< double >( d );
+        return OStringNumber<RTL_STR_MAX_VALUEOFDOUBLE>(rtl_str_valueOfDouble, 
d);
     }
 #else
     /**
@@ -2109,6 +2109,12 @@ public:
     }
 #endif
 
+#ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
+    static auto boolean(bool b)
+    {
+        return 
OStringNumber<RTL_STR_MAX_VALUEOFBOOLEAN>(rtl_str_valueOfBoolean, b);
+    }
+#else
     /**
       Returns the string representation of the sal_Bool argument.
 
@@ -2125,9 +2131,6 @@ public:
         return boolean(b);
     }
 
-#ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
-    static OStringNumber<bool> boolean(bool b) { return 
OStringNumber<bool>(b); }
-#else
     /**
       Returns the string representation of the boolean argument.
 
diff --git a/include/rtl/stringconcat.hxx b/include/rtl/stringconcat.hxx
index 118d93df5007..fd9a6f7a938a 100644
--- a/include/rtl/stringconcat.hxx
+++ b/include/rtl/stringconcat.hxx
@@ -324,17 +324,23 @@ template <typename T1, typename T2> auto 
Concat2View(OUStringConcat<T1, T2> cons
 
 /**
 * O(U)StringNumber implementation
+
+Objects returned by O(U)String::number(), instead of O(U)String. These objects 
keep a representation of the number() operation.
+
+If you get a build error related to this class, you most probably need to 
explicitly convert the result of calling
+O(U)String::number() to O(U)String.
 */
 
-template <typename C, typename Number, std::size_t nBufSize> struct 
StringNumberBase
+template <typename C, std::size_t nBufSize> struct StringNumber
 {
-    using number_t = Number;
-    using base_t = StringNumberBase;
+    template <typename Func, typename... Args,
+              std::enable_if_t<std::is_invocable_r_v<sal_Int32, Func, C*, 
Args...>, int> = 0>
+    StringNumber(Func func, Args... args) { length = func(buf, args...); }
     // O(U)String::number(value).getStr() is very common (writing xml code, 
...),
     // so implement that one also here, to avoid having to explicitly convert
     // to O(U)String in all such places
     const C* getStr() const SAL_RETURNS_NONNULL { return buf; }
-    StringNumberBase&& toAsciiUpperCase() &&
+    StringNumber&& toAsciiUpperCase() &&
     {
         if constexpr (sizeof(C) == sizeof(char))
             rtl_str_toAsciiUpperCase_WithLength(buf, length);
@@ -347,122 +353,16 @@ template <typename C, typename Number, std::size_t 
nBufSize> struct StringNumber
     sal_Int32 length;
 };
 
-/**
- @internal
-
-Objects returned by OString::number(), instead of OString. These objects keep 
a representation of the number() operation.
-
-If you get a build error related to this class, you most probably need to 
explicitly convert the result of calling
-OString::number() to OString.
-*/
-template< typename T >
-struct OStringNumber;
+template<std::size_t nBufSize> using OStringNumber = StringNumber<char, 
nBufSize>;
+template<std::size_t nBufSize> using OUStringNumber = 
StringNumber<sal_Unicode, nBufSize>;
 
-template<>
-struct OStringNumber< int >
-    : public StringNumberBase<char, int, RTL_STR_MAX_VALUEOFINT32>
-{
-    OStringNumber(number_t i, sal_Int16 radix) { length = 
rtl_str_valueOfInt32(buf, i, radix); }
-};
-
-template<>
-struct OStringNumber< long long >
-    : public StringNumberBase<char, long long, RTL_STR_MAX_VALUEOFINT64>
+template< typename C, std::size_t nBufSize >
+struct ToStringHelper< StringNumber< C, nBufSize > >
 {
-    OStringNumber(number_t i, sal_Int16 radix) { length = 
rtl_str_valueOfInt64(buf, i, radix); }
+    static std::size_t length( const StringNumber< C, nBufSize >& n ) { return 
n.length; }
+    C* operator()( C* buffer, const StringNumber< C, nBufSize >& n ) const 
SAL_RETURNS_NONNULL { return addDataHelper( buffer, n.buf, n.length ); }
 };
 
-template<>
-struct OStringNumber< unsigned long long >
-    : public StringNumberBase<char, unsigned long long, 
RTL_STR_MAX_VALUEOFUINT64>
-{
-    OStringNumber(number_t i, sal_Int16 radix) { length = 
rtl_str_valueOfUInt64(buf, i, radix); }
-};
-
-template<>
-struct OStringNumber< float >
-    : public StringNumberBase<char, float, RTL_STR_MAX_VALUEOFFLOAT>
-{
-    OStringNumber(number_t f) { length = rtl_str_valueOfFloat(buf, f); }
-};
-
-template<>
-struct OStringNumber< double >
-    : public StringNumberBase<char, double, RTL_STR_MAX_VALUEOFDOUBLE>
-{
-    OStringNumber(number_t d) { length = rtl_str_valueOfDouble(buf, d); }
-};
-
-template<>
-struct OStringNumber< bool >
-    : public StringNumberBase<char, bool, RTL_STR_MAX_VALUEOFBOOLEAN>
-{
-    OStringNumber(number_t b) { length = rtl_str_valueOfBoolean(buf, b); }
-};
-
-/**
- @internal
-
-Objects returned by OUString::number(), instead of OUString. These objects 
keep a representation of the number() operation.
-
-If you get a build error related to this class, you most probably need to 
explicitly convert the result of calling
-OUString::number() to OUString.
-*/
-template< typename T >
-struct OUStringNumber;
-
-template<>
-struct OUStringNumber< int >
-    : public StringNumberBase<sal_Unicode, int, RTL_USTR_MAX_VALUEOFINT32>
-{
-    OUStringNumber(number_t i, sal_Int16 radix) { length = 
rtl_ustr_valueOfInt32(buf, i, radix); }
-};
-
-template<>
-struct OUStringNumber< long long >
-    : public StringNumberBase<sal_Unicode, long long, 
RTL_USTR_MAX_VALUEOFINT64>
-{
-    OUStringNumber(number_t i, sal_Int16 radix) { length = 
rtl_ustr_valueOfInt64(buf, i, radix); }
-};
-
-template<>
-struct OUStringNumber< unsigned long long >
-    : public StringNumberBase<sal_Unicode, unsigned long long, 
RTL_USTR_MAX_VALUEOFUINT64>
-{
-    OUStringNumber(number_t i, sal_Int16 radix) { length = 
rtl_ustr_valueOfUInt64(buf, i, radix); }
-};
-
-template<>
-struct OUStringNumber< float >
-    : public StringNumberBase<sal_Unicode, float, RTL_USTR_MAX_VALUEOFFLOAT>
-{
-    OUStringNumber(number_t f) { length = rtl_ustr_valueOfFloat(buf, f); }
-};
-
-template<>
-struct OUStringNumber< double >
-    : public StringNumberBase<sal_Unicode, double, RTL_USTR_MAX_VALUEOFDOUBLE>
-{
-    OUStringNumber(number_t d) { length = rtl_ustr_valueOfDouble(buf, d); }
-};
-
-template<>
-struct OUStringNumber< bool >
-    : public StringNumberBase<sal_Unicode, bool, RTL_USTR_MAX_VALUEOFBOOLEAN>
-{
-    OUStringNumber(number_t b) { length = rtl_ustr_valueOfBoolean(buf, b); }
-};
-
-template< typename C, typename T, std::size_t nBufSize >
-struct ToStringHelper< StringNumberBase< C, T, nBufSize > >
-{
-    static std::size_t length( const StringNumberBase< C, T, nBufSize >& n ) { 
return n.length; }
-    C* operator()( C* buffer, const StringNumberBase< C, T, nBufSize >& n ) 
const SAL_RETURNS_NONNULL { return addDataHelper( buffer, n.buf, n.length ); }
-};
-
-template<typename T> struct ToStringHelper<OStringNumber<T>> : public 
ToStringHelper<typename OStringNumber<T>::base_t> {};
-template<typename T> struct ToStringHelper<OUStringNumber<T>> : public 
ToStringHelper<typename OUStringNumber<T>::base_t> {};
-
 template<typename C> struct ToStringHelper<std::basic_string_view<C>> {
     static constexpr std::size_t length(std::basic_string_view<C> s) { return 
s.size(); }
 
diff --git a/include/rtl/ustrbuf.hxx b/include/rtl/ustrbuf.hxx
index cdfb28ab556c..578df163d819 100644
--- a/include/rtl/ustrbuf.hxx
+++ b/include/rtl/ustrbuf.hxx
@@ -243,8 +243,8 @@ public:
      @overload
      @internal
     */
-    template< typename T, std::size_t N >
-    OUStringBuffer( StringNumberBase< sal_Unicode, T, N >&& n )
+    template< std::size_t N >
+    OUStringBuffer( OUStringNumber< N >&& n )
         : pData(NULL)
         , nCapacity( n.length + 16 )
     {
@@ -381,8 +381,8 @@ public:
     }
 
     /** @overload @internal */
-    template<typename T, std::size_t N>
-    OUStringBuffer & operator =(StringNumberBase<sal_Unicode, T, N> && n)
+    template<std::size_t N>
+    OUStringBuffer & operator =(OUStringNumber<N> && n)
     {
         *this = OUStringBuffer( std::move( n ) );
         return *this;
@@ -723,8 +723,8 @@ public:
      @overload
      @internal
     */
-    template< typename T, std::size_t N >
-    OUStringBuffer& append( StringNumberBase< sal_Unicode, T, N >&& c )
+    template< std::size_t N >
+    OUStringBuffer& append( OUStringNumber< N >&& c )
     {
         return append( c.buf, c.length );
     }
@@ -1041,8 +1041,8 @@ public:
      @overload
      @internal
     */
-    template <typename T, std::size_t N>
-    OUStringBuffer& insert(sal_Int32 offset, StringNumberBase<sal_Unicode, T, 
N>&& c)
+    template <std::size_t N>
+    OUStringBuffer& insert(sal_Int32 offset, OUStringNumber<N>&& c)
     {
         return insert(offset, c.buf, c.length);
     }
diff --git a/include/rtl/ustring.hxx b/include/rtl/ustring.hxx
index 36d122c1fe5a..a87082aacfff 100644
--- a/include/rtl/ustring.hxx
+++ b/include/rtl/ustring.hxx
@@ -509,8 +509,8 @@ public:
      @overload
      @internal
     */
-    template< typename T, std::size_t N >
-    OUString( StringNumberBase< sal_Unicode, T, N >&& n )
+    template< std::size_t N >
+    OUString( OUStringNumber< N >&& n )
         : OUString( n.buf, n.length )
     {}
 #endif
@@ -656,8 +656,8 @@ public:
     }
     template<std::size_t N> OUString & operator =(OUStringLiteral<N> &&) = 
delete;
 
-    template <typename T, std::size_t N>
-    OUString & operator =(StringNumberBase<sal_Unicode, T, N> && n) {
+    template <std::size_t N>
+    OUString & operator =(OUStringNumber<N> && n) {
         // n.length should never be zero, so no need to add an optimization 
for that case
         rtl_uString_newFromStr_WithLength(&pData, n.buf, n.length);
         return *this;
@@ -788,8 +788,8 @@ public:
      @overload
      @internal
     */
-    template< typename T, std::size_t N >
-    OUString& operator+=( StringNumberBase< sal_Unicode, T, N >&& n ) & {
+    template< std::size_t N >
+    OUString& operator+=( OUStringNumber< N >&& n ) & {
         sal_Int32 l = n.length;
         if( l == 0 )
             return *this;
@@ -800,8 +800,8 @@ public:
         pData->length = l;
         return *this;
     }
-    template<typename T, std::size_t N> void operator +=(
-        StringNumberBase<sal_Unicode, T, N> &&) && = delete;
+    template<std::size_t N> void operator +=(
+        OUStringNumber<N> &&) && = delete;
 #endif
 
     /**
@@ -3058,37 +3058,37 @@ public:
 
 #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
 
-    static OUStringNumber< int > number( int i, sal_Int16 radix = 10 )
+    static auto number( int i, sal_Int16 radix = 10 )
     {
-        return OUStringNumber< int >( i, radix );
+        return 
OUStringNumber<RTL_USTR_MAX_VALUEOFINT32>(rtl_ustr_valueOfInt32, i, radix);
     }
-    static OUStringNumber< long long > number( long long ll, sal_Int16 radix = 
10 )
+    static auto number( long long ll, sal_Int16 radix = 10 )
     {
-        return OUStringNumber< long long >( ll, radix );
+        return 
OUStringNumber<RTL_USTR_MAX_VALUEOFINT64>(rtl_ustr_valueOfInt64, ll, radix);
     }
-    static OUStringNumber< unsigned long long > number( unsigned long long ll, 
sal_Int16 radix = 10 )
+    static auto number( unsigned long long ll, sal_Int16 radix = 10 )
     {
-        return OUStringNumber< unsigned long long >( ll, radix );
+        return 
OUStringNumber<RTL_USTR_MAX_VALUEOFUINT64>(rtl_ustr_valueOfUInt64, ll, radix);
     }
-    static OUStringNumber< unsigned long long > number( unsigned int i, 
sal_Int16 radix = 10 )
+    static auto number( unsigned int i, sal_Int16 radix = 10 )
     {
         return number( static_cast< unsigned long long >( i ), radix );
     }
-    static OUStringNumber< long long > number( long i, sal_Int16 radix = 10)
+    static auto number( long i, sal_Int16 radix = 10)
     {
         return number( static_cast< long long >( i ), radix );
     }
-    static OUStringNumber< unsigned long long > number( unsigned long i, 
sal_Int16 radix = 10 )
+    static auto number( unsigned long i, sal_Int16 radix = 10 )
     {
         return number( static_cast< unsigned long long >( i ), radix );
     }
-    static OUStringNumber< float > number( float f )
+    static auto number( float f )
     {
-        return OUStringNumber< float >( f );
+        return 
OUStringNumber<RTL_USTR_MAX_VALUEOFFLOAT>(rtl_ustr_valueOfFloat, f);
     }
-    static OUStringNumber< double > number( double d )
+    static auto number( double d )
     {
-        return OUStringNumber< double >( d );
+        return 
OUStringNumber<RTL_USTR_MAX_VALUEOFDOUBLE>(rtl_ustr_valueOfDouble, d);
     }
 #else
     /**
@@ -3170,6 +3170,12 @@ public:
     }
 #endif
 
+#ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
+    static auto boolean(bool b)
+    {
+        return 
OUStringNumber<RTL_USTR_MAX_VALUEOFBOOLEAN>(rtl_ustr_valueOfBoolean, b);
+    }
+#else
     /**
       Returns the string representation of the sal_Bool argument.
 
@@ -3186,9 +3192,6 @@ public:
         return boolean(b);
     }
 
-#ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
-    static OUStringNumber<bool> boolean(bool b) { return 
OUStringNumber<bool>(b); }
-#else
     /**
       Returns the string representation of the boolean argument.
 
diff --git a/sal/qa/rtl/strings/test_ostring_concat.cxx 
b/sal/qa/rtl/strings/test_ostring_concat.cxx
index 4dfe945db295..0ad7842d56ba 100644
--- a/sal/qa/rtl/strings/test_ostring_concat.cxx
+++ b/sal/qa/rtl/strings/test_ostring_concat.cxx
@@ -107,15 +107,15 @@ void test::ostring::StringConcat::checkConcat()
     CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OStringConcat< 
OStringConcatMarker, char* >, const char[ 4 ] > )), typeid( OString::Concat( d4 
) + "bar" ));
 
     CPPUNIT_ASSERT_EQUAL( OString( "num10" ), OString( OString( "num" ) + 
OString::number( 10 )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, OStringNumber< int 
> > )), typeid( OString( "num" ) + OString::number( 10 )));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, StringNumber< char, 
RTL_STR_MAX_VALUEOFINT32 > > )), typeid( OString( "num" ) + OString::number( 10 
)));
     CPPUNIT_ASSERT_EQUAL( OString( "num10" ), OString( OString( "num" ) + 
OString::number( 10L )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, OStringNumber< long 
long > > )), typeid( OString( "num" ) + OString::number( 10L )));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, StringNumber< char, 
RTL_STR_MAX_VALUEOFINT64 > > )), typeid( OString( "num" ) + OString::number( 
10L )));
     CPPUNIT_ASSERT_EQUAL( OString( "num10" ), OString( OString( "num" ) + 
OString::number( 10ULL )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, OStringNumber< 
unsigned long long > > )), typeid( OString( "num" ) + OString::number( 10ULL 
)));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, StringNumber< char, 
RTL_STR_MAX_VALUEOFUINT64 > > )), typeid( OString( "num" ) + OString::number( 
10ULL )));
     CPPUNIT_ASSERT_EQUAL( OString( "num10.5" ), OString( OString( "num" ) + 
OString::number( 10.5f )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, OStringNumber< 
float > > )), typeid( OString( "num" ) + OString::number( 10.5f )));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, StringNumber< char, 
RTL_STR_MAX_VALUEOFFLOAT > > )), typeid( OString( "num" ) + OString::number( 
10.5f )));
     CPPUNIT_ASSERT_EQUAL( OString( "num10.5" ), OString( OString( "num" ) + 
OString::number( 10.5 )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, OStringNumber< 
double > > )), typeid( OString( "num" ) + OString::number( 10.5 )));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, StringNumber< char, 
RTL_STR_MAX_VALUEOFDOUBLE > > )), typeid( OString( "num" ) + OString::number( 
10.5 )));
 }
 
 void test::ostring::StringConcat::checkEnsureCapacity()
diff --git a/sal/qa/rtl/strings/test_oustring_concat.cxx 
b/sal/qa/rtl/strings/test_oustring_concat.cxx
index 104814fd865d..6c2ee435e31a 100644
--- a/sal/qa/rtl/strings/test_oustring_concat.cxx
+++ b/sal/qa/rtl/strings/test_oustring_concat.cxx
@@ -92,15 +92,15 @@ void test::oustring::StringConcat::checkConcat()
     CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUStringConcat< 
rtl::OUStringConcatMarker, const sal_Unicode[ 4 ] >, const char[ 4 ] > )), 
typeid( OUString::Concat( d3 ) + "bar" ));
 
     CPPUNIT_ASSERT_EQUAL( OUString( "num10" ), OUString( OUString( "num" ) + 
OUString::number( 10 )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, OUStringNumber< 
int > > )), typeid( OUString( "num" ) + OUString::number( 10 )));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, StringNumber< 
sal_Unicode, RTL_USTR_MAX_VALUEOFINT32 > > )), typeid( OUString( "num" ) + 
OUString::number( 10 )));
     CPPUNIT_ASSERT_EQUAL( OUString( "num10" ), OUString( OUString( "num" ) + 
OUString::number( 10L )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, OUStringNumber< 
long long > > )), typeid( OUString( "num" ) + OUString::number( 10L )));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, StringNumber< 
sal_Unicode, RTL_USTR_MAX_VALUEOFINT64 > > )), typeid( OUString( "num" ) + 
OUString::number( 10L )));
     CPPUNIT_ASSERT_EQUAL( OUString( "num10" ), OUString( OUString( "num" ) + 
OUString::number( 10ULL )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, OUStringNumber< 
unsigned long long > > )), typeid( OUString( "num" ) + OUString::number( 10ULL 
)));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, StringNumber< 
sal_Unicode, RTL_USTR_MAX_VALUEOFUINT64 > > )), typeid( OUString( "num" ) + 
OUString::number( 10ULL )));
     CPPUNIT_ASSERT_EQUAL( OUString( "num10.5" ), OUString( OUString( "num" ) + 
OUString::number( 10.5f )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, OUStringNumber< 
float > > )), typeid( OUString( "num" ) + OUString::number( 10.5f )));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, StringNumber< 
sal_Unicode, RTL_USTR_MAX_VALUEOFFLOAT > > )), typeid( OUString( "num" ) + 
OUString::number( 10.5f )));
     CPPUNIT_ASSERT_EQUAL( OUString( "num10.5" ), OUString( OUString( "num" ) + 
OUString::number( 10.5 )));
-    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, OUStringNumber< 
double > > )), typeid( OUString( "num" ) + OUString::number( 10.5 )));
+    CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, StringNumber< 
sal_Unicode, RTL_USTR_MAX_VALUEOFDOUBLE > > )), typeid( OUString( "num" ) + 
OUString::number( 10.5 )));
 }
 
 void test::oustring::StringConcat::checkConcatAsciiL()

Reply via email to