__gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc >(3cxx) | __gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc >(3cxx) |
__gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc >
#include <rc_string_base.h>
Inherits __gnu_cxx::__vstring_utility< _CharT, _Traits, _Alloc >.
typedef _Util_Base::_CharT_alloc_type _CharT_alloc_type
typedef __vstring_utility< _CharT, _Traits, _Alloc > _Util_Base
typedef _Alloc allocator_type
typedef _CharT_alloc_type::size_type size_type
typedef _Traits traits_type
typedef _Traits::char_type value_type
__rc_string_base (__rc_string_base &&__rcs)
template<typename _InputIterator > __rc_string_base
(_InputIterator __beg, _InputIterator __end, const _Alloc &__a)
__rc_string_base (const __rc_string_base &__rcs)
__rc_string_base (const _Alloc &__a)
__rc_string_base (size_type __n, _CharT __c, 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
bool _M_compare (const __rc_string_base &__rcs) const
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::forward_iterator_tag)
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 __alloc_traits< _CharT_alloc_type >
_CharT_alloc_traits
typedef _CharT_alloc_traits::const_pointer const_pointer
typedef _CharT_alloc_type::difference_type difference_type
typedef _CharT_alloc_traits::pointer pointer
static void _S_assign (_CharT *__d, size_type __n, _CharT
__c)
static int _S_compare (size_type __n1, size_type __n2)
static void _S_copy (_CharT *__d, const _CharT *__s, size_type __n)
static void _S_copy_chars (_CharT *__p, __const_rc_iterator __k1,
__const_rc_iterator __k2)
static void _S_copy_chars (_CharT *__p, __const_sso_iterator __k1,
__const_sso_iterator __k2)
static void _S_copy_chars (_CharT *__p, __rc_iterator __k1,
__rc_iterator __k2)
static void _S_copy_chars (_CharT *__p, __sso_iterator __k1,
__sso_iterator __k2)
static void _S_copy_chars (_CharT *__p, _CharT *__k1, _CharT *__k2)
template<typename _Iterator > static void _S_copy_chars (_CharT
*__p, _Iterator __k1, _Iterator __k2)
static void _S_copy_chars (_CharT *__p, const _CharT *__k1, const
_CharT *__k2)
static void _S_move (_CharT *__d, const _CharT *__s, size_type __n)
class __gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc >"Documentation? What's that? Nathan Myers ncm@cantrip.org.
A string looks like this:
[_Rep]
_M_length [__rc_string_base<char_type>] _M_capacity _M_dataplus _M_refcount _M_p ----------------> unnamed array of char_type
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.
Definition at line 87 of file vstring_util.h.
Definition at line 75 of file vstring_util.h.
Definition at line 82 of file vstring_util.h.
Definition at line 70 of file vstring_util.h.
Definition at line 56 of file vstring_util.h.
Definition at line 92 of file rc_string_base.h.
Definition at line 91 of file rc_string_base.h.
Definition at line 89 of file rc_string_base.h.
Definition at line 63 of file vstring_util.h.
Definition at line 61 of file vstring_util.h.
Definition at line 62 of file vstring_util.h.
Definition at line 93 of file rc_string_base.h.
Definition at line 87 of file rc_string_base.h.
Definition at line 88 of file rc_string_base.h.
Definition at line 312 of file rc_string_base.h.
Definition at line 476 of file rc_string_base.h.
Definition at line 481 of file rc_string_base.h.
Definition at line 320 of file rc_string_base.h.
Definition at line 487 of file rc_string_base.h.
Definition at line 493 of file rc_string_base.h.
Definition at line 331 of file rc_string_base.h.
Definition at line 626 of file rc_string_base.h.
Definition at line 290 of file rc_string_base.h.
Definition at line 359 of file rc_string_base.h.
Definition at line 366 of file rc_string_base.h.
Definition at line 714 of file rc_string_base.h.
Definition at line 726 of file rc_string_base.h.
Definition at line 282 of file rc_string_base.h.
Definition at line 680 of file rc_string_base.h.
Definition at line 335 of file rc_string_base.h.
Definition at line 339 of file rc_string_base.h.
Definition at line 294 of file rc_string_base.h.
Definition at line 302 of file rc_string_base.h.
Definition at line 286 of file rc_string_base.h.
Definition at line 278 of file rc_string_base.h.
Definition at line 657 of file rc_string_base.h.
Definition at line 639 of file rc_string_base.h.
Definition at line 298 of file rc_string_base.h.
Definition at line 309 of file rc_string_base.h.
Definition at line 606 of file rc_string_base.h.
Definition at line 125 of file vstring_util.h.
Definition at line 170 of file vstring_util.h.
Definition at line 560 of file rc_string_base.h.
Definition at line 107 of file vstring_util.h.
Definition at line 157 of file vstring_util.h.
Definition at line 148 of file vstring_util.h.
Definition at line 153 of file vstring_util.h.
Definition at line 144 of file vstring_util.h.
Definition at line 162 of file vstring_util.h.
Definition at line 137 of file vstring_util.h.
Definition at line 166 of file vstring_util.h.
Definition at line 116 of file vstring_util.h.
Generated automatically by Doxygen for libstdc++ from the source code.
Thu Feb 16 2023 | libstdc++ |