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 
52namespace 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 
6495namespace 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 
6721namespace 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