diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2015-06-24 16:33:50 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2015-06-24 16:33:50 +0200 |
commit | 5cba714b4d03ed54debf71534ad8c8edc383a01e (patch) | |
tree | a15e0b73f4747a56840f3f457ca786bbbeb759aa /include | |
parent | 4d4f3512db0cf0bf47c2ba1b39c3813842903ef7 (diff) |
Revert "Generalize OUStringLiteral1"
This reverts commit 4d4f3512db0cf0bf47c2ba1b39c3813842903ef7, at least "gcc
version 4.8.3 20140627 [gcc-4_8-branch revision 212064] (SUSE Linux)" fails with
"include/rtl/stringutils.hxx:175:49: internal compiler error: Segmentation
fault."
Diffstat (limited to 'include')
-rw-r--r-- | include/rtl/strbuf.hxx | 28 | ||||
-rw-r--r-- | include/rtl/string.hxx | 130 | ||||
-rw-r--r-- | include/rtl/stringconcat.hxx | 13 | ||||
-rw-r--r-- | include/rtl/stringutils.hxx | 80 | ||||
-rw-r--r-- | include/rtl/ustrbuf.hxx | 49 | ||||
-rw-r--r-- | include/rtl/ustring.hxx | 305 |
6 files changed, 199 insertions, 406 deletions
diff --git a/include/rtl/strbuf.hxx b/include/rtl/strbuf.hxx index 307110367a1e..81773b48a28a 100644 --- a/include/rtl/strbuf.hxx +++ b/include/rtl/strbuf.hxx @@ -170,14 +170,10 @@ 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>::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); + , 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 ); #ifdef RTL_STRING_UNITTEST rtl_string_unittest_const_literal = true; #endif @@ -457,12 +453,8 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, OStringBuffer& >::Type append( T& literal ) { RTL_STRING_CONST_FUNCTION - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - rtl_stringbuffer_insert( - &pData, &nCapacity, getLength(), - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + rtl_stringbuffer_insert( &pData, &nCapacity, getLength(), literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ); return *this; } @@ -716,12 +708,8 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, OStringBuffer& >::Type insert( sal_Int32 offset, T& literal ) { RTL_STRING_CONST_FUNCTION - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - rtl_stringbuffer_insert( - &pData, &nCapacity, offset, - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + rtl_stringbuffer_insert( &pData, &nCapacity, offset, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ); return *this; } diff --git a/include/rtl/string.hxx b/include/rtl/string.hxx index e3237ff29afd..56cbf932cea1 100644 --- a/include/rtl/string.hxx +++ b/include/rtl/string.hxx @@ -181,18 +181,12 @@ public: template< typename T > OString( T& literal, typename libreoffice_internal::ConstCharArrayDetector< T, libreoffice_internal::Dummy >::Type = libreoffice_internal::Dummy() ) { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); pData = 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); - } + 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 ); #ifdef RTL_STRING_UNITTEST rtl_string_unittest_const_literal = true; #endif @@ -284,17 +278,11 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, OString& >::Type operator=( T& literal ) { RTL_STRING_CONST_FUNCTION - 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); - } + 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 ); return *this; } @@ -555,17 +543,11 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type equalsIgnoreAsciiCase( T& literal ) const { RTL_STRING_CONST_FUNCTION - 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); + 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; } /** @@ -626,16 +608,10 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type match( T& literal, sal_Int32 fromIndex = 0 ) const { RTL_STRING_CONST_FUNCTION - 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; + 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; } /** @@ -705,16 +681,9 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type matchIgnoreAsciiCase( T& literal, sal_Int32 fromIndex = 0 ) const { RTL_STRING_CONST_FUNCTION - 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; + 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; } /** @@ -751,8 +720,7 @@ public: RTL_STRING_CONST_FUNCTION bool b = match(literal, 0); if (b && rest != 0) { - *rest = copy( - libreoffice_internal::ConstCharArrayDetector<T>::length); + *rest = copy(libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1); } return b; } @@ -790,21 +758,14 @@ public: T & literal, OString * rest = 0) const { RTL_STRING_CONST_FUNCTION - 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)); + 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 )); if (b && rest != 0) { *rest = copy( 0, (getLength() - - libreoffice_internal::ConstCharArrayDetector<T>::length)); + - (libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1))); } return b; } @@ -873,17 +834,10 @@ public: friend typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator==( const OString& rStr, T& literal ) { RTL_STRING_CONST_FUNCTION - 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); + 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; } /** @@ -895,17 +849,10 @@ public: friend typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator==( T& literal, const OString& rStr ) { RTL_STRING_CONST_FUNCTION - 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); + 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; } template< typename T > @@ -1047,12 +994,9 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const { RTL_STRING_CONST_FUNCTION - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); sal_Int32 n = rtl_str_indexOfStr_WithLength( - pData->buffer + fromIndex, pData->length - fromIndex, - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + pData->buffer + fromIndex, pData->length - fromIndex, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1); return n < 0 ? n : n + fromIndex; } diff --git a/include/rtl/stringconcat.hxx b/include/rtl/stringconcat.hxx index 7ef9e1104094..a74dd77ad78c 100644 --- a/include/rtl/stringconcat.hxx +++ b/include/rtl/stringconcat.hxx @@ -141,19 +141,6 @@ 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 32a57f399d24..fb11545569e4 100644 --- a/include/rtl/stringutils.hxx +++ b/include/rtl/stringutils.hxx @@ -11,10 +11,6 @@ #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 @@ -33,60 +29,6 @@ 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 { /* @@ -160,27 +102,13 @@ struct ConstCharArrayDetector { static const bool ok = false; }; -template< std::size_t N, typename T > +template< int N, typename T > struct ConstCharArrayDetector< const char[ N ], T > { typedef T Type; - static const std::size_t length = N - 1; + static const int size = N; 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<OUStringLiteral1<C>, 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> & literal) - { return &literal.c; } -}; -#endif // this one is used to rule out only const char[N] template< typename T > @@ -209,10 +137,6 @@ 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 fe64ebe48280..04ac8a6c00f4 100644 --- a/include/rtl/ustrbuf.hxx +++ b/include/rtl/ustrbuf.hxx @@ -132,14 +132,10 @@ 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>::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); + , 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 ); #ifdef RTL_STRING_UNITTEST rtl_string_unittest_const_literal = true; #endif @@ -474,12 +470,9 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, OUStringBuffer& >::Type append( T& literal ) { - 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); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + rtl_uStringbuffer_insert_ascii( &pData, &nCapacity, getLength(), literal, + libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ); return *this; } @@ -820,12 +813,9 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, OUStringBuffer& >::Type insert( sal_Int32 offset, T& literal ) { - 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); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + rtl_uStringbuffer_insert_ascii( &pData, &nCapacity, offset, literal, + libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ); return *this; } @@ -1209,13 +1199,11 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const { - 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; + 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; } /** @@ -1275,12 +1263,9 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type lastIndexOf( T& literal ) const { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); return rtl_ustr_lastIndexOfAscii_WithLength( - pData->buffer, pData->length, - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + pData->buffer, pData->length, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1); } /** diff --git a/include/rtl/ustring.hxx b/include/rtl/ustring.hxx index 387a6e8099eb..1e9bfa8fbd5e 100644 --- a/include/rtl/ustring.hxx +++ b/include/rtl/ustring.hxx @@ -73,6 +73,17 @@ 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 @@ -215,18 +226,12 @@ public: template< typename T > OUString( T& literal, typename libreoffice_internal::ConstCharArrayDetector< T, libreoffice_internal::Dummy >::Type = libreoffice_internal::Dummy() ) { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); pData = 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); - } + 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 ); #ifdef RTL_STRING_UNITTEST rtl_string_unittest_const_literal = true; #endif @@ -399,19 +404,27 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, OUString& >::Type operator=( T& literal ) { - 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); - } + 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); return *this; } + /// @endcond +#endif /** Append a string to this string. @@ -565,12 +578,9 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type reverseCompareTo( T& literal ) const { - 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); + 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 ); } /** @@ -648,16 +658,11 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type equalsIgnoreAsciiCase( T& literal ) const { - 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); + 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; } /** @@ -689,15 +694,9 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type match( T& literal, sal_Int32 fromIndex = 0 ) const { - 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; + 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; } /** @@ -733,15 +732,9 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type matchIgnoreAsciiCase( T& literal, sal_Int32 fromIndex = 0 ) const { - 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; + 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; } /** @@ -1046,19 +1039,12 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type startsWith( T & literal, OUString * rest = 0) const { - 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); + 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); if (b && rest != 0) { - *rest = copy( - libreoffice_internal::ConstCharArrayDetector<T>::length); + *rest = copy(libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1); } return b; } @@ -1102,19 +1088,14 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type startsWithIgnoreAsciiCase(T & literal, OUString * rest = 0) const { - 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); + 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); if (b && rest != 0) { - *rest = copy( - libreoffice_internal::ConstCharArrayDetector<T>::length); + *rest = copy(libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1); } return b; } @@ -1151,22 +1132,16 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type endsWith(T & literal, OUString * rest = 0) const { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - bool b - = (libreoffice_internal::ConstCharArrayDetector<T>::length - <= sal_uInt32(pData->length)) + 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 + pData->length - - libreoffice_internal::ConstCharArrayDetector<T>::length), - libreoffice_internal::ConstCharArrayDetector<T>::toPointer( - literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + pData->buffer + pData->length - ( libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ), literal, + libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1); if (b && rest != 0) { *rest = copy( 0, (getLength() - - libreoffice_internal::ConstCharArrayDetector<T>::length)); + - (libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1))); } return b; } @@ -1230,24 +1205,18 @@ public: typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type endsWithIgnoreAsciiCase(T & literal, OUString * rest = 0) const { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - bool b - = (libreoffice_internal::ConstCharArrayDetector<T>::length - <= sal_uInt32(pData->length)) + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + bool b = libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length && (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths( - (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) + 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) == 0); if (b && rest != 0) { *rest = copy( 0, (getLength() - - libreoffice_internal::ConstCharArrayDetector<T>::length)); + - (libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1))); } return b; } @@ -1305,11 +1274,8 @@ public: template< typename T > friend inline typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator==( const OUString& string, T& literal ) { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - return string.equalsAsciiL( - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + return string.equalsAsciiL( literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ); } /** * Compare string to an ASCII string literal. @@ -1321,11 +1287,8 @@ public: template< typename T > friend inline typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator==( T& literal, const OUString& string ) { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - return string.equalsAsciiL( - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + return string.equalsAsciiL( literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ); } /** * Compare string to an ASCII string literal. @@ -1337,11 +1300,8 @@ public: template< typename T > friend inline typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator!=( const OUString& string, T& literal ) { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - return !string.equalsAsciiL( - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + return !string.equalsAsciiL( literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ); } /** * Compare string to an ASCII string literal. @@ -1353,11 +1313,8 @@ public: template< typename T > friend inline typename libreoffice_internal::ConstCharArrayDetector< T, bool >::Type operator!=( T& literal, const OUString& string ) { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); - return !string.equalsAsciiL( - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + return !string.equalsAsciiL( literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 ); } #if defined LIBO_INTERNAL_ONLY @@ -1535,13 +1492,11 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const { - 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; + 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; } /** @@ -1635,12 +1590,9 @@ public: template< typename T > typename libreoffice_internal::ConstCharArrayDetector< T, sal_Int32 >::Type lastIndexOf( T& literal ) const { - assert( - libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal)); + assert( strlen( literal ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); return rtl_ustr_lastIndexOfAscii_WithLength( - pData->buffer, pData->length, - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(literal), - libreoffice_internal::ConstCharArrayDetector<T>::length); + pData->buffer, pData->length, literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1); } /** @@ -1816,14 +1768,11 @@ 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, - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(from), - libreoffice_internal::ConstCharArrayDetector<T>::length, to.pData, - index == 0 ? &i : index); + &s, pData, from, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, to.pData, index == 0 ? &i : index); return OUString(s, SAL_NO_ACQUIRE); } @@ -1849,14 +1798,11 @@ 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, - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(to), - libreoffice_internal::ConstCharArrayDetector<T>::length, - index == 0 ? &i : index); + &s, pData, from.pData, to, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, index == 0 ? &i : index); return OUString(s, SAL_NO_ACQUIRE); } @@ -1882,17 +1828,13 @@ 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, - 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); + &s, pData, from, libreoffice_internal::ConstCharArrayDetector< T1, void >::size - 1, to, + libreoffice_internal::ConstCharArrayDetector< T2, void >::size - 1, index == 0 ? &i : index); return OUString(s, SAL_NO_ACQUIRE); } @@ -1935,12 +1877,9 @@ 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; - rtl_uString_newReplaceAllAsciiL( - &s, pData, - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(from), - libreoffice_internal::ConstCharArrayDetector<T>::length, to.pData); + assert( strlen( from ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + rtl_uString_newReplaceAllAsciiL(&s, pData, from, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1, to.pData); return OUString(s, SAL_NO_ACQUIRE); } @@ -1960,12 +1899,9 @@ 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; - rtl_uString_newReplaceAllToAsciiL( - &s, pData, from.pData, - libreoffice_internal::ConstCharArrayDetector<T>::toPointer(to), - libreoffice_internal::ConstCharArrayDetector<T>::length); + assert( strlen( to ) == libreoffice_internal::ConstCharArrayDetector< T >::size - 1 ); + rtl_uString_newReplaceAllToAsciiL(&s, pData, from.pData, to, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1); return OUString(s, SAL_NO_ACQUIRE); } @@ -1986,15 +1922,12 @@ 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, - libreoffice_internal::ConstCharArrayDetector<T1>::toPointer(from), - libreoffice_internal::ConstCharArrayDetector<T1>::length, - libreoffice_internal::ConstCharArrayDetector<T2>::toPointer(to), - libreoffice_internal::ConstCharArrayDetector<T2>::length); + &s, pData, from, libreoffice_internal::ConstCharArrayDetector< T1, void >::size - 1, + to, libreoffice_internal::ConstCharArrayDetector< T2, void >::size - 1); return OUString(s, SAL_NO_ACQUIRE); } @@ -2631,6 +2564,26 @@ 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 */ @@ -2658,6 +2611,18 @@ 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) |