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>
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
+25
-22
@@ -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.
|
||||
|
||||
|
||||
+16
-116
@@ -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
|
||||
template<std::size_t nBufSize> using OStringNumber = StringNumber<char, nBufSize>;
|
||||
template<std::size_t nBufSize> using OUStringNumber = StringNumber<sal_Unicode, nBufSize>;
|
||||
|
||||
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<>
|
||||
struct OStringNumber< int >
|
||||
: public StringNumberBase<char, int, RTL_STR_MAX_VALUEOFINT32>
|
||||
template< typename C, std::size_t nBufSize >
|
||||
struct ToStringHelper< StringNumber< C, nBufSize > >
|
||||
{
|
||||
OStringNumber(number_t i, sal_Int16 radix) { length = rtl_str_valueOfInt32(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< long long >
|
||||
: public StringNumberBase<char, long long, RTL_STR_MAX_VALUEOFINT64>
|
||||
{
|
||||
OStringNumber(number_t i, sal_Int16 radix) { length = rtl_str_valueOfInt64(buf, i, radix); }
|
||||
};
|
||||
|
||||
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(); }
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
+27
-24
@@ -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.
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user