libstdc++
|
Inherits __gnu_cxx::__vstring_utility< _CharT, _Traits, _Alloc >.
Public Member Functions | |
__rc_string_base (const _Alloc &__a) | |
__rc_string_base (const __rc_string_base &__rcs) | |
__rc_string_base (__rc_string_base &&__rcs) | |
__rc_string_base (size_type __n, _CharT __c, const _Alloc &__a) | |
template<typename _InputIterator > | |
__rc_string_base (_InputIterator __beg, _InputIterator __end, const _Alloc &__a) | |
void | _M_assign (const __rc_string_base &__rcs) |
size_type | _M_capacity () const |
void | _M_clear () |
bool | _M_compare (const __rc_string_base &) const |
template<> | |
bool | _M_compare (const __rc_string_base &__rcs) const |
template<> | |
bool | _M_compare (const __rc_string_base &__rcs) const |
_CharT * | _M_data () const |
void | _M_erase (size_type __pos, size_type __n) |
allocator_type & | _M_get_allocator () |
const allocator_type & | _M_get_allocator () const |
bool | _M_is_shared () const |
void | _M_leak () |
size_type | _M_length () const |
size_type | _M_max_size () const |
void | _M_mutate (size_type __pos, size_type __len1, const _CharT *__s, size_type __len2) |
void | _M_reserve (size_type __res) |
void | _M_set_leaked () |
void | _M_set_length (size_type __n) |
void | _M_swap (__rc_string_base &__rcs) |
template<typename _InIterator > | |
_CharT * | _S_construct (_InIterator __beg, _InIterator __end, const _Alloc &__a, std::input_iterator_tag) |
template<typename _InIterator > | |
_CharT * | _S_construct (_InIterator __beg, _InIterator __end, const _Alloc &__a, std::forward_iterator_tag) |
Protected Types | |
typedef __gnu_cxx::__normal_iterator < const_pointer, __gnu_cxx::__versa_string < _CharT, _Traits, _Alloc, __rc_string_base > > | __const_rc_iterator |
typedef __gnu_cxx::__normal_iterator < const_pointer, __gnu_cxx::__versa_string < _CharT, _Traits, _Alloc, __sso_string_base > > | __const_sso_iterator |
typedef __gnu_cxx::__normal_iterator < pointer, __gnu_cxx::__versa_string < _CharT, _Traits, _Alloc, __rc_string_base > > | __rc_iterator |
typedef __gnu_cxx::__normal_iterator < pointer, __gnu_cxx::__versa_string < _CharT, _Traits, _Alloc, __sso_string_base > > | __sso_iterator |
typedef _CharT_alloc_type::const_pointer | const_pointer |
typedef _CharT_alloc_type::difference_type | difference_type |
typedef _CharT_alloc_type::pointer | pointer |
Documentation? What's that? Nathan Myers ncm@c. antr ip.or g
A string looks like this:
Where the _M_p points to the first character in the string, and you cast it to a pointer-to-_Rep and subtract 1 to get a pointer to the header.
This approach has the enormous advantage that a string object requires only one allocation. All the ugliness is confined within a single pair of inline functions, which each compile to a single add instruction: _Rep::_M_refdata(), and __rc_string_base::_M_rep(); and the allocation function which gets a block of raw bytes and with room enough and constructs a _Rep object at the front.
The reason you want _M_data pointing to the character array and not the _Rep is so that the debugger can see the string contents. (Probably we should add a non-inline member to get the _Rep for the debugger to use, so users can check the actual string length.)
Note that the _Rep object is a POD so that you can have a static empty string _Rep object already constructed before static constructors have run. The reference-count encoding is chosen so that a 0 indicates one reference, so you never try to destroy the empty-string _Rep object.
All but the last paragraph is considered pretty conventional for a C++ string implementation.
Definition at line 83 of file rc_string_base.h.