[Libreoffice-commits] .: sal/inc sal/qa sal/rtl
sal/inc/rtl/strbuf.hxx | 54 +++ sal/inc/rtl/string.h|3 sal/inc/rtl/string.hxx |4 - sal/inc/rtl/ustrbuf.hxx | 69 sal/inc/rtl/ustring.h | 15 +--- sal/inc/rtl/ustring.hxx | 12 +-- sal/qa/rtl/strings/test_ostring_stringliterals.cxx |6 + sal/qa/rtl/strings/test_oustring_stringliterals.cxx | 21 +++--- sal/rtl/source/strtmpl.cxx | 11 ++- 9 files changed, 162 insertions(+), 33 deletions(-) New commits: commit 066dbfd1970b8ea58ba16b07b2a57f61c0cb8e36 Author: LuboÅ¡ LuÅák l.lu...@suse.cz Date: Fri Apr 6 13:45:47 2012 +0200 string literal O(U)StringBuffer ctors too, after all diff --git a/sal/inc/rtl/strbuf.hxx b/sal/inc/rtl/strbuf.hxx index 122eb4b..4500cf0 100644 --- a/sal/inc/rtl/strbuf.hxx +++ b/sal/inc/rtl/strbuf.hxx @@ -155,6 +155,60 @@ public: } /** +@overload +@since LibreOffice 3.6 + */ +#ifdef HAVE_SFINAE_ANONYMOUS_BROKEN // see the OString ctors +OStringBuffer( const char* value ) +: pData(NULL) +{ +sal_Int32 length = rtl_str_getLength( value ); +nCapacity = length + 16; +rtl_stringbuffer_newFromStr_WithLength( pData, value, length ); +} +#else +template typename T +OStringBuffer( const T value, typename internal::CharPtrDetector T, internal::Dummy ::Type = internal::Dummy()) +: pData(NULL) +{ +sal_Int32 length = rtl_str_getLength( value ); +nCapacity = length + 16; +rtl_stringbuffer_newFromStr_WithLength( pData, value, length ); +} + +template typename T +OStringBuffer( T value, typename internal::NonConstCharArrayDetector T, internal::Dummy ::Type = internal::Dummy()) +: pData(NULL) +{ +sal_Int32 length = rtl_str_getLength( value ); +nCapacity = length + 16; +rtl_stringbuffer_newFromStr_WithLength( pData, value, length ); +} + +/** + Constructs a string buffer so that it represents the same +sequence of characters as the string literal. + + If there are any embedded \0's in the string literal, the result is undefined. + Use the overload that explicitly accepts length. + + @since LibreOffice 3.6 + + @paramliteral a string literal +*/ +template typename T +OStringBuffer( T literal, typename internal::ConstCharArrayDetector T, internal::Dummy ::Type = internal::Dummy()) +: pData(NULL) +, nCapacity( internal::ConstCharArrayDetector T, void ::size - 1 + 16 ) +{ +rtl_string_newFromLiteral( pData, literal, internal::ConstCharArrayDetector T, void ::size - 1, 16 ); +#ifdef RTL_STRING_UNITTEST +rtl_string_unittest_const_literal = true; +#endif +} +#endif // HAVE_SFINAE_ANONYMOUS_BROKEN + +/** Constructs a string buffer so that it represents the same sequence of characters as the string argument. diff --git a/sal/inc/rtl/string.h b/sal/inc/rtl/string.h index f695c12..f326abe 100644 --- a/sal/inc/rtl/string.h +++ b/sal/inc/rtl/string.h @@ -888,8 +888,9 @@ SAL_DLLPUBLIC void SAL_CALL rtl_string_newFromStr_WithLength( rtl_String ** newS /** @internal + @since LibreOffice 3.6 */ -SAL_DLLPUBLIC void SAL_CALL rtl_string_newFromLiteral( rtl_String ** newStr, const sal_Char * value, sal_Int32 len ) SAL_THROW_EXTERN_C(); +SAL_DLLPUBLIC void SAL_CALL rtl_string_newFromLiteral( rtl_String ** newStr, const sal_Char * value, sal_Int32 len, sal_Int32 allocExtra ) SAL_THROW_EXTERN_C(); /** Assign a new value to a string. diff --git a/sal/inc/rtl/string.hxx b/sal/inc/rtl/string.hxx index 0f6246b..9791a8c 100644 --- a/sal/inc/rtl/string.hxx +++ b/sal/inc/rtl/string.hxx @@ -206,7 +206,7 @@ public: OString( T literal, typename internal::ConstCharArrayDetector T, internal::Dummy ::Type = internal::Dummy() ) SAL_THROW(()) { pData = 0; -rtl_string_newFromLiteral( pData, literal, internal::ConstCharArrayDetector T, void ::size - 1 ); +rtl_string_newFromLiteral( pData, literal, internal::ConstCharArrayDetector T, void ::size - 1, 0 ); #ifdef RTL_STRING_UNITTEST rtl_string_unittest_const_literal = true; #endif @@ -285,7 +285,7 @@ public: typename internal::ConstCharArrayDetector T, OString ::Type operator=( T literal ) SAL_THROW(()) { RTL_STRING_CONST_FUNCTION -rtl_string_newFromLiteral( pData, literal, internal::ConstCharArrayDetector T, void ::size - 1 ); +rtl_string_newFromLiteral( pData, literal, internal::ConstCharArrayDetector T, void ::size - 1, 0 ); return *this; } diff --git a/sal/inc/rtl/ustrbuf.hxx b/sal/inc/rtl/ustrbuf.hxx index 02a507c..17deadd 100644 --- a/sal/inc/rtl/ustrbuf.hxx +++ b/sal/inc/rtl/ustrbuf.hxx @@ -149,6 +149,75 @@
[Libreoffice-commits] .: sal/inc sal/qa sw/source
sal/inc/rtl/stringutils.hxx|9 + sal/qa/rtl/strings/test_ostring_stringliterals.cxx | 19 --- sw/source/filter/ww8/rtfexport.cxx |4 ++-- sw/source/filter/ww8/rtfexport.hxx |4 ++-- 4 files changed, 29 insertions(+), 7 deletions(-) New commits: commit 8aa60b51a9e48b33ba6f0cb27132c6a415de2358 Author: LuboÅ¡ LuÅák l.lu...@suse.cz Date: Thu Mar 29 11:03:47 2012 +0200 (const) char[] (i.e. size unknown) cannot be used with O(U)String msvc can't handle the necessary template overload (and maybe it's right, I'm not sure) diff --git a/sal/inc/rtl/stringutils.hxx b/sal/inc/rtl/stringutils.hxx index 19c1bf4..3ed36a7 100644 --- a/sal/inc/rtl/stringutils.hxx +++ b/sal/inc/rtl/stringutils.hxx @@ -65,6 +65,12 @@ There are 2 cases: cast to const char*. Additionally (non-const) char[N] needs to be handled, but with the reference being const, it would also match const char[N], so another overload with a reference to non-const and NonConstCharArrayDetector are used to ensure the function is called only with (non-const) char[N]. +Additionally, char[] and const char[] (i.e. size unknown) are rather tricky. Their usage with 'T' would +mean it would be 'char()[]', which seems to be invalid. But gcc and clang somehow manage when it is +a template. while msvc complains about no conversion from char[] to char[1]. And the reference cannot +be avoided, because 'const char[]' as argument type would match also 'const char[N]' +So char[] and const char[] should always be used with their contents specified (which automatically +turns them into char[N] or const char[N]), or char* and const char* should be used. */ struct Dummy {}; template typename T1, typename T2 @@ -91,6 +97,8 @@ struct NonConstCharArrayDetector char[ N ], T { typedef T Type; }; +#ifdef RTL_STRING_UNITTEST +// never use, until all compilers handle this template typename T struct NonConstCharArrayDetector char[], T { @@ -101,6 +109,7 @@ struct NonConstCharArrayDetector const char[], T { typedef T Type; }; +#endif template typename T1, typename T2 struct ConstCharArrayDetector diff --git a/sal/qa/rtl/strings/test_ostring_stringliterals.cxx b/sal/qa/rtl/strings/test_ostring_stringliterals.cxx index 0d5036a..d7e3cf5 100644 --- a/sal/qa/rtl/strings/test_ostring_stringliterals.cxx +++ b/sal/qa/rtl/strings/test_ostring_stringliterals.cxx @@ -66,6 +66,9 @@ private: void testcall( const char str[] ); +static const char bad5[]; +static char bad6[]; + CPPUNIT_TEST_SUITE(StringLiterals); CPPUNIT_TEST(checkCtors); CPPUNIT_TEST(checkUsage); @@ -100,13 +103,20 @@ void test::ostring::StringLiterals::checkCtors() const char* bad4[] = { test1 }; CPPUNIT_ASSERT( !CONST_CTOR_USED( bad4[ 0 ] )); testcall( good1 ); +#ifndef _MSC_VER +// this is actually not supposed to work (see discussion in stringutils.hxx), +// but gcc and clang somehow manage, so keep it used, just in case some other problem +// shows up somewhen in the future +CPPUNIT_ASSERT( !CONST_CTOR_USED( bad5 )); // size is not known here +CPPUNIT_ASSERT( !CONST_CTOR_USED( bad6 )); +#endif // This one is technically broken, since the first element is 6 characters test\0\0, // but there does not appear a way to detect this by compile time (runtime will complain). // RTL_CONSTASCII_USTRINGPARAM() has the same flaw. -const char bad5[][ 6 ] = { test, test2 }; -CPPUNIT_ASSERT( CONST_CTOR_USED( bad5[ 0 ] )); -CPPUNIT_ASSERT( CONST_CTOR_USED( bad5[ 1 ] )); +const char bad7[][ 6 ] = { test, test2 }; +CPPUNIT_ASSERT( CONST_CTOR_USED( bad7[ 0 ] )); +CPPUNIT_ASSERT( CONST_CTOR_USED( bad7[ 1 ] )); // Check that contents are correct and equal to the case when const char* ctor is used. CPPUNIT_ASSERT( rtl::OString( (const char*) ) == rtl::OString( )); @@ -128,6 +138,9 @@ void test::ostring::StringLiterals::checkCtors() #endif } +const char test::ostring::StringLiterals::bad5[] = test; +char test::ostring::StringLiterals::bad6[] = test; + void test::ostring::StringLiterals::testcall( const char str[] ) { #ifndef _MSC_VER diff --git a/sw/source/filter/ww8/rtfexport.cxx b/sw/source/filter/ww8/rtfexport.cxx index dda8b81..00b8e18 100644 --- a/sw/source/filter/ww8/rtfexport.cxx +++ b/sw/source/filter/ww8/rtfexport.cxx @@ -79,10 +79,10 @@ using rtl::OUStringBuffer; using sw::mark::IMark; -#if defined(UNX) +#if defined(UNX22) const sal_Char RtfExport::sNewLine = '\012'; #else -const sal_Char RtfExport::sNewLine[] = \015\012; +const sal_Char* const RtfExport::sNewLine = \015\012; #endif // the default text encoding for the export, if it doesn't fit unicode will diff --git a/sw/source/filter/ww8/rtfexport.hxx b/sw/source/filter/ww8/rtfexport.hxx index 3759f31..9d395de 100644 --- a/sw/source/filter/ww8/rtfexport.hxx +++ b/sw/source/filter/ww8/rtfexport.hxx @@
[Libreoffice-commits] .: sal/inc sal/qa
sal/inc/rtl/string.hxx |7 +++ sal/qa/rtl/strings/test_ostring_stringliterals.cxx |2 ++ 2 files changed, 9 insertions(+) New commits: commit 86a1e6de4fc3af897271bc5f7f04506261d4f286 Author: LuboÅ¡ LuÅák l.lu...@suse.cz Date: Wed Mar 28 17:37:19 2012 +0200 SFINAE workarounds for gcc-4.0.1 diff --git a/sal/inc/rtl/string.hxx b/sal/inc/rtl/string.hxx index 39414e6..68f41bd 100644 --- a/sal/inc/rtl/string.hxx +++ b/sal/inc/rtl/string.hxx @@ -551,6 +551,12 @@ public: @return sal_True if the strings are equal; sal_False, otherwise. */ +#ifdef HAVE_SFINAE_ANONYMOUS_BROKEN +sal_Bool equalsIgnoreAsciiCase( const sal_Char * asciiStr ) const SAL_THROW(()) +{ +return rtl_str_compareIgnoreAsciiCase( pData-buffer, asciiStr ) == 0; +} +#else template typename T typename internal::CharPtrDetector T, bool ::Type equalsIgnoreAsciiCase( const T asciiStr ) const SAL_THROW(()) { @@ -577,6 +583,7 @@ public: return rtl_str_compareIgnoreAsciiCase_WithLength( pData-buffer, pData-length, literal, internal::ConstCharArrayDetector T, void ::size - 1 ) == 0; } +#endif /** Perform a ASCII lowercase comparison of two strings. diff --git a/sal/qa/rtl/strings/test_ostring_stringliterals.cxx b/sal/qa/rtl/strings/test_ostring_stringliterals.cxx index 4af152c..930b038 100644 --- a/sal/qa/rtl/strings/test_ostring_stringliterals.cxx +++ b/sal/qa/rtl/strings/test_ostring_stringliterals.cxx @@ -152,9 +152,11 @@ void test::ostring::StringLiterals::checkUsage() rtl_string_unittest_const_literal_function = false; CPPUNIT_ASSERT_EQUAL( foo, rtl::OString() = foo ); CPPUNIT_ASSERT( rtl_string_unittest_const_literal_function == true ); +#ifndef HAVE_SFINAE_ANONYMOUS_BROKEN rtl_string_unittest_const_literal_function = false; CPPUNIT_ASSERT( FoO.equalsIgnoreAsciiCase( fOo )); CPPUNIT_ASSERT( rtl_string_unittest_const_literal_function == true ); +#endif rtl_string_unittest_const_literal_function = false; CPPUNIT_ASSERT( foobarfoo.match( bar, 3 )); CPPUNIT_ASSERT( rtl_string_unittest_const_literal_function == true ); ___ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
[Libreoffice-commits] .: sal/inc sal/qa
sal/inc/rtl/strbuf.hxx | 14 ++ sal/qa/rtl/strings/test_ostring_stringliterals.cxx |4 2 files changed, 18 insertions(+) New commits: commit c9167bac18e1cca061d91f65d2dc91b9d09ef587 Author: LuboÅ¡ LuÅák l.lu...@suse.cz Date: Wed Mar 28 23:38:58 2012 +0200 gcc-4.0.1 SFINAE workarounds diff --git a/sal/inc/rtl/strbuf.hxx b/sal/inc/rtl/strbuf.hxx index 54428d3..122eb4b 100644 --- a/sal/inc/rtl/strbuf.hxx +++ b/sal/inc/rtl/strbuf.hxx @@ -373,6 +373,12 @@ public: @param str the characters to be appended. @return this string buffer. */ +#ifdef HAVE_SFINAE_ANONYMOUS_BROKEN +OStringBuffer append( const sal_Char * str ) +{ +return append( str, rtl_str_getLength( str ) ); +} +#else template typename T typename internal::CharPtrDetector T, OStringBuffer ::Type append( const T str ) { @@ -397,6 +403,7 @@ public: rtl_stringbuffer_insert( pData, nCapacity, getLength(), literal, internal::ConstCharArrayDetector T, void ::size - 1 ); return *this; } +#endif /** Appends the string representation of the codechar/code array @@ -555,6 +562,12 @@ public: @param str a character array. @return this string buffer. */ +#ifdef HAVE_SFINAE_ANONYMOUS_BROKEN +OStringBuffer insert( sal_Int32 offset, const sal_Char * str ) +{ +return insert( offset, str, rtl_str_getLength( str ) ); +} +#else template typename T typename internal::CharPtrDetector T, OStringBuffer ::Type insert( sal_Int32 offset, const T str ) { @@ -579,6 +592,7 @@ public: rtl_stringbuffer_insert( pData, nCapacity, offset, literal, internal::ConstCharArrayDetector T, void ::size - 1 ); return *this; } +#endif /** Inserts the string representation of the codechar/code array diff --git a/sal/qa/rtl/strings/test_ostring_stringliterals.cxx b/sal/qa/rtl/strings/test_ostring_stringliterals.cxx index 3f2ed84..494c1da 100644 --- a/sal/qa/rtl/strings/test_ostring_stringliterals.cxx +++ b/sal/qa/rtl/strings/test_ostring_stringliterals.cxx @@ -257,6 +257,7 @@ void test::ostring::StringLiterals::checkNonConstUsage() void test::ostring::StringLiterals::checkBuffer() { rtl::OStringBuffer buf; +#ifndef HAVE_SFINAE_ANONYMOUS_BROKEN rtl_string_unittest_const_literal_function = false; buf.append( foo ); CPPUNIT_ASSERT( rtl_string_unittest_const_literal_function == true ); @@ -269,6 +270,9 @@ void test::ostring::StringLiterals::checkBuffer() buf.insert( 3, baz ); CPPUNIT_ASSERT( rtl_string_unittest_const_literal_function == true ); CPPUNIT_ASSERT_EQUAL( buf.toString(), rtl::OString( foobazbar )); +#else +buf.append( foobazbar ); +#endif rtl::OString foobazbard( foobazbard ); rtl::OString foodbazbard( foodbazbard ); ___ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits