summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-19 15:53:44 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-19 15:53:44 +0000
commit1e1a3ecee9423b3450cd76b92b376ee39a8924ac (patch)
tree3d8e65f13093a64bc662cab739bfcfacfa0404b6 /libstdc++-v3
parent9952ffb424c0ca6d3475f17fa8f436bcba852973 (diff)
downloadgcc-1e1a3ecee9423b3450cd76b92b376ee39a8924ac.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168061 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/basic_string.h12
-rw-r--r--libstdc++-v3/include/ext/vstring.h8
3 files changed, 23 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 19063dd7b22..b6f23e4413b 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 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<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 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<typename _CharT, typename _Traits, typename _Alloc,
template <typename, typename, typename> class _Base>