* 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
+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>
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>
_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 */
_M_dispose()
{
if (!_M_is_local())
- _M_destroy(_M_allocated_capacity + 1);
+ _M_destroy(_M_allocated_capacity);
}
void
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
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);
}
}
_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 */
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);