diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2023-04-05 07:22:35 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2023-04-05 09:57:04 +0200 |
commit | 90c590812eecb3a0eb2748a132e304fa6c0ea0ad (patch) | |
tree | d7747887c767c2b5a6b8cc4c60fc9f8f856c49a7 /include/rtl | |
parent | 53e24da3698ddb5f976cec0ae8eb8b2a2ab2c4c6 (diff) |
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.kaganski@collabora.com>
Diffstat (limited to 'include/rtl')
-rw-r--r-- | include/rtl/strbuf.hxx | 12 | ||||
-rw-r--r-- | include/rtl/string.hxx | 47 | ||||
-rw-r--r-- | include/rtl/stringconcat.hxx | 132 | ||||
-rw-r--r-- | include/rtl/ustrbuf.hxx | 16 | ||||
-rw-r--r-- | include/rtl/ustring.hxx | 51 |
5 files changed, 82 insertions, 176 deletions
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. |