From 1e1a3ecee9423b3450cd76b92b376ee39a8924ac Mon Sep 17 00:00:00 2001 From: paolo Date: Sun, 19 Dec 2010 15:53:44 +0000 Subject: 2010-12-19 Paolo Carlini * include/bits/basic_string.h (operator+(basic_string<>&&, basic_string<>&&)): Optimize better. * include/ext/vstring.h (operator+(__versa_string<>&&, __versa_string<>&)): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168061 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 7 +++++++ libstdc++-v3/include/bits/basic_string.h | 12 +++++++++--- libstdc++-v3/include/ext/vstring.h | 8 +++++++- 3 files changed, 23 insertions(+), 4 deletions(-) (limited to 'libstdc++-v3') diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 19063dd7b22..b6f23e4413b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2010-12-19 Paolo Carlini + + * include/bits/basic_string.h (operator+(basic_string<>&&, + basic_string<>&&)): Optimize better. + * include/ext/vstring.h (operator+(__versa_string<>&&, + __versa_string<>&)): Likewise. + 2010-12-19 Paolo Carlini * testsuite/21_strings/basic_string/operators/char/4.cc: New. diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index eb27e677e12..bffa8afd4c6 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -2380,7 +2380,13 @@ _GLIBCXX_BEGIN_NAMESPACE(std) inline basic_string<_CharT, _Traits, _Alloc> operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs, basic_string<_CharT, _Traits, _Alloc>&& __rhs) - { return std::move(__lhs.append(__rhs)); } + { + const auto __size = __lhs.size() + __rhs.size(); + const bool __cond = (__size > __lhs.capacity() + && __size <= __rhs.capacity()); + return __cond ? std::move(__rhs.insert(0, __lhs)) + : std::move(__lhs.append(__rhs)); + } template inline basic_string<_CharT, _Traits, _Alloc> @@ -2390,8 +2396,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) template inline basic_string<_CharT, _Traits, _Alloc> - operator+(_CharT __lhs, basic_string<_CharT, - _Traits, _Alloc>&& __rhs) + operator+(_CharT __lhs, + basic_string<_CharT, _Traits, _Alloc>&& __rhs) { return std::move(__rhs.insert(0, 1, __lhs)); } template diff --git a/libstdc++-v3/include/ext/vstring.h b/libstdc++-v3/include/ext/vstring.h index faca91be509..3700f3ee587 100644 --- a/libstdc++-v3/include/ext/vstring.h +++ b/libstdc++-v3/include/ext/vstring.h @@ -2118,7 +2118,13 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) inline __versa_string<_CharT, _Traits, _Alloc, _Base> operator+(__versa_string<_CharT, _Traits, _Alloc, _Base>&& __lhs, __versa_string<_CharT, _Traits, _Alloc, _Base>&& __rhs) - { return std::move(__lhs.append(__rhs)); } + { + const auto __size = __lhs.size() + __rhs.size(); + const bool __cond = (__size > __lhs.capacity() + && __size <= __rhs.capacity()); + return __cond ? std::move(__rhs.insert(0, __lhs)) + : std::move(__lhs.append(__rhs)); + } template class _Base> -- cgit v1.2.1