Kaydet (Commit) 2c107144 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Make OUStringLiteral1 a wrapper around UTF-16 instead of just ASCII

...not merely an ASCII character

Change-Id: Id2b381b35fe3a15574728ed973d60263dfef7249
Reviewed-on: https://gerrit.libreoffice.org/28446Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst 0c8fa58a
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
#ifndef INCLUDED_CHART2_INC_SPECIALUNICODES_HXX #ifndef INCLUDED_CHART2_INC_SPECIALUNICODES_HXX
#define INCLUDED_CHART2_INC_SPECIALUNICODES_HXX #define INCLUDED_CHART2_INC_SPECIALUNICODES_HXX
const OUString aMinusSign ( sal_Unicode (0x2212) ); const sal_Unicode aMinusSign = 0x2212;
const OUString aNewLine ("\n"); const OUString aNewLine ("\n");
const OUString aHashString ("###"); const OUString aHashString ("###");
const sal_Unicode aSuperscriptFigures[10]={ 0x2070, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079 }; const sal_Unicode aSuperscriptFigures[10]={ 0x2070, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079 };
......
...@@ -136,7 +136,7 @@ void Chart2TrendCalculators::testPotentialRegression2() ...@@ -136,7 +136,7 @@ void Chart2TrendCalculators::testPotentialRegression2()
xValues[i] = d; xValues[i] = d;
yValues[i] = -2.0 * pow ( d, 3 ); yValues[i] = -2.0 * pow ( d, 3 );
} }
checkCalculator( xValues, yValues, "f(x) = "+ OUString(aMinusSign) +" 2 x^3"); checkCalculator( xValues, yValues, "f(x) = "+ OUStringLiteral1<aMinusSign>() +" 2 x^3");
} }
// test y = - 2 X - 5 // test y = - 2 X - 5
...@@ -152,7 +152,7 @@ void Chart2TrendCalculators::testLinearRegression1() ...@@ -152,7 +152,7 @@ void Chart2TrendCalculators::testLinearRegression1()
xValues[i] = d; xValues[i] = d;
yValues[i] = - 2.0 * d - 5.0 ; yValues[i] = - 2.0 * d - 5.0 ;
} }
checkCalculator( xValues, yValues, "f(x) = "+ OUString(aMinusSign) +" 2x "+ OUString(aMinusSign) +" 5"); checkCalculator( xValues, yValues, "f(x) = "+ OUStringLiteral1<aMinusSign>() +" 2x "+ OUStringLiteral1<aMinusSign>() +" 5");
} }
// test y = A x ^ B // test y = A x ^ B
...@@ -168,7 +168,7 @@ void Chart2TrendCalculators::testPolynomialRegression1() ...@@ -168,7 +168,7 @@ void Chart2TrendCalculators::testPolynomialRegression1()
xValues[i] = d; xValues[i] = d;
yValues[i] = - 2.0 * d * d + 4 * d - 5; yValues[i] = - 2.0 * d * d + 4 * d - 5;
} }
OUString sExpectedFormula( "f(x) = "+ OUString(aMinusSign) +" 2x" + OUString( aSuperscriptFigures[2] ) + " + 4x "+ OUString(aMinusSign) +" 5" ); OUString sExpectedFormula( "f(x) = "+ OUStringLiteral1<aMinusSign>() +" 2x" + OUString( aSuperscriptFigures[2] ) + " + 4x "+ OUStringLiteral1<aMinusSign>() +" 5" );
checkCalculator( xValues, yValues, sExpectedFormula ); checkCalculator( xValues, yValues, sExpectedFormula );
} }
...@@ -199,7 +199,7 @@ void Chart2TrendCalculators::testExponentialRegression2() ...@@ -199,7 +199,7 @@ void Chart2TrendCalculators::testExponentialRegression2()
xValues[i] = d; xValues[i] = d;
yValues[i] = -2.0 * exp ( 0.3 * d ); yValues[i] = -2.0 * exp ( 0.3 * d );
} }
checkCalculator( xValues, yValues, "f(x) = "+ OUString(aMinusSign) + " 2 exp( 0.3 x )"); checkCalculator( xValues, yValues, "f(x) = "+ OUStringLiteral1<aMinusSign>() + " 2 exp( 0.3 x )");
} }
......
...@@ -185,7 +185,7 @@ OUString ExponentialRegressionCurveCalculator::ImplGetRepresentation( ...@@ -185,7 +185,7 @@ OUString ExponentialRegressionCurveCalculator::ImplGetRepresentation(
// if nValueLength not calculated then nullptr // if nValueLength not calculated then nullptr
sal_Int32* pValueLength = nValueLength ? &nValueLength : nullptr; sal_Int32* pValueLength = nValueLength ? &nValueLength : nullptr;
if ( m_fSign < 0.0 ) if ( m_fSign < 0.0 )
aTmpBuf.append( aMinusSign + " " ); aTmpBuf.append( OUStringLiteral1<aMinusSign>() + " " );
if ( bHasIntercept ) if ( bHasIntercept )
{ {
OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fIntercept, pValueLength ); OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fIntercept, pValueLength );
...@@ -210,7 +210,7 @@ OUString ExponentialRegressionCurveCalculator::ImplGetRepresentation( ...@@ -210,7 +210,7 @@ OUString ExponentialRegressionCurveCalculator::ImplGetRepresentation(
} }
} }
if ( m_fLogSlope < 0.0 ) if ( m_fLogSlope < 0.0 )
aTmpBuf.append( aMinusSign + " " ); aTmpBuf.append( OUStringLiteral1<aMinusSign>() + " " );
if ( bHasLogSlope ) if ( bHasLogSlope )
{ {
OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fLogSlope), pValueLength ); OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fLogSlope), pValueLength );
......
...@@ -162,7 +162,7 @@ OUString LogarithmicRegressionCurveCalculator::ImplGetRepresentation( ...@@ -162,7 +162,7 @@ OUString LogarithmicRegressionCurveCalculator::ImplGetRepresentation(
{ {
if( m_fSlope < 0.0 ) if( m_fSlope < 0.0 )
{ {
aTmpBuf.append( aMinusSign + " " ); aTmpBuf.append( OUStringLiteral1<aMinusSign>() + " " );
} }
if( bHasSlope ) if( bHasSlope )
{ {
...@@ -181,7 +181,7 @@ OUString LogarithmicRegressionCurveCalculator::ImplGetRepresentation( ...@@ -181,7 +181,7 @@ OUString LogarithmicRegressionCurveCalculator::ImplGetRepresentation(
} }
// add intercept value // add intercept value
if( m_fIntercept < 0.0 ) if( m_fIntercept < 0.0 )
aTmpBuf.append( aMinusSign+" " ); aTmpBuf.append( OUStringLiteral1<aMinusSign>()+" " );
OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fIntercept), pValueLength ); OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fIntercept), pValueLength );
if ( aValueString != "0" ) // aValueString may be rounded to 0 if nValueLength is small if ( aValueString != "0" ) // aValueString may be rounded to 0 if nValueLength is small
{ {
......
...@@ -278,7 +278,7 @@ OUString PolynomialRegressionCurveCalculator::ImplGetRepresentation( ...@@ -278,7 +278,7 @@ OUString PolynomialRegressionCurveCalculator::ImplGetRepresentation(
{ {
if ( bFindValue ) // if it is not the first aValue if ( bFindValue ) // if it is not the first aValue
aTmpBuf.append( " " ); aTmpBuf.append( " " );
aTmpBuf.append( aMinusSign + " "); aTmpBuf.append( OUStringLiteral1<aMinusSign>() + " ");
aValue = - aValue; aValue = - aValue;
} }
else else
......
...@@ -176,7 +176,7 @@ OUString PotentialRegressionCurveCalculator::ImplGetRepresentation( ...@@ -176,7 +176,7 @@ OUString PotentialRegressionCurveCalculator::ImplGetRepresentation(
// if nValueLength not calculated then nullptr // if nValueLength not calculated then nullptr
sal_Int32* pValueLength = nValueLength ? &nValueLength : nullptr; sal_Int32* pValueLength = nValueLength ? &nValueLength : nullptr;
if ( m_fIntercept < 0.0 ) // add intercept value if ( m_fIntercept < 0.0 ) // add intercept value
aTmpBuf.append( aMinusSign+" " ); aTmpBuf.append( OUStringLiteral1<aMinusSign>()+" " );
if( bHasIntercept ) if( bHasIntercept )
{ {
OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fIntercept), pValueLength ); OUString aValueString = getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fIntercept), pValueLength );
......
...@@ -66,13 +66,6 @@ bool StringStatic::VisitVarDecl(VarDecl const* varDecl) ...@@ -66,13 +66,6 @@ bool StringStatic::VisitVarDecl(VarDecl const* varDecl)
if (ignoreLocation(varDecl)) { if (ignoreLocation(varDecl)) {
return true; return true;
} }
// We could use OUStringLiteral1 here, but we'd need to update OUStringLiteral1 to allow BMP chars first:
if (compiler.getSourceManager().getFilename(varDecl->getLocation())
== SRCDIR "/chart2/inc/SpecialUnicodes.hxx")
{
return true;
}
QualType qt = varDecl->getType(); QualType qt = varDecl->getType();
if (!varDecl->hasGlobalStorage() if (!varDecl->hasGlobalStorage()
|| !varDecl->isThisDeclarationADefinition() || !varDecl->isThisDeclarationADefinition()
......
...@@ -150,13 +150,11 @@ template<std::size_t N> struct ToStringHelper<sal_Unicode const[N]> { ...@@ -150,13 +150,11 @@ template<std::size_t N> struct ToStringHelper<sal_Unicode const[N]> {
static bool const allowOUStringConcat = true; static bool const allowOUStringConcat = true;
}; };
template<char C> struct ToStringHelper<OUStringLiteral1_<C>> { template<sal_Unicode C> struct ToStringHelper<OUStringLiteral1_<C>> {
static int length(OUStringLiteral1_<C>) { return 1; } static int length(OUStringLiteral1_<C>) { return 1; }
static char * addData(char * buffer, OUStringLiteral1_<C> literal)
{ return addDataHelper(buffer, &literal.c, 1); }
static sal_Unicode * addData( static sal_Unicode * addData(
sal_Unicode * buffer, OUStringLiteral1_<C> literal) sal_Unicode * buffer, OUStringLiteral1_<C> literal)
{ return addDataLiteral(buffer, &literal.c, 1); } { return addDataHelper(buffer, &literal.c, 1); }
static bool const allowOStringConcat = false; static bool const allowOStringConcat = false;
static bool const allowOUStringConcat = true; static bool const allowOUStringConcat = true;
}; };
......
...@@ -36,13 +36,13 @@ namespace rtl ...@@ -36,13 +36,13 @@ namespace rtl
#if defined LIBO_INTERNAL_ONLY #if defined LIBO_INTERNAL_ONLY
/// @cond INTERNAL /// @cond INTERNAL
/** A simple wrapper around an ASCII character literal. /** A simple wrapper around a sal_Unicode character literal.
Can be useful to pass a char constant with ASCII value into a Can be useful to pass a sal_Unicode constant into an OUString-related
OUString-related function that is optimized for ASCII string literal function that is optimized for UTF-16 string literal arguments. That is,
arguments. That is, instead of instead of
char const WILDCARD = '%'; sal_Unicode const WILDCARD = '%';
... ...
if (s[i] == WILDCARD) ... if (s[i] == WILDCARD) ...
... ...
...@@ -50,7 +50,7 @@ namespace rtl ...@@ -50,7 +50,7 @@ namespace rtl
use use
char const WILDCARD = '%'; sal_Unicode const WILDCARD = '%';
... ...
if (s[i] == WILDCARD) ... if (s[i] == WILDCARD) ...
... ...
...@@ -58,7 +58,7 @@ namespace rtl ...@@ -58,7 +58,7 @@ namespace rtl
to avoid creating a temporary OUString instance, and instead pick the to avoid creating a temporary OUString instance, and instead pick the
endsWith overload actually designed to take an argument of type endsWith overload actually designed to take an argument of type
char const[N]. sal_Unicode const[N].
Instances of OUStringLiteral1 need to be const, as those literal-optimized Instances of OUStringLiteral1 need to be const, as those literal-optimized
functions take the literal argument by non-const lvalue reference, for functions take the literal argument by non-const lvalue reference, for
...@@ -71,18 +71,15 @@ namespace rtl ...@@ -71,18 +71,15 @@ namespace rtl
@since LibreOffice 5.0 @since LibreOffice 5.0
*/ */
template<char C> struct SAL_WARN_UNUSED OUStringLiteral1_ { template<sal_Unicode C> struct SAL_WARN_UNUSED OUStringLiteral1_ {
static_assert( sal_Unicode const c = C;
static_cast<unsigned char>(C) < 0x80,
"non-ASCII character in OUStringLiteral1");
char const c = C;
}; };
#if defined _MSC_VER && _MSC_VER <= 1900 && !defined __clang__ #if defined _MSC_VER && _MSC_VER <= 1900 && !defined __clang__
// Visual Studio 2015 // Visual Studio 2015
template<char C> using OUStringLiteral1 = OUStringLiteral1_<C>; template<sal_Unicode C> using OUStringLiteral1 = OUStringLiteral1_<C>;
#pragma warning(disable: 4239) #pragma warning(disable: 4239)
#else #else
template<char C> using OUStringLiteral1 = OUStringLiteral1_<C> const; template<sal_Unicode C> using OUStringLiteral1 = OUStringLiteral1_<C> const;
#endif #endif
/// @endcond /// @endcond
...@@ -181,7 +178,7 @@ struct ConstCharArrayDetector<sal_Unicode const [N], T> { ...@@ -181,7 +178,7 @@ struct ConstCharArrayDetector<sal_Unicode const [N], T> {
sal_Unicode const (& literal)[N]) sal_Unicode const (& literal)[N])
{ return literal; } { return literal; }
}; };
template<char C, typename T> struct ConstCharArrayDetector< template<sal_Unicode C, typename T> struct ConstCharArrayDetector<
#if defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ <= 8 \ #if defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ <= 8 \
&& !defined __clang__ && !defined __clang__
OUStringLiteral1_<C> const, OUStringLiteral1_<C> const,
...@@ -190,11 +187,11 @@ template<char C, typename T> struct ConstCharArrayDetector< ...@@ -190,11 +187,11 @@ template<char C, typename T> struct ConstCharArrayDetector<
#endif #endif
T> T>
{ {
typedef T Type; using TypeUtf16 = T;
static const std::size_t length = 1; static SAL_CONSTEXPR bool const ok = true;
static const bool ok = true; static SAL_CONSTEXPR std::size_t const length = 1;
static bool isValid(OUStringLiteral1_<C>) { return true; } static SAL_CONSTEXPR sal_Unicode const * toPointer(
static char const * toPointer(OUStringLiteral1_<C> const & literal) OUStringLiteral1_<C> const & literal)
{ return &literal.c; } { return &literal.c; }
}; };
#endif #endif
...@@ -212,7 +209,7 @@ struct ExceptConstCharArrayDetector< const char[ N ] > ...@@ -212,7 +209,7 @@ struct ExceptConstCharArrayDetector< const char[ N ] >
#if defined LIBO_INTERNAL_ONLY #if defined LIBO_INTERNAL_ONLY
template<std::size_t N> template<std::size_t N>
struct ExceptConstCharArrayDetector<sal_Unicode const[N]> {}; struct ExceptConstCharArrayDetector<sal_Unicode const[N]> {};
template<char C> struct ExceptConstCharArrayDetector< template<sal_Unicode C> struct ExceptConstCharArrayDetector<
#if defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ <= 8 \ #if defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ <= 8 \
&& !defined __clang__ && !defined __clang__
OUStringLiteral1_<C> const OUStringLiteral1_<C> const
...@@ -243,7 +240,7 @@ struct ExceptCharArrayDetector< const char[ N ] > ...@@ -243,7 +240,7 @@ struct ExceptCharArrayDetector< const char[ N ] >
#if defined LIBO_INTERNAL_ONLY #if defined LIBO_INTERNAL_ONLY
template<std::size_t N> struct ExceptCharArrayDetector<sal_Unicode[N]> {}; template<std::size_t N> struct ExceptCharArrayDetector<sal_Unicode[N]> {};
template<std::size_t N> struct ExceptCharArrayDetector<sal_Unicode const[N]> {}; template<std::size_t N> struct ExceptCharArrayDetector<sal_Unicode const[N]> {};
template<char C> struct ExceptCharArrayDetector<OUStringLiteral1_<C>> {}; template<sal_Unicode C> struct ExceptCharArrayDetector<OUStringLiteral1_<C>> {};
#endif #endif
template< typename T1, typename T2 = void > template< typename T1, typename T2 = void >
......
...@@ -218,18 +218,20 @@ void test::oustring::StringLiterals::checkOUStringLiteral() ...@@ -218,18 +218,20 @@ void test::oustring::StringLiterals::checkOUStringLiteral()
void test::oustring::StringLiterals::checkOUStringLiteral1() void test::oustring::StringLiterals::checkOUStringLiteral1()
{ {
auto l1 = rtlunittest::OUStringLiteral1<'A'>(); auto l1 = rtlunittest::OUStringLiteral1<'A'>();
CPPUNIT_ASSERT_EQUAL('A', l1.c); CPPUNIT_ASSERT_EQUAL(sal_Unicode('A'), l1.c);
char const c2 = 'A'; char const c2 = 'A';
auto l2 = rtlunittest::OUStringLiteral1<c2>(); auto l2 = rtlunittest::OUStringLiteral1<c2>();
CPPUNIT_ASSERT_EQUAL('A', l2.c); CPPUNIT_ASSERT_EQUAL(sal_Unicode('A'), l2.c);
// char c3 = 'A'; auto l3 = rtlunittest::OUStringLiteral1<c3>(); // char c3 = 'A'; auto l3 = rtlunittest::OUStringLiteral1<c3>();
auto l4 = rtlunittest::OUStringLiteral1<sal_Unicode('A')>(); auto l4 = rtlunittest::OUStringLiteral1<sal_Unicode('A')>();
CPPUNIT_ASSERT_EQUAL('A', l4.c); CPPUNIT_ASSERT_EQUAL(sal_Unicode('A'), l4.c);
// auto l5 = rtlunittest::OUStringLiteral1<sal_Unicode(0x100)>(); sal_Unicode const c5 = 0x100;
auto l5 = rtlunittest::OUStringLiteral1<c5>();
CPPUNIT_ASSERT_EQUAL(c5, l5.c);
rtl::OUString s1{rtlunittest::OUStringLiteral1<'A'>()}; rtl::OUString s1{rtlunittest::OUStringLiteral1<'A'>()};
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), s1.getLength()); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), s1.getLength());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment