__gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc > Class Template Reference
Inheritance diagram for __gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc >:
List of all members.
Detailed Description
template<typename _CharT, typename _Traits, typename _Alloc>
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 86 of file rc_string_base.h.
Public Types
Public Member Functions
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
Static Protected Member Functions
-
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 _CharT *__k1, const _CharT *__k2)
-
static void _S_copy_chars (_CharT *__p, _CharT *__k1, _CharT *__k2)
-
static void _S_copy_chars (_CharT *__p, __const_rc_iterator __k1, __const_rc_iterator __k2)
-
static void _S_copy_chars (_CharT *__p, __rc_iterator __k1, __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, __sso_iterator __k1, __sso_iterator __k2)
-
template<typename _Iterator> static void _S_copy_chars (_CharT *__p, _Iterator __k1, _Iterator __k2)
-
static void _S_move (_CharT *__d, const _CharT *__s, size_type __n)
The documentation for this class was generated from the following file:
Generated on Wed Mar 26 00:44:01 2008 for libstdc++ by
1.5.1