diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2012-12-04 11:20:22 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2012-12-04 11:20:22 +0100 |
commit | 4e593d047b9c10de085dffa3fa3dd4602361c407 (patch) | |
tree | 4e8d64663c5292a1c0e2964229304e3826886a23 | |
parent | 94ff635f806536b358731d046b7d9e6ce48eb0a2 (diff) |
Fix fast concat of empty strings
Change-Id: Ice9c6974f44be3bc4c9b3533de2a9beb5b146ca5
-rw-r--r-- | sal/inc/rtl/string.hxx | 7 | ||||
-rw-r--r-- | sal/inc/rtl/ustring.hxx | 9 | ||||
-rw-r--r-- | sal/qa/rtl/strings/test_ostring_concat.cxx | 1 | ||||
-rw-r--r-- | sal/qa/rtl/strings/test_oustring_concat.cxx | 1 |
4 files changed, 13 insertions, 5 deletions
diff --git a/sal/inc/rtl/string.hxx b/sal/inc/rtl/string.hxx index 2c7a43dba897..aeb752890d1f 100644 --- a/sal/inc/rtl/string.hxx +++ b/sal/inc/rtl/string.hxx @@ -262,8 +262,11 @@ public: const int l = c.length(); rtl_String* buffer = NULL; rtl_string_new_WithLength( &buffer, l ); - char* end = c.addData( buffer->buffer ); - buffer->length = end - buffer->buffer; + if (l != 0) + { + char* end = c.addData( buffer->buffer ); + buffer->length = end - buffer->buffer; + } pData = buffer; } #endif diff --git a/sal/inc/rtl/ustring.hxx b/sal/inc/rtl/ustring.hxx index 534bd889f05a..ec9f90ecd46f 100644 --- a/sal/inc/rtl/ustring.hxx +++ b/sal/inc/rtl/ustring.hxx @@ -330,9 +330,12 @@ public: const int l = c.length(); rtl_uString* buffer = NULL; rtl_uString_new_WithLength( &buffer, l ); // TODO this clears, not necessary - sal_Unicode* end = c.addData( buffer->buffer ); - buffer->length = end - buffer->buffer; - // TODO realloc in case buffer->length is noticeably smaller than l ? + if (l != 0) + { + sal_Unicode* end = c.addData( buffer->buffer ); + buffer->length = end - buffer->buffer; + // TODO realloc in case buffer->length is noticeably smaller than l? + } pData = buffer; } #endif diff --git a/sal/qa/rtl/strings/test_ostring_concat.cxx b/sal/qa/rtl/strings/test_ostring_concat.cxx index a79b2dad32fb..46457ddf5f35 100644 --- a/sal/qa/rtl/strings/test_ostring_concat.cxx +++ b/sal/qa/rtl/strings/test_ostring_concat.cxx @@ -47,6 +47,7 @@ CPPUNIT_TEST_SUITE_END(); void test::ostring::StringConcat::check() { // All the extra () are to protect commas againsts being treated as separators of macro arguments. + CPPUNIT_ASSERT_EQUAL( OString(), OString(OString() + OString()) ); CPPUNIT_ASSERT_EQUAL( OString( "foobar" ), OString( OString( "foo" ) + OString( "bar" ))); TYPES_ASSERT_EQUAL(( typeid( OStringConcat< OString, OString > )), typeid( OString( "foo" ) + OString( "bar" ))); CPPUNIT_ASSERT_EQUAL( OString( "foobar" ), OString( OString( "foo" ) + "bar" )); diff --git a/sal/qa/rtl/strings/test_oustring_concat.cxx b/sal/qa/rtl/strings/test_oustring_concat.cxx index 0cc25128a075..4f650dcf3657 100644 --- a/sal/qa/rtl/strings/test_oustring_concat.cxx +++ b/sal/qa/rtl/strings/test_oustring_concat.cxx @@ -47,6 +47,7 @@ CPPUNIT_TEST_SUITE_END(); void test::oustring::StringConcat::check() { // All the extra () are to protect commas againsts being treated as separators of macro arguments. + CPPUNIT_ASSERT_EQUAL( OUString(), OUString(OUString() + OUString()) ); CPPUNIT_ASSERT_EQUAL( OUString( "foobar" ), OUString( OUString( "foo" ) + OUString( "bar" ))); TYPES_ASSERT_EQUAL(( typeid( OUStringConcat< OUString, OUString > )), typeid( OUString( "foo" ) + OUString( "bar" ))); CPPUNIT_ASSERT_EQUAL( OUString( "foobar" ), OUString( OUString( "foo" ) + "bar" )); |