LCOV - code coverage report
Current view: top level - usr/include/c++/12/bits - basic_string.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 65 72 90.3 %
Date: 2023-07-19 08:18:47 Functions: 1 2 50.0 %

          Line data    Source code
       1             : // Components for manipulating sequences of characters -*- C++ -*-
       2             : 
       3             : // Copyright (C) 1997-2022 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/alloc_traits.h>
      40             : #include <debug/debug.h>
      41             : 
      42             : #if __cplusplus >= 201103L
      43             : #include <initializer_list>
      44             : #endif
      45             : 
      46             : #if __cplusplus >= 201703L
      47             : # include <string_view>
      48             : #endif
      49             : 
      50             : #if ! _GLIBCXX_USE_CXX11_ABI
      51             : # include "cow_string.h"
      52             : #else
      53             : namespace std _GLIBCXX_VISIBILITY(default)
      54             : {
      55             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      56             : _GLIBCXX_BEGIN_NAMESPACE_CXX11
      57             : 
      58             : #ifdef __cpp_lib_is_constant_evaluated
      59             : // Support P0980R1 in C++20.
      60             : # define __cpp_lib_constexpr_string 201907L
      61             : #elif __cplusplus >= 201703L && _GLIBCXX_HAVE_IS_CONSTANT_EVALUATED
      62             : // Support P0426R1 changes to char_traits in C++17.
      63             : # define __cpp_lib_constexpr_string 201611L
      64             : #endif
      65             : 
      66             :   /**
      67             :    *  @class basic_string basic_string.h <string>
      68             :    *  @brief  Managing sequences of characters and character-like objects.
      69             :    *
      70             :    *  @ingroup strings
      71             :    *  @ingroup sequences
      72             :    *
      73             :    *  @tparam _CharT  Type of character
      74             :    *  @tparam _Traits  Traits for character type, defaults to
      75             :    *                   char_traits<_CharT>.
      76             :    *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
      77             :    *
      78             :    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
      79             :    *  <a href="tables.html#66">reversible container</a>, and a
      80             :    *  <a href="tables.html#67">sequence</a>.  Of the
      81             :    *  <a href="tables.html#68">optional sequence requirements</a>, only
      82             :    *  @c push_back, @c at, and @c %array access are supported.
      83             :    */
      84             :   template<typename _CharT, typename _Traits, typename _Alloc>
      85             :     class basic_string
      86             :     {
      87             :       typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
      88             :         rebind<_CharT>::other _Char_alloc_type;
      89             : 
      90             : #if __cpp_lib_constexpr_string < 201907L
      91             :       typedef __gnu_cxx::__alloc_traits<_Char_alloc_type> _Alloc_traits;
      92             : #else
      93             :       template<typename _Traits2, typename _Dummy_for_PR85282>
      94             :         struct _Alloc_traits_impl : __gnu_cxx::__alloc_traits<_Char_alloc_type>
      95             :         {
      96             :           typedef __gnu_cxx::__alloc_traits<_Char_alloc_type> _Base;
      97             : 
      98             :           [[__gnu__::__always_inline__]]
      99             :           static constexpr typename _Base::pointer
     100             :           allocate(_Char_alloc_type& __a, typename _Base::size_type __n)
     101             :           {
     102             :             pointer __p = _Base::allocate(__a, __n);
     103             :             if (std::is_constant_evaluated())
     104             :               // Begin the lifetime of characters in allocated storage.
     105             :               for (size_type __i = 0; __i < __n; ++__i)
     106             :                 std::construct_at(__builtin_addressof(__p[__i]));
     107             :             return __p;
     108             :           }
     109             :         };
     110             : 
     111             :       template<typename _Dummy_for_PR85282>
     112             :         struct _Alloc_traits_impl<char_traits<_CharT>, _Dummy_for_PR85282>
     113             :         : __gnu_cxx::__alloc_traits<_Char_alloc_type>
     114             :         {
     115             :           // std::char_traits begins the lifetime of characters.
     116             :         };
     117             : 
     118             :       using _Alloc_traits = _Alloc_traits_impl<_Traits, void>;
     119             : #endif
     120             : 
     121             :       // Types:
     122             :     public:
     123             :       typedef _Traits                                   traits_type;
     124             :       typedef typename _Traits::char_type               value_type;
     125             :       typedef _Char_alloc_type                          allocator_type;
     126             :       typedef typename _Alloc_traits::size_type         size_type;
     127             :       typedef typename _Alloc_traits::difference_type   difference_type;
     128             :       typedef typename _Alloc_traits::reference         reference;
     129             :       typedef typename _Alloc_traits::const_reference   const_reference;
     130             :       typedef typename _Alloc_traits::pointer           pointer;
     131             :       typedef typename _Alloc_traits::const_pointer     const_pointer;
     132             :       typedef __gnu_cxx::__normal_iterator<pointer, basic_string>  iterator;
     133             :       typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
     134             :                                                         const_iterator;
     135             :       typedef std::reverse_iterator<const_iterator>       const_reverse_iterator;
     136             :       typedef std::reverse_iterator<iterator>             reverse_iterator;
     137             : 
     138             :       ///  Value returned by various member functions when they fail.
     139             :       static const size_type    npos = static_cast<size_type>(-1);
     140             : 
     141             :     protected:
     142             :       // type used for positions in insert, erase etc.
     143             : #if __cplusplus < 201103L
     144             :       typedef iterator __const_iterator;
     145             : #else
     146             :       typedef const_iterator __const_iterator;
     147             : #endif
     148             : 
     149             :     private:
     150             : #if __cplusplus >= 201703L
     151             :       // A helper type for avoiding boiler-plate.
     152             :       typedef basic_string_view<_CharT, _Traits> __sv_type;
     153             : 
     154             :       template<typename _Tp, typename _Res>
     155             :         using _If_sv = enable_if_t<
     156             :           __and_<is_convertible<const _Tp&, __sv_type>,
     157             :                  __not_<is_convertible<const _Tp*, const basic_string*>>,
     158             :                  __not_<is_convertible<const _Tp&, const _CharT*>>>::value,
     159             :           _Res>;
     160             : 
     161             :       // Allows an implicit conversion to __sv_type.
     162             :       _GLIBCXX20_CONSTEXPR
     163             :       static __sv_type
     164             :       _S_to_string_view(__sv_type __svt) noexcept
     165             :       { return __svt; }
     166             : 
     167             :       // Wraps a string_view by explicit conversion and thus
     168             :       // allows to add an internal constructor that does not
     169             :       // participate in overload resolution when a string_view
     170             :       // is provided.
     171             :       struct __sv_wrapper
     172             :       {
     173             :         _GLIBCXX20_CONSTEXPR explicit
     174             :         __sv_wrapper(__sv_type __sv) noexcept : _M_sv(__sv) { }
     175             : 
     176             :         __sv_type _M_sv;
     177             :       };
     178             : 
     179             :       /**
     180             :        *  @brief  Only internally used: Construct string from a string view
     181             :        *          wrapper.
     182             :        *  @param  __svw  string view wrapper.
     183             :        *  @param  __a  Allocator to use.
     184             :        */
     185             :       _GLIBCXX20_CONSTEXPR
     186             :       explicit
     187             :       basic_string(__sv_wrapper __svw, const _Alloc& __a)
     188             :       : basic_string(__svw._M_sv.data(), __svw._M_sv.size(), __a) { }
     189             : #endif
     190             : 
     191             :       // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
     192       91475 :       struct _Alloc_hider : allocator_type // TODO check __is_final
     193             :       {
     194             : #if __cplusplus < 201103L
     195             :         _Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc())
     196             :         : allocator_type(__a), _M_p(__dat) { }
     197             : #else
     198             :         _GLIBCXX20_CONSTEXPR
     199        5815 :         _Alloc_hider(pointer __dat, const _Alloc& __a)
     200        5815 :         : allocator_type(__a), _M_p(__dat) { }
     201             : 
     202             :         _GLIBCXX20_CONSTEXPR
     203        5767 :         _Alloc_hider(pointer __dat, _Alloc&& __a = _Alloc())
     204        2894 :         : allocator_type(std::move(__a)), _M_p(__dat) { }
     205             : #endif
     206             : 
     207             :         pointer _M_p; // The actual data.
     208             :       };
     209             : 
     210             :       _Alloc_hider      _M_dataplus;
     211             :       size_type         _M_string_length;
     212             : 
     213             :       enum { _S_local_capacity = 15 / sizeof(_CharT) };
     214             : 
     215             :       union
     216             :       {
     217             :         _CharT           _M_local_buf[_S_local_capacity + 1];
     218             :         size_type        _M_allocated_capacity;
     219             :       };
     220             : 
     221             :       _GLIBCXX20_CONSTEXPR
     222             :       void
     223       24005 :       _M_data(pointer __p)
     224       24005 :       { _M_dataplus._M_p = __p; }
     225             : 
     226             :       _GLIBCXX20_CONSTEXPR
     227             :       void
     228       82511 :       _M_length(size_type __length)
     229       82511 :       { _M_string_length = __length; }
     230             : 
     231             :       _GLIBCXX20_CONSTEXPR
     232             :       pointer
     233      169703 :       _M_data() const
     234       58852 :       { return _M_dataplus._M_p; }
     235             : 
     236             :       _GLIBCXX20_CONSTEXPR
     237             :       pointer
     238        2894 :       _M_local_data()
     239             :       {
     240             : #if __cplusplus >= 201103L
     241        8610 :         return std::pointer_traits<pointer>::pointer_to(*_M_local_buf);
     242             : #else
     243             :         return pointer(_M_local_buf);
     244             : #endif
     245             :       }
     246             : 
     247             :       _GLIBCXX20_CONSTEXPR
     248             :       const_pointer
     249             :       _M_local_data() const
     250             :       {
     251             : #if __cplusplus >= 201103L
     252             :         return std::pointer_traits<const_pointer>::pointer_to(*_M_local_buf);
     253             : #else
     254             :         return const_pointer(_M_local_buf);
     255             : #endif
     256             :       }
     257             : 
     258             :       _GLIBCXX20_CONSTEXPR
     259             :       void
     260       24005 :       _M_capacity(size_type __capacity)
     261       24005 :       { _M_allocated_capacity = __capacity; }
     262             : 
     263             :       _GLIBCXX20_CONSTEXPR
     264             :       void
     265       82511 :       _M_set_length(size_type __n)
     266             :       {
     267       82511 :         _M_length(__n);
     268       82511 :         traits_type::assign(_M_data()[__n], _CharT());
     269             :       }
     270             : 
     271             :       _GLIBCXX20_CONSTEXPR
     272             :       bool
     273             :       _M_is_local() const
     274             :       {
     275             :         if (_M_data() == _M_local_data())
     276             :           {
     277             :             if (_M_string_length > _S_local_capacity)
     278             :               __builtin_unreachable();
     279             :             return true;
     280             :           }
     281             :         return false;
     282             :       }
     283             : 
     284             :       // Create & Destroy
     285             :       _GLIBCXX20_CONSTEXPR
     286             :       pointer
     287             :       _M_create(size_type&, size_type);
     288             : 
     289             :       _GLIBCXX20_CONSTEXPR
     290             :       void
     291             :       _M_dispose()
     292             :       {
     293             :         if (!_M_is_local())
     294             :           _M_destroy(_M_allocated_capacity);
     295             :       }
     296             : 
     297             :       _GLIBCXX20_CONSTEXPR
     298             :       void
     299             :       _M_destroy(size_type __size) throw()
     300             :       { _Alloc_traits::deallocate(_M_get_allocator(), _M_data(), __size + 1); }
     301             : 
     302             : #if __cplusplus < 201103L || defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
     303             :       // _M_construct_aux is used to implement the 21.3.1 para 15 which
     304             :       // requires special behaviour if _InIterator is an integral type
     305             :       template<typename _InIterator>
     306             :         void
     307             :         _M_construct_aux(_InIterator __beg, _InIterator __end,
     308             :                          std::__false_type)
     309             :         {
     310             :           typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
     311             :           _M_construct(__beg, __end, _Tag());
     312             :         }
     313             : 
     314             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     315             :       // 438. Ambiguity in the "do the right thing" clause
     316             :       template<typename _Integer>
     317             :         void
     318             :         _M_construct_aux(_Integer __beg, _Integer __end, std::__true_type)
     319             :         { _M_construct_aux_2(static_cast<size_type>(__beg), __end); }
     320             : 
     321             :       void
     322             :       _M_construct_aux_2(size_type __req, _CharT __c)
     323             :       { _M_construct(__req, __c); }
     324             : #endif
     325             : 
     326             :       // For Input Iterators, used in istreambuf_iterators, etc.
     327             :       template<typename _InIterator>
     328             :         _GLIBCXX20_CONSTEXPR
     329             :         void
     330             :         _M_construct(_InIterator __beg, _InIterator __end,
     331             :                      std::input_iterator_tag);
     332             : 
     333             :       // For forward_iterators up to random_access_iterators, used for
     334             :       // string::iterator, _CharT*, etc.
     335             :       template<typename _FwdIterator>
     336             :         _GLIBCXX20_CONSTEXPR
     337             :         void
     338             :         _M_construct(_FwdIterator __beg, _FwdIterator __end,
     339             :                      std::forward_iterator_tag);
     340             : 
     341             :       _GLIBCXX20_CONSTEXPR
     342             :       void
     343             :       _M_construct(size_type __req, _CharT __c);
     344             : 
     345             :       _GLIBCXX20_CONSTEXPR
     346             :       allocator_type&
     347             :       _M_get_allocator()
     348             :       { return _M_dataplus; }
     349             : 
     350             :       _GLIBCXX20_CONSTEXPR
     351             :       const allocator_type&
     352             :       _M_get_allocator() const
     353             :       { return _M_dataplus; }
     354             : 
     355             :       // Ensure that _M_local_buf is the active member of the union.
     356             :       __attribute__((__always_inline__))
     357             :       _GLIBCXX14_CONSTEXPR
     358             :       pointer
     359       37152 :       _M_use_local_data() _GLIBCXX_NOEXCEPT
     360             :       {
     361             : #if __cpp_lib_is_constant_evaluated
     362             :         if (std::is_constant_evaluated())
     363             :           for (size_type __i = 0; __i <= _S_local_capacity; ++__i)
     364             :             _M_local_buf[__i] = _CharT();
     365             : #endif
     366       31385 :         return _M_local_data();
     367             :       }
     368             : 
     369             :     private:
     370             : 
     371             : #ifdef _GLIBCXX_DISAMBIGUATE_REPLACE_INST
     372             :       // The explicit instantiations in misc-inst.cc require this due to
     373             :       // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64063
     374             :       template<typename _Tp, bool _Requires =
     375             :                !__are_same<_Tp, _CharT*>::__value
     376             :                && !__are_same<_Tp, const _CharT*>::__value
     377             :                && !__are_same<_Tp, iterator>::__value
     378             :                && !__are_same<_Tp, const_iterator>::__value>
     379             :         struct __enable_if_not_native_iterator
     380             :         { typedef basic_string& __type; };
     381             :       template<typename _Tp>
     382             :         struct __enable_if_not_native_iterator<_Tp, false> { };
     383             : #endif
     384             : 
     385             :       _GLIBCXX20_CONSTEXPR
     386             :       size_type
     387             :       _M_check(size_type __pos, const char* __s) const
     388             :       {
     389             :         if (__pos > this->size())
     390             :           __throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > "
     391             :                                        "this->size() (which is %zu)"),
     392             :                                    __s, __pos, this->size());
     393             :         return __pos;
     394             :       }
     395             : 
     396             :       _GLIBCXX20_CONSTEXPR
     397             :       void
     398             :       _M_check_length(size_type __n1, size_type __n2, const char* __s) const
     399             :       {
     400             :         if (this->max_size() - (this->size() - __n1) < __n2)
     401             :           __throw_length_error(__N(__s));
     402             :       }
     403             : 
     404             : 
     405             :       // NB: _M_limit doesn't check for a bad __pos value.
     406             :       _GLIBCXX20_CONSTEXPR
     407             :       size_type
     408             :       _M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT
     409             :       {
     410             :         const bool __testoff =  __off < this->size() - __pos;
     411             :         return __testoff ? __off : this->size() - __pos;
     412             :       }
     413             : 
     414             :       // True if _Rep and source do not overlap.
     415             :       bool
     416             :       _M_disjunct(const _CharT* __s) const _GLIBCXX_NOEXCEPT
     417             :       {
     418             :         return (less<const _CharT*>()(__s, _M_data())
     419             :                 || less<const _CharT*>()(_M_data() + this->size(), __s));
     420             :       }
     421             : 
     422             :       // When __n = 1 way faster than the general multichar
     423             :       // traits_type::copy/move/assign.
     424             :       _GLIBCXX20_CONSTEXPR
     425             :       static void
     426             :       _S_copy(_CharT* __d, const _CharT* __s, size_type __n)
     427             :       {
     428             :         if (__n == 1)
     429             :           traits_type::assign(*__d, *__s);
     430             :         else
     431             :           traits_type::copy(__d, __s, __n);
     432             :       }
     433             : 
     434             :       _GLIBCXX20_CONSTEXPR
     435             :       static void
     436             :       _S_move(_CharT* __d, const _CharT* __s, size_type __n)
     437             :       {
     438             :         if (__n == 1)
     439             :           traits_type::assign(*__d, *__s);
     440             :         else
     441             :           traits_type::move(__d, __s, __n);
     442             :       }
     443             : 
     444             :       _GLIBCXX20_CONSTEXPR
     445             :       static void
     446             :       _S_assign(_CharT* __d, size_type __n, _CharT __c)
     447             :       {
     448             :         if (__n == 1)
     449             :           traits_type::assign(*__d, __c);
     450             :         else
     451             :           traits_type::assign(__d, __n, __c);
     452             :       }
     453             : 
     454             :       // _S_copy_chars is a separate template to permit specialization
     455             :       // to optimize for the common case of pointers as iterators.
     456             :       template<class _Iterator>
     457             :         _GLIBCXX20_CONSTEXPR
     458             :         static void
     459             :         _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
     460             :         {
     461             :           for (; __k1 != __k2; ++__k1, (void)++__p)
     462             :             traits_type::assign(*__p, *__k1); // These types are off.
     463             :         }
     464             : 
     465             :       _GLIBCXX20_CONSTEXPR
     466             :       static void
     467             :       _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2) _GLIBCXX_NOEXCEPT
     468             :       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
     469             : 
     470             :       _GLIBCXX20_CONSTEXPR
     471             :       static void
     472             :       _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
     473             :       _GLIBCXX_NOEXCEPT
     474             :       { _S_copy_chars(__p, __k1.base(), __k2.base()); }
     475             : 
     476             :       _GLIBCXX20_CONSTEXPR
     477             :       static void
     478       49572 :       _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) _GLIBCXX_NOEXCEPT
     479       49572 :       { _S_copy(__p, __k1, __k2 - __k1); }
     480             : 
     481             :       _GLIBCXX20_CONSTEXPR
     482             :       static void
     483        5818 :       _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
     484             :       _GLIBCXX_NOEXCEPT
     485        5818 :       { _S_copy(__p, __k1, __k2 - __k1); }
     486             : 
     487             :       _GLIBCXX20_CONSTEXPR
     488             :       static int
     489             :       _S_compare(size_type __n1, size_type __n2) _GLIBCXX_NOEXCEPT
     490             :       {
     491             :         const difference_type __d = difference_type(__n1 - __n2);
     492             : 
     493             :         if (__d > __gnu_cxx::__numeric_traits<int>::__max)
     494             :           return __gnu_cxx::__numeric_traits<int>::__max;
     495             :         else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
     496             :           return __gnu_cxx::__numeric_traits<int>::__min;
     497             :         else
     498             :           return int(__d);
     499             :       }
     500             : 
     501             :       _GLIBCXX20_CONSTEXPR
     502             :       void
     503             :       _M_assign(const basic_string&);
     504             : 
     505             :       _GLIBCXX20_CONSTEXPR
     506             :       void
     507             :       _M_mutate(size_type __pos, size_type __len1, const _CharT* __s,
     508             :                 size_type __len2);
     509             : 
     510             :       _GLIBCXX20_CONSTEXPR
     511             :       void
     512             :       _M_erase(size_type __pos, size_type __n);
     513             : 
     514             :     public:
     515             :       // Construct/copy/destroy:
     516             :       // NB: We overload ctors in some cases instead of using default
     517             :       // arguments, per 17.4.4.4 para. 2 item 2.
     518             : 
     519             :       /**
     520             :        *  @brief  Default constructor creates an empty string.
     521             :        */
     522             :       _GLIBCXX20_CONSTEXPR
     523        5767 :       basic_string()
     524             :       _GLIBCXX_NOEXCEPT_IF(is_nothrow_default_constructible<_Alloc>::value)
     525        2894 :       : _M_dataplus(_M_local_data())
     526             :       {
     527        2894 :         _M_use_local_data();
     528        5767 :         _M_set_length(0);
     529           3 :       }
     530             : 
     531             :       /**
     532             :        *  @brief  Construct an empty string using allocator @a a.
     533             :        */
     534             :       _GLIBCXX20_CONSTEXPR
     535             :       explicit
     536             :       basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT
     537             :       : _M_dataplus(_M_local_data(), __a)
     538             :       {
     539             :         _M_use_local_data();
     540             :         _M_set_length(0);
     541             :       }
     542             : 
     543             :       /**
     544             :        *  @brief  Construct string with copy of value of @a __str.
     545             :        *  @param  __str  Source string.
     546             :        */
     547             :       _GLIBCXX20_CONSTEXPR
     548             :       basic_string(const basic_string& __str)
     549             :       : _M_dataplus(_M_local_data(),
     550             :                     _Alloc_traits::_S_select_on_copy(__str._M_get_allocator()))
     551             :       {
     552             :         _M_construct(__str._M_data(), __str._M_data() + __str.length(),
     553             :                      std::forward_iterator_tag());
     554             :       }
     555             : 
     556             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     557             :       // 2583. no way to supply an allocator for basic_string(str, pos)
     558             :       /**
     559             :        *  @brief  Construct string as copy of a substring.
     560             :        *  @param  __str  Source string.
     561             :        *  @param  __pos  Index of first character to copy from.
     562             :        *  @param  __a  Allocator to use.
     563             :        */
     564             :       _GLIBCXX20_CONSTEXPR
     565             :       basic_string(const basic_string& __str, size_type __pos,
     566             :                    const _Alloc& __a = _Alloc())
     567             :       : _M_dataplus(_M_local_data(), __a)
     568             :       {
     569             :         const _CharT* __start = __str._M_data()
     570             :           + __str._M_check(__pos, "basic_string::basic_string");
     571             :         _M_construct(__start, __start + __str._M_limit(__pos, npos),
     572             :                      std::forward_iterator_tag());
     573             :       }
     574             : 
     575             :       /**
     576             :        *  @brief  Construct string as copy of a substring.
     577             :        *  @param  __str  Source string.
     578             :        *  @param  __pos  Index of first character to copy from.
     579             :        *  @param  __n  Number of characters to copy.
     580             :        */
     581             :       _GLIBCXX20_CONSTEXPR
     582             :       basic_string(const basic_string& __str, size_type __pos,
     583             :                    size_type __n)
     584             :       : _M_dataplus(_M_local_data())
     585             :       {
     586             :         const _CharT* __start = __str._M_data()
     587             :           + __str._M_check(__pos, "basic_string::basic_string");
     588             :         _M_construct(__start, __start + __str._M_limit(__pos, __n),
     589             :                      std::forward_iterator_tag());
     590             :       }
     591             : 
     592             :       /**
     593             :        *  @brief  Construct string as copy of a substring.
     594             :        *  @param  __str  Source string.
     595             :        *  @param  __pos  Index of first character to copy from.
     596             :        *  @param  __n  Number of characters to copy.
     597             :        *  @param  __a  Allocator to use.
     598             :        */
     599             :       _GLIBCXX20_CONSTEXPR
     600             :       basic_string(const basic_string& __str, size_type __pos,
     601             :                    size_type __n, const _Alloc& __a)
     602             :       : _M_dataplus(_M_local_data(), __a)
     603             :       {
     604             :         const _CharT* __start
     605             :           = __str._M_data() + __str._M_check(__pos, "string::string");
     606             :         _M_construct(__start, __start + __str._M_limit(__pos, __n),
     607             :                      std::forward_iterator_tag());
     608             :       }
     609             : 
     610             :       /**
     611             :        *  @brief  Construct string initialized by a character %array.
     612             :        *  @param  __s  Source character %array.
     613             :        *  @param  __n  Number of characters to copy.
     614             :        *  @param  __a  Allocator to use (default is default allocator).
     615             :        *
     616             :        *  NB: @a __s must have at least @a __n characters, &apos;\\0&apos;
     617             :        *  has no special meaning.
     618             :        */
     619             :       _GLIBCXX20_CONSTEXPR
     620             :       basic_string(const _CharT* __s, size_type __n,
     621             :                    const _Alloc& __a = _Alloc())
     622             :       : _M_dataplus(_M_local_data(), __a)
     623             :       {
     624             :         // NB: Not required, but considered best practice.
     625             :         if (__s == 0 && __n > 0)
     626             :           std::__throw_logic_error(__N("basic_string: "
     627             :                                        "construction from null is not valid"));
     628             :         _M_construct(__s, __s + __n, std::forward_iterator_tag());
     629             :       }
     630             : 
     631             :       /**
     632             :        *  @brief  Construct string as copy of a C string.
     633             :        *  @param  __s  Source C string.
     634             :        *  @param  __a  Allocator to use (default is default allocator).
     635             :        */
     636             : #if __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
     637             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     638             :       // 3076. basic_string CTAD ambiguity
     639             :       template<typename = _RequireAllocator<_Alloc>>
     640             : #endif
     641             :       _GLIBCXX20_CONSTEXPR
     642        5737 :       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
     643        5737 :       : _M_dataplus(_M_local_data(), __a)
     644             :       {
     645             :         // NB: Not required, but considered best practice.
     646        5737 :         if (__s == 0)
     647           0 :           std::__throw_logic_error(__N("basic_string: "
     648             :                                        "construction from null is not valid"));
     649        5737 :         const _CharT* __end = __s + traits_type::length(__s);
     650        5737 :         _M_construct(__s, __end, forward_iterator_tag());
     651        5737 :       }
     652             : 
     653             :       /**
     654             :        *  @brief  Construct string as multiple characters.
     655             :        *  @param  __n  Number of characters.
     656             :        *  @param  __c  Character to use.
     657             :        *  @param  __a  Allocator to use (default is default allocator).
     658             :        */
     659             : #if __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
     660             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     661             :       // 3076. basic_string CTAD ambiguity
     662             :       template<typename = _RequireAllocator<_Alloc>>
     663             : #endif
     664             :       _GLIBCXX20_CONSTEXPR
     665             :       basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
     666             :       : _M_dataplus(_M_local_data(), __a)
     667             :       { _M_construct(__n, __c); }
     668             : 
     669             : #if __cplusplus >= 201103L
     670             :       /**
     671             :        *  @brief  Move construct string.
     672             :        *  @param  __str  Source string.
     673             :        *
     674             :        *  The newly-created string contains the exact contents of @a __str.
     675             :        *  @a __str is a valid, but unspecified string.
     676             :        */
     677             :       _GLIBCXX20_CONSTEXPR
     678             :       basic_string(basic_string&& __str) noexcept
     679             :       : _M_dataplus(_M_local_data(), std::move(__str._M_get_allocator()))
     680             :       {
     681             :         if (__str._M_is_local())
     682             :           {
     683             :             traits_type::copy(_M_local_buf, __str._M_local_buf,
     684             :                               __str.length() + 1);
     685             :           }
     686             :         else
     687             :           {
     688             :             _M_data(__str._M_data());
     689             :             _M_capacity(__str._M_allocated_capacity);
     690             :           }
     691             : 
     692             :         // Must use _M_length() here not _M_set_length() because
     693             :         // basic_stringbuf relies on writing into unallocated capacity so
     694             :         // we mess up the contents if we put a '\0' in the string.
     695             :         _M_length(__str.length());
     696             :         __str._M_data(__str._M_local_data());
     697             :         __str._M_set_length(0);
     698             :       }
     699             : 
     700             :       /**
     701             :        *  @brief  Construct string from an initializer %list.
     702             :        *  @param  __l  std::initializer_list of characters.
     703             :        *  @param  __a  Allocator to use (default is default allocator).
     704             :        */
     705             :       _GLIBCXX20_CONSTEXPR
     706             :       basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc())
     707             :       : _M_dataplus(_M_local_data(), __a)
     708             :       { _M_construct(__l.begin(), __l.end(), std::forward_iterator_tag()); }
     709             : 
     710             :       _GLIBCXX20_CONSTEXPR
     711             :       basic_string(const basic_string& __str, const _Alloc& __a)
     712             :       : _M_dataplus(_M_local_data(), __a)
     713             :       { _M_construct(__str.begin(), __str.end(), std::forward_iterator_tag()); }
     714             : 
     715             :       _GLIBCXX20_CONSTEXPR
     716             :       basic_string(basic_string&& __str, const _Alloc& __a)
     717             :       noexcept(_Alloc_traits::_S_always_equal())
     718             :       : _M_dataplus(_M_local_data(), __a)
     719             :       {
     720             :         if (__str._M_is_local())
     721             :           {
     722             :             traits_type::copy(_M_local_buf, __str._M_local_buf,
     723             :                               __str.length() + 1);
     724             :             _M_length(__str.length());
     725             :             __str._M_set_length(0);
     726             :           }
     727             :         else if (_Alloc_traits::_S_always_equal()
     728             :             || __str.get_allocator() == __a)
     729             :           {
     730             :             _M_data(__str._M_data());
     731             :             _M_length(__str.length());
     732             :             _M_capacity(__str._M_allocated_capacity);
     733             :             __str._M_data(__str._M_local_buf);
     734             :             __str._M_set_length(0);
     735             :           }
     736             :         else
     737             :           _M_construct(__str.begin(), __str.end(), std::forward_iterator_tag());
     738             :       }
     739             : #endif // C++11
     740             : 
     741             : #if __cplusplus >= 202100L
     742             :       basic_string(nullptr_t) = delete;
     743             :       basic_string& operator=(nullptr_t) = delete;
     744             : #endif // C++23
     745             : 
     746             :       /**
     747             :        *  @brief  Construct string as copy of a range.
     748             :        *  @param  __beg  Start of range.
     749             :        *  @param  __end  End of range.
     750             :        *  @param  __a  Allocator to use (default is default allocator).
     751             :        */
     752             : #if __cplusplus >= 201103L
     753             :       template<typename _InputIterator,
     754             :                typename = std::_RequireInputIter<_InputIterator>>
     755             : #else
     756             :       template<typename _InputIterator>
     757             : #endif
     758             :         _GLIBCXX20_CONSTEXPR
     759          78 :         basic_string(_InputIterator __beg, _InputIterator __end,
     760             :                      const _Alloc& __a = _Alloc())
     761          78 :         : _M_dataplus(_M_local_data(), __a), _M_string_length(0)
     762             :         {
     763             : #if __cplusplus >= 201103L
     764          78 :           _M_construct(__beg, __end, std::__iterator_category(__beg));
     765             : #else
     766             :           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
     767             :           _M_construct_aux(__beg, __end, _Integral());
     768             : #endif
     769             :         }
     770             : 
     771             : #if __cplusplus >= 201703L
     772             :       /**
     773             :        *  @brief  Construct string from a substring of a string_view.
     774             :        *  @param  __t   Source object convertible to string view.
     775             :        *  @param  __pos The index of the first character to copy from __t.
     776             :        *  @param  __n   The number of characters to copy from __t.
     777             :        *  @param  __a   Allocator to use.
     778             :        */
     779             :       template<typename _Tp,
     780             :                typename = enable_if_t<is_convertible_v<const _Tp&, __sv_type>>>
     781             :         _GLIBCXX20_CONSTEXPR
     782             :         basic_string(const _Tp& __t, size_type __pos, size_type __n,
     783             :                      const _Alloc& __a = _Alloc())
     784             :         : basic_string(_S_to_string_view(__t).substr(__pos, __n), __a) { }
     785             : 
     786             :       /**
     787             :        *  @brief  Construct string from a string_view.
     788             :        *  @param  __t  Source object convertible to string view.
     789             :        *  @param  __a  Allocator to use (default is default allocator).
     790             :        */
     791             :       template<typename _Tp, typename = _If_sv<_Tp, void>>
     792             :         _GLIBCXX20_CONSTEXPR
     793             :         explicit
     794             :         basic_string(const _Tp& __t, const _Alloc& __a = _Alloc())
     795             :         : basic_string(__sv_wrapper(_S_to_string_view(__t)), __a) { }
     796             : #endif // C++17
     797             : 
     798             :       /**
     799             :        *  @brief  Destroy the string instance.
     800             :        */
     801             :       _GLIBCXX20_CONSTEXPR
     802       30470 :       ~basic_string()
     803       61005 :       { _M_dispose(); }
     804             : 
     805             :       /**
     806             :        *  @brief  Assign the value of @a str to this string.
     807             :        *  @param  __str  Source string.
     808             :        */
     809             :       _GLIBCXX20_CONSTEXPR
     810             :       basic_string&
     811             :       operator=(const basic_string& __str)
     812             :       {
     813             :         return this->assign(__str);
     814             :       }
     815             : 
     816             :       /**
     817             :        *  @brief  Copy contents of @a s into this string.
     818             :        *  @param  __s  Source null-terminated string.
     819             :        */
     820             :       _GLIBCXX20_CONSTEXPR
     821             :       basic_string&
     822          48 :       operator=(const _CharT* __s)
     823          48 :       { return this->assign(__s); }
     824             : 
     825             :       /**
     826             :        *  @brief  Set value to string of length 1.
     827             :        *  @param  __c  Source character.
     828             :        *
     829             :        *  Assigning to a character makes this string length 1 and
     830             :        *  (*this)[0] == @a c.
     831             :        */
     832             :       _GLIBCXX20_CONSTEXPR
     833             :       basic_string&
     834             :       operator=(_CharT __c)
     835             :       {
     836             :         this->assign(1, __c);
     837             :         return *this;
     838             :       }
     839             : 
     840             : #if __cplusplus >= 201103L
     841             :       /**
     842             :        *  @brief  Move assign the value of @a str to this string.
     843             :        *  @param  __str  Source string.
     844             :        *
     845             :        *  The contents of @a str are moved into this string (without copying).
     846             :        *  @a str is a valid, but unspecified string.
     847             :        */
     848             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     849             :       // 2063. Contradictory requirements for string move assignment
     850             :       _GLIBCXX20_CONSTEXPR
     851             :       basic_string&
     852             :       operator=(basic_string&& __str)
     853             :       noexcept(_Alloc_traits::_S_nothrow_move())
     854             :       {
     855             :         if (!_M_is_local() && _Alloc_traits::_S_propagate_on_move_assign()
     856             :             && !_Alloc_traits::_S_always_equal()
     857             :             && _M_get_allocator() != __str._M_get_allocator())
     858             :           {
     859             :             // Destroy existing storage before replacing allocator.
     860             :             _M_destroy(_M_allocated_capacity);
     861             :             _M_data(_M_local_data());
     862             :             _M_set_length(0);
     863             :           }
     864             :         // Replace allocator if POCMA is true.
     865             :         std::__alloc_on_move(_M_get_allocator(), __str._M_get_allocator());
     866             : 
     867             :         if (__str._M_is_local())
     868             :           {
     869             :             // We've always got room for a short string, just copy it
     870             :             // (unless this is a self-move, because that would violate the
     871             :             // char_traits::copy precondition that the ranges don't overlap).
     872             :             if (__builtin_expect(std::__addressof(__str) != this, true))
     873             :               {
     874             :                 if (__str.size())
     875             :                   this->_S_copy(_M_data(), __str._M_data(), __str.size());
     876             :                 _M_set_length(__str.size());
     877             :               }
     878             :           }
     879             :         else if (_Alloc_traits::_S_propagate_on_move_assign()
     880             :             || _Alloc_traits::_S_always_equal()
     881             :             || _M_get_allocator() == __str._M_get_allocator())
     882             :           {
     883             :             // Just move the allocated pointer, our allocator can free it.
     884             :             pointer __data = nullptr;
     885             :             size_type __capacity;
     886             :             if (!_M_is_local())
     887             :               {
     888             :                 if (_Alloc_traits::_S_always_equal())
     889             :                   {
     890             :                     // __str can reuse our existing storage.
     891             :                     __data = _M_data();
     892             :                     __capacity = _M_allocated_capacity;
     893             :                   }
     894             :                 else // __str can't use it, so free it.
     895             :                   _M_destroy(_M_allocated_capacity);
     896             :               }
     897             : 
     898             :             _M_data(__str._M_data());
     899             :             _M_length(__str.length());
     900             :             _M_capacity(__str._M_allocated_capacity);
     901             :             if (__data)
     902             :               {
     903             :                 __str._M_data(__data);
     904             :                 __str._M_capacity(__capacity);
     905             :               }
     906             :             else
     907             :               __str._M_data(__str._M_local_buf);
     908             :           }
     909             :         else // Need to do a deep copy
     910             :           assign(__str);
     911             :         __str.clear();
     912             :         return *this;
     913             :       }
     914             : 
     915             :       /**
     916             :        *  @brief  Set value to string constructed from initializer %list.
     917             :        *  @param  __l  std::initializer_list.
     918             :        */
     919             :       _GLIBCXX20_CONSTEXPR
     920             :       basic_string&
     921             :       operator=(initializer_list<_CharT> __l)
     922             :       {
     923             :         this->assign(__l.begin(), __l.size());
     924             :         return *this;
     925             :       }
     926             : #endif // C++11
     927             : 
     928             : #if __cplusplus >= 201703L
     929             :       /**
     930             :        *  @brief  Set value to string constructed from a string_view.
     931             :        *  @param  __svt  An object convertible to string_view.
     932             :        */
     933             :      template<typename _Tp>
     934             :        _GLIBCXX20_CONSTEXPR
     935             :        _If_sv<_Tp, basic_string&>
     936             :        operator=(const _Tp& __svt)
     937             :        { return this->assign(__svt); }
     938             : 
     939             :       /**
     940             :        *  @brief  Convert to a string_view.
     941             :        *  @return A string_view.
     942             :        */
     943             :       _GLIBCXX20_CONSTEXPR
     944             :       operator __sv_type() const noexcept
     945             :       { return __sv_type(data(), size()); }
     946             : #endif // C++17
     947             : 
     948             :       // Iterators:
     949             :       /**
     950             :        *  Returns a read/write iterator that points to the first character in
     951             :        *  the %string.
     952             :        */
     953             :       _GLIBCXX20_CONSTEXPR
     954             :       iterator
     955             :       begin() _GLIBCXX_NOEXCEPT
     956             :       { return iterator(_M_data()); }
     957             : 
     958             :       /**
     959             :        *  Returns a read-only (constant) iterator that points to the first
     960             :        *  character in the %string.
     961             :        */
     962             :       _GLIBCXX20_CONSTEXPR
     963             :       const_iterator
     964             :       begin() const _GLIBCXX_NOEXCEPT
     965             :       { return const_iterator(_M_data()); }
     966             : 
     967             :       /**
     968             :        *  Returns a read/write iterator that points one past the last
     969             :        *  character in the %string.
     970             :        */
     971             :       _GLIBCXX20_CONSTEXPR
     972             :       iterator
     973             :       end() _GLIBCXX_NOEXCEPT
     974             :       { return iterator(_M_data() + this->size()); }
     975             : 
     976             :       /**
     977             :        *  Returns a read-only (constant) iterator that points one past the
     978             :        *  last character in the %string.
     979             :        */
     980             :       _GLIBCXX20_CONSTEXPR
     981             :       const_iterator
     982             :       end() const _GLIBCXX_NOEXCEPT
     983             :       { return const_iterator(_M_data() + this->size()); }
     984             : 
     985             :       /**
     986             :        *  Returns a read/write reverse iterator that points to the last
     987             :        *  character in the %string.  Iteration is done in reverse element
     988             :        *  order.
     989             :        */
     990             :       _GLIBCXX20_CONSTEXPR
     991             :       reverse_iterator
     992             :       rbegin() _GLIBCXX_NOEXCEPT
     993             :       { return reverse_iterator(this->end()); }
     994             : 
     995             :       /**
     996             :        *  Returns a read-only (constant) reverse iterator that points
     997             :        *  to the last character in the %string.  Iteration is done in
     998             :        *  reverse element order.
     999             :        */
    1000             :       _GLIBCXX20_CONSTEXPR
    1001             :       const_reverse_iterator
    1002             :       rbegin() const _GLIBCXX_NOEXCEPT
    1003             :       { return const_reverse_iterator(this->end()); }
    1004             : 
    1005             :       /**
    1006             :        *  Returns a read/write reverse iterator that points to one before the
    1007             :        *  first character in the %string.  Iteration is done in reverse
    1008             :        *  element order.
    1009             :        */
    1010             :       _GLIBCXX20_CONSTEXPR
    1011             :       reverse_iterator
    1012             :       rend() _GLIBCXX_NOEXCEPT
    1013             :       { return reverse_iterator(this->begin()); }
    1014             : 
    1015             :       /**
    1016             :        *  Returns a read-only (constant) reverse iterator that points
    1017             :        *  to one before the first character in the %string.  Iteration
    1018             :        *  is done in reverse element order.
    1019             :        */
    1020             :       _GLIBCXX20_CONSTEXPR
    1021             :       const_reverse_iterator
    1022             :       rend() const _GLIBCXX_NOEXCEPT
    1023             :       { return const_reverse_iterator(this->begin()); }
    1024             : 
    1025             : #if __cplusplus >= 201103L
    1026             :       /**
    1027             :        *  Returns a read-only (constant) iterator that points to the first
    1028             :        *  character in the %string.
    1029             :        */
    1030             :       _GLIBCXX20_CONSTEXPR
    1031             :       const_iterator
    1032             :       cbegin() const noexcept
    1033             :       { return const_iterator(this->_M_data()); }
    1034             : 
    1035             :       /**
    1036             :        *  Returns a read-only (constant) iterator that points one past the
    1037             :        *  last character in the %string.
    1038             :        */
    1039             :       _GLIBCXX20_CONSTEXPR
    1040             :       const_iterator
    1041             :       cend() const noexcept
    1042             :       { return const_iterator(this->_M_data() + this->size()); }
    1043             : 
    1044             :       /**
    1045             :        *  Returns a read-only (constant) reverse iterator that points
    1046             :        *  to the last character in the %string.  Iteration is done in
    1047             :        *  reverse element order.
    1048             :        */
    1049             :       _GLIBCXX20_CONSTEXPR
    1050             :       const_reverse_iterator
    1051             :       crbegin() const noexcept
    1052             :       { return const_reverse_iterator(this->end()); }
    1053             : 
    1054             :       /**
    1055             :        *  Returns a read-only (constant) reverse iterator that points
    1056             :        *  to one before the first character in the %string.  Iteration
    1057             :        *  is done in reverse element order.
    1058             :        */
    1059             :       _GLIBCXX20_CONSTEXPR
    1060             :       const_reverse_iterator
    1061             :       crend() const noexcept
    1062             :       { return const_reverse_iterator(this->begin()); }
    1063             : #endif
    1064             : 
    1065             :     public:
    1066             :       // Capacity:
    1067             :       ///  Returns the number of characters in the string, not including any
    1068             :       ///  null-termination.
    1069             :       _GLIBCXX20_CONSTEXPR
    1070             :       size_type
    1071       82107 :       size() const _GLIBCXX_NOEXCEPT
    1072       79204 :       { return _M_string_length; }
    1073             : 
    1074             :       ///  Returns the number of characters in the string, not including any
    1075             :       ///  null-termination.
    1076             :       _GLIBCXX20_CONSTEXPR
    1077             :       size_type
    1078             :       length() const _GLIBCXX_NOEXCEPT
    1079             :       { return _M_string_length; }
    1080             : 
    1081             :       ///  Returns the size() of the largest possible %string.
    1082             :       _GLIBCXX20_CONSTEXPR
    1083             :       size_type
    1084             :       max_size() const _GLIBCXX_NOEXCEPT
    1085             :       { return (_Alloc_traits::max_size(_M_get_allocator()) - 1) / 2; }
    1086             : 
    1087             :       /**
    1088             :        *  @brief  Resizes the %string to the specified number of characters.
    1089             :        *  @param  __n  Number of characters the %string should contain.
    1090             :        *  @param  __c  Character to fill any new elements.
    1091             :        *
    1092             :        *  This function will %resize the %string to the specified
    1093             :        *  number of characters.  If the number is smaller than the
    1094             :        *  %string's current size the %string is truncated, otherwise
    1095             :        *  the %string is extended and new elements are %set to @a __c.
    1096             :        */
    1097             :       _GLIBCXX20_CONSTEXPR
    1098             :       void
    1099             :       resize(size_type __n, _CharT __c);
    1100             : 
    1101             :       /**
    1102             :        *  @brief  Resizes the %string to the specified number of characters.
    1103             :        *  @param  __n  Number of characters the %string should contain.
    1104             :        *
    1105             :        *  This function will resize the %string to the specified length.  If
    1106             :        *  the new size is smaller than the %string's current size the %string
    1107             :        *  is truncated, otherwise the %string is extended and new characters
    1108             :        *  are default-constructed.  For basic types such as char, this means
    1109             :        *  setting them to 0.
    1110             :        */
    1111             :       _GLIBCXX20_CONSTEXPR
    1112             :       void
    1113             :       resize(size_type __n)
    1114             :       { this->resize(__n, _CharT()); }
    1115             : 
    1116             : #if __cplusplus >= 201103L
    1117             : #pragma GCC diagnostic push
    1118             : #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
    1119             :       ///  A non-binding request to reduce capacity() to size().
    1120             :       _GLIBCXX20_CONSTEXPR
    1121             :       void
    1122             :       shrink_to_fit() noexcept
    1123             :       { reserve(); }
    1124             : #pragma GCC diagnostic pop
    1125             : #endif
    1126             : 
    1127             : #if __cplusplus > 202002L
    1128             : #define __cpp_lib_string_resize_and_overwrite 202110L
    1129             :       template<typename _Operation>
    1130             :         constexpr void
    1131             :         resize_and_overwrite(size_type __n, _Operation __op);
    1132             : #endif
    1133             : 
    1134             :       /**
    1135             :        *  Returns the total number of characters that the %string can hold
    1136             :        *  before needing to allocate more memory.
    1137             :        */
    1138             :       _GLIBCXX20_CONSTEXPR
    1139             :       size_type
    1140             :       capacity() const _GLIBCXX_NOEXCEPT
    1141             :       {
    1142             :         return _M_is_local() ? size_type(_S_local_capacity)
    1143             :                              : _M_allocated_capacity;
    1144             :       }
    1145             : 
    1146             :       /**
    1147             :        *  @brief  Attempt to preallocate enough memory for specified number of
    1148             :        *          characters.
    1149             :        *  @param  __res_arg  Number of characters required.
    1150             :        *  @throw  std::length_error  If @a __res_arg exceeds @c max_size().
    1151             :        *
    1152             :        *  This function attempts to reserve enough memory for the
    1153             :        *  %string to hold the specified number of characters.  If the
    1154             :        *  number requested is more than max_size(), length_error is
    1155             :        *  thrown.
    1156             :        *
    1157             :        *  The advantage of this function is that if optimal code is a
    1158             :        *  necessity and the user can determine the string length that will be
    1159             :        *  required, the user can reserve the memory in %advance, and thus
    1160             :        *  prevent a possible reallocation of memory and copying of %string
    1161             :        *  data.
    1162             :        */
    1163             :       _GLIBCXX20_CONSTEXPR
    1164             :       void
    1165             :       reserve(size_type __res_arg);
    1166             : 
    1167             :       /**
    1168             :        *  Equivalent to shrink_to_fit().
    1169             :        */
    1170             : #if __cplusplus > 201703L
    1171             :       [[deprecated("use shrink_to_fit() instead")]]
    1172             : #endif
    1173             :       _GLIBCXX20_CONSTEXPR
    1174             :       void
    1175             :       reserve();
    1176             : 
    1177             :       /**
    1178             :        *  Erases the string, making it empty.
    1179             :        */
    1180             :       _GLIBCXX20_CONSTEXPR
    1181             :       void
    1182       21354 :       clear() _GLIBCXX_NOEXCEPT
    1183       21354 :       { _M_set_length(0); }
    1184             : 
    1185             :       /**
    1186             :        *  Returns true if the %string is empty.  Equivalent to 
    1187             :        *  <code>*this == ""</code>.
    1188             :        */
    1189             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1190             :       bool
    1191       76262 :       empty() const _GLIBCXX_NOEXCEPT
    1192       76262 :       { return this->size() == 0; }
    1193             : 
    1194             :       // Element access:
    1195             :       /**
    1196             :        *  @brief  Subscript access to the data contained in the %string.
    1197             :        *  @param  __pos  The index of the character to access.
    1198             :        *  @return  Read-only (constant) reference to the character.
    1199             :        *
    1200             :        *  This operator allows for easy, array-style, data access.
    1201             :        *  Note that data access with this operator is unchecked and
    1202             :        *  out_of_range lookups are not defined. (For checked lookups
    1203             :        *  see at().)
    1204             :        */
    1205             :       _GLIBCXX20_CONSTEXPR
    1206             :       const_reference
    1207             :       operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT
    1208             :       {
    1209             :         __glibcxx_assert(__pos <= size());
    1210             :         return _M_data()[__pos];
    1211             :       }
    1212             : 
    1213             :       /**
    1214             :        *  @brief  Subscript access to the data contained in the %string.
    1215             :        *  @param  __pos  The index of the character to access.
    1216             :        *  @return  Read/write reference to the character.
    1217             :        *
    1218             :        *  This operator allows for easy, array-style, data access.
    1219             :        *  Note that data access with this operator is unchecked and
    1220             :        *  out_of_range lookups are not defined. (For checked lookups
    1221             :        *  see at().)
    1222             :        */
    1223             :       _GLIBCXX20_CONSTEXPR
    1224             :       reference
    1225          87 :       operator[](size_type __pos)
    1226             :       {
    1227             :         // Allow pos == size() both in C++98 mode, as v3 extension,
    1228             :         // and in C++11 mode.
    1229          87 :         __glibcxx_assert(__pos <= size());
    1230             :         // In pedantic mode be strict in C++98 mode.
    1231             :         _GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L || __pos < size());
    1232          81 :         return _M_data()[__pos];
    1233             :       }
    1234             : 
    1235             :       /**
    1236             :        *  @brief  Provides access to the data contained in the %string.
    1237             :        *  @param __n The index of the character to access.
    1238             :        *  @return  Read-only (const) reference to the character.
    1239             :        *  @throw  std::out_of_range  If @a n is an invalid index.
    1240             :        *
    1241             :        *  This function provides for safer data access.  The parameter is
    1242             :        *  first checked that it is in the range of the string.  The function
    1243             :        *  throws out_of_range if the check fails.
    1244             :        */
    1245             :       _GLIBCXX20_CONSTEXPR
    1246             :       const_reference
    1247             :       at(size_type __n) const
    1248             :       {
    1249             :         if (__n >= this->size())
    1250             :           __throw_out_of_range_fmt(__N("basic_string::at: __n "
    1251             :                                        "(which is %zu) >= this->size() "
    1252             :                                        "(which is %zu)"),
    1253             :                                    __n, this->size());
    1254             :         return _M_data()[__n];
    1255             :       }
    1256             : 
    1257             :       /**
    1258             :        *  @brief  Provides access to the data contained in the %string.
    1259             :        *  @param __n The index of the character to access.
    1260             :        *  @return  Read/write reference to the character.
    1261             :        *  @throw  std::out_of_range  If @a n is an invalid index.
    1262             :        *
    1263             :        *  This function provides for safer data access.  The parameter is
    1264             :        *  first checked that it is in the range of the string.  The function
    1265             :        *  throws out_of_range if the check fails.
    1266             :        */
    1267             :       _GLIBCXX20_CONSTEXPR
    1268             :       reference
    1269             :       at(size_type __n)
    1270             :       {
    1271             :         if (__n >= size())
    1272             :           __throw_out_of_range_fmt(__N("basic_string::at: __n "
    1273             :                                        "(which is %zu) >= this->size() "
    1274             :                                        "(which is %zu)"),
    1275             :                                    __n, this->size());
    1276             :         return _M_data()[__n];
    1277             :       }
    1278             : 
    1279             : #if __cplusplus >= 201103L
    1280             :       /**
    1281             :        *  Returns a read/write reference to the data at the first
    1282             :        *  element of the %string.
    1283             :        */
    1284             :       _GLIBCXX20_CONSTEXPR
    1285             :       reference
    1286             :       front() noexcept
    1287             :       {
    1288             :         __glibcxx_assert(!empty());
    1289             :         return operator[](0);
    1290             :       }
    1291             : 
    1292             :       /**
    1293             :        *  Returns a read-only (constant) reference to the data at the first
    1294             :        *  element of the %string.
    1295             :        */
    1296             :       _GLIBCXX20_CONSTEXPR
    1297             :       const_reference
    1298             :       front() const noexcept
    1299             :       {
    1300             :         __glibcxx_assert(!empty());
    1301             :         return operator[](0);
    1302             :       }
    1303             : 
    1304             :       /**
    1305             :        *  Returns a read/write reference to the data at the last
    1306             :        *  element of the %string.
    1307             :        */
    1308             :       _GLIBCXX20_CONSTEXPR
    1309             :       reference
    1310             :       back() noexcept
    1311             :       {
    1312             :         __glibcxx_assert(!empty());
    1313             :         return operator[](this->size() - 1);
    1314             :       }
    1315             : 
    1316             :       /**
    1317             :        *  Returns a read-only (constant) reference to the data at the
    1318             :        *  last element of the %string.
    1319             :        */
    1320             :       _GLIBCXX20_CONSTEXPR
    1321             :       const_reference
    1322             :       back() const noexcept
    1323             :       {
    1324             :         __glibcxx_assert(!empty());
    1325             :         return operator[](this->size() - 1);
    1326             :       }
    1327             : #endif
    1328             : 
    1329             :       // Modifiers:
    1330             :       /**
    1331             :        *  @brief  Append a string to this string.
    1332             :        *  @param __str  The string to append.
    1333             :        *  @return  Reference to this string.
    1334             :        */
    1335             :       _GLIBCXX20_CONSTEXPR
    1336             :       basic_string&
    1337             :       operator+=(const basic_string& __str)
    1338             :       { return this->append(__str); }
    1339             : 
    1340             :       /**
    1341             :        *  @brief  Append a C string.
    1342             :        *  @param __s  The C string to append.
    1343             :        *  @return  Reference to this string.
    1344             :        */
    1345             :       _GLIBCXX20_CONSTEXPR
    1346             :       basic_string&
    1347             :       operator+=(const _CharT* __s)
    1348             :       { return this->append(__s); }
    1349             : 
    1350             :       /**
    1351             :        *  @brief  Append a character.
    1352             :        *  @param __c  The character to append.
    1353             :        *  @return  Reference to this string.
    1354             :        */
    1355             :       _GLIBCXX20_CONSTEXPR
    1356             :       basic_string&
    1357             :       operator+=(_CharT __c)
    1358             :       {
    1359             :         this->push_back(__c);
    1360             :         return *this;
    1361             :       }
    1362             : 
    1363             : #if __cplusplus >= 201103L
    1364             :       /**
    1365             :        *  @brief  Append an initializer_list of characters.
    1366             :        *  @param __l  The initializer_list of characters to be appended.
    1367             :        *  @return  Reference to this string.
    1368             :        */
    1369             :       _GLIBCXX20_CONSTEXPR
    1370             :       basic_string&
    1371             :       operator+=(initializer_list<_CharT> __l)
    1372             :       { return this->append(__l.begin(), __l.size()); }
    1373             : #endif // C++11
    1374             : 
    1375             : #if __cplusplus >= 201703L
    1376             :       /**
    1377             :        *  @brief  Append a string_view.
    1378             :        *  @param __svt  An object convertible to string_view to be appended.
    1379             :        *  @return  Reference to this string.
    1380             :        */
    1381             :       template<typename _Tp>
    1382             :         _GLIBCXX20_CONSTEXPR
    1383             :         _If_sv<_Tp, basic_string&>
    1384             :         operator+=(const _Tp& __svt)
    1385             :         { return this->append(__svt); }
    1386             : #endif // C++17
    1387             : 
    1388             :       /**
    1389             :        *  @brief  Append a string to this string.
    1390             :        *  @param __str  The string to append.
    1391             :        *  @return  Reference to this string.
    1392             :        */
    1393             :       _GLIBCXX20_CONSTEXPR
    1394             :       basic_string&
    1395           9 :       append(const basic_string& __str)
    1396           9 :       { return this->append(__str._M_data(), __str.size()); }
    1397             : 
    1398             :       /**
    1399             :        *  @brief  Append a substring.
    1400             :        *  @param __str  The string to append.
    1401             :        *  @param __pos  Index of the first character of str to append.
    1402             :        *  @param __n  The number of characters to append.
    1403             :        *  @return  Reference to this string.
    1404             :        *  @throw  std::out_of_range if @a __pos is not a valid index.
    1405             :        *
    1406             :        *  This function appends @a __n characters from @a __str
    1407             :        *  starting at @a __pos to this string.  If @a __n is is larger
    1408             :        *  than the number of available characters in @a __str, the
    1409             :        *  remainder of @a __str is appended.
    1410             :        */
    1411             :       _GLIBCXX20_CONSTEXPR
    1412             :       basic_string&
    1413             :       append(const basic_string& __str, size_type __pos, size_type __n = npos)
    1414             :       { return this->append(__str._M_data()
    1415             :                             + __str._M_check(__pos, "basic_string::append"),
    1416             :                             __str._M_limit(__pos, __n)); }
    1417             : 
    1418             :       /**
    1419             :        *  @brief  Append a C substring.
    1420             :        *  @param __s  The C string to append.
    1421             :        *  @param __n  The number of characters to append.
    1422             :        *  @return  Reference to this string.
    1423             :        */
    1424             :       _GLIBCXX20_CONSTEXPR
    1425             :       basic_string&
    1426             :       append(const _CharT* __s, size_type __n)
    1427             :       {
    1428             :         __glibcxx_requires_string_len(__s, __n);
    1429             :         _M_check_length(size_type(0), __n, "basic_string::append");
    1430             :         return _M_append(__s, __n);
    1431             :       }
    1432             : 
    1433             :       /**
    1434             :        *  @brief  Append a C string.
    1435             :        *  @param __s  The C string to append.
    1436             :        *  @return  Reference to this string.
    1437             :        */
    1438             :       _GLIBCXX20_CONSTEXPR
    1439             :       basic_string&
    1440             :       append(const _CharT* __s)
    1441             :       {
    1442             :         __glibcxx_requires_string(__s);
    1443             :         const size_type __n = traits_type::length(__s);
    1444             :         _M_check_length(size_type(0), __n, "basic_string::append");
    1445             :         return _M_append(__s, __n);
    1446             :       }
    1447             : 
    1448             :       /**
    1449             :        *  @brief  Append multiple characters.
    1450             :        *  @param __n  The number of characters to append.
    1451             :        *  @param __c  The character to use.
    1452             :        *  @return  Reference to this string.
    1453             :        *
    1454             :        *  Appends __n copies of __c to this string.
    1455             :        */
    1456             :       _GLIBCXX20_CONSTEXPR
    1457             :       basic_string&
    1458             :       append(size_type __n, _CharT __c)
    1459             :       { return _M_replace_aux(this->size(), size_type(0), __n, __c); }
    1460             : 
    1461             : #if __cplusplus >= 201103L
    1462             :       /**
    1463             :        *  @brief  Append an initializer_list of characters.
    1464             :        *  @param __l  The initializer_list of characters to append.
    1465             :        *  @return  Reference to this string.
    1466             :        */
    1467             :       _GLIBCXX20_CONSTEXPR
    1468             :       basic_string&
    1469             :       append(initializer_list<_CharT> __l)
    1470             :       { return this->append(__l.begin(), __l.size()); }
    1471             : #endif // C++11
    1472             : 
    1473             :       /**
    1474             :        *  @brief  Append a range of characters.
    1475             :        *  @param __first  Iterator referencing the first character to append.
    1476             :        *  @param __last  Iterator marking the end of the range.
    1477             :        *  @return  Reference to this string.
    1478             :        *
    1479             :        *  Appends characters in the range [__first,__last) to this string.
    1480             :        */
    1481             : #if __cplusplus >= 201103L
    1482             :       template<class _InputIterator,
    1483             :                typename = std::_RequireInputIter<_InputIterator>>
    1484             :         _GLIBCXX20_CONSTEXPR
    1485             : #else
    1486             :       template<class _InputIterator>
    1487             : #endif
    1488             :         basic_string&
    1489             :         append(_InputIterator __first, _InputIterator __last)
    1490             :         { return this->replace(end(), end(), __first, __last); }
    1491             : 
    1492             : #if __cplusplus >= 201703L
    1493             :       /**
    1494             :        *  @brief  Append a string_view.
    1495             :        *  @param __svt  An object convertible to string_view to be appended.
    1496             :        *  @return  Reference to this string.
    1497             :        */
    1498             :       template<typename _Tp>
    1499             :         _GLIBCXX20_CONSTEXPR
    1500             :         _If_sv<_Tp, basic_string&>
    1501             :         append(const _Tp& __svt)
    1502             :         {
    1503             :           __sv_type __sv = __svt;
    1504             :           return this->append(__sv.data(), __sv.size());
    1505             :         }
    1506             : 
    1507             :       /**
    1508             :        *  @brief  Append a range of characters from a string_view.
    1509             :        *  @param __svt  An object convertible to string_view to be appended from.
    1510             :        *  @param __pos The position in the string_view to append from.
    1511             :        *  @param __n   The number of characters to append from the string_view.
    1512             :        *  @return  Reference to this string.
    1513             :        */
    1514             :       template<typename _Tp>
    1515             :         _GLIBCXX20_CONSTEXPR
    1516             :         _If_sv<_Tp, basic_string&>
    1517             :         append(const _Tp& __svt, size_type __pos, size_type __n = npos)
    1518             :         {
    1519             :           __sv_type __sv = __svt;
    1520             :           return _M_append(__sv.data()
    1521             :               + std::__sv_check(__sv.size(), __pos, "basic_string::append"),
    1522             :               std::__sv_limit(__sv.size(), __pos, __n));
    1523             :         }
    1524             : #endif // C++17
    1525             : 
    1526             :       /**
    1527             :        *  @brief  Append a single character.
    1528             :        *  @param __c  Character to append.
    1529             :        */
    1530             :       _GLIBCXX20_CONSTEXPR
    1531             :       void
    1532             :       push_back(_CharT __c)
    1533             :       {
    1534             :         const size_type __size = this->size();
    1535             :         if (__size + 1 > this->capacity())
    1536             :           this->_M_mutate(__size, size_type(0), 0, size_type(1));
    1537             :         traits_type::assign(this->_M_data()[__size], __c);
    1538             :         this->_M_set_length(__size + 1);
    1539             :       }
    1540             : 
    1541             :       /**
    1542             :        *  @brief  Set value to contents of another string.
    1543             :        *  @param  __str  Source string to use.
    1544             :        *  @return  Reference to this string.
    1545             :        */
    1546             :       _GLIBCXX20_CONSTEXPR
    1547             :       basic_string&
    1548             :       assign(const basic_string& __str)
    1549             :       {
    1550             : #if __cplusplus >= 201103L
    1551             :         if (_Alloc_traits::_S_propagate_on_copy_assign())
    1552             :           {
    1553             :             if (!_Alloc_traits::_S_always_equal() && !_M_is_local()
    1554             :                 && _M_get_allocator() != __str._M_get_allocator())
    1555             :               {
    1556             :                 // Propagating allocator cannot free existing storage so must
    1557             :                 // deallocate it before replacing current allocator.
    1558             :                 if (__str.size() <= _S_local_capacity)
    1559             :                   {
    1560             :                     _M_destroy(_M_allocated_capacity);
    1561             :                     _M_data(_M_use_local_data());
    1562             :                     _M_set_length(0);
    1563             :                   }
    1564             :                 else
    1565             :                   {
    1566             :                     const auto __len = __str.size();
    1567             :                     auto __alloc = __str._M_get_allocator();
    1568             :                     // If this allocation throws there are no effects:
    1569             :                     auto __ptr = _Alloc_traits::allocate(__alloc, __len + 1);
    1570             :                     _M_destroy(_M_allocated_capacity);
    1571             :                     _M_data(__ptr);
    1572             :                     _M_capacity(__len);
    1573             :                     _M_set_length(__len);
    1574             :                   }
    1575             :               }
    1576             :             std::__alloc_on_copy(_M_get_allocator(), __str._M_get_allocator());
    1577             :           }
    1578             : #endif
    1579             :         this->_M_assign(__str);
    1580             :         return *this;
    1581             :       }
    1582             : 
    1583             : #if __cplusplus >= 201103L
    1584             :       /**
    1585             :        *  @brief  Set value to contents of another string.
    1586             :        *  @param  __str  Source string to use.
    1587             :        *  @return  Reference to this string.
    1588             :        *
    1589             :        *  This function sets this string to the exact contents of @a __str.
    1590             :        *  @a __str is a valid, but unspecified string.
    1591             :        */
    1592             :       _GLIBCXX20_CONSTEXPR
    1593             :       basic_string&
    1594             :       assign(basic_string&& __str)
    1595             :       noexcept(_Alloc_traits::_S_nothrow_move())
    1596             :       {
    1597             :         // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1598             :         // 2063. Contradictory requirements for string move assignment
    1599             :         return *this = std::move(__str);
    1600             :       }
    1601             : #endif // C++11
    1602             : 
    1603             :       /**
    1604             :        *  @brief  Set value to a substring of a string.
    1605             :        *  @param __str  The string to use.
    1606             :        *  @param __pos  Index of the first character of str.
    1607             :        *  @param __n  Number of characters to use.
    1608             :        *  @return  Reference to this string.
    1609             :        *  @throw  std::out_of_range if @a pos is not a valid index.
    1610             :        *
    1611             :        *  This function sets this string to the substring of @a __str
    1612             :        *  consisting of @a __n characters at @a __pos.  If @a __n is
    1613             :        *  is larger than the number of available characters in @a
    1614             :        *  __str, the remainder of @a __str is used.
    1615             :        */
    1616             :       _GLIBCXX20_CONSTEXPR
    1617             :       basic_string&
    1618             :       assign(const basic_string& __str, size_type __pos, size_type __n = npos)
    1619             :       { return _M_replace(size_type(0), this->size(), __str._M_data()
    1620             :                           + __str._M_check(__pos, "basic_string::assign"),
    1621             :                           __str._M_limit(__pos, __n)); }
    1622             : 
    1623             :       /**
    1624             :        *  @brief  Set value to a C substring.
    1625             :        *  @param __s  The C string to use.
    1626             :        *  @param __n  Number of characters to use.
    1627             :        *  @return  Reference to this string.
    1628             :        *
    1629             :        *  This function sets the value of this string to the first @a __n
    1630             :        *  characters of @a __s.  If @a __n is is larger than the number of
    1631             :        *  available characters in @a __s, the remainder of @a __s is used.
    1632             :        */
    1633             :       _GLIBCXX20_CONSTEXPR
    1634             :       basic_string&
    1635             :       assign(const _CharT* __s, size_type __n)
    1636             :       {
    1637             :         __glibcxx_requires_string_len(__s, __n);
    1638             :         return _M_replace(size_type(0), this->size(), __s, __n);
    1639             :       }
    1640             : 
    1641             :       /**
    1642             :        *  @brief  Set value to contents of a C string.
    1643             :        *  @param __s  The C string to use.
    1644             :        *  @return  Reference to this string.
    1645             :        *
    1646             :        *  This function sets the value of this string to the value of @a __s.
    1647             :        *  The data is copied, so there is no dependence on @a __s once the
    1648             :        *  function returns.
    1649             :        */
    1650             :       _GLIBCXX20_CONSTEXPR
    1651             :       basic_string&
    1652             :       assign(const _CharT* __s)
    1653             :       {
    1654             :         __glibcxx_requires_string(__s);
    1655             :         return _M_replace(size_type(0), this->size(), __s,
    1656             :                           traits_type::length(__s));
    1657             :       }
    1658             : 
    1659             :       /**
    1660             :        *  @brief  Set value to multiple characters.
    1661             :        *  @param __n  Length of the resulting string.
    1662             :        *  @param __c  The character to use.
    1663             :        *  @return  Reference to this string.
    1664             :        *
    1665             :        *  This function sets the value of this string to @a __n copies of
    1666             :        *  character @a __c.
    1667             :        */
    1668             :       _GLIBCXX20_CONSTEXPR
    1669             :       basic_string&
    1670             :       assign(size_type __n, _CharT __c)
    1671             :       { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
    1672             : 
    1673             :       /**
    1674             :        *  @brief  Set value to a range of characters.
    1675             :        *  @param __first  Iterator referencing the first character to append.
    1676             :        *  @param __last  Iterator marking the end of the range.
    1677             :        *  @return  Reference to this string.
    1678             :        *
    1679             :        *  Sets value of string to characters in the range [__first,__last).
    1680             :       */
    1681             : #if __cplusplus >= 201103L
    1682             :       template<class _InputIterator,
    1683             :                typename = std::_RequireInputIter<_InputIterator>>
    1684             :         _GLIBCXX20_CONSTEXPR
    1685             : #else
    1686             :       template<class _InputIterator>
    1687             : #endif
    1688             :         basic_string&
    1689             :         assign(_InputIterator __first, _InputIterator __last)
    1690             :         { return this->replace(begin(), end(), __first, __last); }
    1691             : 
    1692             : #if __cplusplus >= 201103L
    1693             :       /**
    1694             :        *  @brief  Set value to an initializer_list of characters.
    1695             :        *  @param __l  The initializer_list of characters to assign.
    1696             :        *  @return  Reference to this string.
    1697             :        */
    1698             :       _GLIBCXX20_CONSTEXPR
    1699             :       basic_string&
    1700             :       assign(initializer_list<_CharT> __l)
    1701             :       { return this->assign(__l.begin(), __l.size()); }
    1702             : #endif // C++11
    1703             : 
    1704             : #if __cplusplus >= 201703L
    1705             :       /**
    1706             :        *  @brief  Set value from a string_view.
    1707             :        *  @param __svt  The source object convertible to string_view.
    1708             :        *  @return  Reference to this string.
    1709             :        */
    1710             :       template<typename _Tp>
    1711             :         _GLIBCXX20_CONSTEXPR
    1712             :         _If_sv<_Tp, basic_string&>
    1713             :         assign(const _Tp& __svt)
    1714             :         {
    1715             :           __sv_type __sv = __svt;
    1716             :           return this->assign(__sv.data(), __sv.size());
    1717             :         }
    1718             : 
    1719             :       /**
    1720             :        *  @brief  Set value from a range of characters in a string_view.
    1721             :        *  @param __svt  The source object convertible to string_view.
    1722             :        *  @param __pos  The position in the string_view to assign from.
    1723             :        *  @param __n  The number of characters to assign.
    1724             :        *  @return  Reference to this string.
    1725             :        */
    1726             :       template<typename _Tp>
    1727             :         _GLIBCXX20_CONSTEXPR
    1728             :         _If_sv<_Tp, basic_string&>
    1729             :         assign(const _Tp& __svt, size_type __pos, size_type __n = npos)
    1730             :         {
    1731             :           __sv_type __sv = __svt;
    1732             :           return _M_replace(size_type(0), this->size(),
    1733             :               __sv.data()
    1734             :               + std::__sv_check(__sv.size(), __pos, "basic_string::assign"),
    1735             :               std::__sv_limit(__sv.size(), __pos, __n));
    1736             :         }
    1737             : #endif // C++17
    1738             : 
    1739             : #if __cplusplus >= 201103L
    1740             :       /**
    1741             :        *  @brief  Insert multiple characters.
    1742             :        *  @param __p  Const_iterator referencing location in string to
    1743             :        *              insert at.
    1744             :        *  @param __n  Number of characters to insert
    1745             :        *  @param __c  The character to insert.
    1746             :        *  @return  Iterator referencing the first inserted char.
    1747             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1748             :        *
    1749             :        *  Inserts @a __n copies of character @a __c starting at the
    1750             :        *  position referenced by iterator @a __p.  If adding
    1751             :        *  characters causes the length to exceed max_size(),
    1752             :        *  length_error is thrown.  The value of the string doesn't
    1753             :        *  change if an error is thrown.
    1754             :       */
    1755             :       _GLIBCXX20_CONSTEXPR
    1756             :       iterator
    1757             :       insert(const_iterator __p, size_type __n, _CharT __c)
    1758             :       {
    1759             :         _GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
    1760             :         const size_type __pos = __p - begin();
    1761             :         this->replace(__p, __p, __n, __c);
    1762             :         return iterator(this->_M_data() + __pos);
    1763             :       }
    1764             : #else
    1765             :       /**
    1766             :        *  @brief  Insert multiple characters.
    1767             :        *  @param __p  Iterator referencing location in string to insert at.
    1768             :        *  @param __n  Number of characters to insert
    1769             :        *  @param __c  The character to insert.
    1770             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1771             :        *
    1772             :        *  Inserts @a __n copies of character @a __c starting at the
    1773             :        *  position referenced by iterator @a __p.  If adding
    1774             :        *  characters causes the length to exceed max_size(),
    1775             :        *  length_error is thrown.  The value of the string doesn't
    1776             :        *  change if an error is thrown.
    1777             :       */
    1778             :       void
    1779             :       insert(iterator __p, size_type __n, _CharT __c)
    1780             :       { this->replace(__p, __p, __n, __c);  }
    1781             : #endif
    1782             : 
    1783             : #if __cplusplus >= 201103L
    1784             :       /**
    1785             :        *  @brief  Insert a range of characters.
    1786             :        *  @param __p  Const_iterator referencing location in string to
    1787             :        *              insert at.
    1788             :        *  @param __beg  Start of range.
    1789             :        *  @param __end  End of range.
    1790             :        *  @return  Iterator referencing the first inserted char.
    1791             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1792             :        *
    1793             :        *  Inserts characters in range [beg,end).  If adding characters
    1794             :        *  causes the length to exceed max_size(), length_error is
    1795             :        *  thrown.  The value of the string doesn't change if an error
    1796             :        *  is thrown.
    1797             :       */
    1798             :       template<class _InputIterator,
    1799             :                typename = std::_RequireInputIter<_InputIterator>>
    1800             :         _GLIBCXX20_CONSTEXPR
    1801             :         iterator
    1802             :         insert(const_iterator __p, _InputIterator __beg, _InputIterator __end)
    1803             :         {
    1804             :           _GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
    1805             :           const size_type __pos = __p - begin();
    1806             :           this->replace(__p, __p, __beg, __end);
    1807             :           return iterator(this->_M_data() + __pos);
    1808             :         }
    1809             : #else
    1810             :       /**
    1811             :        *  @brief  Insert a range of characters.
    1812             :        *  @param __p  Iterator referencing location in string to insert at.
    1813             :        *  @param __beg  Start of range.
    1814             :        *  @param __end  End of range.
    1815             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1816             :        *
    1817             :        *  Inserts characters in range [__beg,__end).  If adding
    1818             :        *  characters causes the length to exceed max_size(),
    1819             :        *  length_error is thrown.  The value of the string doesn't
    1820             :        *  change if an error is thrown.
    1821             :       */
    1822             :       template<class _InputIterator>
    1823             :         void
    1824             :         insert(iterator __p, _InputIterator __beg, _InputIterator __end)
    1825             :         { this->replace(__p, __p, __beg, __end); }
    1826             : #endif
    1827             : 
    1828             : #if __cplusplus >= 201103L
    1829             :       /**
    1830             :        *  @brief  Insert an initializer_list of characters.
    1831             :        *  @param __p  Iterator referencing location in string to insert at.
    1832             :        *  @param __l  The initializer_list of characters to insert.
    1833             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1834             :        */
    1835             :       _GLIBCXX20_CONSTEXPR
    1836             :       iterator
    1837             :       insert(const_iterator __p, initializer_list<_CharT> __l)
    1838             :       { return this->insert(__p, __l.begin(), __l.end()); }
    1839             : 
    1840             : #ifdef _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
    1841             :       // See PR libstdc++/83328
    1842             :       void
    1843             :       insert(iterator __p, initializer_list<_CharT> __l)
    1844             :       {
    1845             :         _GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
    1846             :         this->insert(__p - begin(), __l.begin(), __l.size());
    1847             :       }
    1848             : #endif
    1849             : #endif // C++11
    1850             : 
    1851             :       /**
    1852             :        *  @brief  Insert value of a string.
    1853             :        *  @param __pos1 Position in string to insert at.
    1854             :        *  @param __str  The string to insert.
    1855             :        *  @return  Reference to this string.
    1856             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1857             :        *
    1858             :        *  Inserts value of @a __str starting at @a __pos1.  If adding
    1859             :        *  characters causes the length to exceed max_size(),
    1860             :        *  length_error is thrown.  The value of the string doesn't
    1861             :        *  change if an error is thrown.
    1862             :       */
    1863             :       _GLIBCXX20_CONSTEXPR
    1864             :       basic_string&
    1865             :       insert(size_type __pos1, const basic_string& __str)
    1866             :       { return this->replace(__pos1, size_type(0),
    1867             :                              __str._M_data(), __str.size()); }
    1868             : 
    1869             :       /**
    1870             :        *  @brief  Insert a substring.
    1871             :        *  @param __pos1  Position in string to insert at.
    1872             :        *  @param __str   The string to insert.
    1873             :        *  @param __pos2  Start of characters in str to insert.
    1874             :        *  @param __n  Number of characters to insert.
    1875             :        *  @return  Reference to this string.
    1876             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1877             :        *  @throw  std::out_of_range  If @a pos1 > size() or
    1878             :        *  @a __pos2 > @a str.size().
    1879             :        *
    1880             :        *  Starting at @a pos1, insert @a __n character of @a __str
    1881             :        *  beginning with @a __pos2.  If adding characters causes the
    1882             :        *  length to exceed max_size(), length_error is thrown.  If @a
    1883             :        *  __pos1 is beyond the end of this string or @a __pos2 is
    1884             :        *  beyond the end of @a __str, out_of_range is thrown.  The
    1885             :        *  value of the string doesn't change if an error is thrown.
    1886             :       */
    1887             :       _GLIBCXX20_CONSTEXPR
    1888             :       basic_string&
    1889             :       insert(size_type __pos1, const basic_string& __str,
    1890             :              size_type __pos2, size_type __n = npos)
    1891             :       { return this->replace(__pos1, size_type(0), __str._M_data()
    1892             :                              + __str._M_check(__pos2, "basic_string::insert"),
    1893             :                              __str._M_limit(__pos2, __n)); }
    1894             : 
    1895             :       /**
    1896             :        *  @brief  Insert a C substring.
    1897             :        *  @param __pos  Position in string to insert at.
    1898             :        *  @param __s  The C string to insert.
    1899             :        *  @param __n  The number of characters to insert.
    1900             :        *  @return  Reference to this string.
    1901             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1902             :        *  @throw  std::out_of_range  If @a __pos is beyond the end of this
    1903             :        *  string.
    1904             :        *
    1905             :        *  Inserts the first @a __n characters of @a __s starting at @a
    1906             :        *  __pos.  If adding characters causes the length to exceed
    1907             :        *  max_size(), length_error is thrown.  If @a __pos is beyond
    1908             :        *  end(), out_of_range is thrown.  The value of the string
    1909             :        *  doesn't change if an error is thrown.
    1910             :       */
    1911             :       _GLIBCXX20_CONSTEXPR
    1912             :       basic_string&
    1913             :       insert(size_type __pos, const _CharT* __s, size_type __n)
    1914             :       { return this->replace(__pos, size_type(0), __s, __n); }
    1915             : 
    1916             :       /**
    1917             :        *  @brief  Insert a C string.
    1918             :        *  @param __pos  Position in string to insert at.
    1919             :        *  @param __s  The C string to insert.
    1920             :        *  @return  Reference to this string.
    1921             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1922             :        *  @throw  std::out_of_range  If @a pos is beyond the end of this
    1923             :        *  string.
    1924             :        *
    1925             :        *  Inserts the first @a n characters of @a __s starting at @a __pos.  If
    1926             :        *  adding characters causes the length to exceed max_size(),
    1927             :        *  length_error is thrown.  If @a __pos is beyond end(), out_of_range is
    1928             :        *  thrown.  The value of the string doesn't change if an error is
    1929             :        *  thrown.
    1930             :       */
    1931             :       _GLIBCXX20_CONSTEXPR
    1932             :       basic_string&
    1933             :       insert(size_type __pos, const _CharT* __s)
    1934             :       {
    1935             :         __glibcxx_requires_string(__s);
    1936             :         return this->replace(__pos, size_type(0), __s,
    1937             :                              traits_type::length(__s));
    1938             :       }
    1939             : 
    1940             :       /**
    1941             :        *  @brief  Insert multiple characters.
    1942             :        *  @param __pos  Index in string to insert at.
    1943             :        *  @param __n  Number of characters to insert
    1944             :        *  @param __c  The character to insert.
    1945             :        *  @return  Reference to this string.
    1946             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1947             :        *  @throw  std::out_of_range  If @a __pos is beyond the end of this
    1948             :        *  string.
    1949             :        *
    1950             :        *  Inserts @a __n copies of character @a __c starting at index
    1951             :        *  @a __pos.  If adding characters causes the length to exceed
    1952             :        *  max_size(), length_error is thrown.  If @a __pos > length(),
    1953             :        *  out_of_range is thrown.  The value of the string doesn't
    1954             :        *  change if an error is thrown.
    1955             :       */
    1956             :       _GLIBCXX20_CONSTEXPR
    1957             :       basic_string&
    1958             :       insert(size_type __pos, size_type __n, _CharT __c)
    1959             :       { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
    1960             :                               size_type(0), __n, __c); }
    1961             : 
    1962             :       /**
    1963             :        *  @brief  Insert one character.
    1964             :        *  @param __p  Iterator referencing position in string to insert at.
    1965             :        *  @param __c  The character to insert.
    1966             :        *  @return  Iterator referencing newly inserted char.
    1967             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    1968             :        *
    1969             :        *  Inserts character @a __c at position referenced by @a __p.
    1970             :        *  If adding character causes the length to exceed max_size(),
    1971             :        *  length_error is thrown.  If @a __p is beyond end of string,
    1972             :        *  out_of_range is thrown.  The value of the string doesn't
    1973             :        *  change if an error is thrown.
    1974             :       */
    1975             :       _GLIBCXX20_CONSTEXPR
    1976             :       iterator
    1977             :       insert(__const_iterator __p, _CharT __c)
    1978             :       {
    1979             :         _GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
    1980             :         const size_type __pos = __p - begin();
    1981             :         _M_replace_aux(__pos, size_type(0), size_type(1), __c);
    1982             :         return iterator(_M_data() + __pos);
    1983             :       }
    1984             : 
    1985             : #if __cplusplus >= 201703L
    1986             :       /**
    1987             :        *  @brief  Insert a string_view.
    1988             :        *  @param __pos  Position in string to insert at.
    1989             :        *  @param __svt  The object convertible to string_view to insert.
    1990             :        *  @return  Reference to this string.
    1991             :       */
    1992             :       template<typename _Tp>
    1993             :         _GLIBCXX20_CONSTEXPR
    1994             :         _If_sv<_Tp, basic_string&>
    1995             :         insert(size_type __pos, const _Tp& __svt)
    1996             :         {
    1997             :           __sv_type __sv = __svt;
    1998             :           return this->insert(__pos, __sv.data(), __sv.size());
    1999             :         }
    2000             : 
    2001             :       /**
    2002             :        *  @brief  Insert a string_view.
    2003             :        *  @param __pos1  Position in string to insert at.
    2004             :        *  @param __svt   The object convertible to string_view to insert from.
    2005             :        *  @param __pos2  Start of characters in str to insert.
    2006             :        *  @param __n    The number of characters to insert.
    2007             :        *  @return  Reference to this string.
    2008             :       */
    2009             :       template<typename _Tp>
    2010             :         _GLIBCXX20_CONSTEXPR
    2011             :         _If_sv<_Tp, basic_string&>
    2012             :         insert(size_type __pos1, const _Tp& __svt,
    2013             :                size_type __pos2, size_type __n = npos)
    2014             :         {
    2015             :           __sv_type __sv = __svt;
    2016             :           return this->replace(__pos1, size_type(0),
    2017             :               __sv.data()
    2018             :               + std::__sv_check(__sv.size(), __pos2, "basic_string::insert"),
    2019             :               std::__sv_limit(__sv.size(), __pos2, __n));
    2020             :         }
    2021             : #endif // C++17
    2022             : 
    2023             :       /**
    2024             :        *  @brief  Remove characters.
    2025             :        *  @param __pos  Index of first character to remove (default 0).
    2026             :        *  @param __n  Number of characters to remove (default remainder).
    2027             :        *  @return  Reference to this string.
    2028             :        *  @throw  std::out_of_range  If @a pos is beyond the end of this
    2029             :        *  string.
    2030             :        *
    2031             :        *  Removes @a __n characters from this string starting at @a
    2032             :        *  __pos.  The length of the string is reduced by @a __n.  If
    2033             :        *  there are < @a __n characters to remove, the remainder of
    2034             :        *  the string is truncated.  If @a __p is beyond end of string,
    2035             :        *  out_of_range is thrown.  The value of the string doesn't
    2036             :        *  change if an error is thrown.
    2037             :       */
    2038             :       _GLIBCXX20_CONSTEXPR
    2039             :       basic_string&
    2040             :       erase(size_type __pos = 0, size_type __n = npos)
    2041             :       {
    2042             :         _M_check(__pos, "basic_string::erase");
    2043             :         if (__n == npos)
    2044             :           this->_M_set_length(__pos);
    2045             :         else if (__n != 0)
    2046             :           this->_M_erase(__pos, _M_limit(__pos, __n));
    2047             :         return *this;
    2048             :       }
    2049             : 
    2050             :       /**
    2051             :        *  @brief  Remove one character.
    2052             :        *  @param __position  Iterator referencing the character to remove.
    2053             :        *  @return  iterator referencing same location after removal.
    2054             :        *
    2055             :        *  Removes the character at @a __position from this string. The value
    2056             :        *  of the string doesn't change if an error is thrown.
    2057             :       */
    2058             :       _GLIBCXX20_CONSTEXPR
    2059             :       iterator
    2060             :       erase(__const_iterator __position)
    2061             :       {
    2062             :         _GLIBCXX_DEBUG_PEDASSERT(__position >= begin()
    2063             :                                  && __position < end());
    2064             :         const size_type __pos = __position - begin();
    2065             :         this->_M_erase(__pos, size_type(1));
    2066             :         return iterator(_M_data() + __pos);
    2067             :       }
    2068             : 
    2069             :       /**
    2070             :        *  @brief  Remove a range of characters.
    2071             :        *  @param __first  Iterator referencing the first character to remove.
    2072             :        *  @param __last  Iterator referencing the end of the range.
    2073             :        *  @return  Iterator referencing location of first after removal.
    2074             :        *
    2075             :        *  Removes the characters in the range [first,last) from this string.
    2076             :        *  The value of the string doesn't change if an error is thrown.
    2077             :       */
    2078             :       _GLIBCXX20_CONSTEXPR
    2079             :       iterator
    2080             :       erase(__const_iterator __first, __const_iterator __last)
    2081             :       {
    2082             :         _GLIBCXX_DEBUG_PEDASSERT(__first >= begin() && __first <= __last
    2083             :                                  && __last <= end());
    2084             :         const size_type __pos = __first - begin();
    2085             :         if (__last == end())
    2086             :           this->_M_set_length(__pos);
    2087             :         else
    2088             :           this->_M_erase(__pos, __last - __first);
    2089             :         return iterator(this->_M_data() + __pos);
    2090             :       }
    2091             : 
    2092             : #if __cplusplus >= 201103L
    2093             :       /**
    2094             :        *  @brief  Remove the last character.
    2095             :        *
    2096             :        *  The string must be non-empty.
    2097             :        */
    2098             :       _GLIBCXX20_CONSTEXPR
    2099             :       void
    2100             :       pop_back() noexcept
    2101             :       {
    2102             :         __glibcxx_assert(!empty());
    2103             :         _M_erase(size() - 1, 1);
    2104             :       }
    2105             : #endif // C++11
    2106             : 
    2107             :       /**
    2108             :        *  @brief  Replace characters with value from another string.
    2109             :        *  @param __pos  Index of first character to replace.
    2110             :        *  @param __n  Number of characters to be replaced.
    2111             :        *  @param __str  String to insert.
    2112             :        *  @return  Reference to this string.
    2113             :        *  @throw  std::out_of_range  If @a pos is beyond the end of this
    2114             :        *  string.
    2115             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2116             :        *
    2117             :        *  Removes the characters in the range [__pos,__pos+__n) from
    2118             :        *  this string.  In place, the value of @a __str is inserted.
    2119             :        *  If @a __pos is beyond end of string, out_of_range is thrown.
    2120             :        *  If the length of the result exceeds max_size(), length_error
    2121             :        *  is thrown.  The value of the string doesn't change if an
    2122             :        *  error is thrown.
    2123             :       */
    2124             :       _GLIBCXX20_CONSTEXPR
    2125             :       basic_string&
    2126             :       replace(size_type __pos, size_type __n, const basic_string& __str)
    2127             :       { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
    2128             : 
    2129             :       /**
    2130             :        *  @brief  Replace characters with value from another string.
    2131             :        *  @param __pos1  Index of first character to replace.
    2132             :        *  @param __n1  Number of characters to be replaced.
    2133             :        *  @param __str  String to insert.
    2134             :        *  @param __pos2  Index of first character of str to use.
    2135             :        *  @param __n2  Number of characters from str to use.
    2136             :        *  @return  Reference to this string.
    2137             :        *  @throw  std::out_of_range  If @a __pos1 > size() or @a __pos2 >
    2138             :        *  __str.size().
    2139             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2140             :        *
    2141             :        *  Removes the characters in the range [__pos1,__pos1 + n) from this
    2142             :        *  string.  In place, the value of @a __str is inserted.  If @a __pos is
    2143             :        *  beyond end of string, out_of_range is thrown.  If the length of the
    2144             :        *  result exceeds max_size(), length_error is thrown.  The value of the
    2145             :        *  string doesn't change if an error is thrown.
    2146             :       */
    2147             :       _GLIBCXX20_CONSTEXPR
    2148             :       basic_string&
    2149             :       replace(size_type __pos1, size_type __n1, const basic_string& __str,
    2150             :               size_type __pos2, size_type __n2 = npos)
    2151             :       { return this->replace(__pos1, __n1, __str._M_data()
    2152             :                              + __str._M_check(__pos2, "basic_string::replace"),
    2153             :                              __str._M_limit(__pos2, __n2)); }
    2154             : 
    2155             :       /**
    2156             :        *  @brief  Replace characters with value of a C substring.
    2157             :        *  @param __pos  Index of first character to replace.
    2158             :        *  @param __n1  Number of characters to be replaced.
    2159             :        *  @param __s  C string to insert.
    2160             :        *  @param __n2  Number of characters from @a s to use.
    2161             :        *  @return  Reference to this string.
    2162             :        *  @throw  std::out_of_range  If @a pos1 > size().
    2163             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2164             :        *
    2165             :        *  Removes the characters in the range [__pos,__pos + __n1)
    2166             :        *  from this string.  In place, the first @a __n2 characters of
    2167             :        *  @a __s are inserted, or all of @a __s if @a __n2 is too large.  If
    2168             :        *  @a __pos is beyond end of string, out_of_range is thrown.  If
    2169             :        *  the length of result exceeds max_size(), length_error is
    2170             :        *  thrown.  The value of the string doesn't change if an error
    2171             :        *  is thrown.
    2172             :       */
    2173             :       _GLIBCXX20_CONSTEXPR
    2174             :       basic_string&
    2175             :       replace(size_type __pos, size_type __n1, const _CharT* __s,
    2176             :               size_type __n2)
    2177             :       {
    2178             :         __glibcxx_requires_string_len(__s, __n2);
    2179             :         return _M_replace(_M_check(__pos, "basic_string::replace"),
    2180             :                           _M_limit(__pos, __n1), __s, __n2);
    2181             :       }
    2182             : 
    2183             :       /**
    2184             :        *  @brief  Replace characters with value of a C string.
    2185             :        *  @param __pos  Index of first character to replace.
    2186             :        *  @param __n1  Number of characters to be replaced.
    2187             :        *  @param __s  C string to insert.
    2188             :        *  @return  Reference to this string.
    2189             :        *  @throw  std::out_of_range  If @a pos > size().
    2190             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2191             :        *
    2192             :        *  Removes the characters in the range [__pos,__pos + __n1)
    2193             :        *  from this string.  In place, the characters of @a __s are
    2194             :        *  inserted.  If @a __pos is beyond end of string, out_of_range
    2195             :        *  is thrown.  If the length of result exceeds max_size(),
    2196             :        *  length_error is thrown.  The value of the string doesn't
    2197             :        *  change if an error is thrown.
    2198             :       */
    2199             :       _GLIBCXX20_CONSTEXPR
    2200             :       basic_string&
    2201             :       replace(size_type __pos, size_type __n1, const _CharT* __s)
    2202             :       {
    2203             :         __glibcxx_requires_string(__s);
    2204             :         return this->replace(__pos, __n1, __s, traits_type::length(__s));
    2205             :       }
    2206             : 
    2207             :       /**
    2208             :        *  @brief  Replace characters with multiple characters.
    2209             :        *  @param __pos  Index of first character to replace.
    2210             :        *  @param __n1  Number of characters to be replaced.
    2211             :        *  @param __n2  Number of characters to insert.
    2212             :        *  @param __c  Character to insert.
    2213             :        *  @return  Reference to this string.
    2214             :        *  @throw  std::out_of_range  If @a __pos > size().
    2215             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2216             :        *
    2217             :        *  Removes the characters in the range [pos,pos + n1) from this
    2218             :        *  string.  In place, @a __n2 copies of @a __c are inserted.
    2219             :        *  If @a __pos is beyond end of string, out_of_range is thrown.
    2220             :        *  If the length of result exceeds max_size(), length_error is
    2221             :        *  thrown.  The value of the string doesn't change if an error
    2222             :        *  is thrown.
    2223             :       */
    2224             :       _GLIBCXX20_CONSTEXPR
    2225             :       basic_string&
    2226             :       replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
    2227             :       { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
    2228             :                               _M_limit(__pos, __n1), __n2, __c); }
    2229             : 
    2230             :       /**
    2231             :        *  @brief  Replace range of characters with string.
    2232             :        *  @param __i1  Iterator referencing start of range to replace.
    2233             :        *  @param __i2  Iterator referencing end of range to replace.
    2234             :        *  @param __str  String value to insert.
    2235             :        *  @return  Reference to this string.
    2236             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2237             :        *
    2238             :        *  Removes the characters in the range [__i1,__i2).  In place,
    2239             :        *  the value of @a __str is inserted.  If the length of result
    2240             :        *  exceeds max_size(), length_error is thrown.  The value of
    2241             :        *  the string doesn't change if an error is thrown.
    2242             :       */
    2243             :       _GLIBCXX20_CONSTEXPR
    2244             :       basic_string&
    2245             :       replace(__const_iterator __i1, __const_iterator __i2,
    2246             :               const basic_string& __str)
    2247             :       { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
    2248             : 
    2249             :       /**
    2250             :        *  @brief  Replace range of characters with C substring.
    2251             :        *  @param __i1  Iterator referencing start of range to replace.
    2252             :        *  @param __i2  Iterator referencing end of range to replace.
    2253             :        *  @param __s  C string value to insert.
    2254             :        *  @param __n  Number of characters from s to insert.
    2255             :        *  @return  Reference to this string.
    2256             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2257             :        *
    2258             :        *  Removes the characters in the range [__i1,__i2).  In place,
    2259             :        *  the first @a __n characters of @a __s are inserted.  If the
    2260             :        *  length of result exceeds max_size(), length_error is thrown.
    2261             :        *  The value of the string doesn't change if an error is
    2262             :        *  thrown.
    2263             :       */
    2264             :       _GLIBCXX20_CONSTEXPR
    2265             :       basic_string&
    2266             :       replace(__const_iterator __i1, __const_iterator __i2,
    2267             :               const _CharT* __s, size_type __n)
    2268             :       {
    2269             :         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
    2270             :                                  && __i2 <= end());
    2271             :         return this->replace(__i1 - begin(), __i2 - __i1, __s, __n);
    2272             :       }
    2273             : 
    2274             :       /**
    2275             :        *  @brief  Replace range of characters with C string.
    2276             :        *  @param __i1  Iterator referencing start of range to replace.
    2277             :        *  @param __i2  Iterator referencing end of range to replace.
    2278             :        *  @param __s  C string value to insert.
    2279             :        *  @return  Reference to this string.
    2280             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2281             :        *
    2282             :        *  Removes the characters in the range [__i1,__i2).  In place,
    2283             :        *  the characters of @a __s are inserted.  If the length of
    2284             :        *  result exceeds max_size(), length_error is thrown.  The
    2285             :        *  value of the string doesn't change if an error is thrown.
    2286             :       */
    2287             :       _GLIBCXX20_CONSTEXPR
    2288             :       basic_string&
    2289             :       replace(__const_iterator __i1, __const_iterator __i2, const _CharT* __s)
    2290             :       {
    2291             :         __glibcxx_requires_string(__s);
    2292             :         return this->replace(__i1, __i2, __s, traits_type::length(__s));
    2293             :       }
    2294             : 
    2295             :       /**
    2296             :        *  @brief  Replace range of characters with multiple characters
    2297             :        *  @param __i1  Iterator referencing start of range to replace.
    2298             :        *  @param __i2  Iterator referencing end of range to replace.
    2299             :        *  @param __n  Number of characters to insert.
    2300             :        *  @param __c  Character to insert.
    2301             :        *  @return  Reference to this string.
    2302             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2303             :        *
    2304             :        *  Removes the characters in the range [__i1,__i2).  In place,
    2305             :        *  @a __n copies of @a __c are inserted.  If the length of
    2306             :        *  result exceeds max_size(), length_error is thrown.  The
    2307             :        *  value of the string doesn't change if an error is thrown.
    2308             :       */
    2309             :       _GLIBCXX20_CONSTEXPR
    2310             :       basic_string&
    2311             :       replace(__const_iterator __i1, __const_iterator __i2, size_type __n,
    2312             :               _CharT __c)
    2313             :       {
    2314             :         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
    2315             :                                  && __i2 <= end());
    2316             :         return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __c);
    2317             :       }
    2318             : 
    2319             :       /**
    2320             :        *  @brief  Replace range of characters with range.
    2321             :        *  @param __i1  Iterator referencing start of range to replace.
    2322             :        *  @param __i2  Iterator referencing end of range to replace.
    2323             :        *  @param __k1  Iterator referencing start of range to insert.
    2324             :        *  @param __k2  Iterator referencing end of range to insert.
    2325             :        *  @return  Reference to this string.
    2326             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2327             :        *
    2328             :        *  Removes the characters in the range [__i1,__i2).  In place,
    2329             :        *  characters in the range [__k1,__k2) are inserted.  If the
    2330             :        *  length of result exceeds max_size(), length_error is thrown.
    2331             :        *  The value of the string doesn't change if an error is
    2332             :        *  thrown.
    2333             :       */
    2334             : #if __cplusplus >= 201103L
    2335             :       template<class _InputIterator,
    2336             :                typename = std::_RequireInputIter<_InputIterator>>
    2337             :         _GLIBCXX20_CONSTEXPR
    2338             :         basic_string&
    2339             :         replace(const_iterator __i1, const_iterator __i2,
    2340             :                 _InputIterator __k1, _InputIterator __k2)
    2341             :         {
    2342             :           _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
    2343             :                                    && __i2 <= end());
    2344             :           __glibcxx_requires_valid_range(__k1, __k2);
    2345             :           return this->_M_replace_dispatch(__i1, __i2, __k1, __k2,
    2346             :                                            std::__false_type());
    2347             :         }
    2348             : #else
    2349             :       template<class _InputIterator>
    2350             : #ifdef _GLIBCXX_DISAMBIGUATE_REPLACE_INST
    2351             :         typename __enable_if_not_native_iterator<_InputIterator>::__type
    2352             : #else
    2353             :         basic_string&
    2354             : #endif
    2355             :         replace(iterator __i1, iterator __i2,
    2356             :                 _InputIterator __k1, _InputIterator __k2)
    2357             :         {
    2358             :           _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
    2359             :                                    && __i2 <= end());
    2360             :           __glibcxx_requires_valid_range(__k1, __k2);
    2361             :           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
    2362             :           return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
    2363             :         }
    2364             : #endif
    2365             : 
    2366             :       // Specializations for the common case of pointer and iterator:
    2367             :       // useful to avoid the overhead of temporary buffering in _M_replace.
    2368             :       _GLIBCXX20_CONSTEXPR
    2369             :       basic_string&
    2370             :       replace(__const_iterator __i1, __const_iterator __i2,
    2371             :               _CharT* __k1, _CharT* __k2)
    2372             :       {
    2373             :         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
    2374             :                                  && __i2 <= end());
    2375             :         __glibcxx_requires_valid_range(__k1, __k2);
    2376             :         return this->replace(__i1 - begin(), __i2 - __i1,
    2377             :                              __k1, __k2 - __k1);
    2378             :       }
    2379             : 
    2380             :       _GLIBCXX20_CONSTEXPR
    2381             :       basic_string&
    2382             :       replace(__const_iterator __i1, __const_iterator __i2,
    2383             :               const _CharT* __k1, const _CharT* __k2)
    2384             :       {
    2385             :         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
    2386             :                                  && __i2 <= end());
    2387             :         __glibcxx_requires_valid_range(__k1, __k2);
    2388             :         return this->replace(__i1 - begin(), __i2 - __i1,
    2389             :                              __k1, __k2 - __k1);
    2390             :       }
    2391             : 
    2392             :       _GLIBCXX20_CONSTEXPR
    2393             :       basic_string&
    2394             :       replace(__const_iterator __i1, __const_iterator __i2,
    2395             :               iterator __k1, iterator __k2)
    2396             :       {
    2397             :         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
    2398             :                                  && __i2 <= end());
    2399             :         __glibcxx_requires_valid_range(__k1, __k2);
    2400             :         return this->replace(__i1 - begin(), __i2 - __i1,
    2401             :                              __k1.base(), __k2 - __k1);
    2402             :       }
    2403             : 
    2404             :       _GLIBCXX20_CONSTEXPR
    2405             :       basic_string&
    2406             :       replace(__const_iterator __i1, __const_iterator __i2,
    2407             :               const_iterator __k1, const_iterator __k2)
    2408             :       {
    2409             :         _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
    2410             :                                  && __i2 <= end());
    2411             :         __glibcxx_requires_valid_range(__k1, __k2);
    2412             :         return this->replace(__i1 - begin(), __i2 - __i1,
    2413             :                              __k1.base(), __k2 - __k1);
    2414             :       }
    2415             : 
    2416             : #if __cplusplus >= 201103L
    2417             :       /**
    2418             :        *  @brief  Replace range of characters with initializer_list.
    2419             :        *  @param __i1  Iterator referencing start of range to replace.
    2420             :        *  @param __i2  Iterator referencing end of range to replace.
    2421             :        *  @param __l  The initializer_list of characters to insert.
    2422             :        *  @return  Reference to this string.
    2423             :        *  @throw  std::length_error  If new length exceeds @c max_size().
    2424             :        *
    2425             :        *  Removes the characters in the range [__i1,__i2).  In place,
    2426             :        *  characters in the range [__k1,__k2) are inserted.  If the
    2427             :        *  length of result exceeds max_size(), length_error is thrown.
    2428             :        *  The value of the string doesn't change if an error is
    2429             :        *  thrown.
    2430             :       */
    2431             :       _GLIBCXX20_CONSTEXPR
    2432             :       basic_string& replace(const_iterator __i1, const_iterator __i2,
    2433             :                             initializer_list<_CharT> __l)
    2434             :       { return this->replace(__i1, __i2, __l.begin(), __l.size()); }
    2435             : #endif // C++11
    2436             : 
    2437             : #if __cplusplus >= 201703L
    2438             :       /**
    2439             :        *  @brief  Replace range of characters with string_view.
    2440             :        *  @param __pos  The position to replace at.
    2441             :        *  @param __n    The number of characters to replace.
    2442             :        *  @param __svt  The object convertible to string_view to insert.
    2443             :        *  @return  Reference to this string.
    2444             :       */
    2445             :       template<typename _Tp>
    2446             :         _GLIBCXX20_CONSTEXPR
    2447             :         _If_sv<_Tp, basic_string&>
    2448             :         replace(size_type __pos, size_type __n, const _Tp& __svt)
    2449             :         {
    2450             :           __sv_type __sv = __svt;
    2451             :           return this->replace(__pos, __n, __sv.data(), __sv.size());
    2452             :         }
    2453             : 
    2454             :       /**
    2455             :        *  @brief  Replace range of characters with string_view.
    2456             :        *  @param __pos1  The position to replace at.
    2457             :        *  @param __n1    The number of characters to replace.
    2458             :        *  @param __svt   The object convertible to string_view to insert from.
    2459             :        *  @param __pos2  The position in the string_view to insert from.
    2460             :        *  @param __n2    The number of characters to insert.
    2461             :        *  @return  Reference to this string.
    2462             :       */
    2463             :       template<typename _Tp>
    2464             :         _GLIBCXX20_CONSTEXPR
    2465             :         _If_sv<_Tp, basic_string&>
    2466             :         replace(size_type __pos1, size_type __n1, const _Tp& __svt,
    2467             :                 size_type __pos2, size_type __n2 = npos)
    2468             :         {
    2469             :           __sv_type __sv = __svt;
    2470             :           return this->replace(__pos1, __n1,
    2471             :               __sv.data()
    2472             :               + std::__sv_check(__sv.size(), __pos2, "basic_string::replace"),
    2473             :               std::__sv_limit(__sv.size(), __pos2, __n2));
    2474             :         }
    2475             : 
    2476             :       /**
    2477             :        *  @brief  Replace range of characters with string_view.
    2478             :        *  @param __i1    An iterator referencing the start position
    2479             :           to replace at.
    2480             :        *  @param __i2    An iterator referencing the end position
    2481             :           for the replace.
    2482             :        *  @param __svt   The object convertible to string_view to insert from.
    2483             :        *  @return  Reference to this string.
    2484             :       */
    2485             :       template<typename _Tp>
    2486             :         _GLIBCXX20_CONSTEXPR
    2487             :         _If_sv<_Tp, basic_string&>
    2488             :         replace(const_iterator __i1, const_iterator __i2, const _Tp& __svt)
    2489             :         {
    2490             :           __sv_type __sv = __svt;
    2491             :           return this->replace(__i1 - begin(), __i2 - __i1, __sv);
    2492             :         }
    2493             : #endif // C++17
    2494             : 
    2495             :     private:
    2496             :       template<class _Integer>
    2497             :         _GLIBCXX20_CONSTEXPR
    2498             :         basic_string&
    2499             :         _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
    2500             :                             _Integer __n, _Integer __val, __true_type)
    2501             :         { return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __val); }
    2502             : 
    2503             :       template<class _InputIterator>
    2504             :         _GLIBCXX20_CONSTEXPR
    2505             :         basic_string&
    2506             :         _M_replace_dispatch(const_iterator __i1, const_iterator __i2,
    2507             :                             _InputIterator __k1, _InputIterator __k2,
    2508             :                             __false_type);
    2509             : 
    2510             :       _GLIBCXX20_CONSTEXPR
    2511             :       basic_string&
    2512             :       _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
    2513             :                      _CharT __c);
    2514             : 
    2515             :       _GLIBCXX20_CONSTEXPR
    2516             :       basic_string&
    2517             :       _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
    2518             :                  const size_type __len2);
    2519             : 
    2520             :       _GLIBCXX20_CONSTEXPR
    2521             :       basic_string&
    2522             :       _M_append(const _CharT* __s, size_type __n);
    2523             : 
    2524             :     public:
    2525             : 
    2526             :       /**
    2527             :        *  @brief  Copy substring into C string.
    2528             :        *  @param __s  C string to copy value into.
    2529             :        *  @param __n  Number of characters to copy.
    2530             :        *  @param __pos  Index of first character to copy.
    2531             :        *  @return  Number of characters actually copied
    2532             :        *  @throw  std::out_of_range  If __pos > size().
    2533             :        *
    2534             :        *  Copies up to @a __n characters starting at @a __pos into the
    2535             :        *  C string @a __s.  If @a __pos is %greater than size(),
    2536             :        *  out_of_range is thrown.
    2537             :       */
    2538             :       _GLIBCXX20_CONSTEXPR
    2539             :       size_type
    2540             :       copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
    2541             : 
    2542             :       /**
    2543             :        *  @brief  Swap contents with another string.
    2544             :        *  @param __s  String to swap with.
    2545             :        *
    2546             :        *  Exchanges the contents of this string with that of @a __s in constant
    2547             :        *  time.
    2548             :       */
    2549             :       _GLIBCXX20_CONSTEXPR
    2550             :       void
    2551             :       swap(basic_string& __s) _GLIBCXX_NOEXCEPT;
    2552             : 
    2553             :       // String operations:
    2554             :       /**
    2555             :        *  @brief  Return const pointer to null-terminated contents.
    2556             :        *
    2557             :        *  This is a handle to internal data.  Do not modify or dire things may
    2558             :        *  happen.
    2559             :       */
    2560             :       _GLIBCXX20_CONSTEXPR
    2561             :       const _CharT*
    2562       31159 :       c_str() const _GLIBCXX_NOEXCEPT
    2563       31159 :       { return _M_data(); }
    2564             : 
    2565             :       /**
    2566             :        *  @brief  Return const pointer to contents.
    2567             :        *
    2568             :        *  This is a pointer to internal data.  It is undefined to modify
    2569             :        *  the contents through the returned pointer. To get a pointer that
    2570             :        *  allows modifying the contents use @c &str[0] instead,
    2571             :        *  (or in C++17 the non-const @c str.data() overload).
    2572             :       */
    2573             :       _GLIBCXX20_CONSTEXPR
    2574             :       const _CharT*
    2575        6320 :       data() const _GLIBCXX_NOEXCEPT
    2576        6320 :       { return _M_data(); }
    2577             : 
    2578             : #if __cplusplus >= 201703L
    2579             :       /**
    2580             :        *  @brief  Return non-const pointer to contents.
    2581             :        *
    2582             :        *  This is a pointer to the character sequence held by the string.
    2583             :        *  Modifying the characters in the sequence is allowed.
    2584             :       */
    2585             :       _GLIBCXX20_CONSTEXPR
    2586             :       _CharT*
    2587             :       data() noexcept
    2588             :       { return _M_data(); }
    2589             : #endif
    2590             : 
    2591             :       /**
    2592             :        *  @brief  Return copy of allocator used to construct this string.
    2593             :       */
    2594             :       _GLIBCXX20_CONSTEXPR
    2595             :       allocator_type
    2596             :       get_allocator() const _GLIBCXX_NOEXCEPT
    2597             :       { return _M_get_allocator(); }
    2598             : 
    2599             :       /**
    2600             :        *  @brief  Find position of a C substring.
    2601             :        *  @param __s  C string to locate.
    2602             :        *  @param __pos  Index of character to search from.
    2603             :        *  @param __n  Number of characters from @a s to search for.
    2604             :        *  @return  Index of start of first occurrence.
    2605             :        *
    2606             :        *  Starting from @a __pos, searches forward for the first @a
    2607             :        *  __n characters in @a __s within this string.  If found,
    2608             :        *  returns the index where it begins.  If not found, returns
    2609             :        *  npos.
    2610             :       */
    2611             :       _GLIBCXX20_CONSTEXPR
    2612             :       size_type
    2613             :       find(const _CharT* __s, size_type __pos, size_type __n) const
    2614             :       _GLIBCXX_NOEXCEPT;
    2615             : 
    2616             :       /**
    2617             :        *  @brief  Find position of a string.
    2618             :        *  @param __str  String to locate.
    2619             :        *  @param __pos  Index of character to search from (default 0).
    2620             :        *  @return  Index of start of first occurrence.
    2621             :        *
    2622             :        *  Starting from @a __pos, searches forward for value of @a __str within
    2623             :        *  this string.  If found, returns the index where it begins.  If not
    2624             :        *  found, returns npos.
    2625             :       */
    2626             :       _GLIBCXX20_CONSTEXPR
    2627             :       size_type
    2628             :       find(const basic_string& __str, size_type __pos = 0) const
    2629             :       _GLIBCXX_NOEXCEPT
    2630             :       { return this->find(__str.data(), __pos, __str.size()); }
    2631             : 
    2632             : #if __cplusplus >= 201703L
    2633             :       /**
    2634             :        *  @brief  Find position of a string_view.
    2635             :        *  @param __svt  The object convertible to string_view to locate.
    2636             :        *  @param __pos  Index of character to search from (default 0).
    2637             :        *  @return  Index of start of first occurrence.
    2638             :       */
    2639             :       template<typename _Tp>
    2640             :         _GLIBCXX20_CONSTEXPR
    2641             :         _If_sv<_Tp, size_type>
    2642             :         find(const _Tp& __svt, size_type __pos = 0) const
    2643             :         noexcept(is_same<_Tp, __sv_type>::value)
    2644             :         {
    2645             :           __sv_type __sv = __svt;
    2646             :           return this->find(__sv.data(), __pos, __sv.size());
    2647             :         }
    2648             : #endif // C++17
    2649             : 
    2650             :       /**
    2651             :        *  @brief  Find position of a C string.
    2652             :        *  @param __s  C string to locate.
    2653             :        *  @param __pos  Index of character to search from (default 0).
    2654             :        *  @return  Index of start of first occurrence.
    2655             :        *
    2656             :        *  Starting from @a __pos, searches forward for the value of @a
    2657             :        *  __s within this string.  If found, returns the index where
    2658             :        *  it begins.  If not found, returns npos.
    2659             :       */
    2660             :       _GLIBCXX20_CONSTEXPR
    2661             :       size_type
    2662             :       find(const _CharT* __s, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
    2663             :       {
    2664             :         __glibcxx_requires_string(__s);
    2665             :         return this->find(__s, __pos, traits_type::length(__s));
    2666             :       }
    2667             : 
    2668             :       /**
    2669             :        *  @brief  Find position of a character.
    2670             :        *  @param __c  Character to locate.
    2671             :        *  @param __pos  Index of character to search from (default 0).
    2672             :        *  @return  Index of first occurrence.
    2673             :        *
    2674             :        *  Starting from @a __pos, searches forward for @a __c within
    2675             :        *  this string.  If found, returns the index where it was
    2676             :        *  found.  If not found, returns npos.
    2677             :       */
    2678             :       _GLIBCXX20_CONSTEXPR
    2679             :       size_type
    2680             :       find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
    2681             : 
    2682             :       /**
    2683             :        *  @brief  Find last position of a string.
    2684             :        *  @param __str  String to locate.
    2685             :        *  @param __pos  Index of character to search back from (default end).
    2686             :        *  @return  Index of start of last occurrence.
    2687             :        *
    2688             :        *  Starting from @a __pos, searches backward for value of @a
    2689             :        *  __str within this string.  If found, returns the index where
    2690             :        *  it begins.  If not found, returns npos.
    2691             :       */
    2692             :       _GLIBCXX20_CONSTEXPR
    2693             :       size_type
    2694             :       rfind(const basic_string& __str, size_type __pos = npos) const
    2695             :       _GLIBCXX_NOEXCEPT
    2696             :       { return this->rfind(__str.data(), __pos, __str.size()); }
    2697             : 
    2698             : #if __cplusplus >= 201703L
    2699             :       /**
    2700             :        *  @brief  Find last position of a string_view.
    2701             :        *  @param __svt  The object convertible to string_view to locate.
    2702             :        *  @param __pos  Index of character to search back from (default end).
    2703             :        *  @return  Index of start of last occurrence.
    2704             :       */
    2705             :       template<typename _Tp>
    2706             :         _GLIBCXX20_CONSTEXPR
    2707             :         _If_sv<_Tp, size_type>
    2708             :         rfind(const _Tp& __svt, size_type __pos = npos) const
    2709             :         noexcept(is_same<_Tp, __sv_type>::value)
    2710             :         {
    2711             :           __sv_type __sv = __svt;
    2712             :           return this->rfind(__sv.data(), __pos, __sv.size());
    2713             :         }
    2714             : #endif // C++17
    2715             : 
    2716             :       /**
    2717             :        *  @brief  Find last position of a C substring.
    2718             :        *  @param __s  C string to locate.
    2719             :        *  @param __pos  Index of character to search back from.
    2720             :        *  @param __n  Number of characters from s to search for.
    2721             :        *  @return  Index of start of last occurrence.
    2722             :        *
    2723             :        *  Starting from @a __pos, searches backward for the first @a
    2724             :        *  __n characters in @a __s within this string.  If found,
    2725             :        *  returns the index where it begins.  If not found, returns
    2726             :        *  npos.
    2727             :       */
    2728             :       _GLIBCXX20_CONSTEXPR
    2729             :       size_type
    2730             :       rfind(const _CharT* __s, size_type __pos, size_type __n) const
    2731             :       _GLIBCXX_NOEXCEPT;
    2732             : 
    2733             :       /**
    2734             :        *  @brief  Find last position of a C string.
    2735             :        *  @param __s  C string to locate.
    2736             :        *  @param __pos  Index of character to start search at (default end).
    2737             :        *  @return  Index of start of  last occurrence.
    2738             :        *
    2739             :        *  Starting from @a __pos, searches backward for the value of
    2740             :        *  @a __s within this string.  If found, returns the index
    2741             :        *  where it begins.  If not found, returns npos.
    2742             :       */
    2743             :       _GLIBCXX20_CONSTEXPR
    2744             :       size_type
    2745             :       rfind(const _CharT* __s, size_type __pos = npos) const
    2746             :       {
    2747             :         __glibcxx_requires_string(__s);
    2748             :         return this->rfind(__s, __pos, traits_type::length(__s));
    2749             :       }
    2750             : 
    2751             :       /**
    2752             :        *  @brief  Find last position of a character.
    2753             :        *  @param __c  Character to locate.
    2754             :        *  @param __pos  Index of character to search back from (default end).
    2755             :        *  @return  Index of last occurrence.
    2756             :        *
    2757             :        *  Starting from @a __pos, searches backward for @a __c within
    2758             :        *  this string.  If found, returns the index where it was
    2759             :        *  found.  If not found, returns npos.
    2760             :       */
    2761             :       _GLIBCXX20_CONSTEXPR
    2762             :       size_type
    2763             :       rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
    2764             : 
    2765             :       /**
    2766             :        *  @brief  Find position of a character of string.
    2767             :        *  @param __str  String containing characters to locate.
    2768             :        *  @param __pos  Index of character to search from (default 0).
    2769             :        *  @return  Index of first occurrence.
    2770             :        *
    2771             :        *  Starting from @a __pos, searches forward for one of the
    2772             :        *  characters of @a __str within this string.  If found,
    2773             :        *  returns the index where it was found.  If not found, returns
    2774             :        *  npos.
    2775             :       */
    2776             :       _GLIBCXX20_CONSTEXPR
    2777             :       size_type
    2778             :       find_first_of(const basic_string& __str, size_type __pos = 0) const
    2779             :       _GLIBCXX_NOEXCEPT
    2780             :       { return this->find_first_of(__str.data(), __pos, __str.size()); }
    2781             : 
    2782             : #if __cplusplus >= 201703L
    2783             :       /**
    2784             :        *  @brief  Find position of a character of a string_view.
    2785             :        *  @param __svt  An object convertible to string_view containing
    2786             :        *                characters to locate.
    2787             :        *  @param __pos  Index of character to search from (default 0).
    2788             :        *  @return  Index of first occurrence.
    2789             :       */
    2790             :       template<typename _Tp>
    2791             :         _GLIBCXX20_CONSTEXPR
    2792             :         _If_sv<_Tp, size_type>
    2793             :         find_first_of(const _Tp& __svt, size_type __pos = 0) const
    2794             :         noexcept(is_same<_Tp, __sv_type>::value)
    2795             :         {
    2796             :           __sv_type __sv = __svt;
    2797             :           return this->find_first_of(__sv.data(), __pos, __sv.size());
    2798             :         }
    2799             : #endif // C++17
    2800             : 
    2801             :       /**
    2802             :        *  @brief  Find position of a character of C substring.
    2803             :        *  @param __s  String containing characters to locate.
    2804             :        *  @param __pos  Index of character to search from.
    2805             :        *  @param __n  Number of characters from s to search for.
    2806             :        *  @return  Index of first occurrence.
    2807             :        *
    2808             :        *  Starting from @a __pos, searches forward for one of the
    2809             :        *  first @a __n characters of @a __s within this string.  If
    2810             :        *  found, returns the index where it was found.  If not found,
    2811             :        *  returns npos.
    2812             :       */
    2813             :       _GLIBCXX20_CONSTEXPR
    2814             :       size_type
    2815             :       find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
    2816             :       _GLIBCXX_NOEXCEPT;
    2817             : 
    2818             :       /**
    2819             :        *  @brief  Find position of a character of C string.
    2820             :        *  @param __s  String containing characters to locate.
    2821             :        *  @param __pos  Index of character to search from (default 0).
    2822             :        *  @return  Index of first occurrence.
    2823             :        *
    2824             :        *  Starting from @a __pos, searches forward for one of the
    2825             :        *  characters of @a __s within this string.  If found, returns
    2826             :        *  the index where it was found.  If not found, returns npos.
    2827             :       */
    2828             :       _GLIBCXX20_CONSTEXPR
    2829             :       size_type
    2830             :       find_first_of(const _CharT* __s, size_type __pos = 0) const
    2831             :       _GLIBCXX_NOEXCEPT
    2832             :       {
    2833             :         __glibcxx_requires_string(__s);
    2834             :         return this->find_first_of(__s, __pos, traits_type::length(__s));
    2835             :       }
    2836             : 
    2837             :       /**
    2838             :        *  @brief  Find position of a character.
    2839             :        *  @param __c  Character to locate.
    2840             :        *  @param __pos  Index of character to search from (default 0).
    2841             :        *  @return  Index of first occurrence.
    2842             :        *
    2843             :        *  Starting from @a __pos, searches forward for the character
    2844             :        *  @a __c within this string.  If found, returns the index
    2845             :        *  where it was found.  If not found, returns npos.
    2846             :        *
    2847             :        *  Note: equivalent to find(__c, __pos).
    2848             :       */
    2849             :       _GLIBCXX20_CONSTEXPR
    2850             :       size_type
    2851             :       find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
    2852             :       { return this->find(__c, __pos); }
    2853             : 
    2854             :       /**
    2855             :        *  @brief  Find last position of a character of string.
    2856             :        *  @param __str  String containing characters to locate.
    2857             :        *  @param __pos  Index of character to search back from (default end).
    2858             :        *  @return  Index of last occurrence.
    2859             :        *
    2860             :        *  Starting from @a __pos, searches backward for one of the
    2861             :        *  characters of @a __str within this string.  If found,
    2862             :        *  returns the index where it was found.  If not found, returns
    2863             :        *  npos.
    2864             :       */
    2865             :       _GLIBCXX20_CONSTEXPR
    2866             :       size_type
    2867             :       find_last_of(const basic_string& __str, size_type __pos = npos) const
    2868             :       _GLIBCXX_NOEXCEPT
    2869             :       { return this->find_last_of(__str.data(), __pos, __str.size()); }
    2870             : 
    2871             : #if __cplusplus >= 201703L
    2872             :       /**
    2873             :        *  @brief  Find last position of a character of string.
    2874             :        *  @param __svt  An object convertible to string_view containing
    2875             :        *                characters to locate.
    2876             :        *  @param __pos  Index of character to search back from (default end).
    2877             :        *  @return  Index of last occurrence.
    2878             :       */
    2879             :       template<typename _Tp>
    2880             :         _GLIBCXX20_CONSTEXPR
    2881             :         _If_sv<_Tp, size_type>
    2882             :         find_last_of(const _Tp& __svt, size_type __pos = npos) const
    2883             :         noexcept(is_same<_Tp, __sv_type>::value)
    2884             :         {
    2885             :           __sv_type __sv = __svt;
    2886             :           return this->find_last_of(__sv.data(), __pos, __sv.size());
    2887             :         }
    2888             : #endif // C++17
    2889             : 
    2890             :       /**
    2891             :        *  @brief  Find last position of a character of C substring.
    2892             :        *  @param __s  C string containing characters to locate.
    2893             :        *  @param __pos  Index of character to search back from.
    2894             :        *  @param __n  Number of characters from s to search for.
    2895             :        *  @return  Index of last occurrence.
    2896             :        *
    2897             :        *  Starting from @a __pos, searches backward for one of the
    2898             :        *  first @a __n characters of @a __s within this string.  If
    2899             :        *  found, returns the index where it was found.  If not found,
    2900             :        *  returns npos.
    2901             :       */
    2902             :       _GLIBCXX20_CONSTEXPR
    2903             :       size_type
    2904             :       find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
    2905             :       _GLIBCXX_NOEXCEPT;
    2906             : 
    2907             :       /**
    2908             :        *  @brief  Find last position of a character of C string.
    2909             :        *  @param __s  C string containing characters to locate.
    2910             :        *  @param __pos  Index of character to search back from (default end).
    2911             :        *  @return  Index of last occurrence.
    2912             :        *
    2913             :        *  Starting from @a __pos, searches backward for one of the
    2914             :        *  characters of @a __s within this string.  If found, returns
    2915             :        *  the index where it was found.  If not found, returns npos.
    2916             :       */
    2917             :       _GLIBCXX20_CONSTEXPR
    2918             :       size_type
    2919             :       find_last_of(const _CharT* __s, size_type __pos = npos) const
    2920             :       _GLIBCXX_NOEXCEPT
    2921             :       {
    2922             :         __glibcxx_requires_string(__s);
    2923             :         return this->find_last_of(__s, __pos, traits_type::length(__s));
    2924             :       }
    2925             : 
    2926             :       /**
    2927             :        *  @brief  Find last position of a character.
    2928             :        *  @param __c  Character to locate.
    2929             :        *  @param __pos  Index of character to search back from (default end).
    2930             :        *  @return  Index of last occurrence.
    2931             :        *
    2932             :        *  Starting from @a __pos, searches backward for @a __c within
    2933             :        *  this string.  If found, returns the index where it was
    2934             :        *  found.  If not found, returns npos.
    2935             :        *
    2936             :        *  Note: equivalent to rfind(__c, __pos).
    2937             :       */
    2938             :       _GLIBCXX20_CONSTEXPR
    2939             :       size_type
    2940          60 :       find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
    2941          60 :       { return this->rfind(__c, __pos); }
    2942             : 
    2943             :       /**
    2944             :        *  @brief  Find position of a character not in string.
    2945             :        *  @param __str  String containing characters to avoid.
    2946             :        *  @param __pos  Index of character to search from (default 0).
    2947             :        *  @return  Index of first occurrence.
    2948             :        *
    2949             :        *  Starting from @a __pos, searches forward for a character not contained
    2950             :        *  in @a __str within this string.  If found, returns the index where it
    2951             :        *  was found.  If not found, returns npos.
    2952             :       */
    2953             :       _GLIBCXX20_CONSTEXPR
    2954             :       size_type
    2955             :       find_first_not_of(const basic_string& __str, size_type __pos = 0) const
    2956             :       _GLIBCXX_NOEXCEPT
    2957             :       { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
    2958             : 
    2959             : #if __cplusplus >= 201703L
    2960             :       /**
    2961             :        *  @brief  Find position of a character not in a string_view.
    2962             :        *  @param __svt  A object convertible to string_view containing
    2963             :        *                characters to avoid.
    2964             :        *  @param __pos  Index of character to search from (default 0).
    2965             :        *  @return  Index of first occurrence.
    2966             :        */
    2967             :       template<typename _Tp>
    2968             :         _If_sv<_Tp, size_type>
    2969             :         _GLIBCXX20_CONSTEXPR
    2970             :         find_first_not_of(const _Tp& __svt, size_type __pos = 0) const
    2971             :         noexcept(is_same<_Tp, __sv_type>::value)
    2972             :         {
    2973             :           __sv_type __sv = __svt;
    2974             :           return this->find_first_not_of(__sv.data(), __pos, __sv.size());
    2975             :         }
    2976             : #endif // C++17
    2977             : 
    2978             :       /**
    2979             :        *  @brief  Find position of a character not in C substring.
    2980             :        *  @param __s  C string containing characters to avoid.
    2981             :        *  @param __pos  Index of character to search from.
    2982             :        *  @param __n  Number of characters from __s to consider.
    2983             :        *  @return  Index of first occurrence.
    2984             :        *
    2985             :        *  Starting from @a __pos, searches forward for a character not
    2986             :        *  contained in the first @a __n characters of @a __s within
    2987             :        *  this string.  If found, returns the index where it was
    2988             :        *  found.  If not found, returns npos.
    2989             :       */
    2990             :       _GLIBCXX20_CONSTEXPR
    2991             :       size_type
    2992             :       find_first_not_of(const _CharT* __s, size_type __pos,
    2993             :                         size_type __n) const _GLIBCXX_NOEXCEPT;
    2994             : 
    2995             :       /**
    2996             :        *  @brief  Find position of a character not in C string.
    2997             :        *  @param __s  C string containing characters to avoid.
    2998             :        *  @param __pos  Index of character to search from (default 0).
    2999             :        *  @return  Index of first occurrence.
    3000             :        *
    3001             :        *  Starting from @a __pos, searches forward for a character not
    3002             :        *  contained in @a __s within this string.  If found, returns
    3003             :        *  the index where it was found.  If not found, returns npos.
    3004             :       */
    3005             :       _GLIBCXX20_CONSTEXPR
    3006             :       size_type
    3007             :       find_first_not_of(const _CharT* __s, size_type __pos = 0) const
    3008             :       _GLIBCXX_NOEXCEPT
    3009             :       {
    3010             :         __glibcxx_requires_string(__s);
    3011             :         return this->find_first_not_of(__s, __pos, traits_type::length(__s));
    3012             :       }
    3013             : 
    3014             :       /**
    3015             :        *  @brief  Find position of a different character.
    3016             :        *  @param __c  Character to avoid.
    3017             :        *  @param __pos  Index of character to search from (default 0).
    3018             :        *  @return  Index of first occurrence.
    3019             :        *
    3020             :        *  Starting from @a __pos, searches forward for a character
    3021             :        *  other than @a __c within this string.  If found, returns the
    3022             :        *  index where it was found.  If not found, returns npos.
    3023             :       */
    3024             :       _GLIBCXX20_CONSTEXPR
    3025             :       size_type
    3026             :       find_first_not_of(_CharT __c, size_type __pos = 0) const
    3027             :       _GLIBCXX_NOEXCEPT;
    3028             : 
    3029             :       /**
    3030             :        *  @brief  Find last position of a character not in string.
    3031             :        *  @param __str  String containing characters to avoid.
    3032             :        *  @param __pos  Index of character to search back from (default end).
    3033             :        *  @return  Index of last occurrence.
    3034             :        *
    3035             :        *  Starting from @a __pos, searches backward for a character
    3036             :        *  not contained in @a __str within this string.  If found,
    3037             :        *  returns the index where it was found.  If not found, returns
    3038             :        *  npos.
    3039             :       */
    3040             :       _GLIBCXX20_CONSTEXPR
    3041             :       size_type
    3042             :       find_last_not_of(const basic_string& __str, size_type __pos = npos) const
    3043             :       _GLIBCXX_NOEXCEPT
    3044             :       { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
    3045             : 
    3046             : #if __cplusplus >= 201703L
    3047             :       /**
    3048             :        *  @brief  Find last position of a character not in a string_view.
    3049             :        *  @param __svt  An object convertible to string_view containing
    3050             :        *                characters to avoid.
    3051             :        *  @param __pos  Index of character to search back from (default end).
    3052             :        *  @return  Index of last occurrence.
    3053             :        */
    3054             :       template<typename _Tp>
    3055             :         _GLIBCXX20_CONSTEXPR
    3056             :         _If_sv<_Tp, size_type>
    3057             :         find_last_not_of(const _Tp& __svt, size_type __pos = npos) const
    3058             :         noexcept(is_same<_Tp, __sv_type>::value)
    3059             :         {
    3060             :           __sv_type __sv = __svt;
    3061             :           return this->find_last_not_of(__sv.data(), __pos, __sv.size());
    3062             :         }
    3063             : #endif // C++17
    3064             : 
    3065             :       /**
    3066             :        *  @brief  Find last position of a character not in C substring.
    3067             :        *  @param __s  C string containing characters to avoid.
    3068             :        *  @param __pos  Index of character to search back from.
    3069             :        *  @param __n  Number of characters from s to consider.
    3070             :        *  @return  Index of last occurrence.
    3071             :        *
    3072             :        *  Starting from @a __pos, searches backward for a character not
    3073             :        *  contained in the first @a __n characters of @a __s within this string.
    3074             :        *  If found, returns the index where it was found.  If not found,
    3075             :        *  returns npos.
    3076             :       */
    3077             :       _GLIBCXX20_CONSTEXPR
    3078             :       size_type
    3079             :       find_last_not_of(const _CharT* __s, size_type __pos,
    3080             :                        size_type __n) const _GLIBCXX_NOEXCEPT;
    3081             :       /**
    3082             :        *  @brief  Find last position of a character not in C string.
    3083             :        *  @param __s  C string containing characters to avoid.
    3084             :        *  @param __pos  Index of character to search back from (default end).
    3085             :        *  @return  Index of last occurrence.
    3086             :        *
    3087             :        *  Starting from @a __pos, searches backward for a character
    3088             :        *  not contained in @a __s within this string.  If found,
    3089             :        *  returns the index where it was found.  If not found, returns
    3090             :        *  npos.
    3091             :       */
    3092             :       _GLIBCXX20_CONSTEXPR
    3093             :       size_type
    3094             :       find_last_not_of(const _CharT* __s, size_type __pos = npos) const
    3095             :       _GLIBCXX_NOEXCEPT
    3096             :       {
    3097             :         __glibcxx_requires_string(__s);
    3098             :         return this->find_last_not_of(__s, __pos, traits_type::length(__s));
    3099             :       }
    3100             : 
    3101             :       /**
    3102             :        *  @brief  Find last position of a different character.
    3103             :        *  @param __c  Character to avoid.
    3104             :        *  @param __pos  Index of character to search back from (default end).
    3105             :        *  @return  Index of last occurrence.
    3106             :        *
    3107             :        *  Starting from @a __pos, searches backward for a character other than
    3108             :        *  @a __c within this string.  If found, returns the index where it was
    3109             :        *  found.  If not found, returns npos.
    3110             :       */
    3111             :       _GLIBCXX20_CONSTEXPR
    3112             :       size_type
    3113             :       find_last_not_of(_CharT __c, size_type __pos = npos) const
    3114             :       _GLIBCXX_NOEXCEPT;
    3115             : 
    3116             :       /**
    3117             :        *  @brief  Get a substring.
    3118             :        *  @param __pos  Index of first character (default 0).
    3119             :        *  @param __n  Number of characters in substring (default remainder).
    3120             :        *  @return  The new string.
    3121             :        *  @throw  std::out_of_range  If __pos > size().
    3122             :        *
    3123             :        *  Construct and return a new string using the @a __n
    3124             :        *  characters starting at @a __pos.  If the string is too
    3125             :        *  short, use the remainder of the characters.  If @a __pos is
    3126             :        *  beyond the end of the string, out_of_range is thrown.
    3127             :       */
    3128             :       _GLIBCXX20_CONSTEXPR
    3129             :       basic_string
    3130             :       substr(size_type __pos = 0, size_type __n = npos) const
    3131             :       { return basic_string(*this,
    3132             :                             _M_check(__pos, "basic_string::substr"), __n); }
    3133             : 
    3134             :       /**
    3135             :        *  @brief  Compare to a string.
    3136             :        *  @param __str  String to compare against.
    3137             :        *  @return  Integer < 0, 0, or > 0.
    3138             :        *
    3139             :        *  Returns an integer < 0 if this string is ordered before @a
    3140             :        *  __str, 0 if their values are equivalent, or > 0 if this
    3141             :        *  string is ordered after @a __str.  Determines the effective
    3142             :        *  length rlen of the strings to compare as the smallest of
    3143             :        *  size() and str.size().  The function then compares the two
    3144             :        *  strings by calling traits::compare(data(), str.data(),rlen).
    3145             :        *  If the result of the comparison is nonzero returns it,
    3146             :        *  otherwise the shorter one is ordered first.
    3147             :       */
    3148             :       _GLIBCXX20_CONSTEXPR
    3149             :       int
    3150             :       compare(const basic_string& __str) const
    3151             :       {
    3152             :         const size_type __size = this->size();
    3153             :         const size_type __osize = __str.size();
    3154             :         const size_type __len = std::min(__size, __osize);
    3155             : 
    3156             :         int __r = traits_type::compare(_M_data(), __str.data(), __len);
    3157             :         if (!__r)
    3158             :           __r = _S_compare(__size, __osize);
    3159             :         return __r;
    3160             :       }
    3161             : 
    3162             : #if __cplusplus >= 201703L
    3163             :       /**
    3164             :        *  @brief  Compare to a string_view.
    3165             :        *  @param __svt An object convertible to string_view to compare against.
    3166             :        *  @return  Integer < 0, 0, or > 0.
    3167             :        */
    3168             :       template<typename _Tp>
    3169             :         _GLIBCXX20_CONSTEXPR
    3170             :         _If_sv<_Tp, int>
    3171             :         compare(const _Tp& __svt) const
    3172             :         noexcept(is_same<_Tp, __sv_type>::value)
    3173             :         {
    3174             :           __sv_type __sv = __svt;
    3175             :           const size_type __size = this->size();
    3176             :           const size_type __osize = __sv.size();
    3177             :           const size_type __len = std::min(__size, __osize);
    3178             : 
    3179             :           int __r = traits_type::compare(_M_data(), __sv.data(), __len);
    3180             :           if (!__r)
    3181             :             __r = _S_compare(__size, __osize);
    3182             :           return __r;
    3183             :         }
    3184             : 
    3185             :       /**
    3186             :        *  @brief  Compare to a string_view.
    3187             :        *  @param __pos  A position in the string to start comparing from.
    3188             :        *  @param __n  The number of characters to compare.
    3189             :        *  @param __svt  An object convertible to string_view to compare
    3190             :        *                against.
    3191             :        *  @return  Integer < 0, 0, or > 0.
    3192             :        */
    3193             :       template<typename _Tp>
    3194             :         _GLIBCXX20_CONSTEXPR
    3195             :         _If_sv<_Tp, int>
    3196             :         compare(size_type __pos, size_type __n, const _Tp& __svt) const
    3197             :         noexcept(is_same<_Tp, __sv_type>::value)
    3198             :         {
    3199             :           __sv_type __sv = __svt;
    3200             :           return __sv_type(*this).substr(__pos, __n).compare(__sv);
    3201             :         }
    3202             : 
    3203             :       /**
    3204             :        *  @brief  Compare to a string_view.
    3205             :        *  @param __pos1  A position in the string to start comparing from.
    3206             :        *  @param __n1  The number of characters to compare.
    3207             :        *  @param __svt  An object convertible to string_view to compare
    3208             :        *                against.
    3209             :        *  @param __pos2  A position in the string_view to start comparing from.
    3210             :        *  @param __n2  The number of characters to compare.
    3211             :        *  @return  Integer < 0, 0, or > 0.
    3212             :        */
    3213             :       template<typename _Tp>
    3214             :         _GLIBCXX20_CONSTEXPR
    3215             :         _If_sv<_Tp, int>
    3216             :         compare(size_type __pos1, size_type __n1, const _Tp& __svt,
    3217             :                 size_type __pos2, size_type __n2 = npos) const
    3218             :         noexcept(is_same<_Tp, __sv_type>::value)
    3219             :         {
    3220             :           __sv_type __sv = __svt;
    3221             :           return __sv_type(*this)
    3222             :             .substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
    3223             :         }
    3224             : #endif // C++17
    3225             : 
    3226             :       /**
    3227             :        *  @brief  Compare substring to a string.
    3228             :        *  @param __pos  Index of first character of substring.
    3229             :        *  @param __n  Number of characters in substring.
    3230             :        *  @param __str  String to compare against.
    3231             :        *  @return  Integer < 0, 0, or > 0.
    3232             :        *
    3233             :        *  Form the substring of this string from the @a __n characters
    3234             :        *  starting at @a __pos.  Returns an integer < 0 if the
    3235             :        *  substring is ordered before @a __str, 0 if their values are
    3236             :        *  equivalent, or > 0 if the substring is ordered after @a
    3237             :        *  __str.  Determines the effective length rlen of the strings
    3238             :        *  to compare as the smallest of the length of the substring
    3239             :        *  and @a __str.size().  The function then compares the two
    3240             :        *  strings by calling
    3241             :        *  traits::compare(substring.data(),str.data(),rlen).  If the
    3242             :        *  result of the comparison is nonzero returns it, otherwise
    3243             :        *  the shorter one is ordered first.
    3244             :       */
    3245             :       _GLIBCXX20_CONSTEXPR
    3246             :       int
    3247             :       compare(size_type __pos, size_type __n, const basic_string& __str) const;
    3248             : 
    3249             :       /**
    3250             :        *  @brief  Compare substring to a substring.
    3251             :        *  @param __pos1  Index of first character of substring.
    3252             :        *  @param __n1  Number of characters in substring.
    3253             :        *  @param __str  String to compare against.
    3254             :        *  @param __pos2  Index of first character of substring of str.
    3255             :        *  @param __n2  Number of characters in substring of str.
    3256             :        *  @return  Integer < 0, 0, or > 0.
    3257             :        *
    3258             :        *  Form the substring of this string from the @a __n1
    3259             :        *  characters starting at @a __pos1.  Form the substring of @a
    3260             :        *  __str from the @a __n2 characters starting at @a __pos2.
    3261             :        *  Returns an integer < 0 if this substring is ordered before
    3262             :        *  the substring of @a __str, 0 if their values are equivalent,
    3263             :        *  or > 0 if this substring is ordered after the substring of
    3264             :        *  @a __str.  Determines the effective length rlen of the
    3265             :        *  strings to compare as the smallest of the lengths of the
    3266             :        *  substrings.  The function then compares the two strings by
    3267             :        *  calling
    3268             :        *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
    3269             :        *  If the result of the comparison is nonzero returns it,
    3270             :        *  otherwise the shorter one is ordered first.
    3271             :       */
    3272             :       _GLIBCXX20_CONSTEXPR
    3273             :       int
    3274             :       compare(size_type __pos1, size_type __n1, const basic_string& __str,
    3275             :               size_type __pos2, size_type __n2 = npos) const;
    3276             : 
    3277             :       /**
    3278             :        *  @brief  Compare to a C string.
    3279             :        *  @param __s  C string to compare against.
    3280             :        *  @return  Integer < 0, 0, or > 0.
    3281             :        *
    3282             :        *  Returns an integer < 0 if this string is ordered before @a __s, 0 if
    3283             :        *  their values are equivalent, or > 0 if this string is ordered after
    3284             :        *  @a __s.  Determines the effective length rlen of the strings to
    3285             :        *  compare as the smallest of size() and the length of a string
    3286             :        *  constructed from @a __s.  The function then compares the two strings
    3287             :        *  by calling traits::compare(data(),s,rlen).  If the result of the
    3288             :        *  comparison is nonzero returns it, otherwise the shorter one is
    3289             :        *  ordered first.
    3290             :       */
    3291             :       _GLIBCXX20_CONSTEXPR
    3292             :       int
    3293             :       compare(const _CharT* __s) const _GLIBCXX_NOEXCEPT;
    3294             : 
    3295             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    3296             :       // 5 String::compare specification questionable
    3297             :       /**
    3298             :        *  @brief  Compare substring to a C string.
    3299             :        *  @param __pos  Index of first character of substring.
    3300             :        *  @param __n1  Number of characters in substring.
    3301             :        *  @param __s  C string to compare against.
    3302             :        *  @return  Integer < 0, 0, or > 0.
    3303             :        *
    3304             :        *  Form the substring of this string from the @a __n1
    3305             :        *  characters starting at @a pos.  Returns an integer < 0 if
    3306             :        *  the substring is ordered before @a __s, 0 if their values
    3307             :        *  are equivalent, or > 0 if the substring is ordered after @a
    3308             :        *  __s.  Determines the effective length rlen of the strings to
    3309             :        *  compare as the smallest of the length of the substring and
    3310             :        *  the length of a string constructed from @a __s.  The
    3311             :        *  function then compares the two string by calling
    3312             :        *  traits::compare(substring.data(),__s,rlen).  If the result of
    3313             :        *  the comparison is nonzero returns it, otherwise the shorter
    3314             :        *  one is ordered first.
    3315             :       */
    3316             :       _GLIBCXX20_CONSTEXPR
    3317             :       int
    3318             :       compare(size_type __pos, size_type __n1, const _CharT* __s) const;
    3319             : 
    3320             :       /**
    3321             :        *  @brief  Compare substring against a character %array.
    3322             :        *  @param __pos  Index of first character of substring.
    3323             :        *  @param __n1  Number of characters in substring.
    3324             :        *  @param __s  character %array to compare against.
    3325             :        *  @param __n2  Number of characters of s.
    3326             :        *  @return  Integer < 0, 0, or > 0.
    3327             :        *
    3328             :        *  Form the substring of this string from the @a __n1
    3329             :        *  characters starting at @a __pos.  Form a string from the
    3330             :        *  first @a __n2 characters of @a __s.  Returns an integer < 0
    3331             :        *  if this substring is ordered before the string from @a __s,
    3332             :        *  0 if their values are equivalent, or > 0 if this substring
    3333             :        *  is ordered after the string from @a __s.  Determines the
    3334             :        *  effective length rlen of the strings to compare as the
    3335             :        *  smallest of the length of the substring and @a __n2.  The
    3336             :        *  function then compares the two strings by calling
    3337             :        *  traits::compare(substring.data(),s,rlen).  If the result of
    3338             :        *  the comparison is nonzero returns it, otherwise the shorter
    3339             :        *  one is ordered first.
    3340             :        *
    3341             :        *  NB: s must have at least n2 characters, &apos;\\0&apos; has
    3342             :        *  no special meaning.
    3343             :       */
    3344             :       _GLIBCXX20_CONSTEXPR
    3345             :       int
    3346             :       compare(size_type __pos, size_type __n1, const _CharT* __s,
    3347             :               size_type __n2) const;
    3348             : 
    3349             : #if __cplusplus >= 202002L
    3350             :       constexpr bool
    3351             :       starts_with(basic_string_view<_CharT, _Traits> __x) const noexcept
    3352             :       { return __sv_type(this->data(), this->size()).starts_with(__x); }
    3353             : 
    3354             :       constexpr bool
    3355             :       starts_with(_CharT __x) const noexcept
    3356             :       { return __sv_type(this->data(), this->size()).starts_with(__x); }
    3357             : 
    3358             :       constexpr bool
    3359             :       starts_with(const _CharT* __x) const noexcept
    3360             :       { return __sv_type(this->data(), this->size()).starts_with(__x); }
    3361             : 
    3362             :       constexpr bool
    3363             :       ends_with(basic_string_view<_CharT, _Traits> __x) const noexcept
    3364             :       { return __sv_type(this->data(), this->size()).ends_with(__x); }
    3365             : 
    3366             :       constexpr bool
    3367             :       ends_with(_CharT __x) const noexcept
    3368             :       { return __sv_type(this->data(), this->size()).ends_with(__x); }
    3369             : 
    3370             :       constexpr bool
    3371             :       ends_with(const _CharT* __x) const noexcept
    3372             :       { return __sv_type(this->data(), this->size()).ends_with(__x); }
    3373             : #endif // C++20
    3374             : 
    3375             : #if __cplusplus > 202002L
    3376             :       constexpr bool
    3377             :       contains(basic_string_view<_CharT, _Traits> __x) const noexcept
    3378             :       { return __sv_type(this->data(), this->size()).contains(__x); }
    3379             : 
    3380             :       constexpr bool
    3381             :       contains(_CharT __x) const noexcept
    3382             :       { return __sv_type(this->data(), this->size()).contains(__x); }
    3383             : 
    3384             :       constexpr bool
    3385             :       contains(const _CharT* __x) const noexcept
    3386             :       { return __sv_type(this->data(), this->size()).contains(__x); }
    3387             : #endif // C++23
    3388             : 
    3389             :       // Allow basic_stringbuf::__xfer_bufptrs to call _M_length:
    3390             :       template<typename, typename, typename> friend class basic_stringbuf;
    3391             :     };
    3392             : _GLIBCXX_END_NAMESPACE_CXX11
    3393             : _GLIBCXX_END_NAMESPACE_VERSION
    3394             : } // namespace std
    3395             : #endif  // _GLIBCXX_USE_CXX11_ABI
    3396             : 
    3397             : namespace std _GLIBCXX_VISIBILITY(default)
    3398             : {
    3399             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
    3400             : 
    3401             : #if __cpp_deduction_guides >= 201606
    3402             : _GLIBCXX_BEGIN_NAMESPACE_CXX11
    3403             :   template<typename _InputIterator, typename _CharT
    3404             :              = typename iterator_traits<_InputIterator>::value_type,
    3405             :            typename _Allocator = allocator<_CharT>,
    3406             :            typename = _RequireInputIter<_InputIterator>,
    3407             :            typename = _RequireAllocator<_Allocator>>
    3408             :     basic_string(_InputIterator, _InputIterator, _Allocator = _Allocator())
    3409             :       -> basic_string<_CharT, char_traits<_CharT>, _Allocator>;
    3410             : 
    3411             :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
    3412             :   // 3075. basic_string needs deduction guides from basic_string_view
    3413             :   template<typename _CharT, typename _Traits,
    3414             :            typename _Allocator = allocator<_CharT>,
    3415             :            typename = _RequireAllocator<_Allocator>>
    3416             :     basic_string(basic_string_view<_CharT, _Traits>, const _Allocator& = _Allocator())
    3417             :       -> basic_string<_CharT, _Traits, _Allocator>;
    3418             : 
    3419             :   template<typename _CharT, typename _Traits,
    3420             :            typename _Allocator = allocator<_CharT>,
    3421             :            typename = _RequireAllocator<_Allocator>>
    3422             :     basic_string(basic_string_view<_CharT, _Traits>,
    3423             :                  typename basic_string<_CharT, _Traits, _Allocator>::size_type,
    3424             :                  typename basic_string<_CharT, _Traits, _Allocator>::size_type,
    3425             :                  const _Allocator& = _Allocator())
    3426             :       -> basic_string<_CharT, _Traits, _Allocator>;
    3427             : _GLIBCXX_END_NAMESPACE_CXX11
    3428             : #endif
    3429             : 
    3430             :   // operator+
    3431             :   /**
    3432             :    *  @brief  Concatenate two strings.
    3433             :    *  @param __lhs  First string.
    3434             :    *  @param __rhs  Last string.
    3435             :    *  @return  New string with value of @a __lhs followed by @a __rhs.
    3436             :    */
    3437             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3438             :     _GLIBCXX20_CONSTEXPR
    3439             :     basic_string<_CharT, _Traits, _Alloc>
    3440             :     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3441             :               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3442             :     {
    3443             :       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
    3444             :       __str.append(__rhs);
    3445             :       return __str;
    3446             :     }
    3447             : 
    3448             :   /**
    3449             :    *  @brief  Concatenate C string and string.
    3450             :    *  @param __lhs  First string.
    3451             :    *  @param __rhs  Last string.
    3452             :    *  @return  New string with value of @a __lhs followed by @a __rhs.
    3453             :    */
    3454             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3455             :     _GLIBCXX20_CONSTEXPR
    3456             :     basic_string<_CharT,_Traits,_Alloc>
    3457             :     operator+(const _CharT* __lhs,
    3458             :               const basic_string<_CharT,_Traits,_Alloc>& __rhs);
    3459             : 
    3460             :   /**
    3461             :    *  @brief  Concatenate character and string.
    3462             :    *  @param __lhs  First string.
    3463             :    *  @param __rhs  Last string.
    3464             :    *  @return  New string with @a __lhs followed by @a __rhs.
    3465             :    */
    3466             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3467             :     _GLIBCXX20_CONSTEXPR
    3468             :     basic_string<_CharT,_Traits,_Alloc>
    3469             :     operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
    3470             : 
    3471             :   /**
    3472             :    *  @brief  Concatenate string and C string.
    3473             :    *  @param __lhs  First string.
    3474             :    *  @param __rhs  Last string.
    3475             :    *  @return  New string with @a __lhs followed by @a __rhs.
    3476             :    */
    3477             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3478             :     _GLIBCXX20_CONSTEXPR
    3479             :     inline basic_string<_CharT, _Traits, _Alloc>
    3480             :     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3481             :               const _CharT* __rhs)
    3482             :     {
    3483             :       basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
    3484             :       __str.append(__rhs);
    3485             :       return __str;
    3486             :     }
    3487             : 
    3488             :   /**
    3489             :    *  @brief  Concatenate string and character.
    3490             :    *  @param __lhs  First string.
    3491             :    *  @param __rhs  Last string.
    3492             :    *  @return  New string with @a __lhs followed by @a __rhs.
    3493             :    */
    3494             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3495             :     _GLIBCXX20_CONSTEXPR
    3496             :     inline basic_string<_CharT, _Traits, _Alloc>
    3497             :     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
    3498             :     {
    3499             :       typedef basic_string<_CharT, _Traits, _Alloc>       __string_type;
    3500             :       typedef typename __string_type::size_type         __size_type;
    3501             :       __string_type __str(__lhs);
    3502             :       __str.append(__size_type(1), __rhs);
    3503             :       return __str;
    3504             :     }
    3505             : 
    3506             : #if __cplusplus >= 201103L
    3507             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3508             :     _GLIBCXX20_CONSTEXPR
    3509             :     inline basic_string<_CharT, _Traits, _Alloc>
    3510             :     operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
    3511             :               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3512             :     { return std::move(__lhs.append(__rhs)); }
    3513             : 
    3514             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3515             :     _GLIBCXX20_CONSTEXPR
    3516             :     inline basic_string<_CharT, _Traits, _Alloc>
    3517             :     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3518             :               basic_string<_CharT, _Traits, _Alloc>&& __rhs)
    3519             :     { return std::move(__rhs.insert(0, __lhs)); }
    3520             : 
    3521             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3522             :     _GLIBCXX20_CONSTEXPR
    3523             :     inline basic_string<_CharT, _Traits, _Alloc>
    3524             :     operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
    3525             :               basic_string<_CharT, _Traits, _Alloc>&& __rhs)
    3526             :     {
    3527             : #if _GLIBCXX_USE_CXX11_ABI
    3528             :       using _Alloc_traits = allocator_traits<_Alloc>;
    3529             :       bool __use_rhs = false;
    3530             :       if _GLIBCXX17_CONSTEXPR (typename _Alloc_traits::is_always_equal{})
    3531             :         __use_rhs = true;
    3532             :       else if (__lhs.get_allocator() == __rhs.get_allocator())
    3533             :         __use_rhs = true;
    3534             :       if (__use_rhs)
    3535             : #endif
    3536             :         {
    3537             :           const auto __size = __lhs.size() + __rhs.size();
    3538             :           if (__size > __lhs.capacity() && __size <= __rhs.capacity())
    3539             :             return std::move(__rhs.insert(0, __lhs));
    3540             :         }
    3541             :       return std::move(__lhs.append(__rhs));
    3542             :     }
    3543             : 
    3544             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3545             :     _GLIBCXX20_CONSTEXPR
    3546             :     inline basic_string<_CharT, _Traits, _Alloc>
    3547             :     operator+(const _CharT* __lhs,
    3548             :               basic_string<_CharT, _Traits, _Alloc>&& __rhs)
    3549             :     { return std::move(__rhs.insert(0, __lhs)); }
    3550             : 
    3551             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3552             :     _GLIBCXX20_CONSTEXPR
    3553             :     inline basic_string<_CharT, _Traits, _Alloc>
    3554             :     operator+(_CharT __lhs,
    3555             :               basic_string<_CharT, _Traits, _Alloc>&& __rhs)
    3556             :     { return std::move(__rhs.insert(0, 1, __lhs)); }
    3557             : 
    3558             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3559             :     _GLIBCXX20_CONSTEXPR
    3560             :     inline basic_string<_CharT, _Traits, _Alloc>
    3561             :     operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
    3562             :               const _CharT* __rhs)
    3563             :     { return std::move(__lhs.append(__rhs)); }
    3564             : 
    3565             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3566             :     _GLIBCXX20_CONSTEXPR
    3567             :     inline basic_string<_CharT, _Traits, _Alloc>
    3568             :     operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
    3569             :               _CharT __rhs)
    3570             :     { return std::move(__lhs.append(1, __rhs)); }
    3571             : #endif
    3572             : 
    3573             :   // operator ==
    3574             :   /**
    3575             :    *  @brief  Test equivalence of two strings.
    3576             :    *  @param __lhs  First string.
    3577             :    *  @param __rhs  Second string.
    3578             :    *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
    3579             :    */
    3580             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3581             :     _GLIBCXX20_CONSTEXPR
    3582             :     inline bool
    3583             :     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3584             :                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3585             :     _GLIBCXX_NOEXCEPT
    3586             :     { return __lhs.compare(__rhs) == 0; }
    3587             : 
    3588             :   template<typename _CharT>
    3589             :     _GLIBCXX20_CONSTEXPR
    3590             :     inline
    3591             :     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
    3592           0 :     operator==(const basic_string<_CharT>& __lhs,
    3593             :                const basic_string<_CharT>& __rhs) _GLIBCXX_NOEXCEPT
    3594           0 :     { return (__lhs.size() == __rhs.size()
    3595           0 :               && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
    3596           0 :                                                     __lhs.size())); }
    3597             : 
    3598             :   /**
    3599             :    *  @brief  Test equivalence of string and C string.
    3600             :    *  @param __lhs  String.
    3601             :    *  @param __rhs  C string.
    3602             :    *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
    3603             :    */
    3604             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3605             :     _GLIBCXX20_CONSTEXPR
    3606             :     inline bool
    3607        2891 :     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3608             :                const _CharT* __rhs)
    3609          18 :     { return __lhs.compare(__rhs) == 0; }
    3610             : 
    3611             : #if __cpp_lib_three_way_comparison
    3612             :   /**
    3613             :    *  @brief  Three-way comparison of a string and a C string.
    3614             :    *  @param __lhs  A string.
    3615             :    *  @param __rhs  A null-terminated string.
    3616             :    *  @return  A value indicating whether `__lhs` is less than, equal to,
    3617             :    *           greater than, or incomparable with `__rhs`.
    3618             :    */
    3619             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3620             :     constexpr auto
    3621             :     operator<=>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3622             :                 const basic_string<_CharT, _Traits, _Alloc>& __rhs) noexcept
    3623             :     -> decltype(__detail::__char_traits_cmp_cat<_Traits>(0))
    3624             :     { return __detail::__char_traits_cmp_cat<_Traits>(__lhs.compare(__rhs)); }
    3625             : 
    3626             :   /**
    3627             :    *  @brief  Three-way comparison of a string and a C string.
    3628             :    *  @param __lhs  A string.
    3629             :    *  @param __rhs  A null-terminated string.
    3630             :    *  @return  A value indicating whether `__lhs` is less than, equal to,
    3631             :    *           greater than, or incomparable with `__rhs`.
    3632             :    */
    3633             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3634             :     constexpr auto
    3635             :     operator<=>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3636             :                 const _CharT* __rhs) noexcept
    3637             :     -> decltype(__detail::__char_traits_cmp_cat<_Traits>(0))
    3638             :     { return __detail::__char_traits_cmp_cat<_Traits>(__lhs.compare(__rhs)); }
    3639             : #else
    3640             :   /**
    3641             :    *  @brief  Test equivalence of C string and string.
    3642             :    *  @param __lhs  C string.
    3643             :    *  @param __rhs  String.
    3644             :    *  @return  True if @a __rhs.compare(@a __lhs) == 0.  False otherwise.
    3645             :    */
    3646             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3647             :     inline bool
    3648             :     operator==(const _CharT* __lhs,
    3649             :                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3650             :     { return __rhs.compare(__lhs) == 0; }
    3651             : 
    3652             :   // operator !=
    3653             :   /**
    3654             :    *  @brief  Test difference of two strings.
    3655             :    *  @param __lhs  First string.
    3656             :    *  @param __rhs  Second string.
    3657             :    *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
    3658             :    */
    3659             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3660             :     inline bool
    3661           0 :     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3662             :                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3663             :     _GLIBCXX_NOEXCEPT
    3664           0 :     { return !(__lhs == __rhs); }
    3665             : 
    3666             :   /**
    3667             :    *  @brief  Test difference of C string and string.
    3668             :    *  @param __lhs  C string.
    3669             :    *  @param __rhs  String.
    3670             :    *  @return  True if @a __rhs.compare(@a __lhs) != 0.  False otherwise.
    3671             :    */
    3672             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3673             :     inline bool
    3674             :     operator!=(const _CharT* __lhs,
    3675             :                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3676             :     { return !(__lhs == __rhs); }
    3677             : 
    3678             :   /**
    3679             :    *  @brief  Test difference of string and C string.
    3680             :    *  @param __lhs  String.
    3681             :    *  @param __rhs  C string.
    3682             :    *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
    3683             :    */
    3684             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3685             :     inline bool
    3686        2873 :     operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3687             :                const _CharT* __rhs)
    3688        2873 :     { return !(__lhs == __rhs); }
    3689             : 
    3690             :   // operator <
    3691             :   /**
    3692             :    *  @brief  Test if string precedes string.
    3693             :    *  @param __lhs  First string.
    3694             :    *  @param __rhs  Second string.
    3695             :    *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
    3696             :    */
    3697             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3698             :     inline bool
    3699      383379 :     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3700             :               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3701             :     _GLIBCXX_NOEXCEPT
    3702      383379 :     { return __lhs.compare(__rhs) < 0; }
    3703             : 
    3704             :   /**
    3705             :    *  @brief  Test if string precedes C string.
    3706             :    *  @param __lhs  String.
    3707             :    *  @param __rhs  C string.
    3708             :    *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
    3709             :    */
    3710             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3711             :     inline bool
    3712             :     operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3713             :               const _CharT* __rhs)
    3714             :     { return __lhs.compare(__rhs) < 0; }
    3715             : 
    3716             :   /**
    3717             :    *  @brief  Test if C string precedes string.
    3718             :    *  @param __lhs  C string.
    3719             :    *  @param __rhs  String.
    3720             :    *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
    3721             :    */
    3722             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3723             :     inline bool
    3724             :     operator<(const _CharT* __lhs,
    3725             :               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3726             :     { return __rhs.compare(__lhs) > 0; }
    3727             : 
    3728             :   // operator >
    3729             :   /**
    3730             :    *  @brief  Test if string follows string.
    3731             :    *  @param __lhs  First string.
    3732             :    *  @param __rhs  Second string.
    3733             :    *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
    3734             :    */
    3735             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3736             :     inline bool
    3737             :     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3738             :               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3739             :     _GLIBCXX_NOEXCEPT
    3740             :     { return __lhs.compare(__rhs) > 0; }
    3741             : 
    3742             :   /**
    3743             :    *  @brief  Test if string follows C string.
    3744             :    *  @param __lhs  String.
    3745             :    *  @param __rhs  C string.
    3746             :    *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
    3747             :    */
    3748             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3749             :     inline bool
    3750             :     operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3751             :               const _CharT* __rhs)
    3752             :     { return __lhs.compare(__rhs) > 0; }
    3753             : 
    3754             :   /**
    3755             :    *  @brief  Test if C string follows string.
    3756             :    *  @param __lhs  C string.
    3757             :    *  @param __rhs  String.
    3758             :    *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
    3759             :    */
    3760             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3761             :     inline bool
    3762             :     operator>(const _CharT* __lhs,
    3763             :               const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3764             :     { return __rhs.compare(__lhs) < 0; }
    3765             : 
    3766             :   // operator <=
    3767             :   /**
    3768             :    *  @brief  Test if string doesn't follow string.
    3769             :    *  @param __lhs  First string.
    3770             :    *  @param __rhs  Second string.
    3771             :    *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
    3772             :    */
    3773             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3774             :     inline bool
    3775             :     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3776             :                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3777             :     _GLIBCXX_NOEXCEPT
    3778             :     { return __lhs.compare(__rhs) <= 0; }
    3779             : 
    3780             :   /**
    3781             :    *  @brief  Test if string doesn't follow C string.
    3782             :    *  @param __lhs  String.
    3783             :    *  @param __rhs  C string.
    3784             :    *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
    3785             :    */
    3786             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3787             :     inline bool
    3788             :     operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3789             :                const _CharT* __rhs)
    3790             :     { return __lhs.compare(__rhs) <= 0; }
    3791             : 
    3792             :   /**
    3793             :    *  @brief  Test if C string doesn't follow string.
    3794             :    *  @param __lhs  C string.
    3795             :    *  @param __rhs  String.
    3796             :    *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
    3797             :    */
    3798             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3799             :     inline bool
    3800             :     operator<=(const _CharT* __lhs,
    3801             :                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3802             :     { return __rhs.compare(__lhs) >= 0; }
    3803             : 
    3804             :   // operator >=
    3805             :   /**
    3806             :    *  @brief  Test if string doesn't precede string.
    3807             :    *  @param __lhs  First string.
    3808             :    *  @param __rhs  Second string.
    3809             :    *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
    3810             :    */
    3811             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3812             :     inline bool
    3813             :     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3814             :                const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3815             :     _GLIBCXX_NOEXCEPT
    3816             :     { return __lhs.compare(__rhs) >= 0; }
    3817             : 
    3818             :   /**
    3819             :    *  @brief  Test if string doesn't precede C string.
    3820             :    *  @param __lhs  String.
    3821             :    *  @param __rhs  C string.
    3822             :    *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
    3823             :    */
    3824             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3825             :     inline bool
    3826             :     operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3827             :                const _CharT* __rhs)
    3828             :     { return __lhs.compare(__rhs) >= 0; }
    3829             : 
    3830             :   /**
    3831             :    *  @brief  Test if C string doesn't precede string.
    3832             :    *  @param __lhs  C string.
    3833             :    *  @param __rhs  String.
    3834             :    *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
    3835             :    */
    3836             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3837             :     inline bool
    3838             :     operator>=(const _CharT* __lhs,
    3839             :              const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3840             :     { return __rhs.compare(__lhs) <= 0; }
    3841             : #endif // three-way comparison
    3842             : 
    3843             :   /**
    3844             :    *  @brief  Swap contents of two strings.
    3845             :    *  @param __lhs  First string.
    3846             :    *  @param __rhs  Second string.
    3847             :    *
    3848             :    *  Exchanges the contents of @a __lhs and @a __rhs in constant time.
    3849             :    */
    3850             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3851             :     _GLIBCXX20_CONSTEXPR
    3852             :     inline void
    3853             :     swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
    3854             :          basic_string<_CharT, _Traits, _Alloc>& __rhs)
    3855             :     _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs)))
    3856             :     { __lhs.swap(__rhs); }
    3857             : 
    3858             : 
    3859             :   /**
    3860             :    *  @brief  Read stream into a string.
    3861             :    *  @param __is  Input stream.
    3862             :    *  @param __str  Buffer to store into.
    3863             :    *  @return  Reference to the input stream.
    3864             :    *
    3865             :    *  Stores characters from @a __is into @a __str until whitespace is
    3866             :    *  found, the end of the stream is encountered, or str.max_size()
    3867             :    *  is reached.  If is.width() is non-zero, that is the limit on the
    3868             :    *  number of characters stored into @a __str.  Any previous
    3869             :    *  contents of @a __str are erased.
    3870             :    */
    3871             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3872             :     basic_istream<_CharT, _Traits>&
    3873             :     operator>>(basic_istream<_CharT, _Traits>& __is,
    3874             :                basic_string<_CharT, _Traits, _Alloc>& __str);
    3875             : 
    3876             :   template<>
    3877             :     basic_istream<char>&
    3878             :     operator>>(basic_istream<char>& __is, basic_string<char>& __str);
    3879             : 
    3880             :   /**
    3881             :    *  @brief  Write string to a stream.
    3882             :    *  @param __os  Output stream.
    3883             :    *  @param __str  String to write out.
    3884             :    *  @return  Reference to the output stream.
    3885             :    *
    3886             :    *  Output characters of @a __str into os following the same rules as for
    3887             :    *  writing a C string.
    3888             :    */
    3889             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3890             :     inline basic_ostream<_CharT, _Traits>&
    3891             :     operator<<(basic_ostream<_CharT, _Traits>& __os,
    3892             :                const basic_string<_CharT, _Traits, _Alloc>& __str)
    3893             :     {
    3894             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    3895             :       // 586. string inserter not a formatted function
    3896             :       return __ostream_insert(__os, __str.data(), __str.size());
    3897             :     }
    3898             : 
    3899             :   /**
    3900             :    *  @brief  Read a line from stream into a string.
    3901             :    *  @param __is  Input stream.
    3902             :    *  @param __str  Buffer to store into.
    3903             :    *  @param __delim  Character marking end of line.
    3904             :    *  @return  Reference to the input stream.
    3905             :    *
    3906             :    *  Stores characters from @a __is into @a __str until @a __delim is
    3907             :    *  found, the end of the stream is encountered, or str.max_size()
    3908             :    *  is reached.  Any previous contents of @a __str are erased.  If
    3909             :    *  @a __delim is encountered, it is extracted but not stored into
    3910             :    *  @a __str.
    3911             :    */
    3912             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3913             :     basic_istream<_CharT, _Traits>&
    3914             :     getline(basic_istream<_CharT, _Traits>& __is,
    3915             :             basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
    3916             : 
    3917             :   /**
    3918             :    *  @brief  Read a line from stream into a string.
    3919             :    *  @param __is  Input stream.
    3920             :    *  @param __str  Buffer to store into.
    3921             :    *  @return  Reference to the input stream.
    3922             :    *
    3923             :    *  Stores characters from is into @a __str until &apos;\n&apos; is
    3924             :    *  found, the end of the stream is encountered, or str.max_size()
    3925             :    *  is reached.  Any previous contents of @a __str are erased.  If
    3926             :    *  end of line is encountered, it is extracted but not stored into
    3927             :    *  @a __str.
    3928             :    */
    3929             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3930             :     inline basic_istream<_CharT, _Traits>&
    3931             :     getline(basic_istream<_CharT, _Traits>& __is,
    3932             :             basic_string<_CharT, _Traits, _Alloc>& __str)
    3933             :     { return std::getline(__is, __str, __is.widen('\n')); }
    3934             : 
    3935             : #if __cplusplus >= 201103L
    3936             :   /// Read a line from an rvalue stream into a string.
    3937             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3938             :     inline basic_istream<_CharT, _Traits>&
    3939             :     getline(basic_istream<_CharT, _Traits>&& __is,
    3940             :             basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
    3941             :     { return std::getline(__is, __str, __delim); }
    3942             : 
    3943             :   /// Read a line from an rvalue stream into a string.
    3944             :   template<typename _CharT, typename _Traits, typename _Alloc>
    3945             :     inline basic_istream<_CharT, _Traits>&
    3946             :     getline(basic_istream<_CharT, _Traits>&& __is,
    3947             :             basic_string<_CharT, _Traits, _Alloc>& __str)
    3948             :     { return std::getline(__is, __str); }
    3949             : #endif
    3950             : 
    3951             :   template<>
    3952             :     basic_istream<char>&
    3953             :     getline(basic_istream<char>& __in, basic_string<char>& __str,
    3954             :             char __delim);
    3955             : 
    3956             : #ifdef _GLIBCXX_USE_WCHAR_T
    3957             :   template<>
    3958             :     basic_istream<wchar_t>&
    3959             :     getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
    3960             :             wchar_t __delim);
    3961             : #endif  
    3962             : 
    3963             : _GLIBCXX_END_NAMESPACE_VERSION
    3964             : } // namespace
    3965             : 
    3966             : #if __cplusplus >= 201103L
    3967             : 
    3968             : #include <ext/string_conversions.h>
    3969             : #include <bits/charconv.h>
    3970             : 
    3971             : namespace std _GLIBCXX_VISIBILITY(default)
    3972             : {
    3973             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
    3974             : _GLIBCXX_BEGIN_NAMESPACE_CXX11
    3975             : 
    3976             : #if _GLIBCXX_USE_C99_STDLIB
    3977             :   // 21.4 Numeric Conversions [string.conversions].
    3978             :   inline int
    3979             :   stoi(const string& __str, size_t* __idx = 0, int __base = 10)
    3980             :   { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
    3981             :                                         __idx, __base); }
    3982             : 
    3983             :   inline long
    3984             :   stol(const string& __str, size_t* __idx = 0, int __base = 10)
    3985             :   { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
    3986             :                              __idx, __base); }
    3987             : 
    3988             :   inline unsigned long
    3989             :   stoul(const string& __str, size_t* __idx = 0, int __base = 10)
    3990             :   { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
    3991             :                              __idx, __base); }
    3992             : 
    3993             :   inline long long
    3994             :   stoll(const string& __str, size_t* __idx = 0, int __base = 10)
    3995             :   { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
    3996             :                              __idx, __base); }
    3997             : 
    3998             :   inline unsigned long long
    3999             :   stoull(const string& __str, size_t* __idx = 0, int __base = 10)
    4000             :   { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
    4001             :                              __idx, __base); }
    4002             : 
    4003             :   // NB: strtof vs strtod.
    4004             :   inline float
    4005             :   stof(const string& __str, size_t* __idx = 0)
    4006             :   { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
    4007             : 
    4008             :   inline double
    4009             :   stod(const string& __str, size_t* __idx = 0)
    4010             :   { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
    4011             : 
    4012             :   inline long double
    4013             :   stold(const string& __str, size_t* __idx = 0)
    4014             :   { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
    4015             : #endif // _GLIBCXX_USE_C99_STDLIB
    4016             : 
    4017             :   // DR 1261. Insufficent overloads for to_string / to_wstring
    4018             : 
    4019             :   inline string
    4020             :   to_string(int __val)
    4021             : #if _GLIBCXX_USE_CXX11_ABI && (__CHAR_BIT__ * __SIZEOF_INT__) <= 32
    4022             :   noexcept // any 32-bit value fits in the SSO buffer
    4023             : #endif
    4024             :   {
    4025             :     const bool __neg = __val < 0;
    4026             :     const unsigned __uval = __neg ? (unsigned)~__val + 1u : __val;
    4027             :     const auto __len = __detail::__to_chars_len(__uval);
    4028             :     string __str(__neg + __len, '-');
    4029             :     __detail::__to_chars_10_impl(&__str[__neg], __len, __uval);
    4030             :     return __str;
    4031             :   }
    4032             : 
    4033             :   inline string
    4034             :   to_string(unsigned __val)
    4035             : #if _GLIBCXX_USE_CXX11_ABI && (__CHAR_BIT__ * __SIZEOF_INT__) <= 32
    4036             :   noexcept // any 32-bit value fits in the SSO buffer
    4037             : #endif
    4038             :   {
    4039             :     string __str(__detail::__to_chars_len(__val), '\0');
    4040             :     __detail::__to_chars_10_impl(&__str[0], __str.size(), __val);
    4041             :     return __str;
    4042             :   }
    4043             : 
    4044             :   inline string
    4045             :   to_string(long __val)
    4046             : #if _GLIBCXX_USE_CXX11_ABI && (__CHAR_BIT__ * __SIZEOF_LONG__) <= 32
    4047             :   noexcept // any 32-bit value fits in the SSO buffer
    4048             : #endif
    4049             :   {
    4050             :     const bool __neg = __val < 0;
    4051             :     const unsigned long __uval = __neg ? (unsigned long)~__val + 1ul : __val;
    4052             :     const auto __len = __detail::__to_chars_len(__uval);
    4053             :     string __str(__neg + __len, '-');
    4054             :     __detail::__to_chars_10_impl(&__str[__neg], __len, __uval);
    4055             :     return __str;
    4056             :   }
    4057             : 
    4058             :   inline string
    4059             :   to_string(unsigned long __val)
    4060             : #if _GLIBCXX_USE_CXX11_ABI && (__CHAR_BIT__ * __SIZEOF_LONG__) <= 32
    4061             :   noexcept // any 32-bit value fits in the SSO buffer
    4062             : #endif
    4063             :   {
    4064             :     string __str(__detail::__to_chars_len(__val), '\0');
    4065             :     __detail::__to_chars_10_impl(&__str[0], __str.size(), __val);
    4066             :     return __str;
    4067             :   }
    4068             : 
    4069             :   inline string
    4070             :   to_string(long long __val)
    4071             :   {
    4072             :     const bool __neg = __val < 0;
    4073             :     const unsigned long long __uval
    4074             :       = __neg ? (unsigned long long)~__val + 1ull : __val;
    4075             :     const auto __len = __detail::__to_chars_len(__uval);
    4076             :     string __str(__neg + __len, '-');
    4077             :     __detail::__to_chars_10_impl(&__str[__neg], __len, __uval);
    4078             :     return __str;
    4079             :   }
    4080             : 
    4081             :   inline string
    4082             :   to_string(unsigned long long __val)
    4083             :   {
    4084             :     string __str(__detail::__to_chars_len(__val), '\0');
    4085             :     __detail::__to_chars_10_impl(&__str[0], __str.size(), __val);
    4086             :     return __str;
    4087             :   }
    4088             : 
    4089             : #if _GLIBCXX_USE_C99_STDIO
    4090             :   // NB: (v)snprintf vs sprintf.
    4091             : 
    4092             :   inline string
    4093             :   to_string(float __val)
    4094             :   {
    4095             :     const int __n = 
    4096             :       __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
    4097             :     return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
    4098             :                                            "%f", __val);
    4099             :   }
    4100             : 
    4101             :   inline string
    4102             :   to_string(double __val)
    4103             :   {
    4104             :     const int __n = 
    4105             :       __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
    4106             :     return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
    4107             :                                            "%f", __val);
    4108             :   }
    4109             : 
    4110             :   inline string
    4111             :   to_string(long double __val)
    4112             :   {
    4113             :     const int __n = 
    4114             :       __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
    4115             :     return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
    4116             :                                            "%Lf", __val);
    4117             :   }
    4118             : #endif // _GLIBCXX_USE_C99_STDIO
    4119             : 
    4120             : #if defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_WCHAR
    4121             :   inline int 
    4122             :   stoi(const wstring& __str, size_t* __idx = 0, int __base = 10)
    4123             :   { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
    4124             :                                         __idx, __base); }
    4125             : 
    4126             :   inline long 
    4127             :   stol(const wstring& __str, size_t* __idx = 0, int __base = 10)
    4128             :   { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
    4129             :                              __idx, __base); }
    4130             : 
    4131             :   inline unsigned long
    4132             :   stoul(const wstring& __str, size_t* __idx = 0, int __base = 10)
    4133             :   { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
    4134             :                              __idx, __base); }
    4135             : 
    4136             :   inline long long
    4137             :   stoll(const wstring& __str, size_t* __idx = 0, int __base = 10)
    4138             :   { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
    4139             :                              __idx, __base); }
    4140             : 
    4141             :   inline unsigned long long
    4142             :   stoull(const wstring& __str, size_t* __idx = 0, int __base = 10)
    4143             :   { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
    4144             :                              __idx, __base); }
    4145             : 
    4146             :   // NB: wcstof vs wcstod.
    4147             :   inline float
    4148             :   stof(const wstring& __str, size_t* __idx = 0)
    4149             :   { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
    4150             : 
    4151             :   inline double
    4152             :   stod(const wstring& __str, size_t* __idx = 0)
    4153             :   { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
    4154             : 
    4155             :   inline long double
    4156             :   stold(const wstring& __str, size_t* __idx = 0)
    4157             :   { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
    4158             : 
    4159             : #ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
    4160             :   // DR 1261.
    4161             :   inline wstring
    4162             :   to_wstring(int __val)
    4163             :   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(int),
    4164             :                                             L"%d", __val); }
    4165             : 
    4166             :   inline wstring
    4167             :   to_wstring(unsigned __val)
    4168             :   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
    4169             :                                             4 * sizeof(unsigned),
    4170             :                                             L"%u", __val); }
    4171             : 
    4172             :   inline wstring
    4173             :   to_wstring(long __val)
    4174             :   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(long),
    4175             :                                             L"%ld", __val); }
    4176             : 
    4177             :   inline wstring
    4178             :   to_wstring(unsigned long __val)
    4179             :   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
    4180             :                                             4 * sizeof(unsigned long),
    4181             :                                             L"%lu", __val); }
    4182             : 
    4183             :   inline wstring
    4184             :   to_wstring(long long __val)
    4185             :   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
    4186             :                                             4 * sizeof(long long),
    4187             :                                             L"%lld", __val); }
    4188             : 
    4189             :   inline wstring
    4190             :   to_wstring(unsigned long long __val)
    4191             :   { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
    4192             :                                             4 * sizeof(unsigned long long),
    4193             :                                             L"%llu", __val); }
    4194             : 
    4195             :   inline wstring
    4196             :   to_wstring(float __val)
    4197             :   {
    4198             :     const int __n =
    4199             :       __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
    4200             :     return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
    4201             :                                             L"%f", __val);
    4202             :   }
    4203             : 
    4204             :   inline wstring
    4205             :   to_wstring(double __val)
    4206             :   {
    4207             :     const int __n =
    4208             :       __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
    4209             :     return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
    4210             :                                             L"%f", __val);
    4211             :   }
    4212             : 
    4213             :   inline wstring
    4214             :   to_wstring(long double __val)
    4215             :   {
    4216             :     const int __n =
    4217             :       __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
    4218             :     return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
    4219             :                                             L"%Lf", __val);
    4220             :   }
    4221             : #endif // _GLIBCXX_HAVE_BROKEN_VSWPRINTF
    4222             : #endif // _GLIBCXX_USE_WCHAR_T && _GLIBCXX_USE_C99_WCHAR
    4223             : 
    4224             : _GLIBCXX_END_NAMESPACE_CXX11
    4225             : _GLIBCXX_END_NAMESPACE_VERSION
    4226             : } // namespace
    4227             : 
    4228             : #endif /* C++11 */
    4229             : 
    4230             : #if __cplusplus >= 201103L
    4231             : 
    4232             : #include <bits/functional_hash.h>
    4233             : 
    4234             : namespace std _GLIBCXX_VISIBILITY(default)
    4235             : {
    4236             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
    4237             : 
    4238             :   // DR 1182.
    4239             : 
    4240             : #ifndef _GLIBCXX_COMPATIBILITY_CXX0X
    4241             :   /// std::hash specialization for string.
    4242             :   template<>
    4243             :     struct hash<string>
    4244             :     : public __hash_base<size_t, string>
    4245             :     {
    4246             :       size_t
    4247             :       operator()(const string& __s) const noexcept
    4248             :       { return std::_Hash_impl::hash(__s.data(), __s.length()); }
    4249             :     };
    4250             : 
    4251             :   template<>
    4252             :     struct __is_fast_hash<hash<string>> : std::false_type
    4253             :     { };
    4254             : 
    4255             :   /// std::hash specialization for wstring.
    4256             :   template<>
    4257             :     struct hash<wstring>
    4258             :     : public __hash_base<size_t, wstring>
    4259             :     {
    4260             :       size_t
    4261             :       operator()(const wstring& __s) const noexcept
    4262             :       { return std::_Hash_impl::hash(__s.data(),
    4263             :                                      __s.length() * sizeof(wchar_t)); }
    4264             :     };
    4265             : 
    4266             :   template<>
    4267             :     struct __is_fast_hash<hash<wstring>> : std::false_type
    4268             :     { };
    4269             : #endif /* _GLIBCXX_COMPATIBILITY_CXX0X */
    4270             : 
    4271             : #ifdef _GLIBCXX_USE_CHAR8_T
    4272             :   /// std::hash specialization for u8string.
    4273             :   template<>
    4274             :     struct hash<u8string>
    4275             :     : public __hash_base<size_t, u8string>
    4276             :     {
    4277             :       size_t
    4278             :       operator()(const u8string& __s) const noexcept
    4279             :       { return std::_Hash_impl::hash(__s.data(),
    4280             :                                      __s.length() * sizeof(char8_t)); }
    4281             :     };
    4282             : 
    4283             :   template<>
    4284             :     struct __is_fast_hash<hash<u8string>> : std::false_type
    4285             :     { };
    4286             : #endif
    4287             : 
    4288             :   /// std::hash specialization for u16string.
    4289             :   template<>
    4290             :     struct hash<u16string>
    4291             :     : public __hash_base<size_t, u16string>
    4292             :     {
    4293             :       size_t
    4294             :       operator()(const u16string& __s) const noexcept
    4295             :       { return std::_Hash_impl::hash(__s.data(),
    4296             :                                      __s.length() * sizeof(char16_t)); }
    4297             :     };
    4298             : 
    4299             :   template<>
    4300             :     struct __is_fast_hash<hash<u16string>> : std::false_type
    4301             :     { };
    4302             : 
    4303             :   /// std::hash specialization for u32string.
    4304             :   template<>
    4305             :     struct hash<u32string>
    4306             :     : public __hash_base<size_t, u32string>
    4307             :     {
    4308             :       size_t
    4309             :       operator()(const u32string& __s) const noexcept
    4310             :       { return std::_Hash_impl::hash(__s.data(),
    4311             :                                      __s.length() * sizeof(char32_t)); }
    4312             :     };
    4313             : 
    4314             :   template<>
    4315             :     struct __is_fast_hash<hash<u32string>> : std::false_type
    4316             :     { };
    4317             : 
    4318             : #if __cplusplus >= 201402L
    4319             : 
    4320             : #define __cpp_lib_string_udls 201304L
    4321             : 
    4322             :   inline namespace literals
    4323             :   {
    4324             :   inline namespace string_literals
    4325             :   {
    4326             : #pragma GCC diagnostic push
    4327             : #pragma GCC diagnostic ignored "-Wliteral-suffix"
    4328             : 
    4329             : #if __cpp_lib_constexpr_string >= 201907L
    4330             : # define _GLIBCXX_STRING_CONSTEXPR constexpr
    4331             : #else
    4332             : # define _GLIBCXX_STRING_CONSTEXPR
    4333             : #endif
    4334             : 
    4335             :     _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_STRING_CONSTEXPR
    4336             :     inline basic_string<char>
    4337             :     operator""s(const char* __str, size_t __len)
    4338             :     { return basic_string<char>{__str, __len}; }
    4339             : 
    4340             :     _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_STRING_CONSTEXPR
    4341             :     inline basic_string<wchar_t>
    4342             :     operator""s(const wchar_t* __str, size_t __len)
    4343             :     { return basic_string<wchar_t>{__str, __len}; }
    4344             : 
    4345             : #ifdef _GLIBCXX_USE_CHAR8_T
    4346             :     _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_STRING_CONSTEXPR
    4347             :     inline basic_string<char8_t>
    4348             :     operator""s(const char8_t* __str, size_t __len)
    4349             :     { return basic_string<char8_t>{__str, __len}; }
    4350             : #endif
    4351             : 
    4352             :     _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_STRING_CONSTEXPR
    4353             :     inline basic_string<char16_t>
    4354             :     operator""s(const char16_t* __str, size_t __len)
    4355             :     { return basic_string<char16_t>{__str, __len}; }
    4356             : 
    4357             :     _GLIBCXX_DEFAULT_ABI_TAG _GLIBCXX_STRING_CONSTEXPR
    4358             :     inline basic_string<char32_t>
    4359             :     operator""s(const char32_t* __str, size_t __len)
    4360             :     { return basic_string<char32_t>{__str, __len}; }
    4361             : 
    4362             : #undef _GLIBCXX_STRING_CONSTEXPR
    4363             : #pragma GCC diagnostic pop
    4364             :   } // inline namespace string_literals
    4365             :   } // inline namespace literals
    4366             : 
    4367             : #if __cplusplus >= 201703L
    4368             :   namespace __detail::__variant
    4369             :   {
    4370             :     template<typename> struct _Never_valueless_alt; // see <variant>
    4371             : 
    4372             :     // Provide the strong exception-safety guarantee when emplacing a
    4373             :     // basic_string into a variant, but only if moving the string cannot throw.
    4374             :     template<typename _Tp, typename _Traits, typename _Alloc>
    4375             :       struct _Never_valueless_alt<std::basic_string<_Tp, _Traits, _Alloc>>
    4376             :       : __and_<
    4377             :         is_nothrow_move_constructible<std::basic_string<_Tp, _Traits, _Alloc>>,
    4378             :         is_nothrow_move_assignable<std::basic_string<_Tp, _Traits, _Alloc>>
    4379             :         >::type
    4380             :       { };
    4381             :   }  // namespace __detail::__variant
    4382             : #endif // C++17
    4383             : #endif // C++14
    4384             : 
    4385             : _GLIBCXX_END_NAMESPACE_VERSION
    4386             : } // namespace std
    4387             : 
    4388             : #endif // C++11
    4389             : 
    4390             : #endif /* _BASIC_STRING_H */

Generated by: LCOV version 1.16