LCOV - code coverage report
Current view: top level - usr/include/c++/4.8/bits - basic_string.h (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 64 89 71.9 %
Date: 2015-10-10 Functions: 9 20 45.0 %

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

Generated by: LCOV version 1.10