summaryrefslogtreecommitdiff
path: root/include/rtl
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2015-06-25 10:15:34 +0200
committerStephan Bergmann <sbergman@redhat.com>2015-06-25 12:38:32 +0200
commit8007417c318140d74b87ec5abcf835f4a2ba9682 (patch)
tree0ea40500853d78008c0d1aa1083a0e415e457e9a /include/rtl
parent707ef3171a096787b2f7a4c221e60962f05e7d01 (diff)
Revert "Revert "Generalize OUStringLiteral1""
This reverts commit 5cba714b4d03ed54debf71534ad8c8edc383a01e, now including a workaround for <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53658> "internal compiler error -- segmentation fault." Change-Id: I31f6d9ddcb0b884134703df2b9dc1800ba0a84be
Diffstat (limited to 'include/rtl')
-rw-r--r--include/rtl/strbuf.hxx28
-rw-r--r--include/rtl/string.hxx130
-rw-r--r--include/rtl/stringconcat.hxx13
-rw-r--r--include/rtl/stringutils.hxx87
-rw-r--r--include/rtl/ustrbuf.hxx49
-rw-r--r--include/rtl/ustring.hxx305
6 files changed, 413 insertions, 199 deletions
diff --git a/include/rtl/strbuf.hxx b/include/rtl/strbuf.hxx
index 81773b48a28a..307110367a1e 100644
--- a/include/rtl/strbuf.hxx
+++ b/include/rtl/strbuf.hxx
@@ -170,10 +170,14 @@ public:
template< typename T >
OStringBuffer( T& literal, typename libreoffice_internal::ConstCharArrayDetector< T, libreoffice_internal::Dummy >::Type = libreoffice_internal::Dummy())
: pData(NULL)
- , nCapacity( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 + 16 )
- {
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- rtl_string_newFromLiteral( &pData, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, 16 );
+ , nCapacity( libreoffice_internal::ConstCharArrayDetector<T>::length + 16 )
+ {
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ rtl_string_newFromLiteral(
+ &pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length, 16);
#ifdef RTL_STRING_UNITTEST
rtl_string_unittest_const_literal = true;
#endif
@@ -453,8 +457,12 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, OStringBuffer& >::Type append( T& literal )
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- rtl_stringbuffer_insert( &pData, &nCapacity, getLength(), literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ rtl_stringbuffer_insert(
+ &pData, &nCapacity, getLength(),
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
return *this;
}
@@ -708,8 +716,12 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, OStringBuffer& >::Type insert( sal_Int32 offset, T& literal )
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- rtl_stringbuffer_insert( &pData, &nCapacity, offset, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ rtl_stringbuffer_insert(
+ &pData, &nCapacity, offset,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
return *this;
}
diff --git a/include/rtl/string.hxx b/include/rtl/string.hxx
index 56cbf932cea1..e3237ff29afd 100644
--- a/include/rtl/string.hxx
+++ b/include/rtl/string.hxx
@@ -181,12 +181,18 @@ public:
template< typename T >
OString( T& literal, typename libreoffice_internal::ConstCharArrayDetector< T, libreoffice_internal::Dummy >::Type = libreoffice_internal::Dummy() )
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
pData = 0;
- if( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 == 0 ) // empty string
- rtl_string_new( &pData );
- else
- rtl_string_newFromLiteral( &pData, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
+ if (libreoffice_internal::ConstCharArrayDetector<T>::length == 0) {
+ rtl_string_new(&pData);
+ } else {
+ rtl_string_newFromLiteral(
+ &pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length, 0);
+ }
#ifdef RTL_STRING_UNITTEST
rtl_string_unittest_const_literal = true;
#endif
@@ -278,11 +284,17 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, OString& >::Type operator=( T& literal )
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- if( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 == 0 ) // empty string
- rtl_string_new( &pData );
- else
- rtl_string_newFromLiteral( &pData, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ if (libreoffice_internal::ConstCharArrayDetector<T>::length == 0) {
+ rtl_string_new(&pData);
+ } else {
+ rtl_string_newFromLiteral(
+ &pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length, 0);
+ }
return *this;
}
@@ -543,11 +555,17 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type equalsIgnoreAsciiCase( T& literal ) const
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- if ( pData->length != libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 )
- return false;
- return rtl_str_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length,
- literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return
+ (pData->length
+ == libreoffice_internal::ConstCharArrayDetector<T>::length)
+ && (rtl_str_compareIgnoreAsciiCase_WithLength(
+ pData->buffer, pData->length,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length)
+ == 0);
}
/**
@@ -608,10 +626,16 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type match( T& literal, sal_Int32 fromIndex = 0 ) const
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return rtl_str_shortenedCompare_WithLength(
- pData->buffer + fromIndex, pData->length - fromIndex,
- literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1) == 0;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return
+ rtl_str_shortenedCompare_WithLength(
+ pData->buffer + fromIndex, pData->length - fromIndex,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length,
+ libreoffice_internal::ConstCharArrayDetector<T>::length)
+ == 0;
}
/**
@@ -681,9 +705,16 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type matchIgnoreAsciiCase( T& literal, sal_Int32 fromIndex = 0 ) const
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
- literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return
+ rtl_str_shortenedCompareIgnoreAsciiCase_WithLength(
+ pData->buffer+fromIndex, pData->length-fromIndex,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length,
+ libreoffice_internal::ConstCharArrayDetector<T>::length)
+ == 0;
}
/**
@@ -720,7 +751,8 @@ public:
RTL_STRING_CONST_FUNCTION
bool b = match(literal, 0);
if (b && rest != 0) {
- *rest = copy(libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
+ *rest = copy(
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
return b;
}
@@ -758,14 +790,21 @@ public:
T & literal, OString * rest = 0) const
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- bool b = libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 <= getLength()
- && match(literal, getLength() - ( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ));
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ bool b
+ = (libreoffice_internal::ConstCharArrayDetector<T>::length
+ <= sal_uInt32(getLength()))
+ && match(
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ (getLength()
+ - libreoffice_internal::ConstCharArrayDetector<T>::length));
if (b && rest != 0) {
*rest = copy(
0,
(getLength()
- - (libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1)));
+ - libreoffice_internal::ConstCharArrayDetector<T>::length));
}
return b;
}
@@ -834,10 +873,17 @@ public:
friend typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator==( const OString& rStr, T& literal )
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return rStr.getLength() == libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1
- && rtl_str_compare_WithLength( rStr.pData->buffer, rStr.pData->length, literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return
+ (rStr.getLength()
+ == libreoffice_internal::ConstCharArrayDetector<T>::length)
+ && (rtl_str_compare_WithLength(
+ rStr.pData->buffer, rStr.pData->length,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length)
+ == 0);
}
/**
@@ -849,10 +895,17 @@ public:
friend typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator==( T& literal, const OString& rStr )
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return rStr.getLength() == libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1
- && rtl_str_compare_WithLength( rStr.pData->buffer, rStr.pData->length, literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return
+ (rStr.getLength()
+ == libreoffice_internal::ConstCharArrayDetector<T>::length)
+ && (rtl_str_compare_WithLength(
+ rStr.pData->buffer, rStr.pData->length,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length)
+ == 0);
}
template< typename T >
@@ -994,9 +1047,12 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const
{
RTL_STRING_CONST_FUNCTION
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
sal_Int32 n = rtl_str_indexOfStr_WithLength(
- pData->buffer + fromIndex, pData->length - fromIndex, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
+ pData->buffer + fromIndex, pData->length - fromIndex,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
return n < 0 ? n : n + fromIndex;
}
diff --git a/include/rtl/stringconcat.hxx b/include/rtl/stringconcat.hxx
index a74dd77ad78c..7ef9e1104094 100644
--- a/include/rtl/stringconcat.hxx
+++ b/include/rtl/stringconcat.hxx
@@ -141,6 +141,19 @@ struct ToStringHelper< const char[ N ] >
static const bool allowOUStringConcat = true;
};
+#if defined LIBO_INTERNAL_ONLY
+template<char C> struct ToStringHelper<OUStringLiteral1_<C>> {
+ 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(
+ sal_Unicode * buffer, OUStringLiteral1_<C> literal)
+ { return addDataLiteral(buffer, &literal.c, 1); }
+ static bool const allowOStringConcat = false;
+ static bool const allowOUStringConcat = true;
+};
+#endif
+
/**
@internal
diff --git a/include/rtl/stringutils.hxx b/include/rtl/stringutils.hxx
index fb11545569e4..ff25d4d57b20 100644
--- a/include/rtl/stringutils.hxx
+++ b/include/rtl/stringutils.hxx
@@ -11,6 +11,10 @@
#define INCLUDED_RTL_STRINGUTILS_HXX
#include <sal/config.h>
+
+#include <cstddef>
+#include <cstring>
+
#include <sal/types.h>
// The unittest uses slightly different code to help check that the proper
@@ -29,6 +33,60 @@ namespace rtl
#undef rtl
#endif
+#if defined LIBO_INTERNAL_ONLY
+/// @cond INTERNAL
+
+/** A simple wrapper around an ASCII character literal.
+
+ Can be useful to pass a char constant with ASCII value into a
+ OUString-related function that is optimized for ASCII string literal
+ arguments. That is, instead of
+
+ char const WILDCARD = '%';
+ ...
+ if (s[i] == WILDCARD) ...
+ ...
+ if (s.endsWith(OUString(WILDCARD))) ...
+
+ use
+
+ char const WILDCARD = '%';
+ ...
+ if (s[i] == WILDCARD) ...
+ ...
+ if (s.endsWith(OUStringLiteral1<WILDCARD>())) ...
+
+ to avoid creating a temporary OUString instance, and instead pick the
+ endsWith overload actually designed to take an argument of type
+ char const[N].
+
+ Instances of OUStringLiteral1 need to be const, as those literal-optimized
+ functions take the literal argument by non-const lvalue reference, for
+ technical reasons. Except with MSVC, at least up to Visual Studio 2013:
+ For one, it fails to take that const-ness into account when trying to match
+ "OUStringLiteral1_<C> const" against T in a "T & literal" parameter of a
+ function template. But for another, as a language extension, it allows to
+ bind non-const temporary OUStringLiteral1_ instances to non-const lvalue
+ references, but also with a warning that thus needs to be disabled.
+
+ @since LibreOffice 5.0
+*/
+template<char C> struct SAL_WARN_UNUSED OUStringLiteral1_ {
+ static_assert(
+ static_cast<unsigned char>(C) < 0x80,
+ "non-ASCII character in OUStringLiteral1");
+ char const c = C;
+};
+#if defined _MSC_VER && _MSC_VER <= 1800 // Visual Studio 2013
+template<char C> using OUStringLiteral1 = OUStringLiteral1_<C>;
+#pragma warning(disable: 4239)
+#else
+template<char C> using OUStringLiteral1 = OUStringLiteral1_<C> const;
+#endif
+
+/// @endcond
+#endif
+
namespace libreoffice_internal
{
/*
@@ -102,13 +160,34 @@ struct ConstCharArrayDetector
{
static const bool ok = false;
};
-template< int N, typename T >
+template< std::size_t N, typename T >
struct ConstCharArrayDetector< const char[ N ], T >
{
typedef T Type;
- static const int size = N;
+ static const std::size_t length = N - 1;
static const bool ok = true;
+ static bool isValid(char const (& literal)[N])
+ { return std::strlen(literal) == length; }
+ static char const * toPointer(char const (& literal)[N]) { return literal; }
};
+#if defined LIBO_INTERNAL_ONLY
+template<char C, typename T> struct ConstCharArrayDetector<
+#if defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ <= 8 \
+ && !defined __clang__
+ OUStringLiteral1_<C> const,
+#else
+ OUStringLiteral1<C>,
+#endif
+ T>
+{
+ typedef T Type;
+ static const std::size_t length = 1;
+ static const bool ok = true;
+ static bool isValid(OUStringLiteral1_<C>) { return true; }
+ static char const * toPointer(OUStringLiteral1_<C> const & literal)
+ { return &literal.c; }
+};
+#endif
// this one is used to rule out only const char[N]
template< typename T >
@@ -137,6 +216,10 @@ template< int N >
struct ExceptCharArrayDetector< const char[ N ] >
{
};
+#if defined LIBO_INTERNAL_ONLY && defined _MSC_VER && _MSC_VER <= 1800
+ // Visual Studio 2013
+template<char C> struct ExceptCharArrayDetector<OUStringLiteral1<C>> {};
+#endif
template< typename T1, typename T2 = void >
struct SalUnicodePtrDetector
diff --git a/include/rtl/ustrbuf.hxx b/include/rtl/ustrbuf.hxx
index 04ac8a6c00f4..fe64ebe48280 100644
--- a/include/rtl/ustrbuf.hxx
+++ b/include/rtl/ustrbuf.hxx
@@ -132,10 +132,14 @@ public:
template< typename T >
OUStringBuffer( T& literal, typename libreoffice_internal::ConstCharArrayDetector< T, libreoffice_internal::Dummy >::Type = libreoffice_internal::Dummy() )
: pData(NULL)
- , nCapacity( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 + 16 )
- {
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- rtl_uString_newFromLiteral( &pData, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, 16 );
+ , nCapacity( libreoffice_internal::ConstCharArrayDetector<T>::length + 16 )
+ {
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ rtl_uString_newFromLiteral(
+ &pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length, 16);
#ifdef RTL_STRING_UNITTEST
rtl_string_unittest_const_literal = true;
#endif
@@ -470,9 +474,12 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, OUStringBuffer& >::Type append( T& literal )
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- rtl_uStringbuffer_insert_ascii( &pData, &nCapacity, getLength(), literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ rtl_uStringbuffer_insert_ascii(
+ &pData, &nCapacity, getLength(),
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
return *this;
}
@@ -813,9 +820,12 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, OUStringBuffer& >::Type insert( sal_Int32 offset, T& literal )
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- rtl_uStringbuffer_insert_ascii( &pData, &nCapacity, offset, literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ rtl_uStringbuffer_insert_ascii(
+ &pData, &nCapacity, offset,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
return *this;
}
@@ -1199,11 +1209,13 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- sal_Int32 ret = rtl_ustr_indexOfAscii_WithLength(
- pData->buffer + fromIndex, pData->length - fromIndex, literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
- return ret < 0 ? ret : ret + fromIndex;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ sal_Int32 n = rtl_ustr_indexOfAscii_WithLength(
+ pData->buffer + fromIndex, pData->length - fromIndex,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
+ return n < 0 ? n : n + fromIndex;
}
/**
@@ -1263,9 +1275,12 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type lastIndexOf( T& literal ) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
return rtl_ustr_lastIndexOfAscii_WithLength(
- pData->buffer, pData->length, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
+ pData->buffer, pData->length,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
/**
diff --git a/include/rtl/ustring.hxx b/include/rtl/ustring.hxx
index 1e9bfa8fbd5e..387a6e8099eb 100644
--- a/include/rtl/ustring.hxx
+++ b/include/rtl/ustring.hxx
@@ -73,17 +73,6 @@ struct SAL_WARN_UNUSED OUStringLiteral
const char* data;
};
-/** A simple wrapper around an ASCII character literal, for use in certain
- OUString functions designed for efficient processing of string literals.
-
- @since LibreOffice 5.0
-*/
-template<char C> struct SAL_WARN_UNUSED OUStringLiteral1 {
- static_assert(
- static_cast<unsigned char>(C) < 0x80,
- "non-ASCII character in OUStringLiteral1");
-};
-
/// @endcond
#endif
@@ -226,12 +215,18 @@ public:
template< typename T >
OUString( T& literal, typename libreoffice_internal::ConstCharArrayDetector< T, libreoffice_internal::Dummy >::Type = libreoffice_internal::Dummy() )
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
pData = 0;
- if( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 == 0 ) // empty string
- rtl_uString_new( &pData );
- else
- rtl_uString_newFromLiteral( &pData, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
+ if (libreoffice_internal::ConstCharArrayDetector<T>::length == 0) {
+ rtl_uString_new(&pData);
+ } else {
+ rtl_uString_newFromLiteral(
+ &pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length, 0);
+ }
#ifdef RTL_STRING_UNITTEST
rtl_string_unittest_const_literal = true;
#endif
@@ -404,27 +399,19 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, OUString& >::Type operator=( T& literal )
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- if( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 == 0 ) // empty string
- rtl_uString_new( &pData );
- else
- rtl_uString_newFromLiteral( &pData, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
- return *this;
- }
-
-#if defined LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
- /// @cond INTERNAL
- /** Assign a new string from a single ASCII character literal.
-
- @since LibreOffice 5.0
- */
- template<char C> OUString & operator =(OUStringLiteral1<C>) {
- sal_Unicode const c = C;
- rtl_uString_newFromStr_WithLength(&pData, &c, 1);
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ if (libreoffice_internal::ConstCharArrayDetector<T>::length == 0) {
+ rtl_uString_new(&pData);
+ } else {
+ rtl_uString_newFromLiteral(
+ &pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length, 0);
+ }
return *this;
}
- /// @endcond
-#endif
/**
Append a string to this string.
@@ -578,9 +565,12 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type reverseCompareTo( T& literal ) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return rtl_ustr_asciil_reverseCompare_WithLength( pData->buffer, pData->length,
- literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return rtl_ustr_asciil_reverseCompare_WithLength(
+ pData->buffer, pData->length,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
/**
@@ -658,11 +648,16 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type equalsIgnoreAsciiCase( T& literal ) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- if ( pData->length != libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 )
- return false;
-
- return rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, literal ) == 0;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return
+ (pData->length
+ == libreoffice_internal::ConstCharArrayDetector<T>::length)
+ && (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength(
+ pData->buffer, pData->length,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal))
+ == 0);
}
/**
@@ -694,9 +689,15 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type match( T& literal, sal_Int32 fromIndex = 0 ) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return rtl_ustr_ascii_shortenedCompare_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
- literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return
+ rtl_ustr_ascii_shortenedCompare_WithLength(
+ pData->buffer+fromIndex, pData->length-fromIndex,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length)
+ == 0;
}
/**
@@ -732,9 +733,15 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type matchIgnoreAsciiCase( T& literal, sal_Int32 fromIndex = 0 ) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
- literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return
+ rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength(
+ pData->buffer+fromIndex, pData->length-fromIndex,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length)
+ == 0;
}
/**
@@ -1039,12 +1046,19 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type startsWith(
T & literal, OUString * rest = 0) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- bool b = libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length
- && rtl_ustr_asciil_reverseEquals_WithLength( pData->buffer, literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ bool b
+ = (libreoffice_internal::ConstCharArrayDetector<T>::length
+ <= sal_uInt32(pData->length))
+ && rtl_ustr_asciil_reverseEquals_WithLength(
+ pData->buffer,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
if (b && rest != 0) {
- *rest = copy(libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
+ *rest = copy(
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
return b;
}
@@ -1088,14 +1102,19 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type
startsWithIgnoreAsciiCase(T & literal, OUString * rest = 0) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- bool b = (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
- pData->buffer,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1)
- == 0);
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ bool b
+ = (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
+ pData->buffer,
+ libreoffice_internal::ConstCharArrayDetector<T>::length,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length)
+ == 0);
if (b && rest != 0) {
- *rest = copy(libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
+ *rest = copy(
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
return b;
}
@@ -1132,16 +1151,22 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type
endsWith(T & literal, OUString * rest = 0) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- bool b = libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ bool b
+ = (libreoffice_internal::ConstCharArrayDetector<T>::length
+ <= sal_uInt32(pData->length))
&& rtl_ustr_asciil_reverseEquals_WithLength(
- pData->buffer + pData->length - ( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ), literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
+ (pData->buffer + pData->length
+ - libreoffice_internal::ConstCharArrayDetector<T>::length),
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
if (b && rest != 0) {
*rest = copy(
0,
(getLength()
- - (libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1)));
+ - libreoffice_internal::ConstCharArrayDetector<T>::length));
}
return b;
}
@@ -1205,18 +1230,24 @@ public:
typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type
endsWithIgnoreAsciiCase(T & literal, OUString * rest = 0) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- bool b = libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ bool b
+ = (libreoffice_internal::ConstCharArrayDetector<T>::length
+ <= sal_uInt32(pData->length))
&& (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
- pData->buffer + pData->length - ( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ),
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1)
+ (pData->buffer + pData->length
+ - libreoffice_internal::ConstCharArrayDetector<T>::length),
+ libreoffice_internal::ConstCharArrayDetector<T>::length,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(
+ literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length)
== 0);
if (b && rest != 0) {
*rest = copy(
0,
(getLength()
- - (libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1)));
+ - libreoffice_internal::ConstCharArrayDetector<T>::length));
}
return b;
}
@@ -1274,8 +1305,11 @@ public:
template< typename T >
friend inline typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator==( const OUString& string, T& literal )
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return string.equalsAsciiL( literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return string.equalsAsciiL(
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
/**
* Compare string to an ASCII string literal.
@@ -1287,8 +1321,11 @@ public:
template< typename T >
friend inline typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator==( T& literal, const OUString& string )
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return string.equalsAsciiL( literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return string.equalsAsciiL(
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
/**
* Compare string to an ASCII string literal.
@@ -1300,8 +1337,11 @@ public:
template< typename T >
friend inline typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator!=( const OUString& string, T& literal )
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return !string.equalsAsciiL( literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return !string.equalsAsciiL(
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
/**
* Compare string to an ASCII string literal.
@@ -1313,8 +1353,11 @@ public:
template< typename T >
friend inline typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator!=( T& literal, const OUString& string )
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- return !string.equalsAsciiL( literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ return !string.equalsAsciiL(
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
#if defined LIBO_INTERNAL_ONLY
@@ -1492,11 +1535,13 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- sal_Int32 ret = rtl_ustr_indexOfAscii_WithLength(
- pData->buffer + fromIndex, pData->length - fromIndex, literal,
- libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
- return ret < 0 ? ret : ret + fromIndex;
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
+ sal_Int32 n = rtl_ustr_indexOfAscii_WithLength(
+ pData->buffer + fromIndex, pData->length - fromIndex,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
+ return n < 0 ? n : n + fromIndex;
}
/**
@@ -1590,9 +1635,12 @@ public:
template< typename T >
typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type lastIndexOf( T& literal ) const
{
- assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
+ assert(
+ libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
return rtl_ustr_lastIndexOfAscii_WithLength(
- pData->buffer, pData->length, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
+ pData->buffer, pData->length,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
}
/**
@@ -1768,11 +1816,14 @@ public:
SAL_WARN_UNUSED_RESULT typename libreoffice_internal::ConstCharArrayDetector< T, OUString >::Type replaceFirst( T& from, OUString const & to,
sal_Int32 * index = 0) const
{
+ assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(from));
rtl_uString * s = 0;
sal_Int32 i = 0;
- assert( strlen( from ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
rtl_uString_newReplaceFirstAsciiL(
- &s, pData, from, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, to.pData, index == 0 ? &i : index);
+ &s, pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(from),
+ libreoffice_internal::ConstCharArrayDetector<T>::length, to.pData,
+ index == 0 ? &i : index);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -1798,11 +1849,14 @@ public:
SAL_WARN_UNUSED_RESULT typename libreoffice_internal::ConstCharArrayDetector< T, OUString >::Type replaceFirst( OUString const & from, T& to,
sal_Int32 * index = 0) const
{
+ assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(to));
rtl_uString * s = 0;
sal_Int32 i = 0;
- assert( strlen( to ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
rtl_uString_newReplaceFirstToAsciiL(
- &s, pData, from.pData, to, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, index == 0 ? &i : index);
+ &s, pData, from.pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(to),
+ libreoffice_internal::ConstCharArrayDetector<T>::length,
+ index == 0 ? &i : index);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -1828,13 +1882,17 @@ public:
SAL_WARN_UNUSED_RESULT typename libreoffice_internal::ConstCharArrayDetector< T1, typename libreoffice_internal::ConstCharArrayDetector< T2, OUString >::Type >::Type
replaceFirst( T1& from, T2& to, sal_Int32 * index = 0) const
{
+ assert(libreoffice_internal::ConstCharArrayDetector<T1>::isValid(from));
+ assert(libreoffice_internal::ConstCharArrayDetector<T2>::isValid(to));
rtl_uString * s = 0;
sal_Int32 i = 0;
- assert( strlen( from ) == libreoffice_internal::ConstCharArrayDetector< T1 >::size - 1 );
- assert( strlen( to ) == libreoffice_internal::ConstCharArrayDetector< T2 >::size - 1 );
rtl_uString_newReplaceFirstAsciiLAsciiL(
- &s, pData, from, libreoffice_internal::ConstCharArrayDetector< T1, void >::size - 1, to,
- libreoffice_internal::ConstCharArrayDetector< T2, void >::size - 1, index == 0 ? &i : index);
+ &s, pData,
+ libreoffice_internal::ConstCharArrayDetector<T1>::toPointer(from),
+ libreoffice_internal::ConstCharArrayDetector<T1>::length,
+ libreoffice_internal::ConstCharArrayDetector<T2>::toPointer(to),
+ libreoffice_internal::ConstCharArrayDetector<T2>::length,
+ index == 0 ? &i : index);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -1877,9 +1935,12 @@ public:
template< typename T >
SAL_WARN_UNUSED_RESULT typename libreoffice_internal::ConstCharArrayDetector< T, OUString >::Type replaceAll( T& from, OUString const & to) const
{
+ assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(from));
rtl_uString * s = 0;
- assert( strlen( from ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- rtl_uString_newReplaceAllAsciiL(&s, pData, from, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, to.pData);
+ rtl_uString_newReplaceAllAsciiL(
+ &s, pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(from),
+ libreoffice_internal::ConstCharArrayDetector<T>::length, to.pData);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -1899,9 +1960,12 @@ public:
template< typename T >
SAL_WARN_UNUSED_RESULT typename libreoffice_internal::ConstCharArrayDetector< T, OUString >::Type replaceAll( OUString const & from, T& to) const
{
+ assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(to));
rtl_uString * s = 0;
- assert( strlen( to ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 );
- rtl_uString_newReplaceAllToAsciiL(&s, pData, from.pData, to, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1);
+ rtl_uString_newReplaceAllToAsciiL(
+ &s, pData, from.pData,
+ libreoffice_internal::ConstCharArrayDetector<T>::toPointer(to),
+ libreoffice_internal::ConstCharArrayDetector<T>::length);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -1922,12 +1986,15 @@ public:
SAL_WARN_UNUSED_RESULT typename libreoffice_internal::ConstCharArrayDetector< T1, typename libreoffice_internal::ConstCharArrayDetector< T2, OUString >::Type >::Type
replaceAll( T1& from, T2& to ) const
{
+ assert(libreoffice_internal::ConstCharArrayDetector<T1>::isValid(from));
+ assert(libreoffice_internal::ConstCharArrayDetector<T2>::isValid(to));
rtl_uString * s = 0;
- assert( strlen( from ) == libreoffice_internal::ConstCharArrayDetector< T1 >::size - 1 );
- assert( strlen( to ) == libreoffice_internal::ConstCharArrayDetector< T2 >::size - 1 );
rtl_uString_newReplaceAllAsciiLAsciiL(
- &s, pData, from, libreoffice_internal::ConstCharArrayDetector< T1, void >::size - 1,
- to, libreoffice_internal::ConstCharArrayDetector< T2, void >::size - 1);
+ &s, pData,
+ libreoffice_internal::ConstCharArrayDetector<T1>::toPointer(from),
+ libreoffice_internal::ConstCharArrayDetector<T1>::length,
+ libreoffice_internal::ConstCharArrayDetector<T2>::toPointer(to),
+ libreoffice_internal::ConstCharArrayDetector<T2>::length);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -2564,26 +2631,6 @@ public:
#if defined LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
/// @cond INTERNAL
-/** Compare a string and an ASCII character literal for equality.
-
- @since LibreOffice 5.0
-*/
-template<char C> bool operator ==(OUString const & string, OUStringLiteral1<C>)
-{
- char const c = C;
- return string.equalsAsciiL(&c, 1);
-}
-
-/** Compare a string and an ASCII character literal for inequality.
-
- @since LibreOffice 5.0
-*/
-template<char C> bool operator !=(
- OUString const & string, OUStringLiteral1<C> literal)
-{
- return !(string == literal);
-}
-
/**
@internal
*/
@@ -2611,18 +2658,6 @@ struct ToStringHelper< OUStringLiteral >
/**
@internal
*/
-template<char C> struct ToStringHelper<OUStringLiteral1<C>>
-{
- static int length(OUStringLiteral1<C>) { return 1; }
- static sal_Unicode * addData(sal_Unicode * buffer, OUStringLiteral1<C>)
- { *buffer++ = C; return buffer; }
- static const bool allowOStringConcat = false;
- static const bool allowOUStringConcat = true;
-};
-
-/**
- @internal
-*/
template< typename charT, typename traits, typename T1, typename T2 >
inline std::basic_ostream<charT, traits> & operator <<(
std::basic_ostream<charT, traits> & stream, const OUStringConcat< T1, T2 >& concat)