connectivity/source/drivers/flat/ETable.cxx | 2 framework/source/uielement/spinfieldtoolbarcontroller.cxx | 16 ++-- include/rtl/string.hxx | 33 +++++---- include/rtl/ustring.hxx | 33 +++++---- oox/source/export/drawingml.cxx | 50 +++++++------- sal/qa/rtl/oustring/rtl_OUString2.cxx | 4 - sal/qa/rtl/strings/test_ostring_concat.cxx | 4 - sal/qa/rtl/strings/test_oustring_concat.cxx | 4 - 8 files changed, 80 insertions(+), 66 deletions(-)
New commits: commit 8b6d167608d74986e97d462fde8efcae4c28b564 Author: Mike Kaganski <[email protected]> AuthorDate: Mon Apr 10 11:15:02 2023 +0200 Commit: Mike Kaganski <[email protected]> CommitDate: Mon Apr 10 16:36:09 2023 +0200 Use of O(U)StringNumber for float/double is actually a pessimisation They use rtl_(u)str_valueOf(Float|Double), to fill the buffer, and the latter use doubleToString, which creates an rtl_(u)String, copies to the buffer, and releases the rtl_(u)String. So instead just use the rtl_(u)String from rtl_math_doubleTo(U)String directly. Even when the end result is not needed as O(U)String, this would avoid an extra copy step. Also, this avoids separate LIBO_INTERNAL_ONLY implementations. Change-Id: Ib1d9ecebd7876dfff7dc758f89ee4c1536647a50 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150150 Tested-by: Jenkins Reviewed-by: Mike Kaganski <[email protected]> diff --git a/connectivity/source/drivers/flat/ETable.cxx b/connectivity/source/drivers/flat/ETable.cxx index 38cf9296bfe7..9cab6b13da5a 100644 --- a/connectivity/source/drivers/flat/ETable.cxx +++ b/connectivity/source/drivers/flat/ETable.cxx @@ -660,7 +660,7 @@ bool OFlatTable::fetchRow(OValueRefRow& _rRow, const OSQLColumns & _rCols, bool // #99178# OJ if ( DataType::DECIMAL == nType || DataType::NUMERIC == nType ) - *(*_rRow)[i] = OUString(OUString::number(nVal)); + *(*_rRow)[i] = OUString::number(nVal); else *(*_rRow)[i] = nVal; } break; diff --git a/framework/source/uielement/spinfieldtoolbarcontroller.cxx b/framework/source/uielement/spinfieldtoolbarcontroller.cxx index ce74c9041ef9..9ba295f30932 100644 --- a/framework/source/uielement/spinfieldtoolbarcontroller.cxx +++ b/framework/source/uielement/spinfieldtoolbarcontroller.cxx @@ -256,7 +256,7 @@ void SpinfieldToolbarController::executeControlCommand( const css::frame::Contro double fValue; bool bFloat( false ); if ( impl_getValue( arg.Value, nValue, fValue, bFloat )) - aStep = bFloat ? OUString( OUString::number( fValue )) : + aStep = bFloat ? OUString::number( fValue ) : OUString( OUString::number( nValue )); break; } @@ -274,7 +274,7 @@ void SpinfieldToolbarController::executeControlCommand( const css::frame::Contro if ( impl_getValue( arg.Value, nValue, fValue, bFloat )) { - aValue = bFloat ? OUString( OUString::number( fValue )) : + aValue = bFloat ? OUString::number( fValue ) : OUString( OUString::number( nValue )); bFloatValue = bFloat; } @@ -295,18 +295,18 @@ void SpinfieldToolbarController::executeControlCommand( const css::frame::Contro { if ( aName == "Value" ) { - aValue = bFloat ? OUString( OUString::number( fValue )) : + aValue = bFloat ? OUString::number( fValue ) : OUString( OUString::number( nValue )); bFloatValue = bFloat; } else if ( aName == "Step" ) - aStep = bFloat ? OUString( OUString::number( fValue )) : + aStep = bFloat ? OUString::number( fValue ) : OUString( OUString::number( nValue )); else if ( aName == "LowerLimit" ) - aMin = bFloat ? OUString( OUString::number( fValue )) : + aMin = bFloat ? OUString::number( fValue ) : OUString( OUString::number( nValue )); else if ( aName == "UpperLimit" ) - aMax = bFloat ? OUString( OUString::number( fValue )) : + aMax = bFloat ? OUString::number( fValue ) : OUString( OUString::number( nValue )); } else if ( aName == "OutputFormat" ) @@ -323,7 +323,7 @@ void SpinfieldToolbarController::executeControlCommand( const css::frame::Contro double fValue; bool bFloat( false ); if ( impl_getValue( arg.Value, nValue, fValue, bFloat )) - aMin = bFloat ? OUString( OUString::number( fValue )) : + aMin = bFloat ? OUString::number( fValue ) : OUString( OUString::number( nValue )); break; } @@ -339,7 +339,7 @@ void SpinfieldToolbarController::executeControlCommand( const css::frame::Contro double fValue; bool bFloat( false ); if ( impl_getValue( arg.Value, nValue, fValue, bFloat )) - aMax = bFloat ? OUString( OUString::number( fValue )) : + aMax = bFloat ? OUString::number( fValue ) : OUString( OUString::number( nValue )); break; } diff --git a/include/rtl/string.hxx b/include/rtl/string.hxx index 5b01df33e71f..091f224b25d6 100644 --- a/include/rtl/string.hxx +++ b/include/rtl/string.hxx @@ -40,6 +40,7 @@ #include <type_traits> #endif +#include "rtl/math.h" #include "rtl/textenc.h" #include "rtl/string.h" #include "rtl/stringutils.hxx" @@ -2021,14 +2022,6 @@ public: { return number( static_cast< unsigned long long >( i ), radix ); } - static auto number( float f ) - { - return OStringNumber<RTL_STR_MAX_VALUEOFFLOAT>(rtl_str_valueOfFloat, f); - } - static auto number( double d ) - { - return OStringNumber<RTL_STR_MAX_VALUEOFDOUBLE>(rtl_str_valueOfDouble, d); - } #else /** Returns the string representation of the integer argument. @@ -2077,6 +2070,7 @@ public: char aBuf[RTL_STR_MAX_VALUEOFUINT64]; return OString(aBuf, rtl_str_valueOfUInt64(aBuf, ll, radix)); } +#endif /** Returns the string representation of the float argument. @@ -2089,8 +2083,15 @@ public: */ static OString number( float f ) { - char aBuf[RTL_STR_MAX_VALUEOFFLOAT]; - return OString(aBuf, rtl_str_valueOfFloat(aBuf, f)); + rtl_String* pNew = NULL; + // Same as rtl::str::valueOfFP, used for rtl_str_valueOfFloat + rtl_math_doubleToString(&pNew, NULL, 0, f, rtl_math_StringFormat_G, + RTL_STR_MAX_VALUEOFFLOAT - SAL_N_ELEMENTS("-x.E-xxx") + 1, '.', + NULL, 0, true); + if (pNew == NULL) + throw std::bad_alloc(); + + return OString(pNew, SAL_NO_ACQUIRE); } /** @@ -2104,10 +2105,16 @@ public: */ static OString number( double d ) { - char aBuf[RTL_STR_MAX_VALUEOFDOUBLE]; - return OString(aBuf, rtl_str_valueOfDouble(aBuf, d)); + rtl_String* pNew = NULL; + // Same as rtl::str::valueOfFP, used for rtl_str_valueOfDouble + rtl_math_doubleToString(&pNew, NULL, 0, d, rtl_math_StringFormat_G, + RTL_STR_MAX_VALUEOFDOUBLE - SAL_N_ELEMENTS("-x.E-xxx") + 1, '.', + NULL, 0, true); + if (pNew == NULL) + throw std::bad_alloc(); + + return OString(pNew, SAL_NO_ACQUIRE); } -#endif #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING" static auto boolean(bool b) diff --git a/include/rtl/ustring.hxx b/include/rtl/ustring.hxx index a87082aacfff..263cb71d74c9 100644 --- a/include/rtl/ustring.hxx +++ b/include/rtl/ustring.hxx @@ -39,6 +39,7 @@ #include <type_traits> #endif +#include "rtl/math.h" #include "rtl/ustring.h" #include "rtl/string.hxx" #include "rtl/stringutils.hxx" @@ -3082,14 +3083,6 @@ public: { return number( static_cast< unsigned long long >( i ), radix ); } - static auto number( float f ) - { - return OUStringNumber<RTL_USTR_MAX_VALUEOFFLOAT>(rtl_ustr_valueOfFloat, f); - } - static auto number( double d ) - { - return OUStringNumber<RTL_USTR_MAX_VALUEOFDOUBLE>(rtl_ustr_valueOfDouble, d); - } #else /** Returns the string representation of the integer argument. @@ -3138,6 +3131,7 @@ public: sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFUINT64]; return OUString(aBuf, rtl_ustr_valueOfUInt64(aBuf, ll, radix)); } +#endif /** Returns the string representation of the float argument. @@ -3150,8 +3144,15 @@ public: */ static OUString number( float f ) { - sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFFLOAT]; - return OUString(aBuf, rtl_ustr_valueOfFloat(aBuf, f)); + rtl_uString* pNew = NULL; + // Same as rtl::str::valueOfFP, used for rtl_ustr_valueOfFloat + rtl_math_doubleToUString(&pNew, NULL, 0, f, rtl_math_StringFormat_G, + RTL_USTR_MAX_VALUEOFFLOAT - SAL_N_ELEMENTS("-x.E-xxx") + 1, '.', + NULL, 0, true); + if (pNew == NULL) + throw std::bad_alloc(); + + return OUString(pNew, SAL_NO_ACQUIRE); } /** @@ -3165,10 +3166,16 @@ public: */ static OUString number( double d ) { - sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFDOUBLE]; - return OUString(aBuf, rtl_ustr_valueOfDouble(aBuf, d)); + rtl_uString* pNew = NULL; + // Same as rtl::str::valueOfFP, used for rtl_ustr_valueOfDouble + rtl_math_doubleToUString(&pNew, NULL, 0, d, rtl_math_StringFormat_G, + RTL_USTR_MAX_VALUEOFDOUBLE - SAL_N_ELEMENTS("-x.E-xxx") + 1, '.', + NULL, 0, true); + if (pNew == NULL) + throw std::bad_alloc(); + + return OUString(pNew, SAL_NO_ACQUIRE); } -#endif #ifdef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING" static auto boolean(bool b) diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 270d961d6d5a..3700d93f78fc 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -723,7 +723,7 @@ void DrawingML::WriteGrabBagGradientFill( const Sequence< PropertyValue >& aGrad rProp.Value >>= aTransformations; } // write stop - mpFS->startElementNS(XML_a, XML_gs, XML_pos, OString::number(nPos * 100000.0).getStr()); + mpFS->startElementNS(XML_a, XML_gs, XML_pos, OString::number(nPos * 100000.0)); if( sSchemeClr.isEmpty() ) { // Calculate alpha value (see oox/source/drawingml/color.cxx : getTransparency()) @@ -2836,7 +2836,7 @@ void DrawingML::WriteRun( const Reference< XTextRange >& rRun, { mpFS->startElementNS(XML_a, XML_br); mpFS->singleElementNS(XML_a, XML_rPr, XML_sz, - OString::number(nFontSize * 100).getStr()); + OString::number(nFontSize * 100)); mpFS->endElementNS(XML_a, XML_br); } else @@ -5306,91 +5306,91 @@ void DrawingML::WriteShapeEffect( std::u16string_view sName, const Sequence< Pro { sal_Int64 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_blurRad, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_blurRad, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "dir" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_dir, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_dir, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "dist" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_dist, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_dist, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "kx" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_kx, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_kx, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "ky" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_ky, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_ky, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "rotWithShape" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_rotWithShape, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_rotWithShape, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "sx" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_sx, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_sx, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "sy" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_sy, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_sy, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "rad" ) { sal_Int64 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_rad, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_rad, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "endA" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_endA, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_endA, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "endPos" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_endPos, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_endPos, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "fadeDir" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_fadeDir, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_fadeDir, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "stA" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_stA, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_stA, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "stPos" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_stPos, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_stPos, OString::number( nVal ) ); } else if( rOuterShdwProp.Name == "grow" ) { sal_Int32 nVal = 0; rOuterShdwProp.Value >>= nVal; - aOuterShdwAttrList->add( XML_grow, OString::number( nVal ).getStr() ); + aOuterShdwAttrList->add( XML_grow, OString::number( nVal ) ); } } } @@ -5679,13 +5679,13 @@ void DrawingML::Write3DEffects( const Reference< XPropertySet >& xPropSet, bool { float fVal = 0; rEffectProp.Value >>= fVal; - aCameraAttrList->add( XML_fov, OString::number( fVal * 60000 ).getStr() ); + aCameraAttrList->add( XML_fov, OString::number( fVal * 60000 ) ); } else if( rEffectProp.Name == "zoom" ) { float fVal = 1; rEffectProp.Value >>= fVal; - aCameraAttrList->add( XML_zoom, OString::number( fVal * 100000 ).getStr() ); + aCameraAttrList->add( XML_zoom, OString::number( fVal * 100000 ) ); } else if( rEffectProp.Name == "rotLat" || rEffectProp.Name == "rotLon" || @@ -5699,7 +5699,7 @@ void DrawingML::Write3DEffects( const Reference< XPropertySet >& xPropSet, bool nToken = XML_lon; else if( rEffectProp.Name == "rotRev" ) nToken = XML_rev; - aCameraRotationAttrList->add( nToken, OString::number( nVal ).getStr() ); + aCameraRotationAttrList->add( nToken, OString::number( nVal ) ); bCameraRotationPresent = true; } } @@ -5732,7 +5732,7 @@ void DrawingML::Write3DEffects( const Reference< XPropertySet >& xPropSet, bool nToken = XML_lon; else if( rLightRigProp.Name == "rotRev" ) nToken = XML_rev; - aLightRigRotationAttrList->add( nToken, OString::number( nVal ).getStr() ); + aLightRigRotationAttrList->add( nToken, OString::number( nVal ) ); bLightRigRotationPresent = true; } } @@ -5791,7 +5791,7 @@ void DrawingML::Write3DEffects( const Reference< XPropertySet >& xPropSet, bool nToken = XML_contourW; else if( rShape3DProp.Name == "z" ) nToken = XML_z; - aShape3DAttrList->add( nToken, OString::number( nVal ).getStr() ); + aShape3DAttrList->add( nToken, OString::number( nVal ) ); } else if( rShape3DProp.Name == "prstMaterial" ) { @@ -5835,7 +5835,7 @@ void DrawingML::Write3DEffects( const Reference< XPropertySet >& xPropSet, bool nToken = XML_w; else if( rBevelProp.Name == "h" ) nToken = XML_h; - aBevelAttrList->add( nToken, OString::number( nVal ).getStr() ); + aBevelAttrList->add( nToken, OString::number( nVal ) ); } else if( rBevelProp.Name == "prst" ) { @@ -5939,7 +5939,7 @@ void DrawingML::WriteArtisticEffect( const Reference< XPropertySet >& rXPropSet { sal_Int32 nVal = 0; rAttr.Value >>= nVal; - aAttrList->add( nToken, OString::number( nVal ).getStr() ); + aAttrList->add( nToken, OString::number( nVal ) ); } else if( rAttr.Name == "OriginalGraphic" ) { @@ -6049,7 +6049,7 @@ void DrawingML::WriteDiagram(const css::uno::Reference<css::drawing::XShape>& rX // generate a unique id rtl::Reference<sax_fastparser::FastAttributeList> pDocPrAttrList = sax_fastparser::FastSerializerHelper::createAttrList(); - pDocPrAttrList->add(XML_id, OString::number(nDiagramId).getStr()); + pDocPrAttrList->add(XML_id, OString::number(nDiagramId)); OString sName = "Diagram" + OString::number(nDiagramId); pDocPrAttrList->add(XML_name, sName); diff --git a/sal/qa/rtl/oustring/rtl_OUString2.cxx b/sal/qa/rtl/oustring/rtl_OUString2.cxx index 22e731fd16f1..1340b262642b 100644 --- a/sal/qa/rtl/oustring/rtl_OUString2.cxx +++ b/sal/qa/rtl/oustring/rtl_OUString2.cxx @@ -866,11 +866,11 @@ public: std::unique_ptr<OUString[]> pStrs(new OUString[nSequence]); for (i = 0; i < nSequence; i++) { - pStrs[i] = OUString( OUString::number( sqrt( static_cast<double>(i) ) ) ).intern(); + pStrs[i] = OUString::number( sqrt( static_cast<double>(i) ) ).intern(); } for (i = 0; i < nSequence; i++) { - OUString aNew = OUString( OUString::number( sqrt( static_cast<double>(i) ) ) ).intern(); + OUString aNew = OUString::number( sqrt( static_cast<double>(i) ) ).intern(); CPPUNIT_ASSERT_EQUAL_MESSAGE("double intern failed", pStrs[i].pData, aNew.pData); } diff --git a/sal/qa/rtl/strings/test_ostring_concat.cxx b/sal/qa/rtl/strings/test_ostring_concat.cxx index 0ad7842d56ba..11bf8ebf80af 100644 --- a/sal/qa/rtl/strings/test_ostring_concat.cxx +++ b/sal/qa/rtl/strings/test_ostring_concat.cxx @@ -113,9 +113,9 @@ void test::ostring::StringConcat::checkConcat() CPPUNIT_ASSERT_EQUAL( OString( "num10" ), OString( 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, StringNumber< char, RTL_STR_MAX_VALUEOFFLOAT > > )), typeid( OString( "num" ) + OString::number( 10.5f ))); + CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, OString > )), 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, StringNumber< char, RTL_STR_MAX_VALUEOFDOUBLE > > )), typeid( OString( "num" ) + OString::number( 10.5 ))); + CPPUNIT_ASSERT_EQUAL(( typeid( OStringConcat< OString, OString > )), typeid( OString( "num" ) + OString::number( 10.5 ))); } void test::ostring::StringConcat::checkEnsureCapacity() diff --git a/sal/qa/rtl/strings/test_oustring_concat.cxx b/sal/qa/rtl/strings/test_oustring_concat.cxx index 6c2ee435e31a..7e69db26ed4e 100644 --- a/sal/qa/rtl/strings/test_oustring_concat.cxx +++ b/sal/qa/rtl/strings/test_oustring_concat.cxx @@ -98,9 +98,9 @@ void test::oustring::StringConcat::checkConcat() CPPUNIT_ASSERT_EQUAL( OUString( "num10" ), OUString( 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, StringNumber< sal_Unicode, RTL_USTR_MAX_VALUEOFFLOAT > > )), typeid( OUString( "num" ) + OUString::number( 10.5f ))); + CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, OUString > )), 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, StringNumber< sal_Unicode, RTL_USTR_MAX_VALUEOFDOUBLE > > )), typeid( OUString( "num" ) + OUString::number( 10.5 ))); + CPPUNIT_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, OUString > )), typeid( OUString( "num" ) + OUString::number( 10.5 ))); } void test::oustring::StringConcat::checkConcatAsciiL()
