1    	// Components for manipulating sequences of characters -*- C++ -*-
2    	
3    	// Copyright (C) 1997-2019 Free Software Foundation, Inc.
4    	//
5    	// This file is part of the GNU ISO C++ Library.  This library is free
6    	// software; you can redistribute it and/or modify it under the
7    	// terms of the GNU General Public License as published by the
8    	// Free Software Foundation; either version 3, or (at your option)
9    	// any later version.
10   	
11   	// This library is distributed in the hope that it will be useful,
12   	// but WITHOUT ANY WARRANTY; without even the implied warranty of
13   	// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   	// GNU General Public License for more details.
15   	
16   	// Under Section 7 of GPL version 3, you are granted additional
17   	// permissions described in the GCC Runtime Library Exception, version
18   	// 3.1, as published by the Free Software Foundation.
19   	
20   	// You should have received a copy of the GNU General Public License and
21   	// a copy of the GCC Runtime Library Exception along with this program;
22   	// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23   	// <http://www.gnu.org/licenses/>.
24   	
25   	/** @file bits/basic_string.h
26   	 *  This is an internal header file, included by other library headers.
27   	 *  Do not attempt to use it directly. @headername{string}
28   	 */
29   	
30   	//
31   	// ISO C++ 14882: 21 Strings library
32   	//
33   	
34   	#ifndef _BASIC_STRING_H
35   	#define _BASIC_STRING_H 1
36   	
37   	#pragma GCC system_header
38   	
39   	#include <ext/atomicity.h>
40   	#include <ext/alloc_traits.h>
41   	#include <debug/debug.h>
42   	
43   	#if __cplusplus >= 201103L
44   	#include <initializer_list>
45   	#endif
46   	
47   	#if __cplusplus >= 201703L
48   	# include <string_view>
49   	#endif
50   	
51   	
52   	namespace std _GLIBCXX_VISIBILITY(default)
53   	{
54   	_GLIBCXX_BEGIN_NAMESPACE_VERSION
55   	
56   	#if _GLIBCXX_USE_CXX11_ABI
57   	_GLIBCXX_BEGIN_NAMESPACE_CXX11
58   	  /**
59   	   *  @class basic_string basic_string.h <string>
60   	   *  @brief  Managing sequences of characters and character-like objects.
61   	   *
62   	   *  @ingroup strings
63   	   *  @ingroup sequences
64   	   *
65   	   *  @tparam _CharT  Type of character
66   	   *  @tparam _Traits  Traits for character type, defaults to
67   	   *                   char_traits<_CharT>.
68   	   *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
69   	   *
70   	   *  Meets the requirements of a <a href="tables.html#65">container</a>, a
71   	   *  <a href="tables.html#66">reversible container</a>, and a
72   	   *  <a href="tables.html#67">sequence</a>.  Of the
73   	   *  <a href="tables.html#68">optional sequence requirements</a>, only
74   	   *  @c push_back, @c at, and @c %array access are supported.
75   	   */
76   	  template<typename _CharT, typename _Traits, typename _Alloc>
77   	    class basic_string
78   	    {
79   	      typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
80   		rebind<_CharT>::other _Char_alloc_type;
81   	      typedef __gnu_cxx::__alloc_traits<_Char_alloc_type> _Alloc_traits;
82   	
83   	      // Types:
84   	    public:
85   	      typedef _Traits					traits_type;
86   	      typedef typename _Traits::char_type		value_type;
87   	      typedef _Char_alloc_type				allocator_type;
88   	      typedef typename _Alloc_traits::size_type		size_type;
89   	      typedef typename _Alloc_traits::difference_type	difference_type;
90   	      typedef typename _Alloc_traits::reference		reference;
91   	      typedef typename _Alloc_traits::const_reference	const_reference;
92   	      typedef typename _Alloc_traits::pointer		pointer;
93   	      typedef typename _Alloc_traits::const_pointer	const_pointer;
94   	      typedef __gnu_cxx::__normal_iterator<pointer, basic_string>  iterator;
95   	      typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
96   								const_iterator;
97   	      typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;
98   	      typedef std::reverse_iterator<iterator>		reverse_iterator;
99   	
100  	      ///  Value returned by various member functions when they fail.
101  	      static const size_type	npos = static_cast<size_type>(-1);
102  	
103  	    protected:
104  	      // type used for positions in insert, erase etc.
105  	#if __cplusplus < 201103L
106  	      typedef iterator __const_iterator;
107  	#else
108  	      typedef const_iterator __const_iterator;
109  	#endif
110  	
111  	    private:
112  	#if __cplusplus >= 201703L
113  	      // A helper type for avoiding boiler-plate.
114  	      typedef basic_string_view<_CharT, _Traits> __sv_type;
115  	
116  	      template<typename _Tp, typename _Res>
117  		using _If_sv = enable_if_t<
118  		  __and_<is_convertible<const _Tp&, __sv_type>,
119  			 __not_<is_convertible<const _Tp*, const basic_string*>>,
120  			 __not_<is_convertible<const _Tp&, const _CharT*>>>::value,
121  		  _Res>;
122  	
123  	      // Allows an implicit conversion to __sv_type.
124  	      static __sv_type
125  	      _S_to_string_view(__sv_type __svt) noexcept
126  	      { return __svt; }
127  	
128  	      // Wraps a string_view by explicit conversion and thus
129  	      // allows to add an internal constructor that does not
130  	      // participate in overload resolution when a string_view
131  	      // is provided.
132  	      struct __sv_wrapper
133  	      {
134  		explicit __sv_wrapper(__sv_type __sv) noexcept : _M_sv(__sv) { }
135  		__sv_type _M_sv;
136  	      };
137  	
138  	      /**
139  	       *  @brief  Only internally used: Construct string from a string view
140  	       *          wrapper.
141  	       *  @param  __svw  string view wrapper.
142  	       *  @param  __a  Allocator to use.
143  	       */
144  	      explicit
145  	      basic_string(__sv_wrapper __svw, const _Alloc& __a)
146  	      : basic_string(__svw._M_sv.data(), __svw._M_sv.size(), __a) { }
147  	#endif
148  	
149  	      // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
150  	      struct _Alloc_hider : allocator_type // TODO check __is_final
151  	      {
152  	#if __cplusplus < 201103L
153  		_Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc())
154  		: allocator_type(__a), _M_p(__dat) { }
155  	#else
156  		_Alloc_hider(pointer __dat, const _Alloc& __a)
157  		: allocator_type(__a), _M_p(__dat) { }
158  	
159  		_Alloc_hider(pointer __dat, _Alloc&& __a = _Alloc())
160  		: allocator_type(std::move(__a)), _M_p(__dat) { }
161  	#endif
162  	
163  		pointer _M_p; // The actual data.
164  	      };
165  	
166  	      _Alloc_hider	_M_dataplus;
167  	      size_type		_M_string_length;
168  	
169  	      enum { _S_local_capacity = 15 / sizeof(_CharT) };
170  	
171  	      union
172  	      {
173  		_CharT           _M_local_buf[_S_local_capacity + 1];
174  		size_type        _M_allocated_capacity;
175  	      };
176  	
177  	      void
178  	      _M_data(pointer __p)
179  	      { _M_dataplus._M_p = __p; }
180  	
181  	      void
182  	      _M_length(size_type __length)
183  	      { _M_string_length = __length; }
184  	
185  	      pointer
186  	      _M_data() const
187  	      { return _M_dataplus._M_p; }
188  	
189  	      pointer
190  	      _M_local_data()
191  	      {
192  	#if __cplusplus >= 201103L
193  		return std::pointer_traits<pointer>::pointer_to(*_M_local_buf);
194  	#else
195  		return pointer(_M_local_buf);
196  	#endif
197  	      }
198  	
199  	      const_pointer
200  	      _M_local_data() const
201  	      {
202  	#if __cplusplus >= 201103L
203  		return std::pointer_traits<const_pointer>::pointer_to(*_M_local_buf);
204  	#else
205  		return const_pointer(_M_local_buf);
206  	#endif
207  	      }
208  	
209  	      void
210  	      _M_capacity(size_type __capacity)
211  	      { _M_allocated_capacity = __capacity; }
212  	
213  	      void
214  	      _M_set_length(size_type __n)
215  	      {
216  		_M_length(__n);
217  		traits_type::assign(_M_data()[__n], _CharT());
218  	      }
219  	
220  	      bool
221  	      _M_is_local() const
222  	      { return _M_data() == _M_local_data(); }
223  	
224  	      // Create & Destroy
225  	      pointer
226  	      _M_create(size_type&, size_type);
227  	
228  	      void
229  	      _M_dispose()
230  	      {
231  		if (!_M_is_local())
232  		  _M_destroy(_M_allocated_capacity);
233  	      }
234  	
235  	      void
236  	      _M_destroy(size_type __size) throw()
237  	      { _Alloc_traits::deallocate(_M_get_allocator(), _M_data(), __size + 1); }
238  	
239  	      // _M_construct_aux is used to implement the 21.3.1 para 15 which
240  	      // requires special behaviour if _InIterator is an integral type
241  	      template<typename _InIterator>
242  	        void
243  	        _M_construct_aux(_InIterator __beg, _InIterator __end,
244  				 std::__false_type)
245  		{
246  	          typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
(1) Event deref_parm_in_call: Function "_M_construct" dereferences "__beg". [details]
247  	          _M_construct(__beg, __end, _Tag());
248  		}
249  	
250  	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
251  	      // 438. Ambiguity in the "do the right thing" clause
252  	      template<typename _Integer>
253  	        void
254  	        _M_construct_aux(_Integer __beg, _Integer __end, std::__true_type)
255  		{ _M_construct_aux_2(static_cast<size_type>(__beg), __end); }
256  	
257  	      void
258  	      _M_construct_aux_2(size_type __req, _CharT __c)
259  	      { _M_construct(__req, __c); }
260  	
261  	      template<typename _InIterator>
262  	        void
263  	        _M_construct(_InIterator __beg, _InIterator __end)
264  		{
265  		  typedef typename std::__is_integer<_InIterator>::__type _Integral;
(1) Event deref_parm_in_call: Function "_M_construct_aux" dereferences "__beg". [details]
266  		  _M_construct_aux(__beg, __end, _Integral());
267  	        }
268  	
269  	      // For Input Iterators, used in istreambuf_iterators, etc.
270  	      template<typename _InIterator>
271  	        void
272  	        _M_construct(_InIterator __beg, _InIterator __end,
273  			     std::input_iterator_tag);
274  	
275  	      // For forward_iterators up to random_access_iterators, used for
276  	      // string::iterator, _CharT*, etc.
277  	      template<typename _FwdIterator>
278  	        void
279  	        _M_construct(_FwdIterator __beg, _FwdIterator __end,
280  			     std::forward_iterator_tag);
281  	
282  	      void
283  	      _M_construct(size_type __req, _CharT __c);
284  	
285  	      allocator_type&
286  	      _M_get_allocator()
287  	      { return _M_dataplus; }
288  	
289  	      const allocator_type&
290  	      _M_get_allocator() const
291  	      { return _M_dataplus; }
292  	
293  	    private:
294  	
295  	#ifdef _GLIBCXX_DISAMBIGUATE_REPLACE_INST
296  	      // The explicit instantiations in misc-inst.cc require this due to
297  	      // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64063
298  	      template<typename _Tp, bool _Requires =
299  		       !__are_same<_Tp, _CharT*>::__value
300  		       && !__are_same<_Tp, const _CharT*>::__value
301  		       && !__are_same<_Tp, iterator>::__value
302  		       && !__are_same<_Tp, const_iterator>::__value>
303  		struct __enable_if_not_native_iterator
304  		{ typedef basic_string& __type; };
305  	      template<typename _Tp>
306  		struct __enable_if_not_native_iterator<_Tp, false> { };
307  	#endif
308  	
309  	      size_type
310  	      _M_check(size_type __pos, const char* __s) const
311  	      {
312  		if (__pos > this->size())
313  		  __throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > "
314  					       "this->size() (which is %zu)"),
315  					   __s, __pos, this->size());
316  		return __pos;
317  	      }
318  	
319  	      void
320  	      _M_check_length(size_type __n1, size_type __n2, const char* __s) const
321  	      {
322  		if (this->max_size() - (this->size() - __n1) < __n2)
323  		  __throw_length_error(__N(__s));
324  	      }
325  	
326  	
327  	      // NB: _M_limit doesn't check for a bad __pos value.
328  	      size_type
329  	      _M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT
330  	      {
331  		const bool __testoff =  __off < this->size() - __pos;
332  		return __testoff ? __off : this->size() - __pos;
333  	      }
334  	
335  	      // True if _Rep and source do not overlap.
336  	      bool
337  	      _M_disjunct(const _CharT* __s) const _GLIBCXX_NOEXCEPT
338  	      {
339  		return (less<const _CharT*>()(__s, _M_data())
340  			|| less<const _CharT*>()(_M_data() + this->size(), __s));
341  	      }
342  	
343  	      // When __n = 1 way faster than the general multichar
344  	      // traits_type::copy/move/assign.
345  	      static void
346  	      _S_copy(_CharT* __d, const _CharT* __s, size_type __n)
347  	      {
(1) Event cond_true: Condition "__n == 1", taking true branch.
348  		if (__n == 1)
(2) Event deref_parm_in_call: Function "assign" dereferences "__s". [details]
349  		  traits_type::assign(*__d, *__s);
350  		else
351  		  traits_type::copy(__d, __s, __n);
352  	      }
353  	
354  	      static void
355  	      _S_move(_CharT* __d, const _CharT* __s, size_type __n)
356  	      {
357  		if (__n == 1)
358  		  traits_type::assign(*__d, *__s);
359  		else
360  		  traits_type::move(__d, __s, __n);
361  	      }
362  	
363  	      static void
364  	      _S_assign(_CharT* __d, size_type __n, _CharT __c)
365  	      {
366  		if (__n == 1)
367  		  traits_type::assign(*__d, __c);
368  		else
369  		  traits_type::assign(__d, __n, __c);
370  	      }
371  	
372  	      // _S_copy_chars is a separate template to permit specialization
373  	      // to optimize for the common case of pointers as iterators.
374  	      template<class _Iterator>
375  	        static void
376  	        _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
377  	        {
378  		  for (; __k1 != __k2; ++__k1, (void)++__p)
379  		    traits_type::assign(*__p, *__k1); // These types are off.
380  		}
381  	
382  	      static void
383  	      _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2) _GLIBCXX_NOEXCEPT
384  	      { _S_copy_chars(__p, __k1.base(), __k2.base()); }
385  	
386  	      static void
387  	      _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
388  	      _GLIBCXX_NOEXCEPT
389  	      { _S_copy_chars(__p, __k1.base(), __k2.base()); }
390  	
391  	      static void
392  	      _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) _GLIBCXX_NOEXCEPT
393  	      { _S_copy(__p, __k1, __k2 - __k1); }
394  	
395  	      static void
396  	      _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
397  	      _GLIBCXX_NOEXCEPT
(1) Event deref_parm_in_call: Function "_S_copy" dereferences "__k1". [details]
398  	      { _S_copy(__p, __k1, __k2 - __k1); }
399  	
400  	      static int
401  	      _S_compare(size_type __n1, size_type __n2) _GLIBCXX_NOEXCEPT
402  	      {
403  		const difference_type __d = difference_type(__n1 - __n2);
404  	
405  		if (__d > __gnu_cxx::__numeric_traits<int>::__max)
406  		  return __gnu_cxx::__numeric_traits<int>::__max;
407  		else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
408  		  return __gnu_cxx::__numeric_traits<int>::__min;
409  		else
410  		  return int(__d);
411  	      }
412  	
413  	      void
414  	      _M_assign(const basic_string&);
415  	
416  	      void
417  	      _M_mutate(size_type __pos, size_type __len1, const _CharT* __s,
418  			size_type __len2);
419  	
420  	      void
421  	      _M_erase(size_type __pos, size_type __n);
422  	
423  	    public:
424  	      // Construct/copy/destroy:
425  	      // NB: We overload ctors in some cases instead of using default
426  	      // arguments, per 17.4.4.4 para. 2 item 2.
427  	
428  	      /**
429  	       *  @brief  Default constructor creates an empty string.
430  	       */
431  	      basic_string()
432  	      _GLIBCXX_NOEXCEPT_IF(is_nothrow_default_constructible<_Alloc>::value)
433  	      : _M_dataplus(_M_local_data())
434  	      { _M_set_length(0); }
435  	
436  	      /**
437  	       *  @brief  Construct an empty string using allocator @a a.
438  	       */
439  	      explicit
440  	      basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT
441  	      : _M_dataplus(_M_local_data(), __a)
442  	      { _M_set_length(0); }
443  	
444  	      /**
445  	       *  @brief  Construct string with copy of value of @a __str.
446  	       *  @param  __str  Source string.
447  	       */
448  	      basic_string(const basic_string& __str)
449  	      : _M_dataplus(_M_local_data(),
450  			    _Alloc_traits::_S_select_on_copy(__str._M_get_allocator()))
451  	      { _M_construct(__str._M_data(), __str._M_data() + __str.length()); }
452  	
453  	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
454  	      // 2583. no way to supply an allocator for basic_string(str, pos)
455  	      /**
456  	       *  @brief  Construct string as copy of a substring.
457  	       *  @param  __str  Source string.
458  	       *  @param  __pos  Index of first character to copy from.
459  	       *  @param  __a  Allocator to use.
460  	       */
461  	      basic_string(const basic_string& __str, size_type __pos,
462  			   const _Alloc& __a = _Alloc())
463  	      : _M_dataplus(_M_local_data(), __a)
464  	      {
465  		const _CharT* __start = __str._M_data()
466  		  + __str._M_check(__pos, "basic_string::basic_string");
467  		_M_construct(__start, __start + __str._M_limit(__pos, npos));
468  	      }
469  	
470  	      /**
471  	       *  @brief  Construct string as copy of a substring.
472  	       *  @param  __str  Source string.
473  	       *  @param  __pos  Index of first character to copy from.
474  	       *  @param  __n  Number of characters to copy.
475  	       */
476  	      basic_string(const basic_string& __str, size_type __pos,
477  			   size_type __n)
478  	      : _M_dataplus(_M_local_data())
479  	      {
480  		const _CharT* __start = __str._M_data()
481  		  + __str._M_check(__pos, "basic_string::basic_string");
482  		_M_construct(__start, __start + __str._M_limit(__pos, __n));
483  	      }
484  	
485  	      /**
486  	       *  @brief  Construct string as copy of a substring.
487  	       *  @param  __str  Source string.
488  	       *  @param  __pos  Index of first character to copy from.
489  	       *  @param  __n  Number of characters to copy.
490  	       *  @param  __a  Allocator to use.
491  	       */
492  	      basic_string(const basic_string& __str, size_type __pos,
493  			   size_type __n, const _Alloc& __a)
494  	      : _M_dataplus(_M_local_data(), __a)
495  	      {
496  		const _CharT* __start
497  		  = __str._M_data() + __str._M_check(__pos, "string::string");
498  		_M_construct(__start, __start + __str._M_limit(__pos, __n));
499  	      }
500  	
501  	      /**
502  	       *  @brief  Construct string initialized by a character %array.
503  	       *  @param  __s  Source character %array.
504  	       *  @param  __n  Number of characters to copy.
505  	       *  @param  __a  Allocator to use (default is default allocator).
506  	       *
507  	       *  NB: @a __s must have at least @a __n characters, &apos;\\0&apos;
508  	       *  has no special meaning.
509  	       */
510  	      basic_string(const _CharT* __s, size_type __n,
511  			   const _Alloc& __a = _Alloc())
512  	      : _M_dataplus(_M_local_data(), __a)
513  	      { _M_construct(__s, __s + __n); }
514  	
515  	      /**
516  	       *  @brief  Construct string as copy of a C string.
517  	       *  @param  __s  Source C string.
518  	       *  @param  __a  Allocator to use (default is default allocator).
519  	       */
520  	#if __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
521  	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
522  	      // 3076. basic_string CTAD ambiguity
523  	      template<typename = _RequireAllocator<_Alloc>>
524  	#endif
525  	      basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
526  	      : _M_dataplus(_M_local_data(), __a)
(1) Event cond_false: Condition "__s", taking false branch.
(2) Event var_compare_op: Comparing "__s" to null implies that "__s" might be null.
(3) Event var_deref_model: Passing null pointer "__s" to "_M_construct", which dereferences it. [details]
527  	      { _M_construct(__s, __s ? __s + traits_type::length(__s) : __s+npos); }
528  	
529  	      /**
530  	       *  @brief  Construct string as multiple characters.
531  	       *  @param  __n  Number of characters.
532  	       *  @param  __c  Character to use.
533  	       *  @param  __a  Allocator to use (default is default allocator).
534  	       */
535  	#if __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
536  	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
537  	      // 3076. basic_string CTAD ambiguity
538  	      template<typename = _RequireAllocator<_Alloc>>
539  	#endif
540  	      basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
541  	      : _M_dataplus(_M_local_data(), __a)
542  	      { _M_construct(__n, __c); }
543  	
544  	#if __cplusplus >= 201103L
545  	      /**
546  	       *  @brief  Move construct string.
547  	       *  @param  __str  Source string.
548  	       *
549  	       *  The newly-created string contains the exact contents of @a __str.
550  	       *  @a __str is a valid, but unspecified string.
551  	       **/
552  	      basic_string(basic_string&& __str) noexcept
553  	      : _M_dataplus(_M_local_data(), std::move(__str._M_get_allocator()))
554  	      {
555  		if (__str._M_is_local())
556  		  {
557  		    traits_type::copy(_M_local_buf, __str._M_local_buf,
558  				      _S_local_capacity + 1);
559  		  }
560  		else
561  		  {
562  		    _M_data(__str._M_data());
563  		    _M_capacity(__str._M_allocated_capacity);
564  		  }
565  	
566  		// Must use _M_length() here not _M_set_length() because
567  		// basic_stringbuf relies on writing into unallocated capacity so
568  		// we mess up the contents if we put a '\0' in the string.
569  		_M_length(__str.length());
570  		__str._M_data(__str._M_local_data());
571  		__str._M_set_length(0);
572  	      }
573  	
574  	      /**
575  	       *  @brief  Construct string from an initializer %list.
576  	       *  @param  __l  std::initializer_list of characters.
577  	       *  @param  __a  Allocator to use (default is default allocator).
578  	       */
579  	      basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc())
580  	      : _M_dataplus(_M_local_data(), __a)
581  	      { _M_construct(__l.begin(), __l.end()); }
582  	
583  	      basic_string(const basic_string& __str, const _Alloc& __a)
584  	      : _M_dataplus(_M_local_data(), __a)
585  	      { _M_construct(__str.begin(), __str.end()); }
586  	
587  	      basic_string(basic_string&& __str, const _Alloc& __a)
588  	      noexcept(_Alloc_traits::_S_always_equal())
589  	      : _M_dataplus(_M_local_data(), __a)
590  	      {
591  		if (__str._M_is_local())
592  		  {
593  		    traits_type::copy(_M_local_buf, __str._M_local_buf,
594  				      _S_local_capacity + 1);
595  		    _M_length(__str.length());
596  		    __str._M_set_length(0);
597  		  }
598  		else if (_Alloc_traits::_S_always_equal()
599  		    || __str.get_allocator() == __a)
600  		  {
601  		    _M_data(__str._M_data());
602  		    _M_length(__str.length());
603  		    _M_capacity(__str._M_allocated_capacity);
604  		    __str._M_data(__str._M_local_buf);
605  		    __str._M_set_length(0);
606  		  }
607  		else
608  		  _M_construct(__str.begin(), __str.end());
609  	      }
610  	
611  	#endif // C++11
612  	
613  	      /**
614  	       *  @brief  Construct string as copy of a range.
615  	       *  @param  __beg  Start of range.
616  	       *  @param  __end  End of range.
617  	       *  @param  __a  Allocator to use (default is default allocator).
618  	       */
619  	#if __cplusplus >= 201103L
620  	      template<typename _InputIterator,
621  		       typename = std::_RequireInputIter<_InputIterator>>
622  	#else
623  	      template<typename _InputIterator>
624  	#endif
625  	        basic_string(_InputIterator __beg, _InputIterator __end,
626  			     const _Alloc& __a = _Alloc())
627  		: _M_dataplus(_M_local_data(), __a)
628  		{ _M_construct(__beg, __end); }
629  	
630  	#if __cplusplus >= 201703L
631  	      /**
632  	       *  @brief  Construct string from a substring of a string_view.
633  	       *  @param  __t   Source object convertible to string view.
634  	       *  @param  __pos The index of the first character to copy from __t.
635  	       *  @param  __n   The number of characters to copy from __t.
636  	       *  @param  __a   Allocator to use.
637  	       */
638  	      template<typename _Tp, typename = _If_sv<_Tp, void>>
639  		basic_string(const _Tp& __t, size_type __pos, size_type __n,
640  			     const _Alloc& __a = _Alloc())
641  		: basic_string(_S_to_string_view(__t).substr(__pos, __n), __a) { }
642  	
643  	      /**
644  	       *  @brief  Construct string from a string_view.
645  	       *  @param  __t  Source object convertible to string view.
646  	       *  @param  __a  Allocator to use (default is default allocator).
647  	       */
648  	      template<typename _Tp, typename = _If_sv<_Tp, void>>
649  		explicit
650  		basic_string(const _Tp& __t, const _Alloc& __a = _Alloc())
651  		: basic_string(__sv_wrapper(_S_to_string_view(__t)), __a) { }
652  	#endif // C++17
653  	
654  	      /**
655  	       *  @brief  Destroy the string instance.
656  	       */
657  	      ~basic_string()
658  	      { _M_dispose(); }
659  	
660  	      /**
661  	       *  @brief  Assign the value of @a str to this string.
662  	       *  @param  __str  Source string.
663  	       */
664  	      basic_string&
665  	      operator=(const basic_string& __str)
666  	      {
667  	#if __cplusplus >= 201103L
668  		if (_Alloc_traits::_S_propagate_on_copy_assign())
669  		  {
670  		    if (!_Alloc_traits::_S_always_equal() && !_M_is_local()
671  			&& _M_get_allocator() != __str._M_get_allocator())
672  		      {
673  			// Propagating allocator cannot free existing storage so must
674  			// deallocate it before replacing current allocator.
675  			if (__str.size() <= _S_local_capacity)
676  			  {
677  			    _M_destroy(_M_allocated_capacity);
678  			    _M_data(_M_local_data());
679  			    _M_set_length(0);
680  			  }
681  			else
682  			  {
683  			    const auto __len = __str.size();
684  			    auto __alloc = __str._M_get_allocator();
685  			    // If this allocation throws there are no effects:
686  			    auto __ptr = _Alloc_traits::allocate(__alloc, __len + 1);
687  			    _M_destroy(_M_allocated_capacity);
688  			    _M_data(__ptr);
689  			    _M_capacity(__len);
690  			    _M_set_length(__len);
691  			  }
692  		      }
693  		    std::__alloc_on_copy(_M_get_allocator(), __str._M_get_allocator());
694  		  }
695  	#endif
696  		return this->assign(__str);
697  	      }
698  	
699  	      /**
700  	       *  @brief  Copy contents of @a s into this string.
701  	       *  @param  __s  Source null-terminated string.
702  	       */
703  	      basic_string&
704  	      operator=(const _CharT* __s)
705  	      { return this->assign(__s); }
706  	
707  	      /**
708  	       *  @brief  Set value to string of length 1.
709  	       *  @param  __c  Source character.
710  	       *
711  	       *  Assigning to a character makes this string length 1 and
712  	       *  (*this)[0] == @a c.
713  	       */
714  	      basic_string&
715  	      operator=(_CharT __c)
716  	      {
717  		this->assign(1, __c);
718  		return *this;
719  	      }
720  	
721  	#if __cplusplus >= 201103L
722  	      /**
723  	       *  @brief  Move assign the value of @a str to this string.
724  	       *  @param  __str  Source string.
725  	       *
726  	       *  The contents of @a str are moved into this string (without copying).
727  	       *  @a str is a valid, but unspecified string.
728  	       **/
729  	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
730  	      // 2063. Contradictory requirements for string move assignment
731  	      basic_string&
732  	      operator=(basic_string&& __str)
733  	      noexcept(_Alloc_traits::_S_nothrow_move())
734  	      {
735  		if (!_M_is_local() && _Alloc_traits::_S_propagate_on_move_assign()
736  		    && !_Alloc_traits::_S_always_equal()
737  		    && _M_get_allocator() != __str._M_get_allocator())
738  		  {
739  		    // Destroy existing storage before replacing allocator.
740  		    _M_destroy(_M_allocated_capacity);
741  		    _M_data(_M_local_data());
742  		    _M_set_length(0);
743  		  }
744  		// Replace allocator if POCMA is true.
745  		std::__alloc_on_move(_M_get_allocator(), __str._M_get_allocator());
746  	
747  		if (__str._M_is_local())
748  		  {
749  		    // We've always got room for a short string, just copy it.
750  		    if (__str.size())
751  		      this->_S_copy(_M_data(), __str._M_data(), __str.size());
752  		    _M_set_length(__str.size());
753  		  }
754  		else if (_Alloc_traits::_S_propagate_on_move_assign()
755  		    || _Alloc_traits::_S_always_equal()
756  		    || _M_get_allocator() == __str._M_get_allocator())
757  		  {
758  		    // Just move the allocated pointer, our allocator can free it.
759  		    pointer __data = nullptr;
760  		    size_type __capacity;
761  		    if (!_M_is_local())
762  		      {
763  			if (_Alloc_traits::_S_always_equal())
764  			  {
765  			    // __str can reuse our existing storage.
766  			    __data = _M_data();
767  			    __capacity = _M_allocated_capacity;
768  			  }
769  			else // __str can't use it, so free it.
770  			  _M_destroy(_M_allocated_capacity);
771  		      }
772  	
773  		    _M_data(__str._M_data());
774  		    _M_length(__str.length());
775  		    _M_capacity(__str._M_allocated_capacity);
776  		    if (__data)
777  		      {
778  			__str._M_data(__data);
779  			__str._M_capacity(__capacity);
780  		      }
781  		    else
782  		      __str._M_data(__str._M_local_buf);
783  		  }
784  		else // Need to do a deep copy
785  		  assign(__str);
786  		__str.clear();
787  		return *this;
788  	      }
789  	
790  	      /**
791  	       *  @brief  Set value to string constructed from initializer %list.
792  	       *  @param  __l  std::initializer_list.
793  	       */
794  	      basic_string&
795  	      operator=(initializer_list<_CharT> __l)
796  	      {
797  		this->assign(__l.begin(), __l.size());
798  		return *this;
799  	      }
800  	#endif // C++11
801  	
802  	#if __cplusplus >= 201703L
803  	      /**
804  	       *  @brief  Set value to string constructed from a string_view.
805  	       *  @param  __svt  An object convertible to string_view.
806  	       */
807  	     template<typename _Tp>
808  	       _If_sv<_Tp, basic_string&>
809  	       operator=(const _Tp& __svt)
810  	       { return this->assign(__svt); }
811  	
812  	      /**
813  	       *  @brief  Convert to a string_view.
814  	       *  @return A string_view.
815  	       */
816  	      operator __sv_type() const noexcept
817  	      { return __sv_type(data(), size()); }
818  	#endif // C++17
819  	
820  	      // Iterators:
821  	      /**
822  	       *  Returns a read/write iterator that points to the first character in
823  	       *  the %string.
824  	       */
825  	      iterator
826  	      begin() _GLIBCXX_NOEXCEPT
827  	      { return iterator(_M_data()); }
828  	
829  	      /**
830  	       *  Returns a read-only (constant) iterator that points to the first
831  	       *  character in the %string.
832  	       */
833  	      const_iterator
834  	      begin() const _GLIBCXX_NOEXCEPT
835  	      { return const_iterator(_M_data()); }
836  	
837  	      /**
838  	       *  Returns a read/write iterator that points one past the last
839  	       *  character in the %string.
840  	       */
841  	      iterator
842  	      end() _GLIBCXX_NOEXCEPT
843  	      { return iterator(_M_data() + this->size()); }
844  	
845  	      /**
846  	       *  Returns a read-only (constant) iterator that points one past the
847  	       *  last character in the %string.
848  	       */
849  	      const_iterator
850  	      end() const _GLIBCXX_NOEXCEPT
851  	      { return const_iterator(_M_data() + this->size()); }
852  	
853  	      /**
854  	       *  Returns a read/write reverse iterator that points to the last
855  	       *  character in the %string.  Iteration is done in reverse element
856  	       *  order.
857  	       */
858  	      reverse_iterator
859  	      rbegin() _GLIBCXX_NOEXCEPT
860  	      { return reverse_iterator(this->end()); }
861  	
862  	      /**
863  	       *  Returns a read-only (constant) reverse iterator that points
864  	       *  to the last character in the %string.  Iteration is done in
865  	       *  reverse element order.
866  	       */
867  	      const_reverse_iterator
868  	      rbegin() const _GLIBCXX_NOEXCEPT
869  	      { return const_reverse_iterator(this->end()); }
870  	
871  	      /**
872  	       *  Returns a read/write reverse iterator that points to one before the
873  	       *  first character in the %string.  Iteration is done in reverse
874  	       *  element order.
875  	       */
876  	      reverse_iterator
877  	      rend() _GLIBCXX_NOEXCEPT
878  	      { return reverse_iterator(this->begin()); }
879  	
880  	      /**
881  	       *  Returns a read-only (constant) reverse iterator that points
882  	       *  to one before the first character in the %string.  Iteration
883  	       *  is done in reverse element order.
884  	       */
885  	      const_reverse_iterator
886  	      rend() const _GLIBCXX_NOEXCEPT
887  	      { return const_reverse_iterator(this->begin()); }
888  	
889  	#if __cplusplus >= 201103L
890  	      /**
891  	       *  Returns a read-only (constant) iterator that points to the first
892  	       *  character in the %string.
893  	       */
894  	      const_iterator
895  	      cbegin() const noexcept
896  	      { return const_iterator(this->_M_data()); }
897  	
898  	      /**
899  	       *  Returns a read-only (constant) iterator that points one past the
900  	       *  last character in the %string.
901  	       */
902  	      const_iterator
903  	      cend() const noexcept
904  	      { return const_iterator(this->_M_data() + this->size()); }
905  	
906  	      /**
907  	       *  Returns a read-only (constant) reverse iterator that points
908  	       *  to the last character in the %string.  Iteration is done in
909  	       *  reverse element order.
910  	       */
911  	      const_reverse_iterator
912  	      crbegin() const noexcept
913  	      { return const_reverse_iterator(this->end()); }
914  	
915  	      /**
916  	       *  Returns a read-only (constant) reverse iterator that points
917  	       *  to one before the first character in the %string.  Iteration
918  	       *  is done in reverse element order.
919  	       */
920  	      const_reverse_iterator
921  	      crend() const noexcept
922  	      { return const_reverse_iterator(this->begin()); }
923  	#endif
924  	
925  	    public:
926  	      // Capacity:
927  	      ///  Returns the number of characters in the string, not including any
928  	      ///  null-termination.
929  	      size_type
930  	      size() const _GLIBCXX_NOEXCEPT
931  	      { return _M_string_length; }
932  	
933  	      ///  Returns the number of characters in the string, not including any
934  	      ///  null-termination.
935  	      size_type
936  	      length() const _GLIBCXX_NOEXCEPT
937  	      { return _M_string_length; }
938  	
939  	      ///  Returns the size() of the largest possible %string.
940  	      size_type
941  	      max_size() const _GLIBCXX_NOEXCEPT
942  	      { return (_Alloc_traits::max_size(_M_get_allocator()) - 1) / 2; }
943  	
944  	      /**
945  	       *  @brief  Resizes the %string to the specified number of characters.
946  	       *  @param  __n  Number of characters the %string should contain.
947  	       *  @param  __c  Character to fill any new elements.
948  	       *
949  	       *  This function will %resize the %string to the specified
950  	       *  number of characters.  If the number is smaller than the
951  	       *  %string's current size the %string is truncated, otherwise
952  	       *  the %string is extended and new elements are %set to @a __c.
953  	       */
954  	      void
955  	      resize(size_type __n, _CharT __c);
956  	
957  	      /**
958  	       *  @brief  Resizes the %string to the specified number of characters.
959  	       *  @param  __n  Number of characters the %string should contain.
960  	       *
961  	       *  This function will resize the %string to the specified length.  If
962  	       *  the new size is smaller than the %string's current size the %string
963  	       *  is truncated, otherwise the %string is extended and new characters
964  	       *  are default-constructed.  For basic types such as char, this means
965  	       *  setting them to 0.
966  	       */
967  	      void
968  	      resize(size_type __n)
969  	      { this->resize(__n, _CharT()); }
970  	
971  	#if __cplusplus >= 201103L
972  	      ///  A non-binding request to reduce capacity() to size().
973  	      void
974  	      shrink_to_fit() noexcept
975  	      {
976  	#if __cpp_exceptions
977  		if (capacity() > size())
978  		  {
979  		    try
980  		      { reserve(0); }
981  		    catch(...)
982  		      { }
983  		  }
984  	#endif
985  	      }
986  	#endif
987  	
988  	      /**
989  	       *  Returns the total number of characters that the %string can hold
990  	       *  before needing to allocate more memory.
991  	       */
992  	      size_type
993  	      capacity() const _GLIBCXX_NOEXCEPT
994  	      {
995  		return _M_is_local() ? size_type(_S_local_capacity)
996  		                     : _M_allocated_capacity;
997  	      }
998  	
999  	      /**
1000 	       *  @brief  Attempt to preallocate enough memory for specified number of
1001 	       *          characters.
1002 	       *  @param  __res_arg  Number of characters required.
1003 	       *  @throw  std::length_error  If @a __res_arg exceeds @c max_size().
1004 	       *
1005 	       *  This function attempts to reserve enough memory for the
1006 	       *  %string to hold the specified number of characters.  If the
1007 	       *  number requested is more than max_size(), length_error is
1008 	       *  thrown.
1009 	       *
1010 	       *  The advantage of this function is that if optimal code is a
1011 	       *  necessity and the user can determine the string length that will be
1012 	       *  required, the user can reserve the memory in %advance, and thus
1013 	       *  prevent a possible reallocation of memory and copying of %string
1014 	       *  data.
1015 	       */
1016 	      void
1017 	      reserve(size_type __res_arg = 0);
1018 	
1019 	      /**
1020 	       *  Erases the string, making it empty.
1021 	       */
1022 	      void
1023 	      clear() _GLIBCXX_NOEXCEPT
1024 	      { _M_set_length(0); }
1025 	
1026 	      /**
1027 	       *  Returns true if the %string is empty.  Equivalent to 
1028 	       *  <code>*this == ""</code>.
1029 	       */
1030 	      _GLIBCXX_NODISCARD bool
1031 	      empty() const _GLIBCXX_NOEXCEPT
1032 	      { return this->size() == 0; }
1033 	
1034 	      // Element access:
1035 	      /**
1036 	       *  @brief  Subscript access to the data contained in the %string.
1037 	       *  @param  __pos  The index of the character to access.
1038 	       *  @return  Read-only (constant) reference to the character.
1039 	       *
1040 	       *  This operator allows for easy, array-style, data access.
1041 	       *  Note that data access with this operator is unchecked and
1042 	       *  out_of_range lookups are not defined. (For checked lookups
1043 	       *  see at().)
1044 	       */
1045 	      const_reference
1046 	      operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT
1047 	      {
1048 		__glibcxx_assert(__pos <= size());
1049 		return _M_data()[__pos];
1050 	      }
1051 	
1052 	      /**
1053 	       *  @brief  Subscript access to the data contained in the %string.
1054 	       *  @param  __pos  The index of the character to access.
1055 	       *  @return  Read/write reference to the character.
1056 	       *
1057 	       *  This operator allows for easy, array-style, data access.
1058 	       *  Note that data access with this operator is unchecked and
1059 	       *  out_of_range lookups are not defined. (For checked lookups
1060 	       *  see at().)
1061 	       */
1062 	      reference
1063 	      operator[](size_type __pos)
1064 	      {
1065 	        // Allow pos == size() both in C++98 mode, as v3 extension,
1066 		// and in C++11 mode.
1067 		__glibcxx_assert(__pos <= size());
1068 	        // In pedantic mode be strict in C++98 mode.
1069 		_GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L || __pos < size());
1070 		return _M_data()[__pos];
1071 	      }
1072 	
1073 	      /**
1074 	       *  @brief  Provides access to the data contained in the %string.
1075 	       *  @param __n The index of the character to access.
1076 	       *  @return  Read-only (const) reference to the character.
1077 	       *  @throw  std::out_of_range  If @a n is an invalid index.
1078 	       *
1079 	       *  This function provides for safer data access.  The parameter is
1080 	       *  first checked that it is in the range of the string.  The function
1081 	       *  throws out_of_range if the check fails.
1082 	       */
1083 	      const_reference
1084 	      at(size_type __n) const
1085 	      {
1086 		if (__n >= this->size())
1087 		  __throw_out_of_range_fmt(__N("basic_string::at: __n "
1088 					       "(which is %zu) >= this->size() "
1089 					       "(which is %zu)"),
1090 					   __n, this->size());
1091 		return _M_data()[__n];
1092 	      }
1093 	
1094 	      /**
1095 	       *  @brief  Provides access to the data contained in the %string.
1096 	       *  @param __n The index of the character to access.
1097 	       *  @return  Read/write reference to the character.
1098 	       *  @throw  std::out_of_range  If @a n is an invalid index.
1099 	       *
1100 	       *  This function provides for safer data access.  The parameter is
1101 	       *  first checked that it is in the range of the string.  The function
1102 	       *  throws out_of_range if the check fails.
1103 	       */
1104 	      reference
1105 	      at(size_type __n)
1106 	      {
1107 		if (__n >= size())
1108 		  __throw_out_of_range_fmt(__N("basic_string::at: __n "
1109 					       "(which is %zu) >= this->size() "
1110 					       "(which is %zu)"),
1111 					   __n, this->size());
1112 		return _M_data()[__n];
1113 	      }
1114 	
1115 	#if __cplusplus >= 201103L
1116 	      /**
1117 	       *  Returns a read/write reference to the data at the first
1118 	       *  element of the %string.
1119 	       */
1120 	      reference
1121 	      front() noexcept
1122 	      {
1123 		__glibcxx_assert(!empty());
1124 		return operator[](0);
1125 	      }
1126 	
1127 	      /**
1128 	       *  Returns a read-only (constant) reference to the data at the first
1129 	       *  element of the %string.
1130 	       */
1131 	      const_reference
1132 	      front() const noexcept
1133 	      {
1134 		__glibcxx_assert(!empty());
1135 		return operator[](0);
1136 	      }
1137 	
1138 	      /**
1139 	       *  Returns a read/write reference to the data at the last
1140 	       *  element of the %string.
1141 	       */
1142 	      reference
1143 	      back() noexcept
1144 	      {
1145 		__glibcxx_assert(!empty());
1146 		return operator[](this->size() - 1);
1147 	      }
1148 	
1149 	      /**
1150 	       *  Returns a read-only (constant) reference to the data at the
1151 	       *  last element of the %string.
1152 	       */
1153 	      const_reference
1154 	      back() const noexcept
1155 	      {
1156 		__glibcxx_assert(!empty());
1157 		return operator[](this->size() - 1);
1158 	      }
1159 	#endif
1160 	
1161 	      // Modifiers:
1162 	      /**
1163 	       *  @brief  Append a string to this string.
1164 	       *  @param __str  The string to append.
1165 	       *  @return  Reference to this string.
1166 	       */
1167 	      basic_string&
1168 	      operator+=(const basic_string& __str)
1169 	      { return this->append(__str); }
1170 	
1171 	      /**
1172 	       *  @brief  Append a C string.
1173 	       *  @param __s  The C string to append.
1174 	       *  @return  Reference to this string.
1175 	       */
1176 	      basic_string&
1177 	      operator+=(const _CharT* __s)
1178 	      { return this->append(__s); }
1179 	
1180 	      /**
1181 	       *  @brief  Append a character.
1182 	       *  @param __c  The character to append.
1183 	       *  @return  Reference to this string.
1184 	       */
1185 	      basic_string&
1186 	      operator+=(_CharT __c)
1187 	      {
1188 		this->push_back(__c);
1189 		return *this;
1190 	      }
1191 	
1192 	#if __cplusplus >= 201103L
1193 	      /**
1194 	       *  @brief  Append an initializer_list of characters.
1195 	       *  @param __l  The initializer_list of characters to be appended.
1196 	       *  @return  Reference to this string.
1197 	       */
1198 	      basic_string&
1199 	      operator+=(initializer_list<_CharT> __l)
1200 	      { return this->append(__l.begin(), __l.size()); }
1201 	#endif // C++11
1202 	
1203 	#if __cplusplus >= 201703L
1204 	      /**
1205 	       *  @brief  Append a string_view.
1206 	       *  @param __svt  An object convertible to string_view to be appended.
1207 	       *  @return  Reference to this string.
1208 	       */
1209 	      template<typename _Tp>
1210 		_If_sv<_Tp, basic_string&>
1211 		operator+=(const _Tp& __svt)
1212 		{ return this->append(__svt); }
1213 	#endif // C++17
1214 	
1215 	      /**
1216 	       *  @brief  Append a string to this string.
1217 	       *  @param __str  The string to append.
1218 	       *  @return  Reference to this string.
1219 	       */
1220 	      basic_string&
1221 	      append(const basic_string& __str)
1222 	      { return _M_append(__str._M_data(), __str.size()); }
1223 	
1224 	      /**
1225 	       *  @brief  Append a substring.
1226 	       *  @param __str  The string to append.
1227 	       *  @param __pos  Index of the first character of str to append.
1228 	       *  @param __n  The number of characters to append.
1229 	       *  @return  Reference to this string.
1230 	       *  @throw  std::out_of_range if @a __pos is not a valid index.
1231 	       *
1232 	       *  This function appends @a __n characters from @a __str
1233 	       *  starting at @a __pos to this string.  If @a __n is is larger
1234 	       *  than the number of available characters in @a __str, the
1235 	       *  remainder of @a __str is appended.
1236 	       */
1237 	      basic_string&
1238 	      append(const basic_string& __str, size_type __pos, size_type __n = npos)
1239 	      { return _M_append(__str._M_data()
1240 				 + __str._M_check(__pos, "basic_string::append"),
1241 				 __str._M_limit(__pos, __n)); }
1242 	
1243 	      /**
1244 	       *  @brief  Append a C substring.
1245 	       *  @param __s  The C string to append.
1246 	       *  @param __n  The number of characters to append.
1247 	       *  @return  Reference to this string.
1248 	       */
1249 	      basic_string&
1250 	      append(const _CharT* __s, size_type __n)
1251 	      {
1252 		__glibcxx_requires_string_len(__s, __n);
1253 		_M_check_length(size_type(0), __n, "basic_string::append");
1254 		return _M_append(__s, __n);
1255 	      }
1256 	
1257 	      /**
1258 	       *  @brief  Append a C string.
1259 	       *  @param __s  The C string to append.
1260 	       *  @return  Reference to this string.
1261 	       */
1262 	      basic_string&
1263 	      append(const _CharT* __s)
1264 	      {
1265 		__glibcxx_requires_string(__s);
1266 		const size_type __n = traits_type::length(__s);
1267 		_M_check_length(size_type(0), __n, "basic_string::append");
1268 		return _M_append(__s, __n);
1269 	      }
1270 	
1271 	      /**
1272 	       *  @brief  Append multiple characters.
1273 	       *  @param __n  The number of characters to append.
1274 	       *  @param __c  The character to use.
1275 	       *  @return  Reference to this string.
1276 	       *
1277 	       *  Appends __n copies of __c to this string.
1278 	       */
1279 	      basic_string&
1280 	      append(size_type __n, _CharT __c)
1281 	      { return _M_replace_aux(this->size(), size_type(0), __n, __c); }
1282 	
1283 	#if __cplusplus >= 201103L
1284 	      /**
1285 	       *  @brief  Append an initializer_list of characters.
1286 	       *  @param __l  The initializer_list of characters to append.
1287 	       *  @return  Reference to this string.
1288 	       */
1289 	      basic_string&
1290 	      append(initializer_list<_CharT> __l)
1291 	      { return this->append(__l.begin(), __l.size()); }
1292 	#endif // C++11
1293 	
1294 	      /**
1295 	       *  @brief  Append a range of characters.
1296 	       *  @param __first  Iterator referencing the first character to append.
1297 	       *  @param __last  Iterator marking the end of the range.
1298 	       *  @return  Reference to this string.
1299 	       *
1300 	       *  Appends characters in the range [__first,__last) to this string.
1301 	       */
1302 	#if __cplusplus >= 201103L
1303 	      template<class _InputIterator,
1304 		       typename = std::_RequireInputIter<_InputIterator>>
1305 	#else
1306 	      template<class _InputIterator>
1307 	#endif
1308 	        basic_string&
1309 	        append(_InputIterator __first, _InputIterator __last)
1310 	        { return this->replace(end(), end(), __first, __last); }
1311 	
1312 	#if __cplusplus >= 201703L
1313 	      /**
1314 	       *  @brief  Append a string_view.
1315 	       *  @param __svt  An object convertible to string_view to be appended.
1316 	       *  @return  Reference to this string.
1317 	       */
1318 	      template<typename _Tp>
1319 	        _If_sv<_Tp, basic_string&>
1320 	        append(const _Tp& __svt)
1321 	        {
1322 	          __sv_type __sv = __svt;
1323 	          return this->append(__sv.data(), __sv.size());
1324 	        }
1325 	
1326 	      /**
1327 	       *  @brief  Append a range of characters from a string_view.
1328 	       *  @param __svt  An object convertible to string_view to be appended from.
1329 	       *  @param __pos The position in the string_view to append from.
1330 	       *  @param __n   The number of characters to append from the string_view.
1331 	       *  @return  Reference to this string.
1332 	       */
1333 	      template<typename _Tp>
1334 	        _If_sv<_Tp, basic_string&>
1335 		append(const _Tp& __svt, size_type __pos, size_type __n = npos)
1336 		{
1337 		  __sv_type __sv = __svt;
1338 		  return _M_append(__sv.data()
1339 		      + std::__sv_check(__sv.size(), __pos, "basic_string::append"),
1340 		      std::__sv_limit(__sv.size(), __pos, __n));
1341 		}
1342 	#endif // C++17
1343 	
1344 	      /**
1345 	       *  @brief  Append a single character.
1346 	       *  @param __c  Character to append.
1347 	       */
1348 	      void
1349 	      push_back(_CharT __c)
1350 	      {
1351 		const size_type __size = this->size();
1352 		if (__size + 1 > this->capacity())
1353 		  this->_M_mutate(__size, size_type(0), 0, size_type(1));
1354 		traits_type::assign(this->_M_data()[__size], __c);
1355 		this->_M_set_length(__size + 1);
1356 	      }
1357 	
1358 	      /**
1359 	       *  @brief  Set value to contents of another string.
1360 	       *  @param  __str  Source string to use.
1361 	       *  @return  Reference to this string.
1362 	       */
1363 	      basic_string&
1364 	      assign(const basic_string& __str)
1365 	      {
1366 		this->_M_assign(__str);
1367 		return *this;
1368 	      }
1369 	
1370 	#if __cplusplus >= 201103L
1371 	      /**
1372 	       *  @brief  Set value to contents of another string.
1373 	       *  @param  __str  Source string to use.
1374 	       *  @return  Reference to this string.
1375 	       *
1376 	       *  This function sets this string to the exact contents of @a __str.
1377 	       *  @a __str is a valid, but unspecified string.
1378 	       */
1379 	      basic_string&
1380 	      assign(basic_string&& __str)
1381 	      noexcept(_Alloc_traits::_S_nothrow_move())
1382 	      {
1383 		// _GLIBCXX_RESOLVE_LIB_DEFECTS
1384 		// 2063. Contradictory requirements for string move assignment
1385 		return *this = std::move(__str);
1386 	      }
1387 	#endif // C++11
1388 	
1389 	      /**
1390 	       *  @brief  Set value to a substring of a string.
1391 	       *  @param __str  The string to use.
1392 	       *  @param __pos  Index of the first character of str.
1393 	       *  @param __n  Number of characters to use.
1394 	       *  @return  Reference to this string.
1395 	       *  @throw  std::out_of_range if @a pos is not a valid index.
1396 	       *
1397 	       *  This function sets this string to the substring of @a __str
1398 	       *  consisting of @a __n characters at @a __pos.  If @a __n is
1399 	       *  is larger than the number of available characters in @a
1400 	       *  __str, the remainder of @a __str is used.
1401 	       */
1402 	      basic_string&
1403 	      assign(const basic_string& __str, size_type __pos, size_type __n = npos)
1404 	      { return _M_replace(size_type(0), this->size(), __str._M_data()
1405 				  + __str._M_check(__pos, "basic_string::assign"),
1406 				  __str._M_limit(__pos, __n)); }
1407 	
1408 	      /**
1409 	       *  @brief  Set value to a C substring.
1410 	       *  @param __s  The C string to use.
1411 	       *  @param __n  Number of characters to use.
1412 	       *  @return  Reference to this string.
1413 	       *
1414 	       *  This function sets the value of this string to the first @a __n
1415 	       *  characters of @a __s.  If @a __n is is larger than the number of
1416 	       *  available characters in @a __s, the remainder of @a __s is used.
1417 	       */
1418 	      basic_string&
1419 	      assign(const _CharT* __s, size_type __n)
1420 	      {
1421 		__glibcxx_requires_string_len(__s, __n);
1422 		return _M_replace(size_type(0), this->size(), __s, __n);
1423 	      }
1424 	
1425 	      /**
1426 	       *  @brief  Set value to contents of a C string.
1427 	       *  @param __s  The C string to use.
1428 	       *  @return  Reference to this string.
1429 	       *
1430 	       *  This function sets the value of this string to the value of @a __s.
1431 	       *  The data is copied, so there is no dependence on @a __s once the
1432 	       *  function returns.
1433 	       */
1434 	      basic_string&
1435 	      assign(const _CharT* __s)
1436 	      {
1437 		__glibcxx_requires_string(__s);
1438 		return _M_replace(size_type(0), this->size(), __s,
1439 				  traits_type::length(__s));
1440 	      }
1441 	
1442 	      /**
1443 	       *  @brief  Set value to multiple characters.
1444 	       *  @param __n  Length of the resulting string.
1445 	       *  @param __c  The character to use.
1446 	       *  @return  Reference to this string.
1447 	       *
1448 	       *  This function sets the value of this string to @a __n copies of
1449 	       *  character @a __c.
1450 	       */
1451 	      basic_string&
1452 	      assign(size_type __n, _CharT __c)
1453 	      { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
1454 	
1455 	      /**
1456 	       *  @brief  Set value to a range of characters.
1457 	       *  @param __first  Iterator referencing the first character to append.
1458 	       *  @param __last  Iterator marking the end of the range.
1459 	       *  @return  Reference to this string.
1460 	       *
1461 	       *  Sets value of string to characters in the range [__first,__last).
1462 	      */
1463 	#if __cplusplus >= 201103L
1464 	      template<class _InputIterator,
1465 		       typename = std::_RequireInputIter<_InputIterator>>
1466 	#else
1467 	      template<class _InputIterator>
1468 	#endif
1469 	        basic_string&
1470 	        assign(_InputIterator __first, _InputIterator __last)
1471 	        { return this->replace(begin(), end(), __first, __last); }
1472 	
1473 	#if __cplusplus >= 201103L
1474 	      /**
1475 	       *  @brief  Set value to an initializer_list of characters.
1476 	       *  @param __l  The initializer_list of characters to assign.
1477 	       *  @return  Reference to this string.
1478 	       */
1479 	      basic_string&
1480 	      assign(initializer_list<_CharT> __l)
1481 	      { return this->assign(__l.begin(), __l.size()); }
1482 	#endif // C++11
1483 	
1484 	#if __cplusplus >= 201703L
1485 	      /**
1486 	       *  @brief  Set value from a string_view.
1487 	       *  @param __svt  The source object convertible to string_view.
1488 	       *  @return  Reference to this string.
1489 	       */
1490 	      template<typename _Tp>
1491 		_If_sv<_Tp, basic_string&>
1492 		assign(const _Tp& __svt)
1493 		{
1494 		  __sv_type __sv = __svt;
1495 		  return this->assign(__sv.data(), __sv.size());
1496 		}
1497 	
1498 	      /**
1499 	       *  @brief  Set value from a range of characters in a string_view.
1500 	       *  @param __svt  The source object convertible to string_view.
1501 	       *  @param __pos  The position in the string_view to assign from.
1502 	       *  @param __n  The number of characters to assign.
1503 	       *  @return  Reference to this string.
1504 	       */
1505 	      template<typename _Tp>
1506 		_If_sv<_Tp, basic_string&>
1507 		assign(const _Tp& __svt, size_type __pos, size_type __n = npos)
1508 		{
1509 		  __sv_type __sv = __svt;
1510 		  return _M_replace(size_type(0), this->size(),
1511 		      __sv.data()
1512 		      + std::__sv_check(__sv.size(), __pos, "basic_string::assign"),
1513 		      std::__sv_limit(__sv.size(), __pos, __n));
1514 		}
1515 	#endif // C++17
1516 	
1517 	#if __cplusplus >= 201103L
1518 	      /**
1519 	       *  @brief  Insert multiple characters.
1520 	       *  @param __p  Const_iterator referencing location in string to
1521 	       *              insert at.
1522 	       *  @param __n  Number of characters to insert
1523 	       *  @param __c  The character to insert.
1524 	       *  @return  Iterator referencing the first inserted char.
1525 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1526 	       *
1527 	       *  Inserts @a __n copies of character @a __c starting at the
1528 	       *  position referenced by iterator @a __p.  If adding
1529 	       *  characters causes the length to exceed max_size(),
1530 	       *  length_error is thrown.  The value of the string doesn't
1531 	       *  change if an error is thrown.
1532 	      */
1533 	      iterator
1534 	      insert(const_iterator __p, size_type __n, _CharT __c)
1535 	      {
1536 		_GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
1537 		const size_type __pos = __p - begin();
1538 		this->replace(__p, __p, __n, __c);
1539 		return iterator(this->_M_data() + __pos);
1540 	      }
1541 	#else
1542 	      /**
1543 	       *  @brief  Insert multiple characters.
1544 	       *  @param __p  Iterator referencing location in string to insert at.
1545 	       *  @param __n  Number of characters to insert
1546 	       *  @param __c  The character to insert.
1547 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1548 	       *
1549 	       *  Inserts @a __n copies of character @a __c starting at the
1550 	       *  position referenced by iterator @a __p.  If adding
1551 	       *  characters causes the length to exceed max_size(),
1552 	       *  length_error is thrown.  The value of the string doesn't
1553 	       *  change if an error is thrown.
1554 	      */
1555 	      void
1556 	      insert(iterator __p, size_type __n, _CharT __c)
1557 	      {	this->replace(__p, __p, __n, __c);  }
1558 	#endif
1559 	
1560 	#if __cplusplus >= 201103L
1561 	      /**
1562 	       *  @brief  Insert a range of characters.
1563 	       *  @param __p  Const_iterator referencing location in string to
1564 	       *              insert at.
1565 	       *  @param __beg  Start of range.
1566 	       *  @param __end  End of range.
1567 	       *  @return  Iterator referencing the first inserted char.
1568 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1569 	       *
1570 	       *  Inserts characters in range [beg,end).  If adding characters
1571 	       *  causes the length to exceed max_size(), length_error is
1572 	       *  thrown.  The value of the string doesn't change if an error
1573 	       *  is thrown.
1574 	      */
1575 	      template<class _InputIterator,
1576 		       typename = std::_RequireInputIter<_InputIterator>>
1577 		iterator
1578 	        insert(const_iterator __p, _InputIterator __beg, _InputIterator __end)
1579 	        {
1580 		  _GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
1581 		  const size_type __pos = __p - begin();
1582 		  this->replace(__p, __p, __beg, __end);
1583 		  return iterator(this->_M_data() + __pos);
1584 		}
1585 	#else
1586 	      /**
1587 	       *  @brief  Insert a range of characters.
1588 	       *  @param __p  Iterator referencing location in string to insert at.
1589 	       *  @param __beg  Start of range.
1590 	       *  @param __end  End of range.
1591 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1592 	       *
1593 	       *  Inserts characters in range [__beg,__end).  If adding
1594 	       *  characters causes the length to exceed max_size(),
1595 	       *  length_error is thrown.  The value of the string doesn't
1596 	       *  change if an error is thrown.
1597 	      */
1598 	      template<class _InputIterator>
1599 	        void
1600 	        insert(iterator __p, _InputIterator __beg, _InputIterator __end)
1601 	        { this->replace(__p, __p, __beg, __end); }
1602 	#endif
1603 	
1604 	#if __cplusplus >= 201103L
1605 	      /**
1606 	       *  @brief  Insert an initializer_list of characters.
1607 	       *  @param __p  Iterator referencing location in string to insert at.
1608 	       *  @param __l  The initializer_list of characters to insert.
1609 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1610 	       */
1611 	      iterator
1612 	      insert(const_iterator __p, initializer_list<_CharT> __l)
1613 	      { return this->insert(__p, __l.begin(), __l.end()); }
1614 	
1615 	#ifdef _GLIBCXX_DEFINING_STRING_INSTANTIATIONS
1616 	      // See PR libstdc++/83328
1617 	      void
1618 	      insert(iterator __p, initializer_list<_CharT> __l)
1619 	      {
1620 		_GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
1621 		this->insert(__p - begin(), __l.begin(), __l.size());
1622 	      }
1623 	#endif
1624 	#endif // C++11
1625 	
1626 	      /**
1627 	       *  @brief  Insert value of a string.
1628 	       *  @param __pos1  Iterator referencing location in string to insert at.
1629 	       *  @param __str  The string to insert.
1630 	       *  @return  Reference to this string.
1631 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1632 	       *
1633 	       *  Inserts value of @a __str starting at @a __pos1.  If adding
1634 	       *  characters causes the length to exceed max_size(),
1635 	       *  length_error is thrown.  The value of the string doesn't
1636 	       *  change if an error is thrown.
1637 	      */
1638 	      basic_string&
1639 	      insert(size_type __pos1, const basic_string& __str)
1640 	      { return this->replace(__pos1, size_type(0),
1641 				     __str._M_data(), __str.size()); }
1642 	
1643 	      /**
1644 	       *  @brief  Insert a substring.
1645 	       *  @param __pos1  Iterator referencing location in string to insert at.
1646 	       *  @param __str  The string to insert.
1647 	       *  @param __pos2  Start of characters in str to insert.
1648 	       *  @param __n  Number of characters to insert.
1649 	       *  @return  Reference to this string.
1650 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1651 	       *  @throw  std::out_of_range  If @a pos1 > size() or
1652 	       *  @a __pos2 > @a str.size().
1653 	       *
1654 	       *  Starting at @a pos1, insert @a __n character of @a __str
1655 	       *  beginning with @a __pos2.  If adding characters causes the
1656 	       *  length to exceed max_size(), length_error is thrown.  If @a
1657 	       *  __pos1 is beyond the end of this string or @a __pos2 is
1658 	       *  beyond the end of @a __str, out_of_range is thrown.  The
1659 	       *  value of the string doesn't change if an error is thrown.
1660 	      */
1661 	      basic_string&
1662 	      insert(size_type __pos1, const basic_string& __str,
1663 		     size_type __pos2, size_type __n = npos)
1664 	      { return this->replace(__pos1, size_type(0), __str._M_data()
1665 				     + __str._M_check(__pos2, "basic_string::insert"),
1666 				     __str._M_limit(__pos2, __n)); }
1667 	
1668 	      /**
1669 	       *  @brief  Insert a C substring.
1670 	       *  @param __pos  Iterator referencing location in string to insert at.
1671 	       *  @param __s  The C string to insert.
1672 	       *  @param __n  The number of characters to insert.
1673 	       *  @return  Reference to this string.
1674 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1675 	       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1676 	       *  string.
1677 	       *
1678 	       *  Inserts the first @a __n characters of @a __s starting at @a
1679 	       *  __pos.  If adding characters causes the length to exceed
1680 	       *  max_size(), length_error is thrown.  If @a __pos is beyond
1681 	       *  end(), out_of_range is thrown.  The value of the string
1682 	       *  doesn't change if an error is thrown.
1683 	      */
1684 	      basic_string&
1685 	      insert(size_type __pos, const _CharT* __s, size_type __n)
1686 	      { return this->replace(__pos, size_type(0), __s, __n); }
1687 	
1688 	      /**
1689 	       *  @brief  Insert a C string.
1690 	       *  @param __pos  Iterator referencing location in string to insert at.
1691 	       *  @param __s  The C string to insert.
1692 	       *  @return  Reference to this string.
1693 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1694 	       *  @throw  std::out_of_range  If @a pos is beyond the end of this
1695 	       *  string.
1696 	       *
1697 	       *  Inserts the first @a n characters of @a __s starting at @a __pos.  If
1698 	       *  adding characters causes the length to exceed max_size(),
1699 	       *  length_error is thrown.  If @a __pos is beyond end(), out_of_range is
1700 	       *  thrown.  The value of the string doesn't change if an error is
1701 	       *  thrown.
1702 	      */
1703 	      basic_string&
1704 	      insert(size_type __pos, const _CharT* __s)
1705 	      {
1706 		__glibcxx_requires_string(__s);
1707 		return this->replace(__pos, size_type(0), __s,
1708 				     traits_type::length(__s));
1709 	      }
1710 	
1711 	      /**
1712 	       *  @brief  Insert multiple characters.
1713 	       *  @param __pos  Index in string to insert at.
1714 	       *  @param __n  Number of characters to insert
1715 	       *  @param __c  The character to insert.
1716 	       *  @return  Reference to this string.
1717 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1718 	       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1719 	       *  string.
1720 	       *
1721 	       *  Inserts @a __n copies of character @a __c starting at index
1722 	       *  @a __pos.  If adding characters causes the length to exceed
1723 	       *  max_size(), length_error is thrown.  If @a __pos > length(),
1724 	       *  out_of_range is thrown.  The value of the string doesn't
1725 	       *  change if an error is thrown.
1726 	      */
1727 	      basic_string&
1728 	      insert(size_type __pos, size_type __n, _CharT __c)
1729 	      { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
1730 				      size_type(0), __n, __c); }
1731 	
1732 	      /**
1733 	       *  @brief  Insert one character.
1734 	       *  @param __p  Iterator referencing position in string to insert at.
1735 	       *  @param __c  The character to insert.
1736 	       *  @return  Iterator referencing newly inserted char.
1737 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1738 	       *
1739 	       *  Inserts character @a __c at position referenced by @a __p.
1740 	       *  If adding character causes the length to exceed max_size(),
1741 	       *  length_error is thrown.  If @a __p is beyond end of string,
1742 	       *  out_of_range is thrown.  The value of the string doesn't
1743 	       *  change if an error is thrown.
1744 	      */
1745 	      iterator
1746 	      insert(__const_iterator __p, _CharT __c)
1747 	      {
1748 		_GLIBCXX_DEBUG_PEDASSERT(__p >= begin() && __p <= end());
1749 		const size_type __pos = __p - begin();
1750 		_M_replace_aux(__pos, size_type(0), size_type(1), __c);
1751 		return iterator(_M_data() + __pos);
1752 	      }
1753 	
1754 	#if __cplusplus >= 201703L
1755 	      /**
1756 	       *  @brief  Insert a string_view.
1757 	       *  @param __pos  Iterator referencing position in string to insert at.
1758 	       *  @param __svt  The object convertible to string_view to insert.
1759 	       *  @return  Reference to this string.
1760 	      */
1761 	      template<typename _Tp>
1762 		_If_sv<_Tp, basic_string&>
1763 		insert(size_type __pos, const _Tp& __svt)
1764 		{
1765 		  __sv_type __sv = __svt;
1766 		  return this->insert(__pos, __sv.data(), __sv.size());
1767 		}
1768 	
1769 	      /**
1770 	       *  @brief  Insert a string_view.
1771 	       *  @param __pos  Iterator referencing position in string to insert at.
1772 	       *  @param __svt  The object convertible to string_view to insert from.
1773 	       *  @param __pos  Iterator referencing position in string_view to insert
1774 	       *  from.
1775 	       *  @param __n    The number of characters to insert.
1776 	       *  @return  Reference to this string.
1777 	      */
1778 	      template<typename _Tp>
1779 		_If_sv<_Tp, basic_string&>
1780 		insert(size_type __pos1, const _Tp& __svt,
1781 		       size_type __pos2, size_type __n = npos)
1782 		{
1783 		  __sv_type __sv = __svt;
1784 		  return this->replace(__pos1, size_type(0),
1785 		      __sv.data()
1786 		      + std::__sv_check(__sv.size(), __pos2, "basic_string::insert"),
1787 		      std::__sv_limit(__sv.size(), __pos2, __n));
1788 		}
1789 	#endif // C++17
1790 	
1791 	      /**
1792 	       *  @brief  Remove characters.
1793 	       *  @param __pos  Index of first character to remove (default 0).
1794 	       *  @param __n  Number of characters to remove (default remainder).
1795 	       *  @return  Reference to this string.
1796 	       *  @throw  std::out_of_range  If @a pos is beyond the end of this
1797 	       *  string.
1798 	       *
1799 	       *  Removes @a __n characters from this string starting at @a
1800 	       *  __pos.  The length of the string is reduced by @a __n.  If
1801 	       *  there are < @a __n characters to remove, the remainder of
1802 	       *  the string is truncated.  If @a __p is beyond end of string,
1803 	       *  out_of_range is thrown.  The value of the string doesn't
1804 	       *  change if an error is thrown.
1805 	      */
1806 	      basic_string&
1807 	      erase(size_type __pos = 0, size_type __n = npos)
1808 	      {
1809 		_M_check(__pos, "basic_string::erase");
1810 		if (__n == npos)
1811 		  this->_M_set_length(__pos);
1812 		else if (__n != 0)
1813 		  this->_M_erase(__pos, _M_limit(__pos, __n));
1814 		return *this;
1815 	      }
1816 	
1817 	      /**
1818 	       *  @brief  Remove one character.
1819 	       *  @param __position  Iterator referencing the character to remove.
1820 	       *  @return  iterator referencing same location after removal.
1821 	       *
1822 	       *  Removes the character at @a __position from this string. The value
1823 	       *  of the string doesn't change if an error is thrown.
1824 	      */
1825 	      iterator
1826 	      erase(__const_iterator __position)
1827 	      {
1828 		_GLIBCXX_DEBUG_PEDASSERT(__position >= begin()
1829 					 && __position < end());
1830 		const size_type __pos = __position - begin();
1831 		this->_M_erase(__pos, size_type(1));
1832 		return iterator(_M_data() + __pos);
1833 	      }
1834 	
1835 	      /**
1836 	       *  @brief  Remove a range of characters.
1837 	       *  @param __first  Iterator referencing the first character to remove.
1838 	       *  @param __last  Iterator referencing the end of the range.
1839 	       *  @return  Iterator referencing location of first after removal.
1840 	       *
1841 	       *  Removes the characters in the range [first,last) from this string.
1842 	       *  The value of the string doesn't change if an error is thrown.
1843 	      */
1844 	      iterator
1845 	      erase(__const_iterator __first, __const_iterator __last)
1846 	      {
1847 		_GLIBCXX_DEBUG_PEDASSERT(__first >= begin() && __first <= __last
1848 					 && __last <= end());
1849 	        const size_type __pos = __first - begin();
1850 		if (__last == end())
1851 		  this->_M_set_length(__pos);
1852 		else
1853 		  this->_M_erase(__pos, __last - __first);
1854 		return iterator(this->_M_data() + __pos);
1855 	      }
1856 	
1857 	#if __cplusplus >= 201103L
1858 	      /**
1859 	       *  @brief  Remove the last character.
1860 	       *
1861 	       *  The string must be non-empty.
1862 	       */
1863 	      void
1864 	      pop_back() noexcept
1865 	      {
1866 		__glibcxx_assert(!empty());
1867 		_M_erase(size() - 1, 1);
1868 	      }
1869 	#endif // C++11
1870 	
1871 	      /**
1872 	       *  @brief  Replace characters with value from another string.
1873 	       *  @param __pos  Index of first character to replace.
1874 	       *  @param __n  Number of characters to be replaced.
1875 	       *  @param __str  String to insert.
1876 	       *  @return  Reference to this string.
1877 	       *  @throw  std::out_of_range  If @a pos is beyond the end of this
1878 	       *  string.
1879 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1880 	       *
1881 	       *  Removes the characters in the range [__pos,__pos+__n) from
1882 	       *  this string.  In place, the value of @a __str is inserted.
1883 	       *  If @a __pos is beyond end of string, out_of_range is thrown.
1884 	       *  If the length of the result exceeds max_size(), length_error
1885 	       *  is thrown.  The value of the string doesn't change if an
1886 	       *  error is thrown.
1887 	      */
1888 	      basic_string&
1889 	      replace(size_type __pos, size_type __n, const basic_string& __str)
1890 	      { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
1891 	
1892 	      /**
1893 	       *  @brief  Replace characters with value from another string.
1894 	       *  @param __pos1  Index of first character to replace.
1895 	       *  @param __n1  Number of characters to be replaced.
1896 	       *  @param __str  String to insert.
1897 	       *  @param __pos2  Index of first character of str to use.
1898 	       *  @param __n2  Number of characters from str to use.
1899 	       *  @return  Reference to this string.
1900 	       *  @throw  std::out_of_range  If @a __pos1 > size() or @a __pos2 >
1901 	       *  __str.size().
1902 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1903 	       *
1904 	       *  Removes the characters in the range [__pos1,__pos1 + n) from this
1905 	       *  string.  In place, the value of @a __str is inserted.  If @a __pos is
1906 	       *  beyond end of string, out_of_range is thrown.  If the length of the
1907 	       *  result exceeds max_size(), length_error is thrown.  The value of the
1908 	       *  string doesn't change if an error is thrown.
1909 	      */
1910 	      basic_string&
1911 	      replace(size_type __pos1, size_type __n1, const basic_string& __str,
1912 		      size_type __pos2, size_type __n2 = npos)
1913 	      { return this->replace(__pos1, __n1, __str._M_data()
1914 				     + __str._M_check(__pos2, "basic_string::replace"),
1915 				     __str._M_limit(__pos2, __n2)); }
1916 	
1917 	      /**
1918 	       *  @brief  Replace characters with value of a C substring.
1919 	       *  @param __pos  Index of first character to replace.
1920 	       *  @param __n1  Number of characters to be replaced.
1921 	       *  @param __s  C string to insert.
1922 	       *  @param __n2  Number of characters from @a s to use.
1923 	       *  @return  Reference to this string.
1924 	       *  @throw  std::out_of_range  If @a pos1 > size().
1925 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1926 	       *
1927 	       *  Removes the characters in the range [__pos,__pos + __n1)
1928 	       *  from this string.  In place, the first @a __n2 characters of
1929 	       *  @a __s are inserted, or all of @a __s if @a __n2 is too large.  If
1930 	       *  @a __pos is beyond end of string, out_of_range is thrown.  If
1931 	       *  the length of result exceeds max_size(), length_error is
1932 	       *  thrown.  The value of the string doesn't change if an error
1933 	       *  is thrown.
1934 	      */
1935 	      basic_string&
1936 	      replace(size_type __pos, size_type __n1, const _CharT* __s,
1937 		      size_type __n2)
1938 	      {
1939 		__glibcxx_requires_string_len(__s, __n2);
1940 		return _M_replace(_M_check(__pos, "basic_string::replace"),
1941 				  _M_limit(__pos, __n1), __s, __n2);
1942 	      }
1943 	
1944 	      /**
1945 	       *  @brief  Replace characters with value of a C string.
1946 	       *  @param __pos  Index of first character to replace.
1947 	       *  @param __n1  Number of characters to be replaced.
1948 	       *  @param __s  C string to insert.
1949 	       *  @return  Reference to this string.
1950 	       *  @throw  std::out_of_range  If @a pos > size().
1951 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1952 	       *
1953 	       *  Removes the characters in the range [__pos,__pos + __n1)
1954 	       *  from this string.  In place, the characters of @a __s are
1955 	       *  inserted.  If @a __pos is beyond end of string, out_of_range
1956 	       *  is thrown.  If the length of result exceeds max_size(),
1957 	       *  length_error is thrown.  The value of the string doesn't
1958 	       *  change if an error is thrown.
1959 	      */
1960 	      basic_string&
1961 	      replace(size_type __pos, size_type __n1, const _CharT* __s)
1962 	      {
1963 		__glibcxx_requires_string(__s);
1964 		return this->replace(__pos, __n1, __s, traits_type::length(__s));
1965 	      }
1966 	
1967 	      /**
1968 	       *  @brief  Replace characters with multiple characters.
1969 	       *  @param __pos  Index of first character to replace.
1970 	       *  @param __n1  Number of characters to be replaced.
1971 	       *  @param __n2  Number of characters to insert.
1972 	       *  @param __c  Character to insert.
1973 	       *  @return  Reference to this string.
1974 	       *  @throw  std::out_of_range  If @a __pos > size().
1975 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1976 	       *
1977 	       *  Removes the characters in the range [pos,pos + n1) from this
1978 	       *  string.  In place, @a __n2 copies of @a __c are inserted.
1979 	       *  If @a __pos is beyond end of string, out_of_range is thrown.
1980 	       *  If the length of result exceeds max_size(), length_error is
1981 	       *  thrown.  The value of the string doesn't change if an error
1982 	       *  is thrown.
1983 	      */
1984 	      basic_string&
1985 	      replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
1986 	      { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
1987 				      _M_limit(__pos, __n1), __n2, __c); }
1988 	
1989 	      /**
1990 	       *  @brief  Replace range of characters with string.
1991 	       *  @param __i1  Iterator referencing start of range to replace.
1992 	       *  @param __i2  Iterator referencing end of range to replace.
1993 	       *  @param __str  String value to insert.
1994 	       *  @return  Reference to this string.
1995 	       *  @throw  std::length_error  If new length exceeds @c max_size().
1996 	       *
1997 	       *  Removes the characters in the range [__i1,__i2).  In place,
1998 	       *  the value of @a __str is inserted.  If the length of result
1999 	       *  exceeds max_size(), length_error is thrown.  The value of
2000 	       *  the string doesn't change if an error is thrown.
2001 	      */
2002 	      basic_string&
2003 	      replace(__const_iterator __i1, __const_iterator __i2,
2004 		      const basic_string& __str)
2005 	      { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
2006 	
2007 	      /**
2008 	       *  @brief  Replace range of characters with C substring.
2009 	       *  @param __i1  Iterator referencing start of range to replace.
2010 	       *  @param __i2  Iterator referencing end of range to replace.
2011 	       *  @param __s  C string value to insert.
2012 	       *  @param __n  Number of characters from s to insert.
2013 	       *  @return  Reference to this string.
2014 	       *  @throw  std::length_error  If new length exceeds @c max_size().
2015 	       *
2016 	       *  Removes the characters in the range [__i1,__i2).  In place,
2017 	       *  the first @a __n characters of @a __s are inserted.  If the
2018 	       *  length of result exceeds max_size(), length_error is thrown.
2019 	       *  The value of the string doesn't change if an error is
2020 	       *  thrown.
2021 	      */
2022 	      basic_string&
2023 	      replace(__const_iterator __i1, __const_iterator __i2,
2024 		      const _CharT* __s, size_type __n)
2025 	      {
2026 		_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
2027 					 && __i2 <= end());
2028 		return this->replace(__i1 - begin(), __i2 - __i1, __s, __n);
2029 	      }
2030 	
2031 	      /**
2032 	       *  @brief  Replace range of characters with C string.
2033 	       *  @param __i1  Iterator referencing start of range to replace.
2034 	       *  @param __i2  Iterator referencing end of range to replace.
2035 	       *  @param __s  C string value to insert.
2036 	       *  @return  Reference to this string.
2037 	       *  @throw  std::length_error  If new length exceeds @c max_size().
2038 	       *
2039 	       *  Removes the characters in the range [__i1,__i2).  In place,
2040 	       *  the characters of @a __s are inserted.  If the length of
2041 	       *  result exceeds max_size(), length_error is thrown.  The
2042 	       *  value of the string doesn't change if an error is thrown.
2043 	      */
2044 	      basic_string&
2045 	      replace(__const_iterator __i1, __const_iterator __i2, const _CharT* __s)
2046 	      {
2047 		__glibcxx_requires_string(__s);
2048 		return this->replace(__i1, __i2, __s, traits_type::length(__s));
2049 	      }
2050 	
2051 	      /**
2052 	       *  @brief  Replace range of characters with multiple characters
2053 	       *  @param __i1  Iterator referencing start of range to replace.
2054 	       *  @param __i2  Iterator referencing end of range to replace.
2055 	       *  @param __n  Number of characters to insert.
2056 	       *  @param __c  Character to insert.
2057 	       *  @return  Reference to this string.
2058 	       *  @throw  std::length_error  If new length exceeds @c max_size().
2059 	       *
2060 	       *  Removes the characters in the range [__i1,__i2).  In place,
2061 	       *  @a __n copies of @a __c are inserted.  If the length of
2062 	       *  result exceeds max_size(), length_error is thrown.  The
2063 	       *  value of the string doesn't change if an error is thrown.
2064 	      */
2065 	      basic_string&
2066 	      replace(__const_iterator __i1, __const_iterator __i2, size_type __n,
2067 		      _CharT __c)
2068 	      {
2069 		_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
2070 					 && __i2 <= end());
2071 		return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __c);
2072 	      }
2073 	
2074 	      /**
2075 	       *  @brief  Replace range of characters with range.
2076 	       *  @param __i1  Iterator referencing start of range to replace.
2077 	       *  @param __i2  Iterator referencing end of range to replace.
2078 	       *  @param __k1  Iterator referencing start of range to insert.
2079 	       *  @param __k2  Iterator referencing end of range to insert.
2080 	       *  @return  Reference to this string.
2081 	       *  @throw  std::length_error  If new length exceeds @c max_size().
2082 	       *
2083 	       *  Removes the characters in the range [__i1,__i2).  In place,
2084 	       *  characters in the range [__k1,__k2) are inserted.  If the
2085 	       *  length of result exceeds max_size(), length_error is thrown.
2086 	       *  The value of the string doesn't change if an error is
2087 	       *  thrown.
2088 	      */
2089 	#if __cplusplus >= 201103L
2090 	      template<class _InputIterator,
2091 		       typename = std::_RequireInputIter<_InputIterator>>
2092 	        basic_string&
2093 	        replace(const_iterator __i1, const_iterator __i2,
2094 			_InputIterator __k1, _InputIterator __k2)
2095 	        {
2096 		  _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
2097 					   && __i2 <= end());
2098 		  __glibcxx_requires_valid_range(__k1, __k2);
2099 		  return this->_M_replace_dispatch(__i1, __i2, __k1, __k2,
2100 						   std::__false_type());
2101 		}
2102 	#else
2103 	      template<class _InputIterator>
2104 	#ifdef _GLIBCXX_DISAMBIGUATE_REPLACE_INST
2105 	        typename __enable_if_not_native_iterator<_InputIterator>::__type
2106 	#else
2107 	        basic_string&
2108 	#endif
2109 	        replace(iterator __i1, iterator __i2,
2110 			_InputIterator __k1, _InputIterator __k2)
2111 	        {
2112 		  _GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
2113 					   && __i2 <= end());
2114 		  __glibcxx_requires_valid_range(__k1, __k2);
2115 		  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
2116 		  return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
2117 		}
2118 	#endif
2119 	
2120 	      // Specializations for the common case of pointer and iterator:
2121 	      // useful to avoid the overhead of temporary buffering in _M_replace.
2122 	      basic_string&
2123 	      replace(__const_iterator __i1, __const_iterator __i2,
2124 		      _CharT* __k1, _CharT* __k2)
2125 	      {
2126 		_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
2127 					 && __i2 <= end());
2128 		__glibcxx_requires_valid_range(__k1, __k2);
2129 		return this->replace(__i1 - begin(), __i2 - __i1,
2130 				     __k1, __k2 - __k1);
2131 	      }
2132 	
2133 	      basic_string&
2134 	      replace(__const_iterator __i1, __const_iterator __i2,
2135 		      const _CharT* __k1, const _CharT* __k2)
2136 	      {
2137 		_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
2138 					 && __i2 <= end());
2139 		__glibcxx_requires_valid_range(__k1, __k2);
2140 		return this->replace(__i1 - begin(), __i2 - __i1,
2141 				     __k1, __k2 - __k1);
2142 	      }
2143 	
2144 	      basic_string&
2145 	      replace(__const_iterator __i1, __const_iterator __i2,
2146 		      iterator __k1, iterator __k2)
2147 	      {
2148 		_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
2149 					 && __i2 <= end());
2150 		__glibcxx_requires_valid_range(__k1, __k2);
2151 		return this->replace(__i1 - begin(), __i2 - __i1,
2152 				     __k1.base(), __k2 - __k1);
2153 	      }
2154 	
2155 	      basic_string&
2156 	      replace(__const_iterator __i1, __const_iterator __i2,
2157 		      const_iterator __k1, const_iterator __k2)
2158 	      {
2159 		_GLIBCXX_DEBUG_PEDASSERT(begin() <= __i1 && __i1 <= __i2
2160 					 && __i2 <= end());
2161 		__glibcxx_requires_valid_range(__k1, __k2);
2162 		return this->replace(__i1 - begin(), __i2 - __i1,
2163 				     __k1.base(), __k2 - __k1);
2164 	      }
2165 	
2166 	#if __cplusplus >= 201103L
2167 	      /**
2168 	       *  @brief  Replace range of characters with initializer_list.
2169 	       *  @param __i1  Iterator referencing start of range to replace.
2170 	       *  @param __i2  Iterator referencing end of range to replace.
2171 	       *  @param __l  The initializer_list of characters to insert.
2172 	       *  @return  Reference to this string.
2173 	       *  @throw  std::length_error  If new length exceeds @c max_size().
2174 	       *
2175 	       *  Removes the characters in the range [__i1,__i2).  In place,
2176 	       *  characters in the range [__k1,__k2) are inserted.  If the
2177 	       *  length of result exceeds max_size(), length_error is thrown.
2178 	       *  The value of the string doesn't change if an error is
2179 	       *  thrown.
2180 	      */
2181 	      basic_string& replace(const_iterator __i1, const_iterator __i2,
2182 				    initializer_list<_CharT> __l)
2183 	      { return this->replace(__i1, __i2, __l.begin(), __l.size()); }
2184 	#endif // C++11
2185 	
2186 	#if __cplusplus >= 201703L
2187 	      /**
2188 	       *  @brief  Replace range of characters with string_view.
2189 	       *  @param __pos  The position to replace at.
2190 	       *  @param __n    The number of characters to replace.
2191 	       *  @param __svt  The object convertible to string_view to insert.
2192 	       *  @return  Reference to this string.
2193 	      */
2194 	      template<typename _Tp>
2195 		_If_sv<_Tp, basic_string&>
2196 		replace(size_type __pos, size_type __n, const _Tp& __svt)
2197 		{
2198 		  __sv_type __sv = __svt;
2199 		  return this->replace(__pos, __n, __sv.data(), __sv.size());
2200 		}
2201 	
2202 	      /**
2203 	       *  @brief  Replace range of characters with string_view.
2204 	       *  @param __pos1  The position to replace at.
2205 	       *  @param __n1    The number of characters to replace.
2206 	       *  @param __svt   The object convertible to string_view to insert from.
2207 	       *  @param __pos2  The position in the string_view to insert from.
2208 	       *  @param __n2    The number of characters to insert.
2209 	       *  @return  Reference to this string.
2210 	      */
2211 	      template<typename _Tp>
2212 		_If_sv<_Tp, basic_string&>
2213 		replace(size_type __pos1, size_type __n1, const _Tp& __svt,
2214 			size_type __pos2, size_type __n2 = npos)
2215 		{
2216 		  __sv_type __sv = __svt;
2217 		  return this->replace(__pos1, __n1,
2218 		      __sv.data()
2219 		      + std::__sv_check(__sv.size(), __pos2, "basic_string::replace"),
2220 		      std::__sv_limit(__sv.size(), __pos2, __n2));
2221 		}
2222 	
2223 	      /**
2224 	       *  @brief  Replace range of characters with string_view.
2225 	       *  @param __i1    An iterator referencing the start position
2226 	          to replace at.
2227 	       *  @param __i2    An iterator referencing the end position
2228 	          for the replace.
2229 	       *  @param __svt   The object convertible to string_view to insert from.
2230 	       *  @return  Reference to this string.
2231 	      */
2232 	      template<typename _Tp>
2233 		_If_sv<_Tp, basic_string&>
2234 		replace(const_iterator __i1, const_iterator __i2, const _Tp& __svt)
2235 		{
2236 		  __sv_type __sv = __svt;
2237 		  return this->replace(__i1 - begin(), __i2 - __i1, __sv);
2238 		}
2239 	#endif // C++17
2240 	
2241 	    private:
2242 	      template<class _Integer>
2243 		basic_string&
2244 		_M_replace_dispatch(const_iterator __i1, const_iterator __i2,
2245 				    _Integer __n, _Integer __val, __true_type)
2246 	        { return _M_replace_aux(__i1 - begin(), __i2 - __i1, __n, __val); }
2247 	
2248 	      template<class _InputIterator>
2249 		basic_string&
2250 		_M_replace_dispatch(const_iterator __i1, const_iterator __i2,
2251 				    _InputIterator __k1, _InputIterator __k2,
2252 				    __false_type);
2253 	
2254 	      basic_string&
2255 	      _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
2256 			     _CharT __c);
2257 	
2258 	      basic_string&
2259 	      _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
2260 			 const size_type __len2);
2261 	
2262 	      basic_string&
2263 	      _M_append(const _CharT* __s, size_type __n);
2264 	
2265 	    public:
2266 	
2267 	      /**
2268 	       *  @brief  Copy substring into C string.
2269 	       *  @param __s  C string to copy value into.
2270 	       *  @param __n  Number of characters to copy.
2271 	       *  @param __pos  Index of first character to copy.
2272 	       *  @return  Number of characters actually copied
2273 	       *  @throw  std::out_of_range  If __pos > size().
2274 	       *
2275 	       *  Copies up to @a __n characters starting at @a __pos into the
2276 	       *  C string @a __s.  If @a __pos is %greater than size(),
2277 	       *  out_of_range is thrown.
2278 	      */
2279 	      size_type
2280 	      copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
2281 	
2282 	      /**
2283 	       *  @brief  Swap contents with another string.
2284 	       *  @param __s  String to swap with.
2285 	       *
2286 	       *  Exchanges the contents of this string with that of @a __s in constant
2287 	       *  time.
2288 	      */
2289 	      void
2290 	      swap(basic_string& __s) _GLIBCXX_NOEXCEPT;
2291 	
2292 	      // String operations:
2293 	      /**
2294 	       *  @brief  Return const pointer to null-terminated contents.
2295 	       *
2296 	       *  This is a handle to internal data.  Do not modify or dire things may
2297 	       *  happen.
2298 	      */
2299 	      const _CharT*
2300 	      c_str() const _GLIBCXX_NOEXCEPT
2301 	      { return _M_data(); }
2302 	
2303 	      /**
2304 	       *  @brief  Return const pointer to contents.
2305 	       *
2306 	       *  This is a pointer to internal data.  It is undefined to modify
2307 	       *  the contents through the returned pointer. To get a pointer that
2308 	       *  allows modifying the contents use @c &str[0] instead,
2309 	       *  (or in C++17 the non-const @c str.data() overload).
2310 	      */
2311 	      const _CharT*
2312 	      data() const _GLIBCXX_NOEXCEPT
2313 	      { return _M_data(); }
2314 	
2315 	#if __cplusplus >= 201703L
2316 	      /**
2317 	       *  @brief  Return non-const pointer to contents.
2318 	       *
2319 	       *  This is a pointer to the character sequence held by the string.
2320 	       *  Modifying the characters in the sequence is allowed.
2321 	      */
2322 	      _CharT*
2323 	      data() noexcept
2324 	      { return _M_data(); }
2325 	#endif
2326 	
2327 	      /**
2328 	       *  @brief  Return copy of allocator used to construct this string.
2329 	      */
2330 	      allocator_type
2331 	      get_allocator() const _GLIBCXX_NOEXCEPT
2332 	      { return _M_get_allocator(); }
2333 	
2334 	      /**
2335 	       *  @brief  Find position of a C substring.
2336 	       *  @param __s  C string to locate.
2337 	       *  @param __pos  Index of character to search from.
2338 	       *  @param __n  Number of characters from @a s to search for.
2339 	       *  @return  Index of start of first occurrence.
2340 	       *
2341 	       *  Starting from @a __pos, searches forward for the first @a
2342 	       *  __n characters in @a __s within this string.  If found,
2343 	       *  returns the index where it begins.  If not found, returns
2344 	       *  npos.
2345 	      */
2346 	      size_type
2347 	      find(const _CharT* __s, size_type __pos, size_type __n) const
2348 	      _GLIBCXX_NOEXCEPT;
2349 	
2350 	      /**
2351 	       *  @brief  Find position of a string.
2352 	       *  @param __str  String to locate.
2353 	       *  @param __pos  Index of character to search from (default 0).
2354 	       *  @return  Index of start of first occurrence.
2355 	       *
2356 	       *  Starting from @a __pos, searches forward for value of @a __str within
2357 	       *  this string.  If found, returns the index where it begins.  If not
2358 	       *  found, returns npos.
2359 	      */
2360 	      size_type
2361 	      find(const basic_string& __str, size_type __pos = 0) const
2362 	      _GLIBCXX_NOEXCEPT
2363 	      { return this->find(__str.data(), __pos, __str.size()); }
2364 	
2365 	#if __cplusplus >= 201703L
2366 	      /**
2367 	       *  @brief  Find position of a string_view.
2368 	       *  @param __svt  The object convertible to string_view to locate.
2369 	       *  @param __pos  Index of character to search from (default 0).
2370 	       *  @return  Index of start of first occurrence.
2371 	      */
2372 	      template<typename _Tp>
2373 		_If_sv<_Tp, size_type>
2374 		find(const _Tp& __svt, size_type __pos = 0) const
2375 		noexcept(is_same<_Tp, __sv_type>::value)
2376 		{
2377 		  __sv_type __sv = __svt;
2378 		  return this->find(__sv.data(), __pos, __sv.size());
2379 		}
2380 	#endif // C++17
2381 	
2382 	      /**
2383 	       *  @brief  Find position of a C string.
2384 	       *  @param __s  C string to locate.
2385 	       *  @param __pos  Index of character to search from (default 0).
2386 	       *  @return  Index of start of first occurrence.
2387 	       *
2388 	       *  Starting from @a __pos, searches forward for the value of @a
2389 	       *  __s within this string.  If found, returns the index where
2390 	       *  it begins.  If not found, returns npos.
2391 	      */
2392 	      size_type
2393 	      find(const _CharT* __s, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
2394 	      {
2395 		__glibcxx_requires_string(__s);
2396 		return this->find(__s, __pos, traits_type::length(__s));
2397 	      }
2398 	
2399 	      /**
2400 	       *  @brief  Find position of a character.
2401 	       *  @param __c  Character to locate.
2402 	       *  @param __pos  Index of character to search from (default 0).
2403 	       *  @return  Index of first occurrence.
2404 	       *
2405 	       *  Starting from @a __pos, searches forward for @a __c within
2406 	       *  this string.  If found, returns the index where it was
2407 	       *  found.  If not found, returns npos.
2408 	      */
2409 	      size_type
2410 	      find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
2411 	
2412 	      /**
2413 	       *  @brief  Find last position of a string.
2414 	       *  @param __str  String to locate.
2415 	       *  @param __pos  Index of character to search back from (default end).
2416 	       *  @return  Index of start of last occurrence.
2417 	       *
2418 	       *  Starting from @a __pos, searches backward for value of @a
2419 	       *  __str within this string.  If found, returns the index where
2420 	       *  it begins.  If not found, returns npos.
2421 	      */
2422 	      size_type
2423 	      rfind(const basic_string& __str, size_type __pos = npos) const
2424 	      _GLIBCXX_NOEXCEPT
2425 	      { return this->rfind(__str.data(), __pos, __str.size()); }
2426 	
2427 	#if __cplusplus >= 201703L
2428 	      /**
2429 	       *  @brief  Find last position of a string_view.
2430 	       *  @param __svt  The object convertible to string_view to locate.
2431 	       *  @param __pos  Index of character to search back from (default end).
2432 	       *  @return  Index of start of last occurrence.
2433 	      */
2434 	      template<typename _Tp>
2435 		_If_sv<_Tp, size_type>
2436 		rfind(const _Tp& __svt, size_type __pos = npos) const
2437 		noexcept(is_same<_Tp, __sv_type>::value)
2438 		{
2439 		  __sv_type __sv = __svt;
2440 		  return this->rfind(__sv.data(), __pos, __sv.size());
2441 		}
2442 	#endif // C++17
2443 	
2444 	      /**
2445 	       *  @brief  Find last position of a C substring.
2446 	       *  @param __s  C string to locate.
2447 	       *  @param __pos  Index of character to search back from.
2448 	       *  @param __n  Number of characters from s to search for.
2449 	       *  @return  Index of start of last occurrence.
2450 	       *
2451 	       *  Starting from @a __pos, searches backward for the first @a
2452 	       *  __n characters in @a __s within this string.  If found,
2453 	       *  returns the index where it begins.  If not found, returns
2454 	       *  npos.
2455 	      */
2456 	      size_type
2457 	      rfind(const _CharT* __s, size_type __pos, size_type __n) const
2458 	      _GLIBCXX_NOEXCEPT;
2459 	
2460 	      /**
2461 	       *  @brief  Find last position of a C string.
2462 	       *  @param __s  C string to locate.
2463 	       *  @param __pos  Index of character to start search at (default end).
2464 	       *  @return  Index of start of  last occurrence.
2465 	       *
2466 	       *  Starting from @a __pos, searches backward for the value of
2467 	       *  @a __s within this string.  If found, returns the index
2468 	       *  where it begins.  If not found, returns npos.
2469 	      */
2470 	      size_type
2471 	      rfind(const _CharT* __s, size_type __pos = npos) const
2472 	      {
2473 		__glibcxx_requires_string(__s);
2474 		return this->rfind(__s, __pos, traits_type::length(__s));
2475 	      }
2476 	
2477 	      /**
2478 	       *  @brief  Find last position of a character.
2479 	       *  @param __c  Character to locate.
2480 	       *  @param __pos  Index of character to search back from (default end).
2481 	       *  @return  Index of last occurrence.
2482 	       *
2483 	       *  Starting from @a __pos, searches backward for @a __c within
2484 	       *  this string.  If found, returns the index where it was
2485 	       *  found.  If not found, returns npos.
2486 	      */
2487 	      size_type
2488 	      rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
2489 	
2490 	      /**
2491 	       *  @brief  Find position of a character of string.
2492 	       *  @param __str  String containing characters to locate.
2493 	       *  @param __pos  Index of character to search from (default 0).
2494 	       *  @return  Index of first occurrence.
2495 	       *
2496 	       *  Starting from @a __pos, searches forward for one of the
2497 	       *  characters of @a __str within this string.  If found,
2498 	       *  returns the index where it was found.  If not found, returns
2499 	       *  npos.
2500 	      */
2501 	      size_type
2502 	      find_first_of(const basic_string& __str, size_type __pos = 0) const
2503 	      _GLIBCXX_NOEXCEPT
2504 	      { return this->find_first_of(__str.data(), __pos, __str.size()); }
2505 	
2506 	#if __cplusplus >= 201703L
2507 	      /**
2508 	       *  @brief  Find position of a character of a string_view.
2509 	       *  @param __svt  An object convertible to string_view containing
2510 	       *                characters to locate.
2511 	       *  @param __pos  Index of character to search from (default 0).
2512 	       *  @return  Index of first occurrence.
2513 	      */
2514 	      template<typename _Tp>
2515 		_If_sv<_Tp, size_type>
2516 		find_first_of(const _Tp& __svt, size_type __pos = 0) const
2517 		noexcept(is_same<_Tp, __sv_type>::value)
2518 		{
2519 		  __sv_type __sv = __svt;
2520 		  return this->find_first_of(__sv.data(), __pos, __sv.size());
2521 		}
2522 	#endif // C++17
2523 	
2524 	      /**
2525 	       *  @brief  Find position of a character of C substring.
2526 	       *  @param __s  String containing characters to locate.
2527 	       *  @param __pos  Index of character to search from.
2528 	       *  @param __n  Number of characters from s to search for.
2529 	       *  @return  Index of first occurrence.
2530 	       *
2531 	       *  Starting from @a __pos, searches forward for one of the
2532 	       *  first @a __n characters of @a __s within this string.  If
2533 	       *  found, returns the index where it was found.  If not found,
2534 	       *  returns npos.
2535 	      */
2536 	      size_type
2537 	      find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
2538 	      _GLIBCXX_NOEXCEPT;
2539 	
2540 	      /**
2541 	       *  @brief  Find position of a character of C string.
2542 	       *  @param __s  String containing characters to locate.
2543 	       *  @param __pos  Index of character to search from (default 0).
2544 	       *  @return  Index of first occurrence.
2545 	       *
2546 	       *  Starting from @a __pos, searches forward for one of the
2547 	       *  characters of @a __s within this string.  If found, returns
2548 	       *  the index where it was found.  If not found, returns npos.
2549 	      */
2550 	      size_type
2551 	      find_first_of(const _CharT* __s, size_type __pos = 0) const
2552 	      _GLIBCXX_NOEXCEPT
2553 	      {
2554 		__glibcxx_requires_string(__s);
2555 		return this->find_first_of(__s, __pos, traits_type::length(__s));
2556 	      }
2557 	
2558 	      /**
2559 	       *  @brief  Find position of a character.
2560 	       *  @param __c  Character to locate.
2561 	       *  @param __pos  Index of character to search from (default 0).
2562 	       *  @return  Index of first occurrence.
2563 	       *
2564 	       *  Starting from @a __pos, searches forward for the character
2565 	       *  @a __c within this string.  If found, returns the index
2566 	       *  where it was found.  If not found, returns npos.
2567 	       *
2568 	       *  Note: equivalent to find(__c, __pos).
2569 	      */
2570 	      size_type
2571 	      find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
2572 	      { return this->find(__c, __pos); }
2573 	
2574 	      /**
2575 	       *  @brief  Find last position of a character of string.
2576 	       *  @param __str  String containing characters to locate.
2577 	       *  @param __pos  Index of character to search back from (default end).
2578 	       *  @return  Index of last occurrence.
2579 	       *
2580 	       *  Starting from @a __pos, searches backward for one of the
2581 	       *  characters of @a __str within this string.  If found,
2582 	       *  returns the index where it was found.  If not found, returns
2583 	       *  npos.
2584 	      */
2585 	      size_type
2586 	      find_last_of(const basic_string& __str, size_type __pos = npos) const
2587 	      _GLIBCXX_NOEXCEPT
2588 	      { return this->find_last_of(__str.data(), __pos, __str.size()); }
2589 	
2590 	#if __cplusplus >= 201703L
2591 	      /**
2592 	       *  @brief  Find last position of a character of string.
2593 	       *  @param __svt  An object convertible to string_view containing
2594 	       *                characters to locate.
2595 	       *  @param __pos  Index of character to search back from (default end).
2596 	       *  @return  Index of last occurrence.
2597 	      */
2598 	      template<typename _Tp>
2599 		_If_sv<_Tp, size_type>
2600 		find_last_of(const _Tp& __svt, size_type __pos = npos) const
2601 		noexcept(is_same<_Tp, __sv_type>::value)
2602 		{
2603 		  __sv_type __sv = __svt;
2604 		  return this->find_last_of(__sv.data(), __pos, __sv.size());
2605 		}
2606 	#endif // C++17
2607 	
2608 	      /**
2609 	       *  @brief  Find last position of a character of C substring.
2610 	       *  @param __s  C string containing characters to locate.
2611 	       *  @param __pos  Index of character to search back from.
2612 	       *  @param __n  Number of characters from s to search for.
2613 	       *  @return  Index of last occurrence.
2614 	       *
2615 	       *  Starting from @a __pos, searches backward for one of the
2616 	       *  first @a __n characters of @a __s within this string.  If
2617 	       *  found, returns the index where it was found.  If not found,
2618 	       *  returns npos.
2619 	      */
2620 	      size_type
2621 	      find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
2622 	      _GLIBCXX_NOEXCEPT;
2623 	
2624 	      /**
2625 	       *  @brief  Find last position of a character of C string.
2626 	       *  @param __s  C string containing characters to locate.
2627 	       *  @param __pos  Index of character to search back from (default end).
2628 	       *  @return  Index of last occurrence.
2629 	       *
2630 	       *  Starting from @a __pos, searches backward for one of the
2631 	       *  characters of @a __s within this string.  If found, returns
2632 	       *  the index where it was found.  If not found, returns npos.
2633 	      */
2634 	      size_type
2635 	      find_last_of(const _CharT* __s, size_type __pos = npos) const
2636 	      _GLIBCXX_NOEXCEPT
2637 	      {
2638 		__glibcxx_requires_string(__s);
2639 		return this->find_last_of(__s, __pos, traits_type::length(__s));
2640 	      }
2641 	
2642 	      /**
2643 	       *  @brief  Find last position of a character.
2644 	       *  @param __c  Character to locate.
2645 	       *  @param __pos  Index of character to search back from (default end).
2646 	       *  @return  Index of last occurrence.
2647 	       *
2648 	       *  Starting from @a __pos, searches backward for @a __c within
2649 	       *  this string.  If found, returns the index where it was
2650 	       *  found.  If not found, returns npos.
2651 	       *
2652 	       *  Note: equivalent to rfind(__c, __pos).
2653 	      */
2654 	      size_type
2655 	      find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
2656 	      { return this->rfind(__c, __pos); }
2657 	
2658 	      /**
2659 	       *  @brief  Find position of a character not in string.
2660 	       *  @param __str  String containing characters to avoid.
2661 	       *  @param __pos  Index of character to search from (default 0).
2662 	       *  @return  Index of first occurrence.
2663 	       *
2664 	       *  Starting from @a __pos, searches forward for a character not contained
2665 	       *  in @a __str within this string.  If found, returns the index where it
2666 	       *  was found.  If not found, returns npos.
2667 	      */
2668 	      size_type
2669 	      find_first_not_of(const basic_string& __str, size_type __pos = 0) const
2670 	      _GLIBCXX_NOEXCEPT
2671 	      { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
2672 	
2673 	#if __cplusplus >= 201703L
2674 	      /**
2675 	       *  @brief  Find position of a character not in a string_view.
2676 	       *  @param __svt  A object convertible to string_view containing
2677 	       *                characters to avoid.
2678 	       *  @param __pos  Index of character to search from (default 0).
2679 	       *  @return  Index of first occurrence.
2680 	       */
2681 	      template<typename _Tp>
2682 		_If_sv<_Tp, size_type>
2683 		find_first_not_of(const _Tp& __svt, size_type __pos = 0) const
2684 		noexcept(is_same<_Tp, __sv_type>::value)
2685 		{
2686 		  __sv_type __sv = __svt;
2687 		  return this->find_first_not_of(__sv.data(), __pos, __sv.size());
2688 		}
2689 	#endif // C++17
2690 	
2691 	      /**
2692 	       *  @brief  Find position of a character not in C substring.
2693 	       *  @param __s  C string containing characters to avoid.
2694 	       *  @param __pos  Index of character to search from.
2695 	       *  @param __n  Number of characters from __s to consider.
2696 	       *  @return  Index of first occurrence.
2697 	       *
2698 	       *  Starting from @a __pos, searches forward for a character not
2699 	       *  contained in the first @a __n characters of @a __s within
2700 	       *  this string.  If found, returns the index where it was
2701 	       *  found.  If not found, returns npos.
2702 	      */
2703 	      size_type
2704 	      find_first_not_of(const _CharT* __s, size_type __pos,
2705 				size_type __n) const _GLIBCXX_NOEXCEPT;
2706 	
2707 	      /**
2708 	       *  @brief  Find position of a character not in C string.
2709 	       *  @param __s  C string containing characters to avoid.
2710 	       *  @param __pos  Index of character to search from (default 0).
2711 	       *  @return  Index of first occurrence.
2712 	       *
2713 	       *  Starting from @a __pos, searches forward for a character not
2714 	       *  contained in @a __s within this string.  If found, returns
2715 	       *  the index where it was found.  If not found, returns npos.
2716 	      */
2717 	      size_type
2718 	      find_first_not_of(const _CharT* __s, size_type __pos = 0) const
2719 	      _GLIBCXX_NOEXCEPT
2720 	      {
2721 		__glibcxx_requires_string(__s);
2722 		return this->find_first_not_of(__s, __pos, traits_type::length(__s));
2723 	      }
2724 	
2725 	      /**
2726 	       *  @brief  Find position of a different character.
2727 	       *  @param __c  Character to avoid.
2728 	       *  @param __pos  Index of character to search from (default 0).
2729 	       *  @return  Index of first occurrence.
2730 	       *
2731 	       *  Starting from @a __pos, searches forward for a character
2732 	       *  other than @a __c within this string.  If found, returns the
2733 	       *  index where it was found.  If not found, returns npos.
2734 	      */
2735 	      size_type
2736 	      find_first_not_of(_CharT __c, size_type __pos = 0) const
2737 	      _GLIBCXX_NOEXCEPT;
2738 	
2739 	      /**
2740 	       *  @brief  Find last position of a character not in string.
2741 	       *  @param __str  String containing characters to avoid.
2742 	       *  @param __pos  Index of character to search back from (default end).
2743 	       *  @return  Index of last occurrence.
2744 	       *
2745 	       *  Starting from @a __pos, searches backward for a character
2746 	       *  not contained in @a __str within this string.  If found,
2747 	       *  returns the index where it was found.  If not found, returns
2748 	       *  npos.
2749 	      */
2750 	      size_type
2751 	      find_last_not_of(const basic_string& __str, size_type __pos = npos) const
2752 	      _GLIBCXX_NOEXCEPT
2753 	      { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
2754 	
2755 	#if __cplusplus >= 201703L
2756 	      /**
2757 	       *  @brief  Find last position of a character not in a string_view.
2758 	       *  @param __svt  An object convertible to string_view containing
2759 	       *                characters to avoid.
2760 	       *  @param __pos  Index of character to search back from (default end).
2761 	       *  @return  Index of last occurrence.
2762 	       */
2763 	      template<typename _Tp>
2764 		_If_sv<_Tp, size_type>
2765 		find_last_not_of(const _Tp& __svt, size_type __pos = npos) const
2766 		noexcept(is_same<_Tp, __sv_type>::value)
2767 		{
2768 		  __sv_type __sv = __svt;
2769 		  return this->find_last_not_of(__sv.data(), __pos, __sv.size());
2770 		}
2771 	#endif // C++17
2772 	
2773 	      /**
2774 	       *  @brief  Find last position of a character not in C substring.
2775 	       *  @param __s  C string containing characters to avoid.
2776 	       *  @param __pos  Index of character to search back from.
2777 	       *  @param __n  Number of characters from s to consider.
2778 	       *  @return  Index of last occurrence.
2779 	       *
2780 	       *  Starting from @a __pos, searches backward for a character not
2781 	       *  contained in the first @a __n characters of @a __s within this string.
2782 	       *  If found, returns the index where it was found.  If not found,
2783 	       *  returns npos.
2784 	      */
2785 	      size_type
2786 	      find_last_not_of(const _CharT* __s, size_type __pos,
2787 			       size_type __n) const _GLIBCXX_NOEXCEPT;
2788 	      /**
2789 	       *  @brief  Find last position of a character not in C string.
2790 	       *  @param __s  C string containing characters to avoid.
2791 	       *  @param __pos  Index of character to search back from (default end).
2792 	       *  @return  Index of last occurrence.
2793 	       *
2794 	       *  Starting from @a __pos, searches backward for a character
2795 	       *  not contained in @a __s within this string.  If found,
2796 	       *  returns the index where it was found.  If not found, returns
2797 	       *  npos.
2798 	      */
2799 	      size_type
2800 	      find_last_not_of(const _CharT* __s, size_type __pos = npos) const
2801 	      _GLIBCXX_NOEXCEPT
2802 	      {
2803 		__glibcxx_requires_string(__s);
2804 		return this->find_last_not_of(__s, __pos, traits_type::length(__s));
2805 	      }
2806 	
2807 	      /**
2808 	       *  @brief  Find last position of a different character.
2809 	       *  @param __c  Character to avoid.
2810 	       *  @param __pos  Index of character to search back from (default end).
2811 	       *  @return  Index of last occurrence.
2812 	       *
2813 	       *  Starting from @a __pos, searches backward for a character other than
2814 	       *  @a __c within this string.  If found, returns the index where it was
2815 	       *  found.  If not found, returns npos.
2816 	      */
2817 	      size_type
2818 	      find_last_not_of(_CharT __c, size_type __pos = npos) const
2819 	      _GLIBCXX_NOEXCEPT;
2820 	
2821 	      /**
2822 	       *  @brief  Get a substring.
2823 	       *  @param __pos  Index of first character (default 0).
2824 	       *  @param __n  Number of characters in substring (default remainder).
2825 	       *  @return  The new string.
2826 	       *  @throw  std::out_of_range  If __pos > size().
2827 	       *
2828 	       *  Construct and return a new string using the @a __n
2829 	       *  characters starting at @a __pos.  If the string is too
2830 	       *  short, use the remainder of the characters.  If @a __pos is
2831 	       *  beyond the end of the string, out_of_range is thrown.
2832 	      */
2833 	      basic_string
2834 	      substr(size_type __pos = 0, size_type __n = npos) const
2835 	      { return basic_string(*this,
2836 				    _M_check(__pos, "basic_string::substr"), __n); }
2837 	
2838 	      /**
2839 	       *  @brief  Compare to a string.
2840 	       *  @param __str  String to compare against.
2841 	       *  @return  Integer < 0, 0, or > 0.
2842 	       *
2843 	       *  Returns an integer < 0 if this string is ordered before @a
2844 	       *  __str, 0 if their values are equivalent, or > 0 if this
2845 	       *  string is ordered after @a __str.  Determines the effective
2846 	       *  length rlen of the strings to compare as the smallest of
2847 	       *  size() and str.size().  The function then compares the two
2848 	       *  strings by calling traits::compare(data(), str.data(),rlen).
2849 	       *  If the result of the comparison is nonzero returns it,
2850 	       *  otherwise the shorter one is ordered first.
2851 	      */
2852 	      int
2853 	      compare(const basic_string& __str) const
2854 	      {
2855 		const size_type __size = this->size();
2856 		const size_type __osize = __str.size();
2857 		const size_type __len = std::min(__size, __osize);
2858 	
2859 		int __r = traits_type::compare(_M_data(), __str.data(), __len);
2860 		if (!__r)
2861 		  __r = _S_compare(__size, __osize);
2862 		return __r;
2863 	      }
2864 	
2865 	#if __cplusplus >= 201703L
2866 	      /**
2867 	       *  @brief  Compare to a string_view.
2868 	       *  @param __svt An object convertible to string_view to compare against.
2869 	       *  @return  Integer < 0, 0, or > 0.
2870 	       */
2871 	      template<typename _Tp>
2872 		_If_sv<_Tp, int>
2873 		compare(const _Tp& __svt) const
2874 		noexcept(is_same<_Tp, __sv_type>::value)
2875 		{
2876 		  __sv_type __sv = __svt;
2877 		  const size_type __size = this->size();
2878 		  const size_type __osize = __sv.size();
2879 		  const size_type __len = std::min(__size, __osize);
2880 	
2881 		  int __r = traits_type::compare(_M_data(), __sv.data(), __len);
2882 		  if (!__r)
2883 		    __r = _S_compare(__size, __osize);
2884 		  return __r;
2885 		}
2886 	
2887 	      /**
2888 	       *  @brief  Compare to a string_view.
2889 	       *  @param __pos  A position in the string to start comparing from.
2890 	       *  @param __n  The number of characters to compare.
2891 	       *  @param __svt  An object convertible to string_view to compare
2892 	       *                against.
2893 	       *  @return  Integer < 0, 0, or > 0.
2894 	       */
2895 	      template<typename _Tp>
2896 		_If_sv<_Tp, int>
2897 		compare(size_type __pos, size_type __n, const _Tp& __svt) const
2898 		noexcept(is_same<_Tp, __sv_type>::value)
2899 		{
2900 		  __sv_type __sv = __svt;
2901 		  return __sv_type(*this).substr(__pos, __n).compare(__sv);
2902 		}
2903 	
2904 	      /**
2905 	       *  @brief  Compare to a string_view.
2906 	       *  @param __pos1  A position in the string to start comparing from.
2907 	       *  @param __n1  The number of characters to compare.
2908 	       *  @param __svt  An object convertible to string_view to compare
2909 	       *                against.
2910 	       *  @param __pos2  A position in the string_view to start comparing from.
2911 	       *  @param __n2  The number of characters to compare.
2912 	       *  @return  Integer < 0, 0, or > 0.
2913 	       */
2914 	      template<typename _Tp>
2915 		_If_sv<_Tp, int>
2916 		compare(size_type __pos1, size_type __n1, const _Tp& __svt,
2917 			size_type __pos2, size_type __n2 = npos) const
2918 		noexcept(is_same<_Tp, __sv_type>::value)
2919 		{
2920 		  __sv_type __sv = __svt;
2921 		  return __sv_type(*this)
2922 		    .substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
2923 		}
2924 	#endif // C++17
2925 	
2926 	      /**
2927 	       *  @brief  Compare substring to a string.
2928 	       *  @param __pos  Index of first character of substring.
2929 	       *  @param __n  Number of characters in substring.
2930 	       *  @param __str  String to compare against.
2931 	       *  @return  Integer < 0, 0, or > 0.
2932 	       *
2933 	       *  Form the substring of this string from the @a __n characters
2934 	       *  starting at @a __pos.  Returns an integer < 0 if the
2935 	       *  substring is ordered before @a __str, 0 if their values are
2936 	       *  equivalent, or > 0 if the substring is ordered after @a
2937 	       *  __str.  Determines the effective length rlen of the strings
2938 	       *  to compare as the smallest of the length of the substring
2939 	       *  and @a __str.size().  The function then compares the two
2940 	       *  strings by calling
2941 	       *  traits::compare(substring.data(),str.data(),rlen).  If the
2942 	       *  result of the comparison is nonzero returns it, otherwise
2943 	       *  the shorter one is ordered first.
2944 	      */
2945 	      int
2946 	      compare(size_type __pos, size_type __n, const basic_string& __str) const;
2947 	
2948 	      /**
2949 	       *  @brief  Compare substring to a substring.
2950 	       *  @param __pos1  Index of first character of substring.
2951 	       *  @param __n1  Number of characters in substring.
2952 	       *  @param __str  String to compare against.
2953 	       *  @param __pos2  Index of first character of substring of str.
2954 	       *  @param __n2  Number of characters in substring of str.
2955 	       *  @return  Integer < 0, 0, or > 0.
2956 	       *
2957 	       *  Form the substring of this string from the @a __n1
2958 	       *  characters starting at @a __pos1.  Form the substring of @a
2959 	       *  __str from the @a __n2 characters starting at @a __pos2.
2960 	       *  Returns an integer < 0 if this substring is ordered before
2961 	       *  the substring of @a __str, 0 if their values are equivalent,
2962 	       *  or > 0 if this substring is ordered after the substring of
2963 	       *  @a __str.  Determines the effective length rlen of the
2964 	       *  strings to compare as the smallest of the lengths of the
2965 	       *  substrings.  The function then compares the two strings by
2966 	       *  calling
2967 	       *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
2968 	       *  If the result of the comparison is nonzero returns it,
2969 	       *  otherwise the shorter one is ordered first.
2970 	      */
2971 	      int
2972 	      compare(size_type __pos1, size_type __n1, const basic_string& __str,
2973 		      size_type __pos2, size_type __n2 = npos) const;
2974 	
2975 	      /**
2976 	       *  @brief  Compare to a C string.
2977 	       *  @param __s  C string to compare against.
2978 	       *  @return  Integer < 0, 0, or > 0.
2979 	       *
2980 	       *  Returns an integer < 0 if this string is ordered before @a __s, 0 if
2981 	       *  their values are equivalent, or > 0 if this string is ordered after
2982 	       *  @a __s.  Determines the effective length rlen of the strings to
2983 	       *  compare as the smallest of size() and the length of a string
2984 	       *  constructed from @a __s.  The function then compares the two strings
2985 	       *  by calling traits::compare(data(),s,rlen).  If the result of the
2986 	       *  comparison is nonzero returns it, otherwise the shorter one is
2987 	       *  ordered first.
2988 	      */
2989 	      int
2990 	      compare(const _CharT* __s) const _GLIBCXX_NOEXCEPT;
2991 	
2992 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
2993 	      // 5 String::compare specification questionable
2994 	      /**
2995 	       *  @brief  Compare substring to a C string.
2996 	       *  @param __pos  Index of first character of substring.
2997 	       *  @param __n1  Number of characters in substring.
2998 	       *  @param __s  C string to compare against.
2999 	       *  @return  Integer < 0, 0, or > 0.
3000 	       *
3001 	       *  Form the substring of this string from the @a __n1
3002 	       *  characters starting at @a pos.  Returns an integer < 0 if
3003 	       *  the substring is ordered before @a __s, 0 if their values
3004 	       *  are equivalent, or > 0 if the substring is ordered after @a
3005 	       *  __s.  Determines the effective length rlen of the strings to
3006 	       *  compare as the smallest of the length of the substring and
3007 	       *  the length of a string constructed from @a __s.  The
3008 	       *  function then compares the two string by calling
3009 	       *  traits::compare(substring.data(),__s,rlen).  If the result of
3010 	       *  the comparison is nonzero returns it, otherwise the shorter
3011 	       *  one is ordered first.
3012 	      */
3013 	      int
3014 	      compare(size_type __pos, size_type __n1, const _CharT* __s) const;
3015 	
3016 	      /**
3017 	       *  @brief  Compare substring against a character %array.
3018 	       *  @param __pos  Index of first character of substring.
3019 	       *  @param __n1  Number of characters in substring.
3020 	       *  @param __s  character %array to compare against.
3021 	       *  @param __n2  Number of characters of s.
3022 	       *  @return  Integer < 0, 0, or > 0.
3023 	       *
3024 	       *  Form the substring of this string from the @a __n1
3025 	       *  characters starting at @a __pos.  Form a string from the
3026 	       *  first @a __n2 characters of @a __s.  Returns an integer < 0
3027 	       *  if this substring is ordered before the string from @a __s,
3028 	       *  0 if their values are equivalent, or > 0 if this substring
3029 	       *  is ordered after the string from @a __s.  Determines the
3030 	       *  effective length rlen of the strings to compare as the
3031 	       *  smallest of the length of the substring and @a __n2.  The
3032 	       *  function then compares the two strings by calling
3033 	       *  traits::compare(substring.data(),s,rlen).  If the result of
3034 	       *  the comparison is nonzero returns it, otherwise the shorter
3035 	       *  one is ordered first.
3036 	       *
3037 	       *  NB: s must have at least n2 characters, &apos;\\0&apos; has
3038 	       *  no special meaning.
3039 	      */
3040 	      int
3041 	      compare(size_type __pos, size_type __n1, const _CharT* __s,
3042 		      size_type __n2) const;
3043 	
3044 	#if __cplusplus > 201703L
3045 	      bool
3046 	      starts_with(basic_string_view<_CharT, _Traits> __x) const noexcept
3047 	      { return __sv_type(this->data(), this->size()).starts_with(__x); }
3048 	
3049 	      bool
3050 	      starts_with(_CharT __x) const noexcept
3051 	      { return __sv_type(this->data(), this->size()).starts_with(__x); }
3052 	
3053 	      bool
3054 	      starts_with(const _CharT* __x) const noexcept
3055 	      { return __sv_type(this->data(), this->size()).starts_with(__x); }
3056 	
3057 	      bool
3058 	      ends_with(basic_string_view<_CharT, _Traits> __x) const noexcept
3059 	      { return __sv_type(this->data(), this->size()).ends_with(__x); }
3060 	
3061 	      bool
3062 	      ends_with(_CharT __x) const noexcept
3063 	      { return __sv_type(this->data(), this->size()).ends_with(__x); }
3064 	
3065 	      bool
3066 	      ends_with(const _CharT* __x) const noexcept
3067 	      { return __sv_type(this->data(), this->size()).ends_with(__x); }
3068 	#endif // C++20
3069 	
3070 	      // Allow basic_stringbuf::__xfer_bufptrs to call _M_length:
3071 	      template<typename, typename, typename> friend class basic_stringbuf;
3072 	    };
3073 	_GLIBCXX_END_NAMESPACE_CXX11
3074 	#else  // !_GLIBCXX_USE_CXX11_ABI
3075 	  // Reference-counted COW string implentation
3076 	
3077 	  /**
3078 	   *  @class basic_string basic_string.h <string>
3079 	   *  @brief  Managing sequences of characters and character-like objects.
3080 	   *
3081 	   *  @ingroup strings
3082 	   *  @ingroup sequences
3083 	   *
3084 	   *  @tparam _CharT  Type of character
3085 	   *  @tparam _Traits  Traits for character type, defaults to
3086 	   *                   char_traits<_CharT>.
3087 	   *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
3088 	   *
3089 	   *  Meets the requirements of a <a href="tables.html#65">container</a>, a
3090 	   *  <a href="tables.html#66">reversible container</a>, and a
3091 	   *  <a href="tables.html#67">sequence</a>.  Of the
3092 	   *  <a href="tables.html#68">optional sequence requirements</a>, only
3093 	   *  @c push_back, @c at, and @c %array access are supported.
3094 	   *
3095 	   *  @doctodo
3096 	   *
3097 	   *
3098 	   *  Documentation?  What's that?
3099 	   *  Nathan Myers <ncm@cantrip.org>.
3100 	   *
3101 	   *  A string looks like this:
3102 	   *
3103 	   *  @code
3104 	   *                                        [_Rep]
3105 	   *                                        _M_length
3106 	   *   [basic_string<char_type>]            _M_capacity
3107 	   *   _M_dataplus                          _M_refcount
3108 	   *   _M_p ---------------->               unnamed array of char_type
3109 	   *  @endcode
3110 	   *
3111 	   *  Where the _M_p points to the first character in the string, and
3112 	   *  you cast it to a pointer-to-_Rep and subtract 1 to get a
3113 	   *  pointer to the header.
3114 	   *
3115 	   *  This approach has the enormous advantage that a string object
3116 	   *  requires only one allocation.  All the ugliness is confined
3117 	   *  within a single %pair of inline functions, which each compile to
3118 	   *  a single @a add instruction: _Rep::_M_data(), and
3119 	   *  string::_M_rep(); and the allocation function which gets a
3120 	   *  block of raw bytes and with room enough and constructs a _Rep
3121 	   *  object at the front.
3122 	   *
3123 	   *  The reason you want _M_data pointing to the character %array and
3124 	   *  not the _Rep is so that the debugger can see the string
3125 	   *  contents. (Probably we should add a non-inline member to get
3126 	   *  the _Rep for the debugger to use, so users can check the actual
3127 	   *  string length.)
3128 	   *
3129 	   *  Note that the _Rep object is a POD so that you can have a
3130 	   *  static <em>empty string</em> _Rep object already @a constructed before
3131 	   *  static constructors have run.  The reference-count encoding is
3132 	   *  chosen so that a 0 indicates one reference, so you never try to
3133 	   *  destroy the empty-string _Rep object.
3134 	   *
3135 	   *  All but the last paragraph is considered pretty conventional
3136 	   *  for a C++ string implementation.
3137 	  */
3138 	  // 21.3  Template class basic_string
3139 	  template<typename _CharT, typename _Traits, typename _Alloc>
3140 	    class basic_string
3141 	    {
3142 	      typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
3143 	
3144 	      // Types:
3145 	    public:
3146 	      typedef _Traits					    traits_type;
3147 	      typedef typename _Traits::char_type		    value_type;
3148 	      typedef _Alloc					    allocator_type;
3149 	      typedef typename _CharT_alloc_type::size_type	    size_type;
3150 	      typedef typename _CharT_alloc_type::difference_type   difference_type;
3151 	#if __cplusplus < 201103L
3152 	      typedef typename _CharT_alloc_type::reference	    reference;
3153 	      typedef typename _CharT_alloc_type::const_reference   const_reference;
3154 	#else
3155 	      typedef value_type&				    reference;
3156 	      typedef const value_type&				    const_reference;
3157 	#endif
3158 	      typedef typename _CharT_alloc_type::pointer	    pointer;
3159 	      typedef typename _CharT_alloc_type::const_pointer	    const_pointer;
3160 	      typedef __gnu_cxx::__normal_iterator<pointer, basic_string>  iterator;
3161 	      typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
3162 	                                                            const_iterator;
3163 	      typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;
3164 	      typedef std::reverse_iterator<iterator>		    reverse_iterator;
3165 	
3166 	    protected:
3167 	      // type used for positions in insert, erase etc.
3168 	      typedef iterator __const_iterator;
3169 	
3170 	    private:
3171 	      // _Rep: string representation
3172 	      //   Invariants:
3173 	      //   1. String really contains _M_length + 1 characters: due to 21.3.4
3174 	      //      must be kept null-terminated.
3175 	      //   2. _M_capacity >= _M_length
3176 	      //      Allocated memory is always (_M_capacity + 1) * sizeof(_CharT).
3177 	      //   3. _M_refcount has three states:
3178 	      //      -1: leaked, one reference, no ref-copies allowed, non-const.
3179 	      //       0: one reference, non-const.
3180 	      //     n>0: n + 1 references, operations require a lock, const.
3181 	      //   4. All fields==0 is an empty string, given the extra storage
3182 	      //      beyond-the-end for a null terminator; thus, the shared
3183 	      //      empty string representation needs no constructor.
3184 	
3185 	      struct _Rep_base
3186 	      {
3187 		size_type		_M_length;
3188 		size_type		_M_capacity;
3189 		_Atomic_word		_M_refcount;
3190 	      };
3191 	
3192 	      struct _Rep : _Rep_base
3193 	      {
3194 		// Types:
3195 		typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
3196 	
3197 		// (Public) Data members:
3198 	
3199 		// The maximum number of individual char_type elements of an
3200 		// individual string is determined by _S_max_size. This is the
3201 		// value that will be returned by max_size().  (Whereas npos
3202 		// is the maximum number of bytes the allocator can allocate.)
3203 		// If one was to divvy up the theoretical largest size string,
3204 		// with a terminating character and m _CharT elements, it'd
3205 		// look like this:
3206 		// npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
3207 		// Solving for m:
3208 		// m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
3209 		// In addition, this implementation quarters this amount.
3210 		static const size_type	_S_max_size;
3211 		static const _CharT	_S_terminal;
3212 	
3213 		// The following storage is init'd to 0 by the linker, resulting
3214 	        // (carefully) in an empty string with one reference.
3215 	        static size_type _S_empty_rep_storage[];
3216 	
3217 	        static _Rep&
3218 	        _S_empty_rep() _GLIBCXX_NOEXCEPT
3219 	        { 
3220 		  // NB: Mild hack to avoid strict-aliasing warnings.  Note that
3221 		  // _S_empty_rep_storage is never modified and the punning should
3222 		  // be reasonably safe in this case.
3223 		  void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
3224 		  return *reinterpret_cast<_Rep*>(__p);
3225 		}
3226 	
3227 	        bool
3228 		_M_is_leaked() const _GLIBCXX_NOEXCEPT
3229 	        {
3230 	#if defined(__GTHREADS)
3231 	          // _M_refcount is mutated concurrently by _M_refcopy/_M_dispose,
3232 	          // so we need to use an atomic load. However, _M_is_leaked
3233 	          // predicate does not change concurrently (i.e. the string is either
3234 	          // leaked or not), so a relaxed load is enough.
3235 	          return __atomic_load_n(&this->_M_refcount, __ATOMIC_RELAXED) < 0;
3236 	#else
3237 	          return this->_M_refcount < 0;
3238 	#endif
3239 	        }
3240 	
3241 	        bool
3242 		_M_is_shared() const _GLIBCXX_NOEXCEPT
3243 		{
3244 	#if defined(__GTHREADS)
3245 	          // _M_refcount is mutated concurrently by _M_refcopy/_M_dispose,
3246 	          // so we need to use an atomic load. Another thread can drop last
3247 	          // but one reference concurrently with this check, so we need this
3248 	          // load to be acquire to synchronize with release fetch_and_add in
3249 	          // _M_dispose.
3250 	          return __atomic_load_n(&this->_M_refcount, __ATOMIC_ACQUIRE) > 0;
3251 	#else
3252 	          return this->_M_refcount > 0;
3253 	#endif
3254 	        }
3255 	
3256 	        void
3257 		_M_set_leaked() _GLIBCXX_NOEXCEPT
3258 	        { this->_M_refcount = -1; }
3259 	
3260 	        void
3261 		_M_set_sharable() _GLIBCXX_NOEXCEPT
3262 	        { this->_M_refcount = 0; }
3263 	
3264 		void
3265 		_M_set_length_and_sharable(size_type __n) _GLIBCXX_NOEXCEPT
3266 		{
3267 	#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
3268 		  if (__builtin_expect(this != &_S_empty_rep(), false))
3269 	#endif
3270 		    {
3271 		      this->_M_set_sharable();  // One reference.
3272 		      this->_M_length = __n;
3273 		      traits_type::assign(this->_M_refdata()[__n], _S_terminal);
3274 		      // grrr. (per 21.3.4)
3275 		      // You cannot leave those LWG people alone for a second.
3276 		    }
3277 		}
3278 	
3279 		_CharT*
3280 		_M_refdata() throw()
3281 		{ return reinterpret_cast<_CharT*>(this + 1); }
3282 	
3283 		_CharT*
3284 		_M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
3285 		{
3286 		  return (!_M_is_leaked() && __alloc1 == __alloc2)
3287 		          ? _M_refcopy() : _M_clone(__alloc1);
3288 		}
3289 	
3290 		// Create & Destroy
3291 		static _Rep*
3292 		_S_create(size_type, size_type, const _Alloc&);
3293 	
3294 		void
3295 		_M_dispose(const _Alloc& __a) _GLIBCXX_NOEXCEPT
3296 		{
3297 	#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
3298 		  if (__builtin_expect(this != &_S_empty_rep(), false))
3299 	#endif
3300 		    {
3301 		      // Be race-detector-friendly.  For more info see bits/c++config.
3302 		      _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount);
3303 	              // Decrement of _M_refcount is acq_rel, because:
3304 	              // - all but last decrements need to release to synchronize with
3305 	              //   the last decrement that will delete the object.
3306 	              // - the last decrement needs to acquire to synchronize with
3307 	              //   all the previous decrements.
3308 	              // - last but one decrement needs to release to synchronize with
3309 	              //   the acquire load in _M_is_shared that will conclude that
3310 	              //   the object is not shared anymore.
3311 		      if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
3312 								 -1) <= 0)
3313 			{
3314 			  _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount);
3315 			  _M_destroy(__a);
3316 			}
3317 		    }
3318 		}  // XXX MT
3319 	
3320 		void
3321 		_M_destroy(const _Alloc&) throw();
3322 	
3323 		_CharT*
3324 		_M_refcopy() throw()
3325 		{
3326 	#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
3327 		  if (__builtin_expect(this != &_S_empty_rep(), false))
3328 	#endif
3329 	            __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
3330 		  return _M_refdata();
3331 		}  // XXX MT
3332 	
3333 		_CharT*
3334 		_M_clone(const _Alloc&, size_type __res = 0);
3335 	      };
3336 	
3337 	      // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
3338 	      struct _Alloc_hider : _Alloc
3339 	      {
3340 		_Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
3341 		: _Alloc(__a), _M_p(__dat) { }
3342 	
3343 		_CharT* _M_p; // The actual data.
3344 	      };
3345 	
3346 	    public:
3347 	      // Data Members (public):
3348 	      // NB: This is an unsigned type, and thus represents the maximum
3349 	      // size that the allocator can hold.
3350 	      ///  Value returned by various member functions when they fail.
3351 	      static const size_type	npos = static_cast<size_type>(-1);
3352 	
3353 	    private:
3354 	      // Data Members (private):
3355 	      mutable _Alloc_hider	_M_dataplus;
3356 	
3357 	      _CharT*
3358 	      _M_data() const _GLIBCXX_NOEXCEPT
3359 	      { return  _M_dataplus._M_p; }
3360 	
3361 	      _CharT*
3362 	      _M_data(_CharT* __p) _GLIBCXX_NOEXCEPT
3363 	      { return (_M_dataplus._M_p = __p); }
3364 	
3365 	      _Rep*
3366 	      _M_rep() const _GLIBCXX_NOEXCEPT
3367 	      { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
3368 	
3369 	      // For the internal use we have functions similar to `begin'/`end'
3370 	      // but they do not call _M_leak.
3371 	      iterator
3372 	      _M_ibegin() const _GLIBCXX_NOEXCEPT
3373 	      { return iterator(_M_data()); }
3374 	
3375 	      iterator
3376 	      _M_iend() const _GLIBCXX_NOEXCEPT
3377 	      { return iterator(_M_data() + this->size()); }
3378 	
3379 	      void
3380 	      _M_leak()    // for use in begin() & non-const op[]
3381 	      {
3382 		if (!_M_rep()->_M_is_leaked())
3383 		  _M_leak_hard();
3384 	      }
3385 	
3386 	      size_type
3387 	      _M_check(size_type __pos, const char* __s) const
3388 	      {
3389 		if (__pos > this->size())
3390 		  __throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > "
3391 					       "this->size() (which is %zu)"),
3392 					   __s, __pos, this->size());
3393 		return __pos;
3394 	      }
3395 	
3396 	      void
3397 	      _M_check_length(size_type __n1, size_type __n2, const char* __s) const
3398 	      {
3399 		if (this->max_size() - (this->size() - __n1) < __n2)
3400 		  __throw_length_error(__N(__s));
3401 	      }
3402 	
3403 	      // NB: _M_limit doesn't check for a bad __pos value.
3404 	      size_type
3405 	      _M_limit(size_type __pos, size_type __off) const _GLIBCXX_NOEXCEPT
3406 	      {
3407 		const bool __testoff =  __off < this->size() - __pos;
3408 		return __testoff ? __off : this->size() - __pos;
3409 	      }
3410 	
3411 	      // True if _Rep and source do not overlap.
3412 	      bool
3413 	      _M_disjunct(const _CharT* __s) const _GLIBCXX_NOEXCEPT
3414 	      {
3415 		return (less<const _CharT*>()(__s, _M_data())
3416 			|| less<const _CharT*>()(_M_data() + this->size(), __s));
3417 	      }
3418 	
3419 	      // When __n = 1 way faster than the general multichar
3420 	      // traits_type::copy/move/assign.
3421 	      static void
3422 	      _M_copy(_CharT* __d, const _CharT* __s, size_type __n) _GLIBCXX_NOEXCEPT
3423 	      {
3424 		if (__n == 1)
3425 		  traits_type::assign(*__d, *__s);
3426 		else
3427 		  traits_type::copy(__d, __s, __n);
3428 	      }
3429 	
3430 	      static void
3431 	      _M_move(_CharT* __d, const _CharT* __s, size_type __n) _GLIBCXX_NOEXCEPT
3432 	      {
3433 		if (__n == 1)
3434 		  traits_type::assign(*__d, *__s);
3435 		else
3436 		  traits_type::move(__d, __s, __n);	  
3437 	      }
3438 	
3439 	      static void
3440 	      _M_assign(_CharT* __d, size_type __n, _CharT __c) _GLIBCXX_NOEXCEPT
3441 	      {
3442 		if (__n == 1)
3443 		  traits_type::assign(*__d, __c);
3444 		else
3445 		  traits_type::assign(__d, __n, __c);	  
3446 	      }
3447 	
3448 	      // _S_copy_chars is a separate template to permit specialization
3449 	      // to optimize for the common case of pointers as iterators.
3450 	      template<class _Iterator>
3451 	        static void
3452 	        _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
3453 	        {
3454 		  for (; __k1 != __k2; ++__k1, (void)++__p)
3455 		    traits_type::assign(*__p, *__k1); // These types are off.
3456 		}
3457 	
3458 	      static void
3459 	      _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2) _GLIBCXX_NOEXCEPT
3460 	      { _S_copy_chars(__p, __k1.base(), __k2.base()); }
3461 	
3462 	      static void
3463 	      _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
3464 	      _GLIBCXX_NOEXCEPT
3465 	      { _S_copy_chars(__p, __k1.base(), __k2.base()); }
3466 	
3467 	      static void
3468 	      _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) _GLIBCXX_NOEXCEPT
3469 	      { _M_copy(__p, __k1, __k2 - __k1); }
3470 	
3471 	      static void
3472 	      _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
3473 	      _GLIBCXX_NOEXCEPT
3474 	      { _M_copy(__p, __k1, __k2 - __k1); }
3475 	
3476 	      static int
3477 	      _S_compare(size_type __n1, size_type __n2) _GLIBCXX_NOEXCEPT
3478 	      {
3479 		const difference_type __d = difference_type(__n1 - __n2);
3480 	
3481 		if (__d > __gnu_cxx::__numeric_traits<int>::__max)
3482 		  return __gnu_cxx::__numeric_traits<int>::__max;
3483 		else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
3484 		  return __gnu_cxx::__numeric_traits<int>::__min;
3485 		else
3486 		  return int(__d);
3487 	      }
3488 	
3489 	      void
3490 	      _M_mutate(size_type __pos, size_type __len1, size_type __len2);
3491 	
3492 	      void
3493 	      _M_leak_hard();
3494 	
3495 	      static _Rep&
3496 	      _S_empty_rep() _GLIBCXX_NOEXCEPT
3497 	      { return _Rep::_S_empty_rep(); }
3498 	
3499 	#if __cplusplus >= 201703L
3500 	      // A helper type for avoiding boiler-plate.
3501 	      typedef basic_string_view<_CharT, _Traits> __sv_type;
3502 	
3503 	      template<typename _Tp, typename _Res>
3504 		using _If_sv = enable_if_t<
3505 		  __and_<is_convertible<const _Tp&, __sv_type>,
3506 			 __not_<is_convertible<const _Tp*, const basic_string*>>,
3507 			 __not_<is_convertible<const _Tp&, const _CharT*>>>::value,
3508 		  _Res>;
3509 	
3510 	      // Allows an implicit conversion to __sv_type.
3511 	      static __sv_type
3512 	      _S_to_string_view(__sv_type __svt) noexcept
3513 	      { return __svt; }
3514 	
3515 	      // Wraps a string_view by explicit conversion and thus
3516 	      // allows to add an internal constructor that does not
3517 	      // participate in overload resolution when a string_view
3518 	      // is provided.
3519 	      struct __sv_wrapper
3520 	      {
3521 		explicit __sv_wrapper(__sv_type __sv) noexcept : _M_sv(__sv) { }
3522 		__sv_type _M_sv;
3523 	      };
3524 	
3525 	      /**
3526 	       *  @brief  Only internally used: Construct string from a string view
3527 	       *          wrapper.
3528 	       *  @param  __svw  string view wrapper.
3529 	       *  @param  __a  Allocator to use.
3530 	       */
3531 	      explicit
3532 	      basic_string(__sv_wrapper __svw, const _Alloc& __a)
3533 	      : basic_string(__svw._M_sv.data(), __svw._M_sv.size(), __a) { }
3534 	#endif
3535 	
3536 	    public:
3537 	      // Construct/copy/destroy:
3538 	      // NB: We overload ctors in some cases instead of using default
3539 	      // arguments, per 17.4.4.4 para. 2 item 2.
3540 	
3541 	      /**
3542 	       *  @brief  Default constructor creates an empty string.
3543 	       */
3544 	      basic_string()
3545 	#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
3546 	      _GLIBCXX_NOEXCEPT
3547 	      : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc())
3548 	#else
3549 	      : _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc())
3550 	#endif
3551 	      { }
3552 	
3553 	      /**
3554 	       *  @brief  Construct an empty string using allocator @a a.
3555 	       */
3556 	      explicit
3557 	      basic_string(const _Alloc& __a);
3558 	
3559 	      // NB: per LWG issue 42, semantics different from IS:
3560 	      /**
3561 	       *  @brief  Construct string with copy of value of @a str.
3562 	       *  @param  __str  Source string.
3563 	       */
3564 	      basic_string(const basic_string& __str);
3565 	
3566 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
3567 	      // 2583. no way to supply an allocator for basic_string(str, pos)
3568 	      /**
3569 	       *  @brief  Construct string as copy of a substring.
3570 	       *  @param  __str  Source string.
3571 	       *  @param  __pos  Index of first character to copy from.
3572 	       *  @param  __a  Allocator to use.
3573 	       */
3574 	      basic_string(const basic_string& __str, size_type __pos,
3575 			   const _Alloc& __a = _Alloc());
3576 	
3577 	      /**
3578 	       *  @brief  Construct string as copy of a substring.
3579 	       *  @param  __str  Source string.
3580 	       *  @param  __pos  Index of first character to copy from.
3581 	       *  @param  __n  Number of characters to copy.
3582 	       */
3583 	      basic_string(const basic_string& __str, size_type __pos,
3584 			   size_type __n);
3585 	      /**
3586 	       *  @brief  Construct string as copy of a substring.
3587 	       *  @param  __str  Source string.
3588 	       *  @param  __pos  Index of first character to copy from.
3589 	       *  @param  __n  Number of characters to copy.
3590 	       *  @param  __a  Allocator to use.
3591 	       */
3592 	      basic_string(const basic_string& __str, size_type __pos,
3593 			   size_type __n, const _Alloc& __a);
3594 	
3595 	      /**
3596 	       *  @brief  Construct string initialized by a character %array.
3597 	       *  @param  __s  Source character %array.
3598 	       *  @param  __n  Number of characters to copy.
3599 	       *  @param  __a  Allocator to use (default is default allocator).
3600 	       *
3601 	       *  NB: @a __s must have at least @a __n characters, &apos;\\0&apos;
3602 	       *  has no special meaning.
3603 	       */
3604 	      basic_string(const _CharT* __s, size_type __n,
3605 			   const _Alloc& __a = _Alloc());
3606 	      /**
3607 	       *  @brief  Construct string as copy of a C string.
3608 	       *  @param  __s  Source C string.
3609 	       *  @param  __a  Allocator to use (default is default allocator).
3610 	       */
3611 	      basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
3612 	      /**
3613 	       *  @brief  Construct string as multiple characters.
3614 	       *  @param  __n  Number of characters.
3615 	       *  @param  __c  Character to use.
3616 	       *  @param  __a  Allocator to use (default is default allocator).
3617 	       */
3618 	      basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
3619 	
3620 	#if __cplusplus >= 201103L
3621 	      /**
3622 	       *  @brief  Move construct string.
3623 	       *  @param  __str  Source string.
3624 	       *
3625 	       *  The newly-created string contains the exact contents of @a __str.
3626 	       *  @a __str is a valid, but unspecified string.
3627 	       **/
3628 	      basic_string(basic_string&& __str)
3629 	#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
3630 	      noexcept // FIXME C++11: should always be noexcept.
3631 	#endif
3632 	      : _M_dataplus(std::move(__str._M_dataplus))
3633 	      {
3634 	#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
3635 		__str._M_data(_S_empty_rep()._M_refdata());
3636 	#else
3637 		__str._M_data(_S_construct(size_type(), _CharT(), get_allocator()));
3638 	#endif
3639 	      }
3640 	
3641 	      /**
3642 	       *  @brief  Construct string from an initializer %list.
3643 	       *  @param  __l  std::initializer_list of characters.
3644 	       *  @param  __a  Allocator to use (default is default allocator).
3645 	       */
3646 	      basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc());
3647 	
3648 	      basic_string(const basic_string& __str, const _Alloc& __a)
3649 	      : _M_dataplus(__str._M_rep()->_M_grab(__a, __str.get_allocator()), __a)
3650 	      { }
3651 	
3652 	      basic_string(basic_string&& __str, const _Alloc& __a)
3653 	      : _M_dataplus(__str._M_data(), __a)
3654 	      {
3655 		if (__a == __str.get_allocator())
3656 		  {
3657 	#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
3658 		    __str._M_data(_S_empty_rep()._M_refdata());
3659 	#else
3660 		    __str._M_data(_S_construct(size_type(), _CharT(), __a));
3661 	#endif
3662 		  }
3663 		else
3664 		  _M_dataplus._M_p = _S_construct(__str.begin(), __str.end(), __a);
3665 	      }
3666 	#endif // C++11
3667 	
3668 	      /**
3669 	       *  @brief  Construct string as copy of a range.
3670 	       *  @param  __beg  Start of range.
3671 	       *  @param  __end  End of range.
3672 	       *  @param  __a  Allocator to use (default is default allocator).
3673 	       */
3674 	      template<class _InputIterator>
3675 	        basic_string(_InputIterator __beg, _InputIterator __end,
3676 			     const _Alloc& __a = _Alloc());
3677 	
3678 	#if __cplusplus >= 201703L
3679 	      /**
3680 	       *  @brief  Construct string from a substring of a string_view.
3681 	       *  @param  __t   Source object convertible to string view.
3682 	       *  @param  __pos The index of the first character to copy from __t.
3683 	       *  @param  __n   The number of characters to copy from __t.
3684 	       *  @param  __a   Allocator to use.
3685 	       */
3686 	      template<typename _Tp, typename = _If_sv<_Tp, void>>
3687 		basic_string(const _Tp& __t, size_type __pos, size_type __n,
3688 			     const _Alloc& __a = _Alloc())
3689 		: basic_string(_S_to_string_view(__t).substr(__pos, __n), __a) { }
3690 	
3691 	      /**
3692 	       *  @brief  Construct string from a string_view.
3693 	       *  @param  __t  Source object convertible to string view.
3694 	       *  @param  __a  Allocator to use (default is default allocator).
3695 	       */
3696 	      template<typename _Tp, typename = _If_sv<_Tp, void>>
3697 		explicit
3698 		basic_string(const _Tp& __t, const _Alloc& __a = _Alloc())
3699 		: basic_string(__sv_wrapper(_S_to_string_view(__t)), __a) { }
3700 	#endif // C++17
3701 	
3702 	      /**
3703 	       *  @brief  Destroy the string instance.
3704 	       */
3705 	      ~basic_string() _GLIBCXX_NOEXCEPT
3706 	      { _M_rep()->_M_dispose(this->get_allocator()); }
3707 	
3708 	      /**
3709 	       *  @brief  Assign the value of @a str to this string.
3710 	       *  @param  __str  Source string.
3711 	       */
3712 	      basic_string&
3713 	      operator=(const basic_string& __str)
3714 	      { return this->assign(__str); }
3715 	
3716 	      /**
3717 	       *  @brief  Copy contents of @a s into this string.
3718 	       *  @param  __s  Source null-terminated string.
3719 	       */
3720 	      basic_string&
3721 	      operator=(const _CharT* __s) 
3722 	      { return this->assign(__s); }
3723 	
3724 	      /**
3725 	       *  @brief  Set value to string of length 1.
3726 	       *  @param  __c  Source character.
3727 	       *
3728 	       *  Assigning to a character makes this string length 1 and
3729 	       *  (*this)[0] == @a c.
3730 	       */
3731 	      basic_string&
3732 	      operator=(_CharT __c) 
3733 	      { 
3734 		this->assign(1, __c); 
3735 		return *this;
3736 	      }
3737 	
3738 	#if __cplusplus >= 201103L
3739 	      /**
3740 	       *  @brief  Move assign the value of @a str to this string.
3741 	       *  @param  __str  Source string.
3742 	       *
3743 	       *  The contents of @a str are moved into this string (without copying).
3744 	       *  @a str is a valid, but unspecified string.
3745 	       **/
3746 	      basic_string&
3747 	      operator=(basic_string&& __str)
3748 	      _GLIBCXX_NOEXCEPT_IF(allocator_traits<_Alloc>::is_always_equal::value)
3749 	      {
3750 		// NB: DR 1204.
3751 		this->swap(__str);
3752 		return *this;
3753 	      }
3754 	
3755 	      /**
3756 	       *  @brief  Set value to string constructed from initializer %list.
3757 	       *  @param  __l  std::initializer_list.
3758 	       */
3759 	      basic_string&
3760 	      operator=(initializer_list<_CharT> __l)
3761 	      {
3762 		this->assign(__l.begin(), __l.size());
3763 		return *this;
3764 	      }
3765 	#endif // C++11
3766 	
3767 	#if __cplusplus >= 201703L
3768 	      /**
3769 	       *  @brief  Set value to string constructed from a string_view.
3770 	       *  @param  __svt An object convertible to  string_view.
3771 	       */
3772 	      template<typename _Tp>
3773 		_If_sv<_Tp, basic_string&>
3774 		operator=(const _Tp& __svt)
3775 		{ return this->assign(__svt); }
3776 	
3777 	      /**
3778 	       *  @brief  Convert to a string_view.
3779 	       *  @return A string_view.
3780 	       */
3781 	      operator __sv_type() const noexcept
3782 	      { return __sv_type(data(), size()); }
3783 	#endif // C++17
3784 	
3785 	      // Iterators:
3786 	      /**
3787 	       *  Returns a read/write iterator that points to the first character in
3788 	       *  the %string.  Unshares the string.
3789 	       */
3790 	      iterator
3791 	      begin() // FIXME C++11: should be noexcept.
3792 	      {
3793 		_M_leak();
3794 		return iterator(_M_data());
3795 	      }
3796 	
3797 	      /**
3798 	       *  Returns a read-only (constant) iterator that points to the first
3799 	       *  character in the %string.
3800 	       */
3801 	      const_iterator
3802 	      begin() const _GLIBCXX_NOEXCEPT
3803 	      { return const_iterator(_M_data()); }
3804 	
3805 	      /**
3806 	       *  Returns a read/write iterator that points one past the last
3807 	       *  character in the %string.  Unshares the string.
3808 	       */
3809 	      iterator
3810 	      end() // FIXME C++11: should be noexcept.
3811 	      {
3812 		_M_leak();
3813 		return iterator(_M_data() + this->size());
3814 	      }
3815 	
3816 	      /**
3817 	       *  Returns a read-only (constant) iterator that points one past the
3818 	       *  last character in the %string.
3819 	       */
3820 	      const_iterator
3821 	      end() const _GLIBCXX_NOEXCEPT
3822 	      { return const_iterator(_M_data() + this->size()); }
3823 	
3824 	      /**
3825 	       *  Returns a read/write reverse iterator that points to the last
3826 	       *  character in the %string.  Iteration is done in reverse element
3827 	       *  order.  Unshares the string.
3828 	       */
3829 	      reverse_iterator
3830 	      rbegin() // FIXME C++11: should be noexcept.
3831 	      { return reverse_iterator(this->end()); }
3832 	
3833 	      /**
3834 	       *  Returns a read-only (constant) reverse iterator that points
3835 	       *  to the last character in the %string.  Iteration is done in
3836 	       *  reverse element order.
3837 	       */
3838 	      const_reverse_iterator
3839 	      rbegin() const _GLIBCXX_NOEXCEPT
3840 	      { return const_reverse_iterator(this->end()); }
3841 	
3842 	      /**
3843 	       *  Returns a read/write reverse iterator that points to one before the
3844 	       *  first character in the %string.  Iteration is done in reverse
3845 	       *  element order.  Unshares the string.
3846 	       */
3847 	      reverse_iterator
3848 	      rend() // FIXME C++11: should be noexcept.
3849 	      { return reverse_iterator(this->begin()); }
3850 	
3851 	      /**
3852 	       *  Returns a read-only (constant) reverse iterator that points
3853 	       *  to one before the first character in the %string.  Iteration
3854 	       *  is done in reverse element order.
3855 	       */
3856 	      const_reverse_iterator
3857 	      rend() const _GLIBCXX_NOEXCEPT
3858 	      { return const_reverse_iterator(this->begin()); }
3859 	
3860 	#if __cplusplus >= 201103L
3861 	      /**
3862 	       *  Returns a read-only (constant) iterator that points to the first
3863 	       *  character in the %string.
3864 	       */
3865 	      const_iterator
3866 	      cbegin() const noexcept
3867 	      { return const_iterator(this->_M_data()); }
3868 	
3869 	      /**
3870 	       *  Returns a read-only (constant) iterator that points one past the
3871 	       *  last character in the %string.
3872 	       */
3873 	      const_iterator
3874 	      cend() const noexcept
3875 	      { return const_iterator(this->_M_data() + this->size()); }
3876 	
3877 	      /**
3878 	       *  Returns a read-only (constant) reverse iterator that points
3879 	       *  to the last character in the %string.  Iteration is done in
3880 	       *  reverse element order.
3881 	       */
3882 	      const_reverse_iterator
3883 	      crbegin() const noexcept
3884 	      { return const_reverse_iterator(this->end()); }
3885 	
3886 	      /**
3887 	       *  Returns a read-only (constant) reverse iterator that points
3888 	       *  to one before the first character in the %string.  Iteration
3889 	       *  is done in reverse element order.
3890 	       */
3891 	      const_reverse_iterator
3892 	      crend() const noexcept
3893 	      { return const_reverse_iterator(this->begin()); }
3894 	#endif
3895 	
3896 	    public:
3897 	      // Capacity:
3898 	      ///  Returns the number of characters in the string, not including any
3899 	      ///  null-termination.
3900 	      size_type
3901 	      size() const _GLIBCXX_NOEXCEPT
3902 	      { return _M_rep()->_M_length; }
3903 	
3904 	      ///  Returns the number of characters in the string, not including any
3905 	      ///  null-termination.
3906 	      size_type
3907 	      length() const _GLIBCXX_NOEXCEPT
3908 	      { return _M_rep()->_M_length; }
3909 	
3910 	      ///  Returns the size() of the largest possible %string.
3911 	      size_type
3912 	      max_size() const _GLIBCXX_NOEXCEPT
3913 	      { return _Rep::_S_max_size; }
3914 	
3915 	      /**
3916 	       *  @brief  Resizes the %string to the specified number of characters.
3917 	       *  @param  __n  Number of characters the %string should contain.
3918 	       *  @param  __c  Character to fill any new elements.
3919 	       *
3920 	       *  This function will %resize the %string to the specified
3921 	       *  number of characters.  If the number is smaller than the
3922 	       *  %string's current size the %string is truncated, otherwise
3923 	       *  the %string is extended and new elements are %set to @a __c.
3924 	       */
3925 	      void
3926 	      resize(size_type __n, _CharT __c);
3927 	
3928 	      /**
3929 	       *  @brief  Resizes the %string to the specified number of characters.
3930 	       *  @param  __n  Number of characters the %string should contain.
3931 	       *
3932 	       *  This function will resize the %string to the specified length.  If
3933 	       *  the new size is smaller than the %string's current size the %string
3934 	       *  is truncated, otherwise the %string is extended and new characters
3935 	       *  are default-constructed.  For basic types such as char, this means
3936 	       *  setting them to 0.
3937 	       */
3938 	      void
3939 	      resize(size_type __n)
3940 	      { this->resize(__n, _CharT()); }
3941 	
3942 	#if __cplusplus >= 201103L
3943 	      ///  A non-binding request to reduce capacity() to size().
3944 	      void
3945 	      shrink_to_fit() _GLIBCXX_NOEXCEPT
3946 	      {
3947 	#if __cpp_exceptions
3948 		if (capacity() > size())
3949 		  {
3950 		    try
3951 		      { reserve(0); }
3952 		    catch(...)
3953 		      { }
3954 		  }
3955 	#endif
3956 	      }
3957 	#endif
3958 	
3959 	      /**
3960 	       *  Returns the total number of characters that the %string can hold
3961 	       *  before needing to allocate more memory.
3962 	       */
3963 	      size_type
3964 	      capacity() const _GLIBCXX_NOEXCEPT
3965 	      { return _M_rep()->_M_capacity; }
3966 	
3967 	      /**
3968 	       *  @brief  Attempt to preallocate enough memory for specified number of
3969 	       *          characters.
3970 	       *  @param  __res_arg  Number of characters required.
3971 	       *  @throw  std::length_error  If @a __res_arg exceeds @c max_size().
3972 	       *
3973 	       *  This function attempts to reserve enough memory for the
3974 	       *  %string to hold the specified number of characters.  If the
3975 	       *  number requested is more than max_size(), length_error is
3976 	       *  thrown.
3977 	       *
3978 	       *  The advantage of this function is that if optimal code is a
3979 	       *  necessity and the user can determine the string length that will be
3980 	       *  required, the user can reserve the memory in %advance, and thus
3981 	       *  prevent a possible reallocation of memory and copying of %string
3982 	       *  data.
3983 	       */
3984 	      void
3985 	      reserve(size_type __res_arg = 0);
3986 	
3987 	      /**
3988 	       *  Erases the string, making it empty.
3989 	       */
3990 	#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
3991 	      void
3992 	      clear() _GLIBCXX_NOEXCEPT
3993 	      {
3994 		if (_M_rep()->_M_is_shared())
3995 		  {
3996 		    _M_rep()->_M_dispose(this->get_allocator());
3997 		    _M_data(_S_empty_rep()._M_refdata());
3998 		  }
3999 		else
4000 		  _M_rep()->_M_set_length_and_sharable(0);
4001 	      }
4002 	#else
4003 	      // PR 56166: this should not throw.
4004 	      void
4005 	      clear()
4006 	      { _M_mutate(0, this->size(), 0); }
4007 	#endif
4008 	
4009 	      /**
4010 	       *  Returns true if the %string is empty.  Equivalent to 
4011 	       *  <code>*this == ""</code>.
4012 	       */
4013 	      _GLIBCXX_NODISCARD bool
4014 	      empty() const _GLIBCXX_NOEXCEPT
4015 	      { return this->size() == 0; }
4016 	
4017 	      // Element access:
4018 	      /**
4019 	       *  @brief  Subscript access to the data contained in the %string.
4020 	       *  @param  __pos  The index of the character to access.
4021 	       *  @return  Read-only (constant) reference to the character.
4022 	       *
4023 	       *  This operator allows for easy, array-style, data access.
4024 	       *  Note that data access with this operator is unchecked and
4025 	       *  out_of_range lookups are not defined. (For checked lookups
4026 	       *  see at().)
4027 	       */
4028 	      const_reference
4029 	      operator[] (size_type __pos) const _GLIBCXX_NOEXCEPT
4030 	      {
4031 		__glibcxx_assert(__pos <= size());
4032 		return _M_data()[__pos];
4033 	      }
4034 	
4035 	      /**
4036 	       *  @brief  Subscript access to the data contained in the %string.
4037 	       *  @param  __pos  The index of the character to access.
4038 	       *  @return  Read/write reference to the character.
4039 	       *
4040 	       *  This operator allows for easy, array-style, data access.
4041 	       *  Note that data access with this operator is unchecked and
4042 	       *  out_of_range lookups are not defined. (For checked lookups
4043 	       *  see at().)  Unshares the string.
4044 	       */
4045 	      reference
4046 	      operator[](size_type __pos)
4047 	      {
4048 	        // Allow pos == size() both in C++98 mode, as v3 extension,
4049 		// and in C++11 mode.
4050 		__glibcxx_assert(__pos <= size());
4051 	        // In pedantic mode be strict in C++98 mode.
4052 		_GLIBCXX_DEBUG_PEDASSERT(__cplusplus >= 201103L || __pos < size());
4053 		_M_leak();
4054 		return _M_data()[__pos];
4055 	      }
4056 	
4057 	      /**
4058 	       *  @brief  Provides access to the data contained in the %string.
4059 	       *  @param __n The index of the character to access.
4060 	       *  @return  Read-only (const) reference to the character.
4061 	       *  @throw  std::out_of_range  If @a n is an invalid index.
4062 	       *
4063 	       *  This function provides for safer data access.  The parameter is
4064 	       *  first checked that it is in the range of the string.  The function
4065 	       *  throws out_of_range if the check fails.
4066 	       */
4067 	      const_reference
4068 	      at(size_type __n) const
4069 	      {
4070 		if (__n >= this->size())
4071 		  __throw_out_of_range_fmt(__N("basic_string::at: __n "
4072 					       "(which is %zu) >= this->size() "
4073 					       "(which is %zu)"),
4074 					   __n, this->size());
4075 		return _M_data()[__n];
4076 	      }
4077 	
4078 	      /**
4079 	       *  @brief  Provides access to the data contained in the %string.
4080 	       *  @param __n The index of the character to access.
4081 	       *  @return  Read/write reference to the character.
4082 	       *  @throw  std::out_of_range  If @a n is an invalid index.
4083 	       *
4084 	       *  This function provides for safer data access.  The parameter is
4085 	       *  first checked that it is in the range of the string.  The function
4086 	       *  throws out_of_range if the check fails.  Success results in
4087 	       *  unsharing the string.
4088 	       */
4089 	      reference
4090 	      at(size_type __n)
4091 	      {
4092 		if (__n >= size())
4093 		  __throw_out_of_range_fmt(__N("basic_string::at: __n "
4094 					       "(which is %zu) >= this->size() "
4095 					       "(which is %zu)"),
4096 					   __n, this->size());
4097 		_M_leak();
4098 		return _M_data()[__n];
4099 	      }
4100 	
4101 	#if __cplusplus >= 201103L
4102 	      /**
4103 	       *  Returns a read/write reference to the data at the first
4104 	       *  element of the %string.
4105 	       */
4106 	      reference
4107 	      front()
4108 	      {
4109 		__glibcxx_assert(!empty());
4110 		return operator[](0);
4111 	      }
4112 	
4113 	      /**
4114 	       *  Returns a read-only (constant) reference to the data at the first
4115 	       *  element of the %string.
4116 	       */
4117 	      const_reference
4118 	      front() const noexcept
4119 	      {
4120 		__glibcxx_assert(!empty());
4121 		return operator[](0);
4122 	      }
4123 	
4124 	      /**
4125 	       *  Returns a read/write reference to the data at the last
4126 	       *  element of the %string.
4127 	       */
4128 	      reference
4129 	      back()
4130 	      {
4131 		__glibcxx_assert(!empty());
4132 		return operator[](this->size() - 1);
4133 	      }
4134 	
4135 	      /**
4136 	       *  Returns a read-only (constant) reference to the data at the
4137 	       *  last element of the %string.
4138 	       */
4139 	      const_reference
4140 	      back() const noexcept
4141 	      {
4142 		__glibcxx_assert(!empty());
4143 		return operator[](this->size() - 1);
4144 	      }
4145 	#endif
4146 	
4147 	      // Modifiers:
4148 	      /**
4149 	       *  @brief  Append a string to this string.
4150 	       *  @param __str  The string to append.
4151 	       *  @return  Reference to this string.
4152 	       */
4153 	      basic_string&
4154 	      operator+=(const basic_string& __str)
4155 	      { return this->append(__str); }
4156 	
4157 	      /**
4158 	       *  @brief  Append a C string.
4159 	       *  @param __s  The C string to append.
4160 	       *  @return  Reference to this string.
4161 	       */
4162 	      basic_string&
4163 	      operator+=(const _CharT* __s)
4164 	      { return this->append(__s); }
4165 	
4166 	      /**
4167 	       *  @brief  Append a character.
4168 	       *  @param __c  The character to append.
4169 	       *  @return  Reference to this string.
4170 	       */
4171 	      basic_string&
4172 	      operator+=(_CharT __c)
4173 	      { 
4174 		this->push_back(__c);
4175 		return *this;
4176 	      }
4177 	
4178 	#if __cplusplus >= 201103L
4179 	      /**
4180 	       *  @brief  Append an initializer_list of characters.
4181 	       *  @param __l  The initializer_list of characters to be appended.
4182 	       *  @return  Reference to this string.
4183 	       */
4184 	      basic_string&
4185 	      operator+=(initializer_list<_CharT> __l)
4186 	      { return this->append(__l.begin(), __l.size()); }
4187 	#endif // C++11
4188 	
4189 	#if __cplusplus >= 201703L
4190 	      /**
4191 	       *  @brief  Append a string_view.
4192 	       *  @param __svt The object convertible to string_view to be appended.
4193 	       *  @return  Reference to this string.
4194 	       */
4195 	      template<typename _Tp>
4196 		_If_sv<_Tp, basic_string&>
4197 		operator+=(const _Tp& __svt)
4198 		{ return this->append(__svt); }
4199 	#endif // C++17
4200 	
4201 	      /**
4202 	       *  @brief  Append a string to this string.
4203 	       *  @param __str  The string to append.
4204 	       *  @return  Reference to this string.
4205 	       */
4206 	      basic_string&
4207 	      append(const basic_string& __str);
4208 	
4209 	      /**
4210 	       *  @brief  Append a substring.
4211 	       *  @param __str  The string to append.
4212 	       *  @param __pos  Index of the first character of str to append.
4213 	       *  @param __n  The number of characters to append.
4214 	       *  @return  Reference to this string.
4215 	       *  @throw  std::out_of_range if @a __pos is not a valid index.
4216 	       *
4217 	       *  This function appends @a __n characters from @a __str
4218 	       *  starting at @a __pos to this string.  If @a __n is is larger
4219 	       *  than the number of available characters in @a __str, the
4220 	       *  remainder of @a __str is appended.
4221 	       */
4222 	      basic_string&
4223 	      append(const basic_string& __str, size_type __pos, size_type __n = npos);
4224 	
4225 	      /**
4226 	       *  @brief  Append a C substring.
4227 	       *  @param __s  The C string to append.
4228 	       *  @param __n  The number of characters to append.
4229 	       *  @return  Reference to this string.
4230 	       */
4231 	      basic_string&
4232 	      append(const _CharT* __s, size_type __n);
4233 	
4234 	      /**
4235 	       *  @brief  Append a C string.
4236 	       *  @param __s  The C string to append.
4237 	       *  @return  Reference to this string.
4238 	       */
4239 	      basic_string&
4240 	      append(const _CharT* __s)
4241 	      {
4242 		__glibcxx_requires_string(__s);
4243 		return this->append(__s, traits_type::length(__s));
4244 	      }
4245 	
4246 	      /**
4247 	       *  @brief  Append multiple characters.
4248 	       *  @param __n  The number of characters to append.
4249 	       *  @param __c  The character to use.
4250 	       *  @return  Reference to this string.
4251 	       *
4252 	       *  Appends __n copies of __c to this string.
4253 	       */
4254 	      basic_string&
4255 	      append(size_type __n, _CharT __c);
4256 	
4257 	#if __cplusplus >= 201103L
4258 	      /**
4259 	       *  @brief  Append an initializer_list of characters.
4260 	       *  @param __l  The initializer_list of characters to append.
4261 	       *  @return  Reference to this string.
4262 	       */
4263 	      basic_string&
4264 	      append(initializer_list<_CharT> __l)
4265 	      { return this->append(__l.begin(), __l.size()); }
4266 	#endif // C++11
4267 	
4268 	      /**
4269 	       *  @brief  Append a range of characters.
4270 	       *  @param __first  Iterator referencing the first character to append.
4271 	       *  @param __last  Iterator marking the end of the range.
4272 	       *  @return  Reference to this string.
4273 	       *
4274 	       *  Appends characters in the range [__first,__last) to this string.
4275 	       */
4276 	      template<class _InputIterator>
4277 	        basic_string&
4278 	        append(_InputIterator __first, _InputIterator __last)
4279 	        { return this->replace(_M_iend(), _M_iend(), __first, __last); }
4280 	
4281 	#if __cplusplus >= 201703L
4282 	      /**
4283 	       *  @brief  Append a string_view.
4284 	       *  @param __svt The object convertible to string_view to be appended.
4285 	       *  @return  Reference to this string.
4286 	       */
4287 	      template<typename _Tp>
4288 		_If_sv<_Tp, basic_string&>
4289 		append(const _Tp& __svt)
4290 		{
4291 		  __sv_type __sv = __svt;
4292 		  return this->append(__sv.data(), __sv.size());
4293 		}
4294 	
4295 	      /**
4296 	       *  @brief  Append a range of characters from a string_view.
4297 	       *  @param __svt The object convertible to string_view to be appended
4298 	       *               from.
4299 	       *  @param __pos The position in the string_view to append from.
4300 	       *  @param __n   The number of characters to append from the string_view.
4301 	       *  @return  Reference to this string.
4302 	       */
4303 	      template<typename _Tp>
4304 	        _If_sv<_Tp, basic_string&>
4305 		append(const _Tp& __svt, size_type __pos, size_type __n = npos)
4306 		{
4307 		  __sv_type __sv = __svt;
4308 		  return append(__sv.data()
4309 		      + std::__sv_check(__sv.size(), __pos, "basic_string::append"),
4310 		      std::__sv_limit(__sv.size(), __pos, __n));
4311 		}
4312 	#endif // C++17
4313 	
4314 	      /**
4315 	       *  @brief  Append a single character.
4316 	       *  @param __c  Character to append.
4317 	       */
4318 	      void
4319 	      push_back(_CharT __c)
4320 	      { 
4321 		const size_type __len = 1 + this->size();
4322 		if (__len > this->capacity() || _M_rep()->_M_is_shared())
4323 		  this->reserve(__len);
4324 		traits_type::assign(_M_data()[this->size()], __c);
4325 		_M_rep()->_M_set_length_and_sharable(__len);
4326 	      }
4327 	
4328 	      /**
4329 	       *  @brief  Set value to contents of another string.
4330 	       *  @param  __str  Source string to use.
4331 	       *  @return  Reference to this string.
4332 	       */
4333 	      basic_string&
4334 	      assign(const basic_string& __str);
4335 	
4336 	#if __cplusplus >= 201103L
4337 	      /**
4338 	       *  @brief  Set value to contents of another string.
4339 	       *  @param  __str  Source string to use.
4340 	       *  @return  Reference to this string.
4341 	       *
4342 	       *  This function sets this string to the exact contents of @a __str.
4343 	       *  @a __str is a valid, but unspecified string.
4344 	       */
4345 	      basic_string&
4346 	      assign(basic_string&& __str)
4347 	      noexcept(allocator_traits<_Alloc>::is_always_equal::value)
4348 	      {
4349 		this->swap(__str);
4350 		return *this;
4351 	      }
4352 	#endif // C++11
4353 	
4354 	      /**
4355 	       *  @brief  Set value to a substring of a string.
4356 	       *  @param __str  The string to use.
4357 	       *  @param __pos  Index of the first character of str.
4358 	       *  @param __n  Number of characters to use.
4359 	       *  @return  Reference to this string.
4360 	       *  @throw  std::out_of_range if @a pos is not a valid index.
4361 	       *
4362 	       *  This function sets this string to the substring of @a __str
4363 	       *  consisting of @a __n characters at @a __pos.  If @a __n is
4364 	       *  is larger than the number of available characters in @a
4365 	       *  __str, the remainder of @a __str is used.
4366 	       */
4367 	      basic_string&
4368 	      assign(const basic_string& __str, size_type __pos, size_type __n = npos)
4369 	      { return this->assign(__str._M_data()
4370 				    + __str._M_check(__pos, "basic_string::assign"),
4371 				    __str._M_limit(__pos, __n)); }
4372 	
4373 	      /**
4374 	       *  @brief  Set value to a C substring.
4375 	       *  @param __s  The C string to use.
4376 	       *  @param __n  Number of characters to use.
4377 	       *  @return  Reference to this string.
4378 	       *
4379 	       *  This function sets the value of this string to the first @a __n
4380 	       *  characters of @a __s.  If @a __n is is larger than the number of
4381 	       *  available characters in @a __s, the remainder of @a __s is used.
4382 	       */
4383 	      basic_string&
4384 	      assign(const _CharT* __s, size_type __n);
4385 	
4386 	      /**
4387 	       *  @brief  Set value to contents of a C string.
4388 	       *  @param __s  The C string to use.
4389 	       *  @return  Reference to this string.
4390 	       *
4391 	       *  This function sets the value of this string to the value of @a __s.
4392 	       *  The data is copied, so there is no dependence on @a __s once the
4393 	       *  function returns.
4394 	       */
4395 	      basic_string&
4396 	      assign(const _CharT* __s)
4397 	      {
4398 		__glibcxx_requires_string(__s);
4399 		return this->assign(__s, traits_type::length(__s));
4400 	      }
4401 	
4402 	      /**
4403 	       *  @brief  Set value to multiple characters.
4404 	       *  @param __n  Length of the resulting string.
4405 	       *  @param __c  The character to use.
4406 	       *  @return  Reference to this string.
4407 	       *
4408 	       *  This function sets the value of this string to @a __n copies of
4409 	       *  character @a __c.
4410 	       */
4411 	      basic_string&
4412 	      assign(size_type __n, _CharT __c)
4413 	      { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
4414 	
4415 	      /**
4416 	       *  @brief  Set value to a range of characters.
4417 	       *  @param __first  Iterator referencing the first character to append.
4418 	       *  @param __last  Iterator marking the end of the range.
4419 	       *  @return  Reference to this string.
4420 	       *
4421 	       *  Sets value of string to characters in the range [__first,__last).
4422 	      */
4423 	      template<class _InputIterator>
4424 	        basic_string&
4425 	        assign(_InputIterator __first, _InputIterator __last)
4426 	        { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
4427 	
4428 	#if __cplusplus >= 201103L
4429 	      /**
4430 	       *  @brief  Set value to an initializer_list of characters.
4431 	       *  @param __l  The initializer_list of characters to assign.
4432 	       *  @return  Reference to this string.
4433 	       */
4434 	      basic_string&
4435 	      assign(initializer_list<_CharT> __l)
4436 	      { return this->assign(__l.begin(), __l.size()); }
4437 	#endif // C++11
4438 	
4439 	#if __cplusplus >= 201703L
4440 	      /**
4441 	       *  @brief  Set value from a string_view.
4442 	       *  @param __svt The source object convertible to string_view.
4443 	       *  @return  Reference to this string.
4444 	       */
4445 	      template<typename _Tp>
4446 		_If_sv<_Tp, basic_string&>
4447 		assign(const _Tp& __svt)
4448 		{
4449 		  __sv_type __sv = __svt;
4450 		  return this->assign(__sv.data(), __sv.size());
4451 		}
4452 	
4453 	      /**
4454 	       *  @brief  Set value from a range of characters in a string_view.
4455 	       *  @param __svt  The source object convertible to string_view.
4456 	       *  @param __pos  The position in the string_view to assign from.
4457 	       *  @param __n  The number of characters to assign.
4458 	       *  @return  Reference to this string.
4459 	       */
4460 	      template<typename _Tp>
4461 	        _If_sv<_Tp, basic_string&>
4462 	        assign(const _Tp& __svt, size_type __pos, size_type __n = npos)
4463 		{
4464 		  __sv_type __sv = __svt;
4465 		  return assign(__sv.data()
4466 		      + std::__sv_check(__sv.size(), __pos, "basic_string::assign"),
4467 		      std::__sv_limit(__sv.size(), __pos, __n));
4468 		}
4469 	#endif // C++17
4470 	
4471 	      /**
4472 	       *  @brief  Insert multiple characters.
4473 	       *  @param __p  Iterator referencing location in string to insert at.
4474 	       *  @param __n  Number of characters to insert
4475 	       *  @param __c  The character to insert.
4476 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4477 	       *
4478 	       *  Inserts @a __n copies of character @a __c starting at the
4479 	       *  position referenced by iterator @a __p.  If adding
4480 	       *  characters causes the length to exceed max_size(),
4481 	       *  length_error is thrown.  The value of the string doesn't
4482 	       *  change if an error is thrown.
4483 	      */
4484 	      void
4485 	      insert(iterator __p, size_type __n, _CharT __c)
4486 	      {	this->replace(__p, __p, __n, __c);  }
4487 	
4488 	      /**
4489 	       *  @brief  Insert a range of characters.
4490 	       *  @param __p  Iterator referencing location in string to insert at.
4491 	       *  @param __beg  Start of range.
4492 	       *  @param __end  End of range.
4493 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4494 	       *
4495 	       *  Inserts characters in range [__beg,__end).  If adding
4496 	       *  characters causes the length to exceed max_size(),
4497 	       *  length_error is thrown.  The value of the string doesn't
4498 	       *  change if an error is thrown.
4499 	      */
4500 	      template<class _InputIterator>
4501 	        void
4502 	        insert(iterator __p, _InputIterator __beg, _InputIterator __end)
4503 	        { this->replace(__p, __p, __beg, __end); }
4504 	
4505 	#if __cplusplus >= 201103L
4506 	      /**
4507 	       *  @brief  Insert an initializer_list of characters.
4508 	       *  @param __p  Iterator referencing location in string to insert at.
4509 	       *  @param __l  The initializer_list of characters to insert.
4510 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4511 	       */
4512 	      void
4513 	      insert(iterator __p, initializer_list<_CharT> __l)
4514 	      {
4515 		_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
4516 		this->insert(__p - _M_ibegin(), __l.begin(), __l.size());
4517 	      }
4518 	#endif // C++11
4519 	
4520 	      /**
4521 	       *  @brief  Insert value of a string.
4522 	       *  @param __pos1  Iterator referencing location in string to insert at.
4523 	       *  @param __str  The string to insert.
4524 	       *  @return  Reference to this string.
4525 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4526 	       *
4527 	       *  Inserts value of @a __str starting at @a __pos1.  If adding
4528 	       *  characters causes the length to exceed max_size(),
4529 	       *  length_error is thrown.  The value of the string doesn't
4530 	       *  change if an error is thrown.
4531 	      */
4532 	      basic_string&
4533 	      insert(size_type __pos1, const basic_string& __str)
4534 	      { return this->insert(__pos1, __str, size_type(0), __str.size()); }
4535 	
4536 	      /**
4537 	       *  @brief  Insert a substring.
4538 	       *  @param __pos1  Iterator referencing location in string to insert at.
4539 	       *  @param __str  The string to insert.
4540 	       *  @param __pos2  Start of characters in str to insert.
4541 	       *  @param __n  Number of characters to insert.
4542 	       *  @return  Reference to this string.
4543 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4544 	       *  @throw  std::out_of_range  If @a pos1 > size() or
4545 	       *  @a __pos2 > @a str.size().
4546 	       *
4547 	       *  Starting at @a pos1, insert @a __n character of @a __str
4548 	       *  beginning with @a __pos2.  If adding characters causes the
4549 	       *  length to exceed max_size(), length_error is thrown.  If @a
4550 	       *  __pos1 is beyond the end of this string or @a __pos2 is
4551 	       *  beyond the end of @a __str, out_of_range is thrown.  The
4552 	       *  value of the string doesn't change if an error is thrown.
4553 	      */
4554 	      basic_string&
4555 	      insert(size_type __pos1, const basic_string& __str,
4556 		     size_type __pos2, size_type __n = npos)
4557 	      { return this->insert(__pos1, __str._M_data()
4558 				    + __str._M_check(__pos2, "basic_string::insert"),
4559 				    __str._M_limit(__pos2, __n)); }
4560 	
4561 	      /**
4562 	       *  @brief  Insert a C substring.
4563 	       *  @param __pos  Iterator referencing location in string to insert at.
4564 	       *  @param __s  The C string to insert.
4565 	       *  @param __n  The number of characters to insert.
4566 	       *  @return  Reference to this string.
4567 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4568 	       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
4569 	       *  string.
4570 	       *
4571 	       *  Inserts the first @a __n characters of @a __s starting at @a
4572 	       *  __pos.  If adding characters causes the length to exceed
4573 	       *  max_size(), length_error is thrown.  If @a __pos is beyond
4574 	       *  end(), out_of_range is thrown.  The value of the string
4575 	       *  doesn't change if an error is thrown.
4576 	      */
4577 	      basic_string&
4578 	      insert(size_type __pos, const _CharT* __s, size_type __n);
4579 	
4580 	      /**
4581 	       *  @brief  Insert a C string.
4582 	       *  @param __pos  Iterator referencing location in string to insert at.
4583 	       *  @param __s  The C string to insert.
4584 	       *  @return  Reference to this string.
4585 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4586 	       *  @throw  std::out_of_range  If @a pos is beyond the end of this
4587 	       *  string.
4588 	       *
4589 	       *  Inserts the first @a n characters of @a __s starting at @a __pos.  If
4590 	       *  adding characters causes the length to exceed max_size(),
4591 	       *  length_error is thrown.  If @a __pos is beyond end(), out_of_range is
4592 	       *  thrown.  The value of the string doesn't change if an error is
4593 	       *  thrown.
4594 	      */
4595 	      basic_string&
4596 	      insert(size_type __pos, const _CharT* __s)
4597 	      {
4598 		__glibcxx_requires_string(__s);
4599 		return this->insert(__pos, __s, traits_type::length(__s));
4600 	      }
4601 	
4602 	      /**
4603 	       *  @brief  Insert multiple characters.
4604 	       *  @param __pos  Index in string to insert at.
4605 	       *  @param __n  Number of characters to insert
4606 	       *  @param __c  The character to insert.
4607 	       *  @return  Reference to this string.
4608 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4609 	       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
4610 	       *  string.
4611 	       *
4612 	       *  Inserts @a __n copies of character @a __c starting at index
4613 	       *  @a __pos.  If adding characters causes the length to exceed
4614 	       *  max_size(), length_error is thrown.  If @a __pos > length(),
4615 	       *  out_of_range is thrown.  The value of the string doesn't
4616 	       *  change if an error is thrown.
4617 	      */
4618 	      basic_string&
4619 	      insert(size_type __pos, size_type __n, _CharT __c)
4620 	      { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
4621 				      size_type(0), __n, __c); }
4622 	
4623 	      /**
4624 	       *  @brief  Insert one character.
4625 	       *  @param __p  Iterator referencing position in string to insert at.
4626 	       *  @param __c  The character to insert.
4627 	       *  @return  Iterator referencing newly inserted char.
4628 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4629 	       *
4630 	       *  Inserts character @a __c at position referenced by @a __p.
4631 	       *  If adding character causes the length to exceed max_size(),
4632 	       *  length_error is thrown.  If @a __p is beyond end of string,
4633 	       *  out_of_range is thrown.  The value of the string doesn't
4634 	       *  change if an error is thrown.
4635 	      */
4636 	      iterator
4637 	      insert(iterator __p, _CharT __c)
4638 	      {
4639 		_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
4640 		const size_type __pos = __p - _M_ibegin();
4641 		_M_replace_aux(__pos, size_type(0), size_type(1), __c);
4642 		_M_rep()->_M_set_leaked();
4643 		return iterator(_M_data() + __pos);
4644 	      }
4645 	
4646 	#if __cplusplus >= 201703L
4647 	      /**
4648 	       *  @brief  Insert a string_view.
4649 	       *  @param __pos  Iterator referencing position in string to insert at.
4650 	       *  @param __svt  The object convertible to string_view to insert.
4651 	       *  @return  Reference to this string.
4652 	      */
4653 	      template<typename _Tp>
4654 		_If_sv<_Tp, basic_string&>
4655 		insert(size_type __pos, const _Tp& __svt)
4656 		{
4657 		  __sv_type __sv = __svt;
4658 		  return this->insert(__pos, __sv.data(), __sv.size());
4659 		}
4660 	
4661 	      /**
4662 	       *  @brief  Insert a string_view.
4663 	       *  @param __pos  Iterator referencing position in string to insert at.
4664 	       *  @param __svt  The object convertible to string_view to insert from.
4665 	       *  @param __pos  Iterator referencing position in string_view to insert
4666 	       *  from.
4667 	       *  @param __n    The number of characters to insert.
4668 	       *  @return  Reference to this string.
4669 	      */
4670 	      template<typename _Tp>
4671 	        _If_sv<_Tp, basic_string&>
4672 	        insert(size_type __pos1, const _Tp& __svt,
4673 		       size_type __pos2, size_type __n = npos)
4674 		{
4675 		  __sv_type __sv = __svt;
4676 		  return this->replace(__pos1, size_type(0), __sv.data()
4677 		      + std::__sv_check(__sv.size(), __pos2, "basic_string::insert"),
4678 		      std::__sv_limit(__sv.size(), __pos2, __n));
4679 		}
4680 	#endif // C++17
4681 	
4682 	      /**
4683 	       *  @brief  Remove characters.
4684 	       *  @param __pos  Index of first character to remove (default 0).
4685 	       *  @param __n  Number of characters to remove (default remainder).
4686 	       *  @return  Reference to this string.
4687 	       *  @throw  std::out_of_range  If @a pos is beyond the end of this
4688 	       *  string.
4689 	       *
4690 	       *  Removes @a __n characters from this string starting at @a
4691 	       *  __pos.  The length of the string is reduced by @a __n.  If
4692 	       *  there are < @a __n characters to remove, the remainder of
4693 	       *  the string is truncated.  If @a __p is beyond end of string,
4694 	       *  out_of_range is thrown.  The value of the string doesn't
4695 	       *  change if an error is thrown.
4696 	      */
4697 	      basic_string&
4698 	      erase(size_type __pos = 0, size_type __n = npos)
4699 	      { 
4700 		_M_mutate(_M_check(__pos, "basic_string::erase"),
4701 			  _M_limit(__pos, __n), size_type(0));
4702 		return *this;
4703 	      }
4704 	
4705 	      /**
4706 	       *  @brief  Remove one character.
4707 	       *  @param __position  Iterator referencing the character to remove.
4708 	       *  @return  iterator referencing same location after removal.
4709 	       *
4710 	       *  Removes the character at @a __position from this string. The value
4711 	       *  of the string doesn't change if an error is thrown.
4712 	      */
4713 	      iterator
4714 	      erase(iterator __position)
4715 	      {
4716 		_GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
4717 					 && __position < _M_iend());
4718 		const size_type __pos = __position - _M_ibegin();
4719 		_M_mutate(__pos, size_type(1), size_type(0));
4720 		_M_rep()->_M_set_leaked();
4721 		return iterator(_M_data() + __pos);
4722 	      }
4723 	
4724 	      /**
4725 	       *  @brief  Remove a range of characters.
4726 	       *  @param __first  Iterator referencing the first character to remove.
4727 	       *  @param __last  Iterator referencing the end of the range.
4728 	       *  @return  Iterator referencing location of first after removal.
4729 	       *
4730 	       *  Removes the characters in the range [first,last) from this string.
4731 	       *  The value of the string doesn't change if an error is thrown.
4732 	      */
4733 	      iterator
4734 	      erase(iterator __first, iterator __last);
4735 	 
4736 	#if __cplusplus >= 201103L
4737 	      /**
4738 	       *  @brief  Remove the last character.
4739 	       *
4740 	       *  The string must be non-empty.
4741 	       */
4742 	      void
4743 	      pop_back() // FIXME C++11: should be noexcept.
4744 	      {
4745 		__glibcxx_assert(!empty());
4746 		erase(size() - 1, 1);
4747 	      }
4748 	#endif // C++11
4749 	
4750 	      /**
4751 	       *  @brief  Replace characters with value from another string.
4752 	       *  @param __pos  Index of first character to replace.
4753 	       *  @param __n  Number of characters to be replaced.
4754 	       *  @param __str  String to insert.
4755 	       *  @return  Reference to this string.
4756 	       *  @throw  std::out_of_range  If @a pos is beyond the end of this
4757 	       *  string.
4758 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4759 	       *
4760 	       *  Removes the characters in the range [__pos,__pos+__n) from
4761 	       *  this string.  In place, the value of @a __str is inserted.
4762 	       *  If @a __pos is beyond end of string, out_of_range is thrown.
4763 	       *  If the length of the result exceeds max_size(), length_error
4764 	       *  is thrown.  The value of the string doesn't change if an
4765 	       *  error is thrown.
4766 	      */
4767 	      basic_string&
4768 	      replace(size_type __pos, size_type __n, const basic_string& __str)
4769 	      { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
4770 	
4771 	      /**
4772 	       *  @brief  Replace characters with value from another string.
4773 	       *  @param __pos1  Index of first character to replace.
4774 	       *  @param __n1  Number of characters to be replaced.
4775 	       *  @param __str  String to insert.
4776 	       *  @param __pos2  Index of first character of str to use.
4777 	       *  @param __n2  Number of characters from str to use.
4778 	       *  @return  Reference to this string.
4779 	       *  @throw  std::out_of_range  If @a __pos1 > size() or @a __pos2 >
4780 	       *  __str.size().
4781 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4782 	       *
4783 	       *  Removes the characters in the range [__pos1,__pos1 + n) from this
4784 	       *  string.  In place, the value of @a __str is inserted.  If @a __pos is
4785 	       *  beyond end of string, out_of_range is thrown.  If the length of the
4786 	       *  result exceeds max_size(), length_error is thrown.  The value of the
4787 	       *  string doesn't change if an error is thrown.
4788 	      */
4789 	      basic_string&
4790 	      replace(size_type __pos1, size_type __n1, const basic_string& __str,
4791 		      size_type __pos2, size_type __n2 = npos)
4792 	      { return this->replace(__pos1, __n1, __str._M_data()
4793 				     + __str._M_check(__pos2, "basic_string::replace"),
4794 				     __str._M_limit(__pos2, __n2)); }
4795 	
4796 	      /**
4797 	       *  @brief  Replace characters with value of a C substring.
4798 	       *  @param __pos  Index of first character to replace.
4799 	       *  @param __n1  Number of characters to be replaced.
4800 	       *  @param __s  C string to insert.
4801 	       *  @param __n2  Number of characters from @a s to use.
4802 	       *  @return  Reference to this string.
4803 	       *  @throw  std::out_of_range  If @a pos1 > size().
4804 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4805 	       *
4806 	       *  Removes the characters in the range [__pos,__pos + __n1)
4807 	       *  from this string.  In place, the first @a __n2 characters of
4808 	       *  @a __s are inserted, or all of @a __s if @a __n2 is too large.  If
4809 	       *  @a __pos is beyond end of string, out_of_range is thrown.  If
4810 	       *  the length of result exceeds max_size(), length_error is
4811 	       *  thrown.  The value of the string doesn't change if an error
4812 	       *  is thrown.
4813 	      */
4814 	      basic_string&
4815 	      replace(size_type __pos, size_type __n1, const _CharT* __s,
4816 		      size_type __n2);
4817 	
4818 	      /**
4819 	       *  @brief  Replace characters with value of a C string.
4820 	       *  @param __pos  Index of first character to replace.
4821 	       *  @param __n1  Number of characters to be replaced.
4822 	       *  @param __s  C string to insert.
4823 	       *  @return  Reference to this string.
4824 	       *  @throw  std::out_of_range  If @a pos > size().
4825 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4826 	       *
4827 	       *  Removes the characters in the range [__pos,__pos + __n1)
4828 	       *  from this string.  In place, the characters of @a __s are
4829 	       *  inserted.  If @a __pos is beyond end of string, out_of_range
4830 	       *  is thrown.  If the length of result exceeds max_size(),
4831 	       *  length_error is thrown.  The value of the string doesn't
4832 	       *  change if an error is thrown.
4833 	      */
4834 	      basic_string&
4835 	      replace(size_type __pos, size_type __n1, const _CharT* __s)
4836 	      {
4837 		__glibcxx_requires_string(__s);
4838 		return this->replace(__pos, __n1, __s, traits_type::length(__s));
4839 	      }
4840 	
4841 	      /**
4842 	       *  @brief  Replace characters with multiple characters.
4843 	       *  @param __pos  Index of first character to replace.
4844 	       *  @param __n1  Number of characters to be replaced.
4845 	       *  @param __n2  Number of characters to insert.
4846 	       *  @param __c  Character to insert.
4847 	       *  @return  Reference to this string.
4848 	       *  @throw  std::out_of_range  If @a __pos > size().
4849 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4850 	       *
4851 	       *  Removes the characters in the range [pos,pos + n1) from this
4852 	       *  string.  In place, @a __n2 copies of @a __c are inserted.
4853 	       *  If @a __pos is beyond end of string, out_of_range is thrown.
4854 	       *  If the length of result exceeds max_size(), length_error is
4855 	       *  thrown.  The value of the string doesn't change if an error
4856 	       *  is thrown.
4857 	      */
4858 	      basic_string&
4859 	      replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
4860 	      { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
4861 				      _M_limit(__pos, __n1), __n2, __c); }
4862 	
4863 	      /**
4864 	       *  @brief  Replace range of characters with string.
4865 	       *  @param __i1  Iterator referencing start of range to replace.
4866 	       *  @param __i2  Iterator referencing end of range to replace.
4867 	       *  @param __str  String value to insert.
4868 	       *  @return  Reference to this string.
4869 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4870 	       *
4871 	       *  Removes the characters in the range [__i1,__i2).  In place,
4872 	       *  the value of @a __str is inserted.  If the length of result
4873 	       *  exceeds max_size(), length_error is thrown.  The value of
4874 	       *  the string doesn't change if an error is thrown.
4875 	      */
4876 	      basic_string&
4877 	      replace(iterator __i1, iterator __i2, const basic_string& __str)
4878 	      { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
4879 	
4880 	      /**
4881 	       *  @brief  Replace range of characters with C substring.
4882 	       *  @param __i1  Iterator referencing start of range to replace.
4883 	       *  @param __i2  Iterator referencing end of range to replace.
4884 	       *  @param __s  C string value to insert.
4885 	       *  @param __n  Number of characters from s to insert.
4886 	       *  @return  Reference to this string.
4887 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4888 	       *
4889 	       *  Removes the characters in the range [__i1,__i2).  In place,
4890 	       *  the first @a __n characters of @a __s are inserted.  If the
4891 	       *  length of result exceeds max_size(), length_error is thrown.
4892 	       *  The value of the string doesn't change if an error is
4893 	       *  thrown.
4894 	      */
4895 	      basic_string&
4896 	      replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
4897 	      {
4898 		_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
4899 					 && __i2 <= _M_iend());
4900 		return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
4901 	      }
4902 	
4903 	      /**
4904 	       *  @brief  Replace range of characters with C string.
4905 	       *  @param __i1  Iterator referencing start of range to replace.
4906 	       *  @param __i2  Iterator referencing end of range to replace.
4907 	       *  @param __s  C string value to insert.
4908 	       *  @return  Reference to this string.
4909 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4910 	       *
4911 	       *  Removes the characters in the range [__i1,__i2).  In place,
4912 	       *  the characters of @a __s are inserted.  If the length of
4913 	       *  result exceeds max_size(), length_error is thrown.  The
4914 	       *  value of the string doesn't change if an error is thrown.
4915 	      */
4916 	      basic_string&
4917 	      replace(iterator __i1, iterator __i2, const _CharT* __s)
4918 	      {
4919 		__glibcxx_requires_string(__s);
4920 		return this->replace(__i1, __i2, __s, traits_type::length(__s));
4921 	      }
4922 	
4923 	      /**
4924 	       *  @brief  Replace range of characters with multiple characters
4925 	       *  @param __i1  Iterator referencing start of range to replace.
4926 	       *  @param __i2  Iterator referencing end of range to replace.
4927 	       *  @param __n  Number of characters to insert.
4928 	       *  @param __c  Character to insert.
4929 	       *  @return  Reference to this string.
4930 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4931 	       *
4932 	       *  Removes the characters in the range [__i1,__i2).  In place,
4933 	       *  @a __n copies of @a __c are inserted.  If the length of
4934 	       *  result exceeds max_size(), length_error is thrown.  The
4935 	       *  value of the string doesn't change if an error is thrown.
4936 	      */
4937 	      basic_string&
4938 	      replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
4939 	      {
4940 		_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
4941 					 && __i2 <= _M_iend());
4942 		return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
4943 	      }
4944 	
4945 	      /**
4946 	       *  @brief  Replace range of characters with range.
4947 	       *  @param __i1  Iterator referencing start of range to replace.
4948 	       *  @param __i2  Iterator referencing end of range to replace.
4949 	       *  @param __k1  Iterator referencing start of range to insert.
4950 	       *  @param __k2  Iterator referencing end of range to insert.
4951 	       *  @return  Reference to this string.
4952 	       *  @throw  std::length_error  If new length exceeds @c max_size().
4953 	       *
4954 	       *  Removes the characters in the range [__i1,__i2).  In place,
4955 	       *  characters in the range [__k1,__k2) are inserted.  If the
4956 	       *  length of result exceeds max_size(), length_error is thrown.
4957 	       *  The value of the string doesn't change if an error is
4958 	       *  thrown.
4959 	      */
4960 	      template<class _InputIterator>
4961 	        basic_string&
4962 	        replace(iterator __i1, iterator __i2,
4963 			_InputIterator __k1, _InputIterator __k2)
4964 	        {
4965 		  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
4966 					   && __i2 <= _M_iend());
4967 		  __glibcxx_requires_valid_range(__k1, __k2);
4968 		  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
4969 		  return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
4970 		}
4971 	
4972 	      // Specializations for the common case of pointer and iterator:
4973 	      // useful to avoid the overhead of temporary buffering in _M_replace.
4974 	      basic_string&
4975 	      replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
4976 	      {
4977 		_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
4978 					 && __i2 <= _M_iend());
4979 		__glibcxx_requires_valid_range(__k1, __k2);
4980 		return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
4981 				     __k1, __k2 - __k1);
4982 	      }
4983 	
4984 	      basic_string&
4985 	      replace(iterator __i1, iterator __i2,
4986 		      const _CharT* __k1, const _CharT* __k2)
4987 	      {
4988 		_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
4989 					 && __i2 <= _M_iend());
4990 		__glibcxx_requires_valid_range(__k1, __k2);
4991 		return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
4992 				     __k1, __k2 - __k1);
4993 	      }
4994 	
4995 	      basic_string&
4996 	      replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
4997 	      {
4998 		_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
4999 					 && __i2 <= _M_iend());
5000 		__glibcxx_requires_valid_range(__k1, __k2);
5001 		return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
5002 				     __k1.base(), __k2 - __k1);
5003 	      }
5004 	
5005 	      basic_string&
5006 	      replace(iterator __i1, iterator __i2,
5007 		      const_iterator __k1, const_iterator __k2)
5008 	      {
5009 		_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
5010 					 && __i2 <= _M_iend());
5011 		__glibcxx_requires_valid_range(__k1, __k2);
5012 		return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
5013 				     __k1.base(), __k2 - __k1);
5014 	      }
5015 	
5016 	#if __cplusplus >= 201103L
5017 	      /**
5018 	       *  @brief  Replace range of characters with initializer_list.
5019 	       *  @param __i1  Iterator referencing start of range to replace.
5020 	       *  @param __i2  Iterator referencing end of range to replace.
5021 	       *  @param __l  The initializer_list of characters to insert.
5022 	       *  @return  Reference to this string.
5023 	       *  @throw  std::length_error  If new length exceeds @c max_size().
5024 	       *
5025 	       *  Removes the characters in the range [__i1,__i2).  In place,
5026 	       *  characters in the range [__k1,__k2) are inserted.  If the
5027 	       *  length of result exceeds max_size(), length_error is thrown.
5028 	       *  The value of the string doesn't change if an error is
5029 	       *  thrown.
5030 	      */
5031 	      basic_string& replace(iterator __i1, iterator __i2,
5032 				    initializer_list<_CharT> __l)
5033 	      { return this->replace(__i1, __i2, __l.begin(), __l.end()); }
5034 	#endif // C++11
5035 	
5036 	#if __cplusplus >= 201703L
5037 	      /**
5038 	       *  @brief  Replace range of characters with string_view.
5039 	       *  @param __pos  The position to replace at.
5040 	       *  @param __n    The number of characters to replace.
5041 	       *  @param __svt  The object convertible to string_view to insert.
5042 	       *  @return  Reference to this string.
5043 	      */
5044 	      template<typename _Tp>
5045 		_If_sv<_Tp, basic_string&>
5046 		replace(size_type __pos, size_type __n, const _Tp& __svt)
5047 		{
5048 		  __sv_type __sv = __svt;
5049 		  return this->replace(__pos, __n, __sv.data(), __sv.size());
5050 		}
5051 	
5052 	      /**
5053 	       *  @brief  Replace range of characters with string_view.
5054 	       *  @param __pos1  The position to replace at.
5055 	       *  @param __n1    The number of characters to replace.
5056 	       *  @param __svt   The object convertible to string_view to insert from.
5057 	       *  @param __pos2  The position in the string_view to insert from.
5058 	       *  @param __n2    The number of characters to insert.
5059 	       *  @return  Reference to this string.
5060 	      */
5061 	      template<typename _Tp>
5062 	        _If_sv<_Tp, basic_string&>
5063 	        replace(size_type __pos1, size_type __n1, const _Tp& __svt,
5064 			size_type __pos2, size_type __n2 = npos)
5065 		{
5066 		  __sv_type __sv = __svt;
5067 		  return this->replace(__pos1, __n1,
5068 		      __sv.data()
5069 		      + std::__sv_check(__sv.size(), __pos2, "basic_string::replace"),
5070 		      std::__sv_limit(__sv.size(), __pos2, __n2));
5071 		}
5072 	
5073 	      /**
5074 	       *  @brief  Replace range of characters with string_view.
5075 	       *  @param __i1    An iterator referencing the start position
5076 	          to replace at.
5077 	       *  @param __i2    An iterator referencing the end position
5078 	          for the replace.
5079 	       *  @param __svt   The object convertible to string_view to insert from.
5080 	       *  @return  Reference to this string.
5081 	      */
5082 	      template<typename _Tp>
5083 		_If_sv<_Tp, basic_string&>
5084 		replace(const_iterator __i1, const_iterator __i2, const _Tp& __svt)
5085 		{
5086 		  __sv_type __sv = __svt;
5087 		  return this->replace(__i1 - begin(), __i2 - __i1, __sv);
5088 		}
5089 	#endif // C++17
5090 	
5091 	    private:
5092 	      template<class _Integer>
5093 		basic_string&
5094 		_M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
5095 				    _Integer __val, __true_type)
5096 	        { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
5097 	
5098 	      template<class _InputIterator>
5099 		basic_string&
5100 		_M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
5101 				    _InputIterator __k2, __false_type);
5102 	
5103 	      basic_string&
5104 	      _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
5105 			     _CharT __c);
5106 	
5107 	      basic_string&
5108 	      _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
5109 			      size_type __n2);
5110 	
5111 	      // _S_construct_aux is used to implement the 21.3.1 para 15 which
5112 	      // requires special behaviour if _InIter is an integral type
5113 	      template<class _InIterator>
5114 	        static _CharT*
5115 	        _S_construct_aux(_InIterator __beg, _InIterator __end,
5116 				 const _Alloc& __a, __false_type)
5117 		{
5118 	          typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
5119 	          return _S_construct(__beg, __end, __a, _Tag());
5120 		}
5121 	
5122 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
5123 	      // 438. Ambiguity in the "do the right thing" clause
5124 	      template<class _Integer>
5125 	        static _CharT*
5126 	        _S_construct_aux(_Integer __beg, _Integer __end,
5127 				 const _Alloc& __a, __true_type)
5128 	        { return _S_construct_aux_2(static_cast<size_type>(__beg),
5129 					    __end, __a); }
5130 	
5131 	      static _CharT*
5132 	      _S_construct_aux_2(size_type __req, _CharT __c, const _Alloc& __a)
5133 	      { return _S_construct(__req, __c, __a); }
5134 	
5135 	      template<class _InIterator>
5136 	        static _CharT*
5137 	        _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
5138 		{
5139 		  typedef typename std::__is_integer<_InIterator>::__type _Integral;
5140 		  return _S_construct_aux(__beg, __end, __a, _Integral());
5141 	        }
5142 	
5143 	      // For Input Iterators, used in istreambuf_iterators, etc.
5144 	      template<class _InIterator>
5145 	        static _CharT*
5146 	         _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
5147 			      input_iterator_tag);
5148 	
5149 	      // For forward_iterators up to random_access_iterators, used for
5150 	      // string::iterator, _CharT*, etc.
5151 	      template<class _FwdIterator>
5152 	        static _CharT*
5153 	        _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
5154 			     forward_iterator_tag);
5155 	
5156 	      static _CharT*
5157 	      _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
5158 	
5159 	    public:
5160 	
5161 	      /**
5162 	       *  @brief  Copy substring into C string.
5163 	       *  @param __s  C string to copy value into.
5164 	       *  @param __n  Number of characters to copy.
5165 	       *  @param __pos  Index of first character to copy.
5166 	       *  @return  Number of characters actually copied
5167 	       *  @throw  std::out_of_range  If __pos > size().
5168 	       *
5169 	       *  Copies up to @a __n characters starting at @a __pos into the
5170 	       *  C string @a __s.  If @a __pos is %greater than size(),
5171 	       *  out_of_range is thrown.
5172 	      */
5173 	      size_type
5174 	      copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
5175 	
5176 	      /**
5177 	       *  @brief  Swap contents with another string.
5178 	       *  @param __s  String to swap with.
5179 	       *
5180 	       *  Exchanges the contents of this string with that of @a __s in constant
5181 	       *  time.
5182 	      */
5183 	      void
5184 	      swap(basic_string& __s)
5185 	      _GLIBCXX_NOEXCEPT_IF(allocator_traits<_Alloc>::is_always_equal::value);
5186 	
5187 	      // String operations:
5188 	      /**
5189 	       *  @brief  Return const pointer to null-terminated contents.
5190 	       *
5191 	       *  This is a handle to internal data.  Do not modify or dire things may
5192 	       *  happen.
5193 	      */
5194 	      const _CharT*
5195 	      c_str() const _GLIBCXX_NOEXCEPT
5196 	      { return _M_data(); }
5197 	
5198 	      /**
5199 	       *  @brief  Return const pointer to contents.
5200 	       *
5201 	       *  This is a pointer to internal data.  It is undefined to modify
5202 	       *  the contents through the returned pointer. To get a pointer that
5203 	       *  allows modifying the contents use @c &str[0] instead,
5204 	       *  (or in C++17 the non-const @c str.data() overload).
5205 	      */
5206 	      const _CharT*
5207 	      data() const _GLIBCXX_NOEXCEPT
5208 	      { return _M_data(); }
5209 	
5210 	#if __cplusplus >= 201703L
5211 	      /**
5212 	       *  @brief  Return non-const pointer to contents.
5213 	       *
5214 	       *  This is a pointer to the character sequence held by the string.
5215 	       *  Modifying the characters in the sequence is allowed.
5216 	      */
5217 	      _CharT*
5218 	      data() noexcept
5219 	      {
5220 		_M_leak();
5221 		return _M_data();
5222 	      }
5223 	#endif
5224 	
5225 	      /**
5226 	       *  @brief  Return copy of allocator used to construct this string.
5227 	      */
5228 	      allocator_type
5229 	      get_allocator() const _GLIBCXX_NOEXCEPT
5230 	      { return _M_dataplus; }
5231 	
5232 	      /**
5233 	       *  @brief  Find position of a C substring.
5234 	       *  @param __s  C string to locate.
5235 	       *  @param __pos  Index of character to search from.
5236 	       *  @param __n  Number of characters from @a s to search for.
5237 	       *  @return  Index of start of first occurrence.
5238 	       *
5239 	       *  Starting from @a __pos, searches forward for the first @a
5240 	       *  __n characters in @a __s within this string.  If found,
5241 	       *  returns the index where it begins.  If not found, returns
5242 	       *  npos.
5243 	      */
5244 	      size_type
5245 	      find(const _CharT* __s, size_type __pos, size_type __n) const
5246 	      _GLIBCXX_NOEXCEPT;
5247 	
5248 	      /**
5249 	       *  @brief  Find position of a string.
5250 	       *  @param __str  String to locate.
5251 	       *  @param __pos  Index of character to search from (default 0).
5252 	       *  @return  Index of start of first occurrence.
5253 	       *
5254 	       *  Starting from @a __pos, searches forward for value of @a __str within
5255 	       *  this string.  If found, returns the index where it begins.  If not
5256 	       *  found, returns npos.
5257 	      */
5258 	      size_type
5259 	      find(const basic_string& __str, size_type __pos = 0) const
5260 	      _GLIBCXX_NOEXCEPT
5261 	      { return this->find(__str.data(), __pos, __str.size()); }
5262 	
5263 	      /**
5264 	       *  @brief  Find position of a C string.
5265 	       *  @param __s  C string to locate.
5266 	       *  @param __pos  Index of character to search from (default 0).
5267 	       *  @return  Index of start of first occurrence.
5268 	       *
5269 	       *  Starting from @a __pos, searches forward for the value of @a
5270 	       *  __s within this string.  If found, returns the index where
5271 	       *  it begins.  If not found, returns npos.
5272 	      */
5273 	      size_type
5274 	      find(const _CharT* __s, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
5275 	      {
5276 		__glibcxx_requires_string(__s);
5277 		return this->find(__s, __pos, traits_type::length(__s));
5278 	      }
5279 	
5280 	      /**
5281 	       *  @brief  Find position of a character.
5282 	       *  @param __c  Character to locate.
5283 	       *  @param __pos  Index of character to search from (default 0).
5284 	       *  @return  Index of first occurrence.
5285 	       *
5286 	       *  Starting from @a __pos, searches forward for @a __c within
5287 	       *  this string.  If found, returns the index where it was
5288 	       *  found.  If not found, returns npos.
5289 	      */
5290 	      size_type
5291 	      find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
5292 	
5293 	#if __cplusplus >= 201703L
5294 	      /**
5295 	       *  @brief  Find position of a string_view.
5296 	       *  @param __svt  The object convertible to string_view to locate.
5297 	       *  @param __pos  Index of character to search from (default 0).
5298 	       *  @return  Index of start of first occurrence.
5299 	      */
5300 	      template<typename _Tp>
5301 		_If_sv<_Tp, size_type>
5302 		find(const _Tp& __svt, size_type __pos = 0) const
5303 		noexcept(is_same<_Tp, __sv_type>::value)
5304 		{
5305 		  __sv_type __sv = __svt;
5306 		  return this->find(__sv.data(), __pos, __sv.size());
5307 		}
5308 	#endif // C++17
5309 	
5310 	      /**
5311 	       *  @brief  Find last position of a string.
5312 	       *  @param __str  String to locate.
5313 	       *  @param __pos  Index of character to search back from (default end).
5314 	       *  @return  Index of start of last occurrence.
5315 	       *
5316 	       *  Starting from @a __pos, searches backward for value of @a
5317 	       *  __str within this string.  If found, returns the index where
5318 	       *  it begins.  If not found, returns npos.
5319 	      */
5320 	      size_type
5321 	      rfind(const basic_string& __str, size_type __pos = npos) const
5322 	      _GLIBCXX_NOEXCEPT
5323 	      { return this->rfind(__str.data(), __pos, __str.size()); }
5324 	
5325 	      /**
5326 	       *  @brief  Find last position of a C substring.
5327 	       *  @param __s  C string to locate.
5328 	       *  @param __pos  Index of character to search back from.
5329 	       *  @param __n  Number of characters from s to search for.
5330 	       *  @return  Index of start of last occurrence.
5331 	       *
5332 	       *  Starting from @a __pos, searches backward for the first @a
5333 	       *  __n characters in @a __s within this string.  If found,
5334 	       *  returns the index where it begins.  If not found, returns
5335 	       *  npos.
5336 	      */
5337 	      size_type
5338 	      rfind(const _CharT* __s, size_type __pos, size_type __n) const
5339 	      _GLIBCXX_NOEXCEPT;
5340 	
5341 	      /**
5342 	       *  @brief  Find last position of a C string.
5343 	       *  @param __s  C string to locate.
5344 	       *  @param __pos  Index of character to start search at (default end).
5345 	       *  @return  Index of start of  last occurrence.
5346 	       *
5347 	       *  Starting from @a __pos, searches backward for the value of
5348 	       *  @a __s within this string.  If found, returns the index
5349 	       *  where it begins.  If not found, returns npos.
5350 	      */
5351 	      size_type
5352 	      rfind(const _CharT* __s, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
5353 	      {
5354 		__glibcxx_requires_string(__s);
5355 		return this->rfind(__s, __pos, traits_type::length(__s));
5356 	      }
5357 	
5358 	      /**
5359 	       *  @brief  Find last position of a character.
5360 	       *  @param __c  Character to locate.
5361 	       *  @param __pos  Index of character to search back from (default end).
5362 	       *  @return  Index of last occurrence.
5363 	       *
5364 	       *  Starting from @a __pos, searches backward for @a __c within
5365 	       *  this string.  If found, returns the index where it was
5366 	       *  found.  If not found, returns npos.
5367 	      */
5368 	      size_type
5369 	      rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
5370 	
5371 	#if __cplusplus >= 201703L
5372 	      /**
5373 	       *  @brief  Find last position of a string_view.
5374 	       *  @param __svt  The object convertible to string_view to locate.
5375 	       *  @param __pos  Index of character to search back from (default end).
5376 	       *  @return  Index of start of last occurrence.
5377 	      */
5378 	      template<typename _Tp>
5379 		_If_sv<_Tp, size_type>
5380 		rfind(const _Tp& __svt, size_type __pos = npos) const
5381 		noexcept(is_same<_Tp, __sv_type>::value)
5382 		{
5383 		  __sv_type __sv = __svt;
5384 		  return this->rfind(__sv.data(), __pos, __sv.size());
5385 		}
5386 	#endif // C++17
5387 	
5388 	      /**
5389 	       *  @brief  Find position of a character of string.
5390 	       *  @param __str  String containing characters to locate.
5391 	       *  @param __pos  Index of character to search from (default 0).
5392 	       *  @return  Index of first occurrence.
5393 	       *
5394 	       *  Starting from @a __pos, searches forward for one of the
5395 	       *  characters of @a __str within this string.  If found,
5396 	       *  returns the index where it was found.  If not found, returns
5397 	       *  npos.
5398 	      */
5399 	      size_type
5400 	      find_first_of(const basic_string& __str, size_type __pos = 0) const
5401 	      _GLIBCXX_NOEXCEPT
5402 	      { return this->find_first_of(__str.data(), __pos, __str.size()); }
5403 	
5404 	      /**
5405 	       *  @brief  Find position of a character of C substring.
5406 	       *  @param __s  String containing characters to locate.
5407 	       *  @param __pos  Index of character to search from.
5408 	       *  @param __n  Number of characters from s to search for.
5409 	       *  @return  Index of first occurrence.
5410 	       *
5411 	       *  Starting from @a __pos, searches forward for one of the
5412 	       *  first @a __n characters of @a __s within this string.  If
5413 	       *  found, returns the index where it was found.  If not found,
5414 	       *  returns npos.
5415 	      */
5416 	      size_type
5417 	      find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
5418 	      _GLIBCXX_NOEXCEPT;
5419 	
5420 	      /**
5421 	       *  @brief  Find position of a character of C string.
5422 	       *  @param __s  String containing characters to locate.
5423 	       *  @param __pos  Index of character to search from (default 0).
5424 	       *  @return  Index of first occurrence.
5425 	       *
5426 	       *  Starting from @a __pos, searches forward for one of the
5427 	       *  characters of @a __s within this string.  If found, returns
5428 	       *  the index where it was found.  If not found, returns npos.
5429 	      */
5430 	      size_type
5431 	      find_first_of(const _CharT* __s, size_type __pos = 0) const
5432 	      _GLIBCXX_NOEXCEPT
5433 	      {
5434 		__glibcxx_requires_string(__s);
5435 		return this->find_first_of(__s, __pos, traits_type::length(__s));
5436 	      }
5437 	
5438 	      /**
5439 	       *  @brief  Find position of a character.
5440 	       *  @param __c  Character to locate.
5441 	       *  @param __pos  Index of character to search from (default 0).
5442 	       *  @return  Index of first occurrence.
5443 	       *
5444 	       *  Starting from @a __pos, searches forward for the character
5445 	       *  @a __c within this string.  If found, returns the index
5446 	       *  where it was found.  If not found, returns npos.
5447 	       *
5448 	       *  Note: equivalent to find(__c, __pos).
5449 	      */
5450 	      size_type
5451 	      find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
5452 	      { return this->find(__c, __pos); }
5453 	
5454 	#if __cplusplus >= 201703L
5455 	      /**
5456 	       *  @brief  Find position of a character of a string_view.
5457 	       *  @param __svt  An object convertible to string_view containing
5458 	       *                characters to locate.
5459 	       *  @param __pos  Index of character to search from (default 0).
5460 	       *  @return  Index of first occurrence.
5461 	      */
5462 	      template<typename _Tp>
5463 		_If_sv<_Tp, size_type>
5464 		find_first_of(const _Tp& __svt, size_type __pos = 0) const
5465 		noexcept(is_same<_Tp, __sv_type>::value)
5466 		{
5467 		  __sv_type __sv = __svt;
5468 		  return this->find_first_of(__sv.data(), __pos, __sv.size());
5469 		}
5470 	#endif // C++17
5471 	
5472 	      /**
5473 	       *  @brief  Find last position of a character of string.
5474 	       *  @param __str  String containing characters to locate.
5475 	       *  @param __pos  Index of character to search back from (default end).
5476 	       *  @return  Index of last occurrence.
5477 	       *
5478 	       *  Starting from @a __pos, searches backward for one of the
5479 	       *  characters of @a __str within this string.  If found,
5480 	       *  returns the index where it was found.  If not found, returns
5481 	       *  npos.
5482 	      */
5483 	      size_type
5484 	      find_last_of(const basic_string& __str, size_type __pos = npos) const
5485 	      _GLIBCXX_NOEXCEPT
5486 	      { return this->find_last_of(__str.data(), __pos, __str.size()); }
5487 	
5488 	      /**
5489 	       *  @brief  Find last position of a character of C substring.
5490 	       *  @param __s  C string containing characters to locate.
5491 	       *  @param __pos  Index of character to search back from.
5492 	       *  @param __n  Number of characters from s to search for.
5493 	       *  @return  Index of last occurrence.
5494 	       *
5495 	       *  Starting from @a __pos, searches backward for one of the
5496 	       *  first @a __n characters of @a __s within this string.  If
5497 	       *  found, returns the index where it was found.  If not found,
5498 	       *  returns npos.
5499 	      */
5500 	      size_type
5501 	      find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
5502 	      _GLIBCXX_NOEXCEPT;
5503 	
5504 	      /**
5505 	       *  @brief  Find last position of a character of C string.
5506 	       *  @param __s  C string containing characters to locate.
5507 	       *  @param __pos  Index of character to search back from (default end).
5508 	       *  @return  Index of last occurrence.
5509 	       *
5510 	       *  Starting from @a __pos, searches backward for one of the
5511 	       *  characters of @a __s within this string.  If found, returns
5512 	       *  the index where it was found.  If not found, returns npos.
5513 	      */
5514 	      size_type
5515 	      find_last_of(const _CharT* __s, size_type __pos = npos) const
5516 	      _GLIBCXX_NOEXCEPT
5517 	      {
5518 		__glibcxx_requires_string(__s);
5519 		return this->find_last_of(__s, __pos, traits_type::length(__s));
5520 	      }
5521 	
5522 	      /**
5523 	       *  @brief  Find last position of a character.
5524 	       *  @param __c  Character to locate.
5525 	       *  @param __pos  Index of character to search back from (default end).
5526 	       *  @return  Index of last occurrence.
5527 	       *
5528 	       *  Starting from @a __pos, searches backward for @a __c within
5529 	       *  this string.  If found, returns the index where it was
5530 	       *  found.  If not found, returns npos.
5531 	       *
5532 	       *  Note: equivalent to rfind(__c, __pos).
5533 	      */
5534 	      size_type
5535 	      find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
5536 	      { return this->rfind(__c, __pos); }
5537 	
5538 	#if __cplusplus >= 201703L
5539 	      /**
5540 	       *  @brief  Find last position of a character of string.
5541 	       *  @param __svt  An object convertible to string_view containing
5542 	       *                characters to locate.
5543 	       *  @param __pos  Index of character to search back from (default end).
5544 	       *  @return  Index of last occurrence.
5545 	      */
5546 	      template<typename _Tp>
5547 		_If_sv<_Tp, size_type>
5548 		find_last_of(const _Tp& __svt, size_type __pos = npos) const
5549 		noexcept(is_same<_Tp, __sv_type>::value)
5550 		{
5551 		  __sv_type __sv = __svt;
5552 		  return this->find_last_of(__sv.data(), __pos, __sv.size());
5553 		}
5554 	#endif // C++17
5555 	
5556 	      /**
5557 	       *  @brief  Find position of a character not in string.
5558 	       *  @param __str  String containing characters to avoid.
5559 	       *  @param __pos  Index of character to search from (default 0).
5560 	       *  @return  Index of first occurrence.
5561 	       *
5562 	       *  Starting from @a __pos, searches forward for a character not contained
5563 	       *  in @a __str within this string.  If found, returns the index where it
5564 	       *  was found.  If not found, returns npos.
5565 	      */
5566 	      size_type
5567 	      find_first_not_of(const basic_string& __str, size_type __pos = 0) const
5568 	      _GLIBCXX_NOEXCEPT
5569 	      { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
5570 	
5571 	      /**
5572 	       *  @brief  Find position of a character not in C substring.
5573 	       *  @param __s  C string containing characters to avoid.
5574 	       *  @param __pos  Index of character to search from.
5575 	       *  @param __n  Number of characters from __s to consider.
5576 	       *  @return  Index of first occurrence.
5577 	       *
5578 	       *  Starting from @a __pos, searches forward for a character not
5579 	       *  contained in the first @a __n characters of @a __s within
5580 	       *  this string.  If found, returns the index where it was
5581 	       *  found.  If not found, returns npos.
5582 	      */
5583 	      size_type
5584 	      find_first_not_of(const _CharT* __s, size_type __pos,
5585 				size_type __n) const _GLIBCXX_NOEXCEPT;
5586 	
5587 	      /**
5588 	       *  @brief  Find position of a character not in C string.
5589 	       *  @param __s  C string containing characters to avoid.
5590 	       *  @param __pos  Index of character to search from (default 0).
5591 	       *  @return  Index of first occurrence.
5592 	       *
5593 	       *  Starting from @a __pos, searches forward for a character not
5594 	       *  contained in @a __s within this string.  If found, returns
5595 	       *  the index where it was found.  If not found, returns npos.
5596 	      */
5597 	      size_type
5598 	      find_first_not_of(const _CharT* __s, size_type __pos = 0) const
5599 	      _GLIBCXX_NOEXCEPT
5600 	      {
5601 		__glibcxx_requires_string(__s);
5602 		return this->find_first_not_of(__s, __pos, traits_type::length(__s));
5603 	      }
5604 	
5605 	      /**
5606 	       *  @brief  Find position of a different character.
5607 	       *  @param __c  Character to avoid.
5608 	       *  @param __pos  Index of character to search from (default 0).
5609 	       *  @return  Index of first occurrence.
5610 	       *
5611 	       *  Starting from @a __pos, searches forward for a character
5612 	       *  other than @a __c within this string.  If found, returns the
5613 	       *  index where it was found.  If not found, returns npos.
5614 	      */
5615 	      size_type
5616 	      find_first_not_of(_CharT __c, size_type __pos = 0) const
5617 	      _GLIBCXX_NOEXCEPT;
5618 	
5619 	#if __cplusplus >= 201703L
5620 	      /**
5621 	       *  @brief  Find position of a character not in a string_view.
5622 	       *  @param __svt  An object convertible to string_view containing
5623 	       *                characters to avoid.
5624 	       *  @param __pos  Index of character to search from (default 0).
5625 	       *  @return  Index of first occurrence.
5626 	       */
5627 	      template<typename _Tp>
5628 		_If_sv<_Tp, size_type>
5629 		find_first_not_of(const _Tp& __svt, size_type __pos = 0) const
5630 		noexcept(is_same<_Tp, __sv_type>::value)
5631 		{
5632 		  __sv_type __sv = __svt;
5633 		  return this->find_first_not_of(__sv.data(), __pos, __sv.size());
5634 		}
5635 	#endif // C++17
5636 	
5637 	      /**
5638 	       *  @brief  Find last position of a character not in string.
5639 	       *  @param __str  String containing characters to avoid.
5640 	       *  @param __pos  Index of character to search back from (default end).
5641 	       *  @return  Index of last occurrence.
5642 	       *
5643 	       *  Starting from @a __pos, searches backward for a character
5644 	       *  not contained in @a __str within this string.  If found,
5645 	       *  returns the index where it was found.  If not found, returns
5646 	       *  npos.
5647 	      */
5648 	      size_type
5649 	      find_last_not_of(const basic_string& __str, size_type __pos = npos) const
5650 	      _GLIBCXX_NOEXCEPT
5651 	      { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
5652 	
5653 	      /**
5654 	       *  @brief  Find last position of a character not in C substring.
5655 	       *  @param __s  C string containing characters to avoid.
5656 	       *  @param __pos  Index of character to search back from.
5657 	       *  @param __n  Number of characters from s to consider.
5658 	       *  @return  Index of last occurrence.
5659 	       *
5660 	       *  Starting from @a __pos, searches backward for a character not
5661 	       *  contained in the first @a __n characters of @a __s within this string.
5662 	       *  If found, returns the index where it was found.  If not found,
5663 	       *  returns npos.
5664 	      */
5665 	      size_type
5666 	      find_last_not_of(const _CharT* __s, size_type __pos,
5667 			       size_type __n) const _GLIBCXX_NOEXCEPT;
5668 	      /**
5669 	       *  @brief  Find last position of a character not in C string.
5670 	       *  @param __s  C string containing characters to avoid.
5671 	       *  @param __pos  Index of character to search back from (default end).
5672 	       *  @return  Index of last occurrence.
5673 	       *
5674 	       *  Starting from @a __pos, searches backward for a character
5675 	       *  not contained in @a __s within this string.  If found,
5676 	       *  returns the index where it was found.  If not found, returns
5677 	       *  npos.
5678 	      */
5679 	      size_type
5680 	      find_last_not_of(const _CharT* __s, size_type __pos = npos) const
5681 	      _GLIBCXX_NOEXCEPT
5682 	      {
5683 		__glibcxx_requires_string(__s);
5684 		return this->find_last_not_of(__s, __pos, traits_type::length(__s));
5685 	      }
5686 	
5687 	      /**
5688 	       *  @brief  Find last position of a different character.
5689 	       *  @param __c  Character to avoid.
5690 	       *  @param __pos  Index of character to search back from (default end).
5691 	       *  @return  Index of last occurrence.
5692 	       *
5693 	       *  Starting from @a __pos, searches backward for a character other than
5694 	       *  @a __c within this string.  If found, returns the index where it was
5695 	       *  found.  If not found, returns npos.
5696 	      */
5697 	      size_type
5698 	      find_last_not_of(_CharT __c, size_type __pos = npos) const
5699 	      _GLIBCXX_NOEXCEPT;
5700 	
5701 	#if __cplusplus >= 201703L
5702 	      /**
5703 	       *  @brief  Find last position of a character not in a string_view.
5704 	       *  @param __svt  An object convertible to string_view containing
5705 	       *                characters to avoid.
5706 	       *  @param __pos  Index of character to search back from (default end).
5707 	       *  @return  Index of last occurrence.
5708 	       */
5709 	      template<typename _Tp>
5710 		_If_sv<_Tp, size_type>
5711 		find_last_not_of(const _Tp& __svt, size_type __pos = npos) const
5712 		noexcept(is_same<_Tp, __sv_type>::value)
5713 		{
5714 		  __sv_type __sv = __svt;
5715 		  return this->find_last_not_of(__sv.data(), __pos, __sv.size());
5716 		}
5717 	#endif // C++17
5718 	
5719 	      /**
5720 	       *  @brief  Get a substring.
5721 	       *  @param __pos  Index of first character (default 0).
5722 	       *  @param __n  Number of characters in substring (default remainder).
5723 	       *  @return  The new string.
5724 	       *  @throw  std::out_of_range  If __pos > size().
5725 	       *
5726 	       *  Construct and return a new string using the @a __n
5727 	       *  characters starting at @a __pos.  If the string is too
5728 	       *  short, use the remainder of the characters.  If @a __pos is
5729 	       *  beyond the end of the string, out_of_range is thrown.
5730 	      */
5731 	      basic_string
5732 	      substr(size_type __pos = 0, size_type __n = npos) const
5733 	      { return basic_string(*this,
5734 				    _M_check(__pos, "basic_string::substr"), __n); }
5735 	
5736 	      /**
5737 	       *  @brief  Compare to a string.
5738 	       *  @param __str  String to compare against.
5739 	       *  @return  Integer < 0, 0, or > 0.
5740 	       *
5741 	       *  Returns an integer < 0 if this string is ordered before @a
5742 	       *  __str, 0 if their values are equivalent, or > 0 if this
5743 	       *  string is ordered after @a __str.  Determines the effective
5744 	       *  length rlen of the strings to compare as the smallest of
5745 	       *  size() and str.size().  The function then compares the two
5746 	       *  strings by calling traits::compare(data(), str.data(),rlen).
5747 	       *  If the result of the comparison is nonzero returns it,
5748 	       *  otherwise the shorter one is ordered first.
5749 	      */
5750 	      int
5751 	      compare(const basic_string& __str) const
5752 	      {
5753 		const size_type __size = this->size();
5754 		const size_type __osize = __str.size();
5755 		const size_type __len = std::min(__size, __osize);
5756 	
5757 		int __r = traits_type::compare(_M_data(), __str.data(), __len);
5758 		if (!__r)
5759 		  __r = _S_compare(__size, __osize);
5760 		return __r;
5761 	      }
5762 	
5763 	#if __cplusplus >= 201703L
5764 	      /**
5765 	       *  @brief  Compare to a string_view.
5766 	       *  @param __svt An object convertible to string_view to compare against.
5767 	       *  @return  Integer < 0, 0, or > 0.
5768 	       */
5769 	      template<typename _Tp>
5770 		_If_sv<_Tp, int>
5771 		compare(const _Tp& __svt) const
5772 		noexcept(is_same<_Tp, __sv_type>::value)
5773 		{
5774 		   __sv_type __sv = __svt;
5775 		  const size_type __size = this->size();
5776 		  const size_type __osize = __sv.size();
5777 		  const size_type __len = std::min(__size, __osize);
5778 	
5779 		  int __r = traits_type::compare(_M_data(), __sv.data(), __len);
5780 		  if (!__r)
5781 		    __r = _S_compare(__size, __osize);
5782 		  return __r;
5783 		}
5784 	
5785 	      /**
5786 	       *  @brief  Compare to a string_view.
5787 	       *  @param __pos  A position in the string to start comparing from.
5788 	       *  @param __n  The number of characters to compare.
5789 	       *  @param __svt  An object convertible to string_view to compare
5790 	       *                against.
5791 	       *  @return  Integer < 0, 0, or > 0.
5792 	       */
5793 	      template<typename _Tp>
5794 		_If_sv<_Tp, int>
5795 		compare(size_type __pos, size_type __n, const _Tp& __svt) const
5796 		noexcept(is_same<_Tp, __sv_type>::value)
5797 		{
5798 		  __sv_type __sv = __svt;
5799 		  return __sv_type(*this).substr(__pos, __n).compare(__sv);
5800 		}
5801 	
5802 	      /**
5803 	       *  @brief  Compare to a string_view.
5804 	       *  @param __pos1  A position in the string to start comparing from.
5805 	       *  @param __n1  The number of characters to compare.
5806 	       *  @param __svt   An object convertible to string_view to compare
5807 	       *                 against.
5808 	       *  @param __pos2  A position in the string_view to start comparing from.
5809 	       *  @param __n2  The number of characters to compare.
5810 	       *  @return  Integer < 0, 0, or > 0.
5811 	       */
5812 	      template<typename _Tp>
5813 		_If_sv<_Tp, int>
5814 		compare(size_type __pos1, size_type __n1, const _Tp& __svt,
5815 			size_type __pos2, size_type __n2 = npos) const
5816 		noexcept(is_same<_Tp, __sv_type>::value)
5817 		{
5818 		  __sv_type __sv = __svt;
5819 		  return __sv_type(*this)
5820 		    .substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
5821 		}
5822 	#endif // C++17
5823 	
5824 	      /**
5825 	       *  @brief  Compare substring to a string.
5826 	       *  @param __pos  Index of first character of substring.
5827 	       *  @param __n  Number of characters in substring.
5828 	       *  @param __str  String to compare against.
5829 	       *  @return  Integer < 0, 0, or > 0.
5830 	       *
5831 	       *  Form the substring of this string from the @a __n characters
5832 	       *  starting at @a __pos.  Returns an integer < 0 if the
5833 	       *  substring is ordered before @a __str, 0 if their values are
5834 	       *  equivalent, or > 0 if the substring is ordered after @a
5835 	       *  __str.  Determines the effective length rlen of the strings
5836 	       *  to compare as the smallest of the length of the substring
5837 	       *  and @a __str.size().  The function then compares the two
5838 	       *  strings by calling
5839 	       *  traits::compare(substring.data(),str.data(),rlen).  If the
5840 	       *  result of the comparison is nonzero returns it, otherwise
5841 	       *  the shorter one is ordered first.
5842 	      */
5843 	      int
5844 	      compare(size_type __pos, size_type __n, const basic_string& __str) const;
5845 	
5846 	      /**
5847 	       *  @brief  Compare substring to a substring.
5848 	       *  @param __pos1  Index of first character of substring.
5849 	       *  @param __n1  Number of characters in substring.
5850 	       *  @param __str  String to compare against.
5851 	       *  @param __pos2  Index of first character of substring of str.
5852 	       *  @param __n2  Number of characters in substring of str.
5853 	       *  @return  Integer < 0, 0, or > 0.
5854 	       *
5855 	       *  Form the substring of this string from the @a __n1
5856 	       *  characters starting at @a __pos1.  Form the substring of @a
5857 	       *  __str from the @a __n2 characters starting at @a __pos2.
5858 	       *  Returns an integer < 0 if this substring is ordered before
5859 	       *  the substring of @a __str, 0 if their values are equivalent,
5860 	       *  or > 0 if this substring is ordered after the substring of
5861 	       *  @a __str.  Determines the effective length rlen of the
5862 	       *  strings to compare as the smallest of the lengths of the
5863 	       *  substrings.  The function then compares the two strings by
5864 	       *  calling
5865 	       *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
5866 	       *  If the result of the comparison is nonzero returns it,
5867 	       *  otherwise the shorter one is ordered first.
5868 	      */
5869 	      int
5870 	      compare(size_type __pos1, size_type __n1, const basic_string& __str,
5871 		      size_type __pos2, size_type __n2 = npos) const;
5872 	
5873 	      /**
5874 	       *  @brief  Compare to a C string.
5875 	       *  @param __s  C string to compare against.
5876 	       *  @return  Integer < 0, 0, or > 0.
5877 	       *
5878 	       *  Returns an integer < 0 if this string is ordered before @a __s, 0 if
5879 	       *  their values are equivalent, or > 0 if this string is ordered after
5880 	       *  @a __s.  Determines the effective length rlen of the strings to
5881 	       *  compare as the smallest of size() and the length of a string
5882 	       *  constructed from @a __s.  The function then compares the two strings
5883 	       *  by calling traits::compare(data(),s,rlen).  If the result of the
5884 	       *  comparison is nonzero returns it, otherwise the shorter one is
5885 	       *  ordered first.
5886 	      */
5887 	      int
5888 	      compare(const _CharT* __s) const _GLIBCXX_NOEXCEPT;
5889 	
5890 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
5891 	      // 5 String::compare specification questionable
5892 	      /**
5893 	       *  @brief  Compare substring to a C string.
5894 	       *  @param __pos  Index of first character of substring.
5895 	       *  @param __n1  Number of characters in substring.
5896 	       *  @param __s  C string to compare against.
5897 	       *  @return  Integer < 0, 0, or > 0.
5898 	       *
5899 	       *  Form the substring of this string from the @a __n1
5900 	       *  characters starting at @a pos.  Returns an integer < 0 if
5901 	       *  the substring is ordered before @a __s, 0 if their values
5902 	       *  are equivalent, or > 0 if the substring is ordered after @a
5903 	       *  __s.  Determines the effective length rlen of the strings to
5904 	       *  compare as the smallest of the length of the substring and
5905 	       *  the length of a string constructed from @a __s.  The
5906 	       *  function then compares the two string by calling
5907 	       *  traits::compare(substring.data(),__s,rlen).  If the result of
5908 	       *  the comparison is nonzero returns it, otherwise the shorter
5909 	       *  one is ordered first.
5910 	      */
5911 	      int
5912 	      compare(size_type __pos, size_type __n1, const _CharT* __s) const;
5913 	
5914 	      /**
5915 	       *  @brief  Compare substring against a character %array.
5916 	       *  @param __pos  Index of first character of substring.
5917 	       *  @param __n1  Number of characters in substring.
5918 	       *  @param __s  character %array to compare against.
5919 	       *  @param __n2  Number of characters of s.
5920 	       *  @return  Integer < 0, 0, or > 0.
5921 	       *
5922 	       *  Form the substring of this string from the @a __n1
5923 	       *  characters starting at @a __pos.  Form a string from the
5924 	       *  first @a __n2 characters of @a __s.  Returns an integer < 0
5925 	       *  if this substring is ordered before the string from @a __s,
5926 	       *  0 if their values are equivalent, or > 0 if this substring
5927 	       *  is ordered after the string from @a __s.  Determines the
5928 	       *  effective length rlen of the strings to compare as the
5929 	       *  smallest of the length of the substring and @a __n2.  The
5930 	       *  function then compares the two strings by calling
5931 	       *  traits::compare(substring.data(),s,rlen).  If the result of
5932 	       *  the comparison is nonzero returns it, otherwise the shorter
5933 	       *  one is ordered first.
5934 	       *
5935 	       *  NB: s must have at least n2 characters, &apos;\\0&apos; has
5936 	       *  no special meaning.
5937 	      */
5938 	      int
5939 	      compare(size_type __pos, size_type __n1, const _CharT* __s,
5940 		      size_type __n2) const;
5941 	
5942 	#if __cplusplus > 201703L
5943 	      bool
5944 	      starts_with(basic_string_view<_CharT, _Traits> __x) const noexcept
5945 	      { return __sv_type(this->data(), this->size()).starts_with(__x); }
5946 	
5947 	      bool
5948 	      starts_with(_CharT __x) const noexcept
5949 	      { return __sv_type(this->data(), this->size()).starts_with(__x); }
5950 	
5951 	      bool
5952 	      starts_with(const _CharT* __x) const noexcept
5953 	      { return __sv_type(this->data(), this->size()).starts_with(__x); }
5954 	
5955 	      bool
5956 	      ends_with(basic_string_view<_CharT, _Traits> __x) const noexcept
5957 	      { return __sv_type(this->data(), this->size()).ends_with(__x); }
5958 	
5959 	      bool
5960 	      ends_with(_CharT __x) const noexcept
5961 	      { return __sv_type(this->data(), this->size()).ends_with(__x); }
5962 	
5963 	      bool
5964 	      ends_with(const _CharT* __x) const noexcept
5965 	      { return __sv_type(this->data(), this->size()).ends_with(__x); }
5966 	#endif // C++20
5967 	
5968 	# ifdef _GLIBCXX_TM_TS_INTERNAL
5969 	      friend void
5970 	      ::_txnal_cow_string_C1_for_exceptions(void* that, const char* s,
5971 						    void* exc);
5972 	      friend const char*
5973 	      ::_txnal_cow_string_c_str(const void *that);
5974 	      friend void
5975 	      ::_txnal_cow_string_D1(void *that);
5976 	      friend void
5977 	      ::_txnal_cow_string_D1_commit(void *that);
5978 	# endif
5979 	  };
5980 	#endif  // !_GLIBCXX_USE_CXX11_ABI
5981 	
5982 	#if __cpp_deduction_guides >= 201606
5983 	_GLIBCXX_BEGIN_NAMESPACE_CXX11
5984 	  template<typename _InputIterator, typename _CharT
5985 		     = typename iterator_traits<_InputIterator>::value_type,
5986 		   typename _Allocator = allocator<_CharT>,
5987 		   typename = _RequireInputIter<_InputIterator>,
5988 		   typename = _RequireAllocator<_Allocator>>
5989 	    basic_string(_InputIterator, _InputIterator, _Allocator = _Allocator())
5990 	      -> basic_string<_CharT, char_traits<_CharT>, _Allocator>;
5991 	
5992 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
5993 	  // 3075. basic_string needs deduction guides from basic_string_view
5994 	  template<typename _CharT, typename _Traits,
5995 		   typename _Allocator = allocator<_CharT>,
5996 		   typename = _RequireAllocator<_Allocator>>
5997 	    basic_string(basic_string_view<_CharT, _Traits>, const _Allocator& = _Allocator())
5998 	      -> basic_string<_CharT, _Traits, _Allocator>;
5999 	
6000 	  template<typename _CharT, typename _Traits,
6001 		   typename _Allocator = allocator<_CharT>,
6002 		   typename = _RequireAllocator<_Allocator>>
6003 	    basic_string(basic_string_view<_CharT, _Traits>,
6004 			 typename basic_string<_CharT, _Traits, _Allocator>::size_type,
6005 			 typename basic_string<_CharT, _Traits, _Allocator>::size_type,
6006 			 const _Allocator& = _Allocator())
6007 	      -> basic_string<_CharT, _Traits, _Allocator>;
6008 	_GLIBCXX_END_NAMESPACE_CXX11
6009 	#endif
6010 	
6011 	  // operator+
6012 	  /**
6013 	   *  @brief  Concatenate two strings.
6014 	   *  @param __lhs  First string.
6015 	   *  @param __rhs  Last string.
6016 	   *  @return  New string with value of @a __lhs followed by @a __rhs.
6017 	   */
6018 	  template<typename _CharT, typename _Traits, typename _Alloc>
6019 	    basic_string<_CharT, _Traits, _Alloc>
6020 	    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6021 		      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6022 	    {
6023 	      basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
6024 	      __str.append(__rhs);
6025 	      return __str;
6026 	    }
6027 	
6028 	  /**
6029 	   *  @brief  Concatenate C string and string.
6030 	   *  @param __lhs  First string.
6031 	   *  @param __rhs  Last string.
6032 	   *  @return  New string with value of @a __lhs followed by @a __rhs.
6033 	   */
6034 	  template<typename _CharT, typename _Traits, typename _Alloc>
6035 	    basic_string<_CharT,_Traits,_Alloc>
6036 	    operator+(const _CharT* __lhs,
6037 		      const basic_string<_CharT,_Traits,_Alloc>& __rhs);
6038 	
6039 	  /**
6040 	   *  @brief  Concatenate character and string.
6041 	   *  @param __lhs  First string.
6042 	   *  @param __rhs  Last string.
6043 	   *  @return  New string with @a __lhs followed by @a __rhs.
6044 	   */
6045 	  template<typename _CharT, typename _Traits, typename _Alloc>
6046 	    basic_string<_CharT,_Traits,_Alloc>
6047 	    operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
6048 	
6049 	  /**
6050 	   *  @brief  Concatenate string and C string.
6051 	   *  @param __lhs  First string.
6052 	   *  @param __rhs  Last string.
6053 	   *  @return  New string with @a __lhs followed by @a __rhs.
6054 	   */
6055 	  template<typename _CharT, typename _Traits, typename _Alloc>
6056 	    inline basic_string<_CharT, _Traits, _Alloc>
6057 	    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6058 		      const _CharT* __rhs)
6059 	    {
6060 	      basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
6061 	      __str.append(__rhs);
6062 	      return __str;
6063 	    }
6064 	
6065 	  /**
6066 	   *  @brief  Concatenate string and character.
6067 	   *  @param __lhs  First string.
6068 	   *  @param __rhs  Last string.
6069 	   *  @return  New string with @a __lhs followed by @a __rhs.
6070 	   */
6071 	  template<typename _CharT, typename _Traits, typename _Alloc>
6072 	    inline basic_string<_CharT, _Traits, _Alloc>
6073 	    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
6074 	    {
6075 	      typedef basic_string<_CharT, _Traits, _Alloc>	__string_type;
6076 	      typedef typename __string_type::size_type		__size_type;
6077 	      __string_type __str(__lhs);
6078 	      __str.append(__size_type(1), __rhs);
6079 	      return __str;
6080 	    }
6081 	
6082 	#if __cplusplus >= 201103L
6083 	  template<typename _CharT, typename _Traits, typename _Alloc>
6084 	    inline basic_string<_CharT, _Traits, _Alloc>
6085 	    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
6086 		      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6087 	    { return std::move(__lhs.append(__rhs)); }
6088 	
6089 	  template<typename _CharT, typename _Traits, typename _Alloc>
6090 	    inline basic_string<_CharT, _Traits, _Alloc>
6091 	    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6092 		      basic_string<_CharT, _Traits, _Alloc>&& __rhs)
6093 	    { return std::move(__rhs.insert(0, __lhs)); }
6094 	
6095 	  template<typename _CharT, typename _Traits, typename _Alloc>
6096 	    inline basic_string<_CharT, _Traits, _Alloc>
6097 	    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
6098 		      basic_string<_CharT, _Traits, _Alloc>&& __rhs)
6099 	    {
6100 	      const auto __size = __lhs.size() + __rhs.size();
6101 	      const bool __cond = (__size > __lhs.capacity()
6102 				   && __size <= __rhs.capacity());
6103 	      return __cond ? std::move(__rhs.insert(0, __lhs))
6104 		            : std::move(__lhs.append(__rhs));
6105 	    }
6106 	
6107 	  template<typename _CharT, typename _Traits, typename _Alloc>
6108 	    inline basic_string<_CharT, _Traits, _Alloc>
6109 	    operator+(const _CharT* __lhs,
6110 		      basic_string<_CharT, _Traits, _Alloc>&& __rhs)
6111 	    { return std::move(__rhs.insert(0, __lhs)); }
6112 	
6113 	  template<typename _CharT, typename _Traits, typename _Alloc>
6114 	    inline basic_string<_CharT, _Traits, _Alloc>
6115 	    operator+(_CharT __lhs,
6116 		      basic_string<_CharT, _Traits, _Alloc>&& __rhs)
6117 	    { return std::move(__rhs.insert(0, 1, __lhs)); }
6118 	
6119 	  template<typename _CharT, typename _Traits, typename _Alloc>
6120 	    inline basic_string<_CharT, _Traits, _Alloc>
6121 	    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
6122 		      const _CharT* __rhs)
6123 	    { return std::move(__lhs.append(__rhs)); }
6124 	
6125 	  template<typename _CharT, typename _Traits, typename _Alloc>
6126 	    inline basic_string<_CharT, _Traits, _Alloc>
6127 	    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
6128 		      _CharT __rhs)
6129 	    { return std::move(__lhs.append(1, __rhs)); }
6130 	#endif
6131 	
6132 	  // operator ==
6133 	  /**
6134 	   *  @brief  Test equivalence of two strings.
6135 	   *  @param __lhs  First string.
6136 	   *  @param __rhs  Second string.
6137 	   *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
6138 	   */
6139 	  template<typename _CharT, typename _Traits, typename _Alloc>
6140 	    inline bool
6141 	    operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6142 		       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6143 	    _GLIBCXX_NOEXCEPT
6144 	    { return __lhs.compare(__rhs) == 0; }
6145 	
6146 	  template<typename _CharT>
6147 	    inline
6148 	    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
6149 	    operator==(const basic_string<_CharT>& __lhs,
6150 		       const basic_string<_CharT>& __rhs) _GLIBCXX_NOEXCEPT
6151 	    { return (__lhs.size() == __rhs.size()
6152 		      && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
6153 							    __lhs.size())); }
6154 	
6155 	  /**
6156 	   *  @brief  Test equivalence of C string and string.
6157 	   *  @param __lhs  C string.
6158 	   *  @param __rhs  String.
6159 	   *  @return  True if @a __rhs.compare(@a __lhs) == 0.  False otherwise.
6160 	   */
6161 	  template<typename _CharT, typename _Traits, typename _Alloc>
6162 	    inline bool
6163 	    operator==(const _CharT* __lhs,
6164 		       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6165 	    { return __rhs.compare(__lhs) == 0; }
6166 	
6167 	  /**
6168 	   *  @brief  Test equivalence of string and C string.
6169 	   *  @param __lhs  String.
6170 	   *  @param __rhs  C string.
6171 	   *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
6172 	   */
6173 	  template<typename _CharT, typename _Traits, typename _Alloc>
6174 	    inline bool
6175 	    operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6176 		       const _CharT* __rhs)
6177 	    { return __lhs.compare(__rhs) == 0; }
6178 	
6179 	  // operator !=
6180 	  /**
6181 	   *  @brief  Test difference of two strings.
6182 	   *  @param __lhs  First string.
6183 	   *  @param __rhs  Second string.
6184 	   *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
6185 	   */
6186 	  template<typename _CharT, typename _Traits, typename _Alloc>
6187 	    inline bool
6188 	    operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6189 		       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6190 	    _GLIBCXX_NOEXCEPT
6191 	    { return !(__lhs == __rhs); }
6192 	
6193 	  /**
6194 	   *  @brief  Test difference of C string and string.
6195 	   *  @param __lhs  C string.
6196 	   *  @param __rhs  String.
6197 	   *  @return  True if @a __rhs.compare(@a __lhs) != 0.  False otherwise.
6198 	   */
6199 	  template<typename _CharT, typename _Traits, typename _Alloc>
6200 	    inline bool
6201 	    operator!=(const _CharT* __lhs,
6202 		       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6203 	    { return !(__lhs == __rhs); }
6204 	
6205 	  /**
6206 	   *  @brief  Test difference of string and C string.
6207 	   *  @param __lhs  String.
6208 	   *  @param __rhs  C string.
6209 	   *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
6210 	   */
6211 	  template<typename _CharT, typename _Traits, typename _Alloc>
6212 	    inline bool
6213 	    operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6214 		       const _CharT* __rhs)
6215 	    { return !(__lhs == __rhs); }
6216 	
6217 	  // operator <
6218 	  /**
6219 	   *  @brief  Test if string precedes string.
6220 	   *  @param __lhs  First string.
6221 	   *  @param __rhs  Second string.
6222 	   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
6223 	   */
6224 	  template<typename _CharT, typename _Traits, typename _Alloc>
6225 	    inline bool
6226 	    operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6227 		      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6228 	    _GLIBCXX_NOEXCEPT
6229 	    { return __lhs.compare(__rhs) < 0; }
6230 	
6231 	  /**
6232 	   *  @brief  Test if string precedes C string.
6233 	   *  @param __lhs  String.
6234 	   *  @param __rhs  C string.
6235 	   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
6236 	   */
6237 	  template<typename _CharT, typename _Traits, typename _Alloc>
6238 	    inline bool
6239 	    operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6240 		      const _CharT* __rhs)
6241 	    { return __lhs.compare(__rhs) < 0; }
6242 	
6243 	  /**
6244 	   *  @brief  Test if C string precedes string.
6245 	   *  @param __lhs  C string.
6246 	   *  @param __rhs  String.
6247 	   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
6248 	   */
6249 	  template<typename _CharT, typename _Traits, typename _Alloc>
6250 	    inline bool
6251 	    operator<(const _CharT* __lhs,
6252 		      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6253 	    { return __rhs.compare(__lhs) > 0; }
6254 	
6255 	  // operator >
6256 	  /**
6257 	   *  @brief  Test if string follows string.
6258 	   *  @param __lhs  First string.
6259 	   *  @param __rhs  Second string.
6260 	   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
6261 	   */
6262 	  template<typename _CharT, typename _Traits, typename _Alloc>
6263 	    inline bool
6264 	    operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6265 		      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6266 	    _GLIBCXX_NOEXCEPT
6267 	    { return __lhs.compare(__rhs) > 0; }
6268 	
6269 	  /**
6270 	   *  @brief  Test if string follows C string.
6271 	   *  @param __lhs  String.
6272 	   *  @param __rhs  C string.
6273 	   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
6274 	   */
6275 	  template<typename _CharT, typename _Traits, typename _Alloc>
6276 	    inline bool
6277 	    operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6278 		      const _CharT* __rhs)
6279 	    { return __lhs.compare(__rhs) > 0; }
6280 	
6281 	  /**
6282 	   *  @brief  Test if C string follows string.
6283 	   *  @param __lhs  C string.
6284 	   *  @param __rhs  String.
6285 	   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
6286 	   */
6287 	  template<typename _CharT, typename _Traits, typename _Alloc>
6288 	    inline bool
6289 	    operator>(const _CharT* __lhs,
6290 		      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6291 	    { return __rhs.compare(__lhs) < 0; }
6292 	
6293 	  // operator <=
6294 	  /**
6295 	   *  @brief  Test if string doesn't follow string.
6296 	   *  @param __lhs  First string.
6297 	   *  @param __rhs  Second string.
6298 	   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
6299 	   */
6300 	  template<typename _CharT, typename _Traits, typename _Alloc>
6301 	    inline bool
6302 	    operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6303 		       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6304 	    _GLIBCXX_NOEXCEPT
6305 	    { return __lhs.compare(__rhs) <= 0; }
6306 	
6307 	  /**
6308 	   *  @brief  Test if string doesn't follow C string.
6309 	   *  @param __lhs  String.
6310 	   *  @param __rhs  C string.
6311 	   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
6312 	   */
6313 	  template<typename _CharT, typename _Traits, typename _Alloc>
6314 	    inline bool
6315 	    operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6316 		       const _CharT* __rhs)
6317 	    { return __lhs.compare(__rhs) <= 0; }
6318 	
6319 	  /**
6320 	   *  @brief  Test if C string doesn't follow string.
6321 	   *  @param __lhs  C string.
6322 	   *  @param __rhs  String.
6323 	   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
6324 	   */
6325 	  template<typename _CharT, typename _Traits, typename _Alloc>
6326 	    inline bool
6327 	    operator<=(const _CharT* __lhs,
6328 		       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6329 	    { return __rhs.compare(__lhs) >= 0; }
6330 	
6331 	  // operator >=
6332 	  /**
6333 	   *  @brief  Test if string doesn't precede string.
6334 	   *  @param __lhs  First string.
6335 	   *  @param __rhs  Second string.
6336 	   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
6337 	   */
6338 	  template<typename _CharT, typename _Traits, typename _Alloc>
6339 	    inline bool
6340 	    operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6341 		       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6342 	    _GLIBCXX_NOEXCEPT
6343 	    { return __lhs.compare(__rhs) >= 0; }
6344 	
6345 	  /**
6346 	   *  @brief  Test if string doesn't precede C string.
6347 	   *  @param __lhs  String.
6348 	   *  @param __rhs  C string.
6349 	   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
6350 	   */
6351 	  template<typename _CharT, typename _Traits, typename _Alloc>
6352 	    inline bool
6353 	    operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
6354 		       const _CharT* __rhs)
6355 	    { return __lhs.compare(__rhs) >= 0; }
6356 	
6357 	  /**
6358 	   *  @brief  Test if C string doesn't precede string.
6359 	   *  @param __lhs  C string.
6360 	   *  @param __rhs  String.
6361 	   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
6362 	   */
6363 	  template<typename _CharT, typename _Traits, typename _Alloc>
6364 	    inline bool
6365 	    operator>=(const _CharT* __lhs,
6366 		     const basic_string<_CharT, _Traits, _Alloc>& __rhs)
6367 	    { return __rhs.compare(__lhs) <= 0; }
6368 	
6369 	  /**
6370 	   *  @brief  Swap contents of two strings.
6371 	   *  @param __lhs  First string.
6372 	   *  @param __rhs  Second string.
6373 	   *
6374 	   *  Exchanges the contents of @a __lhs and @a __rhs in constant time.
6375 	   */
6376 	  template<typename _CharT, typename _Traits, typename _Alloc>
6377 	    inline void
6378 	    swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
6379 		 basic_string<_CharT, _Traits, _Alloc>& __rhs)
6380 	    _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs)))
6381 	    { __lhs.swap(__rhs); }
6382 	
6383 	
6384 	  /**
6385 	   *  @brief  Read stream into a string.
6386 	   *  @param __is  Input stream.
6387 	   *  @param __str  Buffer to store into.
6388 	   *  @return  Reference to the input stream.
6389 	   *
6390 	   *  Stores characters from @a __is into @a __str until whitespace is
6391 	   *  found, the end of the stream is encountered, or str.max_size()
6392 	   *  is reached.  If is.width() is non-zero, that is the limit on the
6393 	   *  number of characters stored into @a __str.  Any previous
6394 	   *  contents of @a __str are erased.
6395 	   */
6396 	  template<typename _CharT, typename _Traits, typename _Alloc>
6397 	    basic_istream<_CharT, _Traits>&
6398 	    operator>>(basic_istream<_CharT, _Traits>& __is,
6399 		       basic_string<_CharT, _Traits, _Alloc>& __str);
6400 	
6401 	  template<>
6402 	    basic_istream<char>&
6403 	    operator>>(basic_istream<char>& __is, basic_string<char>& __str);
6404 	
6405 	  /**
6406 	   *  @brief  Write string to a stream.
6407 	   *  @param __os  Output stream.
6408 	   *  @param __str  String to write out.
6409 	   *  @return  Reference to the output stream.
6410 	   *
6411 	   *  Output characters of @a __str into os following the same rules as for
6412 	   *  writing a C string.
6413 	   */
6414 	  template<typename _CharT, typename _Traits, typename _Alloc>
6415 	    inline basic_ostream<_CharT, _Traits>&
6416 	    operator<<(basic_ostream<_CharT, _Traits>& __os,
6417 		       const basic_string<_CharT, _Traits, _Alloc>& __str)
6418 	    {
6419 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
6420 	      // 586. string inserter not a formatted function
6421 	      return __ostream_insert(__os, __str.data(), __str.size());
6422 	    }
6423 	
6424 	  /**
6425 	   *  @brief  Read a line from stream into a string.
6426 	   *  @param __is  Input stream.
6427 	   *  @param __str  Buffer to store into.
6428 	   *  @param __delim  Character marking end of line.
6429 	   *  @return  Reference to the input stream.
6430 	   *
6431 	   *  Stores characters from @a __is into @a __str until @a __delim is
6432 	   *  found, the end of the stream is encountered, or str.max_size()
6433 	   *  is reached.  Any previous contents of @a __str are erased.  If
6434 	   *  @a __delim is encountered, it is extracted but not stored into
6435 	   *  @a __str.
6436 	   */
6437 	  template<typename _CharT, typename _Traits, typename _Alloc>
6438 	    basic_istream<_CharT, _Traits>&
6439 	    getline(basic_istream<_CharT, _Traits>& __is,
6440 		    basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
6441 	
6442 	  /**
6443 	   *  @brief  Read a line from stream into a string.
6444 	   *  @param __is  Input stream.
6445 	   *  @param __str  Buffer to store into.
6446 	   *  @return  Reference to the input stream.
6447 	   *
6448 	   *  Stores characters from is into @a __str until &apos;\n&apos; is
6449 	   *  found, the end of the stream is encountered, or str.max_size()
6450 	   *  is reached.  Any previous contents of @a __str are erased.  If
6451 	   *  end of line is encountered, it is extracted but not stored into
6452 	   *  @a __str.
6453 	   */
6454 	  template<typename _CharT, typename _Traits, typename _Alloc>
6455 	    inline basic_istream<_CharT, _Traits>&
6456 	    getline(basic_istream<_CharT, _Traits>& __is,
6457 		    basic_string<_CharT, _Traits, _Alloc>& __str)
6458 	    { return std::getline(__is, __str, __is.widen('\n')); }
6459 	
6460 	#if __cplusplus >= 201103L
6461 	  /// Read a line from an rvalue stream into a string.
6462 	  template<typename _CharT, typename _Traits, typename _Alloc>
6463 	    inline basic_istream<_CharT, _Traits>&
6464 	    getline(basic_istream<_CharT, _Traits>&& __is,
6465 		    basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
6466 	    { return std::getline(__is, __str, __delim); }
6467 	
6468 	  /// Read a line from an rvalue stream into a string.
6469 	  template<typename _CharT, typename _Traits, typename _Alloc>
6470 	    inline basic_istream<_CharT, _Traits>&
6471 	    getline(basic_istream<_CharT, _Traits>&& __is,
6472 		    basic_string<_CharT, _Traits, _Alloc>& __str)
6473 	    { return std::getline(__is, __str); }
6474 	#endif
6475 	
6476 	  template<>
6477 	    basic_istream<char>&
6478 	    getline(basic_istream<char>& __in, basic_string<char>& __str,
6479 		    char __delim);
6480 	
6481 	#ifdef _GLIBCXX_USE_WCHAR_T
6482 	  template<>
6483 	    basic_istream<wchar_t>&
6484 	    getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
6485 		    wchar_t __delim);
6486 	#endif  
6487 	
6488 	_GLIBCXX_END_NAMESPACE_VERSION
6489 	} // namespace
6490 	
6491 	#if __cplusplus >= 201103L
6492 	
6493 	#include <ext/string_conversions.h>
6494 	
6495 	namespace std _GLIBCXX_VISIBILITY(default)
6496 	{
6497 	_GLIBCXX_BEGIN_NAMESPACE_VERSION
6498 	_GLIBCXX_BEGIN_NAMESPACE_CXX11
6499 	
6500 	#if _GLIBCXX_USE_C99_STDLIB
6501 	  // 21.4 Numeric Conversions [string.conversions].
6502 	  inline int
6503 	  stoi(const string& __str, size_t* __idx = 0, int __base = 10)
6504 	  { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
6505 						__idx, __base); }
6506 	
6507 	  inline long
6508 	  stol(const string& __str, size_t* __idx = 0, int __base = 10)
6509 	  { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
6510 				     __idx, __base); }
6511 	
6512 	  inline unsigned long
6513 	  stoul(const string& __str, size_t* __idx = 0, int __base = 10)
6514 	  { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
6515 				     __idx, __base); }
6516 	
6517 	  inline long long
6518 	  stoll(const string& __str, size_t* __idx = 0, int __base = 10)
6519 	  { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
6520 				     __idx, __base); }
6521 	
6522 	  inline unsigned long long
6523 	  stoull(const string& __str, size_t* __idx = 0, int __base = 10)
6524 	  { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
6525 				     __idx, __base); }
6526 	
6527 	  // NB: strtof vs strtod.
6528 	  inline float
6529 	  stof(const string& __str, size_t* __idx = 0)
6530 	  { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
6531 	
6532 	  inline double
6533 	  stod(const string& __str, size_t* __idx = 0)
6534 	  { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
6535 	
6536 	  inline long double
6537 	  stold(const string& __str, size_t* __idx = 0)
6538 	  { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
6539 	#endif // _GLIBCXX_USE_C99_STDLIB
6540 	
6541 	#if _GLIBCXX_USE_C99_STDIO
6542 	  // NB: (v)snprintf vs sprintf.
6543 	
6544 	  // DR 1261.
6545 	  inline string
6546 	  to_string(int __val)
6547 	  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int),
6548 						   "%d", __val); }
6549 	
6550 	  inline string
6551 	  to_string(unsigned __val)
6552 	  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
6553 						   4 * sizeof(unsigned),
6554 						   "%u", __val); }
6555 	
6556 	  inline string
6557 	  to_string(long __val)
6558 	  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long),
6559 						   "%ld", __val); }
6560 	
6561 	  inline string
6562 	  to_string(unsigned long __val)
6563 	  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
6564 						   4 * sizeof(unsigned long),
6565 						   "%lu", __val); }
6566 	
6567 	  inline string
6568 	  to_string(long long __val)
6569 	  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
6570 						   4 * sizeof(long long),
6571 						   "%lld", __val); }
6572 	
6573 	  inline string
6574 	  to_string(unsigned long long __val)
6575 	  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
6576 						   4 * sizeof(unsigned long long),
6577 						   "%llu", __val); }
6578 	
6579 	  inline string
6580 	  to_string(float __val)
6581 	  {
6582 	    const int __n = 
6583 	      __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
6584 	    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
6585 						   "%f", __val);
6586 	  }
6587 	
6588 	  inline string
6589 	  to_string(double __val)
6590 	  {
6591 	    const int __n = 
6592 	      __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
6593 	    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
6594 						   "%f", __val);
6595 	  }
6596 	
6597 	  inline string
6598 	  to_string(long double __val)
6599 	  {
6600 	    const int __n = 
6601 	      __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
6602 	    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
6603 						   "%Lf", __val);
6604 	  }
6605 	#endif // _GLIBCXX_USE_C99_STDIO
6606 	
6607 	#if defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_WCHAR
6608 	  inline int 
6609 	  stoi(const wstring& __str, size_t* __idx = 0, int __base = 10)
6610 	  { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
6611 						__idx, __base); }
6612 	
6613 	  inline long 
6614 	  stol(const wstring& __str, size_t* __idx = 0, int __base = 10)
6615 	  { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
6616 				     __idx, __base); }
6617 	
6618 	  inline unsigned long
6619 	  stoul(const wstring& __str, size_t* __idx = 0, int __base = 10)
6620 	  { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
6621 				     __idx, __base); }
6622 	
6623 	  inline long long
6624 	  stoll(const wstring& __str, size_t* __idx = 0, int __base = 10)
6625 	  { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
6626 				     __idx, __base); }
6627 	
6628 	  inline unsigned long long
6629 	  stoull(const wstring& __str, size_t* __idx = 0, int __base = 10)
6630 	  { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
6631 				     __idx, __base); }
6632 	
6633 	  // NB: wcstof vs wcstod.
6634 	  inline float
6635 	  stof(const wstring& __str, size_t* __idx = 0)
6636 	  { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
6637 	
6638 	  inline double
6639 	  stod(const wstring& __str, size_t* __idx = 0)
6640 	  { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
6641 	
6642 	  inline long double
6643 	  stold(const wstring& __str, size_t* __idx = 0)
6644 	  { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
6645 	
6646 	#ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
6647 	  // DR 1261.
6648 	  inline wstring
6649 	  to_wstring(int __val)
6650 	  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(int),
6651 						    L"%d", __val); }
6652 	
6653 	  inline wstring
6654 	  to_wstring(unsigned __val)
6655 	  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
6656 						    4 * sizeof(unsigned),
6657 						    L"%u", __val); }
6658 	
6659 	  inline wstring
6660 	  to_wstring(long __val)
6661 	  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(long),
6662 						    L"%ld", __val); }
6663 	
6664 	  inline wstring
6665 	  to_wstring(unsigned long __val)
6666 	  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
6667 						    4 * sizeof(unsigned long),
6668 						    L"%lu", __val); }
6669 	
6670 	  inline wstring
6671 	  to_wstring(long long __val)
6672 	  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
6673 						    4 * sizeof(long long),
6674 						    L"%lld", __val); }
6675 	
6676 	  inline wstring
6677 	  to_wstring(unsigned long long __val)
6678 	  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
6679 						    4 * sizeof(unsigned long long),
6680 						    L"%llu", __val); }
6681 	
6682 	  inline wstring
6683 	  to_wstring(float __val)
6684 	  {
6685 	    const int __n =
6686 	      __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
6687 	    return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
6688 						    L"%f", __val);
6689 	  }
6690 	
6691 	  inline wstring
6692 	  to_wstring(double __val)
6693 	  {
6694 	    const int __n =
6695 	      __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
6696 	    return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
6697 						    L"%f", __val);
6698 	  }
6699 	
6700 	  inline wstring
6701 	  to_wstring(long double __val)
6702 	  {
6703 	    const int __n =
6704 	      __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
6705 	    return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
6706 						    L"%Lf", __val);
6707 	  }
6708 	#endif // _GLIBCXX_HAVE_BROKEN_VSWPRINTF
6709 	#endif // _GLIBCXX_USE_WCHAR_T && _GLIBCXX_USE_C99_WCHAR
6710 	
6711 	_GLIBCXX_END_NAMESPACE_CXX11
6712 	_GLIBCXX_END_NAMESPACE_VERSION
6713 	} // namespace
6714 	
6715 	#endif /* C++11 */
6716 	
6717 	#if __cplusplus >= 201103L
6718 	
6719 	#include <bits/functional_hash.h>
6720 	
6721 	namespace std _GLIBCXX_VISIBILITY(default)
6722 	{
6723 	_GLIBCXX_BEGIN_NAMESPACE_VERSION
6724 	
6725 	  // DR 1182.
6726 	
6727 	#ifndef _GLIBCXX_COMPATIBILITY_CXX0X
6728 	  /// std::hash specialization for string.
6729 	  template<>
6730 	    struct hash<string>
6731 	    : public __hash_base<size_t, string>
6732 	    {
6733 	      size_t
6734 	      operator()(const string& __s) const noexcept
6735 	      { return std::_Hash_impl::hash(__s.data(), __s.length()); }
6736 	    };
6737 	
6738 	  template<>
6739 	    struct __is_fast_hash<hash<string>> : std::false_type
6740 	    { };
6741 	
6742 	#ifdef _GLIBCXX_USE_WCHAR_T
6743 	  /// std::hash specialization for wstring.
6744 	  template<>
6745 	    struct hash<wstring>
6746 	    : public __hash_base<size_t, wstring>
6747 	    {
6748 	      size_t
6749 	      operator()(const wstring& __s) const noexcept
6750 	      { return std::_Hash_impl::hash(__s.data(),
6751 	                                     __s.length() * sizeof(wchar_t)); }
6752 	    };
6753 	
6754 	  template<>
6755 	    struct __is_fast_hash<hash<wstring>> : std::false_type
6756 	    { };
6757 	#endif
6758 	#endif /* _GLIBCXX_COMPATIBILITY_CXX0X */
6759 	
6760 	#ifdef _GLIBCXX_USE_CHAR8_T
6761 	  /// std::hash specialization for u8string.
6762 	  template<>
6763 	    struct hash<u8string>
6764 	    : public __hash_base<size_t, u8string>
6765 	    {
6766 	      size_t
6767 	      operator()(const u8string& __s) const noexcept
6768 	      { return std::_Hash_impl::hash(__s.data(),
6769 	                                     __s.length() * sizeof(char8_t)); }
6770 	    };
6771 	
6772 	  template<>
6773 	    struct __is_fast_hash<hash<u8string>> : std::false_type
6774 	    { };
6775 	#endif
6776 	
6777 	  /// std::hash specialization for u16string.
6778 	  template<>
6779 	    struct hash<u16string>
6780 	    : public __hash_base<size_t, u16string>
6781 	    {
6782 	      size_t
6783 	      operator()(const u16string& __s) const noexcept
6784 	      { return std::_Hash_impl::hash(__s.data(),
6785 	                                     __s.length() * sizeof(char16_t)); }
6786 	    };
6787 	
6788 	  template<>
6789 	    struct __is_fast_hash<hash<u16string>> : std::false_type
6790 	    { };
6791 	
6792 	  /// std::hash specialization for u32string.
6793 	  template<>
6794 	    struct hash<u32string>
6795 	    : public __hash_base<size_t, u32string>
6796 	    {
6797 	      size_t
6798 	      operator()(const u32string& __s) const noexcept
6799 	      { return std::_Hash_impl::hash(__s.data(),
6800 	                                     __s.length() * sizeof(char32_t)); }
6801 	    };
6802 	
6803 	  template<>
6804 	    struct __is_fast_hash<hash<u32string>> : std::false_type
6805 	    { };
6806 	
6807 	#if __cplusplus >= 201402L
6808 	
6809 	#define __cpp_lib_string_udls 201304
6810 	
6811 	  inline namespace literals
6812 	  {
6813 	  inline namespace string_literals
6814 	  {
6815 	#pragma GCC diagnostic push
6816 	#pragma GCC diagnostic ignored "-Wliteral-suffix"
6817 	    _GLIBCXX_DEFAULT_ABI_TAG
6818 	    inline basic_string<char>
6819 	    operator""s(const char* __str, size_t __len)
6820 	    { return basic_string<char>{__str, __len}; }
6821 	
6822 	#ifdef _GLIBCXX_USE_WCHAR_T
6823 	    _GLIBCXX_DEFAULT_ABI_TAG
6824 	    inline basic_string<wchar_t>
6825 	    operator""s(const wchar_t* __str, size_t __len)
6826 	    { return basic_string<wchar_t>{__str, __len}; }
6827 	#endif
6828 	
6829 	#ifdef _GLIBCXX_USE_CHAR8_T
6830 	    _GLIBCXX_DEFAULT_ABI_TAG
6831 	    inline basic_string<char8_t>
6832 	    operator""s(const char8_t* __str, size_t __len)
6833 	    { return basic_string<char8_t>{__str, __len}; }
6834 	#endif
6835 	
6836 	    _GLIBCXX_DEFAULT_ABI_TAG
6837 	    inline basic_string<char16_t>
6838 	    operator""s(const char16_t* __str, size_t __len)
6839 	    { return basic_string<char16_t>{__str, __len}; }
6840 	
6841 	    _GLIBCXX_DEFAULT_ABI_TAG
6842 	    inline basic_string<char32_t>
6843 	    operator""s(const char32_t* __str, size_t __len)
6844 	    { return basic_string<char32_t>{__str, __len}; }
6845 	
6846 	#pragma GCC diagnostic pop
6847 	  } // inline namespace string_literals
6848 	  } // inline namespace literals
6849 	
6850 	#if __cplusplus >= 201703L
6851 	  namespace __detail::__variant
6852 	  {
6853 	    template<typename> struct _Never_valueless_alt; // see <variant>
6854 	
6855 	    // Provide the strong exception-safety guarantee when emplacing a
6856 	    // basic_string into a variant, but only if moving the string cannot throw.
6857 	    template<typename _Tp, typename _Traits, typename _Alloc>
6858 	      struct _Never_valueless_alt<std::basic_string<_Tp, _Traits, _Alloc>>
6859 	      : __and_<
6860 		is_nothrow_move_constructible<std::basic_string<_Tp, _Traits, _Alloc>>,
6861 		is_nothrow_move_assignable<std::basic_string<_Tp, _Traits, _Alloc>>
6862 		>::type
6863 	      { };
6864 	  }  // namespace __detail::__variant
6865 	#endif // C++17
6866 	#endif // C++14
6867 	
6868 	_GLIBCXX_END_NAMESPACE_VERSION
6869 	} // namespace std
6870 	
6871 	#endif // C++11
6872 	
6873 	#endif /* _BASIC_STRING_H */
6874