From: Paolo Carlini Date: Sun, 11 Dec 2005 00:41:29 +0000 (+0000) Subject: sso_string_base.h (__sso_string_base<>::_M_compare): Add... X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b6105bf2c397ba0aba21454a17e013974e0fe657;p=platform%2Fupstream%2Fgcc.git sso_string_base.h (__sso_string_base<>::_M_compare): Add... 2005-12-10 Paolo Carlini * include/ext/sso_string_base.h (__sso_string_base<>::_M_compare): Add, specialized for char and wchar_t to immediately return true when a string is compared to itself. * include/ext/rc_string_base.h (__rc_string_base<>::_M_compare): Likewise, for the same _Rep. * include/ext/vstring.h (compare(const string&)): Use it. * include/ext/sso_string_base.h (__sso_string_base<>::_M_destroy): Deallocate passed size + 1. (_M_dispose, _M_reserve): Adjust. From-SVN: r108372 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 6cedb5e..6e28250 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2005-12-10 Paolo Carlini + + * include/ext/sso_string_base.h (__sso_string_base<>::_M_compare): + Add, specialized for char and wchar_t to immediately return true + when a string is compared to itself. + * include/ext/rc_string_base.h (__rc_string_base<>::_M_compare): + Likewise, for the same _Rep. + * include/ext/vstring.h (compare(const string&)): Use it. + + * include/ext/sso_string_base.h (__sso_string_base<>::_M_destroy): + Deallocate passed size + 1. + (_M_dispose, _M_reserve): Adjust. + 2005-12-09 Paolo Carlini Howard Hinnant diff --git a/libstdc++-v3/include/ext/rc_string_base.h b/libstdc++-v3/include/ext/rc_string_base.h index 9636a81..43a69c2 100644 --- a/libstdc++-v3/include/ext/rc_string_base.h +++ b/libstdc++-v3/include/ext/rc_string_base.h @@ -334,6 +334,10 @@ namespace __gnu_cxx void _M_erase(size_type __pos, size_type __n); + + bool + _M_compare(const __rc_string_base&) const + { return false; } }; template @@ -670,6 +674,28 @@ namespace __gnu_cxx _M_rep()->_M_set_length(__new_size); } + + template<> + inline bool + __rc_string_base, + std::allocator >:: + _M_compare(const __rc_string_base& __rcs) const + { + if (_M_rep() == __rcs._M_rep()) + return true; + return false; + } + + template<> + inline bool + __rc_string_base, + std::allocator >:: + _M_compare(const __rc_string_base& __rcs) const + { + if (_M_rep() == __rcs._M_rep()) + return true; + return false; + } } // namespace __gnu_cxx #endif /* _RC_STRING_BASE_H */ diff --git a/libstdc++-v3/include/ext/sso_string_base.h b/libstdc++-v3/include/ext/sso_string_base.h index 1b967b9..bb0d746 100644 --- a/libstdc++-v3/include/ext/sso_string_base.h +++ b/libstdc++-v3/include/ext/sso_string_base.h @@ -102,7 +102,7 @@ namespace __gnu_cxx _M_dispose() { if (!_M_is_local()) - _M_destroy(_M_allocated_capacity + 1); + _M_destroy(_M_allocated_capacity); } void @@ -225,13 +225,17 @@ namespace __gnu_cxx void _M_erase(size_type __pos, size_type __n); + + bool + _M_compare(const __sso_string_base&) const + { return false; } }; template void __sso_string_base<_CharT, _Traits, _Alloc>:: _M_destroy(size_type __size) throw() - { _CharT_alloc_type(_M_get_allocator()).deallocate(_M_data(), __size); } + { _CharT_alloc_type(_M_get_allocator()).deallocate(_M_data(), __size + 1); } template void @@ -498,7 +502,7 @@ namespace __gnu_cxx else if (!_M_is_local()) { _S_copy(_M_local_data, _M_data(), _M_length() + 1); - _M_destroy(__capacity + 1); + _M_destroy(__capacity); _M_data(_M_local_data); } } @@ -541,6 +545,28 @@ namespace __gnu_cxx _M_set_length(_M_length() - __n); } + + template<> + inline bool + __sso_string_base, + std::allocator >:: + _M_compare(const __sso_string_base& __rcs) const + { + if (this == &__rcs) + return true; + return false; + } + + template<> + inline bool + __sso_string_base, + std::allocator >:: + _M_compare(const __sso_string_base& __rcs) const + { + if (this == &__rcs) + return true; + return false; + } } // namespace __gnu_cxx #endif /* _SSO_STRING_BASE_H */ diff --git a/libstdc++-v3/include/ext/vstring.h b/libstdc++-v3/include/ext/vstring.h index 4a52285..1c59e71 100644 --- a/libstdc++-v3/include/ext/vstring.h +++ b/libstdc++-v3/include/ext/vstring.h @@ -1665,6 +1665,9 @@ namespace __gnu_cxx int compare(const __versa_string& __str) const { + if (this->_M_compare(__str)) + return 0; + const size_type __size = this->size(); const size_type __osize = __str.size(); const size_type __len = std::min(__size, __osize);