aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2005-11-03 13:13:21 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2005-11-03 13:13:21 +0000
commitf9c4ee6d100ed11255aa7177c3b8c1a25150b1c4 (patch)
tree8e4ed692c702645120b2a07f7a39c193cad8b679
parent02f1d17cccdf7feac9e7a6515934b396c82e2b02 (diff)
downloadgcc-f9c4ee6d100ed11255aa7177c3b8c1a25150b1c4.zip
gcc-f9c4ee6d100ed11255aa7177c3b8c1a25150b1c4.tar.gz
gcc-f9c4ee6d100ed11255aa7177c3b8c1a25150b1c4.tar.bz2
sso_string_base.h (__sso_string_base<>::_M_swap): Change the various traits_type::copy call to always copy the entire local buffer...
2005-11-03 Paolo Carlini <pcarlini@suse.de> * include/ext/sso_string_base.h (__sso_string_base<>::_M_swap): Change the various traits_type::copy call to always copy the entire local buffer; return early and don't do a full swap on the lengths for two common cases; change two _S_copy to plain traits_type::copy. From-SVN: r106431
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/ext/sso_string_base.h25
2 files changed, 23 insertions, 10 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 0a779b6..ab1f558 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2005-11-03 Paolo Carlini <pcarlini@suse.de>
+
+ * include/ext/sso_string_base.h (__sso_string_base<>::_M_swap):
+ Change the various traits_type::copy call to always copy the
+ entire local buffer; return early and don't do a full swap on
+ the lengths for two common cases; change two _S_copy to plain
+ traits_type::copy.
+
2005-11-02 Thomas Kho <tkho@ucla.edu>
PR libstdc++/23425
diff --git a/libstdc++-v3/include/ext/sso_string_base.h b/libstdc++-v3/include/ext/sso_string_base.h
index f9b3233..c37bd88c 100644
--- a/libstdc++-v3/include/ext/sso_string_base.h
+++ b/libstdc++-v3/include/ext/sso_string_base.h
@@ -255,29 +255,34 @@ namespace __gnu_cxx
{
_CharT __tmp_data[_S_local_capacity + 1];
traits_type::copy(__tmp_data, __rcs._M_local_data,
- __rcs._M_length() + 1);
+ _S_local_capacity + 1);
traits_type::copy(__rcs._M_local_data, _M_local_data,
- _M_length() + 1);
+ _S_local_capacity + 1);
traits_type::copy(_M_local_data, __tmp_data,
- __rcs._M_length() + 1);
+ _S_local_capacity + 1);
}
else if (__rcs._M_length())
{
traits_type::copy(_M_local_data, __rcs._M_local_data,
- __rcs._M_length() + 1);
- traits_type::assign(__rcs._M_local_data[0], _CharT());
+ _S_local_capacity + 1);
+ _M_length(__rcs._M_length());
+ __rcs._M_set_length(0);
+ return;
}
else if (_M_length())
{
traits_type::copy(__rcs._M_local_data, _M_local_data,
- _M_length() + 1);
- traits_type::assign(_M_local_data[0], _CharT());
+ _S_local_capacity + 1);
+ __rcs._M_length(_M_length());
+ _M_set_length(0);
+ return;
}
}
else
{
const size_type __tmp_capacity = __rcs._M_allocated_capacity;
- _S_copy(__rcs._M_local_data, _M_local_data, _M_length() + 1);
+ traits_type::copy(__rcs._M_local_data, _M_local_data,
+ _S_local_capacity + 1);
_M_data(__rcs._M_data());
__rcs._M_data(__rcs._M_local_data);
_M_capacity(__tmp_capacity);
@@ -287,8 +292,8 @@ namespace __gnu_cxx
const size_type __tmp_capacity = _M_allocated_capacity;
if (__rcs._M_is_local())
{
- _S_copy(_M_local_data, __rcs._M_local_data,
- __rcs._M_length() + 1);
+ traits_type::copy(_M_local_data, __rcs._M_local_data,
+ _S_local_capacity + 1);
__rcs._M_data(_M_data());
_M_data(_M_local_data);
}