aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/ext/vstring.h
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2010-12-19 15:53:44 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2010-12-19 15:53:44 +0000
commit37a68925ce3060f4321be2a53a2ca59b64646a52 (patch)
tree3d8e65f13093a64bc662cab739bfcfacfa0404b6 /libstdc++-v3/include/ext/vstring.h
parent5bfe5df3d8a1720452994debf31ccdeb7d8d912b (diff)
downloadgcc-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
Diffstat (limited to 'libstdc++-v3/include/ext/vstring.h')
-rw-r--r--libstdc++-v3/include/ext/vstring.h8
1 files changed, 7 insertions, 1 deletions
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>