diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2010-12-19 15:53:44 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2010-12-19 15:53:44 +0000 |
commit | 37a68925ce3060f4321be2a53a2ca59b64646a52 (patch) | |
tree | 3d8e65f13093a64bc662cab739bfcfacfa0404b6 | |
parent | 5bfe5df3d8a1720452994debf31ccdeb7d8d912b (diff) | |
download | gcc-37a68925ce3060f4321be2a53a2ca59b64646a52.zip gcc-37a68925ce3060f4321be2a53a2ca59b64646a52.tar.gz gcc-37a68925ce3060f4321be2a53a2ca59b64646a52.tar.bz2 |
basic_string.h (operator+(basic_string<>&&, basic_string<>&&)): Optimize better.
2010-12-19 Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/basic_string.h (operator+(basic_string<>&&,
basic_string<>&&)): Optimize better.
* include/ext/vstring.h (operator+(__versa_string<>&&,
__versa_string<>&)): Likewise.
From-SVN: r168061
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/vstring.h | 8 |
3 files changed, 23 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 19063dd..b6f23e4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,12 @@ 2010-12-19 Paolo Carlini <paolo.carlini@oracle.com> + * 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 <paolo.carlini@oracle.com> + * testsuite/21_strings/basic_string/operators/char/4.cc: New. * testsuite/21_strings/basic_string/operators/wchar_t/4.cc: Likewise. * testsuite/ext/vstring/operators/2.cc: Likewise. diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index eb27e67..bffa8af 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<typename _CharT, typename _Traits, typename _Alloc> inline basic_string<_CharT, _Traits, _Alloc> @@ -2390,8 +2396,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) template<typename _CharT, typename _Traits, typename _Alloc> 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<typename _CharT, typename _Traits, typename _Alloc> diff --git a/libstdc++-v3/include/ext/vstring.h b/libstdc++-v3/include/ext/vstring.h index faca91b..3700f3e 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<typename _CharT, typename _Traits, typename _Alloc, template <typename, typename, typename> class _Base> |