zoukankan      html  css  js  c++  java
  • basic_string

       1 // Components for manipulating sequences of characters -*- C++ -*-
       2 
       3 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
       4 // 2006, 2007, 2008, 2009
       5 // Free Software Foundation, Inc.
       6 //
       7 // This file is part of the GNU ISO C++ Library.  This library is free
       8 // software; you can redistribute it and/or modify it under the
       9 // terms of the GNU General Public License as published by the
      10 // Free Software Foundation; either version 3, or (at your option)
      11 // any later version.
      12 
      13 // This library is distributed in the hope that it will be useful,
      14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
      15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16 // GNU General Public License for more details.
      17 
      18 // Under Section 7 of GPL version 3, you are granted additional
      19 // permissions described in the GCC Runtime Library Exception, version
      20 // 3.1, as published by the Free Software Foundation.
      21 
      22 // You should have received a copy of the GNU General Public License and
      23 // a copy of the GCC Runtime Library Exception along with this program;
      24 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      25 // <http://www.gnu.org/licenses/>.
      26 
      27 /** @file basic_string.h
      28  *  This is an internal header file, included by other library headers.
      29  *  You should not attempt to use it directly.
      30  */
      31 
      32 //
      33 // ISO C++ 14882: 21 Strings library
      34 //
      35 
      36 #ifndef _BASIC_STRING_H
      37 #define _BASIC_STRING_H 1
      38 
      39 #pragma GCC system_header
      40 
      41 #include <ext/atomicity.h>
      42 #include <debug/debug.h>
      43 #include <initializer_list>
      44 
      45 _GLIBCXX_BEGIN_NAMESPACE(std)
      46 
      47   /**
      48    *  @class basic_string basic_string.h <string>
      49    *  @brief  Managing sequences of characters and character-like objects.
      50    *
      51    *  @ingroup sequences
      52    *
      53    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
      54    *  <a href="tables.html#66">reversible container</a>, and a
      55    *  <a href="tables.html#67">sequence</a>.  Of the
      56    *  <a href="tables.html#68">optional sequence requirements</a>, only
      57    *  @c push_back, @c at, and array access are supported.
      58    *
      59    *  @doctodo
      60    *
      61    *
      62    *  Documentation?  What's that?
      63    *  Nathan Myers <ncm@cantrip.org>.
      64    *
      65    *  A string looks like this:
      66    *
      67    *  @code
      68    *                                        [_Rep]
      69    *                                        _M_length
      70    *   [basic_string<char_type>]            _M_capacity
      71    *   _M_dataplus                          _M_refcount
      72    *   _M_p ---------------->               unnamed array of char_type
      73    *  @endcode
      74    *
      75    *  Where the _M_p points to the first character in the string, and
      76    *  you cast it to a pointer-to-_Rep and subtract 1 to get a
      77    *  pointer to the header.
      78    *
      79    *  This approach has the enormous advantage that a string object
      80    *  requires only one allocation.  All the ugliness is confined
      81    *  within a single pair of inline functions, which each compile to
      82    *  a single "add" instruction: _Rep::_M_data(), and
      83    *  string::_M_rep(); and the allocation function which gets a
      84    *  block of raw bytes and with room enough and constructs a _Rep
      85    *  object at the front.
      86    *
      87    *  The reason you want _M_data pointing to the character array and
      88    *  not the _Rep is so that the debugger can see the string
      89    *  contents. (Probably we should add a non-inline member to get
      90    *  the _Rep for the debugger to use, so users can check the actual
      91    *  string length.)
      92    *
      93    *  Note that the _Rep object is a POD so that you can have a
      94    *  static "empty string" _Rep object already "constructed" before
      95    *  static constructors have run.  The reference-count encoding is
      96    *  chosen so that a 0 indicates one reference, so you never try to
      97    *  destroy the empty-string _Rep object.
      98    *
      99    *  All but the last paragraph is considered pretty conventional
     100    *  for a C++ string implementation.
     101   */
     102   // 21.3  Template class basic_string
     103   template<typename _CharT, typename _Traits, typename _Alloc>
     104     class basic_string
     105     {
     106       typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
     107 
     108       // Types:
     109     public:
     110       typedef _Traits                        traits_type;
     111       typedef typename _Traits::char_type            value_type;
     112       typedef _Alloc                        allocator_type;
     113       typedef typename _CharT_alloc_type::size_type        size_type;
     114       typedef typename _CharT_alloc_type::difference_type   difference_type;
     115       typedef typename _CharT_alloc_type::reference        reference;
     116       typedef typename _CharT_alloc_type::const_reference   const_reference;
     117       typedef typename _CharT_alloc_type::pointer        pointer;
     118       typedef typename _CharT_alloc_type::const_pointer        const_pointer;
     119       typedef __gnu_cxx::__normal_iterator<pointer, basic_string>  iterator;
     120       typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
     121                                                             const_iterator;
     122       typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
     123       typedef std::reverse_iterator<iterator>            reverse_iterator;
     124 
     125     private:
     126       // _Rep: string representation
     127       //   Invariants:
     128       //   1. String really contains _M_length + 1 characters: due to 21.3.4
     129       //      must be kept null-terminated.
     130       //   2. _M_capacity >= _M_length
     131       //      Allocated memory is always (_M_capacity + 1) * sizeof(_CharT).
     132       //   3. _M_refcount has three states:
     133       //      -1: leaked, one reference, no ref-copies allowed, non-const.
     134       //       0: one reference, non-const.
     135       //     n>0: n + 1 references, operations require a lock, const.
     136       //   4. All fields==0 is an empty string, given the extra storage
     137       //      beyond-the-end for a null terminator; thus, the shared
     138       //      empty string representation needs no constructor.
     139 
     140       struct _Rep_base
     141       {
     142     size_type        _M_length;
     143     size_type        _M_capacity;
     144     _Atomic_word        _M_refcount;
     145       };
     146 
     147       struct _Rep : _Rep_base
     148       {
     149     // Types:
     150     typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
     151 
     152     // (Public) Data members:
     153 
     154     // The maximum number of individual char_type elements of an
     155     // individual string is determined by _S_max_size. This is the
     156     // value that will be returned by max_size().  (Whereas npos
     157     // is the maximum number of bytes the allocator can allocate.)
     158     // If one was to divvy up the theoretical largest size string,
     159     // with a terminating character and m _CharT elements, it'd
     160     // look like this:
     161     // npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
     162     // Solving for m:
     163     // m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
     164     // In addition, this implementation quarters this amount.
     165     static const size_type    _S_max_size;
     166     static const _CharT    _S_terminal;
     167 
     168     // The following storage is init'd to 0 by the linker, resulting
     169         // (carefully) in an empty string with one reference.
     170         static size_type _S_empty_rep_storage[];
     171 
     172         static _Rep&
     173         _S_empty_rep()
     174         { 
     175       // NB: Mild hack to avoid strict-aliasing warnings.  Note that
     176       // _S_empty_rep_storage is never modified and the punning should
     177       // be reasonably safe in this case.
     178       void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
     179       return *reinterpret_cast<_Rep*>(__p);
     180     }
     181 
     182         bool
     183     _M_is_leaked() const
     184         { return this->_M_refcount < 0; }
     185 
     186         bool
     187     _M_is_shared() const
     188         { return this->_M_refcount > 0; }
     189 
     190         void
     191     _M_set_leaked()
     192         { this->_M_refcount = -1; }
     193 
     194         void
     195     _M_set_sharable()
     196         { this->_M_refcount = 0; }
     197 
     198     void
     199     _M_set_length_and_sharable(size_type __n)
     200     {
     201 #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
     202       if (__builtin_expect(this != &_S_empty_rep(), false))
     203 #endif
     204         {
     205           this->_M_set_sharable();  // One reference.
     206           this->_M_length = __n;
     207           traits_type::assign(this->_M_refdata()[__n], _S_terminal);
     208           // grrr. (per 21.3.4)
     209           // You cannot leave those LWG people alone for a second.
     210         }
     211     }
     212 
     213     _CharT*
     214     _M_refdata() throw()
     215     { return reinterpret_cast<_CharT*>(this + 1); }
     216 
     217     _CharT*
     218     _M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
     219     {
     220       return (!_M_is_leaked() && __alloc1 == __alloc2)
     221               ? _M_refcopy() : _M_clone(__alloc1);
     222     }
     223 
     224     // Create & Destroy
     225     static _Rep*
     226     _S_create(size_type, size_type, const _Alloc&);
     227 
     228     void
     229     _M_dispose(const _Alloc& __a)
     230     {
     231 #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
     232       if (__builtin_expect(this != &_S_empty_rep(), false))
     233 #endif
     234         if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
     235                                -1) <= 0)
     236           _M_destroy(__a);
     237     }  // XXX MT
     238 
     239     void
     240     _M_destroy(const _Alloc&) throw();
     241 
     242     _CharT*
     243     _M_refcopy() throw()
     244     {
     245 #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
     246       if (__builtin_expect(this != &_S_empty_rep(), false))
     247 #endif
     248             __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
     249       return _M_refdata();
     250     }  // XXX MT
     251 
     252     _CharT*
     253     _M_clone(const _Alloc&, size_type __res = 0);
     254       };
     255 
     256       // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
     257       struct _Alloc_hider : _Alloc
     258       {
     259     _Alloc_hider(_CharT* __dat, const _Alloc& __a)
     260     : _Alloc(__a), _M_p(__dat) { }
     261 
     262     _CharT* _M_p; // The actual data.
     263       };
     264 
     265     public:
     266       // Data Members (public):
     267       // NB: This is an unsigned type, and thus represents the maximum
     268       // size that the allocator can hold.
     269       ///  Value returned by various member functions when they fail.
     270       static const size_type    npos = static_cast<size_type>(-1);
     271 
     272     private:
     273       // Data Members (private):
     274       mutable _Alloc_hider    _M_dataplus;
     275 
     276       _CharT*
     277       _M_data() const
     278       { return  _M_dataplus._M_p; }
     279 
     280       _CharT*
     281       _M_data(_CharT* __p)
     282       { return (_M_dataplus._M_p = __p); }
     283 
     284       _Rep*
     285       _M_rep() const
     286       { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
     287 
     288       // For the internal use we have functions similar to `begin'/`end'
     289       // but they do not call _M_leak.
     290       iterator
     291       _M_ibegin() const
     292       { return iterator(_M_data()); }
     293 
     294       iterator
     295       _M_iend() const
     296       { return iterator(_M_data() + this->size()); }
     297 
     298       void
     299       _M_leak()    // for use in begin() & non-const op[]
     300       {
     301     if (!_M_rep()->_M_is_leaked())
     302       _M_leak_hard();
     303       }
     304 
     305       size_type
     306       _M_check(size_type __pos, const char* __s) const
     307       {
     308     if (__pos > this->size())
     309       __throw_out_of_range(__N(__s));
     310     return __pos;
     311       }
     312 
     313       void
     314       _M_check_length(size_type __n1, size_type __n2, const char* __s) const
     315       {
     316     if (this->max_size() - (this->size() - __n1) < __n2)
     317       __throw_length_error(__N(__s));
     318       }
     319 
     320       // NB: _M_limit doesn't check for a bad __pos value.
     321       size_type
     322       _M_limit(size_type __pos, size_type __off) const
     323       {
     324     const bool __testoff =  __off < this->size() - __pos;
     325     return __testoff ? __off : this->size() - __pos;
     326       }
     327 
     328       // True if _Rep and source do not overlap.
     329       bool
     330       _M_disjunct(const _CharT* __s) const
     331       {
     332     return (less<const _CharT*>()(__s, _M_data())
     333         || less<const _CharT*>()(_M_data() + this->size(), __s));
     334       }
     335 
     336       // When __n = 1 way faster than the general multichar
     337       // traits_type::copy/move/assign.
     338       static void
     339       _M_copy(_CharT* __d, const _CharT* __s, size_type __n)
     340       {
     341     if (__n == 1)
     342       traits_type::assign(*__d, *__s);
     343     else
     344       traits_type::copy(__d, __s, __n);
     345       }
     346 
     347       static void
     348       _M_move(_CharT* __d, const _CharT* __s, size_type __n)
     349       {
     350     if (__n == 1)
     351       traits_type::assign(*__d, *__s);
     352     else
     353       traits_type::move(__d, __s, __n);      
     354       }
     355 
     356       static void
     357       _M_assign(_CharT* __d, size_type __n, _CharT __c)
     358       {
     359     if (__n == 1)
     360       traits_type::assign(*__d, __c);
     361     else
     362       traits_type::assign(__d, __n, __c);      
     363       }
     364 
     365       // _S_copy_chars is a separate template to permit specialization
     366       // to optimize for the common case of pointers as iterators.
     367       template<class _Iterator>
     368         static void
     369         _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
     370         {
     371       for (; __k1 != __k2; ++__k1, ++__p)
     372         traits_type::assign(*__p, *__k1); // These types are off.
     373     }
     374 
     375       static void
     376       _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2)
     377       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
     378 
     379       static void
     380       _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
     381       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
     382 
     383       static void
     384       _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
     385       { _M_copy(__p, __k1, __k2 - __k1); }
     386 
     387       static void
     388       _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
     389       { _M_copy(__p, __k1, __k2 - __k1); }
     390 
     391       static int
     392       _S_compare(size_type __n1, size_type __n2)
     393       {
     394     const difference_type __d = difference_type(__n1 - __n2);
     395 
     396     if (__d > __gnu_cxx::__numeric_traits<int>::__max)
     397       return __gnu_cxx::__numeric_traits<int>::__max;
     398     else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
     399       return __gnu_cxx::__numeric_traits<int>::__min;
     400     else
     401       return int(__d);
     402       }
     403 
     404       void
     405       _M_mutate(size_type __pos, size_type __len1, size_type __len2);
     406 
     407       void
     408       _M_leak_hard();
     409 
     410       static _Rep&
     411       _S_empty_rep()
     412       { return _Rep::_S_empty_rep(); }
     413 
     414     public:
     415       // Construct/copy/destroy:
     416       // NB: We overload ctors in some cases instead of using default
     417       // arguments, per 17.4.4.4 para. 2 item 2.
     418 
     419       /**
     420        *  @brief  Default constructor creates an empty string.
     421        */
     422       inline
     423       basic_string();
     424 
     425       /**
     426        *  @brief  Construct an empty string using allocator @a a.
     427        */
     428       explicit
     429       basic_string(const _Alloc& __a);
     430 
     431       // NB: per LWG issue 42, semantics different from IS:
     432       /**
     433        *  @brief  Construct string with copy of value of @a str.
     434        *  @param  str  Source string.
     435        */
     436       basic_string(const basic_string& __str);
     437       /**
     438        *  @brief  Construct string as copy of a substring.
     439        *  @param  str  Source string.
     440        *  @param  pos  Index of first character to copy from.
     441        *  @param  n  Number of characters to copy (default remainder).
     442        */
     443       basic_string(const basic_string& __str, size_type __pos,
     444            size_type __n = npos);
     445       /**
     446        *  @brief  Construct string as copy of a substring.
     447        *  @param  str  Source string.
     448        *  @param  pos  Index of first character to copy from.
     449        *  @param  n  Number of characters to copy.
     450        *  @param  a  Allocator to use.
     451        */
     452       basic_string(const basic_string& __str, size_type __pos,
     453            size_type __n, const _Alloc& __a);
     454 
     455       /**
     456        *  @brief  Construct string initialized by a character array.
     457        *  @param  s  Source character array.
     458        *  @param  n  Number of characters to copy.
     459        *  @param  a  Allocator to use (default is default allocator).
     460        *
     461        *  NB: @a s must have at least @a n characters, '\0' has no special
     462        *  meaning.
     463        */
     464       basic_string(const _CharT* __s, size_type __n,
     465            const _Alloc& __a = _Alloc());
     466       /**
     467        *  @brief  Construct string as copy of a C string.
     468        *  @param  s  Source C string.
     469        *  @param  a  Allocator to use (default is default allocator).
     470        */
     471       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
     472       /**
     473        *  @brief  Construct string as multiple characters.
     474        *  @param  n  Number of characters.
     475        *  @param  c  Character to use.
     476        *  @param  a  Allocator to use (default is default allocator).
     477        */
     478       basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
     479 
     480 #ifdef __GXX_EXPERIMENTAL_CXX0X__
     481       /**
     482        *  @brief  Construct string from an initializer list.
     483        *  @param  l  std::initializer_list of characters.
     484        *  @param  a  Allocator to use (default is default allocator).
     485        */
     486       basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc());
     487 #endif // __GXX_EXPERIMENTAL_CXX0X__
     488 
     489       /**
     490        *  @brief  Construct string as copy of a range.
     491        *  @param  beg  Start of range.
     492        *  @param  end  End of range.
     493        *  @param  a  Allocator to use (default is default allocator).
     494        */
     495       template<class _InputIterator>
     496         basic_string(_InputIterator __beg, _InputIterator __end,
     497              const _Alloc& __a = _Alloc());
     498 
     499       /**
     500        *  @brief  Destroy the string instance.
     501        */
     502       ~basic_string()
     503       { _M_rep()->_M_dispose(this->get_allocator()); }
     504 
     505       /**
     506        *  @brief  Assign the value of @a str to this string.
     507        *  @param  str  Source string.
     508        */
     509       basic_string&
     510       operator=(const basic_string& __str) 
     511       { return this->assign(__str); }
     512 
     513       /**
     514        *  @brief  Copy contents of @a s into this string.
     515        *  @param  s  Source null-terminated string.
     516        */
     517       basic_string&
     518       operator=(const _CharT* __s) 
     519       { return this->assign(__s); }
     520 
     521       /**
     522        *  @brief  Set value to string of length 1.
     523        *  @param  c  Source character.
     524        *
     525        *  Assigning to a character makes this string length 1 and
     526        *  (*this)[0] == @a c.
     527        */
     528       basic_string&
     529       operator=(_CharT __c) 
     530       { 
     531     this->assign(1, __c); 
     532     return *this;
     533       }
     534 
     535 #ifdef __GXX_EXPERIMENTAL_CXX0X__
     536       /**
     537        *  @brief  Set value to string constructed from initializer list.
     538        *  @param  l  std::initializer_list.
     539        */
     540       basic_string&
     541       operator=(initializer_list<_CharT> __l)
     542       {
     543     this->assign (__l.begin(), __l.end());
     544     return *this;
     545       }
     546 #endif // __GXX_EXPERIMENTAL_CXX0X__
     547 
     548       // Iterators:
     549       /**
     550        *  Returns a read/write iterator that points to the first character in
     551        *  the %string.  Unshares the string.
     552        */
     553       iterator
     554       begin()
     555       {
     556     _M_leak();
     557     return iterator(_M_data());
     558       }
     559 
     560       /**
     561        *  Returns a read-only (constant) iterator that points to the first
     562        *  character in the %string.
     563        */
     564       const_iterator
     565       begin() const
     566       { return const_iterator(_M_data()); }
     567 
     568       /**
     569        *  Returns a read/write iterator that points one past the last
     570        *  character in the %string.  Unshares the string.
     571        */
     572       iterator
     573       end()
     574       {
     575     _M_leak();
     576     return iterator(_M_data() + this->size());
     577       }
     578 
     579       /**
     580        *  Returns a read-only (constant) iterator that points one past the
     581        *  last character in the %string.
     582        */
     583       const_iterator
     584       end() const
     585       { return const_iterator(_M_data() + this->size()); }
     586 
     587       /**
     588        *  Returns a read/write reverse iterator that points to the last
     589        *  character in the %string.  Iteration is done in reverse element
     590        *  order.  Unshares the string.
     591        */
     592       reverse_iterator
     593       rbegin()
     594       { return reverse_iterator(this->end()); }
     595 
     596       /**
     597        *  Returns a read-only (constant) reverse iterator that points
     598        *  to the last character in the %string.  Iteration is done in
     599        *  reverse element order.
     600        */
     601       const_reverse_iterator
     602       rbegin() const
     603       { return const_reverse_iterator(this->end()); }
     604 
     605       /**
     606        *  Returns a read/write reverse iterator that points to one before the
     607        *  first character in the %string.  Iteration is done in reverse
     608        *  element order.  Unshares the string.
     609        */
     610       reverse_iterator
     611       rend()
     612       { return reverse_iterator(this->begin()); }
     613 
     614       /**
     615        *  Returns a read-only (constant) reverse iterator that points
     616        *  to one before the first character in the %string.  Iteration
     617        *  is done in reverse element order.
     618        */
     619       const_reverse_iterator
     620       rend() const
     621       { return const_reverse_iterator(this->begin()); }
     622 
     623     public:
     624       // Capacity:
     625       ///  Returns the number of characters in the string, not including any
     626       ///  null-termination.
     627       size_type
     628       size() const
     629       { return _M_rep()->_M_length; }
     630 
     631       ///  Returns the number of characters in the string, not including any
     632       ///  null-termination.
     633       size_type
     634       length() const
     635       { return _M_rep()->_M_length; }
     636 
     637       /// Returns the size() of the largest possible %string.
     638       size_type
     639       max_size() const
     640       { return _Rep::_S_max_size; }
     641 
     642       /**
     643        *  @brief  Resizes the %string to the specified number of characters.
     644        *  @param  n  Number of characters the %string should contain.
     645        *  @param  c  Character to fill any new elements.
     646        *
     647        *  This function will %resize the %string to the specified
     648        *  number of characters.  If the number is smaller than the
     649        *  %string's current size the %string is truncated, otherwise
     650        *  the %string is extended and new elements are set to @a c.
     651        */
     652       void
     653       resize(size_type __n, _CharT __c);
     654 
     655       /**
     656        *  @brief  Resizes the %string to the specified number of characters.
     657        *  @param  n  Number of characters the %string should contain.
     658        *
     659        *  This function will resize the %string to the specified length.  If
     660        *  the new size is smaller than the %string's current size the %string
     661        *  is truncated, otherwise the %string is extended and new characters
     662        *  are default-constructed.  For basic types such as char, this means
     663        *  setting them to 0.
     664        */
     665       void
     666       resize(size_type __n)
     667       { this->resize(__n, _CharT()); }
     668 
     669       /**
     670        *  Returns the total number of characters that the %string can hold
     671        *  before needing to allocate more memory.
     672        */
     673       size_type
     674       capacity() const
     675       { return _M_rep()->_M_capacity; }
     676 
     677       /**
     678        *  @brief  Attempt to preallocate enough memory for specified number of
     679        *          characters.
     680        *  @param  res_arg  Number of characters required.
     681        *  @throw  std::length_error  If @a res_arg exceeds @c max_size().
     682        *
     683        *  This function attempts to reserve enough memory for the
     684        *  %string to hold the specified number of characters.  If the
     685        *  number requested is more than max_size(), length_error is
     686        *  thrown.
     687        *
     688        *  The advantage of this function is that if optimal code is a
     689        *  necessity and the user can determine the string length that will be
     690        *  required, the user can reserve the memory in %advance, and thus
     691        *  prevent a possible reallocation of memory and copying of %string
     692        *  data.
     693        */
     694       void
     695       reserve(size_type __res_arg = 0);
     696 
     697       /**
     698        *  Erases the string, making it empty.
     699        */
     700       void
     701       clear()
     702       { _M_mutate(0, this->size(), 0); }
     703 
     704       /**
     705        *  Returns true if the %string is empty.  Equivalent to *this == "".
     706        */
     707       bool
     708       empty() const
     709       { return this->size() == 0; }
     710 
     711       // Element access:
     712       /**
     713        *  @brief  Subscript access to the data contained in the %string.
     714        *  @param  pos  The index of the character to access.
     715        *  @return  Read-only (constant) reference to the character.
     716        *
     717        *  This operator allows for easy, array-style, data access.
     718        *  Note that data access with this operator is unchecked and
     719        *  out_of_range lookups are not defined. (For checked lookups
     720        *  see at().)
     721        */
     722       const_reference
     723       operator[] (size_type __pos) const
     724       {
     725     _GLIBCXX_DEBUG_ASSERT(__pos <= size());
     726     return _M_data()[__pos];
     727       }
     728 
     729       /**
     730        *  @brief  Subscript access to the data contained in the %string.
     731        *  @param  pos  The index of the character to access.
     732        *  @return  Read/write reference to the character.
     733        *
     734        *  This operator allows for easy, array-style, data access.
     735        *  Note that data access with this operator is unchecked and
     736        *  out_of_range lookups are not defined. (For checked lookups
     737        *  see at().)  Unshares the string.
     738        */
     739       reference
     740       operator[](size_type __pos)
     741       {
     742         // allow pos == size() as v3 extension:
     743     _GLIBCXX_DEBUG_ASSERT(__pos <= size());
     744         // but be strict in pedantic mode:
     745     _GLIBCXX_DEBUG_PEDASSERT(__pos < size());
     746     _M_leak();
     747     return _M_data()[__pos];
     748       }
     749 
     750       /**
     751        *  @brief  Provides access to the data contained in the %string.
     752        *  @param n The index of the character to access.
     753        *  @return  Read-only (const) reference to the character.
     754        *  @throw  std::out_of_range  If @a n is an invalid index.
     755        *
     756        *  This function provides for safer data access.  The parameter is
     757        *  first checked that it is in the range of the string.  The function
     758        *  throws out_of_range if the check fails.
     759        */
     760       const_reference
     761       at(size_type __n) const
     762       {
     763     if (__n >= this->size())
     764       __throw_out_of_range(__N("basic_string::at"));
     765     return _M_data()[__n];
     766       }
     767 
     768       /**
     769        *  @brief  Provides access to the data contained in the %string.
     770        *  @param n The index of the character to access.
     771        *  @return  Read/write reference to the character.
     772        *  @throw  std::out_of_range  If @a n is an invalid index.
     773        *
     774        *  This function provides for safer data access.  The parameter is
     775        *  first checked that it is in the range of the string.  The function
     776        *  throws out_of_range if the check fails.  Success results in
     777        *  unsharing the string.
     778        */
     779       reference
     780       at(size_type __n)
     781       {
     782     if (__n >= size())
     783       __throw_out_of_range(__N("basic_string::at"));
     784     _M_leak();
     785     return _M_data()[__n];
     786       }
     787 
     788       // Modifiers:
     789       /**
     790        *  @brief  Append a string to this string.
     791        *  @param str  The string to append.
     792        *  @return  Reference to this string.
     793        */
     794       basic_string&
     795       operator+=(const basic_string& __str)
     796       { return this->append(__str); }
     797 
     798       /**
     799        *  @brief  Append a C string.
     800        *  @param s  The C string to append.
     801        *  @return  Reference to this string.
     802        */
     803       basic_string&
     804       operator+=(const _CharT* __s)
     805       { return this->append(__s); }
     806 
     807       /**
     808        *  @brief  Append a character.
     809        *  @param c  The character to append.
     810        *  @return  Reference to this string.
     811        */
     812       basic_string&
     813       operator+=(_CharT __c)
     814       { 
     815     this->push_back(__c);
     816     return *this;
     817       }
     818 
     819 #ifdef __GXX_EXPERIMENTAL_CXX0X__
     820       /**
     821        *  @brief  Append an initializer_list of characters.
     822        *  @param l  The initializer_list of characters to be appended.
     823        *  @return  Reference to this string.
     824        */
     825       basic_string&
     826       operator+=(initializer_list<_CharT> __l)
     827       { return this->append(__l.begin(), __l.end()); }
     828 #endif // __GXX_EXPERIMENTAL_CXX0X__
     829 
     830       /**
     831        *  @brief  Append a string to this string.
     832        *  @param str  The string to append.
     833        *  @return  Reference to this string.
     834        */
     835       basic_string&
     836       append(const basic_string& __str);
     837 
     838       /**
     839        *  @brief  Append a substring.
     840        *  @param str  The string to append.
     841        *  @param pos  Index of the first character of str to append.
     842        *  @param n  The number of characters to append.
     843        *  @return  Reference to this string.
     844        *  @throw  std::out_of_range if @a pos is not a valid index.
     845        *
     846        *  This function appends @a n characters from @a str starting at @a pos
     847        *  to this string.  If @a n is is larger than the number of available
     848        *  characters in @a str, the remainder of @a str is appended.
     849        */
     850       basic_string&
     851       append(const basic_string& __str, size_type __pos, size_type __n);
     852 
     853       /**
     854        *  @brief  Append a C substring.
     855        *  @param s  The C string to append.
     856        *  @param n  The number of characters to append.
     857        *  @return  Reference to this string.
     858        */
     859       basic_string&
     860       append(const _CharT* __s, size_type __n);
     861 
     862       /**
     863        *  @brief  Append a C string.
     864        *  @param s  The C string to append.
     865        *  @return  Reference to this string.
     866        */
     867       basic_string&
     868       append(const _CharT* __s)
     869       {
     870     __glibcxx_requires_string(__s);
     871     return this->append(__s, traits_type::length(__s));
     872       }
     873 
     874       /**
     875        *  @brief  Append multiple characters.
     876        *  @param n  The number of characters to append.
     877        *  @param c  The character to use.
     878        *  @return  Reference to this string.
     879        *
     880        *  Appends n copies of c to this string.
     881        */
     882       basic_string&
     883       append(size_type __n, _CharT __c);
     884 
     885 #ifdef __GXX_EXPERIMENTAL_CXX0X__
     886       /**
     887        *  @brief  Append an initializer_list of characters.
     888        *  @param l  The initializer_list of characters to append.
     889        *  @return  Reference to this string.
     890        */
     891       basic_string&
     892       append(initializer_list<_CharT> __l)
     893       { return this->append(__l.begin(), __l.end()); }
     894 #endif // __GXX_EXPERIMENTAL_CXX0X__
     895 
     896       /**
     897        *  @brief  Append a range of characters.
     898        *  @param first  Iterator referencing the first character to append.
     899        *  @param last  Iterator marking the end of the range.
     900        *  @return  Reference to this string.
     901        *
     902        *  Appends characters in the range [first,last) to this string.
     903        */
     904       template<class _InputIterator>
     905         basic_string&
     906         append(_InputIterator __first, _InputIterator __last)
     907         { return this->replace(_M_iend(), _M_iend(), __first, __last); }
     908 
     909       /**
     910        *  @brief  Append a single character.
     911        *  @param c  Character to append.
     912        */
     913       void
     914       push_back(_CharT __c)
     915       { 
     916     const size_type __len = 1 + this->size();
     917     if (__len > this->capacity() || _M_rep()->_M_is_shared())
     918       this->reserve(__len);
     919     traits_type::assign(_M_data()[this->size()], __c);
     920     _M_rep()->_M_set_length_and_sharable(__len);
     921       }
     922 
     923       /**
     924        *  @brief  Set value to contents of another string.
     925        *  @param  str  Source string to use.
     926        *  @return  Reference to this string.
     927        */
     928       basic_string&
     929       assign(const basic_string& __str);
     930 
     931       /**
     932        *  @brief  Set value to a substring of a string.
     933        *  @param str  The string to use.
     934        *  @param pos  Index of the first character of str.
     935        *  @param n  Number of characters to use.
     936        *  @return  Reference to this string.
     937        *  @throw  std::out_of_range if @a pos is not a valid index.
     938        *
     939        *  This function sets this string to the substring of @a str consisting
     940        *  of @a n characters at @a pos.  If @a n is is larger than the number
     941        *  of available characters in @a str, the remainder of @a str is used.
     942        */
     943       basic_string&
     944       assign(const basic_string& __str, size_type __pos, size_type __n)
     945       { return this->assign(__str._M_data()
     946                 + __str._M_check(__pos, "basic_string::assign"),
     947                 __str._M_limit(__pos, __n)); }
     948 
     949       /**
     950        *  @brief  Set value to a C substring.
     951        *  @param s  The C string to use.
     952        *  @param n  Number of characters to use.
     953        *  @return  Reference to this string.
     954        *
     955        *  This function sets the value of this string to the first @a n
     956        *  characters of @a s.  If @a n is is larger than the number of
     957        *  available characters in @a s, the remainder of @a s is used.
     958        */
     959       basic_string&
     960       assign(const _CharT* __s, size_type __n);
     961 
     962       /**
     963        *  @brief  Set value to contents of a C string.
     964        *  @param s  The C string to use.
     965        *  @return  Reference to this string.
     966        *
     967        *  This function sets the value of this string to the value of @a s.
     968        *  The data is copied, so there is no dependence on @a s once the
     969        *  function returns.
     970        */
     971       basic_string&
     972       assign(const _CharT* __s)
     973       {
     974     __glibcxx_requires_string(__s);
     975     return this->assign(__s, traits_type::length(__s));
     976       }
     977 
     978       /**
     979        *  @brief  Set value to multiple characters.
     980        *  @param n  Length of the resulting string.
     981        *  @param c  The character to use.
     982        *  @return  Reference to this string.
     983        *
     984        *  This function sets the value of this string to @a n copies of
     985        *  character @a c.
     986        */
     987       basic_string&
     988       assign(size_type __n, _CharT __c)
     989       { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
     990 
     991       /**
     992        *  @brief  Set value to a range of characters.
     993        *  @param first  Iterator referencing the first character to append.
     994        *  @param last  Iterator marking the end of the range.
     995        *  @return  Reference to this string.
     996        *
     997        *  Sets value of string to characters in the range [first,last).
     998       */
     999       template<class _InputIterator>
    1000         basic_string&
    1001         assign(_InputIterator __first, _InputIterator __last)
    1002         { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
    1003 
    1004 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    1005       /**
    1006        *  @brief  Set value to an initializer_list of characters.
    1007        *  @param l  The initializer_list of characters to assign.
    1008        *  @return  Reference to this string.
    1009        */
    1010       basic_string&
    1011       assign(initializer_list<_CharT> __l)
    1012       { return this->assign(__l.begin(), __l.end()); }
    1013 #endif // __GXX_EXPERIMENTAL_CXX0X__
    1014 
    1015       /**
    1016        *  @brief  Insert multiple characters.
    1017        *  @param p  Iterator referencing location in string to insert at.
    1018        *  @param n  Number of characters to insert
    1019        *  @param c  The character to insert.
    1020        *  @throw  std::length_error  If new length exceeds @c max_size().
    1021        *
    1022        *  Inserts @a n copies of character @a c starting at the position
    1023        *  referenced by iterator @a p.  If adding characters causes the length
    1024        *  to exceed max_size(), length_error is thrown.  The value of the
    1025        *  string doesn't change if an error is thrown.
    1026       */
    1027       void
    1028       insert(iterator __p, size_type __n, _CharT __c)
    1029       {    this->replace(__p, __p, __n, __c);  }
    1030 
    1031       /**
    1032        *  @brief  Insert a range of characters.
    1033        *  @param p  Iterator referencing location in string to insert at.
    1034        *  @param beg  Start of range.
    1035        *  @param end  End of range.
    1036        *  @throw  std::length_error  If new length exceeds @c max_size().
    1037        *
    1038        *  Inserts characters in range [beg,end).  If adding characters causes
    1039        *  the length to exceed max_size(), length_error is thrown.  The value
    1040        *  of the string doesn't change if an error is thrown.
    1041       */
    1042       template<class _InputIterator>
    1043         void
    1044         insert(iterator __p, _InputIterator __beg, _InputIterator __end)
    1045         { this->replace(__p, __p, __beg, __end); }
    1046 
    1047 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    1048       /**
    1049        *  @brief  Insert an initializer_list of characters.
    1050        *  @param p  Iterator referencing location in string to insert at.
    1051        *  @param l  The initializer_list of characters to insert.
    1052        *  @throw  std::length_error  If new length exceeds @c max_size().
    1053        */
    1054       void
    1055       insert(iterator __p, initializer_list<_CharT> __l)
    1056       { this->insert(__p, __l.begin(), __l.end()); }
    1057 #endif // __GXX_EXPERIMENTAL_CXX0X__
    1058 
    1059       /**
    1060        *  @brief  Insert value of a string.
    1061        *  @param pos1  Iterator referencing location in string to insert at.
    1062        *  @param str  The string to insert.
    1063        *  @return  Reference to this string.
    1064        *  @throw  std::length_error  If new length exceeds @c max_size().
    1065        *
    1066        *  Inserts value of @a str starting at @a pos1.  If adding characters
    1067        *  causes the length to exceed max_size(), length_error is thrown.  The
    1068        *  value of the string doesn't change if an error is thrown.
    1069       */
    1070       basic_string&
    1071       insert(size_type __pos1, const basic_string& __str)
    1072       { return this->insert(__pos1, __str, size_type(0), __str.size()); }
    1073 
    1074       /**
    1075        *  @brief  Insert a substring.
    1076        *  @param pos1  Iterator referencing location in string to insert at.
    1077        *  @param str  The string to insert.
    1078        *  @param pos2  Start of characters in str to insert.
    1079        *  @param n  Number of characters to insert.
    1080        *  @return  Reference to this string.
    1081        *  @throw  std::length_error  If new length exceeds @c max_size().
    1082        *  @throw  std::out_of_range  If @a pos1 > size() or
    1083        *  @a pos2 > @a str.size().
    1084        *
    1085        *  Starting at @a pos1, insert @a n character of @a str beginning with
    1086        *  @a pos2.  If adding characters causes the length to exceed
    1087        *  max_size(), length_error is thrown.  If @a pos1 is beyond the end of
    1088        *  this string or @a pos2 is beyond the end of @a str, out_of_range is
    1089        *  thrown.  The value of the string doesn't change if an error is
    1090        *  thrown.
    1091       */
    1092       basic_string&
    1093       insert(size_type __pos1, const basic_string& __str,
    1094          size_type __pos2, size_type __n)
    1095       { return this->insert(__pos1, __str._M_data()
    1096                 + __str._M_check(__pos2, "basic_string::insert"),
    1097                 __str._M_limit(__pos2, __n)); }
    1098 
    1099       /**
    1100        *  @brief  Insert a C substring.
    1101        *  @param pos  Iterator referencing location in string to insert at.
    1102        *  @param s  The C string to insert.
    1103        *  @param n  The number of characters to insert.
    1104        *  @return  Reference to this string.
    1105        *  @throw  std::length_error  If new length exceeds @c max_size().
    1106        *  @throw  std::out_of_range  If @a pos is beyond the end of this
    1107        *  string.
    1108        *
    1109        *  Inserts the first @a n characters of @a s starting at @a pos.  If
    1110        *  adding characters causes the length to exceed max_size(),
    1111        *  length_error is thrown.  If @a pos is beyond end(), out_of_range is
    1112        *  thrown.  The value of the string doesn't change if an error is
    1113        *  thrown.
    1114       */
    1115       basic_string&
    1116       insert(size_type __pos, const _CharT* __s, size_type __n);
    1117 
    1118       /**
    1119        *  @brief  Insert a C string.
    1120        *  @param pos  Iterator referencing location in string to insert at.
    1121        *  @param s  The C string to insert.
    1122        *  @return  Reference to this string.
    1123        *  @throw  std::length_error  If new length exceeds @c max_size().
    1124        *  @throw  std::out_of_range  If @a pos is beyond the end of this
    1125        *  string.
    1126        *
    1127        *  Inserts the first @a n characters of @a s starting at @a pos.  If
    1128        *  adding characters causes the length to exceed max_size(),
    1129        *  length_error is thrown.  If @a pos is beyond end(), out_of_range is
    1130        *  thrown.  The value of the string doesn't change if an error is
    1131        *  thrown.
    1132       */
    1133       basic_string&
    1134       insert(size_type __pos, const _CharT* __s)
    1135       {
    1136     __glibcxx_requires_string(__s);
    1137     return this->insert(__pos, __s, traits_type::length(__s));
    1138       }
    1139 
    1140       /**
    1141        *  @brief  Insert multiple characters.
    1142        *  @param pos  Index in string to insert at.
    1143        *  @param n  Number of characters to insert
    1144        *  @param c  The character to insert.
    1145        *  @return  Reference to this string.
    1146        *  @throw  std::length_error  If new length exceeds @c max_size().
    1147        *  @throw  std::out_of_range  If @a pos is beyond the end of this
    1148        *  string.
    1149        *
    1150        *  Inserts @a n copies of character @a c starting at index @a pos.  If
    1151        *  adding characters causes the length to exceed max_size(),
    1152        *  length_error is thrown.  If @a pos > length(), out_of_range is
    1153        *  thrown.  The value of the string doesn't change if an error is
    1154        *  thrown.
    1155       */
    1156       basic_string&
    1157       insert(size_type __pos, size_type __n, _CharT __c)
    1158       { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
    1159                   size_type(0), __n, __c); }
    1160 
    1161       /**
    1162        *  @brief  Insert one character.
    1163        *  @param p  Iterator referencing position in string to insert at.
    1164        *  @param c  The character to insert.
    1165        *  @return  Iterator referencing newly inserted char.
    1166        *  @throw  std::length_error  If new length exceeds @c max_size().
    1167        *
    1168        *  Inserts character @a c at position referenced by @a p.  If adding
    1169        *  character causes the length to exceed max_size(), length_error is
    1170        *  thrown.  If @a p is beyond end of string, out_of_range is thrown.
    1171        *  The value of the string doesn't change if an error is thrown.
    1172       */
    1173       iterator
    1174       insert(iterator __p, _CharT __c)
    1175       {
    1176     _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
    1177     const size_type __pos = __p - _M_ibegin();
    1178     _M_replace_aux(__pos, size_type(0), size_type(1), __c);
    1179     _M_rep()->_M_set_leaked();
    1180     return iterator(_M_data() + __pos);
    1181       }
    1182 
    1183       /**
    1184        *  @brief  Remove characters.
    1185        *  @param pos  Index of first character to remove (default 0).
    1186        *  @param n  Number of characters to remove (default remainder).
    1187        *  @return  Reference to this string.
    1188        *  @throw  std::out_of_range  If @a pos is beyond the end of this
    1189        *  string.
    1190        *
    1191        *  Removes @a n characters from this string starting at @a pos.  The
    1192        *  length of the string is reduced by @a n.  If there are < @a n
    1193        *  characters to remove, the remainder of the string is truncated.  If
    1194        *  @a p is beyond end of string, out_of_range is thrown.  The value of
    1195        *  the string doesn't change if an error is thrown.
    1196       */
    1197       basic_string&
    1198       erase(size_type __pos = 0, size_type __n = npos)
    1199       { 
    1200     _M_mutate(_M_check(__pos, "basic_string::erase"),
    1201           _M_limit(__pos, __n), size_type(0));
    1202     return *this;
    1203       }
    1204 
    1205       /**
    1206        *  @brief  Remove one character.
    1207        *  @param position  Iterator referencing the character to remove.
    1208        *  @return  iterator referencing same location after removal.
    1209        *
    1210        *  Removes the character at @a position from this string. The value
    1211        *  of the string doesn't change if an error is thrown.
    1212       */
    1213       iterator
    1214       erase(iterator __position)
    1215       {
    1216     _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
    1217                  && __position < _M_iend());
    1218     const size_type __pos = __position - _M_ibegin();
    1219     _M_mutate(__pos, size_type(1), size_type(0));
    1220     _M_rep()->_M_set_leaked();
    1221     return iterator(_M_data() + __pos);
    1222       }
    1223 
    1224       /**
    1225        *  @brief  Remove a range of characters.
    1226        *  @param first  Iterator referencing the first character to remove.
    1227        *  @param last  Iterator referencing the end of the range.
    1228        *  @return  Iterator referencing location of first after removal.
    1229        *
    1230        *  Removes the characters in the range [first,last) from this string.
    1231        *  The value of the string doesn't change if an error is thrown.
    1232       */
    1233       iterator
    1234       erase(iterator __first, iterator __last);
    1235  
    1236       /**
    1237        *  @brief  Replace characters with value from another string.
    1238        *  @param pos  Index of first character to replace.
    1239        *  @param n  Number of characters to be replaced.
    1240        *  @param str  String to insert.
    1241        *  @return  Reference to this string.
    1242        *  @throw  std::out_of_range  If @a pos is beyond the end of this
    1243        *  string.
    1244        *  @throw  std::length_error  If new length exceeds @c max_size().
    1245        *
    1246        *  Removes the characters in the range [pos,pos+n) from this string.
    1247        *  In place, the value of @a str is inserted.  If @a pos is beyond end
    1248        *  of string, out_of_range is thrown.  If the length of the result
    1249        *  exceeds max_size(), length_error is thrown.  The value of the string
    1250        *  doesn't change if an error is thrown.
    1251       */
    1252       basic_string&
    1253       replace(size_type __pos, size_type __n, const basic_string& __str)
    1254       { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
    1255 
    1256       /**
    1257        *  @brief  Replace characters with value from another string.
    1258        *  @param pos1  Index of first character to replace.
    1259        *  @param n1  Number of characters to be replaced.
    1260        *  @param str  String to insert.
    1261        *  @param pos2  Index of first character of str to use.
    1262        *  @param n2  Number of characters from str to use.
    1263        *  @return  Reference to this string.
    1264        *  @throw  std::out_of_range  If @a pos1 > size() or @a pos2 >
    1265        *  str.size().
    1266        *  @throw  std::length_error  If new length exceeds @c max_size().
    1267        *
    1268        *  Removes the characters in the range [pos1,pos1 + n) from this
    1269        *  string.  In place, the value of @a str is inserted.  If @a pos is
    1270        *  beyond end of string, out_of_range is thrown.  If the length of the
    1271        *  result exceeds max_size(), length_error is thrown.  The value of the
    1272        *  string doesn't change if an error is thrown.
    1273       */
    1274       basic_string&
    1275       replace(size_type __pos1, size_type __n1, const basic_string& __str,
    1276           size_type __pos2, size_type __n2)
    1277       { return this->replace(__pos1, __n1, __str._M_data()
    1278                  + __str._M_check(__pos2, "basic_string::replace"),
    1279                  __str._M_limit(__pos2, __n2)); }
    1280 
    1281       /**
    1282        *  @brief  Replace characters with value of a C substring.
    1283        *  @param pos  Index of first character to replace.
    1284        *  @param n1  Number of characters to be replaced.
    1285        *  @param s  C string to insert.
    1286        *  @param n2  Number of characters from @a s to use.
    1287        *  @return  Reference to this string.
    1288        *  @throw  std::out_of_range  If @a pos1 > size().
    1289        *  @throw  std::length_error  If new length exceeds @c max_size().
    1290        *
    1291        *  Removes the characters in the range [pos,pos + n1) from this string.
    1292        *  In place, the first @a n2 characters of @a s are inserted, or all
    1293        *  of @a s if @a n2 is too large.  If @a pos is beyond end of string,
    1294        *  out_of_range is thrown.  If the length of result exceeds max_size(),
    1295        *  length_error is thrown.  The value of the string doesn't change if
    1296        *  an error is thrown.
    1297       */
    1298       basic_string&
    1299       replace(size_type __pos, size_type __n1, const _CharT* __s,
    1300           size_type __n2);
    1301 
    1302       /**
    1303        *  @brief  Replace characters with value of a C string.
    1304        *  @param pos  Index of first character to replace.
    1305        *  @param n1  Number of characters to be replaced.
    1306        *  @param s  C string to insert.
    1307        *  @return  Reference to this string.
    1308        *  @throw  std::out_of_range  If @a pos > size().
    1309        *  @throw  std::length_error  If new length exceeds @c max_size().
    1310        *
    1311        *  Removes the characters in the range [pos,pos + n1) from this string.
    1312        *  In place, the first @a n characters of @a s are inserted.  If @a
    1313        *  pos is beyond end of string, out_of_range is thrown.  If the length
    1314        *  of result exceeds max_size(), length_error is thrown.  The value of
    1315        *  the string doesn't change if an error is thrown.
    1316       */
    1317       basic_string&
    1318       replace(size_type __pos, size_type __n1, const _CharT* __s)
    1319       {
    1320     __glibcxx_requires_string(__s);
    1321     return this->replace(__pos, __n1, __s, traits_type::length(__s));
    1322       }
    1323 
    1324       /**
    1325        *  @brief  Replace characters with multiple characters.
    1326        *  @param pos  Index of first character to replace.
    1327        *  @param n1  Number of characters to be replaced.
    1328        *  @param n2  Number of characters to insert.
    1329        *  @param c  Character to insert.
    1330        *  @return  Reference to this string.
    1331        *  @throw  std::out_of_range  If @a pos > size().
    1332        *  @throw  std::length_error  If new length exceeds @c max_size().
    1333        *
    1334        *  Removes the characters in the range [pos,pos + n1) from this string.
    1335        *  In place, @a n2 copies of @a c are inserted.  If @a pos is beyond
    1336        *  end of string, out_of_range is thrown.  If the length of result
    1337        *  exceeds max_size(), length_error is thrown.  The value of the string
    1338        *  doesn't change if an error is thrown.
    1339       */
    1340       basic_string&
    1341       replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
    1342       { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
    1343                   _M_limit(__pos, __n1), __n2, __c); }
    1344 
    1345       /**
    1346        *  @brief  Replace range of characters with string.
    1347        *  @param i1  Iterator referencing start of range to replace.
    1348        *  @param i2  Iterator referencing end of range to replace.
    1349        *  @param str  String value to insert.
    1350        *  @return  Reference to this string.
    1351        *  @throw  std::length_error  If new length exceeds @c max_size().
    1352        *
    1353        *  Removes the characters in the range [i1,i2).  In place, the value of
    1354        *  @a str is inserted.  If the length of result exceeds max_size(),
    1355        *  length_error is thrown.  The value of the string doesn't change if
    1356        *  an error is thrown.
    1357       */
    1358       basic_string&
    1359       replace(iterator __i1, iterator __i2, const basic_string& __str)
    1360       { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
    1361 
    1362       /**
    1363        *  @brief  Replace range of characters with C substring.
    1364        *  @param i1  Iterator referencing start of range to replace.
    1365        *  @param i2  Iterator referencing end of range to replace.
    1366        *  @param s  C string value to insert.
    1367        *  @param n  Number of characters from s to insert.
    1368        *  @return  Reference to this string.
    1369        *  @throw  std::length_error  If new length exceeds @c max_size().
    1370        *
    1371        *  Removes the characters in the range [i1,i2).  In place, the first @a
    1372        *  n characters of @a s are inserted.  If the length of result exceeds
    1373        *  max_size(), length_error is thrown.  The value of the string doesn't
    1374        *  change if an error is thrown.
    1375       */
    1376       basic_string&
    1377       replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
    1378       {
    1379     _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
    1380                  && __i2 <= _M_iend());
    1381     return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
    1382       }
    1383 
    1384       /**
    1385        *  @brief  Replace range of characters with C string.
    1386        *  @param i1  Iterator referencing start of range to replace.
    1387        *  @param i2  Iterator referencing end of range to replace.
    1388        *  @param s  C string value to insert.
    1389        *  @return  Reference to this string.
    1390        *  @throw  std::length_error  If new length exceeds @c max_size().
    1391        *
    1392        *  Removes the characters in the range [i1,i2).  In place, the
    1393        *  characters of @a s are inserted.  If the length of result exceeds
    1394        *  max_size(), length_error is thrown.  The value of the string doesn't
    1395        *  change if an error is thrown.
    1396       */
    1397       basic_string&
    1398       replace(iterator __i1, iterator __i2, const _CharT* __s)
    1399       {
    1400     __glibcxx_requires_string(__s);
    1401     return this->replace(__i1, __i2, __s, traits_type::length(__s));
    1402       }
    1403 
    1404       /**
    1405        *  @brief  Replace range of characters with multiple characters
    1406        *  @param i1  Iterator referencing start of range to replace.
    1407        *  @param i2  Iterator referencing end of range to replace.
    1408        *  @param n  Number of characters to insert.
    1409        *  @param c  Character to insert.
    1410        *  @return  Reference to this string.
    1411        *  @throw  std::length_error  If new length exceeds @c max_size().
    1412        *
    1413        *  Removes the characters in the range [i1,i2).  In place, @a n copies
    1414        *  of @a c are inserted.  If the length of result exceeds max_size(),
    1415        *  length_error is thrown.  The value of the string doesn't change if
    1416        *  an error is thrown.
    1417       */
    1418       basic_string&
    1419       replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
    1420       {
    1421     _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
    1422                  && __i2 <= _M_iend());
    1423     return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
    1424       }
    1425 
    1426       /**
    1427        *  @brief  Replace range of characters with range.
    1428        *  @param i1  Iterator referencing start of range to replace.
    1429        *  @param i2  Iterator referencing end of range to replace.
    1430        *  @param k1  Iterator referencing start of range to insert.
    1431        *  @param k2  Iterator referencing end of range to insert.
    1432        *  @return  Reference to this string.
    1433        *  @throw  std::length_error  If new length exceeds @c max_size().
    1434        *
    1435        *  Removes the characters in the range [i1,i2).  In place, characters
    1436        *  in the range [k1,k2) are inserted.  If the length of result exceeds
    1437        *  max_size(), length_error is thrown.  The value of the string doesn't
    1438        *  change if an error is thrown.
    1439       */
    1440       template<class _InputIterator>
    1441         basic_string&
    1442         replace(iterator __i1, iterator __i2,
    1443         _InputIterator __k1, _InputIterator __k2)
    1444         {
    1445       _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
    1446                    && __i2 <= _M_iend());
    1447       __glibcxx_requires_valid_range(__k1, __k2);
    1448       typedef typename std::__is_integer<_InputIterator>::__type _Integral;
    1449       return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
    1450     }
    1451 
    1452       // Specializations for the common case of pointer and iterator:
    1453       // useful to avoid the overhead of temporary buffering in _M_replace.
    1454       basic_string&
    1455       replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
    1456       {
    1457     _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
    1458                  && __i2 <= _M_iend());
    1459     __glibcxx_requires_valid_range(__k1, __k2);
    1460     return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
    1461                  __k1, __k2 - __k1);
    1462       }
    1463 
    1464       basic_string&
    1465       replace(iterator __i1, iterator __i2,
    1466           const _CharT* __k1, const _CharT* __k2)
    1467       {
    1468     _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
    1469                  && __i2 <= _M_iend());
    1470     __glibcxx_requires_valid_range(__k1, __k2);
    1471     return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
    1472                  __k1, __k2 - __k1);
    1473       }
    1474 
    1475       basic_string&
    1476       replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
    1477       {
    1478     _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
    1479                  && __i2 <= _M_iend());
    1480     __glibcxx_requires_valid_range(__k1, __k2);
    1481     return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
    1482                  __k1.base(), __k2 - __k1);
    1483       }
    1484 
    1485       basic_string&
    1486       replace(iterator __i1, iterator __i2,
    1487           const_iterator __k1, const_iterator __k2)
    1488       {
    1489     _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
    1490                  && __i2 <= _M_iend());
    1491     __glibcxx_requires_valid_range(__k1, __k2);
    1492     return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
    1493                  __k1.base(), __k2 - __k1);
    1494       }
    1495       
    1496 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    1497       /**
    1498        *  @brief  Replace range of characters with initializer_list.
    1499        *  @param i1  Iterator referencing start of range to replace.
    1500        *  @param i2  Iterator referencing end of range to replace.
    1501        *  @param l  The initializer_list of characters to insert.
    1502        *  @return  Reference to this string.
    1503        *  @throw  std::length_error  If new length exceeds @c max_size().
    1504        *
    1505        *  Removes the characters in the range [i1,i2).  In place, characters
    1506        *  in the range [k1,k2) are inserted.  If the length of result exceeds
    1507        *  max_size(), length_error is thrown.  The value of the string doesn't
    1508        *  change if an error is thrown.
    1509       */
    1510       basic_string& replace(iterator __i1, iterator __i2,
    1511                 initializer_list<_CharT> __l)
    1512       { return this->replace(__i1, __i2, __l.begin(), __l.end()); }
    1513 #endif // __GXX_EXPERIMENTAL_CXX0X__
    1514 
    1515     private:
    1516       template<class _Integer>
    1517     basic_string&
    1518     _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
    1519                 _Integer __val, __true_type)
    1520         { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
    1521 
    1522       template<class _InputIterator>
    1523     basic_string&
    1524     _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
    1525                 _InputIterator __k2, __false_type);
    1526 
    1527       basic_string&
    1528       _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
    1529              _CharT __c);
    1530 
    1531       basic_string&
    1532       _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
    1533               size_type __n2);
    1534 
    1535       // _S_construct_aux is used to implement the 21.3.1 para 15 which
    1536       // requires special behaviour if _InIter is an integral type
    1537       template<class _InIterator>
    1538         static _CharT*
    1539         _S_construct_aux(_InIterator __beg, _InIterator __end,
    1540              const _Alloc& __a, __false_type)
    1541     {
    1542           typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
    1543           return _S_construct(__beg, __end, __a, _Tag());
    1544     }
    1545 
    1546       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1547       // 438. Ambiguity in the "do the right thing" clause
    1548       template<class _Integer>
    1549         static _CharT*
    1550         _S_construct_aux(_Integer __beg, _Integer __end,
    1551              const _Alloc& __a, __true_type)
    1552         { return _S_construct(static_cast<size_type>(__beg), __end, __a); }
    1553 
    1554       template<class _InIterator>
    1555         static _CharT*
    1556         _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
    1557     {
    1558       typedef typename std::__is_integer<_InIterator>::__type _Integral;
    1559       return _S_construct_aux(__beg, __end, __a, _Integral());
    1560         }
    1561 
    1562       // For Input Iterators, used in istreambuf_iterators, etc.
    1563       template<class _InIterator>
    1564         static _CharT*
    1565          _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
    1566               input_iterator_tag);
    1567 
    1568       // For forward_iterators up to random_access_iterators, used for
    1569       // string::iterator, _CharT*, etc.
    1570       template<class _FwdIterator>
    1571         static _CharT*
    1572         _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
    1573              forward_iterator_tag);
    1574 
    1575       static _CharT*
    1576       _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
    1577 
    1578     public:
    1579 
    1580       /**
    1581        *  @brief  Copy substring into C string.
    1582        *  @param s  C string to copy value into.
    1583        *  @param n  Number of characters to copy.
    1584        *  @param pos  Index of first character to copy.
    1585        *  @return  Number of characters actually copied
    1586        *  @throw  std::out_of_range  If pos > size().
    1587        *
    1588        *  Copies up to @a n characters starting at @a pos into the C string @a
    1589        *  s.  If @a pos is greater than size(), out_of_range is thrown.
    1590       */
    1591       size_type
    1592       copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
    1593 
    1594       /**
    1595        *  @brief  Swap contents with another string.
    1596        *  @param s  String to swap with.
    1597        *
    1598        *  Exchanges the contents of this string with that of @a s in constant
    1599        *  time.
    1600       */
    1601       void
    1602       swap(basic_string& __s);
    1603 
    1604       // String operations:
    1605       /**
    1606        *  @brief  Return const pointer to null-terminated contents.
    1607        *
    1608        *  This is a handle to internal data.  Do not modify or dire things may
    1609        *  happen.
    1610       */
    1611       const _CharT*
    1612       c_str() const
    1613       { return _M_data(); }
    1614 
    1615       /**
    1616        *  @brief  Return const pointer to contents.
    1617        *
    1618        *  This is a handle to internal data.  Do not modify or dire things may
    1619        *  happen.
    1620       */
    1621       const _CharT*
    1622       data() const
    1623       { return _M_data(); }
    1624 
    1625       /**
    1626        *  @brief  Return copy of allocator used to construct this string.
    1627       */
    1628       allocator_type
    1629       get_allocator() const
    1630       { return _M_dataplus; }
    1631 
    1632       /**
    1633        *  @brief  Find position of a C substring.
    1634        *  @param s  C string to locate.
    1635        *  @param pos  Index of character to search from.
    1636        *  @param n  Number of characters from @a s to search for.
    1637        *  @return  Index of start of first occurrence.
    1638        *
    1639        *  Starting from @a pos, searches forward for the first @a n characters
    1640        *  in @a s within this string.  If found, returns the index where it
    1641        *  begins.  If not found, returns npos.
    1642       */
    1643       size_type
    1644       find(const _CharT* __s, size_type __pos, size_type __n) const;
    1645 
    1646       /**
    1647        *  @brief  Find position of a string.
    1648        *  @param str  String to locate.
    1649        *  @param pos  Index of character to search from (default 0).
    1650        *  @return  Index of start of first occurrence.
    1651        *
    1652        *  Starting from @a pos, searches forward for value of @a str within
    1653        *  this string.  If found, returns the index where it begins.  If not
    1654        *  found, returns npos.
    1655       */
    1656       size_type
    1657       find(const basic_string& __str, size_type __pos = 0) const
    1658       { return this->find(__str.data(), __pos, __str.size()); }
    1659 
    1660       /**
    1661        *  @brief  Find position of a C string.
    1662        *  @param s  C string to locate.
    1663        *  @param pos  Index of character to search from (default 0).
    1664        *  @return  Index of start of first occurrence.
    1665        *
    1666        *  Starting from @a pos, searches forward for the value of @a s within
    1667        *  this string.  If found, returns the index where it begins.  If not
    1668        *  found, returns npos.
    1669       */
    1670       size_type
    1671       find(const _CharT* __s, size_type __pos = 0) const
    1672       {
    1673     __glibcxx_requires_string(__s);
    1674     return this->find(__s, __pos, traits_type::length(__s));
    1675       }
    1676 
    1677       /**
    1678        *  @brief  Find position of a character.
    1679        *  @param c  Character to locate.
    1680        *  @param pos  Index of character to search from (default 0).
    1681        *  @return  Index of first occurrence.
    1682        *
    1683        *  Starting from @a pos, searches forward for @a c within this string.
    1684        *  If found, returns the index where it was found.  If not found,
    1685        *  returns npos.
    1686       */
    1687       size_type
    1688       find(_CharT __c, size_type __pos = 0) const;
    1689 
    1690       /**
    1691        *  @brief  Find last position of a string.
    1692        *  @param str  String to locate.
    1693        *  @param pos  Index of character to search back from (default end).
    1694        *  @return  Index of start of last occurrence.
    1695        *
    1696        *  Starting from @a pos, searches backward for value of @a str within
    1697        *  this string.  If found, returns the index where it begins.  If not
    1698        *  found, returns npos.
    1699       */
    1700       size_type
    1701       rfind(const basic_string& __str, size_type __pos = npos) const
    1702       { return this->rfind(__str.data(), __pos, __str.size()); }
    1703 
    1704       /**
    1705        *  @brief  Find last position of a C substring.
    1706        *  @param s  C string to locate.
    1707        *  @param pos  Index of character to search back from.
    1708        *  @param n  Number of characters from s to search for.
    1709        *  @return  Index of start of last occurrence.
    1710        *
    1711        *  Starting from @a pos, searches backward for the first @a n
    1712        *  characters in @a s within this string.  If found, returns the index
    1713        *  where it begins.  If not found, returns npos.
    1714       */
    1715       size_type
    1716       rfind(const _CharT* __s, size_type __pos, size_type __n) const;
    1717 
    1718       /**
    1719        *  @brief  Find last position of a C string.
    1720        *  @param s  C string to locate.
    1721        *  @param pos  Index of character to start search at (default end).
    1722        *  @return  Index of start of  last occurrence.
    1723        *
    1724        *  Starting from @a pos, searches backward for the value of @a s within
    1725        *  this string.  If found, returns the index where it begins.  If not
    1726        *  found, returns npos.
    1727       */
    1728       size_type
    1729       rfind(const _CharT* __s, size_type __pos = npos) const
    1730       {
    1731     __glibcxx_requires_string(__s);
    1732     return this->rfind(__s, __pos, traits_type::length(__s));
    1733       }
    1734 
    1735       /**
    1736        *  @brief  Find last position of a character.
    1737        *  @param c  Character to locate.
    1738        *  @param pos  Index of character to search back from (default end).
    1739        *  @return  Index of last occurrence.
    1740        *
    1741        *  Starting from @a pos, searches backward for @a c within this string.
    1742        *  If found, returns the index where it was found.  If not found,
    1743        *  returns npos.
    1744       */
    1745       size_type
    1746       rfind(_CharT __c, size_type __pos = npos) const;
    1747 
    1748       /**
    1749        *  @brief  Find position of a character of string.
    1750        *  @param str  String containing characters to locate.
    1751        *  @param pos  Index of character to search from (default 0).
    1752        *  @return  Index of first occurrence.
    1753        *
    1754        *  Starting from @a pos, searches forward for one of the characters of
    1755        *  @a str within this string.  If found, returns the index where it was
    1756        *  found.  If not found, returns npos.
    1757       */
    1758       size_type
    1759       find_first_of(const basic_string& __str, size_type __pos = 0) const
    1760       { return this->find_first_of(__str.data(), __pos, __str.size()); }
    1761 
    1762       /**
    1763        *  @brief  Find position of a character of C substring.
    1764        *  @param s  String containing characters to locate.
    1765        *  @param pos  Index of character to search from.
    1766        *  @param n  Number of characters from s to search for.
    1767        *  @return  Index of first occurrence.
    1768        *
    1769        *  Starting from @a pos, searches forward for one of the first @a n
    1770        *  characters of @a s within this string.  If found, returns the index
    1771        *  where it was found.  If not found, returns npos.
    1772       */
    1773       size_type
    1774       find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
    1775 
    1776       /**
    1777        *  @brief  Find position of a character of C string.
    1778        *  @param s  String containing characters to locate.
    1779        *  @param pos  Index of character to search from (default 0).
    1780        *  @return  Index of first occurrence.
    1781        *
    1782        *  Starting from @a pos, searches forward for one of the characters of
    1783        *  @a s within this string.  If found, returns the index where it was
    1784        *  found.  If not found, returns npos.
    1785       */
    1786       size_type
    1787       find_first_of(const _CharT* __s, size_type __pos = 0) const
    1788       {
    1789     __glibcxx_requires_string(__s);
    1790     return this->find_first_of(__s, __pos, traits_type::length(__s));
    1791       }
    1792 
    1793       /**
    1794        *  @brief  Find position of a character.
    1795        *  @param c  Character to locate.
    1796        *  @param pos  Index of character to search from (default 0).
    1797        *  @return  Index of first occurrence.
    1798        *
    1799        *  Starting from @a pos, searches forward for the character @a c within
    1800        *  this string.  If found, returns the index where it was found.  If
    1801        *  not found, returns npos.
    1802        *
    1803        *  Note: equivalent to find(c, pos).
    1804       */
    1805       size_type
    1806       find_first_of(_CharT __c, size_type __pos = 0) const
    1807       { return this->find(__c, __pos); }
    1808 
    1809       /**
    1810        *  @brief  Find last position of a character of string.
    1811        *  @param str  String containing characters to locate.
    1812        *  @param pos  Index of character to search back from (default end).
    1813        *  @return  Index of last occurrence.
    1814        *
    1815        *  Starting from @a pos, searches backward for one of the characters of
    1816        *  @a str within this string.  If found, returns the index where it was
    1817        *  found.  If not found, returns npos.
    1818       */
    1819       size_type
    1820       find_last_of(const basic_string& __str, size_type __pos = npos) const
    1821       { return this->find_last_of(__str.data(), __pos, __str.size()); }
    1822 
    1823       /**
    1824        *  @brief  Find last position of a character of C substring.
    1825        *  @param s  C string containing characters to locate.
    1826        *  @param pos  Index of character to search back from.
    1827        *  @param n  Number of characters from s to search for.
    1828        *  @return  Index of last occurrence.
    1829        *
    1830        *  Starting from @a pos, searches backward for one of the first @a n
    1831        *  characters of @a s within this string.  If found, returns the index
    1832        *  where it was found.  If not found, returns npos.
    1833       */
    1834       size_type
    1835       find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
    1836 
    1837       /**
    1838        *  @brief  Find last position of a character of C string.
    1839        *  @param s  C string containing characters to locate.
    1840        *  @param pos  Index of character to search back from (default end).
    1841        *  @return  Index of last occurrence.
    1842        *
    1843        *  Starting from @a pos, searches backward for one of the characters of
    1844        *  @a s within this string.  If found, returns the index where it was
    1845        *  found.  If not found, returns npos.
    1846       */
    1847       size_type
    1848       find_last_of(const _CharT* __s, size_type __pos = npos) const
    1849       {
    1850     __glibcxx_requires_string(__s);
    1851     return this->find_last_of(__s, __pos, traits_type::length(__s));
    1852       }
    1853 
    1854       /**
    1855        *  @brief  Find last position of a character.
    1856        *  @param c  Character to locate.
    1857        *  @param pos  Index of character to search back from (default end).
    1858        *  @return  Index of last occurrence.
    1859        *
    1860        *  Starting from @a pos, searches backward for @a c within this string.
    1861        *  If found, returns the index where it was found.  If not found,
    1862        *  returns npos.
    1863        *
    1864        *  Note: equivalent to rfind(c, pos).
    1865       */
    1866       size_type
    1867       find_last_of(_CharT __c, size_type __pos = npos) const
    1868       { return this->rfind(__c, __pos); }
    1869 
    1870       /**
    1871        *  @brief  Find position of a character not in string.
    1872        *  @param str  String containing characters to avoid.
    1873        *  @param pos  Index of character to search from (default 0).
    1874        *  @return  Index of first occurrence.
    1875        *
    1876        *  Starting from @a pos, searches forward for a character not contained
    1877        *  in @a str within this string.  If found, returns the index where it
    1878        *  was found.  If not found, returns npos.
    1879       */
    1880       size_type
    1881       find_first_not_of(const basic_string& __str, size_type __pos = 0) const
    1882       { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
    1883 
    1884       /**
    1885        *  @brief  Find position of a character not in C substring.
    1886        *  @param s  C string containing characters to avoid.
    1887        *  @param pos  Index of character to search from.
    1888        *  @param n  Number of characters from s to consider.
    1889        *  @return  Index of first occurrence.
    1890        *
    1891        *  Starting from @a pos, searches forward for a character not contained
    1892        *  in the first @a n characters of @a s within this string.  If found,
    1893        *  returns the index where it was found.  If not found, returns npos.
    1894       */
    1895       size_type
    1896       find_first_not_of(const _CharT* __s, size_type __pos,
    1897             size_type __n) const;
    1898 
    1899       /**
    1900        *  @brief  Find position of a character not in C string.
    1901        *  @param s  C string containing characters to avoid.
    1902        *  @param pos  Index of character to search from (default 0).
    1903        *  @return  Index of first occurrence.
    1904        *
    1905        *  Starting from @a pos, searches forward for a character not contained
    1906        *  in @a s within this string.  If found, returns the index where it
    1907        *  was found.  If not found, returns npos.
    1908       */
    1909       size_type
    1910       find_first_not_of(const _CharT* __s, size_type __pos = 0) const
    1911       {
    1912     __glibcxx_requires_string(__s);
    1913     return this->find_first_not_of(__s, __pos, traits_type::length(__s));
    1914       }
    1915 
    1916       /**
    1917        *  @brief  Find position of a different character.
    1918        *  @param c  Character to avoid.
    1919        *  @param pos  Index of character to search from (default 0).
    1920        *  @return  Index of first occurrence.
    1921        *
    1922        *  Starting from @a pos, searches forward for a character other than @a c
    1923        *  within this string.  If found, returns the index where it was found.
    1924        *  If not found, returns npos.
    1925       */
    1926       size_type
    1927       find_first_not_of(_CharT __c, size_type __pos = 0) const;
    1928 
    1929       /**
    1930        *  @brief  Find last position of a character not in string.
    1931        *  @param str  String containing characters to avoid.
    1932        *  @param pos  Index of character to search back from (default end).
    1933        *  @return  Index of last occurrence.
    1934        *
    1935        *  Starting from @a pos, searches backward for a character not
    1936        *  contained in @a str within this string.  If found, returns the index
    1937        *  where it was found.  If not found, returns npos.
    1938       */
    1939       size_type
    1940       find_last_not_of(const basic_string& __str, size_type __pos = npos) const
    1941       { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
    1942 
    1943       /**
    1944        *  @brief  Find last position of a character not in C substring.
    1945        *  @param s  C string containing characters to avoid.
    1946        *  @param pos  Index of character to search back from.
    1947        *  @param n  Number of characters from s to consider.
    1948        *  @return  Index of last occurrence.
    1949        *
    1950        *  Starting from @a pos, searches backward for a character not
    1951        *  contained in the first @a n characters of @a s within this string.
    1952        *  If found, returns the index where it was found.  If not found,
    1953        *  returns npos.
    1954       */
    1955       size_type
    1956       find_last_not_of(const _CharT* __s, size_type __pos,
    1957                size_type __n) const;
    1958       /**
    1959        *  @brief  Find last position of a character not in C string.
    1960        *  @param s  C string containing characters to avoid.
    1961        *  @param pos  Index of character to search back from (default end).
    1962        *  @return  Index of last occurrence.
    1963        *
    1964        *  Starting from @a pos, searches backward for a character not
    1965        *  contained in @a s within this string.  If found, returns the index
    1966        *  where it was found.  If not found, returns npos.
    1967       */
    1968       size_type
    1969       find_last_not_of(const _CharT* __s, size_type __pos = npos) const
    1970       {
    1971     __glibcxx_requires_string(__s);
    1972     return this->find_last_not_of(__s, __pos, traits_type::length(__s));
    1973       }
    1974 
    1975       /**
    1976        *  @brief  Find last position of a different character.
    1977        *  @param c  Character to avoid.
    1978        *  @param pos  Index of character to search back from (default end).
    1979        *  @return  Index of last occurrence.
    1980        *
    1981        *  Starting from @a pos, searches backward for a character other than
    1982        *  @a c within this string.  If found, returns the index where it was
    1983        *  found.  If not found, returns npos.
    1984       */
    1985       size_type
    1986       find_last_not_of(_CharT __c, size_type __pos = npos) const;
    1987 
    1988       /**
    1989        *  @brief  Get a substring.
    1990        *  @param pos  Index of first character (default 0).
    1991        *  @param n  Number of characters in substring (default remainder).
    1992        *  @return  The new string.
    1993        *  @throw  std::out_of_range  If pos > size().
    1994        *
    1995        *  Construct and return a new string using the @a n characters starting
    1996        *  at @a pos.  If the string is too short, use the remainder of the
    1997        *  characters.  If @a pos is beyond the end of the string, out_of_range
    1998        *  is thrown.
    1999       */
    2000       basic_string
    2001       substr(size_type __pos = 0, size_type __n = npos) const
    2002       { return basic_string(*this,
    2003                 _M_check(__pos, "basic_string::substr"), __n); }
    2004 
    2005       /**
    2006        *  @brief  Compare to a string.
    2007        *  @param str  String to compare against.
    2008        *  @return  Integer < 0, 0, or > 0.
    2009        *
    2010        *  Returns an integer < 0 if this string is ordered before @a str, 0 if
    2011        *  their values are equivalent, or > 0 if this string is ordered after
    2012        *  @a str.  Determines the effective length rlen of the strings to
    2013        *  compare as the smallest of size() and str.size().  The function
    2014        *  then compares the two strings by calling traits::compare(data(),
    2015        *  str.data(),rlen).  If the result of the comparison is nonzero returns
    2016        *  it, otherwise the shorter one is ordered first.
    2017       */
    2018       int
    2019       compare(const basic_string& __str) const
    2020       {
    2021     const size_type __size = this->size();
    2022     const size_type __osize = __str.size();
    2023     const size_type __len = std::min(__size, __osize);
    2024 
    2025     int __r = traits_type::compare(_M_data(), __str.data(), __len);
    2026     if (!__r)
    2027       __r = _S_compare(__size, __osize);
    2028     return __r;
    2029       }
    2030 
    2031       /**
    2032        *  @brief  Compare substring to a string.
    2033        *  @param pos  Index of first character of substring.
    2034        *  @param n  Number of characters in substring.
    2035        *  @param str  String to compare against.
    2036        *  @return  Integer < 0, 0, or > 0.
    2037        *
    2038        *  Form the substring of this string from the @a n characters starting
    2039        *  at @a pos.  Returns an integer < 0 if the substring is ordered
    2040        *  before @a str, 0 if their values are equivalent, or > 0 if the
    2041        *  substring is ordered after @a str.  Determines the effective length
    2042        *  rlen of the strings to compare as the smallest of the length of the
    2043        *  substring and @a str.size().  The function then compares the two
    2044        *  strings by calling traits::compare(substring.data(),str.data(),rlen).
    2045        *  If the result of the comparison is nonzero returns it, otherwise the
    2046        *  shorter one is ordered first.
    2047       */
    2048       int
    2049       compare(size_type __pos, size_type __n, const basic_string& __str) const;
    2050 
    2051       /**
    2052        *  @brief  Compare substring to a substring.
    2053        *  @param pos1  Index of first character of substring.
    2054        *  @param n1  Number of characters in substring.
    2055        *  @param str  String to compare against.
    2056        *  @param pos2  Index of first character of substring of str.
    2057        *  @param n2  Number of characters in substring of str.
    2058        *  @return  Integer < 0, 0, or > 0.
    2059        *
    2060        *  Form the substring of this string from the @a n1 characters starting
    2061        *  at @a pos1.  Form the substring of @a str from the @a n2 characters
    2062        *  starting at @a pos2.  Returns an integer < 0 if this substring is
    2063        *  ordered before the substring of @a str, 0 if their values are
    2064        *  equivalent, or > 0 if this substring is ordered after the substring
    2065        *  of @a str.  Determines the effective length rlen of the strings
    2066        *  to compare as the smallest of the lengths of the substrings.  The
    2067        *  function then compares the two strings by calling
    2068        *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
    2069        *  If the result of the comparison is nonzero returns it, otherwise the
    2070        *  shorter one is ordered first.
    2071       */
    2072       int
    2073       compare(size_type __pos1, size_type __n1, const basic_string& __str,
    2074           size_type __pos2, size_type __n2) const;
    2075 
    2076       /**
    2077        *  @brief  Compare to a C string.
    2078        *  @param s  C string to compare against.
    2079        *  @return  Integer < 0, 0, or > 0.
    2080        *
    2081        *  Returns an integer < 0 if this string is ordered before @a s, 0 if
    2082        *  their values are equivalent, or > 0 if this string is ordered after
    2083        *  @a s.  Determines the effective length rlen of the strings to
    2084        *  compare as the smallest of size() and the length of a string
    2085        *  constructed from @a s.  The function then compares the two strings
    2086        *  by calling traits::compare(data(),s,rlen).  If the result of the
    2087        *  comparison is nonzero returns it, otherwise the shorter one is
    2088        *  ordered first.
    2089       */
    2090       int
    2091       compare(const _CharT* __s) const;
    2092 
    2093       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    2094       // 5 String::compare specification questionable
    2095       /**
    2096        *  @brief  Compare substring to a C string.
    2097        *  @param pos  Index of first character of substring.
    2098        *  @param n1  Number of characters in substring.
    2099        *  @param s  C string to compare against.
    2100        *  @return  Integer < 0, 0, or > 0.
    2101        *
    2102        *  Form the substring of this string from the @a n1 characters starting
    2103        *  at @a pos.  Returns an integer < 0 if the substring is ordered
    2104        *  before @a s, 0 if their values are equivalent, or > 0 if the
    2105        *  substring is ordered after @a s.  Determines the effective length
    2106        *  rlen of the strings to compare as the smallest of the length of the 
    2107        *  substring and the length of a string constructed from @a s.  The
    2108        *  function then compares the two string by calling
    2109        *  traits::compare(substring.data(),s,rlen).  If the result of the
    2110        *  comparison is nonzero returns it, otherwise the shorter one is
    2111        *  ordered first.
    2112       */
    2113       int
    2114       compare(size_type __pos, size_type __n1, const _CharT* __s) const;
    2115 
    2116       /**
    2117        *  @brief  Compare substring against a character array.
    2118        *  @param pos1  Index of first character of substring.
    2119        *  @param n1  Number of characters in substring.
    2120        *  @param s  character array to compare against.
    2121        *  @param n2  Number of characters of s.
    2122        *  @return  Integer < 0, 0, or > 0.
    2123        *
    2124        *  Form the substring of this string from the @a n1 characters starting
    2125        *  at @a pos1.  Form a string from the first @a n2 characters of @a s.
    2126        *  Returns an integer < 0 if this substring is ordered before the string
    2127        *  from @a s, 0 if their values are equivalent, or > 0 if this substring
    2128        *  is ordered after the string from @a s.   Determines the effective
    2129        *  length rlen of the strings to compare as the smallest of the length
    2130        *  of the substring and @a n2.  The function then compares the two
    2131        *  strings by calling traits::compare(substring.data(),s,rlen).  If the
    2132        *  result of the comparison is nonzero returns it, otherwise the shorter
    2133        *  one is ordered first.
    2134        *
    2135        *  NB: s must have at least n2 characters, '\0' has no special
    2136        *  meaning.
    2137       */
    2138       int
    2139       compare(size_type __pos, size_type __n1, const _CharT* __s,
    2140           size_type __n2) const;
    2141   };
    2142 
    2143   template<typename _CharT, typename _Traits, typename _Alloc>
    2144     inline basic_string<_CharT, _Traits, _Alloc>::
    2145     basic_string()
    2146 #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
    2147     : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
    2148 #else
    2149     : _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc()) { }
    2150 #endif
    2151 
    2152   // operator+
    2153   /**
    2154    *  @brief  Concatenate two strings.
    2155    *  @param lhs  First string.
    2156    *  @param rhs  Last string.
    2157    *  @return  New string with value of @a lhs followed by @a rhs.
    2158    */
    2159   template<typename _CharT, typename _Traits, typename _Alloc>
    2160     basic_string<_CharT, _Traits, _Alloc>
    2161     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2162           const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2163     {
    2164       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
    2165       __str.append(__rhs);
    2166       return __str;
    2167     }
    2168 
    2169   /**
    2170    *  @brief  Concatenate C string and string.
    2171    *  @param lhs  First string.
    2172    *  @param rhs  Last string.
    2173    *  @return  New string with value of @a lhs followed by @a rhs.
    2174    */
    2175   template<typename _CharT, typename _Traits, typename _Alloc>
    2176     basic_string<_CharT,_Traits,_Alloc>
    2177     operator+(const _CharT* __lhs,
    2178           const basic_string<_CharT,_Traits,_Alloc>& __rhs);
    2179 
    2180   /**
    2181    *  @brief  Concatenate character and string.
    2182    *  @param lhs  First string.
    2183    *  @param rhs  Last string.
    2184    *  @return  New string with @a lhs followed by @a rhs.
    2185    */
    2186   template<typename _CharT, typename _Traits, typename _Alloc>
    2187     basic_string<_CharT,_Traits,_Alloc>
    2188     operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
    2189 
    2190   /**
    2191    *  @brief  Concatenate string and C string.
    2192    *  @param lhs  First string.
    2193    *  @param rhs  Last string.
    2194    *  @return  New string with @a lhs followed by @a rhs.
    2195    */
    2196   template<typename _CharT, typename _Traits, typename _Alloc>
    2197     inline basic_string<_CharT, _Traits, _Alloc>
    2198     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2199          const _CharT* __rhs)
    2200     {
    2201       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
    2202       __str.append(__rhs);
    2203       return __str;
    2204     }
    2205 
    2206   /**
    2207    *  @brief  Concatenate string and character.
    2208    *  @param lhs  First string.
    2209    *  @param rhs  Last string.
    2210    *  @return  New string with @a lhs followed by @a rhs.
    2211    */
    2212   template<typename _CharT, typename _Traits, typename _Alloc>
    2213     inline basic_string<_CharT, _Traits, _Alloc>
    2214     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
    2215     {
    2216       typedef basic_string<_CharT, _Traits, _Alloc>    __string_type;
    2217       typedef typename __string_type::size_type        __size_type;
    2218       __string_type __str(__lhs);
    2219       __str.append(__size_type(1), __rhs);
    2220       return __str;
    2221     }
    2222 
    2223   // operator ==
    2224   /**
    2225    *  @brief  Test equivalence of two strings.
    2226    *  @param lhs  First string.
    2227    *  @param rhs  Second string.
    2228    *  @return  True if @a lhs.compare(@a rhs) == 0.  False otherwise.
    2229    */
    2230   template<typename _CharT, typename _Traits, typename _Alloc>
    2231     inline bool
    2232     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2233            const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2234     { return __lhs.compare(__rhs) == 0; }
    2235 
    2236   template<typename _CharT>
    2237     inline
    2238     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
    2239     operator==(const basic_string<_CharT>& __lhs,
    2240            const basic_string<_CharT>& __rhs)
    2241     { return (__lhs.size() == __rhs.size()
    2242           && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
    2243                             __lhs.size())); }
    2244 
    2245   /**
    2246    *  @brief  Test equivalence of C string and string.
    2247    *  @param lhs  C string.
    2248    *  @param rhs  String.
    2249    *  @return  True if @a rhs.compare(@a lhs) == 0.  False otherwise.
    2250    */
    2251   template<typename _CharT, typename _Traits, typename _Alloc>
    2252     inline bool
    2253     operator==(const _CharT* __lhs,
    2254            const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2255     { return __rhs.compare(__lhs) == 0; }
    2256 
    2257   /**
    2258    *  @brief  Test equivalence of string and C string.
    2259    *  @param lhs  String.
    2260    *  @param rhs  C string.
    2261    *  @return  True if @a lhs.compare(@a rhs) == 0.  False otherwise.
    2262    */
    2263   template<typename _CharT, typename _Traits, typename _Alloc>
    2264     inline bool
    2265     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2266            const _CharT* __rhs)
    2267     { return __lhs.compare(__rhs) == 0; }
    2268 
    2269   // operator !=
    2270   /**
    2271    *  @brief  Test difference of two strings.
    2272    *  @param lhs  First string.
    2273    *  @param rhs  Second string.
    2274    *  @return  True if @a lhs.compare(@a rhs) != 0.  False otherwise.
    2275    */
    2276   template<typename _CharT, typename _Traits, typename _Alloc>
    2277     inline bool
    2278     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2279            const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2280     { return !(__lhs == __rhs); }
    2281 
    2282   /**
    2283    *  @brief  Test difference of C string and string.
    2284    *  @param lhs  C string.
    2285    *  @param rhs  String.
    2286    *  @return  True if @a rhs.compare(@a lhs) != 0.  False otherwise.
    2287    */
    2288   template<typename _CharT, typename _Traits, typename _Alloc>
    2289     inline bool
    2290     operator!=(const _CharT* __lhs,
    2291            const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2292     { return !(__lhs == __rhs); }
    2293 
    2294   /**
    2295    *  @brief  Test difference of string and C string.
    2296    *  @param lhs  String.
    2297    *  @param rhs  C string.
    2298    *  @return  True if @a lhs.compare(@a rhs) != 0.  False otherwise.
    2299    */
    2300   template<typename _CharT, typename _Traits, typename _Alloc>
    2301     inline bool
    2302     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2303            const _CharT* __rhs)
    2304     { return !(__lhs == __rhs); }
    2305 
    2306   // operator <
    2307   /**
    2308    *  @brief  Test if string precedes string.
    2309    *  @param lhs  First string.
    2310    *  @param rhs  Second string.
    2311    *  @return  True if @a lhs precedes @a rhs.  False otherwise.
    2312    */
    2313   template<typename _CharT, typename _Traits, typename _Alloc>
    2314     inline bool
    2315     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2316           const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2317     { return __lhs.compare(__rhs) < 0; }
    2318 
    2319   /**
    2320    *  @brief  Test if string precedes C string.
    2321    *  @param lhs  String.
    2322    *  @param rhs  C string.
    2323    *  @return  True if @a lhs precedes @a rhs.  False otherwise.
    2324    */
    2325   template<typename _CharT, typename _Traits, typename _Alloc>
    2326     inline bool
    2327     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2328           const _CharT* __rhs)
    2329     { return __lhs.compare(__rhs) < 0; }
    2330 
    2331   /**
    2332    *  @brief  Test if C string precedes string.
    2333    *  @param lhs  C string.
    2334    *  @param rhs  String.
    2335    *  @return  True if @a lhs precedes @a rhs.  False otherwise.
    2336    */
    2337   template<typename _CharT, typename _Traits, typename _Alloc>
    2338     inline bool
    2339     operator<(const _CharT* __lhs,
    2340           const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2341     { return __rhs.compare(__lhs) > 0; }
    2342 
    2343   // operator >
    2344   /**
    2345    *  @brief  Test if string follows string.
    2346    *  @param lhs  First string.
    2347    *  @param rhs  Second string.
    2348    *  @return  True if @a lhs follows @a rhs.  False otherwise.
    2349    */
    2350   template<typename _CharT, typename _Traits, typename _Alloc>
    2351     inline bool
    2352     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2353           const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2354     { return __lhs.compare(__rhs) > 0; }
    2355 
    2356   /**
    2357    *  @brief  Test if string follows C string.
    2358    *  @param lhs  String.
    2359    *  @param rhs  C string.
    2360    *  @return  True if @a lhs follows @a rhs.  False otherwise.
    2361    */
    2362   template<typename _CharT, typename _Traits, typename _Alloc>
    2363     inline bool
    2364     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2365           const _CharT* __rhs)
    2366     { return __lhs.compare(__rhs) > 0; }
    2367 
    2368   /**
    2369    *  @brief  Test if C string follows string.
    2370    *  @param lhs  C string.
    2371    *  @param rhs  String.
    2372    *  @return  True if @a lhs follows @a rhs.  False otherwise.
    2373    */
    2374   template<typename _CharT, typename _Traits, typename _Alloc>
    2375     inline bool
    2376     operator>(const _CharT* __lhs,
    2377           const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2378     { return __rhs.compare(__lhs) < 0; }
    2379 
    2380   // operator <=
    2381   /**
    2382    *  @brief  Test if string doesn't follow string.
    2383    *  @param lhs  First string.
    2384    *  @param rhs  Second string.
    2385    *  @return  True if @a lhs doesn't follow @a rhs.  False otherwise.
    2386    */
    2387   template<typename _CharT, typename _Traits, typename _Alloc>
    2388     inline bool
    2389     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2390            const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2391     { return __lhs.compare(__rhs) <= 0; }
    2392 
    2393   /**
    2394    *  @brief  Test if string doesn't follow C string.
    2395    *  @param lhs  String.
    2396    *  @param rhs  C string.
    2397    *  @return  True if @a lhs doesn't follow @a rhs.  False otherwise.
    2398    */
    2399   template<typename _CharT, typename _Traits, typename _Alloc>
    2400     inline bool
    2401     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2402            const _CharT* __rhs)
    2403     { return __lhs.compare(__rhs) <= 0; }
    2404 
    2405   /**
    2406    *  @brief  Test if C string doesn't follow string.
    2407    *  @param lhs  C string.
    2408    *  @param rhs  String.
    2409    *  @return  True if @a lhs doesn't follow @a rhs.  False otherwise.
    2410    */
    2411   template<typename _CharT, typename _Traits, typename _Alloc>
    2412     inline bool
    2413     operator<=(const _CharT* __lhs,
    2414            const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2415     { return __rhs.compare(__lhs) >= 0; }
    2416 
    2417   // operator >=
    2418   /**
    2419    *  @brief  Test if string doesn't precede string.
    2420    *  @param lhs  First string.
    2421    *  @param rhs  Second string.
    2422    *  @return  True if @a lhs doesn't precede @a rhs.  False otherwise.
    2423    */
    2424   template<typename _CharT, typename _Traits, typename _Alloc>
    2425     inline bool
    2426     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2427            const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2428     { return __lhs.compare(__rhs) >= 0; }
    2429 
    2430   /**
    2431    *  @brief  Test if string doesn't precede C string.
    2432    *  @param lhs  String.
    2433    *  @param rhs  C string.
    2434    *  @return  True if @a lhs doesn't precede @a rhs.  False otherwise.
    2435    */
    2436   template<typename _CharT, typename _Traits, typename _Alloc>
    2437     inline bool
    2438     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2439            const _CharT* __rhs)
    2440     { return __lhs.compare(__rhs) >= 0; }
    2441 
    2442   /**
    2443    *  @brief  Test if C string doesn't precede string.
    2444    *  @param lhs  C string.
    2445    *  @param rhs  String.
    2446    *  @return  True if @a lhs doesn't precede @a rhs.  False otherwise.
    2447    */
    2448   template<typename _CharT, typename _Traits, typename _Alloc>
    2449     inline bool
    2450     operator>=(const _CharT* __lhs,
    2451          const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2452     { return __rhs.compare(__lhs) <= 0; }
    2453 
    2454   /**
    2455    *  @brief  Swap contents of two strings.
    2456    *  @param lhs  First string.
    2457    *  @param rhs  Second string.
    2458    *
    2459    *  Exchanges the contents of @a lhs and @a rhs in constant time.
    2460    */
    2461   template<typename _CharT, typename _Traits, typename _Alloc>
    2462     inline void
    2463     swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
    2464      basic_string<_CharT, _Traits, _Alloc>& __rhs)
    2465     { __lhs.swap(__rhs); }
    2466 
    2467   /**
    2468    *  @brief  Read stream into a string.
    2469    *  @param is  Input stream.
    2470    *  @param str  Buffer to store into.
    2471    *  @return  Reference to the input stream.
    2472    *
    2473    *  Stores characters from @a is into @a str until whitespace is found, the
    2474    *  end of the stream is encountered, or str.max_size() is reached.  If
    2475    *  is.width() is non-zero, that is the limit on the number of characters
    2476    *  stored into @a str.  Any previous contents of @a str are erased.
    2477    */
    2478   template<typename _CharT, typename _Traits, typename _Alloc>
    2479     basic_istream<_CharT, _Traits>&
    2480     operator>>(basic_istream<_CharT, _Traits>& __is,
    2481            basic_string<_CharT, _Traits, _Alloc>& __str);
    2482 
    2483   template<>
    2484     basic_istream<char>&
    2485     operator>>(basic_istream<char>& __is, basic_string<char>& __str);
    2486 
    2487   /**
    2488    *  @brief  Write string to a stream.
    2489    *  @param os  Output stream.
    2490    *  @param str  String to write out.
    2491    *  @return  Reference to the output stream.
    2492    *
    2493    *  Output characters of @a str into os following the same rules as for
    2494    *  writing a C string.
    2495    */
    2496   template<typename _CharT, typename _Traits, typename _Alloc>
    2497     inline basic_ostream<_CharT, _Traits>&
    2498     operator<<(basic_ostream<_CharT, _Traits>& __os,
    2499            const basic_string<_CharT, _Traits, _Alloc>& __str)
    2500     {
    2501       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    2502       // 586. string inserter not a formatted function
    2503       return __ostream_insert(__os, __str.data(), __str.size());
    2504     }
    2505 
    2506   /**
    2507    *  @brief  Read a line from stream into a string.
    2508    *  @param is  Input stream.
    2509    *  @param str  Buffer to store into.
    2510    *  @param delim  Character marking end of line.
    2511    *  @return  Reference to the input stream.
    2512    *
    2513    *  Stores characters from @a is into @a str until @a delim is found, the
    2514    *  end of the stream is encountered, or str.max_size() is reached.  If
    2515    *  is.width() is non-zero, that is the limit on the number of characters
    2516    *  stored into @a str.  Any previous contents of @a str are erased.  If @a
    2517    *  delim was encountered, it is extracted but not stored into @a str.
    2518    */
    2519   template<typename _CharT, typename _Traits, typename _Alloc>
    2520     basic_istream<_CharT, _Traits>&
    2521     getline(basic_istream<_CharT, _Traits>& __is,
    2522         basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
    2523 
    2524   /**
    2525    *  @brief  Read a line from stream into a string.
    2526    *  @param is  Input stream.
    2527    *  @param str  Buffer to store into.
    2528    *  @return  Reference to the input stream.
    2529    *
    2530    *  Stores characters from is into @a str until '
    ' is found, the end of
    2531    *  the stream is encountered, or str.max_size() is reached.  If is.width()
    2532    *  is non-zero, that is the limit on the number of characters stored into
    2533    *  @a str.  Any previous contents of @a str are erased.  If end of line was
    2534    *  encountered, it is extracted but not stored into @a str.
    2535    */
    2536   template<typename _CharT, typename _Traits, typename _Alloc>
    2537     inline basic_istream<_CharT, _Traits>&
    2538     getline(basic_istream<_CharT, _Traits>& __is,
    2539         basic_string<_CharT, _Traits, _Alloc>& __str)
    2540     { return getline(__is, __str, __is.widen('
    ')); }
    2541 
    2542   template<>
    2543     basic_istream<char>&
    2544     getline(basic_istream<char>& __in, basic_string<char>& __str,
    2545         char __delim);
    2546 
    2547 #ifdef _GLIBCXX_USE_WCHAR_T
    2548   template<>
    2549     basic_istream<wchar_t>&
    2550     getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
    2551         wchar_t __delim);
    2552 #endif  
    2553 
    2554 _GLIBCXX_END_NAMESPACE
    2555 
    2556 #if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) 
    2557      && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
    2558 
    2559 #include <ext/string_conversions.h>
    2560 
    2561 _GLIBCXX_BEGIN_NAMESPACE(std)
    2562 
    2563   // 21.4 Numeric Conversions [string.conversions].
    2564   inline int
    2565   stoi(const string& __str, size_t* __idx = 0, int __base = 10)
    2566   { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
    2567                     __idx, __base); }
    2568 
    2569   inline long
    2570   stol(const string& __str, size_t* __idx = 0, int __base = 10)
    2571   { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
    2572                  __idx, __base); }
    2573 
    2574   inline unsigned long
    2575   stoul(const string& __str, size_t* __idx = 0, int __base = 10)
    2576   { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
    2577                  __idx, __base); }
    2578 
    2579   inline long long
    2580   stoll(const string& __str, size_t* __idx = 0, int __base = 10)
    2581   { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
    2582                  __idx, __base); }
    2583 
    2584   inline unsigned long long
    2585   stoull(const string& __str, size_t* __idx = 0, int __base = 10)
    2586   { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
    2587                  __idx, __base); }
    2588 
    2589   // NB: strtof vs strtod.
    2590   inline float
    2591   stof(const string& __str, size_t* __idx = 0)
    2592   { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
    2593 
    2594   inline double
    2595   stod(const string& __str, size_t* __idx = 0)
    2596   { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
    2597 
    2598   inline long double
    2599   stold(const string& __str, size_t* __idx = 0)
    2600   { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
    2601 
    2602   // NB: (v)snprintf vs sprintf.
    2603   inline string
    2604   to_string(long long __val)
    2605   { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
    2606                        4 * sizeof(long long),
    2607                        "%lld", __val); }
    2608 
    2609   inline string
    2610   to_string(unsigned long long __val)
    2611   { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
    2612                        4 * sizeof(unsigned long long),
    2613                        "%llu", __val); }
    2614 
    2615   inline string
    2616   to_string(long double __val)
    2617   {
    2618     const int __n = 
    2619       __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
    2620     return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
    2621                        "%Lf", __val);
    2622   }
    2623 
    2624 #ifdef _GLIBCXX_USE_WCHAR_T
    2625   inline int 
    2626   stoi(const wstring& __str, size_t* __idx = 0, int __base = 10)
    2627   { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
    2628                     __idx, __base); }
    2629 
    2630   inline long 
    2631   stol(const wstring& __str, size_t* __idx = 0, int __base = 10)
    2632   { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
    2633                  __idx, __base); }
    2634 
    2635   inline unsigned long
    2636   stoul(const wstring& __str, size_t* __idx = 0, int __base = 10)
    2637   { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
    2638                  __idx, __base); }
    2639 
    2640   inline long long
    2641   stoll(const wstring& __str, size_t* __idx = 0, int __base = 10)
    2642   { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
    2643                  __idx, __base); }
    2644 
    2645   inline unsigned long long
    2646   stoull(const wstring& __str, size_t* __idx = 0, int __base = 10)
    2647   { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
    2648                  __idx, __base); }
    2649 
    2650   // NB: wcstof vs wcstod.
    2651   inline float
    2652   stof(const wstring& __str, size_t* __idx = 0)
    2653   { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
    2654 
    2655   inline double
    2656   stod(const wstring& __str, size_t* __idx = 0)
    2657   { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
    2658 
    2659   inline long double
    2660   stold(const wstring& __str, size_t* __idx = 0)
    2661   { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
    2662 
    2663   inline wstring
    2664   to_wstring(long long __val)
    2665   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
    2666                         4 * sizeof(long long),
    2667                         L"%lld", __val); }
    2668 
    2669   inline wstring
    2670   to_wstring(unsigned long long __val)
    2671   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
    2672                         4 * sizeof(unsigned long long),
    2673                         L"%llu", __val); }
    2674 
    2675   inline wstring
    2676   to_wstring(long double __val)
    2677   {
    2678     const int __n =
    2679       __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
    2680     return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
    2681                         L"%Lf", __val);
    2682   }
    2683 #endif
    2684 
    2685 _GLIBCXX_END_NAMESPACE
    2686 
    2687 #endif
    2688 
    2689 #endif /* _BASIC_STRING_H */
    basic_string.h
  • 相关阅读:
    设置maven阿里云镜像和公司私服并存
    idea favorites bookmarks标签收藏夹数据丢失bug
    C#后期绑定调用COM组件
    SQL Studio 1.0:一款轻便的SQL脚本工具兼容SQL Server、MySQL、Access2007
    SQL Studio 2.0: 新版发布
    SQLHelper用的不爽,试试CmdRunner吧
    Flask + uWSGI+ Linux 指南及避坑
    Flask + Pyinstaller 打包后运行报错 SystemError
    Url重写之UrlRewriter
    .net5 提取压缩包内指定文件内容无需解压
  • 原文地址:https://www.cnblogs.com/lit10050528/p/4342526.html
Copyright © 2011-2022 走看看