<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>libstdc++: __gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc > Class Template Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="navtree.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="navtree.js"></script> <script type="text/javascript" src="resize.js"></script> <script type="text/javascript"> $(document).ready(initResizable); </script> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.7.4 --> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">libstdc++</div> </td> </tr> </tbody> </table> </div> </div> <div id="side-nav" class="ui-resizable side-nav-resizable"> <div id="nav-tree"> <div id="nav-tree-contents"> </div> </div> <div id="splitbar" style="-moz-user-select:none;" class="ui-resizable-handle"> </div> </div> <script type="text/javascript"> initNavTree('a00017.html',''); </script> <div id="doc-content"> <div class="header"> <div class="summary"> <a href="#pub-types">Public Types</a> | <a href="#pub-methods">Public Member Functions</a> | <a href="#pro-types">Protected Types</a> | <a href="#pro-static-methods">Static Protected Member Functions</a> </div> <div class="headertitle"> <div class="title">__gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc > Class Template Reference</div> </div> </div> <div class="contents"> <!-- doxytag: class="__gnu_cxx::__rc_string_base" --><!-- doxytag: inherits="__gnu_cxx::__vstring_utility" --> <p>Inherits __gnu_cxx::__vstring_utility< _CharT, _Traits, _Alloc >.</p> <p><a href="a01403.html">List of all members.</a></p> <h2><a name="pub-types"></a> Public Types</h2> <ul> <li><a class="anchor" id="a11ed2810c7e0e8851e4ad17fd4a42f05"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_CharT_alloc_type" ref="a11ed2810c7e0e8851e4ad17fd4a42f05" args="" --> typedef <br class="typebreak"/> _Util_Base::_CharT_alloc_type <b>_CharT_alloc_type</b> <li><a class="anchor" id="a7c05ff432df8cf5b93cb28d812b5237e"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_Util_Base" ref="a7c05ff432df8cf5b93cb28d812b5237e" args="" --> typedef __vstring_utility<br class="typebreak"/> < _CharT, _Traits, _Alloc > <b>_Util_Base</b> <li><a class="anchor" id="a568f2a050b5b8ae920196a0899157ef3"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::allocator_type" ref="a568f2a050b5b8ae920196a0899157ef3" args="" --> typedef _Alloc <b>allocator_type</b> <li><a class="anchor" id="af62415c4f26f81b363ebe6d5b612f260"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::size_type" ref="af62415c4f26f81b363ebe6d5b612f260" args="" --> typedef <br class="typebreak"/> _CharT_alloc_type::size_type <b>size_type</b> <li><a class="anchor" id="af3b1120e0bc31cf2373f6ea2d73a9122"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::traits_type" ref="af3b1120e0bc31cf2373f6ea2d73a9122" args="" --> typedef _Traits <b>traits_type</b> <li><a class="anchor" id="a79883c5956b245aa810d38d871138a9b"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::value_type" ref="a79883c5956b245aa810d38d871138a9b" args="" --> typedef _Traits::char_type <b>value_type</b> </ul> <h2><a name="pub-methods"></a> Public Member Functions</h2> <ul> <li><a class="anchor" id="af9ddd3f4c01c56461004dbee1fe365d0"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::__rc_string_base" ref="af9ddd3f4c01c56461004dbee1fe365d0" args="(const _Alloc &__a)" --> <b>__rc_string_base</b> (const _Alloc &__a) <li><a class="anchor" id="aafa872f0c86a830350edf828c52bf7cb"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::__rc_string_base" ref="aafa872f0c86a830350edf828c52bf7cb" args="(const __rc_string_base &__rcs)" --> <b>__rc_string_base</b> (const <a class="el" href="a00017.html">__rc_string_base</a> &__rcs) <li><a class="anchor" id="a125bc6c1aab79fa25ec0d145f828449b"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::__rc_string_base" ref="a125bc6c1aab79fa25ec0d145f828449b" args="(__rc_string_base &&__rcs)" --> <b>__rc_string_base</b> (<a class="el" href="a00017.html">__rc_string_base</a> &&__rcs) <li><a class="anchor" id="ac1f37d753351363f325e3af8753d3d60"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::__rc_string_base" ref="ac1f37d753351363f325e3af8753d3d60" args="(size_type __n, _CharT __c, const _Alloc &__a)" --> <b>__rc_string_base</b> (size_type __n, _CharT __c, const _Alloc &__a) <li><a class="anchor" id="ac8f45b6dc7ccd2e104bc93b8f6924ee3"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::__rc_string_base" ref="ac8f45b6dc7ccd2e104bc93b8f6924ee3" args="(_InputIterator __beg, _InputIterator __end, const _Alloc &__a)" --> template<typename _InputIterator > <b>__rc_string_base</b> (_InputIterator __beg, _InputIterator __end, const _Alloc &__a) <li><a class="anchor" id="a8c1c701941fa28cdce1c50bebebdcd7f"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_assign" ref="a8c1c701941fa28cdce1c50bebebdcd7f" args="(const __rc_string_base &__rcs)" --> void <b>_M_assign</b> (const <a class="el" href="a00017.html">__rc_string_base</a> &__rcs) <li><a class="anchor" id="a355f8348bcd603e91fa77599b72aa8f1"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_capacity" ref="a355f8348bcd603e91fa77599b72aa8f1" args="() const " --> size_type <b>_M_capacity</b> () const <li><a class="anchor" id="a364acb3f0c4c2aa7f119d873d97f1355"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_clear" ref="a364acb3f0c4c2aa7f119d873d97f1355" args="()" --> void <b>_M_clear</b> () <li><a class="anchor" id="ace5d6be6d37d14594ef8fdb98cab3740"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_compare" ref="ace5d6be6d37d14594ef8fdb98cab3740" args="(const __rc_string_base &) const " --> bool <b>_M_compare</b> (const <a class="el" href="a00017.html">__rc_string_base</a> &) const <li><a class="anchor" id="af09de17dac7feb89a05e0de70fbacc36"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_compare" ref="af09de17dac7feb89a05e0de70fbacc36" args="(const __rc_string_base &__rcs) const" --> template<> bool <b>_M_compare</b> (const <a class="el" href="a00017.html">__rc_string_base</a> &__rcs) const <li><a class="anchor" id="af543481625689236a2747195a2c9c0e3"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_compare" ref="af543481625689236a2747195a2c9c0e3" args="(const __rc_string_base &__rcs) const" --> template<> bool <b>_M_compare</b> (const <a class="el" href="a00017.html">__rc_string_base</a> &__rcs) const <li><a class="anchor" id="a7f8ad96e81a84a3b4e3f14161976c730"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_data" ref="a7f8ad96e81a84a3b4e3f14161976c730" args="() const " --> _CharT * <b>_M_data</b> () const <li><a class="anchor" id="a6b800764fecb9aa218fa96b2eb991f02"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_erase" ref="a6b800764fecb9aa218fa96b2eb991f02" args="(size_type __pos, size_type __n)" --> void <b>_M_erase</b> (size_type __pos, size_type __n) <li><a class="anchor" id="acac154161a71a3535191862ad2f752c5"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_get_allocator" ref="acac154161a71a3535191862ad2f752c5" args="()" --> allocator_type & <b>_M_get_allocator</b> () <li><a class="anchor" id="a127ffcddb58d15235c9d80de570e0612"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_get_allocator" ref="a127ffcddb58d15235c9d80de570e0612" args="() const " --> const allocator_type & <b>_M_get_allocator</b> () const <li><a class="anchor" id="a71ffef4ce33b54e7b5c6192c32b2a2ad"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_is_shared" ref="a71ffef4ce33b54e7b5c6192c32b2a2ad" args="() const " --> bool <b>_M_is_shared</b> () const <li><a class="anchor" id="a798b1ac0d3c8f2c20bd5453af3494f91"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_leak" ref="a798b1ac0d3c8f2c20bd5453af3494f91" args="()" --> void <b>_M_leak</b> () <li><a class="anchor" id="abd0331c9c0842f6febe56aaf2ac284c4"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_length" ref="abd0331c9c0842f6febe56aaf2ac284c4" args="() const " --> size_type <b>_M_length</b> () const <li><a class="anchor" id="a83d65d9fe847caaecc763f2836caebfb"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_max_size" ref="a83d65d9fe847caaecc763f2836caebfb" args="() const " --> size_type <b>_M_max_size</b> () const <li><a class="anchor" id="adc54b4d970573f360c78c509fca2daad"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_mutate" ref="adc54b4d970573f360c78c509fca2daad" args="(size_type __pos, size_type __len1, const _CharT *__s, size_type __len2)" --> void <b>_M_mutate</b> (size_type __pos, size_type __len1, const _CharT *__s, size_type __len2) <li><a class="anchor" id="a69aaa89924c18f34038da9cc70446f3f"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_reserve" ref="a69aaa89924c18f34038da9cc70446f3f" args="(size_type __res)" --> void <b>_M_reserve</b> (size_type __res) <li><a class="anchor" id="a61947e45f4afe0ab9e31745007d22893"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_set_leaked" ref="a61947e45f4afe0ab9e31745007d22893" args="()" --> void <b>_M_set_leaked</b> () <li><a class="anchor" id="a4ead2deb5cc0acb1829cf4b4f3227d04"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_set_length" ref="a4ead2deb5cc0acb1829cf4b4f3227d04" args="(size_type __n)" --> void <b>_M_set_length</b> (size_type __n) <li><a class="anchor" id="a1f7c41f7ab447c47904c8cad875f1c1d"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_M_swap" ref="a1f7c41f7ab447c47904c8cad875f1c1d" args="(__rc_string_base &__rcs)" --> void <b>_M_swap</b> (<a class="el" href="a00017.html">__rc_string_base</a> &__rcs) <li><a class="anchor" id="ad6b4db546f28b1cdcd5d4722035ffad8"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_construct" ref="ad6b4db546f28b1cdcd5d4722035ffad8" args="(_InIterator __beg, _InIterator __end, const _Alloc &__a, std::forward_iterator_tag)" --> template<typename _InIterator > _CharT * <b>_S_construct</b> (_InIterator __beg, _InIterator __end, const _Alloc &__a, <a class="el" href="a00474.html">std::forward_iterator_tag</a>) </ul> <h2><a name="pro-types"></a> Protected Types</h2> <ul> <li><a class="anchor" id="afd5bf3e8b9ed7800015b1d5ac5eb12b7"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::__const_rc_iterator" ref="afd5bf3e8b9ed7800015b1d5ac5eb12b7" args="" --> typedef <br class="typebreak"/> __gnu_cxx::__normal_iterator<br class="typebreak"/> < const_pointer, <br class="typebreak"/> <a class="el" href="a00019.html">__gnu_cxx::__versa_string</a><br class="typebreak"/> < _CharT, _Traits, _Alloc, <br class="typebreak"/> <a class="el" href="a00017.html">__rc_string_base</a> > > <b>__const_rc_iterator</b> <li><a class="anchor" id="a72a9b8ee2da725fc9e090c4ac025c7e3"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::__const_sso_iterator" ref="a72a9b8ee2da725fc9e090c4ac025c7e3" args="" --> typedef <br class="typebreak"/> __gnu_cxx::__normal_iterator<br class="typebreak"/> < const_pointer, <br class="typebreak"/> <a class="el" href="a00019.html">__gnu_cxx::__versa_string</a><br class="typebreak"/> < _CharT, _Traits, _Alloc, <br class="typebreak"/> __sso_string_base > > <b>__const_sso_iterator</b> <li><a class="anchor" id="a0e6ef4342dbb141769c88272c99bc8b5"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::__rc_iterator" ref="a0e6ef4342dbb141769c88272c99bc8b5" args="" --> typedef <br class="typebreak"/> __gnu_cxx::__normal_iterator<br class="typebreak"/> < pointer, <br class="typebreak"/> <a class="el" href="a00019.html">__gnu_cxx::__versa_string</a><br class="typebreak"/> < _CharT, _Traits, _Alloc, <br class="typebreak"/> <a class="el" href="a00017.html">__rc_string_base</a> > > <b>__rc_iterator</b> <li><a class="anchor" id="a44e976c363fd59b2e2afc9db4dc052bd"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::__sso_iterator" ref="a44e976c363fd59b2e2afc9db4dc052bd" args="" --> typedef <br class="typebreak"/> __gnu_cxx::__normal_iterator<br class="typebreak"/> < pointer, <br class="typebreak"/> <a class="el" href="a00019.html">__gnu_cxx::__versa_string</a><br class="typebreak"/> < _CharT, _Traits, _Alloc, <br class="typebreak"/> __sso_string_base > > <b>__sso_iterator</b> <li><a class="anchor" id="a2468540de9b5d2a7e90f323a916f6fa6"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::const_pointer" ref="a2468540de9b5d2a7e90f323a916f6fa6" args="" --> typedef <br class="typebreak"/> _CharT_alloc_type::const_pointer <b>const_pointer</b> <li><a class="anchor" id="ac0ada1008ee1ec1475af0cbf21bba850"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::difference_type" ref="ac0ada1008ee1ec1475af0cbf21bba850" args="" --> typedef <br class="typebreak"/> _CharT_alloc_type::difference_type <b>difference_type</b> <li><a class="anchor" id="aa6bbb3df89d6a6bfa05b18a03eb20a7a"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::pointer" ref="aa6bbb3df89d6a6bfa05b18a03eb20a7a" args="" --> typedef _CharT_alloc_type::pointer <b>pointer</b> </ul> <h2><a name="pro-static-methods"></a> Static Protected Member Functions</h2> <ul> <li><a class="anchor" id="ae3ce53d55e94c87b48f512554796ae99"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_assign" ref="ae3ce53d55e94c87b48f512554796ae99" args="(_CharT *__d, size_type __n, _CharT __c)" --> static void <b>_S_assign</b> (_CharT *__d, size_type __n, _CharT __c) <li><a class="anchor" id="a035c54f4c119fd7114316a920c9139c6"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_compare" ref="a035c54f4c119fd7114316a920c9139c6" args="(size_type __n1, size_type __n2)" --> static int <b>_S_compare</b> (size_type __n1, size_type __n2) <li><a class="anchor" id="a10e4d89ffb64ded6a0d697b736d5af5d"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_copy" ref="a10e4d89ffb64ded6a0d697b736d5af5d" args="(_CharT *__d, const _CharT *__s, size_type __n)" --> static void <b>_S_copy</b> (_CharT *__d, const _CharT *__s, size_type __n) <li><a class="anchor" id="accf3857a389b9f35e13034a3eab1576d"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_copy_chars" ref="accf3857a389b9f35e13034a3eab1576d" args="(_CharT *__p, _CharT *__k1, _CharT *__k2)" --> static void <b>_S_copy_chars</b> (_CharT *__p, _CharT *__k1, _CharT *__k2) <li><a class="anchor" id="a1ae7a576de3116a6241af83e1ca3d778"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_copy_chars" ref="a1ae7a576de3116a6241af83e1ca3d778" args="(_CharT *__p, __sso_iterator __k1, __sso_iterator __k2)" --> static void <b>_S_copy_chars</b> (_CharT *__p, __sso_iterator __k1, __sso_iterator __k2) <li><a class="anchor" id="a9f908984163cf66696644564bebd8983"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_copy_chars" ref="a9f908984163cf66696644564bebd8983" args="(_CharT *__p, __rc_iterator __k1, __rc_iterator __k2)" --> static void <b>_S_copy_chars</b> (_CharT *__p, __rc_iterator __k1, __rc_iterator __k2) <li><a class="anchor" id="abc3a3f425a9ce9021f0d97a74c1bd0d2"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_copy_chars" ref="abc3a3f425a9ce9021f0d97a74c1bd0d2" args="(_CharT *__p, __const_sso_iterator __k1, __const_sso_iterator __k2)" --> static void <b>_S_copy_chars</b> (_CharT *__p, __const_sso_iterator __k1, __const_sso_iterator __k2) <li><a class="anchor" id="a17d7a78749ca156d90c34b82d856f124"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_copy_chars" ref="a17d7a78749ca156d90c34b82d856f124" args="(_CharT *__p, _Iterator __k1, _Iterator __k2)" --> template<typename _Iterator > static void <b>_S_copy_chars</b> (_CharT *__p, _Iterator __k1, _Iterator __k2) <li><a class="anchor" id="a009b150759a0c2aba8bed1dccf2ac5b9"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_copy_chars" ref="a009b150759a0c2aba8bed1dccf2ac5b9" args="(_CharT *__p, __const_rc_iterator __k1, __const_rc_iterator __k2)" --> static void <b>_S_copy_chars</b> (_CharT *__p, __const_rc_iterator __k1, __const_rc_iterator __k2) <li><a class="anchor" id="a4e3807c8de72d22a563a65125ff309be"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_copy_chars" ref="a4e3807c8de72d22a563a65125ff309be" args="(_CharT *__p, const _CharT *__k1, const _CharT *__k2)" --> static void <b>_S_copy_chars</b> (_CharT *__p, const _CharT *__k1, const _CharT *__k2) <li><a class="anchor" id="a70d3b141492f2ac9b622775952612af7"></a><!-- doxytag: member="__gnu_cxx::__rc_string_base::_S_move" ref="a70d3b141492f2ac9b622775952612af7" args="(_CharT *__d, const _CharT *__s, size_type __n)" --> static void <b>_S_move</b> (_CharT *__d, const _CharT *__s, size_type __n) </ul> <hr/><a name="details" id="details"></a><h2>Detailed Description</h2> <div class="textblock"><h3>template<typename _CharT, typename _Traits, typename _Alloc><br/> class __gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc ></h3> <p>Documentation? What's that? Nathan Myers <<a href="mailto:ncm@cantrip.org">ncm@cantrip.org</a>>.</p> <p>A string looks like this:</p> <div class="fragment"><pre class="fragment"> [_Rep] _M_length [__rc_string_base<char_type>] _M_capacity _M_dataplus _M_refcount _M_p ----------------> unnamed array of char_type </pre></div><p>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.</p> <p>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 <em>add</em> 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.</p> <p>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.)</p> <p>Note that the _Rep object is a POD so that you can have a static <em>empty string</em> _Rep object already <em>constructed</em> 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.</p> <p>All but the last paragraph is considered pretty conventional for a C++ string implementation. </p> <p>Definition at line <a class="el" href="a01004_source.html#l00083">83</a> of file <a class="el" href="a01004_source.html">rc_string_base.h</a>.</p> </div><hr/>The documentation for this class was generated from the following files:<ul> <li><a class="el" href="a01004_source.html">rc_string_base.h</a></li> <li><a class="el" href="a00771_source.html">basic_string.tcc</a></li> </ul> </div> </div> <div id="nav-path" class="navpath"> <ul> <li class="navelem"><a class="el" href="a01125.html">__gnu_cxx</a> </li> <li class="navelem"><a class="el" href="a00017.html">__rc_string_base</a> </li> <li class="footer">Generated by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </li> </ul> </div> </body> </html>