sso_string_base.h (_M_swap): Rewrite.

2005-10-19  Paolo Carlini  <pcarlini@suse.de>

	* include/ext/sso_string_base.h (_M_swap): Rewrite.

From-SVN: r105654
This commit is contained in:
Paolo Carlini 2005-10-20 01:07:13 +00:00 committed by Paolo Carlini
parent c9218d26da
commit 7058c3be1a
2 changed files with 56 additions and 44 deletions

View File

@ -1,3 +1,7 @@
2005-10-19 Paolo Carlini <pcarlini@suse.de>
* include/ext/sso_string_base.h (_M_swap): Rewrite.
2005-10-19 Paolo Carlini <pcarlini@suse.de> 2005-10-19 Paolo Carlini <pcarlini@suse.de>
* include/ext/rc_string_base.h (_S_terminal): Remove. * include/ext/rc_string_base.h (_S_terminal): Remove.

View File

@ -248,55 +248,63 @@ namespace __gnu_cxx
__sso_string_base<_CharT, _Traits, _Alloc>:: __sso_string_base<_CharT, _Traits, _Alloc>::
_M_swap(__sso_string_base& __rcs) _M_swap(__sso_string_base& __rcs)
{ {
const bool __local = _M_is_local(); if (_M_is_local())
const bool __rcs_local = __rcs._M_is_local(); if (__rcs._M_is_local())
{
if (__local && __rcs_local) if (_M_length() && __rcs._M_length())
{ {
_CharT __tmp_data[_S_local_capacity + 1]; _CharT __tmp_data[_S_local_capacity + 1];
const size_type __tmp_length = __rcs._M_length(); traits_type::copy(__tmp_data, __rcs._M_local_data,
_S_copy(__tmp_data, __rcs._M_data(), __rcs._M_length() + 1); __rcs._M_length() + 1);
__rcs._M_length(_M_length()); traits_type::copy(__rcs._M_local_data, _M_local_data,
_S_copy(__rcs._M_data(), _M_data(), _M_length() + 1); _M_length() + 1);
_M_length(__tmp_length); traits_type::copy(_M_local_data, __tmp_data,
_S_copy(_M_data(), __tmp_data, __tmp_length + 1); __rcs._M_length() + 1);
} }
else if (__local && !__rcs_local) else if (__rcs._M_length())
{ {
const size_type __tmp_capacity = __rcs._M_allocated_capacity; traits_type::copy(_M_local_data, __rcs._M_local_data,
const size_type __tmp_length = __rcs._M_length(); __rcs._M_length() + 1);
_CharT* __tmp_ptr = __rcs._M_data(); traits_type::assign(__rcs._M_local_data[0], _CharT());
__rcs._M_data(__rcs._M_local_data); }
_S_copy(__rcs._M_data(), _M_data(), _M_length() + 1); else if (_M_length())
__rcs._M_length(_M_length()); {
_M_data(__tmp_ptr); traits_type::copy(__rcs._M_local_data, _M_local_data,
_M_length(__tmp_length); _M_length() + 1);
_M_capacity(__tmp_capacity); traits_type::assign(_M_local_data[0], _CharT());
} }
else if (!__local && __rcs_local) }
{ else
const size_type __tmp_capacity = _M_allocated_capacity; {
const size_type __tmp_length = _M_length(); const size_type __tmp_capacity = __rcs._M_allocated_capacity;
_CharT* __tmp_ptr = _M_data(); _S_copy(__rcs._M_local_data, _M_local_data, _M_length() + 1);
_M_data(_M_local_data); _M_data(__rcs._M_data());
_S_copy(_M_data(), __rcs._M_data(), __rcs._M_length() + 1); __rcs._M_data(__rcs._M_local_data);
_M_length(__rcs._M_length()); _M_capacity(__tmp_capacity);
__rcs._M_data(__tmp_ptr); }
__rcs._M_length(__tmp_length);
__rcs._M_capacity(__tmp_capacity);
}
else else
{ {
const size_type __tmp_capacity = _M_allocated_capacity; const size_type __tmp_capacity = _M_allocated_capacity;
const size_type __tmp_length = _M_length(); if (__rcs._M_is_local())
_CharT* __tmp_ptr = _M_data(); {
_M_data(__rcs._M_data()); _S_copy(_M_local_data, __rcs._M_local_data,
_M_length(__rcs._M_length()); __rcs._M_length() + 1);
_M_capacity(__rcs._M_allocated_capacity); __rcs._M_data(_M_data());
__rcs._M_data(__tmp_ptr); _M_data(_M_local_data);
__rcs._M_length(__tmp_length); }
else
{
_CharT* __tmp_ptr = _M_data();
_M_data(__rcs._M_data());
__rcs._M_data(__tmp_ptr);
_M_capacity(__rcs._M_allocated_capacity);
}
__rcs._M_capacity(__tmp_capacity); __rcs._M_capacity(__tmp_capacity);
} }
const size_type __tmp_length = _M_length();
_M_length(__rcs._M_length());
__rcs._M_length(__tmp_length);
} }
template<typename _CharT, typename _Traits, typename _Alloc> template<typename _CharT, typename _Traits, typename _Alloc>