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
This commit is contained in:
Paolo Carlini 2007-07-27 17:25:04 +00:00
parent e4142b7c1b
commit bd12160ab8
4 changed files with 47 additions and 35 deletions

View File

@ -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>

View File

@ -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 <
/**

View File

@ -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 */

View File

@ -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 <
/**