re PR libstdc++/32907 (Inefficient operator== in std::string)
authorPaolo Carlini <paolo@gcc.gnu.org>
Fri, 27 Jul 2007 17:25:04 +0000 (17:25 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 27 Jul 2007 17:25:04 +0000 (17:25 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/basic_string.h
libstdc++-v3/include/ext/sso_string_base.h
libstdc++-v3/include/ext/vstring.h

index b5d9ce3..b0ab719 100644 (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>
 
        * 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>
 
index 6317b17..2dc3b37 100644 (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 <
   /**
index 3b87879..0b576ba 100644 (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 */
index b46a6be..bafa044 100644 (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 <
   /**