OSDN Git Service

2005-12-10 Paolo Carlini <pcarlini@suse.de>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Dec 2005 00:41:29 +0000 (00:41 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Dec 2005 00:41:29 +0000 (00:41 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108372 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 6cedb5e..6e28250 100644 (file)
@@ -1,3 +1,16 @@
+2005-12-10  Paolo Carlini  <pcarlini@suse.de>
+
+       * 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  <pcarlini@suse.de>
            Howard Hinnant  <hhinnant@apple.com>
 
index 9636a81..43a69c2 100644 (file)
@@ -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<typename _CharT, typename _Traits, typename _Alloc>
@@ -670,6 +674,28 @@ namespace __gnu_cxx
 
       _M_rep()->_M_set_length(__new_size);      
     }
+
+  template<>
+    inline bool
+    __rc_string_base<char, std::char_traits<char>,
+                    std::allocator<char> >::
+    _M_compare(const __rc_string_base& __rcs) const
+    {
+      if (_M_rep() == __rcs._M_rep())
+       return true;
+      return false;
+    }
+
+  template<>
+    inline bool
+    __rc_string_base<wchar_t, std::char_traits<wchar_t>,
+                    std::allocator<wchar_t> >::
+    _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 */
index 1b967b9..bb0d746 100644 (file)
@@ -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<typename _CharT, typename _Traits, typename _Alloc>
     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<typename _CharT, typename _Traits, typename _Alloc>
     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<char, std::char_traits<char>,
+                     std::allocator<char> >::
+    _M_compare(const __sso_string_base& __rcs) const
+    {
+      if (this == &__rcs)
+       return true;
+      return false;
+    }
+
+  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;
+    }
 } // namespace __gnu_cxx
 
 #endif /* _SSO_STRING_BASE_H */
index 4a52285..1c59e71 100644 (file)
@@ -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);