summaryrefslogtreecommitdiff
path: root/include/rtl/stringconcat.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'include/rtl/stringconcat.hxx')
-rw-r--r--include/rtl/stringconcat.hxx132
1 files changed, 16 insertions, 116 deletions
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(); }