summaryrefslogtreecommitdiff
path: root/include/rtl
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2023-04-05 07:22:35 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2023-04-05 09:57:04 +0200
commit90c590812eecb3a0eb2748a132e304fa6c0ea0ad (patch)
treed7747887c767c2b5a6b8cc4c60fc9f8f856c49a7 /include/rtl
parent53e24da3698ddb5f976cec0ae8eb8b2a2ab2c4c6 (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.hxx12
-rw-r--r--include/rtl/string.hxx47
-rw-r--r--include/rtl/stringconcat.hxx132
-rw-r--r--include/rtl/ustrbuf.hxx16
-rw-r--r--include/rtl/ustring.hxx51
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.