diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2007-07-27 17:25:04 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2007-07-27 17:25:04 +0000 |
commit | bd12160ab85e4a251bfbd28e2db54e191ccce1b6 (patch) | |
tree | 44b5ce6b12e7d56639fbe7683c39b8fc421dae62 | |
parent | e4142b7c1b884fa2a33c4aaa3f3603c23586de7d (diff) | |
download | gcc-bd12160ab85e4a251bfbd28e2db54e191ccce1b6.zip gcc-bd12160ab85e4a251bfbd28e2db54e191ccce1b6.tar.gz gcc-bd12160ab85e4a251bfbd28e2db54e191ccce1b6.tar.bz2 |
re PR libstdc++/32907 (Inefficient operator== in std::string)
2007-07-27 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/32907
* include/bits/basic_string.h (operator==(const basic_string<_CharT>&,
const basic_string<_CharT>&)): Add.
(operator!=): Forward to operator==.
* include/ext/vstring.h(operator==(const __versa_string<_CharT,
std::char_traits<_CharT>, std::allocator<_CharT>, _Base>&,
const __versa_string<_CharT, std::char_traits<_CharT>,
std::allocator<_CharT>, _Base>&)): Add.
(operator!=): Forward to operator==.
* include/ext/sso_string_base.h (_M_compare): Remove.
From-SVN: r126988
-rw-r--r-- | libstdc++-v3/ChangeLog | 26 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 15 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/sso_string_base.h | 24 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/vstring.h | 17 |
4 files changed, 47 insertions, 35 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b5d9ce3..b0ab719 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,8 +1,22 @@ +2007-07-27 Paolo Carlini <pcarlini@suse.de> + + PR libstdc++/32907 + * include/bits/basic_string.h (operator==(const basic_string<_CharT>&, + const basic_string<_CharT>&)): Add. + (operator!=): Forward to operator==. + * include/ext/vstring.h(operator==(const __versa_string<_CharT, + std::char_traits<_CharT>, std::allocator<_CharT>, _Base>&, + const __versa_string<_CharT, std::char_traits<_CharT>, + std::allocator<_CharT>, _Base>&)): Add. + (operator!=): Forward to operator==. + + * include/ext/sso_string_base.h (_M_compare): Remove. + 2007-07-25 Stephen M. Webb <stephenw@xandros.com> - Fixed abi_check for missing symbol size changes. - * testsuite/util/testsuite_abi.cc: Changed local variable name to prevent - member variable hiding. + Fixed abi_check for missing symbol size changes. + * testsuite/util/testsuite_abi.cc: Changed local variable name to + prevent member variable hiding. 2007-07-25 John Davind Anglin <dave.anglin@nrc-cnrc.gc.ca> @@ -26,8 +40,10 @@ * testsuite/thread/pthread5.cc: Likewise. * testsuite/thread/pthread6.cc: Likewise. * testsuite/thread/pthread7-rope.cc: Likewise. - * testsuite/tr1/2_general_utilities/shared_ptr/thread/default_weaktoshared.cc: Likewise. - * testsuite/tr1/2_general_utilities/shared_ptr/thread/mutex_weaktoshared.cc: Likewise. + * testsuite/tr1/2_general_utilities/shared_ptr/thread/ + default_weaktoshared.cc: Likewise. + * testsuite/tr1/2_general_utilities/shared_ptr/thread/ + mutex_weaktoshared.cc: Likewise. 2007-07-16 Danny Smith <dannysmith@users.sourceforge.net> diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 6317b17..2dc3b37 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -2157,6 +2157,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std) const basic_string<_CharT, _Traits, _Alloc>& __rhs) { return __lhs.compare(__rhs) == 0; } + template<typename _CharT> + inline + typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type + operator==(const basic_string<_CharT>& __lhs, + const basic_string<_CharT>& __rhs) + { return (__lhs.size() == __rhs.size() + && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(), + __lhs.size())); } + /** * @brief Test equivalence of C string and string. * @param lhs C string. @@ -2192,7 +2201,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) inline bool operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs) - { return __rhs.compare(__lhs) != 0; } + { return !(__lhs == __rhs); } /** * @brief Test difference of C string and string. @@ -2204,7 +2213,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) inline bool operator!=(const _CharT* __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs) - { return __rhs.compare(__lhs) != 0; } + { return !(__lhs == __rhs); } /** * @brief Test difference of string and C string. @@ -2216,7 +2225,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) inline bool operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs, const _CharT* __rhs) - { return __lhs.compare(__rhs) != 0; } + { return !(__lhs == __rhs); } // operator < /** diff --git a/libstdc++-v3/include/ext/sso_string_base.h b/libstdc++-v3/include/ext/sso_string_base.h index 3b87879..0b576ba 100644 --- a/libstdc++-v3/include/ext/sso_string_base.h +++ b/libstdc++-v3/include/ext/sso_string_base.h @@ -540,30 +540,6 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) _M_set_length(_M_length() - __n); } - template<> - inline bool - __sso_string_base<char, std::char_traits<char>, - std::allocator<char> >:: - _M_compare(const __sso_string_base& __rcs) const - { - if (this == &__rcs) - return true; - return false; - } - -#ifdef _GLIBCXX_USE_WCHAR_T - template<> - inline bool - __sso_string_base<wchar_t, std::char_traits<wchar_t>, - std::allocator<wchar_t> >:: - _M_compare(const __sso_string_base& __rcs) const - { - if (this == &__rcs) - return true; - return false; - } -#endif - _GLIBCXX_END_NAMESPACE #endif /* _SSO_STRING_BASE_H */ diff --git a/libstdc++-v3/include/ext/vstring.h b/libstdc++-v3/include/ext/vstring.h index b46a6be..bafa044 100644 --- a/libstdc++-v3/include/ext/vstring.h +++ b/libstdc++-v3/include/ext/vstring.h @@ -1867,6 +1867,17 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) { return __lhs.compare(__rhs) == 0; } + template<typename _CharT, + template <typename, typename, typename> class _Base> + inline typename __enable_if<std::__is_char<_CharT>::__value, bool>::__type + operator==(const __versa_string<_CharT, std::char_traits<_CharT>, + std::allocator<_CharT>, _Base>& __lhs, + const __versa_string<_CharT, std::char_traits<_CharT>, + std::allocator<_CharT>, _Base>& __rhs) + { return (__lhs.size() == __rhs.size() + && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(), + __lhs.size())); } + /** * @brief Test equivalence of C string and string. * @param lhs C string. @@ -1905,7 +1916,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) inline bool operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) - { return __rhs.compare(__lhs) != 0; } + { return !(__lhs == __rhs); } /** * @brief Test difference of C string and string. @@ -1918,7 +1929,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) inline bool operator!=(const _CharT* __lhs, const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) - { return __rhs.compare(__lhs) != 0; } + { return !(__lhs == __rhs); } /** * @brief Test difference of string and C string. @@ -1931,7 +1942,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) inline bool operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, const _CharT* __rhs) - { return __lhs.compare(__rhs) != 0; } + { return !(__lhs == __rhs); } // operator < /** |