Simplified swapping

This commit is contained in:
Ion Gaztañaga
2015-06-04 11:42:27 +02:00
parent 2ee17d108e
commit 4f9d397507

View File

@@ -111,8 +111,7 @@ class basic_string_base
~basic_string_base() ~basic_string_base()
{ {
if(!this->is_short()){ if(!this->is_short()){
this->deallocate_block(); this->deallocate(this->priv_long_addr(), this->priv_long_storage());
this->is_short(true);
} }
} }
@@ -131,7 +130,7 @@ class basic_string_base
long_t(const long_t &other) long_t(const long_t &other)
{ {
this->is_short = other.is_short; this->is_short = false;
length = other.length; length = other.length;
storage = other.storage; storage = other.storage;
start = other.start; start = other.start;
@@ -139,7 +138,6 @@ class basic_string_base
long_t &operator= (const long_t &other) long_t &operator= (const long_t &other)
{ {
this->is_short = other.is_short;
length = other.length; length = other.length;
storage = other.storage; storage = other.storage;
start = other.start; start = other.start;
@@ -420,21 +418,19 @@ class basic_string_base
} }
else{ else{
short_t short_backup(this->members_.m_repr.short_repr()); short_t short_backup(this->members_.m_repr.short_repr());
long_t long_backup (other.members_.m_repr.long_repr()); this->members_.m_repr.short_repr().~short_t();
::new(&this->members_.m_repr.long_repr()) long_t(other.members_.m_repr.long_repr());
other.members_.m_repr.long_repr().~long_t(); other.members_.m_repr.long_repr().~long_t();
::new(&this->members_.m_repr.long_repr()) long_t; ::new(&other.members_.m_repr.short_repr()) short_t(short_backup);
this->members_.m_repr.long_repr() = long_backup;
other.members_.m_repr.short_repr() = short_backup;
} }
} }
else{ else{
if(other.is_short()){ if(other.is_short()){
short_t short_backup(other.members_.m_repr.short_repr()); short_t short_backup(other.members_.m_repr.short_repr());
long_t long_backup (this->members_.m_repr.long_repr()); other.members_.m_repr.short_repr().~short_t();
::new(&other.members_.m_repr.long_repr()) long_t(this->members_.m_repr.long_repr());
this->members_.m_repr.long_repr().~long_t(); this->members_.m_repr.long_repr().~long_t();
::new(&other.members_.m_repr.long_repr()) long_t; ::new(&this->members_.m_repr.short_repr()) short_t(short_backup);
other.members_.m_repr.long_repr() = long_backup;
this->members_.m_repr.short_repr() = short_backup;
} }
else{ else{
boost::adl_move_swap(this->members_.m_repr.long_repr(), other.members_.m_repr.long_repr()); boost::adl_move_swap(this->members_.m_repr.long_repr(), other.members_.m_repr.long_repr());