xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/bits/basic_string.h (revision 53b02e147d4ed531c0d2a5ca9b3e8026ba3e99b5)
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;
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;
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       {
348 	if (__n == 1)
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
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)
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