From 37a68925ce3060f4321be2a53a2ca59b64646a52 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Sun, 19 Dec 2010 15:53:44 +0000 Subject: basic_string.h (operator+(basic_string<>&&, basic_string<>&&)): Optimize better. 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. From-SVN: r168061 --- libstdc++-v3/include/ext/vstring.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'libstdc++-v3/include/ext/vstring.h') 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 class _Base> -- cgit v1.1