Make O(U)String::boolean also return an O(U)StringNumber

Change-Id: I184fa0e4e45662e0fac86076d1c8733a0465bb56
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149978
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/include/rtl/string.hxx b/include/rtl/string.hxx
index 70829b4..9c2c6ae 100644
--- a/include/rtl/string.hxx
+++ b/include/rtl/string.hxx
@@ -2125,6 +2125,9 @@ 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.

@@ -2141,6 +2144,7 @@ public:
        char aBuf[RTL_STR_MAX_VALUEOFBOOLEAN];
        return OString(aBuf, rtl_str_valueOfBoolean(aBuf, b));
    }
#endif

    /**
      Returns the string representation of the char argument.
diff --git a/include/rtl/stringconcat.hxx b/include/rtl/stringconcat.hxx
index da32c79..118d93d 100644
--- a/include/rtl/stringconcat.hxx
+++ b/include/rtl/stringconcat.hxx
@@ -393,6 +393,13 @@ struct OStringNumber< double >
    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

@@ -439,6 +446,13 @@ struct OUStringNumber< double >
    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 > >
{
diff --git a/include/rtl/ustring.hxx b/include/rtl/ustring.hxx
index ddc0b5d..36d122c 100644
--- a/include/rtl/ustring.hxx
+++ b/include/rtl/ustring.hxx
@@ -3186,6 +3186,9 @@ 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.

@@ -3202,6 +3205,7 @@ public:
        sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFBOOLEAN];
        return OUString(aBuf, rtl_ustr_valueOfBoolean(aBuf, b));
    }
#endif

    /**
      Returns the string representation of the char argument.
diff --git a/sal/qa/rtl/strings/test_strings_valuex.cxx b/sal/qa/rtl/strings/test_strings_valuex.cxx
index 6c9c836..953cf8b 100644
--- a/sal/qa/rtl/strings/test_strings_valuex.cxx
+++ b/sal/qa/rtl/strings/test_strings_valuex.cxx
@@ -42,8 +42,8 @@ namespace {

template< typename T >
void testBoolean() {
    CPPUNIT_ASSERT_EQUAL( T( "false" ), T::boolean( false ) );
    CPPUNIT_ASSERT_EQUAL( T( "true" ), T::boolean( true ) );
    CPPUNIT_ASSERT_EQUAL( T( "false" ), T(T::boolean( false )) );
    CPPUNIT_ASSERT_EQUAL( T( "true" ), T(T::boolean( true )) );
}

}