Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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