Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // Components for manipulating sequences of characters -*- C++ -*-
  2.  
  3. // Copyright (C) 1997-2015 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 <ext/alloc_traits.h>
  41. #include <debug/debug.h>
  42. #if __cplusplus >= 201103L
  43. #include <initializer_list>
  44. #endif
  45.  
  46. namespace std _GLIBCXX_VISIBILITY(default)
  47. {
  48. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  49.  
  50. #if _GLIBCXX_USE_CXX11_ABI
  51. _GLIBCXX_BEGIN_NAMESPACE_CXX11
  52.   /**
  53.    *  @class basic_string basic_string.h <string>
  54.    *  @brief  Managing sequences of characters and character-like objects.
  55.    *
  56.    *  @ingroup strings
  57.    *  @ingroup sequences
  58.    *
  59.    *  @tparam _CharT  Type of character
  60.    *  @tparam _Traits  Traits for character type, defaults to
  61.    *                   char_traits<_CharT>.
  62.    *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
  63.    *
  64.    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
  65.    *  <a href="tables.html#66">reversible container</a>, and a
  66.    *  <a href="tables.html#67">sequence</a>.  Of the
  67.    *  <a href="tables.html#68">optional sequence requirements</a>, only
  68.    *  @c push_back, @c at, and @c %array access are supported.
  69.    */
  70.   template<typename _CharT, typename _Traits, typename _Alloc>
  71.     class basic_string
  72.     {
  73.       typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
  74.         rebind<_CharT>::other _Char_alloc_type;
  75.       typedef __gnu_cxx::__alloc_traits<_Char_alloc_type> _Alloc_traits;
  76.  
  77.       // Types:
  78.     public:
  79.       typedef _Traits                                   traits_type;
  80.       typedef typename _Traits::char_type               value_type;
  81.       typedef _Char_alloc_type                          allocator_type;
  82.       typedef typename _Alloc_traits::size_type         size_type;
  83.       typedef typename _Alloc_traits::difference_type   difference_type;
  84.       typedef typename _Alloc_traits::reference         reference;
  85.       typedef typename _Alloc_traits::const_reference   const_reference;
  86.       typedef typename _Alloc_traits::pointer           pointer;
  87.       typedef typename _Alloc_traits::const_pointer     const_pointer;
  88.       typedef __gnu_cxx::__normal_iterator<pointer, basic_string>  iterator;
  89.       typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
  90.                                                         const_iterator;
  91.       typedef std::reverse_iterator<const_iterator>     const_reverse_iterator;
  92.       typedef std::reverse_iterator<iterator>           reverse_iterator;
  93.  
  94.       ///  Value returned by various member functions when they fail.
  95.       static const size_type    npos = static_cast<size_type>(-1);
  96.  
  97.     private:
  98.       // type used for positions in insert, erase etc.
  99. #if __cplusplus < 201103L
  100.       typedef iterator __const_iterator;
  101. #else
  102.       typedef const_iterator __const_iterator;
  103. #endif
  104.  
  105.       // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
  106.       struct _Alloc_hider : allocator_type // TODO check __is_final
  107.       {
  108.         _Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc())
  109.         : allocator_type(__a), _M_p(__dat) { }
  110.  
  111.         pointer _M_p; // The actual data.
  112.       };
  113.  
  114.       _Alloc_hider      _M_dataplus;
  115.       size_type         _M_string_length;
  116.  
  117.       enum { _S_local_capacity = 15 / sizeof(_CharT) };
  118.  
  119.       union
  120.       {
  121.         _CharT           _M_local_buf[_S_local_capacity + 1];
  122.         size_type        _M_allocated_capacity;
  123.       };
  124.  
  125.       void
  126.       _M_data(pointer __p)
  127.       { _M_dataplus._M_p = __p; }
  128.  
  129.       void
  130.       _M_length(size_type __length)
  131.       { _M_string_length = __length; }
  132.  
  133.       pointer
  134.       _M_data() const
  135.       { return _M_dataplus._M_p; }
  136.  
  137.       pointer
  138.       _M_local_data()
  139.       {
  140. #if __cplusplus >= 201103L
  141.         return std::pointer_traits<pointer>::pointer_to(*_M_local_buf);
  142. #else
  143.         return pointer(_M_local_buf);
  144. #endif
  145.       }
  146.  
  147.       const_pointer
  148.       _M_local_data() const
  149.       {
  150. #if __cplusplus >= 201103L
  151.         return std::pointer_traits<const_pointer>::pointer_to(*_M_local_buf);
  152. #else
  153.         return const_pointer(_M_local_buf);
  154. #endif
  155.       }
  156.  
  157.       void
  158.       _M_capacity(size_type __capacity)
  159.       { _M_allocated_capacity = __capacity; }
  160.  
  161.       void
  162.       _M_set_length(size_type __n)
  163.       {
  164.         _M_length(__n);
  165.         traits_type::assign(_M_data()[__n], _CharT());
  166.       }
  167.  
  168.       bool
  169.       _M_is_local() const
  170.       { return _M_data() == _M_local_data(); }
  171.  
  172.       // Create & Destroy
  173.       pointer
  174.       _M_create(size_type&, size_type);
  175.  
  176.       void
  177.       _M_dispose()
  178.       {
  179.         if (!_M_is_local())
  180.           _M_destroy(_M_allocated_capacity);
  181.       }
  182.  
  183.       void
  184.       _M_destroy(size_type __size) throw()
  185.       { _Alloc_traits::deallocate(_M_get_allocator(), _M_data(), __size + 1); }
  186.  
  187.       // _M_construct_aux is used to implement the 21.3.1 para 15 which
  188.       // requires special behaviour if _InIterator is an integral type
  189.       template<typename _InIterator>
  190.         void
  191.         _M_construct_aux(_InIterator __beg, _InIterator __end,
  192.                          std::__false_type)
  193.         {
  194.           typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
  195.           _M_construct(__beg, __end, _Tag());
  196.         }
  197.  
  198.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  199.       // 438. Ambiguity in the "do the right thing" clause
  200.       template<typename _Integer>
  201.         void
  202.         _M_construct_aux(_Integer __beg, _Integer __end, std::__true_type)
  203.         { _M_construct_aux_2(static_cast<size_type>(__beg), __end); }
  204.  
  205.       void
  206.       _M_construct_aux_2(size_type __req, _CharT __c)
  207.       { _M_construct(__req, __c); }
  208.  
  209.       template<typename _InIterator>
  210.         void
  211.         _M_construct(_InIterator __beg, _InIterator __end)
  212.         {
  213.           typedef typename std::__is_integer<_InIterator>::__type _Integral;
  214.           _M_construct_aux(__beg, __end, _Integral());
  215.         }
  216.  
  217.       // For Input Iterators, used in istreambuf_iterators, etc.
  218.       template<typename _InIterator>
  219.         void
  220.         _M_construct(_InIterator __beg, _InIterator __end,
  221.                      std::input_iterator_tag);
  222.  
  223.       // For forward_iterators up to random_access_iterators, used for
  224.       // string::iterator, _CharT*, etc.
  225.       template<typename _FwdIterator>
  226.         void
  227.         _M_construct(_FwdIterator __beg, _FwdIterator __end,
  228.                      std::forward_iterator_tag);
  229.  
  230.       void
  231.       _M_construct(size_type __req, _CharT __c);
  232.  
  233.       allocator_type&
  234.       _M_get_allocator()
  235.       { return _M_dataplus; }
  236.  
  237.       const allocator_type&
  238.       _M_get_allocator() const
  239.       { return _M_dataplus; }
  240.  
  241.     private:
  242.  
  243. #ifdef _GLIBCXX_DISAMBIGUATE_REPLACE_INST
  244.       // The explicit instantiations in misc-inst.cc require this due to
  245.       // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64063
  246.       template<typename _Tp, bool _Requires =
  247.                !__are_same<_Tp, _CharT*>::__value
  248.                && !__are_same<_Tp, const _CharT*>::__value
  249.                && !__are_same<_Tp, iterator>::__value
  250.                && !__are_same<_Tp, const_iterator>::__value>
  251.         struct __enable_if_not_native_iterator
  252.         { typedef basic_string& __type; };
  253.       template<typename _Tp>
  254.         struct __enable_if_not_native_iterator<_Tp, false> { };
  255. #endif
  256.  
  257.       size_type
  258.       _M_check(size_type __pos, const char* __s) const
  259.       {
  260.         if (__pos > this->size())
  261.           __throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > "
  262.                                        "this->size() (which is %zu)"),
  263.                                    __s, __pos, this->size());
  264.         return __pos;
  265.       }
  266.  
  267.       void
  268.       _M_check_length(size_type __n1, size_type __n2, const char* __s) const
  269.       {
  270.         if (this->max_size() - (this->size() - __n1) < __n2)
  271.           __throw_length_error(__N(__s));
  272.       }
  273.  
  274.  
  275.       // NB: _M_limit doesn't check for a bad __pos value.
  276.       size_type
  277.       _M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT
  278.       {
  279.         const bool __testoff =  __off < this->size() - __pos;
  280.         return __testoff ? __off : this->size() - __pos;
  281.       }
  282.  
  283.       // True if _Rep and source do not overlap.
  284.       bool
  285.       _M_disjunct(const _CharT* __s) const _GLIBCXX_NOEXCEPT
  286.       {
  287.         return (less<const _CharT*>()(__s, _M_data())
  288.                 || less<const _CharT*>()(_M_data() + this->size(), __s));
  289.       }
  290.  
  291.       // When __n = 1 way faster than the general multichar
  292.       // traits_type::copy/move/assign.
  293.       static void
  294.       _S_copy(_CharT* __d, const _CharT* __s, size_type __n)
  295.       {
  296.         if (__n == 1)
  297.           traits_type::assign(*__d, *__s);
  298.         else
  299.           traits_type::copy(__d, __s, __n);
  300.       }
  301.  
  302.       static void
  303.       _S_move(_CharT* __d, const _CharT* __s, size_type __n)
  304.       {
  305.         if (__n == 1)
  306.           traits_type::assign(*__d, *__s);
  307.         else
  308.           traits_type::move(__d, __s, __n);
  309.       }
  310.  
  311.       static void
  312.       _S_assign(_CharT* __d, size_type __n, _CharT __c)
  313.       {
  314.         if (__n == 1)
  315.           traits_type::assign(*__d, __c);
  316.         else
  317.           traits_type::assign(__d, __n, __c);
  318.       }
  319.  
  320.       // _S_copy_chars is a separate template to permit specialization
  321.       // to optimize for the common case of pointers as iterators.
  322.       template<class _Iterator>
  323.         static void
  324.         _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
  325.         {
  326.           for (; __k1 != __k2; ++__k1, ++__p)
  327.             traits_type::assign(*__p, *__k1); // These types are off.
  328.         }
  329.  
  330.       static void
  331.       _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2) _GLIBCXX_NOEXCEPT
  332.       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
  333.  
  334.       static void
  335.       _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
  336.       _GLIBCXX_NOEXCEPT
  337.       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
  338.  
  339.       static void
  340.       _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) _GLIBCXX_NOEXCEPT
  341.       { _S_copy(__p, __k1, __k2 - __k1); }
  342.  
  343.       static void
  344.       _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
  345.       _GLIBCXX_NOEXCEPT
  346.       { _S_copy(__p, __k1, __k2 - __k1); }
  347.  
  348.       static int
  349.       _S_compare(size_type __n1, size_type __n2) _GLIBCXX_NOEXCEPT
  350.       {
  351.         const difference_type __d = difference_type(__n1 - __n2);
  352.  
  353.         if (__d > __gnu_cxx::__numeric_traits<int>::__max)
  354.           return __gnu_cxx::__numeric_traits<int>::__max;
  355.         else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
  356.           return __gnu_cxx::__numeric_traits<int>::__min;
  357.         else
  358.           return int(__d);
  359.       }
  360.  
  361.       void
  362.       _M_assign(const basic_string& __rcs);
  363.  
  364.       void
  365.       _M_mutate(size_type __pos, size_type __len1, const _CharT* __s,
  366.                 size_type __len2);
  367.  
  368.       void
  369.       _M_erase(size_type __pos, size_type __n);
  370.  
  371.     public:
  372.       // Construct/copy/destroy:
  373.       // NB: We overload ctors in some cases instead of using default
  374.       // arguments, per 17.4.4.4 para. 2 item 2.
  375.  
  376.       /**
  377.        *  @brief  Default constructor creates an empty string.
  378.        */
  379.       basic_string()
  380. #if __cplusplus >= 201103L
  381.       noexcept(is_nothrow_default_constructible<_Alloc>::value)
  382. #endif
  383.       : _M_dataplus(_M_local_data())
  384.       { _M_set_length(0); }
  385.  
  386.       /**
  387.        *  @brief  Construct an empty string using allocator @a a.
  388.        */
  389.       explicit
  390.       basic_string(const _Alloc& __a)
  391.       : _M_dataplus(_M_local_data(), __a)
  392.       { _M_set_length(0); }
  393.  
  394.       /**
  395.        *  @brief  Construct string with copy of value of @a __str.
  396.        *  @param  __str  Source string.
  397.        */
  398.       basic_string(const basic_string& __str)
  399.       : _M_dataplus(_M_local_data(), __str._M_get_allocator()) // TODO A traits
  400.       { _M_construct(__str._M_data(), __str._M_data() + __str.length()); }
  401.  
  402.       /**
  403.        *  @brief  Construct string as copy of a substring.
  404.        *  @param  __str  Source string.
  405.        *  @param  __pos  Index of first character to copy from.
  406.        *  @param  __n  Number of characters to copy (default remainder).
  407.        */
  408.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  409.       // 2402. [this constructor] shouldn't use Allocator()
  410.       basic_string(const basic_string& __str, size_type __pos,
  411.                    size_type __n = npos)
  412.       : _M_dataplus(_M_local_data())
  413.       {
  414.         const _CharT* __start = __str._M_data()
  415.           + __str._M_check(__pos, "basic_string::basic_string");
  416.         _M_construct(__start, __start + __str._M_limit(__pos, __n));
  417.       }
  418.  
  419.       /**
  420.        *  @brief  Construct string as copy of a substring.
  421.        *  @param  __str  Source string.
  422.        *  @param  __pos  Index of first character to copy from.
  423.        *  @param  __n  Number of characters to copy (default remainder).
  424.        *  @param  __a  Allocator to use.
  425.        */
  426.       basic_string(const basic_string& __str, size_type __pos,
  427.                    size_type __n, const _Alloc& __a)
  428.       : _M_dataplus(_M_local_data(), __a)
  429.       {
  430.         const _CharT* __start
  431.           = __str._M_data() + __str._M_check(__pos, "string::string");
  432.         _M_construct(__start, __start + __str._M_limit(__pos, __n));
  433.       }
  434.  
  435.       /**
  436.        *  @brief  Construct string initialized by a character %array.
  437.        *  @param  __s  Source character %array.
  438.        *  @param  __n  Number of characters to copy.
  439.        *  @param  __a  Allocator to use (default is default allocator).
  440.        *
  441.        *  NB: @a __s must have at least @a __n characters, &apos;\\0&apos;
  442.        *  has no special meaning.
  443.        */
  444.       basic_string(const _CharT* __s, size_type __n,
  445.                    const _Alloc& __a = _Alloc())
  446.       : _M_dataplus(_M_local_data(), __a)
  447.       { _M_construct(__s, __s + __n); }
  448.  
  449.       /**
  450.        *  @brief  Construct string as copy of a C string.
  451.        *  @param  __s  Source C string.
  452.        *  @param  __a  Allocator to use (default is default allocator).
  453.        */
  454.       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
  455.       : _M_dataplus(_M_local_data(), __a)
  456.       { _M_construct(__s, __s ? __s + traits_type::length(__s) : __s+npos); }
  457.  
  458.       /**
  459.        *  @brief  Construct string as multiple characters.
  460.        *  @param  __n  Number of characters.
  461.        *  @param  __c  Character to use.
  462.        *  @param  __a  Allocator to use (default is default allocator).
  463.        */
  464.       basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
  465.       : _M_dataplus(_M_local_data(), __a)
  466.       { _M_construct(__n, __c); }
  467.  
  468. #if __cplusplus >= 201103L
  469.       /**
  470.        *  @brief  Move construct string.
  471.        *  @param  __str  Source string.
  472.        *
  473.        *  The newly-created string contains the exact contents of @a __str.
  474.        *  @a __str is a valid, but unspecified string.
  475.        **/
  476.       basic_string(basic_string&& __str) noexcept
  477.       : _M_dataplus(_M_local_data(), std::move(__str._M_get_allocator()))
  478.       {
  479.         if (__str._M_is_local())
  480.           {
  481.             traits_type::copy(_M_local_buf, __str._M_local_buf,
  482.                               _S_local_capacity + 1);
  483.           }
  484.         else
  485.           {
  486.             _M_data(__str._M_data());
  487.             _M_capacity(__str._M_allocated_capacity);
  488.           }
  489.  
  490.         // Must use _M_length() here not _M_set_length() because
  491.         // basic_stringbuf relies on writing into unallocated capacity so
  492.         // we mess up the contents if we put a '\0' in the string.
  493.         _M_length(__str.length());
  494.         __str._M_data(__str._M_local_data());
  495.         __str._M_set_length(0);
  496.       }
  497.  
  498.       /**
  499.        *  @brief  Construct string from an initializer %list.
  500.        *  @param  __l  std::initializer_list of characters.
  501.        *  @param  __a  Allocator to use (default is default allocator).
  502.        */
  503.       basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc())
  504.       : _M_dataplus(_M_local_data(), __a)
  505.       { _M_construct(__l.begin(), __l.end()); }
  506.  
  507.       basic_string(const basic_string& __str, const _Alloc& __a)
  508.       : _M_dataplus(_M_local_data(), __a)
  509.       { _M_construct(__str.begin(), __str.end()); }
  510.  
  511.       basic_string(basic_string&& __str, const _Alloc& __a)
  512.       : _M_dataplus(_M_local_data(), __a)
  513.       {
  514.         if (__str.get_allocator() == __a)
  515.           *this = std::move(__str);
  516.         else
  517.           _M_construct(__str.begin(), __str.end());
  518.       }
  519.  
  520. #endif // C++11
  521.  
  522.       /**
  523.        *  @brief  Construct string as copy of a range.
  524.        *  @param  __beg  Start of range.
  525.        *  @param  __end  End of range.
  526.        *  @param  __a  Allocator to use (default is default allocator).
  527.        */
  528. #if __cplusplus >= 201103L
  529.       template<typename _InputIterator,
  530.                typename = std::_RequireInputIter<_InputIterator>>
  531. #else
  532.       template<typename _InputIterator>
  533. #endif
  534.         basic_string(_InputIterator __beg, _InputIterator __end,
  535.                      const _Alloc& __a = _Alloc())
  536.         : _M_dataplus(_M_local_data(), __a)
  537.         { _M_construct(__beg, __end); }
  538.  
  539.       /**
  540.        *  @brief  Destroy the string instance.
  541.        */
  542.       ~basic_string()
  543.       { _M_dispose(); }
  544.  
  545.       /**
  546.        *  @brief  Assign the value of @a str to this string.
  547.        *  @param  __str  Source string.
  548.        */
  549.       basic_string&
  550.       operator=(const basic_string& __str)
  551.       { return this->assign(__str); }
  552.  
  553.       /**
  554.        *  @brief  Copy contents of @a s into this string.
  555.        *  @param  __s  Source null-terminated string.
  556.        */
  557.       basic_string&
  558.       operator=(const _CharT* __s)
  559.       { return this->assign(__s); }
  560.  
  561.       /**
  562.        *  @brief  Set value to string of length 1.
  563.        *  @param  __c  Source character.
  564.        *
  565.        *  Assigning to a character makes this string length 1 and
  566.        *  (*this)[0] == @a c.
  567.        */
  568.       basic_string&
  569.       operator=(_CharT __c)
  570.       {
  571.         this->assign(1, __c);
  572.         return *this;
  573.       }
  574.  
  575. #if __cplusplus >= 201103L
  576.       /**
  577.        *  @brief  Move assign the value of @a str to this string.
  578.        *  @param  __str  Source string.
  579.        *
  580.        *  The contents of @a str are moved into this string (without copying).
  581.        *  @a str is a valid, but unspecified string.
  582.        **/
  583.       // PR 58265, this should be noexcept.
  584.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  585.       // 2063. Contradictory requirements for string move assignment
  586.       basic_string&
  587.       operator=(basic_string&& __str)
  588.       {
  589.         this->swap(__str);
  590.         return *this;
  591.       }
  592.  
  593.       /**
  594.        *  @brief  Set value to string constructed from initializer %list.
  595.        *  @param  __l  std::initializer_list.
  596.        */
  597.       basic_string&
  598.       operator=(initializer_list<_CharT> __l)
  599.       {
  600.         this->assign(__l.begin(), __l.size());
  601.         return *this;
  602.       }
  603. #endif // C++11
  604.  
  605.       // Iterators:
  606.       /**
  607.        *  Returns a read/write iterator that points to the first character in
  608.        *  the %string.
  609.        */
  610.       iterator
  611.       begin() _GLIBCXX_NOEXCEPT
  612.       { return iterator(_M_data()); }
  613.  
  614.       /**
  615.        *  Returns a read-only (constant) iterator that points to the first
  616.        *  character in the %string.
  617.        */
  618.       const_iterator
  619.       begin() const _GLIBCXX_NOEXCEPT
  620.       { return const_iterator(_M_data()); }
  621.  
  622.       /**
  623.        *  Returns a read/write iterator that points one past the last
  624.        *  character in the %string.
  625.        */
  626.       iterator
  627.       end() _GLIBCXX_NOEXCEPT
  628.       { return iterator(_M_data() + this->size()); }
  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.       { 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.
  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.
  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.       { return _M_string_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.       { return _M_string_length; }
  723.  
  724.       ///  Returns the size() of the largest possible %string.
  725.       size_type
  726.       max_size() const _GLIBCXX_NOEXCEPT
  727.       { return (_Alloc_traits::max_size(_M_get_allocator()) - 1) / 2; }
  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.       { 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() noexcept
  760.       {
  761. #if __cpp_exceptions
  762.         if (capacity() > size())
  763.           {
  764.             try
  765.               { reserve(0); }
  766.             catch(...)
  767.               { }
  768.           }
  769. #endif
  770.       }
  771. #endif
  772.  
  773.       /**
  774.        *  Returns the total number of characters that the %string can hold
  775.        *  before needing to allocate more memory.
  776.        */
  777.       size_type
  778.       capacity() const _GLIBCXX_NOEXCEPT
  779.       {
  780.         return _M_is_local() ? size_type(_S_local_capacity)
  781.                              : _M_allocated_capacity;
  782.       }
  783.  
  784.       /**
  785.        *  @brief  Attempt to preallocate enough memory for specified number of
  786.        *          characters.
  787.        *  @param  __res_arg  Number of characters required.
  788.        *  @throw  std::length_error  If @a __res_arg exceeds @c max_size().
  789.        *
  790.        *  This function attempts to reserve enough memory for the
  791.        *  %string to hold the specified number of characters.  If the
  792.        *  number requested is more than max_size(), length_error is
  793.        *  thrown.
  794.        *
  795.        *  The advantage of this function is that if optimal code is a
  796.        *  necessity and the user can determine the string length that will be
  797.        *  required, the user can reserve the memory in %advance, and thus
  798.        *  prevent a possible reallocation of memory and copying of %string
  799.        *  data.
  800.        */
  801.       void
  802.       reserve(size_type __res_arg = 0);
  803.  
  804.       /**
  805.        *  Erases the string, making it empty.
  806.        */
  807.       void
  808.       clear() _GLIBCXX_NOEXCEPT
  809.       { _M_set_length(0); }
  810.  
  811.       /**
  812.        *  Returns true if the %string is empty.  Equivalent to
  813.        *  <code>*this == ""</code>.
  814.        */
  815.       bool
  816.       empty() const _GLIBCXX_NOEXCEPT
  817.       { return this->size() == 0; }
  818.  
  819.       // Element access:
  820.       /**
  821.        *  @brief  Subscript access to the data contained in the %string.
  822.        *  @param  __pos  The index of the character to access.
  823.        *  @return  Read-only (constant) reference to the character.
  824.        *
  825.        *  This operator allows for easy, array-style, data access.
  826.        *  Note that data access with this operator is unchecked and
  827.        *  out_of_range lookups are not defined. (For checked lookups
  828.        *  see at().)
  829.        */
  830.       const_reference
  831.       operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT
  832.       {
  833.         _GLIBCXX_DEBUG_ASSERT(__pos <= size());
  834.         return _M_data()[__pos];
  835.       }
  836.  
  837.       /**
  838.        *  @brief  Subscript access to the data contained in the %string.
  839.        *  @param  __pos  The index of the character to access.
  840.        *  @return  Read/write reference to the character.
  841.        *
  842.        *  This operator allows for easy, array-style, data access.
  843.        *  Note that data access with this operator is unchecked and
  844.        *  out_of_range lookups are not defined. (For checked lookups
  845.        *  see at().)
  846.        */
  847.       reference
  848.       operator[](size_type __pos)
  849.       {
  850.         // Allow pos == size() both in C++98 mode, as v3 extension,
  851.         // and in C++11 mode.
  852.         _GLIBCXX_DEBUG_ASSERT(__pos <= size());
  853.         // In pedantic mode be strict in C++98 mode.
  854.         _GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L || __pos < size());
  855.         return _M_data()[__pos];
  856.       }
  857.  
  858.       /**
  859.        *  @brief  Provides access to the data contained in the %string.
  860.        *  @param __n The index of the character to access.
  861.        *  @return  Read-only (const) reference to the character.
  862.        *  @throw  std::out_of_range  If @a n is an invalid index.
  863.        *
  864.        *  This function provides for safer data access.  The parameter is
  865.        *  first checked that it is in the range of the string.  The function
  866.        *  throws out_of_range if the check fails.
  867.        */
  868.       const_reference
  869.       at(size_type __n) const
  870.       {
  871.         if (__n >= this->size())
  872.           __throw_out_of_range_fmt(__N("basic_string::at: __n "
  873.                                        "(which is %zu) >= this->size() "
  874.                                        "(which is %zu)"),
  875.                                    __n, this->size());
  876.         return _M_data()[__n];
  877.       }
  878.  
  879.       /**
  880.        *  @brief  Provides access to the data contained in the %string.
  881.        *  @param __n The index of the character to access.
  882.        *  @return  Read/write reference to the character.
  883.        *  @throw  std::out_of_range  If @a n is an invalid index.
  884.        *
  885.        *  This function provides for safer data access.  The parameter is
  886.        *  first checked that it is in the range of the string.  The function
  887.        *  throws out_of_range if the check fails.
  888.        */
  889.       reference
  890.       at(size_type __n)
  891.       {
  892.         if (__n >= size())
  893.           __throw_out_of_range_fmt(__N("basic_string::at: __n "
  894.                                        "(which is %zu) >= this->size() "
  895.                                        "(which is %zu)"),
  896.                                    __n, this->size());
  897.         return _M_data()[__n];
  898.       }
  899.  
  900. #if __cplusplus >= 201103L
  901.       /**
  902.        *  Returns a read/write reference to the data at the first
  903.        *  element of the %string.
  904.        */
  905.       reference
  906.       front() noexcept
  907.       { return operator[](0); }
  908.  
  909.       /**
  910.        *  Returns a read-only (constant) reference to the data at the first
  911.        *  element of the %string.
  912.        */
  913.       const_reference
  914.       front() const noexcept
  915.       { return operator[](0); }
  916.  
  917.       /**
  918.        *  Returns a read/write reference to the data at the last
  919.        *  element of the %string.
  920.        */
  921.       reference
  922.       back() noexcept
  923.       { return operator[](this->size() - 1); }
  924.  
  925.       /**
  926.        *  Returns a read-only (constant) reference to the data at the
  927.        *  last element of the %string.
  928.        */
  929.       const_reference
  930.       back() const noexcept
  931.       { return operator[](this->size() - 1); }
  932. #endif
  933.  
  934.       // Modifiers:
  935.       /**
  936.        *  @brief  Append a string to this string.
  937.        *  @param __str  The string to append.
  938.        *  @return  Reference to this string.
  939.        */
  940.       basic_string&
  941.       operator+=(const basic_string& __str)
  942.       { return this->append(__str); }
  943.  
  944.       /**
  945.        *  @brief  Append a C string.
  946.        *  @param __s  The C string to append.
  947.        *  @return  Reference to this string.
  948.        */
  949.       basic_string&
  950.       operator+=(const _CharT* __s)
  951.       { return this->append(__s); }
  952.  
  953.       /**
  954.        *  @brief  Append a character.
  955.        *  @param __c  The character to append.
  956.        *  @return  Reference to this string.
  957.        */
  958.       basic_string&
  959.       operator+=(_CharT __c)
  960.       {
  961.         this->push_back(__c);
  962.         return *this;
  963.       }
  964.  
  965. #if __cplusplus >= 201103L
  966.       /**
  967.        *  @brief  Append an initializer_list of characters.
  968.        *  @param __l  The initializer_list of characters to be appended.
  969.        *  @return  Reference to this string.
  970.        */
  971.       basic_string&
  972.       operator+=(initializer_list<_CharT> __l)
  973.       { return this->append(__l.begin(), __l.size()); }
  974. #endif // C++11
  975.  
  976.       /**
  977.        *  @brief  Append a string to this string.
  978.        *  @param __str  The string to append.
  979.        *  @return  Reference to this string.
  980.        */
  981.       basic_string&
  982.       append(const basic_string& __str)
  983.       { return _M_append(__str._M_data(), __str.size()); }
  984.  
  985.       /**
  986.        *  @brief  Append a substring.
  987.        *  @param __str  The string to append.
  988.        *  @param __pos  Index of the first character of str to append.
  989.        *  @param __n  The number of characters to append.
  990.        *  @return  Reference to this string.
  991.        *  @throw  std::out_of_range if @a __pos is not a valid index.
  992.        *
  993.        *  This function appends @a __n characters from @a __str
  994.        *  starting at @a __pos to this string.  If @a __n is is larger
  995.        *  than the number of available characters in @a __str, the
  996.        *  remainder of @a __str is appended.
  997.        */
  998.       basic_string&
  999.       append(const basic_string& __str, size_type __pos, size_type __n)
  1000.       { return _M_append(__str._M_data()
  1001.                          + __str._M_check(__pos, "basic_string::append"),
  1002.                          __str._M_limit(__pos, __n)); }
  1003.  
  1004.       /**
  1005.        *  @brief  Append a C substring.
  1006.        *  @param __s  The C string to append.
  1007.        *  @param __n  The number of characters to append.
  1008.        *  @return  Reference to this string.
  1009.        */
  1010.       basic_string&
  1011.       append(const _CharT* __s, size_type __n)
  1012.       {
  1013.         __glibcxx_requires_string_len(__s, __n);
  1014.         _M_check_length(size_type(0), __n, "basic_string::append");
  1015.         return _M_append(__s, __n);
  1016.       }
  1017.  
  1018.       /**
  1019.        *  @brief  Append a C string.
  1020.        *  @param __s  The C string to append.
  1021.        *  @return  Reference to this string.
  1022.        */
  1023.       basic_string&
  1024.       append(const _CharT* __s)
  1025.       {
  1026.         __glibcxx_requires_string(__s);
  1027.         const size_type __n = traits_type::length(__s);
  1028.         _M_check_length(size_type(0), __n, "basic_string::append");
  1029.         return _M_append(__s, __n);
  1030.       }
  1031.  
  1032.       /**
  1033.        *  @brief  Append multiple characters.
  1034.        *  @param __n  The number of characters to append.
  1035.        *  @param __c  The character to use.
  1036.        *  @return  Reference to this string.
  1037.        *
  1038.        *  Appends __n copies of __c to this string.
  1039.        */
  1040.       basic_string&
  1041.       append(size_type __n, _CharT __c)
  1042.       { return _M_replace_aux(this->size(), size_type(0), __n, __c); }
  1043.  
  1044. #if __cplusplus >= 201103L
  1045.       /**
  1046.        *  @brief  Append an initializer_list of characters.
  1047.        *  @param __l  The initializer_list of characters to append.
  1048.        *  @return  Reference to this string.
  1049.        */
  1050.       basic_string&
  1051.       append(initializer_list<_CharT> __l)
  1052.       { return this->append(__l.begin(), __l.size()); }
  1053. #endif // C++11
  1054.  
  1055.       /**
  1056.        *  @brief  Append a range of characters.
  1057.        *  @param __first  Iterator referencing the first character to append.
  1058.        *  @param __last  Iterator marking the end of the range.
  1059.        *  @return  Reference to this string.
  1060.        *
  1061.        *  Appends characters in the range [__first,__last) to this string.
  1062.        */
  1063. #if __cplusplus >= 201103L
  1064.       template<class _InputIterator,
  1065.                typename = std::_RequireInputIter<_InputIterator>>
  1066. #else
  1067.       template<class _InputIterator>
  1068. #endif
  1069.         basic_string&
  1070.         append(_InputIterator __first, _InputIterator __last)
  1071.         { return this->replace(end(), end(), __first, __last); }
  1072.  
  1073.       /**
  1074.        *  @brief  Append a single character.
  1075.        *  @param __c  Character to append.
  1076.        */
  1077.       void
  1078.       push_back(_CharT __c)
  1079.       {
  1080.         const size_type __size = this->size();
  1081.         if (__size + 1 > this->capacity())
  1082.           this->_M_mutate(__size, size_type(0), 0, size_type(1));
  1083.         traits_type::assign(this->_M_data()[__size], __c);
  1084.         this->_M_set_length(__size + 1);
  1085.       }
  1086.  
  1087.       /**
  1088.        *  @brief  Set value to contents of another string.
  1089.        *  @param  __str  Source string to use.
  1090.        *  @return  Reference to this string.
  1091.        */
  1092.       basic_string&
  1093.       assign(const basic_string& __str)
  1094.       {
  1095.         this->_M_assign(__str);
  1096.         return *this;
  1097.       }
  1098.  
  1099. #if __cplusplus >= 201103L
  1100.       /**
  1101.        *  @brief  Set value to contents of another string.
  1102.        *  @param  __str  Source string to use.
  1103.        *  @return  Reference to this string.
  1104.        *
  1105.        *  This function sets this string to the exact contents of @a __str.
  1106.        *  @a __str is a valid, but unspecified string.
  1107.        */
  1108.       basic_string&
  1109.       assign(basic_string&& __str)
  1110.       {
  1111.         // _GLIBCXX_RESOLVE_LIB_DEFECTS
  1112.         // 2063. Contradictory requirements for string move assignment
  1113.         return *this = std::move(__str);
  1114.       }
  1115. #endif // C++11
  1116.  
  1117.       /**
  1118.        *  @brief  Set value to a substring of a string.
  1119.        *  @param __str  The string to use.
  1120.        *  @param __pos  Index of the first character of str.
  1121.        *  @param __n  Number of characters to use.
  1122.        *  @return  Reference to this string.
  1123.        *  @throw  std::out_of_range if @a pos is not a valid index.
  1124.        *
  1125.        *  This function sets this string to the substring of @a __str
  1126.        *  consisting of @a __n characters at @a __pos.  If @a __n is
  1127.        *  is larger than the number of available characters in @a
  1128.        *  __str, the remainder of @a __str is used.
  1129.        */
  1130.       basic_string&
  1131.       assign(const basic_string& __str, size_type __pos, size_type __n)
  1132.       { return _M_replace(size_type(0), this->size(), __str._M_data()
  1133.                           + __str._M_check(__pos, "basic_string::assign"),
  1134.                           __str._M_limit(__pos, __n)); }
  1135.  
  1136.       /**
  1137.        *  @brief  Set value to a C substring.
  1138.        *  @param __s  The C string to use.
  1139.        *  @param __n  Number of characters to use.
  1140.        *  @return  Reference to this string.
  1141.        *
  1142.        *  This function sets the value of this string to the first @a __n
  1143.        *  characters of @a __s.  If @a __n is is larger than the number of
  1144.        *  available characters in @a __s, the remainder of @a __s is used.
  1145.        */
  1146.       basic_string&
  1147.       assign(const _CharT* __s, size_type __n)
  1148.       {
  1149.         __glibcxx_requires_string_len(__s, __n);
  1150.         return _M_replace(size_type(0), this->size(), __s, __n);
  1151.       }
  1152.  
  1153.       /**
  1154.        *  @brief  Set value to contents of a C string.
  1155.        *  @param __s  The C string to use.
  1156.        *  @return  Reference to this string.
  1157.        *
  1158.        *  This function sets the value of this string to the value of @a __s.
  1159.        *  The data is copied, so there is no dependence on @a __s once the
  1160.        *  function returns.
  1161.        */
  1162.       basic_string&
  1163.       assign(const _CharT* __s)
  1164.       {
  1165.         __glibcxx_requires_string(__s);
  1166.         return _M_replace(size_type(0), this->size(), __s,
  1167.                           traits_type::length(__s));
  1168.       }
  1169.  
  1170.       /**
  1171.        *  @brief  Set value to multiple characters.
  1172.        *  @param __n  Length of the resulting string.
  1173.        *  @param __c  The character to use.
  1174.        *  @return  Reference to this string.
  1175.        *
  1176.        *  This function sets the value of this string to @a __n copies of
  1177.        *  character @a __c.
  1178.        */
  1179.       basic_string&
  1180.       assign(size_type __n, _CharT __c)
  1181.       { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
  1182.  
  1183.       /**
  1184.        *  @brief  Set value to a range of characters.
  1185.        *  @param __first  Iterator referencing the first character to append.
  1186.        *  @param __last  Iterator marking the end of the range.
  1187.        *  @return  Reference to this string.
  1188.        *
  1189.        *  Sets value of string to characters in the range [__first,__last).
  1190.       */
  1191. #if __cplusplus >= 201103L
  1192.       template<class _InputIterator,
  1193.                typename = std::_RequireInputIter<_InputIterator>>
  1194. #else
  1195.       template<class _InputIterator>
  1196. #endif
  1197.         basic_string&
  1198.         assign(_InputIterator __first, _InputIterator __last)
  1199.         { return this->replace(begin(), end(), __first, __last); }
  1200.  
  1201. #if __cplusplus >= 201103L
  1202.       /**
  1203.        *  @brief  Set value to an initializer_list of characters.
  1204.        *  @param __l  The initializer_list of characters to assign.
  1205.        *  @return  Reference to this string.
  1206.        */
  1207.       basic_string&
  1208.       assign(initializer_list<_CharT> __l)
  1209.       { return this->assign(__l.begin(), __l.size()); }
  1210. #endif // C++11
  1211.  
  1212. #if __cplusplus >= 201103L
  1213.       /**
  1214.        *  @brief  Insert multiple characters.
  1215.        *  @param __p  Const_iterator referencing location in string to
  1216.        *              insert at.
  1217.        *  @param __n  Number of characters to insert
  1218.        *  @param __c  The character to insert.
  1219.        *  @return  Iterator referencing the first inserted char.
  1220.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1221.        *
  1222.        *  Inserts @a __n copies of character @a __c starting at the
  1223.        *  position referenced by iterator @a __p.  If adding
  1224.        *  characters causes the length to exceed max_size(),
  1225.        *  length_error is thrown.  The value of the string doesn't
  1226.        *  change if an error is thrown.
  1227.       */
  1228.       iterator
  1229.       insert(const_iterator __p, size_type __n, _CharT __c)
  1230.       {
  1231.         _GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
  1232.         const size_type __pos = __p - begin();
  1233.         this->replace(__p, __p, __n, __c);
  1234.         return iterator(this->_M_data() + __pos);
  1235.       }
  1236. #else
  1237.       /**
  1238.        *  @brief  Insert multiple characters.
  1239.        *  @param __p  Iterator referencing location in string to insert at.
  1240.        *  @param __n  Number of characters to insert
  1241.        *  @param __c  The character to insert.
  1242.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1243.        *
  1244.        *  Inserts @a __n copies of character @a __c starting at the
  1245.        *  position referenced by iterator @a __p.  If adding
  1246.        *  characters causes the length to exceed max_size(),
  1247.        *  length_error is thrown.  The value of the string doesn't
  1248.        *  change if an error is thrown.
  1249.       */
  1250.       void
  1251.       insert(iterator __p, size_type __n, _CharT __c)
  1252.       { this->replace(__p, __p, __n, __c);  }
  1253. #endif
  1254.  
  1255. #if __cplusplus >= 201103L
  1256.       /**
  1257.        *  @brief  Insert a range of characters.
  1258.        *  @param __p  Const_iterator referencing location in string to
  1259.        *              insert at.
  1260.        *  @param __beg  Start of range.
  1261.        *  @param __end  End of range.
  1262.        *  @return  Iterator referencing the first inserted char.
  1263.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1264.        *
  1265.        *  Inserts characters in range [beg,end).  If adding characters
  1266.        *  causes the length to exceed max_size(), length_error is
  1267.        *  thrown.  The value of the string doesn't change if an error
  1268.        *  is thrown.
  1269.       */
  1270.       template<class _InputIterator,
  1271.                typename = std::_RequireInputIter<_InputIterator>>
  1272.         iterator
  1273.         insert(const_iterator __p, _InputIterator __beg, _InputIterator __end)
  1274.         {
  1275.           _GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
  1276.           const size_type __pos = __p - begin();
  1277.           this->replace(__p, __p, __beg, __end);
  1278.           return iterator(this->_M_data() + __pos);
  1279.         }
  1280. #else
  1281.       /**
  1282.        *  @brief  Insert a range of characters.
  1283.        *  @param __p  Iterator referencing location in string to insert at.
  1284.        *  @param __beg  Start of range.
  1285.        *  @param __end  End of range.
  1286.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1287.        *
  1288.        *  Inserts characters in range [__beg,__end).  If adding
  1289.        *  characters causes the length to exceed max_size(),
  1290.        *  length_error is thrown.  The value of the string doesn't
  1291.        *  change if an error is thrown.
  1292.       */
  1293.       template<class _InputIterator>
  1294.         void
  1295.         insert(iterator __p, _InputIterator __beg, _InputIterator __end)
  1296.         { this->replace(__p, __p, __beg, __end); }
  1297. #endif
  1298.  
  1299. #if __cplusplus >= 201103L
  1300.       /**
  1301.        *  @brief  Insert an initializer_list of characters.
  1302.        *  @param __p  Iterator referencing location in string to insert at.
  1303.        *  @param __l  The initializer_list of characters to insert.
  1304.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1305.        */
  1306.       void
  1307.       insert(iterator __p, initializer_list<_CharT> __l)
  1308.       {
  1309.         _GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
  1310.         this->insert(__p - begin(), __l.begin(), __l.size());
  1311.       }
  1312. #endif // C++11
  1313.  
  1314.       /**
  1315.        *  @brief  Insert value of a string.
  1316.        *  @param __pos1  Iterator referencing location in string to insert at.
  1317.        *  @param __str  The string to insert.
  1318.        *  @return  Reference to this string.
  1319.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1320.        *
  1321.        *  Inserts value of @a __str starting at @a __pos1.  If adding
  1322.        *  characters causes the length to exceed max_size(),
  1323.        *  length_error is thrown.  The value of the string doesn't
  1324.        *  change if an error is thrown.
  1325.       */
  1326.       basic_string&
  1327.       insert(size_type __pos1, const basic_string& __str)
  1328.       { return this->replace(__pos1, size_type(0),
  1329.                              __str._M_data(), __str.size()); }
  1330.  
  1331.       /**
  1332.        *  @brief  Insert a substring.
  1333.        *  @param __pos1  Iterator referencing location in string to insert at.
  1334.        *  @param __str  The string to insert.
  1335.        *  @param __pos2  Start of characters in str to insert.
  1336.        *  @param __n  Number of characters to insert.
  1337.        *  @return  Reference to this string.
  1338.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1339.        *  @throw  std::out_of_range  If @a pos1 > size() or
  1340.        *  @a __pos2 > @a str.size().
  1341.        *
  1342.        *  Starting at @a pos1, insert @a __n character of @a __str
  1343.        *  beginning with @a __pos2.  If adding characters causes the
  1344.        *  length to exceed max_size(), length_error is thrown.  If @a
  1345.        *  __pos1 is beyond the end of this string or @a __pos2 is
  1346.        *  beyond the end of @a __str, out_of_range is thrown.  The
  1347.        *  value of the string doesn't change if an error is thrown.
  1348.       */
  1349.       basic_string&
  1350.       insert(size_type __pos1, const basic_string& __str,
  1351.              size_type __pos2, size_type __n)
  1352.       { return this->replace(__pos1, size_type(0), __str._M_data()
  1353.                              + __str._M_check(__pos2, "basic_string::insert"),
  1354.                              __str._M_limit(__pos2, __n)); }
  1355.  
  1356.       /**
  1357.        *  @brief  Insert a C substring.
  1358.        *  @param __pos  Iterator referencing location in string to insert at.
  1359.        *  @param __s  The C string to insert.
  1360.        *  @param __n  The number of characters to insert.
  1361.        *  @return  Reference to this string.
  1362.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1363.        *  @throw  std::out_of_range  If @a __pos is beyond the end of this
  1364.        *  string.
  1365.        *
  1366.        *  Inserts the first @a __n characters of @a __s starting at @a
  1367.        *  __pos.  If adding characters causes the length to exceed
  1368.        *  max_size(), length_error is thrown.  If @a __pos is beyond
  1369.        *  end(), out_of_range is thrown.  The value of the string
  1370.        *  doesn't change if an error is thrown.
  1371.       */
  1372.       basic_string&
  1373.       insert(size_type __pos, const _CharT* __s, size_type __n)
  1374.       { return this->replace(__pos, size_type(0), __s, __n); }
  1375.  
  1376.       /**
  1377.        *  @brief  Insert a C string.
  1378.        *  @param __pos  Iterator referencing location in string to insert at.
  1379.        *  @param __s  The C string to insert.
  1380.        *  @return  Reference to this string.
  1381.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1382.        *  @throw  std::out_of_range  If @a pos is beyond the end of this
  1383.        *  string.
  1384.        *
  1385.        *  Inserts the first @a n characters of @a __s starting at @a __pos.  If
  1386.        *  adding characters causes the length to exceed max_size(),
  1387.        *  length_error is thrown.  If @a __pos is beyond end(), out_of_range is
  1388.        *  thrown.  The value of the string doesn't change if an error is
  1389.        *  thrown.
  1390.       */
  1391.       basic_string&
  1392.       insert(size_type __pos, const _CharT* __s)
  1393.       {
  1394.         __glibcxx_requires_string(__s);
  1395.         return this->replace(__pos, size_type(0), __s,
  1396.                              traits_type::length(__s));
  1397.       }
  1398.  
  1399.       /**
  1400.        *  @brief  Insert multiple characters.
  1401.        *  @param __pos  Index in string to insert at.
  1402.        *  @param __n  Number of characters to insert
  1403.        *  @param __c  The character to insert.
  1404.        *  @return  Reference to this string.
  1405.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1406.        *  @throw  std::out_of_range  If @a __pos is beyond the end of this
  1407.        *  string.
  1408.        *
  1409.        *  Inserts @a __n copies of character @a __c starting at index
  1410.        *  @a __pos.  If adding characters causes the length to exceed
  1411.        *  max_size(), length_error is thrown.  If @a __pos > length(),
  1412.        *  out_of_range is thrown.  The value of the string doesn't
  1413.        *  change if an error is thrown.
  1414.       */
  1415.       basic_string&
  1416.       insert(size_type __pos, size_type __n, _CharT __c)
  1417.       { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
  1418.                               size_type(0), __n, __c); }
  1419.  
  1420.       /**
  1421.        *  @brief  Insert one character.
  1422.        *  @param __p  Iterator referencing position in string to insert at.
  1423.        *  @param __c  The character to insert.
  1424.        *  @return  Iterator referencing newly inserted char.
  1425.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1426.        *
  1427.        *  Inserts character @a __c at position referenced by @a __p.
  1428.        *  If adding character causes the length to exceed max_size(),
  1429.        *  length_error is thrown.  If @a __p is beyond end of string,
  1430.        *  out_of_range is thrown.  The value of the string doesn't
  1431.        *  change if an error is thrown.
  1432.       */
  1433.       iterator
  1434.       insert(__const_iterator __p, _CharT __c)
  1435.       {
  1436.         _GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
  1437.         const size_type __pos = __p - begin();
  1438.         _M_replace_aux(__pos, size_type(0), size_type(1), __c);
  1439.         return iterator(_M_data() + __pos);
  1440.       }
  1441.  
  1442.       /**
  1443.        *  @brief  Remove characters.
  1444.        *  @param __pos  Index of first character to remove (default 0).
  1445.        *  @param __n  Number of characters to remove (default remainder).
  1446.        *  @return  Reference to this string.
  1447.        *  @throw  std::out_of_range  If @a pos is beyond the end of this
  1448.        *  string.
  1449.        *
  1450.        *  Removes @a __n characters from this string starting at @a
  1451.        *  __pos.  The length of the string is reduced by @a __n.  If
  1452.        *  there are < @a __n characters to remove, the remainder of
  1453.        *  the string is truncated.  If @a __p is beyond end of string,
  1454.        *  out_of_range is thrown.  The value of the string doesn't
  1455.        *  change if an error is thrown.
  1456.       */
  1457.       basic_string&
  1458.       erase(size_type __pos = 0, size_type __n = npos)
  1459.       {
  1460.         this->_M_erase(_M_check(__pos, "basic_string::erase"),
  1461.                        _M_limit(__pos, __n));
  1462.         return *this;
  1463.       }
  1464.  
  1465.       /**
  1466.        *  @brief  Remove one character.
  1467.        *  @param __position  Iterator referencing the character to remove.
  1468.        *  @return  iterator referencing same location after removal.
  1469.        *
  1470.        *  Removes the character at @a __position from this string. The value
  1471.        *  of the string doesn't change if an error is thrown.
  1472.       */
  1473.       iterator
  1474.       erase(__const_iterator __position)
  1475.       {
  1476.         _GLIBCXX_DEBUG_PEDASSERT(__position >= begin()
  1477.                                  && __position < end());
  1478.         const size_type __pos = __position - begin();
  1479.         this->_M_erase(__pos, size_type(1));
  1480.         return iterator(_M_data() + __pos);
  1481.       }
  1482.  
  1483.       /**
  1484.        *  @brief  Remove a range of characters.
  1485.        *  @param __first  Iterator referencing the first character to remove.
  1486.        *  @param __last  Iterator referencing the end of the range.
  1487.        *  @return  Iterator referencing location of first after removal.
  1488.        *
  1489.        *  Removes the characters in the range [first,last) from this string.
  1490.        *  The value of the string doesn't change if an error is thrown.
  1491.       */
  1492.       iterator
  1493.       erase(__const_iterator __first, __const_iterator __last)
  1494.       {
  1495.         _GLIBCXX_DEBUG_PEDASSERT(__first >= begin() && __first <= __last
  1496.                                  && __last <= end());
  1497.         const size_type __pos = __first - begin();
  1498.         this->_M_erase(__pos, __last - __first);
  1499.         return iterator(this->_M_data() + __pos);
  1500.       }
  1501.  
  1502. #if __cplusplus >= 201103L
  1503.       /**
  1504.        *  @brief  Remove the last character.
  1505.        *
  1506.        *  The string must be non-empty.
  1507.        */
  1508.       void
  1509.       pop_back() noexcept
  1510.       { _M_erase(size()-1, 1); }
  1511. #endif // C++11
  1512.  
  1513.       /**
  1514.        *  @brief  Replace characters with value from another string.
  1515.        *  @param __pos  Index of first character to replace.
  1516.        *  @param __n  Number of characters to be replaced.
  1517.        *  @param __str  String to insert.
  1518.        *  @return  Reference to this string.
  1519.        *  @throw  std::out_of_range  If @a pos is beyond the end of this
  1520.        *  string.
  1521.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1522.        *
  1523.        *  Removes the characters in the range [__pos,__pos+__n) from
  1524.        *  this string.  In place, the value of @a __str is inserted.
  1525.        *  If @a __pos is beyond end of string, out_of_range is thrown.
  1526.        *  If the length of the result exceeds max_size(), length_error
  1527.        *  is thrown.  The value of the string doesn't change if an
  1528.        *  error is thrown.
  1529.       */
  1530.       basic_string&
  1531.       replace(size_type __pos, size_type __n, const basic_string& __str)
  1532.       { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
  1533.  
  1534.       /**
  1535.        *  @brief  Replace characters with value from another string.
  1536.        *  @param __pos1  Index of first character to replace.
  1537.        *  @param __n1  Number of characters to be replaced.
  1538.        *  @param __str  String to insert.
  1539.        *  @param __pos2  Index of first character of str to use.
  1540.        *  @param __n2  Number of characters from str to use.
  1541.        *  @return  Reference to this string.
  1542.        *  @throw  std::out_of_range  If @a __pos1 > size() or @a __pos2 >
  1543.        *  __str.size().
  1544.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1545.        *
  1546.        *  Removes the characters in the range [__pos1,__pos1 + n) from this
  1547.        *  string.  In place, the value of @a __str is inserted.  If @a __pos is
  1548.        *  beyond end of string, out_of_range is thrown.  If the length of the
  1549.        *  result exceeds max_size(), length_error is thrown.  The value of the
  1550.        *  string doesn't change if an error is thrown.
  1551.       */
  1552.       basic_string&
  1553.       replace(size_type __pos1, size_type __n1, const basic_string& __str,
  1554.               size_type __pos2, size_type __n2)
  1555.       { return this->replace(__pos1, __n1, __str._M_data()
  1556.                              + __str._M_check(__pos2, "basic_string::replace"),
  1557.                              __str._M_limit(__pos2, __n2)); }
  1558.  
  1559.       /**
  1560.        *  @brief  Replace characters with value of a C substring.
  1561.        *  @param __pos  Index of first character to replace.
  1562.        *  @param __n1  Number of characters to be replaced.
  1563.        *  @param __s  C string to insert.
  1564.        *  @param __n2  Number of characters from @a s to use.
  1565.        *  @return  Reference to this string.
  1566.        *  @throw  std::out_of_range  If @a pos1 > size().
  1567.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1568.        *
  1569.        *  Removes the characters in the range [__pos,__pos + __n1)
  1570.        *  from this string.  In place, the first @a __n2 characters of
  1571.        *  @a __s are inserted, or all of @a __s if @a __n2 is too large.  If
  1572.        *  @a __pos is beyond end of string, out_of_range is thrown.  If
  1573.        *  the length of result exceeds max_size(), length_error is
  1574.        *  thrown.  The value of the string doesn't change if an error
  1575.        *  is thrown.
  1576.       */
  1577.       basic_string&
  1578.       replace(size_type __pos, size_type __n1, const _CharT* __s,
  1579.               size_type __n2)
  1580.       {
  1581.         __glibcxx_requires_string_len(__s, __n2);
  1582.         return _M_replace(_M_check(__pos, "basic_string::replace"),
  1583.                           _M_limit(__pos, __n1), __s, __n2);
  1584.       }
  1585.  
  1586.       /**
  1587.        *  @brief  Replace characters with value of a C string.
  1588.        *  @param __pos  Index of first character to replace.
  1589.        *  @param __n1  Number of characters to be replaced.
  1590.        *  @param __s  C string to insert.
  1591.        *  @return  Reference to this string.
  1592.        *  @throw  std::out_of_range  If @a pos > size().
  1593.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1594.        *
  1595.        *  Removes the characters in the range [__pos,__pos + __n1)
  1596.        *  from this string.  In place, the characters of @a __s are
  1597.        *  inserted.  If @a __pos is beyond end of string, out_of_range
  1598.        *  is thrown.  If the length of result exceeds max_size(),
  1599.        *  length_error is thrown.  The value of the string doesn't
  1600.        *  change if an error is thrown.
  1601.       */
  1602.       basic_string&
  1603.       replace(size_type __pos, size_type __n1, const _CharT* __s)
  1604.       {
  1605.         __glibcxx_requires_string(__s);
  1606.         return this->replace(__pos, __n1, __s, traits_type::length(__s));
  1607.       }
  1608.  
  1609.       /**
  1610.        *  @brief  Replace characters with multiple characters.
  1611.        *  @param __pos  Index of first character to replace.
  1612.        *  @param __n1  Number of characters to be replaced.
  1613.        *  @param __n2  Number of characters to insert.
  1614.        *  @param __c  Character to insert.
  1615.        *  @return  Reference to this string.
  1616.        *  @throw  std::out_of_range  If @a __pos > size().
  1617.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1618.        *
  1619.        *  Removes the characters in the range [pos,pos + n1) from this
  1620.        *  string.  In place, @a __n2 copies of @a __c are inserted.
  1621.        *  If @a __pos is beyond end of string, out_of_range is thrown.
  1622.        *  If the length of result exceeds max_size(), length_error is
  1623.        *  thrown.  The value of the string doesn't change if an error
  1624.        *  is thrown.
  1625.       */
  1626.       basic_string&
  1627.       replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
  1628.       { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
  1629.                               _M_limit(__pos, __n1), __n2, __c); }
  1630.  
  1631.       /**
  1632.        *  @brief  Replace range of characters with string.
  1633.        *  @param __i1  Iterator referencing start of range to replace.
  1634.        *  @param __i2  Iterator referencing end of range to replace.
  1635.        *  @param __str  String value to insert.
  1636.        *  @return  Reference to this string.
  1637.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1638.        *
  1639.        *  Removes the characters in the range [__i1,__i2).  In place,
  1640.        *  the value of @a __str is inserted.  If the length of result
  1641.        *  exceeds max_size(), length_error is thrown.  The value of
  1642.        *  the string doesn't change if an error is thrown.
  1643.       */
  1644.       basic_string&
  1645.       replace(__const_iterator __i1, __const_iterator __i2,
  1646.               const basic_string& __str)
  1647.       { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
  1648.  
  1649.       /**
  1650.        *  @brief  Replace range of characters with C substring.
  1651.        *  @param __i1  Iterator referencing start of range to replace.
  1652.        *  @param __i2  Iterator referencing end of range to replace.
  1653.        *  @param __s  C string value to insert.
  1654.        *  @param __n  Number of characters from s to insert.
  1655.        *  @return  Reference to this string.
  1656.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1657.        *
  1658.        *  Removes the characters in the range [__i1,__i2).  In place,
  1659.        *  the first @a __n characters of @a __s are inserted.  If the
  1660.        *  length of result exceeds max_size(), length_error is thrown.
  1661.        *  The value of the string doesn't change if an error is
  1662.        *  thrown.
  1663.       */
  1664.       basic_string&
  1665.       replace(__const_iterator __i1, __const_iterator __i2,
  1666.               const _CharT* __s, size_type __n)
  1667.       {
  1668.         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
  1669.                                  && __i2 <= end());
  1670.         return this->replace(__i1 - begin(), __i2 - __i1, __s, __n);
  1671.       }
  1672.  
  1673.       /**
  1674.        *  @brief  Replace range of characters with C string.
  1675.        *  @param __i1  Iterator referencing start of range to replace.
  1676.        *  @param __i2  Iterator referencing end of range to replace.
  1677.        *  @param __s  C string value to insert.
  1678.        *  @return  Reference to this string.
  1679.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1680.        *
  1681.        *  Removes the characters in the range [__i1,__i2).  In place,
  1682.        *  the characters of @a __s are inserted.  If the length of
  1683.        *  result exceeds max_size(), length_error is thrown.  The
  1684.        *  value of the string doesn't change if an error is thrown.
  1685.       */
  1686.       basic_string&
  1687.       replace(__const_iterator __i1, __const_iterator __i2, const _CharT* __s)
  1688.       {
  1689.         __glibcxx_requires_string(__s);
  1690.         return this->replace(__i1, __i2, __s, traits_type::length(__s));
  1691.       }
  1692.  
  1693.       /**
  1694.        *  @brief  Replace range of characters with multiple characters
  1695.        *  @param __i1  Iterator referencing start of range to replace.
  1696.        *  @param __i2  Iterator referencing end of range to replace.
  1697.        *  @param __n  Number of characters to insert.
  1698.        *  @param __c  Character to insert.
  1699.        *  @return  Reference to this string.
  1700.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1701.        *
  1702.        *  Removes the characters in the range [__i1,__i2).  In place,
  1703.        *  @a __n copies of @a __c are inserted.  If the length of
  1704.        *  result exceeds max_size(), length_error is thrown.  The
  1705.        *  value of the string doesn't change if an error is thrown.
  1706.       */
  1707.       basic_string&
  1708.       replace(__const_iterator __i1, __const_iterator __i2, size_type __n,
  1709.               _CharT __c)
  1710.       {
  1711.         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
  1712.                                  && __i2 <= end());
  1713.         return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __c);
  1714.       }
  1715.  
  1716.       /**
  1717.        *  @brief  Replace range of characters with range.
  1718.        *  @param __i1  Iterator referencing start of range to replace.
  1719.        *  @param __i2  Iterator referencing end of range to replace.
  1720.        *  @param __k1  Iterator referencing start of range to insert.
  1721.        *  @param __k2  Iterator referencing end of range to insert.
  1722.        *  @return  Reference to this string.
  1723.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1724.        *
  1725.        *  Removes the characters in the range [__i1,__i2).  In place,
  1726.        *  characters in the range [__k1,__k2) are inserted.  If the
  1727.        *  length of result exceeds max_size(), length_error is thrown.
  1728.        *  The value of the string doesn't change if an error is
  1729.        *  thrown.
  1730.       */
  1731. #if __cplusplus >= 201103L
  1732.       template<class _InputIterator,
  1733.                typename = std::_RequireInputIter<_InputIterator>>
  1734.         basic_string&
  1735.         replace(const_iterator __i1, const_iterator __i2,
  1736.                 _InputIterator __k1, _InputIterator __k2)
  1737.         {
  1738.           _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
  1739.                                    && __i2 <= end());
  1740.           __glibcxx_requires_valid_range(__k1, __k2);
  1741.           return this->_M_replace_dispatch(__i1, __i2, __k1, __k2,
  1742.                                            std::__false_type());
  1743.         }
  1744. #else
  1745.       template<class _InputIterator>
  1746. #ifdef _GLIBCXX_DISAMBIGUATE_REPLACE_INST
  1747.         typename __enable_if_not_native_iterator<_InputIterator>::__type
  1748. #else
  1749.         basic_string&
  1750. #endif
  1751.         replace(iterator __i1, iterator __i2,
  1752.                 _InputIterator __k1, _InputIterator __k2)
  1753.         {
  1754.           _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
  1755.                                    && __i2 <= end());
  1756.           __glibcxx_requires_valid_range(__k1, __k2);
  1757.           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
  1758.           return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
  1759.         }
  1760. #endif
  1761.  
  1762.       // Specializations for the common case of pointer and iterator:
  1763.       // useful to avoid the overhead of temporary buffering in _M_replace.
  1764.       basic_string&
  1765.       replace(__const_iterator __i1, __const_iterator __i2,
  1766.               _CharT* __k1, _CharT* __k2)
  1767.       {
  1768.         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
  1769.                                  && __i2 <= end());
  1770.         __glibcxx_requires_valid_range(__k1, __k2);
  1771.         return this->replace(__i1 - begin(), __i2 - __i1,
  1772.                              __k1, __k2 - __k1);
  1773.       }
  1774.  
  1775.       basic_string&
  1776.       replace(__const_iterator __i1, __const_iterator __i2,
  1777.               const _CharT* __k1, const _CharT* __k2)
  1778.       {
  1779.         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
  1780.                                  && __i2 <= end());
  1781.         __glibcxx_requires_valid_range(__k1, __k2);
  1782.         return this->replace(__i1 - begin(), __i2 - __i1,
  1783.                              __k1, __k2 - __k1);
  1784.       }
  1785.  
  1786.       basic_string&
  1787.       replace(__const_iterator __i1, __const_iterator __i2,
  1788.               iterator __k1, iterator __k2)
  1789.       {
  1790.         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
  1791.                                  && __i2 <= end());
  1792.         __glibcxx_requires_valid_range(__k1, __k2);
  1793.         return this->replace(__i1 - begin(), __i2 - __i1,
  1794.                              __k1.base(), __k2 - __k1);
  1795.       }
  1796.  
  1797.       basic_string&
  1798.       replace(__const_iterator __i1, __const_iterator __i2,
  1799.               const_iterator __k1, const_iterator __k2)
  1800.       {
  1801.         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
  1802.                                  && __i2 <= end());
  1803.         __glibcxx_requires_valid_range(__k1, __k2);
  1804.         return this->replace(__i1 - begin(), __i2 - __i1,
  1805.                              __k1.base(), __k2 - __k1);
  1806.       }
  1807.  
  1808. #if __cplusplus >= 201103L
  1809.       /**
  1810.        *  @brief  Replace range of characters with initializer_list.
  1811.        *  @param __i1  Iterator referencing start of range to replace.
  1812.        *  @param __i2  Iterator referencing end of range to replace.
  1813.        *  @param __l  The initializer_list of characters to insert.
  1814.        *  @return  Reference to this string.
  1815.        *  @throw  std::length_error  If new length exceeds @c max_size().
  1816.        *
  1817.        *  Removes the characters in the range [__i1,__i2).  In place,
  1818.        *  characters in the range [__k1,__k2) are inserted.  If the
  1819.        *  length of result exceeds max_size(), length_error is thrown.
  1820.        *  The value of the string doesn't change if an error is
  1821.        *  thrown.
  1822.       */
  1823.       basic_string& replace(const_iterator __i1, const_iterator __i2,
  1824.                             initializer_list<_CharT> __l)
  1825.       { return this->replace(__i1, __i2, __l.begin(), __l.end()); }
  1826. #endif // C++11
  1827.  
  1828.     private:
  1829.       template<class _Integer>
  1830.         basic_string&
  1831.         _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
  1832.                             _Integer __n, _Integer __val, __true_type)
  1833.         { return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __val); }
  1834.  
  1835.       template<class _InputIterator>
  1836.         basic_string&
  1837.         _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
  1838.                             _InputIterator __k1, _InputIterator __k2,
  1839.                             __false_type);
  1840.  
  1841.       basic_string&
  1842.       _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
  1843.                      _CharT __c);
  1844.  
  1845.       basic_string&
  1846.       _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
  1847.                  const size_type __len2);
  1848.  
  1849.       basic_string&
  1850.       _M_append(const _CharT* __s, size_type __n);
  1851.  
  1852.     public:
  1853.  
  1854.       /**
  1855.        *  @brief  Copy substring into C string.
  1856.        *  @param __s  C string to copy value into.
  1857.        *  @param __n  Number of characters to copy.
  1858.        *  @param __pos  Index of first character to copy.
  1859.        *  @return  Number of characters actually copied
  1860.        *  @throw  std::out_of_range  If __pos > size().
  1861.        *
  1862.        *  Copies up to @a __n characters starting at @a __pos into the
  1863.        *  C string @a __s.  If @a __pos is %greater than size(),
  1864.        *  out_of_range is thrown.
  1865.       */
  1866.       size_type
  1867.       copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
  1868.  
  1869.       /**
  1870.        *  @brief  Swap contents with another string.
  1871.        *  @param __s  String to swap with.
  1872.        *
  1873.        *  Exchanges the contents of this string with that of @a __s in constant
  1874.        *  time.
  1875.       */
  1876.       void
  1877.       swap(basic_string& __s) _GLIBCXX_NOEXCEPT;
  1878.  
  1879.       // String operations:
  1880.       /**
  1881.        *  @brief  Return const pointer to null-terminated contents.
  1882.        *
  1883.        *  This is a handle to internal data.  Do not modify or dire things may
  1884.        *  happen.
  1885.       */
  1886.       const _CharT*
  1887.       c_str() const _GLIBCXX_NOEXCEPT
  1888.       { return _M_data(); }
  1889.  
  1890.       /**
  1891.        *  @brief  Return const pointer to contents.
  1892.        *
  1893.        *  This is a handle to internal data.  Do not modify or dire things may
  1894.        *  happen.
  1895.       */
  1896.       const _CharT*
  1897.       data() const _GLIBCXX_NOEXCEPT
  1898.       { return _M_data(); }
  1899.  
  1900.       /**
  1901.        *  @brief  Return copy of allocator used to construct this string.
  1902.       */
  1903.       allocator_type
  1904.       get_allocator() const _GLIBCXX_NOEXCEPT
  1905.       { return _M_get_allocator(); }
  1906.  
  1907.       /**
  1908.        *  @brief  Find position of a C substring.
  1909.        *  @param __s  C string to locate.
  1910.        *  @param __pos  Index of character to search from.
  1911.        *  @param __n  Number of characters from @a s to search for.
  1912.        *  @return  Index of start of first occurrence.
  1913.        *
  1914.        *  Starting from @a __pos, searches forward for the first @a
  1915.        *  __n characters in @a __s within this string.  If found,
  1916.        *  returns the index where it begins.  If not found, returns
  1917.        *  npos.
  1918.       */
  1919.       size_type
  1920.       find(const _CharT* __s, size_type __pos, size_type __n) const;
  1921.  
  1922.       /**
  1923.        *  @brief  Find position of a string.
  1924.        *  @param __str  String to locate.
  1925.        *  @param __pos  Index of character to search from (default 0).
  1926.        *  @return  Index of start of first occurrence.
  1927.        *
  1928.        *  Starting from @a __pos, searches forward for value of @a __str within
  1929.        *  this string.  If found, returns the index where it begins.  If not
  1930.        *  found, returns npos.
  1931.       */
  1932.       size_type
  1933.       find(const basic_string& __str, size_type __pos = 0) const
  1934.         _GLIBCXX_NOEXCEPT
  1935.       { return this->find(__str.data(), __pos, __str.size()); }
  1936.  
  1937.       /**
  1938.        *  @brief  Find position of a C string.
  1939.        *  @param __s  C string to locate.
  1940.        *  @param __pos  Index of character to search from (default 0).
  1941.        *  @return  Index of start of first occurrence.
  1942.        *
  1943.        *  Starting from @a __pos, searches forward for the value of @a
  1944.        *  __s within this string.  If found, returns the index where
  1945.        *  it begins.  If not found, returns npos.
  1946.       */
  1947.       size_type
  1948.       find(const _CharT* __s, size_type __pos = 0) const
  1949.       {
  1950.         __glibcxx_requires_string(__s);
  1951.         return this->find(__s, __pos, traits_type::length(__s));
  1952.       }
  1953.  
  1954.       /**
  1955.        *  @brief  Find position of a character.
  1956.        *  @param __c  Character to locate.
  1957.        *  @param __pos  Index of character to search from (default 0).
  1958.        *  @return  Index of first occurrence.
  1959.        *
  1960.        *  Starting from @a __pos, searches forward for @a __c within
  1961.        *  this string.  If found, returns the index where it was
  1962.        *  found.  If not found, returns npos.
  1963.       */
  1964.       size_type
  1965.       find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
  1966.  
  1967.       /**
  1968.        *  @brief  Find last position of a string.
  1969.        *  @param __str  String to locate.
  1970.        *  @param __pos  Index of character to search back from (default end).
  1971.        *  @return  Index of start of last occurrence.
  1972.        *
  1973.        *  Starting from @a __pos, searches backward for value of @a
  1974.        *  __str within this string.  If found, returns the index where
  1975.        *  it begins.  If not found, returns npos.
  1976.       */
  1977.       size_type
  1978.       rfind(const basic_string& __str, size_type __pos = npos) const
  1979.         _GLIBCXX_NOEXCEPT
  1980.       { return this->rfind(__str.data(), __pos, __str.size()); }
  1981.  
  1982.       /**
  1983.        *  @brief  Find last position of a C substring.
  1984.        *  @param __s  C string to locate.
  1985.        *  @param __pos  Index of character to search back from.
  1986.        *  @param __n  Number of characters from s to search for.
  1987.        *  @return  Index of start of last occurrence.
  1988.        *
  1989.        *  Starting from @a __pos, searches backward for the first @a
  1990.        *  __n characters in @a __s within this string.  If found,
  1991.        *  returns the index where it begins.  If not found, returns
  1992.        *  npos.
  1993.       */
  1994.       size_type
  1995.       rfind(const _CharT* __s, size_type __pos, size_type __n) const;
  1996.  
  1997.       /**
  1998.        *  @brief  Find last position of a C string.
  1999.        *  @param __s  C string to locate.
  2000.        *  @param __pos  Index of character to start search at (default end).
  2001.        *  @return  Index of start of  last occurrence.
  2002.        *
  2003.        *  Starting from @a __pos, searches backward for the value of
  2004.        *  @a __s within this string.  If found, returns the index
  2005.        *  where it begins.  If not found, returns npos.
  2006.       */
  2007.       size_type
  2008.       rfind(const _CharT* __s, size_type __pos = npos) const
  2009.       {
  2010.         __glibcxx_requires_string(__s);
  2011.         return this->rfind(__s, __pos, traits_type::length(__s));
  2012.       }
  2013.  
  2014.       /**
  2015.        *  @brief  Find last position of a character.
  2016.        *  @param __c  Character to locate.
  2017.        *  @param __pos  Index of character to search back from (default end).
  2018.        *  @return  Index of last occurrence.
  2019.        *
  2020.        *  Starting from @a __pos, searches backward for @a __c within
  2021.        *  this string.  If found, returns the index where it was
  2022.        *  found.  If not found, returns npos.
  2023.       */
  2024.       size_type
  2025.       rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
  2026.  
  2027.       /**
  2028.        *  @brief  Find position of a character of string.
  2029.        *  @param __str  String containing characters to locate.
  2030.        *  @param __pos  Index of character to search from (default 0).
  2031.        *  @return  Index of first occurrence.
  2032.        *
  2033.        *  Starting from @a __pos, searches forward for one of the
  2034.        *  characters of @a __str within this string.  If found,
  2035.        *  returns the index where it was found.  If not found, returns
  2036.        *  npos.
  2037.       */
  2038.       size_type
  2039.       find_first_of(const basic_string& __str, size_type __pos = 0) const
  2040.         _GLIBCXX_NOEXCEPT
  2041.       { return this->find_first_of(__str.data(), __pos, __str.size()); }
  2042.  
  2043.       /**
  2044.        *  @brief  Find position of a character of C substring.
  2045.        *  @param __s  String containing characters to locate.
  2046.        *  @param __pos  Index of character to search from.
  2047.        *  @param __n  Number of characters from s to search for.
  2048.        *  @return  Index of first occurrence.
  2049.        *
  2050.        *  Starting from @a __pos, searches forward for one of the
  2051.        *  first @a __n characters of @a __s within this string.  If
  2052.        *  found, returns the index where it was found.  If not found,
  2053.        *  returns npos.
  2054.       */
  2055.       size_type
  2056.       find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
  2057.  
  2058.       /**
  2059.        *  @brief  Find position of a character of C string.
  2060.        *  @param __s  String containing characters to locate.
  2061.        *  @param __pos  Index of character to search from (default 0).
  2062.        *  @return  Index of first occurrence.
  2063.        *
  2064.        *  Starting from @a __pos, searches forward for one of the
  2065.        *  characters of @a __s within this string.  If found, returns
  2066.        *  the index where it was found.  If not found, returns npos.
  2067.       */
  2068.       size_type
  2069.       find_first_of(const _CharT* __s, size_type __pos = 0) const
  2070.       {
  2071.         __glibcxx_requires_string(__s);
  2072.         return this->find_first_of(__s, __pos, traits_type::length(__s));
  2073.       }
  2074.  
  2075.       /**
  2076.        *  @brief  Find position of a character.
  2077.        *  @param __c  Character to locate.
  2078.        *  @param __pos  Index of character to search from (default 0).
  2079.        *  @return  Index of first occurrence.
  2080.        *
  2081.        *  Starting from @a __pos, searches forward for the character
  2082.        *  @a __c within this string.  If found, returns the index
  2083.        *  where it was found.  If not found, returns npos.
  2084.        *
  2085.        *  Note: equivalent to find(__c, __pos).
  2086.       */
  2087.       size_type
  2088.       find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
  2089.       { return this->find(__c, __pos); }
  2090.  
  2091.       /**
  2092.        *  @brief  Find last position of a character of string.
  2093.        *  @param __str  String containing characters to locate.
  2094.        *  @param __pos  Index of character to search back from (default end).
  2095.        *  @return  Index of last occurrence.
  2096.        *
  2097.        *  Starting from @a __pos, searches backward for one of the
  2098.        *  characters of @a __str within this string.  If found,
  2099.        *  returns the index where it was found.  If not found, returns
  2100.        *  npos.
  2101.       */
  2102.       size_type
  2103.       find_last_of(const basic_string& __str, size_type __pos = npos) const
  2104.         _GLIBCXX_NOEXCEPT
  2105.       { return this->find_last_of(__str.data(), __pos, __str.size()); }
  2106.  
  2107.       /**
  2108.        *  @brief  Find last position of a character of C substring.
  2109.        *  @param __s  C string containing characters to locate.
  2110.        *  @param __pos  Index of character to search back from.
  2111.        *  @param __n  Number of characters from s to search for.
  2112.        *  @return  Index of last occurrence.
  2113.        *
  2114.        *  Starting from @a __pos, searches backward for one of the
  2115.        *  first @a __n characters of @a __s within this string.  If
  2116.        *  found, returns the index where it was found.  If not found,
  2117.        *  returns npos.
  2118.       */
  2119.       size_type
  2120.       find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
  2121.  
  2122.       /**
  2123.        *  @brief  Find last position of a character of C string.
  2124.        *  @param __s  C string containing characters to locate.
  2125.        *  @param __pos  Index of character to search back from (default end).
  2126.        *  @return  Index of last occurrence.
  2127.        *
  2128.        *  Starting from @a __pos, searches backward for one of the
  2129.        *  characters of @a __s within this string.  If found, returns
  2130.        *  the index where it was found.  If not found, returns npos.
  2131.       */
  2132.       size_type
  2133.       find_last_of(const _CharT* __s, size_type __pos = npos) const
  2134.       {
  2135.         __glibcxx_requires_string(__s);
  2136.         return this->find_last_of(__s, __pos, traits_type::length(__s));
  2137.       }
  2138.  
  2139.       /**
  2140.        *  @brief  Find last position of a character.
  2141.        *  @param __c  Character to locate.
  2142.        *  @param __pos  Index of character to search back from (default end).
  2143.        *  @return  Index of last occurrence.
  2144.        *
  2145.        *  Starting from @a __pos, searches backward for @a __c within
  2146.        *  this string.  If found, returns the index where it was
  2147.        *  found.  If not found, returns npos.
  2148.        *
  2149.        *  Note: equivalent to rfind(__c, __pos).
  2150.       */
  2151.       size_type
  2152.       find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
  2153.       { return this->rfind(__c, __pos); }
  2154.  
  2155.       /**
  2156.        *  @brief  Find position of a character not in string.
  2157.        *  @param __str  String containing characters to avoid.
  2158.        *  @param __pos  Index of character to search from (default 0).
  2159.        *  @return  Index of first occurrence.
  2160.        *
  2161.        *  Starting from @a __pos, searches forward for a character not contained
  2162.        *  in @a __str within this string.  If found, returns the index where it
  2163.        *  was found.  If not found, returns npos.
  2164.       */
  2165.       size_type
  2166.       find_first_not_of(const basic_string& __str, size_type __pos = 0) const
  2167.         _GLIBCXX_NOEXCEPT
  2168.       { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
  2169.  
  2170.       /**
  2171.        *  @brief  Find position of a character not in C substring.
  2172.        *  @param __s  C string containing characters to avoid.
  2173.        *  @param __pos  Index of character to search from.
  2174.        *  @param __n  Number of characters from __s to consider.
  2175.        *  @return  Index of first occurrence.
  2176.        *
  2177.        *  Starting from @a __pos, searches forward for a character not
  2178.        *  contained in the first @a __n characters of @a __s within
  2179.        *  this string.  If found, returns the index where it was
  2180.        *  found.  If not found, returns npos.
  2181.       */
  2182.       size_type
  2183.       find_first_not_of(const _CharT* __s, size_type __pos,
  2184.                         size_type __n) const;
  2185.  
  2186.       /**
  2187.        *  @brief  Find position of a character not in C string.
  2188.        *  @param __s  C string containing characters to avoid.
  2189.        *  @param __pos  Index of character to search from (default 0).
  2190.        *  @return  Index of first occurrence.
  2191.        *
  2192.        *  Starting from @a __pos, searches forward for a character not
  2193.        *  contained in @a __s within this string.  If found, returns
  2194.        *  the index where it was found.  If not found, returns npos.
  2195.       */
  2196.       size_type
  2197.       find_first_not_of(const _CharT* __s, size_type __pos = 0) const
  2198.       {
  2199.         __glibcxx_requires_string(__s);
  2200.         return this->find_first_not_of(__s, __pos, traits_type::length(__s));
  2201.       }
  2202.  
  2203.       /**
  2204.        *  @brief  Find position of a different character.
  2205.        *  @param __c  Character to avoid.
  2206.        *  @param __pos  Index of character to search from (default 0).
  2207.        *  @return  Index of first occurrence.
  2208.        *
  2209.        *  Starting from @a __pos, searches forward for a character
  2210.        *  other than @a __c within this string.  If found, returns the
  2211.        *  index where it was found.  If not found, returns npos.
  2212.       */
  2213.       size_type
  2214.       find_first_not_of(_CharT __c, size_type __pos = 0) const
  2215.         _GLIBCXX_NOEXCEPT;
  2216.  
  2217.       /**
  2218.        *  @brief  Find last position of a character not in string.
  2219.        *  @param __str  String containing characters to avoid.
  2220.        *  @param __pos  Index of character to search back from (default end).
  2221.        *  @return  Index of last occurrence.
  2222.        *
  2223.        *  Starting from @a __pos, searches backward for a character
  2224.        *  not contained in @a __str within this string.  If found,
  2225.        *  returns the index where it was found.  If not found, returns
  2226.        *  npos.
  2227.       */
  2228.       size_type
  2229.       find_last_not_of(const basic_string& __str, size_type __pos = npos) const
  2230.         _GLIBCXX_NOEXCEPT
  2231.       { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
  2232.  
  2233.       /**
  2234.        *  @brief  Find last position of a character not in C substring.
  2235.        *  @param __s  C string containing characters to avoid.
  2236.        *  @param __pos  Index of character to search back from.
  2237.        *  @param __n  Number of characters from s to consider.
  2238.        *  @return  Index of last occurrence.
  2239.        *
  2240.        *  Starting from @a __pos, searches backward for a character not
  2241.        *  contained in the first @a __n characters of @a __s within this string.
  2242.        *  If found, returns the index where it was found.  If not found,
  2243.        *  returns npos.
  2244.       */
  2245.       size_type
  2246.       find_last_not_of(const _CharT* __s, size_type __pos,
  2247.                        size_type __n) const;
  2248.       /**
  2249.        *  @brief  Find last position of a character not in C string.
  2250.        *  @param __s  C string containing characters to avoid.
  2251.        *  @param __pos  Index of character to search back from (default end).
  2252.        *  @return  Index of last occurrence.
  2253.        *
  2254.        *  Starting from @a __pos, searches backward for a character
  2255.        *  not contained in @a __s within this string.  If found,
  2256.        *  returns the index where it was found.  If not found, returns
  2257.        *  npos.
  2258.       */
  2259.       size_type
  2260.       find_last_not_of(const _CharT* __s, size_type __pos = npos) const
  2261.       {
  2262.         __glibcxx_requires_string(__s);
  2263.         return this->find_last_not_of(__s, __pos, traits_type::length(__s));
  2264.       }
  2265.  
  2266.       /**
  2267.        *  @brief  Find last position of a different character.
  2268.        *  @param __c  Character to avoid.
  2269.        *  @param __pos  Index of character to search back from (default end).
  2270.        *  @return  Index of last occurrence.
  2271.        *
  2272.        *  Starting from @a __pos, searches backward for a character other than
  2273.        *  @a __c within this string.  If found, returns the index where it was
  2274.        *  found.  If not found, returns npos.
  2275.       */
  2276.       size_type
  2277.       find_last_not_of(_CharT __c, size_type __pos = npos) const
  2278.         _GLIBCXX_NOEXCEPT;
  2279.  
  2280.       /**
  2281.        *  @brief  Get a substring.
  2282.        *  @param __pos  Index of first character (default 0).
  2283.        *  @param __n  Number of characters in substring (default remainder).
  2284.        *  @return  The new string.
  2285.        *  @throw  std::out_of_range  If __pos > size().
  2286.        *
  2287.        *  Construct and return a new string using the @a __n
  2288.        *  characters starting at @a __pos.  If the string is too
  2289.        *  short, use the remainder of the characters.  If @a __pos is
  2290.        *  beyond the end of the string, out_of_range is thrown.
  2291.       */
  2292.       basic_string
  2293.       substr(size_type __pos = 0, size_type __n = npos) const
  2294.       { return basic_string(*this,
  2295.                             _M_check(__pos, "basic_string::substr"), __n); }
  2296.  
  2297.       /**
  2298.        *  @brief  Compare to a string.
  2299.        *  @param __str  String to compare against.
  2300.        *  @return  Integer < 0, 0, or > 0.
  2301.        *
  2302.        *  Returns an integer < 0 if this string is ordered before @a
  2303.        *  __str, 0 if their values are equivalent, or > 0 if this
  2304.        *  string is ordered after @a __str.  Determines the effective
  2305.        *  length rlen of the strings to compare as the smallest of
  2306.        *  size() and str.size().  The function then compares the two
  2307.        *  strings by calling traits::compare(data(), str.data(),rlen).
  2308.        *  If the result of the comparison is nonzero returns it,
  2309.        *  otherwise the shorter one is ordered first.
  2310.       */
  2311.       int
  2312.       compare(const basic_string& __str) const
  2313.       {
  2314.         const size_type __size = this->size();
  2315.         const size_type __osize = __str.size();
  2316.         const size_type __len = std::min(__size, __osize);
  2317.  
  2318.         int __r = traits_type::compare(_M_data(), __str.data(), __len);
  2319.         if (!__r)
  2320.           __r = _S_compare(__size, __osize);
  2321.         return __r;
  2322.       }
  2323.  
  2324.       /**
  2325.        *  @brief  Compare substring to a string.
  2326.        *  @param __pos  Index of first character of substring.
  2327.        *  @param __n  Number of characters in substring.
  2328.        *  @param __str  String to compare against.
  2329.        *  @return  Integer < 0, 0, or > 0.
  2330.        *
  2331.        *  Form the substring of this string from the @a __n characters
  2332.        *  starting at @a __pos.  Returns an integer < 0 if the
  2333.        *  substring is ordered before @a __str, 0 if their values are
  2334.        *  equivalent, or > 0 if the substring is ordered after @a
  2335.        *  __str.  Determines the effective length rlen of the strings
  2336.        *  to compare as the smallest of the length of the substring
  2337.        *  and @a __str.size().  The function then compares the two
  2338.        *  strings by calling
  2339.        *  traits::compare(substring.data(),str.data(),rlen).  If the
  2340.        *  result of the comparison is nonzero returns it, otherwise
  2341.        *  the shorter one is ordered first.
  2342.       */
  2343.       int
  2344.       compare(size_type __pos, size_type __n, const basic_string& __str) const;
  2345.  
  2346.       /**
  2347.        *  @brief  Compare substring to a substring.
  2348.        *  @param __pos1  Index of first character of substring.
  2349.        *  @param __n1  Number of characters in substring.
  2350.        *  @param __str  String to compare against.
  2351.        *  @param __pos2  Index of first character of substring of str.
  2352.        *  @param __n2  Number of characters in substring of str.
  2353.        *  @return  Integer < 0, 0, or > 0.
  2354.        *
  2355.        *  Form the substring of this string from the @a __n1
  2356.        *  characters starting at @a __pos1.  Form the substring of @a
  2357.        *  __str from the @a __n2 characters starting at @a __pos2.
  2358.        *  Returns an integer < 0 if this substring is ordered before
  2359.        *  the substring of @a __str, 0 if their values are equivalent,
  2360.        *  or > 0 if this substring is ordered after the substring of
  2361.        *  @a __str.  Determines the effective length rlen of the
  2362.        *  strings to compare as the smallest of the lengths of the
  2363.        *  substrings.  The function then compares the two strings by
  2364.        *  calling
  2365.        *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
  2366.        *  If the result of the comparison is nonzero returns it,
  2367.        *  otherwise the shorter one is ordered first.
  2368.       */
  2369.       int
  2370.       compare(size_type __pos1, size_type __n1, const basic_string& __str,
  2371.               size_type __pos2, size_type __n2) const;
  2372.  
  2373.       /**
  2374.        *  @brief  Compare to a C string.
  2375.        *  @param __s  C string to compare against.
  2376.        *  @return  Integer < 0, 0, or > 0.
  2377.        *
  2378.        *  Returns an integer < 0 if this string is ordered before @a __s, 0 if
  2379.        *  their values are equivalent, or > 0 if this string is ordered after
  2380.        *  @a __s.  Determines the effective length rlen of the strings to
  2381.        *  compare as the smallest of size() and the length of a string
  2382.        *  constructed from @a __s.  The function then compares the two strings
  2383.        *  by calling traits::compare(data(),s,rlen).  If the result of the
  2384.        *  comparison is nonzero returns it, otherwise the shorter one is
  2385.        *  ordered first.
  2386.       */
  2387.       int
  2388.       compare(const _CharT* __s) const;
  2389.  
  2390.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  2391.       // 5 String::compare specification questionable
  2392.       /**
  2393.        *  @brief  Compare substring to a C string.
  2394.        *  @param __pos  Index of first character of substring.
  2395.        *  @param __n1  Number of characters in substring.
  2396.        *  @param __s  C string to compare against.
  2397.        *  @return  Integer < 0, 0, or > 0.
  2398.        *
  2399.        *  Form the substring of this string from the @a __n1
  2400.        *  characters starting at @a pos.  Returns an integer < 0 if
  2401.        *  the substring is ordered before @a __s, 0 if their values
  2402.        *  are equivalent, or > 0 if the substring is ordered after @a
  2403.        *  __s.  Determines the effective length rlen of the strings to
  2404.        *  compare as the smallest of the length of the substring and
  2405.        *  the length of a string constructed from @a __s.  The
  2406.        *  function then compares the two string by calling
  2407.        *  traits::compare(substring.data(),__s,rlen).  If the result of
  2408.        *  the comparison is nonzero returns it, otherwise the shorter
  2409.        *  one is ordered first.
  2410.       */
  2411.       int
  2412.       compare(size_type __pos, size_type __n1, const _CharT* __s) const;
  2413.  
  2414.       /**
  2415.        *  @brief  Compare substring against a character %array.
  2416.        *  @param __pos  Index of first character of substring.
  2417.        *  @param __n1  Number of characters in substring.
  2418.        *  @param __s  character %array to compare against.
  2419.        *  @param __n2  Number of characters of s.
  2420.        *  @return  Integer < 0, 0, or > 0.
  2421.        *
  2422.        *  Form the substring of this string from the @a __n1
  2423.        *  characters starting at @a __pos.  Form a string from the
  2424.        *  first @a __n2 characters of @a __s.  Returns an integer < 0
  2425.        *  if this substring is ordered before the string from @a __s,
  2426.        *  0 if their values are equivalent, or > 0 if this substring
  2427.        *  is ordered after the string from @a __s.  Determines the
  2428.        *  effective length rlen of the strings to compare as the
  2429.        *  smallest of the length of the substring and @a __n2.  The
  2430.        *  function then compares the two strings by calling
  2431.        *  traits::compare(substring.data(),s,rlen).  If the result of
  2432.        *  the comparison is nonzero returns it, otherwise the shorter
  2433.        *  one is ordered first.
  2434.        *
  2435.        *  NB: s must have at least n2 characters, &apos;\\0&apos; has
  2436.        *  no special meaning.
  2437.       */
  2438.       int
  2439.       compare(size_type __pos, size_type __n1, const _CharT* __s,
  2440.               size_type __n2) const;
  2441.   };
  2442. _GLIBCXX_END_NAMESPACE_CXX11
  2443. #else  // !_GLIBCXX_USE_CXX11_ABI
  2444.   // Reference-counted COW string implentation
  2445.  
  2446.   /**
  2447.    *  @class basic_string basic_string.h <string>
  2448.    *  @brief  Managing sequences of characters and character-like objects.
  2449.    *
  2450.    *  @ingroup strings
  2451.    *  @ingroup sequences
  2452.    *
  2453.    *  @tparam _CharT  Type of character
  2454.    *  @tparam _Traits  Traits for character type, defaults to
  2455.    *                   char_traits<_CharT>.
  2456.    *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
  2457.    *
  2458.    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
  2459.    *  <a href="tables.html#66">reversible container</a>, and a
  2460.    *  <a href="tables.html#67">sequence</a>.  Of the
  2461.    *  <a href="tables.html#68">optional sequence requirements</a>, only
  2462.    *  @c push_back, @c at, and @c %array access are supported.
  2463.    *
  2464.    *  @doctodo
  2465.    *
  2466.    *
  2467.    *  Documentation?  What's that?
  2468.    *  Nathan Myers <ncm@cantrip.org>.
  2469.    *
  2470.    *  A string looks like this:
  2471.    *
  2472.    *  @code
  2473.    *                                        [_Rep]
  2474.    *                                        _M_length
  2475.    *   [basic_string<char_type>]            _M_capacity
  2476.    *   _M_dataplus                          _M_refcount
  2477.    *   _M_p ---------------->               unnamed array of char_type
  2478.    *  @endcode
  2479.    *
  2480.    *  Where the _M_p points to the first character in the string, and
  2481.    *  you cast it to a pointer-to-_Rep and subtract 1 to get a
  2482.    *  pointer to the header.
  2483.    *
  2484.    *  This approach has the enormous advantage that a string object
  2485.    *  requires only one allocation.  All the ugliness is confined
  2486.    *  within a single %pair of inline functions, which each compile to
  2487.    *  a single @a add instruction: _Rep::_M_data(), and
  2488.    *  string::_M_rep(); and the allocation function which gets a
  2489.    *  block of raw bytes and with room enough and constructs a _Rep
  2490.    *  object at the front.
  2491.    *
  2492.    *  The reason you want _M_data pointing to the character %array and
  2493.    *  not the _Rep is so that the debugger can see the string
  2494.    *  contents. (Probably we should add a non-inline member to get
  2495.    *  the _Rep for the debugger to use, so users can check the actual
  2496.    *  string length.)
  2497.    *
  2498.    *  Note that the _Rep object is a POD so that you can have a
  2499.    *  static <em>empty string</em> _Rep object already @a constructed before
  2500.    *  static constructors have run.  The reference-count encoding is
  2501.    *  chosen so that a 0 indicates one reference, so you never try to
  2502.    *  destroy the empty-string _Rep object.
  2503.    *
  2504.    *  All but the last paragraph is considered pretty conventional
  2505.    *  for a C++ string implementation.
  2506.   */
  2507.   // 21.3  Template class basic_string
  2508.   template<typename _CharT, typename _Traits, typename _Alloc>
  2509.     class basic_string
  2510.     {
  2511.       typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
  2512.  
  2513.       // Types:
  2514.     public:
  2515.       typedef _Traits                                       traits_type;
  2516.       typedef typename _Traits::char_type                   value_type;
  2517.       typedef _Alloc                                        allocator_type;
  2518.       typedef typename _CharT_alloc_type::size_type         size_type;
  2519.       typedef typename _CharT_alloc_type::difference_type   difference_type;
  2520.       typedef typename _CharT_alloc_type::reference         reference;
  2521.       typedef typename _CharT_alloc_type::const_reference   const_reference;
  2522.       typedef typename _CharT_alloc_type::pointer           pointer;
  2523.       typedef typename _CharT_alloc_type::const_pointer     const_pointer;
  2524.       typedef __gnu_cxx::__normal_iterator<pointer, basic_string>  iterator;
  2525.       typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
  2526.                                                             const_iterator;
  2527.       typedef std::reverse_iterator<const_iterator>     const_reverse_iterator;
  2528.       typedef std::reverse_iterator<iterator>               reverse_iterator;
  2529.  
  2530.     private:
  2531.       // _Rep: string representation
  2532.       //   Invariants:
  2533.       //   1. String really contains _M_length + 1 characters: due to 21.3.4
  2534.       //      must be kept null-terminated.
  2535.       //   2. _M_capacity >= _M_length
  2536.       //      Allocated memory is always (_M_capacity + 1) * sizeof(_CharT).
  2537.       //   3. _M_refcount has three states:
  2538.       //      -1: leaked, one reference, no ref-copies allowed, non-const.
  2539.       //       0: one reference, non-const.
  2540.       //     n>0: n + 1 references, operations require a lock, const.
  2541.       //   4. All fields==0 is an empty string, given the extra storage
  2542.       //      beyond-the-end for a null terminator; thus, the shared
  2543.       //      empty string representation needs no constructor.
  2544.  
  2545.       struct _Rep_base
  2546.       {
  2547.         size_type               _M_length;
  2548.         size_type               _M_capacity;
  2549.         _Atomic_word            _M_refcount;
  2550.       };
  2551.  
  2552.       struct _Rep : _Rep_base
  2553.       {
  2554.         // Types:
  2555.         typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
  2556.  
  2557.         // (Public) Data members:
  2558.  
  2559.         // The maximum number of individual char_type elements of an
  2560.         // individual string is determined by _S_max_size. This is the
  2561.         // value that will be returned by max_size().  (Whereas npos
  2562.         // is the maximum number of bytes the allocator can allocate.)
  2563.         // If one was to divvy up the theoretical largest size string,
  2564.         // with a terminating character and m _CharT elements, it'd
  2565.         // look like this:
  2566.         // npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
  2567.         // Solving for m:
  2568.         // m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
  2569.         // In addition, this implementation quarters this amount.
  2570.         static const size_type  _S_max_size;
  2571.         static const _CharT     _S_terminal;
  2572.  
  2573.         // The following storage is init'd to 0 by the linker, resulting
  2574.         // (carefully) in an empty string with one reference.
  2575.         static size_type _S_empty_rep_storage[];
  2576.  
  2577.         static _Rep&
  2578.         _S_empty_rep() _GLIBCXX_NOEXCEPT
  2579.         {
  2580.           // NB: Mild hack to avoid strict-aliasing warnings.  Note that
  2581.           // _S_empty_rep_storage is never modified and the punning should
  2582.           // be reasonably safe in this case.
  2583.           void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
  2584.           return *reinterpret_cast<_Rep*>(__p);
  2585.         }
  2586.  
  2587.         bool
  2588.         _M_is_leaked() const _GLIBCXX_NOEXCEPT
  2589.         { return this->_M_refcount < 0; }
  2590.  
  2591.         bool
  2592.         _M_is_shared() const _GLIBCXX_NOEXCEPT
  2593.         { return this->_M_refcount > 0; }
  2594.  
  2595.         void
  2596.         _M_set_leaked() _GLIBCXX_NOEXCEPT
  2597.         { this->_M_refcount = -1; }
  2598.  
  2599.         void
  2600.         _M_set_sharable() _GLIBCXX_NOEXCEPT
  2601.         { this->_M_refcount = 0; }
  2602.  
  2603.         void
  2604.         _M_set_length_and_sharable(size_type __n) _GLIBCXX_NOEXCEPT
  2605.         {
  2606. #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
  2607.           if (__builtin_expect(this != &_S_empty_rep(), false))
  2608. #endif
  2609.             {
  2610.               this->_M_set_sharable();  // One reference.
  2611.               this->_M_length = __n;
  2612.               traits_type::assign(this->_M_refdata()[__n], _S_terminal);
  2613.               // grrr. (per 21.3.4)
  2614.               // You cannot leave those LWG people alone for a second.
  2615.             }
  2616.         }
  2617.  
  2618.         _CharT*
  2619.         _M_refdata() throw()
  2620.         { return reinterpret_cast<_CharT*>(this + 1); }
  2621.  
  2622.         _CharT*
  2623.         _M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
  2624.         {
  2625.           return (!_M_is_leaked() && __alloc1 == __alloc2)
  2626.                   ? _M_refcopy() : _M_clone(__alloc1);
  2627.         }
  2628.  
  2629.         // Create & Destroy
  2630.         static _Rep*
  2631.         _S_create(size_type, size_type, const _Alloc&);
  2632.  
  2633.         void
  2634.         _M_dispose(const _Alloc& __a) _GLIBCXX_NOEXCEPT
  2635.         {
  2636. #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
  2637.           if (__builtin_expect(this != &_S_empty_rep(), false))
  2638. #endif
  2639.             {
  2640.               // Be race-detector-friendly.  For more info see bits/c++config.
  2641.               _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount);
  2642.               if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
  2643.                                                          -1) <= 0)
  2644.                 {
  2645.                   _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount);
  2646.                   _M_destroy(__a);
  2647.                 }
  2648.             }
  2649.         }  // XXX MT
  2650.  
  2651.         void
  2652.         _M_destroy(const _Alloc&) throw();
  2653.  
  2654.         _CharT*
  2655.         _M_refcopy() throw()
  2656.         {
  2657. #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
  2658.           if (__builtin_expect(this != &_S_empty_rep(), false))
  2659. #endif
  2660.             __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
  2661.           return _M_refdata();
  2662.         }  // XXX MT
  2663.  
  2664.         _CharT*
  2665.         _M_clone(const _Alloc&, size_type __res = 0);
  2666.       };
  2667.  
  2668.       // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
  2669.       struct _Alloc_hider : _Alloc
  2670.       {
  2671.         _Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
  2672.         : _Alloc(__a), _M_p(__dat) { }
  2673.  
  2674.         _CharT* _M_p; // The actual data.
  2675.       };
  2676.  
  2677.     public:
  2678.       // Data Members (public):
  2679.       // NB: This is an unsigned type, and thus represents the maximum
  2680.       // size that the allocator can hold.
  2681.       ///  Value returned by various member functions when they fail.
  2682.       static const size_type    npos = static_cast<size_type>(-1);
  2683.  
  2684.     private:
  2685.       // Data Members (private):
  2686.       mutable _Alloc_hider      _M_dataplus;
  2687.  
  2688.       _CharT*
  2689.       _M_data() const _GLIBCXX_NOEXCEPT
  2690.       { return  _M_dataplus._M_p; }
  2691.  
  2692.       _CharT*
  2693.       _M_data(_CharT* __p) _GLIBCXX_NOEXCEPT
  2694.       { return (_M_dataplus._M_p = __p); }
  2695.  
  2696.       _Rep*
  2697.       _M_rep() const _GLIBCXX_NOEXCEPT
  2698.       { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
  2699.  
  2700.       // For the internal use we have functions similar to `begin'/`end'
  2701.       // but they do not call _M_leak.
  2702.       iterator
  2703.       _M_ibegin() const _GLIBCXX_NOEXCEPT
  2704.       { return iterator(_M_data()); }
  2705.  
  2706.       iterator
  2707.       _M_iend() const _GLIBCXX_NOEXCEPT
  2708.       { return iterator(_M_data() + this->size()); }
  2709.  
  2710.       void
  2711.       _M_leak()    // for use in begin() & non-const op[]
  2712.       {
  2713.         if (!_M_rep()->_M_is_leaked())
  2714.           _M_leak_hard();
  2715.       }
  2716.  
  2717.       size_type
  2718.       _M_check(size_type __pos, const char* __s) const
  2719.       {
  2720.         if (__pos > this->size())
  2721.           __throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > "
  2722.                                        "this->size() (which is %zu)"),
  2723.                                    __s, __pos, this->size());
  2724.         return __pos;
  2725.       }
  2726.  
  2727.       void
  2728.       _M_check_length(size_type __n1, size_type __n2, const char* __s) const
  2729.       {
  2730.         if (this->max_size() - (this->size() - __n1) < __n2)
  2731.           __throw_length_error(__N(__s));
  2732.       }
  2733.  
  2734.       // NB: _M_limit doesn't check for a bad __pos value.
  2735.       size_type
  2736.       _M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT
  2737.       {
  2738.         const bool __testoff =  __off < this->size() - __pos;
  2739.         return __testoff ? __off : this->size() - __pos;
  2740.       }
  2741.  
  2742.       // True if _Rep and source do not overlap.
  2743.       bool
  2744.       _M_disjunct(const _CharT* __s) const _GLIBCXX_NOEXCEPT
  2745.       {
  2746.         return (less<const _CharT*>()(__s, _M_data())
  2747.                 || less<const _CharT*>()(_M_data() + this->size(), __s));
  2748.       }
  2749.  
  2750.       // When __n = 1 way faster than the general multichar
  2751.       // traits_type::copy/move/assign.
  2752.       static void
  2753.       _M_copy(_CharT* __d, const _CharT* __s, size_type __n) _GLIBCXX_NOEXCEPT
  2754.       {
  2755.         if (__n == 1)
  2756.           traits_type::assign(*__d, *__s);
  2757.         else
  2758.           traits_type::copy(__d, __s, __n);
  2759.       }
  2760.  
  2761.       static void
  2762.       _M_move(_CharT* __d, const _CharT* __s, size_type __n) _GLIBCXX_NOEXCEPT
  2763.       {
  2764.         if (__n == 1)
  2765.           traits_type::assign(*__d, *__s);
  2766.         else
  2767.           traits_type::move(__d, __s, __n);      
  2768.       }
  2769.  
  2770.       static void
  2771.       _M_assign(_CharT* __d, size_type __n, _CharT __c) _GLIBCXX_NOEXCEPT
  2772.       {
  2773.         if (__n == 1)
  2774.           traits_type::assign(*__d, __c);
  2775.         else
  2776.           traits_type::assign(__d, __n, __c);    
  2777.       }
  2778.  
  2779.       // _S_copy_chars is a separate template to permit specialization
  2780.       // to optimize for the common case of pointers as iterators.
  2781.       template<class _Iterator>
  2782.         static void
  2783.         _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
  2784.         {
  2785.           for (; __k1 != __k2; ++__k1, ++__p)
  2786.             traits_type::assign(*__p, *__k1); // These types are off.
  2787.         }
  2788.  
  2789.       static void
  2790.       _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2) _GLIBCXX_NOEXCEPT
  2791.       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
  2792.  
  2793.       static void
  2794.       _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
  2795.       _GLIBCXX_NOEXCEPT
  2796.       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
  2797.  
  2798.       static void
  2799.       _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) _GLIBCXX_NOEXCEPT
  2800.       { _M_copy(__p, __k1, __k2 - __k1); }
  2801.  
  2802.       static void
  2803.       _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
  2804.       _GLIBCXX_NOEXCEPT
  2805.       { _M_copy(__p, __k1, __k2 - __k1); }
  2806.  
  2807.       static int
  2808.       _S_compare(size_type __n1, size_type __n2) _GLIBCXX_NOEXCEPT
  2809.       {
  2810.         const difference_type __d = difference_type(__n1 - __n2);
  2811.  
  2812.         if (__d > __gnu_cxx::__numeric_traits<int>::__max)
  2813.           return __gnu_cxx::__numeric_traits<int>::__max;
  2814.         else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
  2815.           return __gnu_cxx::__numeric_traits<int>::__min;
  2816.         else
  2817.           return int(__d);
  2818.       }
  2819.  
  2820.       void
  2821.       _M_mutate(size_type __pos, size_type __len1, size_type __len2);
  2822.  
  2823.       void
  2824.       _M_leak_hard();
  2825.  
  2826.       static _Rep&
  2827.       _S_empty_rep() _GLIBCXX_NOEXCEPT
  2828.       { return _Rep::_S_empty_rep(); }
  2829.  
  2830.     public:
  2831.       // Construct/copy/destroy:
  2832.       // NB: We overload ctors in some cases instead of using default
  2833.       // arguments, per 17.4.4.4 para. 2 item 2.
  2834.  
  2835.       /**
  2836.        *  @brief  Default constructor creates an empty string.
  2837.        */
  2838.       basic_string()
  2839. #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
  2840.       : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
  2841. #else
  2842.       : _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc()){ }
  2843. #endif
  2844.  
  2845.       /**
  2846.        *  @brief  Construct an empty string using allocator @a a.
  2847.        */
  2848.       explicit
  2849.       basic_string(const _Alloc& __a);
  2850.  
  2851.       // NB: per LWG issue 42, semantics different from IS:
  2852.       /**
  2853.        *  @brief  Construct string with copy of value of @a str.
  2854.        *  @param  __str  Source string.
  2855.        */
  2856.       basic_string(const basic_string& __str);
  2857.       /**
  2858.        *  @brief  Construct string as copy of a substring.
  2859.        *  @param  __str  Source string.
  2860.        *  @param  __pos  Index of first character to copy from.
  2861.        *  @param  __n  Number of characters to copy (default remainder).
  2862.        */
  2863.       basic_string(const basic_string& __str, size_type __pos,
  2864.                    size_type __n = npos);
  2865.       /**
  2866.        *  @brief  Construct string as copy of a substring.
  2867.        *  @param  __str  Source string.
  2868.        *  @param  __pos  Index of first character to copy from.
  2869.        *  @param  __n  Number of characters to copy.
  2870.        *  @param  __a  Allocator to use.
  2871.        */
  2872.       basic_string(const basic_string& __str, size_type __pos,
  2873.                    size_type __n, const _Alloc& __a);
  2874.  
  2875.       /**
  2876.        *  @brief  Construct string initialized by a character %array.
  2877.        *  @param  __s  Source character %array.
  2878.        *  @param  __n  Number of characters to copy.
  2879.        *  @param  __a  Allocator to use (default is default allocator).
  2880.        *
  2881.        *  NB: @a __s must have at least @a __n characters, &apos;\\0&apos;
  2882.        *  has no special meaning.
  2883.        */
  2884.       basic_string(const _CharT* __s, size_type __n,
  2885.                    const _Alloc& __a = _Alloc());
  2886.       /**
  2887.        *  @brief  Construct string as copy of a C string.
  2888.        *  @param  __s  Source C string.
  2889.        *  @param  __a  Allocator to use (default is default allocator).
  2890.        */
  2891.       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
  2892.       /**
  2893.        *  @brief  Construct string as multiple characters.
  2894.        *  @param  __n  Number of characters.
  2895.        *  @param  __c  Character to use.
  2896.        *  @param  __a  Allocator to use (default is default allocator).
  2897.        */
  2898.       basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
  2899.  
  2900. #if __cplusplus >= 201103L
  2901.       /**
  2902.        *  @brief  Move construct string.
  2903.        *  @param  __str  Source string.
  2904.        *
  2905.        *  The newly-created string contains the exact contents of @a __str.
  2906.        *  @a __str is a valid, but unspecified string.
  2907.        **/
  2908.       basic_string(basic_string&& __str)
  2909. #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
  2910.       noexcept // FIXME C++11: should always be noexcept.
  2911. #endif
  2912.       : _M_dataplus(__str._M_dataplus)
  2913.       {
  2914. #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
  2915.         __str._M_data(_S_empty_rep()._M_refdata());
  2916. #else
  2917.         __str._M_data(_S_construct(size_type(), _CharT(), get_allocator()));
  2918. #endif
  2919.       }
  2920.  
  2921.       /**
  2922.        *  @brief  Construct string from an initializer %list.
  2923.        *  @param  __l  std::initializer_list of characters.
  2924.        *  @param  __a  Allocator to use (default is default allocator).
  2925.        */
  2926.       basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc());
  2927. #endif // C++11
  2928.  
  2929.       /**
  2930.        *  @brief  Construct string as copy of a range.
  2931.        *  @param  __beg  Start of range.
  2932.        *  @param  __end  End of range.
  2933.        *  @param  __a  Allocator to use (default is default allocator).
  2934.        */
  2935.       template<class _InputIterator>
  2936.         basic_string(_InputIterator __beg, _InputIterator __end,
  2937.                      const _Alloc& __a = _Alloc());
  2938.  
  2939.       /**
  2940.        *  @brief  Destroy the string instance.
  2941.        */
  2942.       ~basic_string() _GLIBCXX_NOEXCEPT
  2943.       { _M_rep()->_M_dispose(this->get_allocator()); }
  2944.  
  2945.       /**
  2946.        *  @brief  Assign the value of @a str to this string.
  2947.        *  @param  __str  Source string.
  2948.        */
  2949.       basic_string&
  2950.       operator=(const basic_string& __str)
  2951.       { return this->assign(__str); }
  2952.  
  2953.       /**
  2954.        *  @brief  Copy contents of @a s into this string.
  2955.        *  @param  __s  Source null-terminated string.
  2956.        */
  2957.       basic_string&
  2958.       operator=(const _CharT* __s)
  2959.       { return this->assign(__s); }
  2960.  
  2961.       /**
  2962.        *  @brief  Set value to string of length 1.
  2963.        *  @param  __c  Source character.
  2964.        *
  2965.        *  Assigning to a character makes this string length 1 and
  2966.        *  (*this)[0] == @a c.
  2967.        */
  2968.       basic_string&
  2969.       operator=(_CharT __c)
  2970.       {
  2971.         this->assign(1, __c);
  2972.         return *this;
  2973.       }
  2974.  
  2975. #if __cplusplus >= 201103L
  2976.       /**
  2977.        *  @brief  Move assign the value of @a str to this string.
  2978.        *  @param  __str  Source string.
  2979.        *
  2980.        *  The contents of @a str are moved into this string (without copying).
  2981.        *  @a str is a valid, but unspecified string.
  2982.        **/
  2983.       // PR 58265, this should be noexcept.
  2984.       basic_string&
  2985.       operator=(basic_string&& __str)
  2986.       {
  2987.         // NB: DR 1204.
  2988.         this->swap(__str);
  2989.         return *this;
  2990.       }
  2991.  
  2992.       /**
  2993.        *  @brief  Set value to string constructed from initializer %list.
  2994.        *  @param  __l  std::initializer_list.
  2995.        */
  2996.       basic_string&
  2997.       operator=(initializer_list<_CharT> __l)
  2998.       {
  2999.         this->assign(__l.begin(), __l.size());
  3000.         return *this;
  3001.       }
  3002. #endif // C++11
  3003.  
  3004.       // Iterators:
  3005.       /**
  3006.        *  Returns a read/write iterator that points to the first character in
  3007.        *  the %string.  Unshares the string.
  3008.        */
  3009.       iterator
  3010.       begin() // FIXME C++11: should be noexcept.
  3011.       {
  3012.         _M_leak();
  3013.         return iterator(_M_data());
  3014.       }
  3015.  
  3016.       /**
  3017.        *  Returns a read-only (constant) iterator that points to the first
  3018.        *  character in the %string.
  3019.        */
  3020.       const_iterator
  3021.       begin() const _GLIBCXX_NOEXCEPT
  3022.       { return const_iterator(_M_data()); }
  3023.  
  3024.       /**
  3025.        *  Returns a read/write iterator that points one past the last
  3026.        *  character in the %string.  Unshares the string.
  3027.        */
  3028.       iterator
  3029.       end() // FIXME C++11: should be noexcept.
  3030.       {
  3031.         _M_leak();
  3032.         return iterator(_M_data() + this->size());
  3033.       }
  3034.  
  3035.       /**
  3036.        *  Returns a read-only (constant) iterator that points one past the
  3037.        *  last character in the %string.
  3038.        */
  3039.       const_iterator
  3040.       end() const _GLIBCXX_NOEXCEPT
  3041.       { return const_iterator(_M_data() + this->size()); }
  3042.  
  3043.       /**
  3044.        *  Returns a read/write reverse iterator that points to the last
  3045.        *  character in the %string.  Iteration is done in reverse element
  3046.        *  order.  Unshares the string.
  3047.        */
  3048.       reverse_iterator
  3049.       rbegin() // FIXME C++11: should be noexcept.
  3050.       { return reverse_iterator(this->end()); }
  3051.  
  3052.       /**
  3053.        *  Returns a read-only (constant) reverse iterator that points
  3054.        *  to the last character in the %string.  Iteration is done in
  3055.        *  reverse element order.
  3056.        */
  3057.       const_reverse_iterator
  3058.       rbegin() const _GLIBCXX_NOEXCEPT
  3059.       { return const_reverse_iterator(this->end()); }
  3060.  
  3061.       /**
  3062.        *  Returns a read/write reverse iterator that points to one before the
  3063.        *  first character in the %string.  Iteration is done in reverse
  3064.        *  element order.  Unshares the string.
  3065.        */
  3066.       reverse_iterator
  3067.       rend() // FIXME C++11: should be noexcept.
  3068.       { return reverse_iterator(this->begin()); }
  3069.  
  3070.       /**
  3071.        *  Returns a read-only (constant) reverse iterator that points
  3072.        *  to one before the first character in the %string.  Iteration
  3073.        *  is done in reverse element order.
  3074.        */
  3075.       const_reverse_iterator
  3076.       rend() const _GLIBCXX_NOEXCEPT
  3077.       { return const_reverse_iterator(this->begin()); }
  3078.  
  3079. #if __cplusplus >= 201103L
  3080.       /**
  3081.        *  Returns a read-only (constant) iterator that points to the first
  3082.        *  character in the %string.
  3083.        */
  3084.       const_iterator
  3085.       cbegin() const noexcept
  3086.       { return const_iterator(this->_M_data()); }
  3087.  
  3088.       /**
  3089.        *  Returns a read-only (constant) iterator that points one past the
  3090.        *  last character in the %string.
  3091.        */
  3092.       const_iterator
  3093.       cend() const noexcept
  3094.       { return const_iterator(this->_M_data() + this->size()); }
  3095.  
  3096.       /**
  3097.        *  Returns a read-only (constant) reverse iterator that points
  3098.        *  to the last character in the %string.  Iteration is done in
  3099.        *  reverse element order.
  3100.        */
  3101.       const_reverse_iterator
  3102.       crbegin() const noexcept
  3103.       { return const_reverse_iterator(this->end()); }
  3104.  
  3105.       /**
  3106.        *  Returns a read-only (constant) reverse iterator that points
  3107.        *  to one before the first character in the %string.  Iteration
  3108.        *  is done in reverse element order.
  3109.        */
  3110.       const_reverse_iterator
  3111.       crend() const noexcept
  3112.       { return const_reverse_iterator(this->begin()); }
  3113. #endif
  3114.  
  3115.     public:
  3116.       // Capacity:
  3117.       ///  Returns the number of characters in the string, not including any
  3118.       ///  null-termination.
  3119.       size_type
  3120.       size() const _GLIBCXX_NOEXCEPT
  3121.       { return _M_rep()->_M_length; }
  3122.  
  3123.       ///  Returns the number of characters in the string, not including any
  3124.       ///  null-termination.
  3125.       size_type
  3126.       length() const _GLIBCXX_NOEXCEPT
  3127.       { return _M_rep()->_M_length; }
  3128.  
  3129.       ///  Returns the size() of the largest possible %string.
  3130.       size_type
  3131.       max_size() const _GLIBCXX_NOEXCEPT
  3132.       { return _Rep::_S_max_size; }
  3133.  
  3134.       /**
  3135.        *  @brief  Resizes the %string to the specified number of characters.
  3136.        *  @param  __n  Number of characters the %string should contain.
  3137.        *  @param  __c  Character to fill any new elements.
  3138.        *
  3139.        *  This function will %resize the %string to the specified
  3140.        *  number of characters.  If the number is smaller than the
  3141.        *  %string's current size the %string is truncated, otherwise
  3142.        *  the %string is extended and new elements are %set to @a __c.
  3143.        */
  3144.       void
  3145.       resize(size_type __n, _CharT __c);
  3146.  
  3147.       /**
  3148.        *  @brief  Resizes the %string to the specified number of characters.
  3149.        *  @param  __n  Number of characters the %string should contain.
  3150.        *
  3151.        *  This function will resize the %string to the specified length.  If
  3152.        *  the new size is smaller than the %string's current size the %string
  3153.        *  is truncated, otherwise the %string is extended and new characters
  3154.        *  are default-constructed.  For basic types such as char, this means
  3155.        *  setting them to 0.
  3156.        */
  3157.       void
  3158.       resize(size_type __n)
  3159.       { this->resize(__n, _CharT()); }
  3160.  
  3161. #if __cplusplus >= 201103L
  3162.       ///  A non-binding request to reduce capacity() to size().
  3163.       void
  3164.       shrink_to_fit() _GLIBCXX_NOEXCEPT
  3165.       {
  3166. #if __cpp_exceptions
  3167.         if (capacity() > size())
  3168.           {
  3169.             try
  3170.               { reserve(0); }
  3171.             catch(...)
  3172.               { }
  3173.           }
  3174. #endif
  3175.       }
  3176. #endif
  3177.  
  3178.       /**
  3179.        *  Returns the total number of characters that the %string can hold
  3180.        *  before needing to allocate more memory.
  3181.        */
  3182.       size_type
  3183.       capacity() const _GLIBCXX_NOEXCEPT
  3184.       { return _M_rep()->_M_capacity; }
  3185.  
  3186.       /**
  3187.        *  @brief  Attempt to preallocate enough memory for specified number of
  3188.        *          characters.
  3189.        *  @param  __res_arg  Number of characters required.
  3190.        *  @throw  std::length_error  If @a __res_arg exceeds @c max_size().
  3191.        *
  3192.        *  This function attempts to reserve enough memory for the
  3193.        *  %string to hold the specified number of characters.  If the
  3194.        *  number requested is more than max_size(), length_error is
  3195.        *  thrown.
  3196.        *
  3197.        *  The advantage of this function is that if optimal code is a
  3198.        *  necessity and the user can determine the string length that will be
  3199.        *  required, the user can reserve the memory in %advance, and thus
  3200.        *  prevent a possible reallocation of memory and copying of %string
  3201.        *  data.
  3202.        */
  3203.       void
  3204.       reserve(size_type __res_arg = 0);
  3205.  
  3206.       /**
  3207.        *  Erases the string, making it empty.
  3208.        */
  3209.       // PR 56166: this should not throw.
  3210.       void
  3211.       clear()
  3212.       { _M_mutate(0, this->size(), 0); }
  3213.  
  3214.       /**
  3215.        *  Returns true if the %string is empty.  Equivalent to
  3216.        *  <code>*this == ""</code>.
  3217.        */
  3218.       bool
  3219.       empty() const _GLIBCXX_NOEXCEPT
  3220.       { return this->size() == 0; }
  3221.  
  3222.       // Element access:
  3223.       /**
  3224.        *  @brief  Subscript access to the data contained in the %string.
  3225.        *  @param  __pos  The index of the character to access.
  3226.        *  @return  Read-only (constant) reference to the character.
  3227.        *
  3228.        *  This operator allows for easy, array-style, data access.
  3229.        *  Note that data access with this operator is unchecked and
  3230.        *  out_of_range lookups are not defined. (For checked lookups
  3231.        *  see at().)
  3232.        */
  3233.       const_reference
  3234.       operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT
  3235.       {
  3236.         _GLIBCXX_DEBUG_ASSERT(__pos <= size());
  3237.         return _M_data()[__pos];
  3238.       }
  3239.  
  3240.       /**
  3241.        *  @brief  Subscript access to the data contained in the %string.
  3242.        *  @param  __pos  The index of the character to access.
  3243.        *  @return  Read/write reference to the character.
  3244.        *
  3245.        *  This operator allows for easy, array-style, data access.
  3246.        *  Note that data access with this operator is unchecked and
  3247.        *  out_of_range lookups are not defined. (For checked lookups
  3248.        *  see at().)  Unshares the string.
  3249.        */
  3250.       reference
  3251.       operator[](size_type __pos)
  3252.       {
  3253.         // Allow pos == size() both in C++98 mode, as v3 extension,
  3254.         // and in C++11 mode.
  3255.         _GLIBCXX_DEBUG_ASSERT(__pos <= size());
  3256.         // In pedantic mode be strict in C++98 mode.
  3257.         _GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L || __pos < size());
  3258.         _M_leak();
  3259.         return _M_data()[__pos];
  3260.       }
  3261.  
  3262.       /**
  3263.        *  @brief  Provides access to the data contained in the %string.
  3264.        *  @param __n The index of the character to access.
  3265.        *  @return  Read-only (const) reference to the character.
  3266.        *  @throw  std::out_of_range  If @a n is an invalid index.
  3267.        *
  3268.        *  This function provides for safer data access.  The parameter is
  3269.        *  first checked that it is in the range of the string.  The function
  3270.        *  throws out_of_range if the check fails.
  3271.        */
  3272.       const_reference
  3273.       at(size_type __n) const
  3274.       {
  3275.         if (__n >= this->size())
  3276.           __throw_out_of_range_fmt(__N("basic_string::at: __n "
  3277.                                        "(which is %zu) >= this->size() "
  3278.                                        "(which is %zu)"),
  3279.                                    __n, this->size());
  3280.         return _M_data()[__n];
  3281.       }
  3282.  
  3283.       /**
  3284.        *  @brief  Provides access to the data contained in the %string.
  3285.        *  @param __n The index of the character to access.
  3286.        *  @return  Read/write reference to the character.
  3287.        *  @throw  std::out_of_range  If @a n is an invalid index.
  3288.        *
  3289.        *  This function provides for safer data access.  The parameter is
  3290.        *  first checked that it is in the range of the string.  The function
  3291.        *  throws out_of_range if the check fails.  Success results in
  3292.        *  unsharing the string.
  3293.        */
  3294.       reference
  3295.       at(size_type __n)
  3296.       {
  3297.         if (__n >= size())
  3298.           __throw_out_of_range_fmt(__N("basic_string::at: __n "
  3299.                                        "(which is %zu) >= this->size() "
  3300.                                        "(which is %zu)"),
  3301.                                    __n, this->size());
  3302.         _M_leak();
  3303.         return _M_data()[__n];
  3304.       }
  3305.  
  3306. #if __cplusplus >= 201103L
  3307.       /**
  3308.        *  Returns a read/write reference to the data at the first
  3309.        *  element of the %string.
  3310.        */
  3311.       reference
  3312.       front()
  3313.       { return operator[](0); }
  3314.  
  3315.       /**
  3316.        *  Returns a read-only (constant) reference to the data at the first
  3317.        *  element of the %string.
  3318.        */
  3319.       const_reference
  3320.       front() const _GLIBCXX_NOEXCEPT
  3321.       { return operator[](0); }
  3322.  
  3323.       /**
  3324.        *  Returns a read/write reference to the data at the last
  3325.        *  element of the %string.
  3326.        */
  3327.       reference
  3328.       back()
  3329.       { return operator[](this->size() - 1); }
  3330.  
  3331.       /**
  3332.        *  Returns a read-only (constant) reference to the data at the
  3333.        *  last element of the %string.
  3334.        */
  3335.       const_reference
  3336.       back() const _GLIBCXX_NOEXCEPT
  3337.       { return operator[](this->size() - 1); }
  3338. #endif
  3339.  
  3340.       // Modifiers:
  3341.       /**
  3342.        *  @brief  Append a string to this string.
  3343.        *  @param __str  The string to append.
  3344.        *  @return  Reference to this string.
  3345.        */
  3346.       basic_string&
  3347.       operator+=(const basic_string& __str)
  3348.       { return this->append(__str); }
  3349.  
  3350.       /**
  3351.        *  @brief  Append a C string.
  3352.        *  @param __s  The C string to append.
  3353.        *  @return  Reference to this string.
  3354.        */
  3355.       basic_string&
  3356.       operator+=(const _CharT* __s)
  3357.       { return this->append(__s); }
  3358.  
  3359.       /**
  3360.        *  @brief  Append a character.
  3361.        *  @param __c  The character to append.
  3362.        *  @return  Reference to this string.
  3363.        */
  3364.       basic_string&
  3365.       operator+=(_CharT __c)
  3366.       {
  3367.         this->push_back(__c);
  3368.         return *this;
  3369.       }
  3370.  
  3371. #if __cplusplus >= 201103L
  3372.       /**
  3373.        *  @brief  Append an initializer_list of characters.
  3374.        *  @param __l  The initializer_list of characters to be appended.
  3375.        *  @return  Reference to this string.
  3376.        */
  3377.       basic_string&
  3378.       operator+=(initializer_list<_CharT> __l)
  3379.       { return this->append(__l.begin(), __l.size()); }
  3380. #endif // C++11
  3381.  
  3382.       /**
  3383.        *  @brief  Append a string to this string.
  3384.        *  @param __str  The string to append.
  3385.        *  @return  Reference to this string.
  3386.        */
  3387.       basic_string&
  3388.       append(const basic_string& __str);
  3389.  
  3390.       /**
  3391.        *  @brief  Append a substring.
  3392.        *  @param __str  The string to append.
  3393.        *  @param __pos  Index of the first character of str to append.
  3394.        *  @param __n  The number of characters to append.
  3395.        *  @return  Reference to this string.
  3396.        *  @throw  std::out_of_range if @a __pos is not a valid index.
  3397.        *
  3398.        *  This function appends @a __n characters from @a __str
  3399.        *  starting at @a __pos to this string.  If @a __n is is larger
  3400.        *  than the number of available characters in @a __str, the
  3401.        *  remainder of @a __str is appended.
  3402.        */
  3403.       basic_string&
  3404.       append(const basic_string& __str, size_type __pos, size_type __n);
  3405.  
  3406.       /**
  3407.        *  @brief  Append a C substring.
  3408.        *  @param __s  The C string to append.
  3409.        *  @param __n  The number of characters to append.
  3410.        *  @return  Reference to this string.
  3411.        */
  3412.       basic_string&
  3413.       append(const _CharT* __s, size_type __n);
  3414.  
  3415.       /**
  3416.        *  @brief  Append a C string.
  3417.        *  @param __s  The C string to append.
  3418.        *  @return  Reference to this string.
  3419.        */
  3420.       basic_string&
  3421.       append(const _CharT* __s)
  3422.       {
  3423.         __glibcxx_requires_string(__s);
  3424.         return this->append(__s, traits_type::length(__s));
  3425.       }
  3426.  
  3427.       /**
  3428.        *  @brief  Append multiple characters.
  3429.        *  @param __n  The number of characters to append.
  3430.        *  @param __c  The character to use.
  3431.        *  @return  Reference to this string.
  3432.        *
  3433.        *  Appends __n copies of __c to this string.
  3434.        */
  3435.       basic_string&
  3436.       append(size_type __n, _CharT __c);
  3437.  
  3438. #if __cplusplus >= 201103L
  3439.       /**
  3440.        *  @brief  Append an initializer_list of characters.
  3441.        *  @param __l  The initializer_list of characters to append.
  3442.        *  @return  Reference to this string.
  3443.        */
  3444.       basic_string&
  3445.       append(initializer_list<_CharT> __l)
  3446.       { return this->append(__l.begin(), __l.size()); }
  3447. #endif // C++11
  3448.  
  3449.       /**
  3450.        *  @brief  Append a range of characters.
  3451.        *  @param __first  Iterator referencing the first character to append.
  3452.        *  @param __last  Iterator marking the end of the range.
  3453.        *  @return  Reference to this string.
  3454.        *
  3455.        *  Appends characters in the range [__first,__last) to this string.
  3456.        */
  3457.       template<class _InputIterator>
  3458.         basic_string&
  3459.         append(_InputIterator __first, _InputIterator __last)
  3460.         { return this->replace(_M_iend(), _M_iend(), __first, __last); }
  3461.  
  3462.       /**
  3463.        *  @brief  Append a single character.
  3464.        *  @param __c  Character to append.
  3465.        */
  3466.       void
  3467.       push_back(_CharT __c)
  3468.       {
  3469.         const size_type __len = 1 + this->size();
  3470.         if (__len > this->capacity() || _M_rep()->_M_is_shared())
  3471.           this->reserve(__len);
  3472.         traits_type::assign(_M_data()[this->size()], __c);
  3473.         _M_rep()->_M_set_length_and_sharable(__len);
  3474.       }
  3475.  
  3476.       /**
  3477.        *  @brief  Set value to contents of another string.
  3478.        *  @param  __str  Source string to use.
  3479.        *  @return  Reference to this string.
  3480.        */
  3481.       basic_string&
  3482.       assign(const basic_string& __str);
  3483.  
  3484. #if __cplusplus >= 201103L
  3485.       /**
  3486.        *  @brief  Set value to contents of another string.
  3487.        *  @param  __str  Source string to use.
  3488.        *  @return  Reference to this string.
  3489.        *
  3490.        *  This function sets this string to the exact contents of @a __str.
  3491.        *  @a __str is a valid, but unspecified string.
  3492.        */
  3493.       // PR 58265, this should be noexcept.
  3494.       basic_string&
  3495.       assign(basic_string&& __str)
  3496.       {
  3497.         this->swap(__str);
  3498.         return *this;
  3499.       }
  3500. #endif // C++11
  3501.  
  3502.       /**
  3503.        *  @brief  Set value to a substring of a string.
  3504.        *  @param __str  The string to use.
  3505.        *  @param __pos  Index of the first character of str.
  3506.        *  @param __n  Number of characters to use.
  3507.        *  @return  Reference to this string.
  3508.        *  @throw  std::out_of_range if @a pos is not a valid index.
  3509.        *
  3510.        *  This function sets this string to the substring of @a __str
  3511.        *  consisting of @a __n characters at @a __pos.  If @a __n is
  3512.        *  is larger than the number of available characters in @a
  3513.        *  __str, the remainder of @a __str is used.
  3514.        */
  3515.       basic_string&
  3516.       assign(const basic_string& __str, size_type __pos, size_type __n)
  3517.       { return this->assign(__str._M_data()
  3518.                             + __str._M_check(__pos, "basic_string::assign"),
  3519.                             __str._M_limit(__pos, __n)); }
  3520.  
  3521.       /**
  3522.        *  @brief  Set value to a C substring.
  3523.        *  @param __s  The C string to use.
  3524.        *  @param __n  Number of characters to use.
  3525.        *  @return  Reference to this string.
  3526.        *
  3527.        *  This function sets the value of this string to the first @a __n
  3528.        *  characters of @a __s.  If @a __n is is larger than the number of
  3529.        *  available characters in @a __s, the remainder of @a __s is used.
  3530.        */
  3531.       basic_string&
  3532.       assign(const _CharT* __s, size_type __n);
  3533.  
  3534.       /**
  3535.        *  @brief  Set value to contents of a C string.
  3536.        *  @param __s  The C string to use.
  3537.        *  @return  Reference to this string.
  3538.        *
  3539.        *  This function sets the value of this string to the value of @a __s.
  3540.        *  The data is copied, so there is no dependence on @a __s once the
  3541.        *  function returns.
  3542.        */
  3543.       basic_string&
  3544.       assign(const _CharT* __s)
  3545.       {
  3546.         __glibcxx_requires_string(__s);
  3547.         return this->assign(__s, traits_type::length(__s));
  3548.       }
  3549.  
  3550.       /**
  3551.        *  @brief  Set value to multiple characters.
  3552.        *  @param __n  Length of the resulting string.
  3553.        *  @param __c  The character to use.
  3554.        *  @return  Reference to this string.
  3555.        *
  3556.        *  This function sets the value of this string to @a __n copies of
  3557.        *  character @a __c.
  3558.        */
  3559.       basic_string&
  3560.       assign(size_type __n, _CharT __c)
  3561.       { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
  3562.  
  3563.       /**
  3564.        *  @brief  Set value to a range of characters.
  3565.        *  @param __first  Iterator referencing the first character to append.
  3566.        *  @param __last  Iterator marking the end of the range.
  3567.        *  @return  Reference to this string.
  3568.        *
  3569.        *  Sets value of string to characters in the range [__first,__last).
  3570.       */
  3571.       template<class _InputIterator>
  3572.         basic_string&
  3573.         assign(_InputIterator __first, _InputIterator __last)
  3574.         { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
  3575.  
  3576. #if __cplusplus >= 201103L
  3577.       /**
  3578.        *  @brief  Set value to an initializer_list of characters.
  3579.        *  @param __l  The initializer_list of characters to assign.
  3580.        *  @return  Reference to this string.
  3581.        */
  3582.       basic_string&
  3583.       assign(initializer_list<_CharT> __l)
  3584.       { return this->assign(__l.begin(), __l.size()); }
  3585. #endif // C++11
  3586.  
  3587.       /**
  3588.        *  @brief  Insert multiple characters.
  3589.        *  @param __p  Iterator referencing location in string to insert at.
  3590.        *  @param __n  Number of characters to insert
  3591.        *  @param __c  The character to insert.
  3592.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3593.        *
  3594.        *  Inserts @a __n copies of character @a __c starting at the
  3595.        *  position referenced by iterator @a __p.  If adding
  3596.        *  characters causes the length to exceed max_size(),
  3597.        *  length_error is thrown.  The value of the string doesn't
  3598.        *  change if an error is thrown.
  3599.       */
  3600.       void
  3601.       insert(iterator __p, size_type __n, _CharT __c)
  3602.       { this->replace(__p, __p, __n, __c);  }
  3603.  
  3604.       /**
  3605.        *  @brief  Insert a range of characters.
  3606.        *  @param __p  Iterator referencing location in string to insert at.
  3607.        *  @param __beg  Start of range.
  3608.        *  @param __end  End of range.
  3609.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3610.        *
  3611.        *  Inserts characters in range [__beg,__end).  If adding
  3612.        *  characters causes the length to exceed max_size(),
  3613.        *  length_error is thrown.  The value of the string doesn't
  3614.        *  change if an error is thrown.
  3615.       */
  3616.       template<class _InputIterator>
  3617.         void
  3618.         insert(iterator __p, _InputIterator __beg, _InputIterator __end)
  3619.         { this->replace(__p, __p, __beg, __end); }
  3620.  
  3621. #if __cplusplus >= 201103L
  3622.       /**
  3623.        *  @brief  Insert an initializer_list of characters.
  3624.        *  @param __p  Iterator referencing location in string to insert at.
  3625.        *  @param __l  The initializer_list of characters to insert.
  3626.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3627.        */
  3628.       void
  3629.       insert(iterator __p, initializer_list<_CharT> __l)
  3630.       {
  3631.         _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
  3632.         this->insert(__p - _M_ibegin(), __l.begin(), __l.size());
  3633.       }
  3634. #endif // C++11
  3635.  
  3636.       /**
  3637.        *  @brief  Insert value of a string.
  3638.        *  @param __pos1  Iterator referencing location in string to insert at.
  3639.        *  @param __str  The string to insert.
  3640.        *  @return  Reference to this string.
  3641.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3642.        *
  3643.        *  Inserts value of @a __str starting at @a __pos1.  If adding
  3644.        *  characters causes the length to exceed max_size(),
  3645.        *  length_error is thrown.  The value of the string doesn't
  3646.        *  change if an error is thrown.
  3647.       */
  3648.       basic_string&
  3649.       insert(size_type __pos1, const basic_string& __str)
  3650.       { return this->insert(__pos1, __str, size_type(0), __str.size()); }
  3651.  
  3652.       /**
  3653.        *  @brief  Insert a substring.
  3654.        *  @param __pos1  Iterator referencing location in string to insert at.
  3655.        *  @param __str  The string to insert.
  3656.        *  @param __pos2  Start of characters in str to insert.
  3657.        *  @param __n  Number of characters to insert.
  3658.        *  @return  Reference to this string.
  3659.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3660.        *  @throw  std::out_of_range  If @a pos1 > size() or
  3661.        *  @a __pos2 > @a str.size().
  3662.        *
  3663.        *  Starting at @a pos1, insert @a __n character of @a __str
  3664.        *  beginning with @a __pos2.  If adding characters causes the
  3665.        *  length to exceed max_size(), length_error is thrown.  If @a
  3666.        *  __pos1 is beyond the end of this string or @a __pos2 is
  3667.        *  beyond the end of @a __str, out_of_range is thrown.  The
  3668.        *  value of the string doesn't change if an error is thrown.
  3669.       */
  3670.       basic_string&
  3671.       insert(size_type __pos1, const basic_string& __str,
  3672.              size_type __pos2, size_type __n)
  3673.       { return this->insert(__pos1, __str._M_data()
  3674.                             + __str._M_check(__pos2, "basic_string::insert"),
  3675.                             __str._M_limit(__pos2, __n)); }
  3676.  
  3677.       /**
  3678.        *  @brief  Insert a C substring.
  3679.        *  @param __pos  Iterator referencing location in string to insert at.
  3680.        *  @param __s  The C string to insert.
  3681.        *  @param __n  The number of characters to insert.
  3682.        *  @return  Reference to this string.
  3683.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3684.        *  @throw  std::out_of_range  If @a __pos is beyond the end of this
  3685.        *  string.
  3686.        *
  3687.        *  Inserts the first @a __n characters of @a __s starting at @a
  3688.        *  __pos.  If adding characters causes the length to exceed
  3689.        *  max_size(), length_error is thrown.  If @a __pos is beyond
  3690.        *  end(), out_of_range is thrown.  The value of the string
  3691.        *  doesn't change if an error is thrown.
  3692.       */
  3693.       basic_string&
  3694.       insert(size_type __pos, const _CharT* __s, size_type __n);
  3695.  
  3696.       /**
  3697.        *  @brief  Insert a C string.
  3698.        *  @param __pos  Iterator referencing location in string to insert at.
  3699.        *  @param __s  The C string to insert.
  3700.        *  @return  Reference to this string.
  3701.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3702.        *  @throw  std::out_of_range  If @a pos is beyond the end of this
  3703.        *  string.
  3704.        *
  3705.        *  Inserts the first @a n characters of @a __s starting at @a __pos.  If
  3706.        *  adding characters causes the length to exceed max_size(),
  3707.        *  length_error is thrown.  If @a __pos is beyond end(), out_of_range is
  3708.        *  thrown.  The value of the string doesn't change if an error is
  3709.        *  thrown.
  3710.       */
  3711.       basic_string&
  3712.       insert(size_type __pos, const _CharT* __s)
  3713.       {
  3714.         __glibcxx_requires_string(__s);
  3715.         return this->insert(__pos, __s, traits_type::length(__s));
  3716.       }
  3717.  
  3718.       /**
  3719.        *  @brief  Insert multiple characters.
  3720.        *  @param __pos  Index in string to insert at.
  3721.        *  @param __n  Number of characters to insert
  3722.        *  @param __c  The character to insert.
  3723.        *  @return  Reference to this string.
  3724.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3725.        *  @throw  std::out_of_range  If @a __pos is beyond the end of this
  3726.        *  string.
  3727.        *
  3728.        *  Inserts @a __n copies of character @a __c starting at index
  3729.        *  @a __pos.  If adding characters causes the length to exceed
  3730.        *  max_size(), length_error is thrown.  If @a __pos > length(),
  3731.        *  out_of_range is thrown.  The value of the string doesn't
  3732.        *  change if an error is thrown.
  3733.       */
  3734.       basic_string&
  3735.       insert(size_type __pos, size_type __n, _CharT __c)
  3736.       { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
  3737.                               size_type(0), __n, __c); }
  3738.  
  3739.       /**
  3740.        *  @brief  Insert one character.
  3741.        *  @param __p  Iterator referencing position in string to insert at.
  3742.        *  @param __c  The character to insert.
  3743.        *  @return  Iterator referencing newly inserted char.
  3744.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3745.        *
  3746.        *  Inserts character @a __c at position referenced by @a __p.
  3747.        *  If adding character causes the length to exceed max_size(),
  3748.        *  length_error is thrown.  If @a __p is beyond end of string,
  3749.        *  out_of_range is thrown.  The value of the string doesn't
  3750.        *  change if an error is thrown.
  3751.       */
  3752.       iterator
  3753.       insert(iterator __p, _CharT __c)
  3754.       {
  3755.         _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
  3756.         const size_type __pos = __p - _M_ibegin();
  3757.         _M_replace_aux(__pos, size_type(0), size_type(1), __c);
  3758.         _M_rep()->_M_set_leaked();
  3759.         return iterator(_M_data() + __pos);
  3760.       }
  3761.  
  3762.       /**
  3763.        *  @brief  Remove characters.
  3764.        *  @param __pos  Index of first character to remove (default 0).
  3765.        *  @param __n  Number of characters to remove (default remainder).
  3766.        *  @return  Reference to this string.
  3767.        *  @throw  std::out_of_range  If @a pos is beyond the end of this
  3768.        *  string.
  3769.        *
  3770.        *  Removes @a __n characters from this string starting at @a
  3771.        *  __pos.  The length of the string is reduced by @a __n.  If
  3772.        *  there are < @a __n characters to remove, the remainder of
  3773.        *  the string is truncated.  If @a __p is beyond end of string,
  3774.        *  out_of_range is thrown.  The value of the string doesn't
  3775.        *  change if an error is thrown.
  3776.       */
  3777.       basic_string&
  3778.       erase(size_type __pos = 0, size_type __n = npos)
  3779.       {
  3780.         _M_mutate(_M_check(__pos, "basic_string::erase"),
  3781.                   _M_limit(__pos, __n), size_type(0));
  3782.         return *this;
  3783.       }
  3784.  
  3785.       /**
  3786.        *  @brief  Remove one character.
  3787.        *  @param __position  Iterator referencing the character to remove.
  3788.        *  @return  iterator referencing same location after removal.
  3789.        *
  3790.        *  Removes the character at @a __position from this string. The value
  3791.        *  of the string doesn't change if an error is thrown.
  3792.       */
  3793.       iterator
  3794.       erase(iterator __position)
  3795.       {
  3796.         _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
  3797.                                  && __position < _M_iend());
  3798.         const size_type __pos = __position - _M_ibegin();
  3799.         _M_mutate(__pos, size_type(1), size_type(0));
  3800.         _M_rep()->_M_set_leaked();
  3801.         return iterator(_M_data() + __pos);
  3802.       }
  3803.  
  3804.       /**
  3805.        *  @brief  Remove a range of characters.
  3806.        *  @param __first  Iterator referencing the first character to remove.
  3807.        *  @param __last  Iterator referencing the end of the range.
  3808.        *  @return  Iterator referencing location of first after removal.
  3809.        *
  3810.        *  Removes the characters in the range [first,last) from this string.
  3811.        *  The value of the string doesn't change if an error is thrown.
  3812.       */
  3813.       iterator
  3814.       erase(iterator __first, iterator __last);
  3815.  
  3816. #if __cplusplus >= 201103L
  3817.       /**
  3818.        *  @brief  Remove the last character.
  3819.        *
  3820.        *  The string must be non-empty.
  3821.        */
  3822.       void
  3823.       pop_back() // FIXME C++11: should be noexcept.
  3824.       { erase(size()-1, 1); }
  3825. #endif // C++11
  3826.  
  3827.       /**
  3828.        *  @brief  Replace characters with value from another string.
  3829.        *  @param __pos  Index of first character to replace.
  3830.        *  @param __n  Number of characters to be replaced.
  3831.        *  @param __str  String to insert.
  3832.        *  @return  Reference to this string.
  3833.        *  @throw  std::out_of_range  If @a pos is beyond the end of this
  3834.        *  string.
  3835.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3836.        *
  3837.        *  Removes the characters in the range [__pos,__pos+__n) from
  3838.        *  this string.  In place, the value of @a __str is inserted.
  3839.        *  If @a __pos is beyond end of string, out_of_range is thrown.
  3840.        *  If the length of the result exceeds max_size(), length_error
  3841.        *  is thrown.  The value of the string doesn't change if an
  3842.        *  error is thrown.
  3843.       */
  3844.       basic_string&
  3845.       replace(size_type __pos, size_type __n, const basic_string& __str)
  3846.       { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
  3847.  
  3848.       /**
  3849.        *  @brief  Replace characters with value from another string.
  3850.        *  @param __pos1  Index of first character to replace.
  3851.        *  @param __n1  Number of characters to be replaced.
  3852.        *  @param __str  String to insert.
  3853.        *  @param __pos2  Index of first character of str to use.
  3854.        *  @param __n2  Number of characters from str to use.
  3855.        *  @return  Reference to this string.
  3856.        *  @throw  std::out_of_range  If @a __pos1 > size() or @a __pos2 >
  3857.        *  __str.size().
  3858.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3859.        *
  3860.        *  Removes the characters in the range [__pos1,__pos1 + n) from this
  3861.        *  string.  In place, the value of @a __str is inserted.  If @a __pos is
  3862.        *  beyond end of string, out_of_range is thrown.  If the length of the
  3863.        *  result exceeds max_size(), length_error is thrown.  The value of the
  3864.        *  string doesn't change if an error is thrown.
  3865.       */
  3866.       basic_string&
  3867.       replace(size_type __pos1, size_type __n1, const basic_string& __str,
  3868.               size_type __pos2, size_type __n2)
  3869.       { return this->replace(__pos1, __n1, __str._M_data()
  3870.                              + __str._M_check(__pos2, "basic_string::replace"),
  3871.                              __str._M_limit(__pos2, __n2)); }
  3872.  
  3873.       /**
  3874.        *  @brief  Replace characters with value of a C substring.
  3875.        *  @param __pos  Index of first character to replace.
  3876.        *  @param __n1  Number of characters to be replaced.
  3877.        *  @param __s  C string to insert.
  3878.        *  @param __n2  Number of characters from @a s to use.
  3879.        *  @return  Reference to this string.
  3880.        *  @throw  std::out_of_range  If @a pos1 > size().
  3881.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3882.        *
  3883.        *  Removes the characters in the range [__pos,__pos + __n1)
  3884.        *  from this string.  In place, the first @a __n2 characters of
  3885.        *  @a __s are inserted, or all of @a __s if @a __n2 is too large.  If
  3886.        *  @a __pos is beyond end of string, out_of_range is thrown.  If
  3887.        *  the length of result exceeds max_size(), length_error is
  3888.        *  thrown.  The value of the string doesn't change if an error
  3889.        *  is thrown.
  3890.       */
  3891.       basic_string&
  3892.       replace(size_type __pos, size_type __n1, const _CharT* __s,
  3893.               size_type __n2);
  3894.  
  3895.       /**
  3896.        *  @brief  Replace characters with value of a C string.
  3897.        *  @param __pos  Index of first character to replace.
  3898.        *  @param __n1  Number of characters to be replaced.
  3899.        *  @param __s  C string to insert.
  3900.        *  @return  Reference to this string.
  3901.        *  @throw  std::out_of_range  If @a pos > size().
  3902.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3903.        *
  3904.        *  Removes the characters in the range [__pos,__pos + __n1)
  3905.        *  from this string.  In place, the characters of @a __s are
  3906.        *  inserted.  If @a __pos is beyond end of string, out_of_range
  3907.        *  is thrown.  If the length of result exceeds max_size(),
  3908.        *  length_error is thrown.  The value of the string doesn't
  3909.        *  change if an error is thrown.
  3910.       */
  3911.       basic_string&
  3912.       replace(size_type __pos, size_type __n1, const _CharT* __s)
  3913.       {
  3914.         __glibcxx_requires_string(__s);
  3915.         return this->replace(__pos, __n1, __s, traits_type::length(__s));
  3916.       }
  3917.  
  3918.       /**
  3919.        *  @brief  Replace characters with multiple characters.
  3920.        *  @param __pos  Index of first character to replace.
  3921.        *  @param __n1  Number of characters to be replaced.
  3922.        *  @param __n2  Number of characters to insert.
  3923.        *  @param __c  Character to insert.
  3924.        *  @return  Reference to this string.
  3925.        *  @throw  std::out_of_range  If @a __pos > size().
  3926.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3927.        *
  3928.        *  Removes the characters in the range [pos,pos + n1) from this
  3929.        *  string.  In place, @a __n2 copies of @a __c are inserted.
  3930.        *  If @a __pos is beyond end of string, out_of_range is thrown.
  3931.        *  If the length of result exceeds max_size(), length_error is
  3932.        *  thrown.  The value of the string doesn't change if an error
  3933.        *  is thrown.
  3934.       */
  3935.       basic_string&
  3936.       replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
  3937.       { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
  3938.                               _M_limit(__pos, __n1), __n2, __c); }
  3939.  
  3940.       /**
  3941.        *  @brief  Replace range of characters with string.
  3942.        *  @param __i1  Iterator referencing start of range to replace.
  3943.        *  @param __i2  Iterator referencing end of range to replace.
  3944.        *  @param __str  String value to insert.
  3945.        *  @return  Reference to this string.
  3946.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3947.        *
  3948.        *  Removes the characters in the range [__i1,__i2).  In place,
  3949.        *  the value of @a __str is inserted.  If the length of result
  3950.        *  exceeds max_size(), length_error is thrown.  The value of
  3951.        *  the string doesn't change if an error is thrown.
  3952.       */
  3953.       basic_string&
  3954.       replace(iterator __i1, iterator __i2, const basic_string& __str)
  3955.       { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
  3956.  
  3957.       /**
  3958.        *  @brief  Replace range of characters with C substring.
  3959.        *  @param __i1  Iterator referencing start of range to replace.
  3960.        *  @param __i2  Iterator referencing end of range to replace.
  3961.        *  @param __s  C string value to insert.
  3962.        *  @param __n  Number of characters from s to insert.
  3963.        *  @return  Reference to this string.
  3964.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3965.        *
  3966.        *  Removes the characters in the range [__i1,__i2).  In place,
  3967.        *  the first @a __n characters of @a __s are inserted.  If the
  3968.        *  length of result exceeds max_size(), length_error is thrown.
  3969.        *  The value of the string doesn't change if an error is
  3970.        *  thrown.
  3971.       */
  3972.       basic_string&
  3973.       replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
  3974.       {
  3975.         _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
  3976.                                  && __i2 <= _M_iend());
  3977.         return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
  3978.       }
  3979.  
  3980.       /**
  3981.        *  @brief  Replace range of characters with C string.
  3982.        *  @param __i1  Iterator referencing start of range to replace.
  3983.        *  @param __i2  Iterator referencing end of range to replace.
  3984.        *  @param __s  C string value to insert.
  3985.        *  @return  Reference to this string.
  3986.        *  @throw  std::length_error  If new length exceeds @c max_size().
  3987.        *
  3988.        *  Removes the characters in the range [__i1,__i2).  In place,
  3989.        *  the characters of @a __s are inserted.  If the length of
  3990.        *  result exceeds max_size(), length_error is thrown.  The
  3991.        *  value of the string doesn't change if an error is thrown.
  3992.       */
  3993.       basic_string&
  3994.       replace(iterator __i1, iterator __i2, const _CharT* __s)
  3995.       {
  3996.         __glibcxx_requires_string(__s);
  3997.         return this->replace(__i1, __i2, __s, traits_type::length(__s));
  3998.       }
  3999.  
  4000.       /**
  4001.        *  @brief  Replace range of characters with multiple characters
  4002.        *  @param __i1  Iterator referencing start of range to replace.
  4003.        *  @param __i2  Iterator referencing end of range to replace.
  4004.        *  @param __n  Number of characters to insert.
  4005.        *  @param __c  Character to insert.
  4006.        *  @return  Reference to this string.
  4007.        *  @throw  std::length_error  If new length exceeds @c max_size().
  4008.        *
  4009.        *  Removes the characters in the range [__i1,__i2).  In place,
  4010.        *  @a __n copies of @a __c are inserted.  If the length of
  4011.        *  result exceeds max_size(), length_error is thrown.  The
  4012.        *  value of the string doesn't change if an error is thrown.
  4013.       */
  4014.       basic_string&
  4015.       replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
  4016.       {
  4017.         _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
  4018.                                  && __i2 <= _M_iend());
  4019.         return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
  4020.       }
  4021.  
  4022.       /**
  4023.        *  @brief  Replace range of characters with range.
  4024.        *  @param __i1  Iterator referencing start of range to replace.
  4025.        *  @param __i2  Iterator referencing end of range to replace.
  4026.        *  @param __k1  Iterator referencing start of range to insert.
  4027.        *  @param __k2  Iterator referencing end of range to insert.
  4028.        *  @return  Reference to this string.
  4029.        *  @throw  std::length_error  If new length exceeds @c max_size().
  4030.        *
  4031.        *  Removes the characters in the range [__i1,__i2).  In place,
  4032.        *  characters in the range [__k1,__k2) are inserted.  If the
  4033.        *  length of result exceeds max_size(), length_error is thrown.
  4034.        *  The value of the string doesn't change if an error is
  4035.        *  thrown.
  4036.       */
  4037.       template<class _InputIterator>
  4038.         basic_string&
  4039.         replace(iterator __i1, iterator __i2,
  4040.                 _InputIterator __k1, _InputIterator __k2)
  4041.         {
  4042.           _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
  4043.                                    && __i2 <= _M_iend());
  4044.           __glibcxx_requires_valid_range(__k1, __k2);
  4045.           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
  4046.           return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
  4047.         }
  4048.  
  4049.       // Specializations for the common case of pointer and iterator:
  4050.       // useful to avoid the overhead of temporary buffering in _M_replace.
  4051.       basic_string&
  4052.       replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
  4053.       {
  4054.         _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
  4055.                                  && __i2 <= _M_iend());
  4056.         __glibcxx_requires_valid_range(__k1, __k2);
  4057.         return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
  4058.                              __k1, __k2 - __k1);
  4059.       }
  4060.  
  4061.       basic_string&
  4062.       replace(iterator __i1, iterator __i2,
  4063.               const _CharT* __k1, const _CharT* __k2)
  4064.       {
  4065.         _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
  4066.                                  && __i2 <= _M_iend());
  4067.         __glibcxx_requires_valid_range(__k1, __k2);
  4068.         return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
  4069.                              __k1, __k2 - __k1);
  4070.       }
  4071.  
  4072.       basic_string&
  4073.       replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
  4074.       {
  4075.         _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
  4076.                                  && __i2 <= _M_iend());
  4077.         __glibcxx_requires_valid_range(__k1, __k2);
  4078.         return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
  4079.                              __k1.base(), __k2 - __k1);
  4080.       }
  4081.  
  4082.       basic_string&
  4083.       replace(iterator __i1, iterator __i2,
  4084.               const_iterator __k1, const_iterator __k2)
  4085.       {
  4086.         _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
  4087.                                  && __i2 <= _M_iend());
  4088.         __glibcxx_requires_valid_range(__k1, __k2);
  4089.         return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
  4090.                              __k1.base(), __k2 - __k1);
  4091.       }
  4092.      
  4093. #if __cplusplus >= 201103L
  4094.       /**
  4095.        *  @brief  Replace range of characters with initializer_list.
  4096.        *  @param __i1  Iterator referencing start of range to replace.
  4097.        *  @param __i2  Iterator referencing end of range to replace.
  4098.        *  @param __l  The initializer_list of characters to insert.
  4099.        *  @return  Reference to this string.
  4100.        *  @throw  std::length_error  If new length exceeds @c max_size().
  4101.        *
  4102.        *  Removes the characters in the range [__i1,__i2).  In place,
  4103.        *  characters in the range [__k1,__k2) are inserted.  If the
  4104.        *  length of result exceeds max_size(), length_error is thrown.
  4105.        *  The value of the string doesn't change if an error is
  4106.        *  thrown.
  4107.       */
  4108.       basic_string& replace(iterator __i1, iterator __i2,
  4109.                             initializer_list<_CharT> __l)
  4110.       { return this->replace(__i1, __i2, __l.begin(), __l.end()); }
  4111. #endif // C++11
  4112.  
  4113.     private:
  4114.       template<class _Integer>
  4115.         basic_string&
  4116.         _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
  4117.                             _Integer __val, __true_type)
  4118.         { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
  4119.  
  4120.       template<class _InputIterator>
  4121.         basic_string&
  4122.         _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
  4123.                             _InputIterator __k2, __false_type);
  4124.  
  4125.       basic_string&
  4126.       _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
  4127.                      _CharT __c);
  4128.  
  4129.       basic_string&
  4130.       _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
  4131.                       size_type __n2);
  4132.  
  4133.       // _S_construct_aux is used to implement the 21.3.1 para 15 which
  4134.       // requires special behaviour if _InIter is an integral type
  4135.       template<class _InIterator>
  4136.         static _CharT*
  4137.         _S_construct_aux(_InIterator __beg, _InIterator __end,
  4138.                          const _Alloc& __a, __false_type)
  4139.         {
  4140.           typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
  4141.           return _S_construct(__beg, __end, __a, _Tag());
  4142.         }
  4143.  
  4144.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  4145.       // 438. Ambiguity in the "do the right thing" clause
  4146.       template<class _Integer>
  4147.         static _CharT*
  4148.         _S_construct_aux(_Integer __beg, _Integer __end,
  4149.                          const _Alloc& __a, __true_type)
  4150.         { return _S_construct_aux_2(static_cast<size_type>(__beg),
  4151.                                     __end, __a); }
  4152.  
  4153.       static _CharT*
  4154.       _S_construct_aux_2(size_type __req, _CharT __c, const _Alloc& __a)
  4155.       { return _S_construct(__req, __c, __a); }
  4156.  
  4157.       template<class _InIterator>
  4158.         static _CharT*
  4159.         _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
  4160.         {
  4161.           typedef typename std::__is_integer<_InIterator>::__type _Integral;
  4162.           return _S_construct_aux(__beg, __end, __a, _Integral());
  4163.         }
  4164.  
  4165.       // For Input Iterators, used in istreambuf_iterators, etc.
  4166.       template<class _InIterator>
  4167.         static _CharT*
  4168.          _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
  4169.                       input_iterator_tag);
  4170.  
  4171.       // For forward_iterators up to random_access_iterators, used for
  4172.       // string::iterator, _CharT*, etc.
  4173.       template<class _FwdIterator>
  4174.         static _CharT*
  4175.         _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
  4176.                      forward_iterator_tag);
  4177.  
  4178.       static _CharT*
  4179.       _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
  4180.  
  4181.     public:
  4182.  
  4183.       /**
  4184.        *  @brief  Copy substring into C string.
  4185.        *  @param __s  C string to copy value into.
  4186.        *  @param __n  Number of characters to copy.
  4187.        *  @param __pos  Index of first character to copy.
  4188.        *  @return  Number of characters actually copied
  4189.        *  @throw  std::out_of_range  If __pos > size().
  4190.        *
  4191.        *  Copies up to @a __n characters starting at @a __pos into the
  4192.        *  C string @a __s.  If @a __pos is %greater than size(),
  4193.        *  out_of_range is thrown.
  4194.       */
  4195.       size_type
  4196.       copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
  4197.  
  4198.       /**
  4199.        *  @brief  Swap contents with another string.
  4200.        *  @param __s  String to swap with.
  4201.        *
  4202.        *  Exchanges the contents of this string with that of @a __s in constant
  4203.        *  time.
  4204.       */
  4205.       // PR 58265, this should be noexcept.
  4206.       void
  4207.       swap(basic_string& __s);
  4208.  
  4209.       // String operations:
  4210.       /**
  4211.        *  @brief  Return const pointer to null-terminated contents.
  4212.        *
  4213.        *  This is a handle to internal data.  Do not modify or dire things may
  4214.        *  happen.
  4215.       */
  4216.       const _CharT*
  4217.       c_str() const _GLIBCXX_NOEXCEPT
  4218.       { return _M_data(); }
  4219.  
  4220.       /**
  4221.        *  @brief  Return const pointer to contents.
  4222.        *
  4223.        *  This is a handle to internal data.  Do not modify or dire things may
  4224.        *  happen.
  4225.       */
  4226.       const _CharT*
  4227.       data() const _GLIBCXX_NOEXCEPT
  4228.       { return _M_data(); }
  4229.  
  4230.       /**
  4231.        *  @brief  Return copy of allocator used to construct this string.
  4232.       */
  4233.       allocator_type
  4234.       get_allocator() const _GLIBCXX_NOEXCEPT
  4235.       { return _M_dataplus; }
  4236.  
  4237.       /**
  4238.        *  @brief  Find position of a C substring.
  4239.        *  @param __s  C string to locate.
  4240.        *  @param __pos  Index of character to search from.
  4241.        *  @param __n  Number of characters from @a s to search for.
  4242.        *  @return  Index of start of first occurrence.
  4243.        *
  4244.        *  Starting from @a __pos, searches forward for the first @a
  4245.        *  __n characters in @a __s within this string.  If found,
  4246.        *  returns the index where it begins.  If not found, returns
  4247.        *  npos.
  4248.       */
  4249.       size_type
  4250.       find(const _CharT* __s, size_type __pos, size_type __n) const;
  4251.  
  4252.       /**
  4253.        *  @brief  Find position of a string.
  4254.        *  @param __str  String to locate.
  4255.        *  @param __pos  Index of character to search from (default 0).
  4256.        *  @return  Index of start of first occurrence.
  4257.        *
  4258.        *  Starting from @a __pos, searches forward for value of @a __str within
  4259.        *  this string.  If found, returns the index where it begins.  If not
  4260.        *  found, returns npos.
  4261.       */
  4262.       size_type
  4263.       find(const basic_string& __str, size_type __pos = 0) const
  4264.         _GLIBCXX_NOEXCEPT
  4265.       { return this->find(__str.data(), __pos, __str.size()); }
  4266.  
  4267.       /**
  4268.        *  @brief  Find position of a C string.
  4269.        *  @param __s  C string to locate.
  4270.        *  @param __pos  Index of character to search from (default 0).
  4271.        *  @return  Index of start of first occurrence.
  4272.        *
  4273.        *  Starting from @a __pos, searches forward for the value of @a
  4274.        *  __s within this string.  If found, returns the index where
  4275.        *  it begins.  If not found, returns npos.
  4276.       */
  4277.       size_type
  4278.       find(const _CharT* __s, size_type __pos = 0) const
  4279.       {
  4280.         __glibcxx_requires_string(__s);
  4281.         return this->find(__s, __pos, traits_type::length(__s));
  4282.       }
  4283.  
  4284.       /**
  4285.        *  @brief  Find position of a character.
  4286.        *  @param __c  Character to locate.
  4287.        *  @param __pos  Index of character to search from (default 0).
  4288.        *  @return  Index of first occurrence.
  4289.        *
  4290.        *  Starting from @a __pos, searches forward for @a __c within
  4291.        *  this string.  If found, returns the index where it was
  4292.        *  found.  If not found, returns npos.
  4293.       */
  4294.       size_type
  4295.       find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
  4296.  
  4297.       /**
  4298.        *  @brief  Find last position of a string.
  4299.        *  @param __str  String to locate.
  4300.        *  @param __pos  Index of character to search back from (default end).
  4301.        *  @return  Index of start of last occurrence.
  4302.        *
  4303.        *  Starting from @a __pos, searches backward for value of @a
  4304.        *  __str within this string.  If found, returns the index where
  4305.        *  it begins.  If not found, returns npos.
  4306.       */
  4307.       size_type
  4308.       rfind(const basic_string& __str, size_type __pos = npos) const
  4309.         _GLIBCXX_NOEXCEPT
  4310.       { return this->rfind(__str.data(), __pos, __str.size()); }
  4311.  
  4312.       /**
  4313.        *  @brief  Find last position of a C substring.
  4314.        *  @param __s  C string to locate.
  4315.        *  @param __pos  Index of character to search back from.
  4316.        *  @param __n  Number of characters from s to search for.
  4317.        *  @return  Index of start of last occurrence.
  4318.        *
  4319.        *  Starting from @a __pos, searches backward for the first @a
  4320.        *  __n characters in @a __s within this string.  If found,
  4321.        *  returns the index where it begins.  If not found, returns
  4322.        *  npos.
  4323.       */
  4324.       size_type
  4325.       rfind(const _CharT* __s, size_type __pos, size_type __n) const;
  4326.  
  4327.       /**
  4328.        *  @brief  Find last position of a C string.
  4329.        *  @param __s  C string to locate.
  4330.        *  @param __pos  Index of character to start search at (default end).
  4331.        *  @return  Index of start of  last occurrence.
  4332.        *
  4333.        *  Starting from @a __pos, searches backward for the value of
  4334.        *  @a __s within this string.  If found, returns the index
  4335.        *  where it begins.  If not found, returns npos.
  4336.       */
  4337.       size_type
  4338.       rfind(const _CharT* __s, size_type __pos = npos) const
  4339.       {
  4340.         __glibcxx_requires_string(__s);
  4341.         return this->rfind(__s, __pos, traits_type::length(__s));
  4342.       }
  4343.  
  4344.       /**
  4345.        *  @brief  Find last position of a character.
  4346.        *  @param __c  Character to locate.
  4347.        *  @param __pos  Index of character to search back from (default end).
  4348.        *  @return  Index of last occurrence.
  4349.        *
  4350.        *  Starting from @a __pos, searches backward for @a __c within
  4351.        *  this string.  If found, returns the index where it was
  4352.        *  found.  If not found, returns npos.
  4353.       */
  4354.       size_type
  4355.       rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
  4356.  
  4357.       /**
  4358.        *  @brief  Find position of a character of string.
  4359.        *  @param __str  String containing characters to locate.
  4360.        *  @param __pos  Index of character to search from (default 0).
  4361.        *  @return  Index of first occurrence.
  4362.        *
  4363.        *  Starting from @a __pos, searches forward for one of the
  4364.        *  characters of @a __str within this string.  If found,
  4365.        *  returns the index where it was found.  If not found, returns
  4366.        *  npos.
  4367.       */
  4368.       size_type
  4369.       find_first_of(const basic_string& __str, size_type __pos = 0) const
  4370.         _GLIBCXX_NOEXCEPT
  4371.       { return this->find_first_of(__str.data(), __pos, __str.size()); }
  4372.  
  4373.       /**
  4374.        *  @brief  Find position of a character of C substring.
  4375.        *  @param __s  String containing characters to locate.
  4376.        *  @param __pos  Index of character to search from.
  4377.        *  @param __n  Number of characters from s to search for.
  4378.        *  @return  Index of first occurrence.
  4379.        *
  4380.        *  Starting from @a __pos, searches forward for one of the
  4381.        *  first @a __n characters of @a __s within this string.  If
  4382.        *  found, returns the index where it was found.  If not found,
  4383.        *  returns npos.
  4384.       */
  4385.       size_type
  4386.       find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
  4387.  
  4388.       /**
  4389.        *  @brief  Find position of a character of C string.
  4390.        *  @param __s  String containing characters to locate.
  4391.        *  @param __pos  Index of character to search from (default 0).
  4392.        *  @return  Index of first occurrence.
  4393.        *
  4394.        *  Starting from @a __pos, searches forward for one of the
  4395.        *  characters of @a __s within this string.  If found, returns
  4396.        *  the index where it was found.  If not found, returns npos.
  4397.       */
  4398.       size_type
  4399.       find_first_of(const _CharT* __s, size_type __pos = 0) const
  4400.       {
  4401.         __glibcxx_requires_string(__s);
  4402.         return this->find_first_of(__s, __pos, traits_type::length(__s));
  4403.       }
  4404.  
  4405.       /**
  4406.        *  @brief  Find position of a character.
  4407.        *  @param __c  Character to locate.
  4408.        *  @param __pos  Index of character to search from (default 0).
  4409.        *  @return  Index of first occurrence.
  4410.        *
  4411.        *  Starting from @a __pos, searches forward for the character
  4412.        *  @a __c within this string.  If found, returns the index
  4413.        *  where it was found.  If not found, returns npos.
  4414.        *
  4415.        *  Note: equivalent to find(__c, __pos).
  4416.       */
  4417.       size_type
  4418.       find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
  4419.       { return this->find(__c, __pos); }
  4420.  
  4421.       /**
  4422.        *  @brief  Find last position of a character of string.
  4423.        *  @param __str  String containing characters to locate.
  4424.        *  @param __pos  Index of character to search back from (default end).
  4425.        *  @return  Index of last occurrence.
  4426.        *
  4427.        *  Starting from @a __pos, searches backward for one of the
  4428.        *  characters of @a __str within this string.  If found,
  4429.        *  returns the index where it was found.  If not found, returns
  4430.        *  npos.
  4431.       */
  4432.       size_type
  4433.       find_last_of(const basic_string& __str, size_type __pos = npos) const
  4434.         _GLIBCXX_NOEXCEPT
  4435.       { return this->find_last_of(__str.data(), __pos, __str.size()); }
  4436.  
  4437.       /**
  4438.        *  @brief  Find last position of a character of C substring.
  4439.        *  @param __s  C string containing characters to locate.
  4440.        *  @param __pos  Index of character to search back from.
  4441.        *  @param __n  Number of characters from s to search for.
  4442.        *  @return  Index of last occurrence.
  4443.        *
  4444.        *  Starting from @a __pos, searches backward for one of the
  4445.        *  first @a __n characters of @a __s within this string.  If
  4446.        *  found, returns the index where it was found.  If not found,
  4447.        *  returns npos.
  4448.       */
  4449.       size_type
  4450.       find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
  4451.  
  4452.       /**
  4453.        *  @brief  Find last position of a character of C string.
  4454.        *  @param __s  C string containing characters to locate.
  4455.        *  @param __pos  Index of character to search back from (default end).
  4456.        *  @return  Index of last occurrence.
  4457.        *
  4458.        *  Starting from @a __pos, searches backward for one of the
  4459.        *  characters of @a __s within this string.  If found, returns
  4460.        *  the index where it was found.  If not found, returns npos.
  4461.       */
  4462.       size_type
  4463.       find_last_of(const _CharT* __s, size_type __pos = npos) const
  4464.       {
  4465.         __glibcxx_requires_string(__s);
  4466.         return this->find_last_of(__s, __pos, traits_type::length(__s));
  4467.       }
  4468.  
  4469.       /**
  4470.        *  @brief  Find last position of a character.
  4471.        *  @param __c  Character to locate.
  4472.        *  @param __pos  Index of character to search back from (default end).
  4473.        *  @return  Index of last occurrence.
  4474.        *
  4475.        *  Starting from @a __pos, searches backward for @a __c within
  4476.        *  this string.  If found, returns the index where it was
  4477.        *  found.  If not found, returns npos.
  4478.        *
  4479.        *  Note: equivalent to rfind(__c, __pos).
  4480.       */
  4481.       size_type
  4482.       find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
  4483.       { return this->rfind(__c, __pos); }
  4484.  
  4485.       /**
  4486.        *  @brief  Find position of a character not in string.
  4487.        *  @param __str  String containing characters to avoid.
  4488.        *  @param __pos  Index of character to search from (default 0).
  4489.        *  @return  Index of first occurrence.
  4490.        *
  4491.        *  Starting from @a __pos, searches forward for a character not contained
  4492.        *  in @a __str within this string.  If found, returns the index where it
  4493.        *  was found.  If not found, returns npos.
  4494.       */
  4495.       size_type
  4496.       find_first_not_of(const basic_string& __str, size_type __pos = 0) const
  4497.         _GLIBCXX_NOEXCEPT
  4498.       { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
  4499.  
  4500.       /**
  4501.        *  @brief  Find position of a character not in C substring.
  4502.        *  @param __s  C string containing characters to avoid.
  4503.        *  @param __pos  Index of character to search from.
  4504.        *  @param __n  Number of characters from __s to consider.
  4505.        *  @return  Index of first occurrence.
  4506.        *
  4507.        *  Starting from @a __pos, searches forward for a character not
  4508.        *  contained in the first @a __n characters of @a __s within
  4509.        *  this string.  If found, returns the index where it was
  4510.        *  found.  If not found, returns npos.
  4511.       */
  4512.       size_type
  4513.       find_first_not_of(const _CharT* __s, size_type __pos,
  4514.                         size_type __n) const;
  4515.  
  4516.       /**
  4517.        *  @brief  Find position of a character not in C string.
  4518.        *  @param __s  C string containing characters to avoid.
  4519.        *  @param __pos  Index of character to search from (default 0).
  4520.        *  @return  Index of first occurrence.
  4521.        *
  4522.        *  Starting from @a __pos, searches forward for a character not
  4523.        *  contained in @a __s within this string.  If found, returns
  4524.        *  the index where it was found.  If not found, returns npos.
  4525.       */
  4526.       size_type
  4527.       find_first_not_of(const _CharT* __s, size_type __pos = 0) const
  4528.       {
  4529.         __glibcxx_requires_string(__s);
  4530.         return this->find_first_not_of(__s, __pos, traits_type::length(__s));
  4531.       }
  4532.  
  4533.       /**
  4534.        *  @brief  Find position of a different character.
  4535.        *  @param __c  Character to avoid.
  4536.        *  @param __pos  Index of character to search from (default 0).
  4537.        *  @return  Index of first occurrence.
  4538.        *
  4539.        *  Starting from @a __pos, searches forward for a character
  4540.        *  other than @a __c within this string.  If found, returns the
  4541.        *  index where it was found.  If not found, returns npos.
  4542.       */
  4543.       size_type
  4544.       find_first_not_of(_CharT __c, size_type __pos = 0) const
  4545.         _GLIBCXX_NOEXCEPT;
  4546.  
  4547.       /**
  4548.        *  @brief  Find last position of a character not in string.
  4549.        *  @param __str  String containing characters to avoid.
  4550.        *  @param __pos  Index of character to search back from (default end).
  4551.        *  @return  Index of last occurrence.
  4552.        *
  4553.        *  Starting from @a __pos, searches backward for a character
  4554.        *  not contained in @a __str within this string.  If found,
  4555.        *  returns the index where it was found.  If not found, returns
  4556.        *  npos.
  4557.       */
  4558.       size_type
  4559.       find_last_not_of(const basic_string& __str, size_type __pos = npos) const
  4560.         _GLIBCXX_NOEXCEPT
  4561.       { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
  4562.  
  4563.       /**
  4564.        *  @brief  Find last position of a character not in C substring.
  4565.        *  @param __s  C string containing characters to avoid.
  4566.        *  @param __pos  Index of character to search back from.
  4567.        *  @param __n  Number of characters from s to consider.
  4568.        *  @return  Index of last occurrence.
  4569.        *
  4570.        *  Starting from @a __pos, searches backward for a character not
  4571.        *  contained in the first @a __n characters of @a __s within this string.
  4572.        *  If found, returns the index where it was found.  If not found,
  4573.        *  returns npos.
  4574.       */
  4575.       size_type
  4576.       find_last_not_of(const _CharT* __s, size_type __pos,
  4577.                        size_type __n) const;
  4578.       /**
  4579.        *  @brief  Find last position of a character not in C string.
  4580.        *  @param __s  C string containing characters to avoid.
  4581.        *  @param __pos  Index of character to search back from (default end).
  4582.        *  @return  Index of last occurrence.
  4583.        *
  4584.        *  Starting from @a __pos, searches backward for a character
  4585.        *  not contained in @a __s within this string.  If found,
  4586.        *  returns the index where it was found.  If not found, returns
  4587.        *  npos.
  4588.       */
  4589.       size_type
  4590.       find_last_not_of(const _CharT* __s, size_type __pos = npos) const
  4591.       {
  4592.         __glibcxx_requires_string(__s);
  4593.         return this->find_last_not_of(__s, __pos, traits_type::length(__s));
  4594.       }
  4595.  
  4596.       /**
  4597.        *  @brief  Find last position of a different character.
  4598.        *  @param __c  Character to avoid.
  4599.        *  @param __pos  Index of character to search back from (default end).
  4600.        *  @return  Index of last occurrence.
  4601.        *
  4602.        *  Starting from @a __pos, searches backward for a character other than
  4603.        *  @a __c within this string.  If found, returns the index where it was
  4604.        *  found.  If not found, returns npos.
  4605.       */
  4606.       size_type
  4607.       find_last_not_of(_CharT __c, size_type __pos = npos) const
  4608.         _GLIBCXX_NOEXCEPT;
  4609.  
  4610.       /**
  4611.        *  @brief  Get a substring.
  4612.        *  @param __pos  Index of first character (default 0).
  4613.        *  @param __n  Number of characters in substring (default remainder).
  4614.        *  @return  The new string.
  4615.        *  @throw  std::out_of_range  If __pos > size().
  4616.        *
  4617.        *  Construct and return a new string using the @a __n
  4618.        *  characters starting at @a __pos.  If the string is too
  4619.        *  short, use the remainder of the characters.  If @a __pos is
  4620.        *  beyond the end of the string, out_of_range is thrown.
  4621.       */
  4622.       basic_string
  4623.       substr(size_type __pos = 0, size_type __n = npos) const
  4624.       { return basic_string(*this,
  4625.                             _M_check(__pos, "basic_string::substr"), __n); }
  4626.  
  4627.       /**
  4628.        *  @brief  Compare to a string.
  4629.        *  @param __str  String to compare against.
  4630.        *  @return  Integer < 0, 0, or > 0.
  4631.        *
  4632.        *  Returns an integer < 0 if this string is ordered before @a
  4633.        *  __str, 0 if their values are equivalent, or > 0 if this
  4634.        *  string is ordered after @a __str.  Determines the effective
  4635.        *  length rlen of the strings to compare as the smallest of
  4636.        *  size() and str.size().  The function then compares the two
  4637.        *  strings by calling traits::compare(data(), str.data(),rlen).
  4638.        *  If the result of the comparison is nonzero returns it,
  4639.        *  otherwise the shorter one is ordered first.
  4640.       */
  4641.       int
  4642.       compare(const basic_string& __str) const
  4643.       {
  4644.         const size_type __size = this->size();
  4645.         const size_type __osize = __str.size();
  4646.         const size_type __len = std::min(__size, __osize);
  4647.  
  4648.         int __r = traits_type::compare(_M_data(), __str.data(), __len);
  4649.         if (!__r)
  4650.           __r = _S_compare(__size, __osize);
  4651.         return __r;
  4652.       }
  4653.  
  4654.       /**
  4655.        *  @brief  Compare substring to a string.
  4656.        *  @param __pos  Index of first character of substring.
  4657.        *  @param __n  Number of characters in substring.
  4658.        *  @param __str  String to compare against.
  4659.        *  @return  Integer < 0, 0, or > 0.
  4660.        *
  4661.        *  Form the substring of this string from the @a __n characters
  4662.        *  starting at @a __pos.  Returns an integer < 0 if the
  4663.        *  substring is ordered before @a __str, 0 if their values are
  4664.        *  equivalent, or > 0 if the substring is ordered after @a
  4665.        *  __str.  Determines the effective length rlen of the strings
  4666.        *  to compare as the smallest of the length of the substring
  4667.        *  and @a __str.size().  The function then compares the two
  4668.        *  strings by calling
  4669.        *  traits::compare(substring.data(),str.data(),rlen).  If the
  4670.        *  result of the comparison is nonzero returns it, otherwise
  4671.        *  the shorter one is ordered first.
  4672.       */
  4673.       int
  4674.       compare(size_type __pos, size_type __n, const basic_string& __str) const;
  4675.  
  4676.       /**
  4677.        *  @brief  Compare substring to a substring.
  4678.        *  @param __pos1  Index of first character of substring.
  4679.        *  @param __n1  Number of characters in substring.
  4680.        *  @param __str  String to compare against.
  4681.        *  @param __pos2  Index of first character of substring of str.
  4682.        *  @param __n2  Number of characters in substring of str.
  4683.        *  @return  Integer < 0, 0, or > 0.
  4684.        *
  4685.        *  Form the substring of this string from the @a __n1
  4686.        *  characters starting at @a __pos1.  Form the substring of @a
  4687.        *  __str from the @a __n2 characters starting at @a __pos2.
  4688.        *  Returns an integer < 0 if this substring is ordered before
  4689.        *  the substring of @a __str, 0 if their values are equivalent,
  4690.        *  or > 0 if this substring is ordered after the substring of
  4691.        *  @a __str.  Determines the effective length rlen of the
  4692.        *  strings to compare as the smallest of the lengths of the
  4693.        *  substrings.  The function then compares the two strings by
  4694.        *  calling
  4695.        *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
  4696.        *  If the result of the comparison is nonzero returns it,
  4697.        *  otherwise the shorter one is ordered first.
  4698.       */
  4699.       int
  4700.       compare(size_type __pos1, size_type __n1, const basic_string& __str,
  4701.               size_type __pos2, size_type __n2) const;
  4702.  
  4703.       /**
  4704.        *  @brief  Compare to a C string.
  4705.        *  @param __s  C string to compare against.
  4706.        *  @return  Integer < 0, 0, or > 0.
  4707.        *
  4708.        *  Returns an integer < 0 if this string is ordered before @a __s, 0 if
  4709.        *  their values are equivalent, or > 0 if this string is ordered after
  4710.        *  @a __s.  Determines the effective length rlen of the strings to
  4711.        *  compare as the smallest of size() and the length of a string
  4712.        *  constructed from @a __s.  The function then compares the two strings
  4713.        *  by calling traits::compare(data(),s,rlen).  If the result of the
  4714.        *  comparison is nonzero returns it, otherwise the shorter one is
  4715.        *  ordered first.
  4716.       */
  4717.       int
  4718.       compare(const _CharT* __s) const;
  4719.  
  4720.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  4721.       // 5 String::compare specification questionable
  4722.       /**
  4723.        *  @brief  Compare substring to a C string.
  4724.        *  @param __pos  Index of first character of substring.
  4725.        *  @param __n1  Number of characters in substring.
  4726.        *  @param __s  C string to compare against.
  4727.        *  @return  Integer < 0, 0, or > 0.
  4728.        *
  4729.        *  Form the substring of this string from the @a __n1
  4730.        *  characters starting at @a pos.  Returns an integer < 0 if
  4731.        *  the substring is ordered before @a __s, 0 if their values
  4732.        *  are equivalent, or > 0 if the substring is ordered after @a
  4733.        *  __s.  Determines the effective length rlen of the strings to
  4734.        *  compare as the smallest of the length of the substring and
  4735.        *  the length of a string constructed from @a __s.  The
  4736.        *  function then compares the two string by calling
  4737.        *  traits::compare(substring.data(),__s,rlen).  If the result of
  4738.        *  the comparison is nonzero returns it, otherwise the shorter
  4739.        *  one is ordered first.
  4740.       */
  4741.       int
  4742.       compare(size_type __pos, size_type __n1, const _CharT* __s) const;
  4743.  
  4744.       /**
  4745.        *  @brief  Compare substring against a character %array.
  4746.        *  @param __pos  Index of first character of substring.
  4747.        *  @param __n1  Number of characters in substring.
  4748.        *  @param __s  character %array to compare against.
  4749.        *  @param __n2  Number of characters of s.
  4750.        *  @return  Integer < 0, 0, or > 0.
  4751.        *
  4752.        *  Form the substring of this string from the @a __n1
  4753.        *  characters starting at @a __pos.  Form a string from the
  4754.        *  first @a __n2 characters of @a __s.  Returns an integer < 0
  4755.        *  if this substring is ordered before the string from @a __s,
  4756.        *  0 if their values are equivalent, or > 0 if this substring
  4757.        *  is ordered after the string from @a __s.  Determines the
  4758.        *  effective length rlen of the strings to compare as the
  4759.        *  smallest of the length of the substring and @a __n2.  The
  4760.        *  function then compares the two strings by calling
  4761.        *  traits::compare(substring.data(),s,rlen).  If the result of
  4762.        *  the comparison is nonzero returns it, otherwise the shorter
  4763.        *  one is ordered first.
  4764.        *
  4765.        *  NB: s must have at least n2 characters, &apos;\\0&apos; has
  4766.        *  no special meaning.
  4767.       */
  4768.       int
  4769.       compare(size_type __pos, size_type __n1, const _CharT* __s,
  4770.               size_type __n2) const;
  4771.   };
  4772. #endif  // !_GLIBCXX_USE_CXX11_ABI
  4773.  
  4774.   // operator+
  4775.   /**
  4776.    *  @brief  Concatenate two strings.
  4777.    *  @param __lhs  First string.
  4778.    *  @param __rhs  Last string.
  4779.    *  @return  New string with value of @a __lhs followed by @a __rhs.
  4780.    */
  4781.   template<typename _CharT, typename _Traits, typename _Alloc>
  4782.     basic_string<_CharT, _Traits, _Alloc>
  4783.     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  4784.               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  4785.     {
  4786.       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
  4787.       __str.append(__rhs);
  4788.       return __str;
  4789.     }
  4790.  
  4791.   /**
  4792.    *  @brief  Concatenate C string and string.
  4793.    *  @param __lhs  First string.
  4794.    *  @param __rhs  Last string.
  4795.    *  @return  New string with value of @a __lhs followed by @a __rhs.
  4796.    */
  4797.   template<typename _CharT, typename _Traits, typename _Alloc>
  4798.     basic_string<_CharT,_Traits,_Alloc>
  4799.     operator+(const _CharT* __lhs,
  4800.               const basic_string<_CharT,_Traits,_Alloc>& __rhs);
  4801.  
  4802.   /**
  4803.    *  @brief  Concatenate character and string.
  4804.    *  @param __lhs  First string.
  4805.    *  @param __rhs  Last string.
  4806.    *  @return  New string with @a __lhs followed by @a __rhs.
  4807.    */
  4808.   template<typename _CharT, typename _Traits, typename _Alloc>
  4809.     basic_string<_CharT,_Traits,_Alloc>
  4810.     operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
  4811.  
  4812.   /**
  4813.    *  @brief  Concatenate string and C string.
  4814.    *  @param __lhs  First string.
  4815.    *  @param __rhs  Last string.
  4816.    *  @return  New string with @a __lhs followed by @a __rhs.
  4817.    */
  4818.   template<typename _CharT, typename _Traits, typename _Alloc>
  4819.     inline basic_string<_CharT, _Traits, _Alloc>
  4820.     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  4821.               const _CharT* __rhs)
  4822.     {
  4823.       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
  4824.       __str.append(__rhs);
  4825.       return __str;
  4826.     }
  4827.  
  4828.   /**
  4829.    *  @brief  Concatenate string and character.
  4830.    *  @param __lhs  First string.
  4831.    *  @param __rhs  Last string.
  4832.    *  @return  New string with @a __lhs followed by @a __rhs.
  4833.    */
  4834.   template<typename _CharT, typename _Traits, typename _Alloc>
  4835.     inline basic_string<_CharT, _Traits, _Alloc>
  4836.     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
  4837.     {
  4838.       typedef basic_string<_CharT, _Traits, _Alloc>     __string_type;
  4839.       typedef typename __string_type::size_type         __size_type;
  4840.       __string_type __str(__lhs);
  4841.       __str.append(__size_type(1), __rhs);
  4842.       return __str;
  4843.     }
  4844.  
  4845. #if __cplusplus >= 201103L
  4846.   template<typename _CharT, typename _Traits, typename _Alloc>
  4847.     inline basic_string<_CharT, _Traits, _Alloc>
  4848.     operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
  4849.               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  4850.     { return std::move(__lhs.append(__rhs)); }
  4851.  
  4852.   template<typename _CharT, typename _Traits, typename _Alloc>
  4853.     inline basic_string<_CharT, _Traits, _Alloc>
  4854.     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  4855.               basic_string<_CharT, _Traits, _Alloc>&& __rhs)
  4856.     { return std::move(__rhs.insert(0, __lhs)); }
  4857.  
  4858.   template<typename _CharT, typename _Traits, typename _Alloc>
  4859.     inline basic_string<_CharT, _Traits, _Alloc>
  4860.     operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
  4861.               basic_string<_CharT, _Traits, _Alloc>&& __rhs)
  4862.     {
  4863.       const auto __size = __lhs.size() + __rhs.size();
  4864.       const bool __cond = (__size > __lhs.capacity()
  4865.                            && __size <= __rhs.capacity());
  4866.       return __cond ? std::move(__rhs.insert(0, __lhs))
  4867.                     : std::move(__lhs.append(__rhs));
  4868.     }
  4869.  
  4870.   template<typename _CharT, typename _Traits, typename _Alloc>
  4871.     inline basic_string<_CharT, _Traits, _Alloc>
  4872.     operator+(const _CharT* __lhs,
  4873.               basic_string<_CharT, _Traits, _Alloc>&& __rhs)
  4874.     { return std::move(__rhs.insert(0, __lhs)); }
  4875.  
  4876.   template<typename _CharT, typename _Traits, typename _Alloc>
  4877.     inline basic_string<_CharT, _Traits, _Alloc>
  4878.     operator+(_CharT __lhs,
  4879.               basic_string<_CharT, _Traits, _Alloc>&& __rhs)
  4880.     { return std::move(__rhs.insert(0, 1, __lhs)); }
  4881.  
  4882.   template<typename _CharT, typename _Traits, typename _Alloc>
  4883.     inline basic_string<_CharT, _Traits, _Alloc>
  4884.     operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
  4885.               const _CharT* __rhs)
  4886.     { return std::move(__lhs.append(__rhs)); }
  4887.  
  4888.   template<typename _CharT, typename _Traits, typename _Alloc>
  4889.     inline basic_string<_CharT, _Traits, _Alloc>
  4890.     operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
  4891.               _CharT __rhs)
  4892.     { return std::move(__lhs.append(1, __rhs)); }
  4893. #endif
  4894.  
  4895.   // operator ==
  4896.   /**
  4897.    *  @brief  Test equivalence of two strings.
  4898.    *  @param __lhs  First string.
  4899.    *  @param __rhs  Second string.
  4900.    *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
  4901.    */
  4902.   template<typename _CharT, typename _Traits, typename _Alloc>
  4903.     inline bool
  4904.     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  4905.                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  4906.     { return __lhs.compare(__rhs) == 0; }
  4907.  
  4908.   template<typename _CharT>
  4909.     inline
  4910.     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
  4911.     operator==(const basic_string<_CharT>& __lhs,
  4912.                const basic_string<_CharT>& __rhs)
  4913.     { return (__lhs.size() == __rhs.size()
  4914.               && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
  4915.                                                     __lhs.size())); }
  4916.  
  4917.   /**
  4918.    *  @brief  Test equivalence of C string and string.
  4919.    *  @param __lhs  C string.
  4920.    *  @param __rhs  String.
  4921.    *  @return  True if @a __rhs.compare(@a __lhs) == 0.  False otherwise.
  4922.    */
  4923.   template<typename _CharT, typename _Traits, typename _Alloc>
  4924.     inline bool
  4925.     operator==(const _CharT* __lhs,
  4926.                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  4927.     { return __rhs.compare(__lhs) == 0; }
  4928.  
  4929.   /**
  4930.    *  @brief  Test equivalence of string and C string.
  4931.    *  @param __lhs  String.
  4932.    *  @param __rhs  C string.
  4933.    *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
  4934.    */
  4935.   template<typename _CharT, typename _Traits, typename _Alloc>
  4936.     inline bool
  4937.     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  4938.                const _CharT* __rhs)
  4939.     { return __lhs.compare(__rhs) == 0; }
  4940.  
  4941.   // operator !=
  4942.   /**
  4943.    *  @brief  Test difference of two strings.
  4944.    *  @param __lhs  First string.
  4945.    *  @param __rhs  Second string.
  4946.    *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
  4947.    */
  4948.   template<typename _CharT, typename _Traits, typename _Alloc>
  4949.     inline bool
  4950.     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  4951.                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  4952.     { return !(__lhs == __rhs); }
  4953.  
  4954.   /**
  4955.    *  @brief  Test difference of C string and string.
  4956.    *  @param __lhs  C string.
  4957.    *  @param __rhs  String.
  4958.    *  @return  True if @a __rhs.compare(@a __lhs) != 0.  False otherwise.
  4959.    */
  4960.   template<typename _CharT, typename _Traits, typename _Alloc>
  4961.     inline bool
  4962.     operator!=(const _CharT* __lhs,
  4963.                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  4964.     { return !(__lhs == __rhs); }
  4965.  
  4966.   /**
  4967.    *  @brief  Test difference of string and C string.
  4968.    *  @param __lhs  String.
  4969.    *  @param __rhs  C string.
  4970.    *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
  4971.    */
  4972.   template<typename _CharT, typename _Traits, typename _Alloc>
  4973.     inline bool
  4974.     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  4975.                const _CharT* __rhs)
  4976.     { return !(__lhs == __rhs); }
  4977.  
  4978.   // operator <
  4979.   /**
  4980.    *  @brief  Test if string precedes string.
  4981.    *  @param __lhs  First string.
  4982.    *  @param __rhs  Second string.
  4983.    *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
  4984.    */
  4985.   template<typename _CharT, typename _Traits, typename _Alloc>
  4986.     inline bool
  4987.     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  4988.               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  4989.     { return __lhs.compare(__rhs) < 0; }
  4990.  
  4991.   /**
  4992.    *  @brief  Test if string precedes C string.
  4993.    *  @param __lhs  String.
  4994.    *  @param __rhs  C string.
  4995.    *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
  4996.    */
  4997.   template<typename _CharT, typename _Traits, typename _Alloc>
  4998.     inline bool
  4999.     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  5000.               const _CharT* __rhs)
  5001.     { return __lhs.compare(__rhs) < 0; }
  5002.  
  5003.   /**
  5004.    *  @brief  Test if C string precedes string.
  5005.    *  @param __lhs  C string.
  5006.    *  @param __rhs  String.
  5007.    *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
  5008.    */
  5009.   template<typename _CharT, typename _Traits, typename _Alloc>
  5010.     inline bool
  5011.     operator<(const _CharT* __lhs,
  5012.               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  5013.     { return __rhs.compare(__lhs) > 0; }
  5014.  
  5015.   // operator >
  5016.   /**
  5017.    *  @brief  Test if string follows string.
  5018.    *  @param __lhs  First string.
  5019.    *  @param __rhs  Second string.
  5020.    *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
  5021.    */
  5022.   template<typename _CharT, typename _Traits, typename _Alloc>
  5023.     inline bool
  5024.     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  5025.               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  5026.     { return __lhs.compare(__rhs) > 0; }
  5027.  
  5028.   /**
  5029.    *  @brief  Test if string follows C string.
  5030.    *  @param __lhs  String.
  5031.    *  @param __rhs  C string.
  5032.    *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
  5033.    */
  5034.   template<typename _CharT, typename _Traits, typename _Alloc>
  5035.     inline bool
  5036.     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  5037.               const _CharT* __rhs)
  5038.     { return __lhs.compare(__rhs) > 0; }
  5039.  
  5040.   /**
  5041.    *  @brief  Test if C string follows string.
  5042.    *  @param __lhs  C string.
  5043.    *  @param __rhs  String.
  5044.    *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
  5045.    */
  5046.   template<typename _CharT, typename _Traits, typename _Alloc>
  5047.     inline bool
  5048.     operator>(const _CharT* __lhs,
  5049.               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  5050.     { return __rhs.compare(__lhs) < 0; }
  5051.  
  5052.   // operator <=
  5053.   /**
  5054.    *  @brief  Test if string doesn't follow string.
  5055.    *  @param __lhs  First string.
  5056.    *  @param __rhs  Second string.
  5057.    *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
  5058.    */
  5059.   template<typename _CharT, typename _Traits, typename _Alloc>
  5060.     inline bool
  5061.     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  5062.                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  5063.     { return __lhs.compare(__rhs) <= 0; }
  5064.  
  5065.   /**
  5066.    *  @brief  Test if string doesn't follow C string.
  5067.    *  @param __lhs  String.
  5068.    *  @param __rhs  C string.
  5069.    *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
  5070.    */
  5071.   template<typename _CharT, typename _Traits, typename _Alloc>
  5072.     inline bool
  5073.     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  5074.                const _CharT* __rhs)
  5075.     { return __lhs.compare(__rhs) <= 0; }
  5076.  
  5077.   /**
  5078.    *  @brief  Test if C string doesn't follow string.
  5079.    *  @param __lhs  C string.
  5080.    *  @param __rhs  String.
  5081.    *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
  5082.    */
  5083.   template<typename _CharT, typename _Traits, typename _Alloc>
  5084.     inline bool
  5085.     operator<=(const _CharT* __lhs,
  5086.                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  5087.     { return __rhs.compare(__lhs) >= 0; }
  5088.  
  5089.   // operator >=
  5090.   /**
  5091.    *  @brief  Test if string doesn't precede string.
  5092.    *  @param __lhs  First string.
  5093.    *  @param __rhs  Second string.
  5094.    *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
  5095.    */
  5096.   template<typename _CharT, typename _Traits, typename _Alloc>
  5097.     inline bool
  5098.     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  5099.                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  5100.     { return __lhs.compare(__rhs) >= 0; }
  5101.  
  5102.   /**
  5103.    *  @brief  Test if string doesn't precede C string.
  5104.    *  @param __lhs  String.
  5105.    *  @param __rhs  C string.
  5106.    *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
  5107.    */
  5108.   template<typename _CharT, typename _Traits, typename _Alloc>
  5109.     inline bool
  5110.     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
  5111.                const _CharT* __rhs)
  5112.     { return __lhs.compare(__rhs) >= 0; }
  5113.  
  5114.   /**
  5115.    *  @brief  Test if C string doesn't precede string.
  5116.    *  @param __lhs  C string.
  5117.    *  @param __rhs  String.
  5118.    *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
  5119.    */
  5120.   template<typename _CharT, typename _Traits, typename _Alloc>
  5121.     inline bool
  5122.     operator>=(const _CharT* __lhs,
  5123.              const basic_string<_CharT, _Traits, _Alloc>& __rhs)
  5124.     { return __rhs.compare(__lhs) <= 0; }
  5125.  
  5126.   /**
  5127.    *  @brief  Swap contents of two strings.
  5128.    *  @param __lhs  First string.
  5129.    *  @param __rhs  Second string.
  5130.    *
  5131.    *  Exchanges the contents of @a __lhs and @a __rhs in constant time.
  5132.    */
  5133.   template<typename _CharT, typename _Traits, typename _Alloc>
  5134.     inline void
  5135.     swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
  5136.          basic_string<_CharT, _Traits, _Alloc>& __rhs)
  5137.     { __lhs.swap(__rhs); }
  5138.  
  5139.  
  5140.   /**
  5141.    *  @brief  Read stream into a string.
  5142.    *  @param __is  Input stream.
  5143.    *  @param __str  Buffer to store into.
  5144.    *  @return  Reference to the input stream.
  5145.    *
  5146.    *  Stores characters from @a __is into @a __str until whitespace is
  5147.    *  found, the end of the stream is encountered, or str.max_size()
  5148.    *  is reached.  If is.width() is non-zero, that is the limit on the
  5149.    *  number of characters stored into @a __str.  Any previous
  5150.    *  contents of @a __str are erased.
  5151.    */
  5152.   template<typename _CharT, typename _Traits, typename _Alloc>
  5153.     basic_istream<_CharT, _Traits>&
  5154.     operator>>(basic_istream<_CharT, _Traits>& __is,
  5155.                basic_string<_CharT, _Traits, _Alloc>& __str);
  5156.  
  5157.   template<>
  5158.     basic_istream<char>&
  5159.     operator>>(basic_istream<char>& __is, basic_string<char>& __str);
  5160.  
  5161.   /**
  5162.    *  @brief  Write string to a stream.
  5163.    *  @param __os  Output stream.
  5164.    *  @param __str  String to write out.
  5165.    *  @return  Reference to the output stream.
  5166.    *
  5167.    *  Output characters of @a __str into os following the same rules as for
  5168.    *  writing a C string.
  5169.    */
  5170.   template<typename _CharT, typename _Traits, typename _Alloc>
  5171.     inline basic_ostream<_CharT, _Traits>&
  5172.     operator<<(basic_ostream<_CharT, _Traits>& __os,
  5173.                const basic_string<_CharT, _Traits, _Alloc>& __str)
  5174.     {
  5175.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  5176.       // 586. string inserter not a formatted function
  5177.       return __ostream_insert(__os, __str.data(), __str.size());
  5178.     }
  5179.  
  5180.   /**
  5181.    *  @brief  Read a line from stream into a string.
  5182.    *  @param __is  Input stream.
  5183.    *  @param __str  Buffer to store into.
  5184.    *  @param __delim  Character marking end of line.
  5185.    *  @return  Reference to the input stream.
  5186.    *
  5187.    *  Stores characters from @a __is into @a __str until @a __delim is
  5188.    *  found, the end of the stream is encountered, or str.max_size()
  5189.    *  is reached.  Any previous contents of @a __str are erased.  If
  5190.    *  @a __delim is encountered, it is extracted but not stored into
  5191.    *  @a __str.
  5192.    */
  5193.   template<typename _CharT, typename _Traits, typename _Alloc>
  5194.     basic_istream<_CharT, _Traits>&
  5195.     getline(basic_istream<_CharT, _Traits>& __is,
  5196.             basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
  5197.  
  5198.   /**
  5199.    *  @brief  Read a line from stream into a string.
  5200.    *  @param __is  Input stream.
  5201.    *  @param __str  Buffer to store into.
  5202.    *  @return  Reference to the input stream.
  5203.    *
  5204.    *  Stores characters from is into @a __str until &apos;\n&apos; is
  5205.    *  found, the end of the stream is encountered, or str.max_size()
  5206.    *  is reached.  Any previous contents of @a __str are erased.  If
  5207.    *  end of line is encountered, it is extracted but not stored into
  5208.    *  @a __str.
  5209.    */
  5210.   template<typename _CharT, typename _Traits, typename _Alloc>
  5211.     inline basic_istream<_CharT, _Traits>&
  5212.     getline(basic_istream<_CharT, _Traits>& __is,
  5213.             basic_string<_CharT, _Traits, _Alloc>& __str)
  5214.     { return std::getline(__is, __str, __is.widen('\n')); }
  5215.  
  5216. #if __cplusplus >= 201103L
  5217.   /// Read a line from an rvalue stream into a string.
  5218.   template<typename _CharT, typename _Traits, typename _Alloc>
  5219.     inline basic_istream<_CharT, _Traits>&
  5220.     getline(basic_istream<_CharT, _Traits>&& __is,
  5221.             basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
  5222.     { return std::getline(__is, __str, __delim); }
  5223.  
  5224.   /// Read a line from an rvalue stream into a string.
  5225.   template<typename _CharT, typename _Traits, typename _Alloc>
  5226.     inline basic_istream<_CharT, _Traits>&
  5227.     getline(basic_istream<_CharT, _Traits>&& __is,
  5228.             basic_string<_CharT, _Traits, _Alloc>& __str)
  5229.     { return std::getline(__is, __str); }
  5230. #endif
  5231.  
  5232.   template<>
  5233.     basic_istream<char>&
  5234.     getline(basic_istream<char>& __in, basic_string<char>& __str,
  5235.             char __delim);
  5236.  
  5237. #ifdef _GLIBCXX_USE_WCHAR_T
  5238.   template<>
  5239.     basic_istream<wchar_t>&
  5240.     getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
  5241.             wchar_t __delim);
  5242. #endif  
  5243.  
  5244. _GLIBCXX_END_NAMESPACE_VERSION
  5245. } // namespace
  5246.  
  5247. #if __cplusplus >= 201103L && defined(_GLIBCXX_USE_C99)
  5248.  
  5249. #include <ext/string_conversions.h>
  5250.  
  5251. namespace std _GLIBCXX_VISIBILITY(default)
  5252. {
  5253. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  5254. _GLIBCXX_BEGIN_NAMESPACE_CXX11
  5255.  
  5256.   // 21.4 Numeric Conversions [string.conversions].
  5257.   inline int
  5258.   stoi(const string& __str, size_t* __idx = 0, int __base = 10)
  5259.   { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
  5260.                                         __idx, __base); }
  5261.  
  5262.   inline long
  5263.   stol(const string& __str, size_t* __idx = 0, int __base = 10)
  5264.   { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
  5265.                              __idx, __base); }
  5266.  
  5267.   inline unsigned long
  5268.   stoul(const string& __str, size_t* __idx = 0, int __base = 10)
  5269.   { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
  5270.                              __idx, __base); }
  5271.  
  5272.   inline long long
  5273.   stoll(const string& __str, size_t* __idx = 0, int __base = 10)
  5274.   { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
  5275.                              __idx, __base); }
  5276.  
  5277.   inline unsigned long long
  5278.   stoull(const string& __str, size_t* __idx = 0, int __base = 10)
  5279.   { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
  5280.                              __idx, __base); }
  5281.  
  5282.   // NB: strtof vs strtod.
  5283.   inline float
  5284.   stof(const string& __str, size_t* __idx = 0)
  5285.   { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
  5286.  
  5287.   inline double
  5288.   stod(const string& __str, size_t* __idx = 0)
  5289.   { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
  5290.  
  5291.   inline long double
  5292.   stold(const string& __str, size_t* __idx = 0)
  5293.   { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
  5294.  
  5295.   // NB: (v)snprintf vs sprintf.
  5296.  
  5297.   // DR 1261.
  5298.   inline string
  5299.   to_string(int __val)
  5300.   { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int),
  5301.                                            "%d", __val); }
  5302.  
  5303.   inline string
  5304.   to_string(unsigned __val)
  5305.   { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
  5306.                                            4 * sizeof(unsigned),
  5307.                                            "%u", __val); }
  5308.  
  5309.   inline string
  5310.   to_string(long __val)
  5311.   { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long),
  5312.                                            "%ld", __val); }
  5313.  
  5314.   inline string
  5315.   to_string(unsigned long __val)
  5316.   { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
  5317.                                            4 * sizeof(unsigned long),
  5318.                                            "%lu", __val); }
  5319.  
  5320.   inline string
  5321.   to_string(long long __val)
  5322.   { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
  5323.                                            4 * sizeof(long long),
  5324.                                            "%lld", __val); }
  5325.  
  5326.   inline string
  5327.   to_string(unsigned long long __val)
  5328.   { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
  5329.                                            4 * sizeof(unsigned long long),
  5330.                                            "%llu", __val); }
  5331.  
  5332.   inline string
  5333.   to_string(float __val)
  5334.   {
  5335.     const int __n =
  5336.       __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
  5337.     return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
  5338.                                            "%f", __val);
  5339.   }
  5340.  
  5341.   inline string
  5342.   to_string(double __val)
  5343.   {
  5344.     const int __n =
  5345.       __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
  5346.     return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
  5347.                                            "%f", __val);
  5348.   }
  5349.  
  5350.   inline string
  5351.   to_string(long double __val)
  5352.   {
  5353.     const int __n =
  5354.       __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
  5355.     return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
  5356.                                            "%Lf", __val);
  5357.   }
  5358.  
  5359. #ifdef _GLIBCXX_USE_WCHAR_T
  5360.   inline int
  5361.   stoi(const wstring& __str, size_t* __idx = 0, int __base = 10)
  5362.   { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
  5363.                                         __idx, __base); }
  5364.  
  5365.   inline long
  5366.   stol(const wstring& __str, size_t* __idx = 0, int __base = 10)
  5367.   { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
  5368.                              __idx, __base); }
  5369.  
  5370.   inline unsigned long
  5371.   stoul(const wstring& __str, size_t* __idx = 0, int __base = 10)
  5372.   { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
  5373.                              __idx, __base); }
  5374.  
  5375.   inline long long
  5376.   stoll(const wstring& __str, size_t* __idx = 0, int __base = 10)
  5377.   { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
  5378.                              __idx, __base); }
  5379.  
  5380.   inline unsigned long long
  5381.   stoull(const wstring& __str, size_t* __idx = 0, int __base = 10)
  5382.   { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
  5383.                              __idx, __base); }
  5384.  
  5385.   // NB: wcstof vs wcstod.
  5386.   inline float
  5387.   stof(const wstring& __str, size_t* __idx = 0)
  5388.   { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
  5389.  
  5390.   inline double
  5391.   stod(const wstring& __str, size_t* __idx = 0)
  5392.   { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
  5393.  
  5394.   inline long double
  5395.   stold(const wstring& __str, size_t* __idx = 0)
  5396.   { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
  5397.  
  5398. #ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
  5399.   // DR 1261.
  5400.   inline wstring
  5401.   to_wstring(int __val)
  5402.   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(int),
  5403.                                             L"%d", __val); }
  5404.  
  5405.   inline wstring
  5406.   to_wstring(unsigned __val)
  5407.   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
  5408.                                             4 * sizeof(unsigned),
  5409.                                             L"%u", __val); }
  5410.  
  5411.   inline wstring
  5412.   to_wstring(long __val)
  5413.   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(long),
  5414.                                             L"%ld", __val); }
  5415.  
  5416.   inline wstring
  5417.   to_wstring(unsigned long __val)
  5418.   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
  5419.                                             4 * sizeof(unsigned long),
  5420.                                             L"%lu", __val); }
  5421.  
  5422.   inline wstring
  5423.   to_wstring(long long __val)
  5424.   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
  5425.                                             4 * sizeof(long long),
  5426.                                             L"%lld", __val); }
  5427.  
  5428.   inline wstring
  5429.   to_wstring(unsigned long long __val)
  5430.   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
  5431.                                             4 * sizeof(unsigned long long),
  5432.                                             L"%llu", __val); }
  5433.  
  5434.   inline wstring
  5435.   to_wstring(float __val)
  5436.   {
  5437.     const int __n =
  5438.       __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
  5439.     return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
  5440.                                             L"%f", __val);
  5441.   }
  5442.  
  5443.   inline wstring
  5444.   to_wstring(double __val)
  5445.   {
  5446.     const int __n =
  5447.       __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
  5448.     return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
  5449.                                             L"%f", __val);
  5450.   }
  5451.  
  5452.   inline wstring
  5453.   to_wstring(long double __val)
  5454.   {
  5455.     const int __n =
  5456.       __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
  5457.     return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
  5458.                                             L"%Lf", __val);
  5459.   }
  5460. #endif // _GLIBCXX_HAVE_BROKEN_VSWPRINTF
  5461. #endif
  5462.  
  5463. _GLIBCXX_END_NAMESPACE_CXX11
  5464. _GLIBCXX_END_NAMESPACE_VERSION
  5465. } // namespace
  5466.  
  5467. #endif /* C++11 && _GLIBCXX_USE_C99 ... */
  5468.  
  5469. #if __cplusplus >= 201103L
  5470.  
  5471. #include <bits/functional_hash.h>
  5472.  
  5473. namespace std _GLIBCXX_VISIBILITY(default)
  5474. {
  5475. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  5476.  
  5477.   // DR 1182.
  5478.  
  5479. #ifndef _GLIBCXX_COMPATIBILITY_CXX0X
  5480.   /// std::hash specialization for string.
  5481.   template<>
  5482.     struct hash<string>
  5483.     : public __hash_base<size_t, string>
  5484.     {
  5485.       size_t
  5486.       operator()(const string& __s) const noexcept
  5487.       { return std::_Hash_impl::hash(__s.data(), __s.length()); }
  5488.     };
  5489.  
  5490.   template<>
  5491.     struct __is_fast_hash<hash<string>> : std::false_type
  5492.     { };
  5493.  
  5494. #ifdef _GLIBCXX_USE_WCHAR_T
  5495.   /// std::hash specialization for wstring.
  5496.   template<>
  5497.     struct hash<wstring>
  5498.     : public __hash_base<size_t, wstring>
  5499.     {
  5500.       size_t
  5501.       operator()(const wstring& __s) const noexcept
  5502.       { return std::_Hash_impl::hash(__s.data(),
  5503.                                      __s.length() * sizeof(wchar_t)); }
  5504.     };
  5505.  
  5506.   template<>
  5507.     struct __is_fast_hash<hash<wstring>> : std::false_type
  5508.     { };
  5509. #endif
  5510. #endif /* _GLIBCXX_COMPATIBILITY_CXX0X */
  5511.  
  5512. #ifdef _GLIBCXX_USE_C99_STDINT_TR1
  5513.   /// std::hash specialization for u16string.
  5514.   template<>
  5515.     struct hash<u16string>
  5516.     : public __hash_base<size_t, u16string>
  5517.     {
  5518.       size_t
  5519.       operator()(const u16string& __s) const noexcept
  5520.       { return std::_Hash_impl::hash(__s.data(),
  5521.                                      __s.length() * sizeof(char16_t)); }
  5522.     };
  5523.  
  5524.   template<>
  5525.     struct __is_fast_hash<hash<u16string>> : std::false_type
  5526.     { };
  5527.  
  5528.   /// std::hash specialization for u32string.
  5529.   template<>
  5530.     struct hash<u32string>
  5531.     : public __hash_base<size_t, u32string>
  5532.     {
  5533.       size_t
  5534.       operator()(const u32string& __s) const noexcept
  5535.       { return std::_Hash_impl::hash(__s.data(),
  5536.                                      __s.length() * sizeof(char32_t)); }
  5537.     };
  5538.  
  5539.   template<>
  5540.     struct __is_fast_hash<hash<u32string>> : std::false_type
  5541.     { };
  5542. #endif
  5543.  
  5544. #if __cplusplus > 201103L
  5545.  
  5546. #define __cpp_lib_string_udls 201304
  5547.  
  5548.   inline namespace literals
  5549.   {
  5550.   inline namespace string_literals
  5551.   {
  5552.  
  5553.     _GLIBCXX_DEFAULT_ABI_TAG
  5554.     inline basic_string<char>
  5555.     operator""s(const char* __str, size_t __len)
  5556.     { return basic_string<char>{__str, __len}; }
  5557.  
  5558. #ifdef _GLIBCXX_USE_WCHAR_T
  5559.     _GLIBCXX_DEFAULT_ABI_TAG
  5560.     inline basic_string<wchar_t>
  5561.     operator""s(const wchar_t* __str, size_t __len)
  5562.     { return basic_string<wchar_t>{__str, __len}; }
  5563. #endif
  5564.  
  5565. #ifdef _GLIBCXX_USE_C99_STDINT_TR1
  5566.     _GLIBCXX_DEFAULT_ABI_TAG
  5567.     inline basic_string<char16_t>
  5568.     operator""s(const char16_t* __str, size_t __len)
  5569.     { return basic_string<char16_t>{__str, __len}; }
  5570.  
  5571.     _GLIBCXX_DEFAULT_ABI_TAG
  5572.     inline basic_string<char32_t>
  5573.     operator""s(const char32_t* __str, size_t __len)
  5574.     { return basic_string<char32_t>{__str, __len}; }
  5575. #endif
  5576.  
  5577.   } // inline namespace string_literals
  5578.   } // inline namespace literals
  5579.  
  5580. #endif // __cplusplus > 201103L
  5581.  
  5582. _GLIBCXX_END_NAMESPACE_VERSION
  5583. } // namespace std
  5584.  
  5585. #endif // C++11
  5586.  
  5587. #endif /* _BASIC_STRING_H */
  5588.