source: Daodan/MSYS2/mingw32/include/c++/11.2.0/bits/basic_string.h

Last change on this file was 1166, checked in by rossy, 3 years ago

Daodan: Replace MinGW build env with an up-to-date MSYS2 env

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