summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-12-11 00:41:29 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-12-11 00:41:29 +0000
commit169164630a30180d2b6a962d7094474d0a601ff2 (patch)
tree6f2dff5fbecaa3fc1d3a8fbc15ad8d28758c8d84 /libstdc++-v3
parent744d9e7f7a7ebfe4feb847603c6c391c2db0e933 (diff)
downloadppe42-gcc-169164630a30180d2b6a962d7094474d0a601ff2.tar.gz
ppe42-gcc-169164630a30180d2b6a962d7094474d0a601ff2.zip
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108372 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog13
-rw-r--r--libstdc++-v3/include/ext/rc_string_base.h26
-rw-r--r--libstdc++-v3/include/ext/sso_string_base.h32
-rw-r--r--libstdc++-v3/include/ext/vstring.h3
4 files changed, 71 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 6cedb5e8ddd..6e28250af19 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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>
diff --git a/libstdc++-v3/include/ext/rc_string_base.h b/libstdc++-v3/include/ext/rc_string_base.h
index 9636a813a02..43a69c2c1b6 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<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 */
diff --git a/libstdc++-v3/include/ext/sso_string_base.h b/libstdc++-v3/include/ext/sso_string_base.h
index 1b967b98283..bb0d746eca5 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<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 */
diff --git a/libstdc++-v3/include/ext/vstring.h b/libstdc++-v3/include/ext/vstring.h
index 4a5228518d7..1c59e717915 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);
OpenPOWER on IntegriCloud