1// Components for manipulating sequences of characters -*- C++ -*-
2
3// Copyright (C) 1997-2013 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file bits/basic_string.h
26 *  This is an internal header file, included by other library headers.
27 *  Do not attempt to use it directly. @headername{string}
28 */
29
30//
31// ISO C++ 14882: 21 Strings library
32//
33
34#ifndef _BASIC_STRING_H
35#define _BASIC_STRING_H 1
36
37#pragma GCC system_header
38
39#include <ext/atomicity.h>
40#include <debug/debug.h>
41#if __cplusplus >= 201103L
42#include <initializer_list>
43#endif
44
45namespace std _GLIBCXX_VISIBILITY(default)
46{
47_GLIBCXX_BEGIN_NAMESPACE_VERSION
48
49  /**
50   *  @class basic_string basic_string.h <string>
51   *  @brief  Managing sequences of characters and character-like objects.
52   *
53   *  @ingroup strings
54   *  @ingroup sequences
55   *
56   *  @tparam _CharT  Type of character
57   *  @tparam _Traits  Traits for character type, defaults to
58   *                   char_traits<_CharT>.
59   *  @tparam _Alloc  Allocator type, defaults to allocator<_CharT>.
60   *
61   *  Meets the requirements of a <a href="tables.html#65">container</a>, a
62   *  <a href="tables.html#66">reversible container</a>, and a
63   *  <a href="tables.html#67">sequence</a>.  Of the
64   *  <a href="tables.html#68">optional sequence requirements</a>, only
65   *  @c push_back, @c at, and @c %array access are supported.
66   *
67   *  @doctodo
68   *
69   *
70   *  Documentation?  What's that?
71   *  Nathan Myers <ncm@cantrip.org>.
72   *
73   *  A string looks like this:
74   *
75   *  @code
76   *                                        [_Rep]
77   *                                        _M_length
78   *   [basic_string<char_type>]            _M_capacity
79   *   _M_dataplus                          _M_refcount
80   *   _M_p ---------------->               unnamed array of char_type
81   *  @endcode
82   *
83   *  Where the _M_p points to the first character in the string, and
84   *  you cast it to a pointer-to-_Rep and subtract 1 to get a
85   *  pointer to the header.
86   *
87   *  This approach has the enormous advantage that a string object
88   *  requires only one allocation.  All the ugliness is confined
89   *  within a single %pair of inline functions, which each compile to
90   *  a single @a add instruction: _Rep::_M_data(), and
91   *  string::_M_rep(); and the allocation function which gets a
92   *  block of raw bytes and with room enough and constructs a _Rep
93   *  object at the front.
94   *
95   *  The reason you want _M_data pointing to the character %array and
96   *  not the _Rep is so that the debugger can see the string
97   *  contents. (Probably we should add a non-inline member to get
98   *  the _Rep for the debugger to use, so users can check the actual
99   *  string length.)
100   *
101   *  Note that the _Rep object is a POD so that you can have a
102   *  static <em>empty string</em> _Rep object already @a constructed before
103   *  static constructors have run.  The reference-count encoding is
104   *  chosen so that a 0 indicates one reference, so you never try to
105   *  destroy the empty-string _Rep object.
106   *
107   *  All but the last paragraph is considered pretty conventional
108   *  for a C++ string implementation.
109  */
110  // 21.3  Template class basic_string
111  template<typename _CharT, typename _Traits, typename _Alloc>
112    class basic_string
113    {
114      typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
115
116      // Types:
117    public:
118      typedef _Traits					    traits_type;
119      typedef typename _Traits::char_type		    value_type;
120      typedef _Alloc					    allocator_type;
121      typedef typename _CharT_alloc_type::size_type	    size_type;
122      typedef typename _CharT_alloc_type::difference_type   difference_type;
123      typedef typename _CharT_alloc_type::reference	    reference;
124      typedef typename _CharT_alloc_type::const_reference   const_reference;
125      typedef typename _CharT_alloc_type::pointer	    pointer;
126      typedef typename _CharT_alloc_type::const_pointer	    const_pointer;
127      typedef __gnu_cxx::__normal_iterator<pointer, basic_string>  iterator;
128      typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
129                                                            const_iterator;
130      typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;
131      typedef std::reverse_iterator<iterator>		    reverse_iterator;
132
133    private:
134      // _Rep: string representation
135      //   Invariants:
136      //   1. String really contains _M_length + 1 characters: due to 21.3.4
137      //      must be kept null-terminated.
138      //   2. _M_capacity >= _M_length
139      //      Allocated memory is always (_M_capacity + 1) * sizeof(_CharT).
140      //   3. _M_refcount has three states:
141      //      -1: leaked, one reference, no ref-copies allowed, non-const.
142      //       0: one reference, non-const.
143      //     n>0: n + 1 references, operations require a lock, const.
144      //   4. All fields==0 is an empty string, given the extra storage
145      //      beyond-the-end for a null terminator; thus, the shared
146      //      empty string representation needs no constructor.
147
148      struct _Rep_base
149      {
150	size_type		_M_length;
151	size_type		_M_capacity;
152	_Atomic_word		_M_refcount;
153      };
154
155      struct _Rep : _Rep_base
156      {
157	// Types:
158	typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
159
160	// (Public) Data members:
161
162	// The maximum number of individual char_type elements of an
163	// individual string is determined by _S_max_size. This is the
164	// value that will be returned by max_size().  (Whereas npos
165	// is the maximum number of bytes the allocator can allocate.)
166	// If one was to divvy up the theoretical largest size string,
167	// with a terminating character and m _CharT elements, it'd
168	// look like this:
169	// npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
170	// Solving for m:
171	// m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
172	// In addition, this implementation quarters this amount.
173	static const size_type	_S_max_size;
174	static const _CharT	_S_terminal;
175
176	// The following storage is init'd to 0 by the linker, resulting
177        // (carefully) in an empty string with one reference.
178        static size_type _S_empty_rep_storage[];
179
180        static _Rep&
181        _S_empty_rep()
182        {
183	  // NB: Mild hack to avoid strict-aliasing warnings.  Note that
184	  // _S_empty_rep_storage is never modified and the punning should
185	  // be reasonably safe in this case.
186	  void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
187	  return *reinterpret_cast<_Rep*>(__p);
188	}
189
190        bool
191	_M_is_leaked() const
192        { return this->_M_refcount < 0; }
193
194        bool
195	_M_is_shared() const
196        { return this->_M_refcount > 0; }
197
198        void
199	_M_set_leaked()
200        { this->_M_refcount = -1; }
201
202        void
203	_M_set_sharable()
204        { this->_M_refcount = 0; }
205
206	void
207	_M_set_length_and_sharable(size_type __n)
208	{
209#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
210	  if (__builtin_expect(this != &_S_empty_rep(), false))
211#endif
212	    {
213	      this->_M_set_sharable();  // One reference.
214	      this->_M_length = __n;
215	      traits_type::assign(this->_M_refdata()[__n], _S_terminal);
216	      // grrr. (per 21.3.4)
217	      // You cannot leave those LWG people alone for a second.
218	    }
219	}
220
221	_CharT*
222	_M_refdata() throw()
223	{ return reinterpret_cast<_CharT*>(this + 1); }
224
225	_CharT*
226	_M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
227	{
228	  return (!_M_is_leaked() && __alloc1 == __alloc2)
229	          ? _M_refcopy() : _M_clone(__alloc1);
230	}
231
232	// Create & Destroy
233	static _Rep*
234	_S_create(size_type, size_type, const _Alloc&);
235
236	void
237	_M_dispose(const _Alloc& __a)
238	{
239#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
240	  if (__builtin_expect(this != &_S_empty_rep(), false))
241#endif
242	    {
243	      // Be race-detector-friendly.  For more info see bits/c++config.
244	      _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount);
245	      if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
246							 -1) <= 0)
247		{
248		  _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount);
249		  _M_destroy(__a);
250		}
251	    }
252	}  // XXX MT
253
254	void
255	_M_destroy(const _Alloc&) throw();
256
257	_CharT*
258	_M_refcopy() throw()
259	{
260#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
261	  if (__builtin_expect(this != &_S_empty_rep(), false))
262#endif
263            __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
264	  return _M_refdata();
265	}  // XXX MT
266
267	_CharT*
268	_M_clone(const _Alloc&, size_type __res = 0);
269      };
270
271      // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
272      struct _Alloc_hider : _Alloc
273      {
274	_Alloc_hider(_CharT* __dat, const _Alloc& __a)
275	: _Alloc(__a), _M_p(__dat) { }
276
277	_CharT* _M_p; // The actual data.
278      };
279
280    public:
281      // Data Members (public):
282      // NB: This is an unsigned type, and thus represents the maximum
283      // size that the allocator can hold.
284      ///  Value returned by various member functions when they fail.
285      static const size_type	npos = static_cast<size_type>(-1);
286
287    private:
288      // Data Members (private):
289      mutable _Alloc_hider	_M_dataplus;
290
291      _CharT*
292      _M_data() const
293      { return  _M_dataplus._M_p; }
294
295      _CharT*
296      _M_data(_CharT* __p)
297      { return (_M_dataplus._M_p = __p); }
298
299      _Rep*
300      _M_rep() const
301      { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
302
303      // For the internal use we have functions similar to `begin'/`end'
304      // but they do not call _M_leak.
305      iterator
306      _M_ibegin() const
307      { return iterator(_M_data()); }
308
309      iterator
310      _M_iend() const
311      { return iterator(_M_data() + this->size()); }
312
313      void
314      _M_leak()    // for use in begin() & non-const op[]
315      {
316	if (!_M_rep()->_M_is_leaked())
317	  _M_leak_hard();
318      }
319
320      size_type
321      _M_check(size_type __pos, const char* __s) const
322      {
323	if (__pos > this->size())
324	  __throw_out_of_range(__N(__s));
325	return __pos;
326      }
327
328      void
329      _M_check_length(size_type __n1, size_type __n2, const char* __s) const
330      {
331	if (this->max_size() - (this->size() - __n1) < __n2)
332	  __throw_length_error(__N(__s));
333      }
334
335      // NB: _M_limit doesn't check for a bad __pos value.
336      size_type
337      _M_limit(size_type __pos, size_type __off) const
338      {
339	const bool __testoff =  __off < this->size() - __pos;
340	return __testoff ? __off : this->size() - __pos;
341      }
342
343      // True if _Rep and source do not overlap.
344      bool
345      _M_disjunct(const _CharT* __s) const
346      {
347	return (less<const _CharT*>()(__s, _M_data())
348		|| less<const _CharT*>()(_M_data() + this->size(), __s));
349      }
350
351      // When __n = 1 way faster than the general multichar
352      // traits_type::copy/move/assign.
353      static void
354      _M_copy(_CharT* __d, const _CharT* __s, size_type __n)
355      {
356	if (__n == 1)
357	  traits_type::assign(*__d, *__s);
358	else
359	  traits_type::copy(__d, __s, __n);
360      }
361
362      static void
363      _M_move(_CharT* __d, const _CharT* __s, size_type __n)
364      {
365	if (__n == 1)
366	  traits_type::assign(*__d, *__s);
367	else
368	  traits_type::move(__d, __s, __n);
369      }
370
371      static void
372      _M_assign(_CharT* __d, size_type __n, _CharT __c)
373      {
374	if (__n == 1)
375	  traits_type::assign(*__d, __c);
376	else
377	  traits_type::assign(__d, __n, __c);
378      }
379
380      // _S_copy_chars is a separate template to permit specialization
381      // to optimize for the common case of pointers as iterators.
382      template<class _Iterator>
383        static void
384        _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
385        {
386	  for (; __k1 != __k2; ++__k1, ++__p)
387	    traits_type::assign(*__p, *__k1); // These types are off.
388	}
389
390      static void
391      _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2)
392      { _S_copy_chars(__p, __k1.base(), __k2.base()); }
393
394      static void
395      _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
396      { _S_copy_chars(__p, __k1.base(), __k2.base()); }
397
398      static void
399      _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
400      { _M_copy(__p, __k1, __k2 - __k1); }
401
402      static void
403      _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
404      { _M_copy(__p, __k1, __k2 - __k1); }
405
406      static int
407      _S_compare(size_type __n1, size_type __n2)
408      {
409	const difference_type __d = difference_type(__n1 - __n2);
410
411	if (__d > __gnu_cxx::__numeric_traits<int>::__max)
412	  return __gnu_cxx::__numeric_traits<int>::__max;
413	else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
414	  return __gnu_cxx::__numeric_traits<int>::__min;
415	else
416	  return int(__d);
417      }
418
419      void
420      _M_mutate(size_type __pos, size_type __len1, size_type __len2);
421
422      void
423      _M_leak_hard();
424
425      static _Rep&
426      _S_empty_rep()
427      { return _Rep::_S_empty_rep(); }
428
429    public:
430      // Construct/copy/destroy:
431      // NB: We overload ctors in some cases instead of using default
432      // arguments, per 17.4.4.4 para. 2 item 2.
433
434      /**
435       *  @brief  Default constructor creates an empty string.
436       */
437      basic_string()
438#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
439      : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
440#else
441      : _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc()){ }
442#endif
443
444      /**
445       *  @brief  Construct an empty string using allocator @a a.
446       */
447      explicit
448      basic_string(const _Alloc& __a);
449
450      // NB: per LWG issue 42, semantics different from IS:
451      /**
452       *  @brief  Construct string with copy of value of @a str.
453       *  @param  __str  Source string.
454       */
455      basic_string(const basic_string& __str);
456      /**
457       *  @brief  Construct string as copy of a substring.
458       *  @param  __str  Source string.
459       *  @param  __pos  Index of first character to copy from.
460       *  @param  __n  Number of characters to copy (default remainder).
461       */
462      basic_string(const basic_string& __str, size_type __pos,
463		   size_type __n = npos);
464      /**
465       *  @brief  Construct string as copy of a substring.
466       *  @param  __str  Source string.
467       *  @param  __pos  Index of first character to copy from.
468       *  @param  __n  Number of characters to copy.
469       *  @param  __a  Allocator to use.
470       */
471      basic_string(const basic_string& __str, size_type __pos,
472		   size_type __n, const _Alloc& __a);
473
474      /**
475       *  @brief  Construct string initialized by a character %array.
476       *  @param  __s  Source character %array.
477       *  @param  __n  Number of characters to copy.
478       *  @param  __a  Allocator to use (default is default allocator).
479       *
480       *  NB: @a __s must have at least @a __n characters, &apos;\\0&apos;
481       *  has no special meaning.
482       */
483      basic_string(const _CharT* __s, size_type __n,
484		   const _Alloc& __a = _Alloc());
485      /**
486       *  @brief  Construct string as copy of a C string.
487       *  @param  __s  Source C string.
488       *  @param  __a  Allocator to use (default is default allocator).
489       */
490      basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
491      /**
492       *  @brief  Construct string as multiple characters.
493       *  @param  __n  Number of characters.
494       *  @param  __c  Character to use.
495       *  @param  __a  Allocator to use (default is default allocator).
496       */
497      basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
498
499#if __cplusplus >= 201103L
500      /**
501       *  @brief  Move construct string.
502       *  @param  __str  Source string.
503       *
504       *  The newly-created string contains the exact contents of @a __str.
505       *  @a __str is a valid, but unspecified string.
506       **/
507      basic_string(basic_string&& __str) noexcept
508      : _M_dataplus(__str._M_dataplus)
509      {
510#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
511	__str._M_data(_S_empty_rep()._M_refdata());
512#else
513	__str._M_data(_S_construct(size_type(), _CharT(), get_allocator()));
514#endif
515      }
516
517      /**
518       *  @brief  Construct string from an initializer %list.
519       *  @param  __l  std::initializer_list of characters.
520       *  @param  __a  Allocator to use (default is default allocator).
521       */
522      basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc());
523#endif // C++11
524
525      /**
526       *  @brief  Construct string as copy of a range.
527       *  @param  __beg  Start of range.
528       *  @param  __end  End of range.
529       *  @param  __a  Allocator to use (default is default allocator).
530       */
531      template<class _InputIterator>
532        basic_string(_InputIterator __beg, _InputIterator __end,
533		     const _Alloc& __a = _Alloc());
534
535      /**
536       *  @brief  Destroy the string instance.
537       */
538      ~basic_string() _GLIBCXX_NOEXCEPT
539      { _M_rep()->_M_dispose(this->get_allocator()); }
540
541      /**
542       *  @brief  Assign the value of @a str to this string.
543       *  @param  __str  Source string.
544       */
545      basic_string&
546      operator=(const basic_string& __str)
547      { return this->assign(__str); }
548
549      /**
550       *  @brief  Copy contents of @a s into this string.
551       *  @param  __s  Source null-terminated string.
552       */
553      basic_string&
554      operator=(const _CharT* __s)
555      { return this->assign(__s); }
556
557      /**
558       *  @brief  Set value to string of length 1.
559       *  @param  __c  Source character.
560       *
561       *  Assigning to a character makes this string length 1 and
562       *  (*this)[0] == @a c.
563       */
564      basic_string&
565      operator=(_CharT __c)
566      {
567	this->assign(1, __c);
568	return *this;
569      }
570
571#if __cplusplus >= 201103L
572      /**
573       *  @brief  Move assign the value of @a str to this string.
574       *  @param  __str  Source string.
575       *
576       *  The contents of @a str are moved into this string (without copying).
577       *  @a str is a valid, but unspecified string.
578       **/
579      basic_string&
580      operator=(basic_string&& __str)
581      {
582	// NB: DR 1204.
583	this->swap(__str);
584	return *this;
585      }
586
587      /**
588       *  @brief  Set value to string constructed from initializer %list.
589       *  @param  __l  std::initializer_list.
590       */
591      basic_string&
592      operator=(initializer_list<_CharT> __l)
593      {
594	this->assign(__l.begin(), __l.size());
595	return *this;
596      }
597#endif // C++11
598
599      // Iterators:
600      /**
601       *  Returns a read/write iterator that points to the first character in
602       *  the %string.  Unshares the string.
603       */
604      iterator
605      begin() _GLIBCXX_NOEXCEPT
606      {
607	_M_leak();
608	return iterator(_M_data());
609      }
610
611      /**
612       *  Returns a read-only (constant) iterator that points to the first
613       *  character in the %string.
614       */
615      const_iterator
616      begin() const _GLIBCXX_NOEXCEPT
617      { return const_iterator(_M_data()); }
618
619      /**
620       *  Returns a read/write iterator that points one past the last
621       *  character in the %string.  Unshares the string.
622       */
623      iterator
624      end() _GLIBCXX_NOEXCEPT
625      {
626	_M_leak();
627	return iterator(_M_data() + this->size());
628      }
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.  Unshares the string.
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.  Unshares the string.
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_rep()->_M_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_rep()->_M_length; }
723
724      ///  Returns the size() of the largest possible %string.
725      size_type
726      max_size() const _GLIBCXX_NOEXCEPT
727      { return _Rep::_S_max_size; }
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()
760      {
761	if (capacity() > size())
762	  {
763	    __try
764	      { reserve(0); }
765	    __catch(...)
766	      { }
767	  }
768      }
769#endif
770
771      /**
772       *  Returns the total number of characters that the %string can hold
773       *  before needing to allocate more memory.
774       */
775      size_type
776      capacity() const _GLIBCXX_NOEXCEPT
777      { return _M_rep()->_M_capacity; }
778
779      /**
780       *  @brief  Attempt to preallocate enough memory for specified number of
781       *          characters.
782       *  @param  __res_arg  Number of characters required.
783       *  @throw  std::length_error  If @a __res_arg exceeds @c max_size().
784       *
785       *  This function attempts to reserve enough memory for the
786       *  %string to hold the specified number of characters.  If the
787       *  number requested is more than max_size(), length_error is
788       *  thrown.
789       *
790       *  The advantage of this function is that if optimal code is a
791       *  necessity and the user can determine the string length that will be
792       *  required, the user can reserve the memory in %advance, and thus
793       *  prevent a possible reallocation of memory and copying of %string
794       *  data.
795       */
796      void
797      reserve(size_type __res_arg = 0);
798
799      /**
800       *  Erases the string, making it empty.
801       */
802      void
803      clear() _GLIBCXX_NOEXCEPT
804      { _M_mutate(0, this->size(), 0); }
805
806      /**
807       *  Returns true if the %string is empty.  Equivalent to
808       *  <code>*this == ""</code>.
809       */
810      bool
811      empty() const _GLIBCXX_NOEXCEPT
812      { return this->size() == 0; }
813
814      // Element access:
815      /**
816       *  @brief  Subscript access to the data contained in the %string.
817       *  @param  __pos  The index of the character to access.
818       *  @return  Read-only (constant) reference to the character.
819       *
820       *  This operator allows for easy, array-style, data access.
821       *  Note that data access with this operator is unchecked and
822       *  out_of_range lookups are not defined. (For checked lookups
823       *  see at().)
824       */
825      const_reference
826      operator[] (size_type __pos) const
827      {
828	_GLIBCXX_DEBUG_ASSERT(__pos <= size());
829	return _M_data()[__pos];
830      }
831
832      /**
833       *  @brief  Subscript access to the data contained in the %string.
834       *  @param  __pos  The index of the character to access.
835       *  @return  Read/write reference to the character.
836       *
837       *  This operator allows for easy, array-style, data access.
838       *  Note that data access with this operator is unchecked and
839       *  out_of_range lookups are not defined. (For checked lookups
840       *  see at().)  Unshares the string.
841       */
842      reference
843      operator[](size_type __pos)
844      {
845        // allow pos == size() as v3 extension:
846	_GLIBCXX_DEBUG_ASSERT(__pos <= size());
847        // but be strict in pedantic mode:
848	_GLIBCXX_DEBUG_PEDASSERT(__pos < size());
849	_M_leak();
850	return _M_data()[__pos];
851      }
852
853      /**
854       *  @brief  Provides access to the data contained in the %string.
855       *  @param __n The index of the character to access.
856       *  @return  Read-only (const) reference to the character.
857       *  @throw  std::out_of_range  If @a n is an invalid index.
858       *
859       *  This function provides for safer data access.  The parameter is
860       *  first checked that it is in the range of the string.  The function
861       *  throws out_of_range if the check fails.
862       */
863      const_reference
864      at(size_type __n) const
865      {
866	if (__n >= this->size())
867	  __throw_out_of_range(__N("basic_string::at"));
868	return _M_data()[__n];
869      }
870
871      /**
872       *  @brief  Provides access to the data contained in the %string.
873       *  @param __n The index of the character to access.
874       *  @return  Read/write reference to the character.
875       *  @throw  std::out_of_range  If @a n is an invalid index.
876       *
877       *  This function provides for safer data access.  The parameter is
878       *  first checked that it is in the range of the string.  The function
879       *  throws out_of_range if the check fails.  Success results in
880       *  unsharing the string.
881       */
882      reference
883      at(size_type __n)
884      {
885	if (__n >= size())
886	  __throw_out_of_range(__N("basic_string::at"));
887	_M_leak();
888	return _M_data()[__n];
889      }
890
891#if __cplusplus >= 201103L
892      /**
893       *  Returns a read/write reference to the data at the first
894       *  element of the %string.
895       */
896      reference
897      front()
898      { return operator[](0); }
899
900      /**
901       *  Returns a read-only (constant) reference to the data at the first
902       *  element of the %string.
903       */
904      const_reference
905      front() const
906      { return operator[](0); }
907
908      /**
909       *  Returns a read/write reference to the data at the last
910       *  element of the %string.
911       */
912      reference
913      back()
914      { return operator[](this->size() - 1); }
915
916      /**
917       *  Returns a read-only (constant) reference to the data at the
918       *  last element of the %string.
919       */
920      const_reference
921      back() const
922      { return operator[](this->size() - 1); }
923#endif
924
925      // Modifiers:
926      /**
927       *  @brief  Append a string to this string.
928       *  @param __str  The string to append.
929       *  @return  Reference to this string.
930       */
931      basic_string&
932      operator+=(const basic_string& __str)
933      { return this->append(__str); }
934
935      /**
936       *  @brief  Append a C string.
937       *  @param __s  The C string to append.
938       *  @return  Reference to this string.
939       */
940      basic_string&
941      operator+=(const _CharT* __s)
942      { return this->append(__s); }
943
944      /**
945       *  @brief  Append a character.
946       *  @param __c  The character to append.
947       *  @return  Reference to this string.
948       */
949      basic_string&
950      operator+=(_CharT __c)
951      {
952	this->push_back(__c);
953	return *this;
954      }
955
956#if __cplusplus >= 201103L
957      /**
958       *  @brief  Append an initializer_list of characters.
959       *  @param __l  The initializer_list of characters to be appended.
960       *  @return  Reference to this string.
961       */
962      basic_string&
963      operator+=(initializer_list<_CharT> __l)
964      { return this->append(__l.begin(), __l.size()); }
965#endif // C++11
966
967      /**
968       *  @brief  Append a string to this string.
969       *  @param __str  The string to append.
970       *  @return  Reference to this string.
971       */
972      basic_string&
973      append(const basic_string& __str);
974
975      /**
976       *  @brief  Append a substring.
977       *  @param __str  The string to append.
978       *  @param __pos  Index of the first character of str to append.
979       *  @param __n  The number of characters to append.
980       *  @return  Reference to this string.
981       *  @throw  std::out_of_range if @a __pos is not a valid index.
982       *
983       *  This function appends @a __n characters from @a __str
984       *  starting at @a __pos to this string.  If @a __n is is larger
985       *  than the number of available characters in @a __str, the
986       *  remainder of @a __str is appended.
987       */
988      basic_string&
989      append(const basic_string& __str, size_type __pos, size_type __n);
990
991      /**
992       *  @brief  Append a C substring.
993       *  @param __s  The C string to append.
994       *  @param __n  The number of characters to append.
995       *  @return  Reference to this string.
996       */
997      basic_string&
998      append(const _CharT* __s, size_type __n);
999
1000      /**
1001       *  @brief  Append a C string.
1002       *  @param __s  The C string to append.
1003       *  @return  Reference to this string.
1004       */
1005      basic_string&
1006      append(const _CharT* __s)
1007      {
1008	__glibcxx_requires_string(__s);
1009	return this->append(__s, traits_type::length(__s));
1010      }
1011
1012      /**
1013       *  @brief  Append multiple characters.
1014       *  @param __n  The number of characters to append.
1015       *  @param __c  The character to use.
1016       *  @return  Reference to this string.
1017       *
1018       *  Appends __n copies of __c to this string.
1019       */
1020      basic_string&
1021      append(size_type __n, _CharT __c);
1022
1023#if __cplusplus >= 201103L
1024      /**
1025       *  @brief  Append an initializer_list of characters.
1026       *  @param __l  The initializer_list of characters to append.
1027       *  @return  Reference to this string.
1028       */
1029      basic_string&
1030      append(initializer_list<_CharT> __l)
1031      { return this->append(__l.begin(), __l.size()); }
1032#endif // C++11
1033
1034      /**
1035       *  @brief  Append a range of characters.
1036       *  @param __first  Iterator referencing the first character to append.
1037       *  @param __last  Iterator marking the end of the range.
1038       *  @return  Reference to this string.
1039       *
1040       *  Appends characters in the range [__first,__last) to this string.
1041       */
1042      template<class _InputIterator>
1043        basic_string&
1044        append(_InputIterator __first, _InputIterator __last)
1045        { return this->replace(_M_iend(), _M_iend(), __first, __last); }
1046
1047      /**
1048       *  @brief  Append a single character.
1049       *  @param __c  Character to append.
1050       */
1051      void
1052      push_back(_CharT __c)
1053      {
1054	const size_type __len = 1 + this->size();
1055	if (__len > this->capacity() || _M_rep()->_M_is_shared())
1056	  this->reserve(__len);
1057	traits_type::assign(_M_data()[this->size()], __c);
1058	_M_rep()->_M_set_length_and_sharable(__len);
1059      }
1060
1061      /**
1062       *  @brief  Set value to contents of another string.
1063       *  @param  __str  Source string to use.
1064       *  @return  Reference to this string.
1065       */
1066      basic_string&
1067      assign(const basic_string& __str);
1068
1069#if __cplusplus >= 201103L
1070      /**
1071       *  @brief  Set value to contents of another string.
1072       *  @param  __str  Source string to use.
1073       *  @return  Reference to this string.
1074       *
1075       *  This function sets this string to the exact contents of @a __str.
1076       *  @a __str is a valid, but unspecified string.
1077       */
1078      basic_string&
1079      assign(basic_string&& __str)
1080      {
1081	this->swap(__str);
1082	return *this;
1083      }
1084#endif // C++11
1085
1086      /**
1087       *  @brief  Set value to a substring of a string.
1088       *  @param __str  The string to use.
1089       *  @param __pos  Index of the first character of str.
1090       *  @param __n  Number of characters to use.
1091       *  @return  Reference to this string.
1092       *  @throw  std::out_of_range if @a pos is not a valid index.
1093       *
1094       *  This function sets this string to the substring of @a __str
1095       *  consisting of @a __n characters at @a __pos.  If @a __n is
1096       *  is larger than the number of available characters in @a
1097       *  __str, the remainder of @a __str is used.
1098       */
1099      basic_string&
1100      assign(const basic_string& __str, size_type __pos, size_type __n)
1101      { return this->assign(__str._M_data()
1102			    + __str._M_check(__pos, "basic_string::assign"),
1103			    __str._M_limit(__pos, __n)); }
1104
1105      /**
1106       *  @brief  Set value to a C substring.
1107       *  @param __s  The C string to use.
1108       *  @param __n  Number of characters to use.
1109       *  @return  Reference to this string.
1110       *
1111       *  This function sets the value of this string to the first @a __n
1112       *  characters of @a __s.  If @a __n is is larger than the number of
1113       *  available characters in @a __s, the remainder of @a __s is used.
1114       */
1115      basic_string&
1116      assign(const _CharT* __s, size_type __n);
1117
1118      /**
1119       *  @brief  Set value to contents of a C string.
1120       *  @param __s  The C string to use.
1121       *  @return  Reference to this string.
1122       *
1123       *  This function sets the value of this string to the value of @a __s.
1124       *  The data is copied, so there is no dependence on @a __s once the
1125       *  function returns.
1126       */
1127      basic_string&
1128      assign(const _CharT* __s)
1129      {
1130	__glibcxx_requires_string(__s);
1131	return this->assign(__s, traits_type::length(__s));
1132      }
1133
1134      /**
1135       *  @brief  Set value to multiple characters.
1136       *  @param __n  Length of the resulting string.
1137       *  @param __c  The character to use.
1138       *  @return  Reference to this string.
1139       *
1140       *  This function sets the value of this string to @a __n copies of
1141       *  character @a __c.
1142       */
1143      basic_string&
1144      assign(size_type __n, _CharT __c)
1145      { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
1146
1147      /**
1148       *  @brief  Set value to a range of characters.
1149       *  @param __first  Iterator referencing the first character to append.
1150       *  @param __last  Iterator marking the end of the range.
1151       *  @return  Reference to this string.
1152       *
1153       *  Sets value of string to characters in the range [__first,__last).
1154      */
1155      template<class _InputIterator>
1156        basic_string&
1157        assign(_InputIterator __first, _InputIterator __last)
1158        { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
1159
1160#if __cplusplus >= 201103L
1161      /**
1162       *  @brief  Set value to an initializer_list of characters.
1163       *  @param __l  The initializer_list of characters to assign.
1164       *  @return  Reference to this string.
1165       */
1166      basic_string&
1167      assign(initializer_list<_CharT> __l)
1168      { return this->assign(__l.begin(), __l.size()); }
1169#endif // C++11
1170
1171      /**
1172       *  @brief  Insert multiple characters.
1173       *  @param __p  Iterator referencing location in string to insert at.
1174       *  @param __n  Number of characters to insert
1175       *  @param __c  The character to insert.
1176       *  @throw  std::length_error  If new length exceeds @c max_size().
1177       *
1178       *  Inserts @a __n copies of character @a __c starting at the
1179       *  position referenced by iterator @a __p.  If adding
1180       *  characters causes the length to exceed max_size(),
1181       *  length_error is thrown.  The value of the string doesn't
1182       *  change if an error is thrown.
1183      */
1184      void
1185      insert(iterator __p, size_type __n, _CharT __c)
1186      {	this->replace(__p, __p, __n, __c);  }
1187
1188      /**
1189       *  @brief  Insert a range of characters.
1190       *  @param __p  Iterator referencing location in string to insert at.
1191       *  @param __beg  Start of range.
1192       *  @param __end  End of range.
1193       *  @throw  std::length_error  If new length exceeds @c max_size().
1194       *
1195       *  Inserts characters in range [__beg,__end).  If adding
1196       *  characters causes the length to exceed max_size(),
1197       *  length_error is thrown.  The value of the string doesn't
1198       *  change if an error is thrown.
1199      */
1200      template<class _InputIterator>
1201        void
1202        insert(iterator __p, _InputIterator __beg, _InputIterator __end)
1203        { this->replace(__p, __p, __beg, __end); }
1204
1205#if __cplusplus >= 201103L
1206      /**
1207       *  @brief  Insert an initializer_list of characters.
1208       *  @param __p  Iterator referencing location in string to insert at.
1209       *  @param __l  The initializer_list of characters to insert.
1210       *  @throw  std::length_error  If new length exceeds @c max_size().
1211       */
1212      void
1213      insert(iterator __p, initializer_list<_CharT> __l)
1214      {
1215	_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
1216	this->insert(__p - _M_ibegin(), __l.begin(), __l.size());
1217      }
1218#endif // C++11
1219
1220      /**
1221       *  @brief  Insert value of a string.
1222       *  @param __pos1  Iterator referencing location in string to insert at.
1223       *  @param __str  The string to insert.
1224       *  @return  Reference to this string.
1225       *  @throw  std::length_error  If new length exceeds @c max_size().
1226       *
1227       *  Inserts value of @a __str starting at @a __pos1.  If adding
1228       *  characters causes the length to exceed max_size(),
1229       *  length_error is thrown.  The value of the string doesn't
1230       *  change if an error is thrown.
1231      */
1232      basic_string&
1233      insert(size_type __pos1, const basic_string& __str)
1234      { return this->insert(__pos1, __str, size_type(0), __str.size()); }
1235
1236      /**
1237       *  @brief  Insert a substring.
1238       *  @param __pos1  Iterator referencing location in string to insert at.
1239       *  @param __str  The string to insert.
1240       *  @param __pos2  Start of characters in str to insert.
1241       *  @param __n  Number of characters to insert.
1242       *  @return  Reference to this string.
1243       *  @throw  std::length_error  If new length exceeds @c max_size().
1244       *  @throw  std::out_of_range  If @a pos1 > size() or
1245       *  @a __pos2 > @a str.size().
1246       *
1247       *  Starting at @a pos1, insert @a __n character of @a __str
1248       *  beginning with @a __pos2.  If adding characters causes the
1249       *  length to exceed max_size(), length_error is thrown.  If @a
1250       *  __pos1 is beyond the end of this string or @a __pos2 is
1251       *  beyond the end of @a __str, out_of_range is thrown.  The
1252       *  value of the string doesn't change if an error is thrown.
1253      */
1254      basic_string&
1255      insert(size_type __pos1, const basic_string& __str,
1256	     size_type __pos2, size_type __n)
1257      { return this->insert(__pos1, __str._M_data()
1258			    + __str._M_check(__pos2, "basic_string::insert"),
1259			    __str._M_limit(__pos2, __n)); }
1260
1261      /**
1262       *  @brief  Insert a C substring.
1263       *  @param __pos  Iterator referencing location in string to insert at.
1264       *  @param __s  The C string to insert.
1265       *  @param __n  The number of characters to insert.
1266       *  @return  Reference to this string.
1267       *  @throw  std::length_error  If new length exceeds @c max_size().
1268       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1269       *  string.
1270       *
1271       *  Inserts the first @a __n characters of @a __s starting at @a
1272       *  __pos.  If adding characters causes the length to exceed
1273       *  max_size(), length_error is thrown.  If @a __pos is beyond
1274       *  end(), out_of_range is thrown.  The value of the string
1275       *  doesn't change if an error is thrown.
1276      */
1277      basic_string&
1278      insert(size_type __pos, const _CharT* __s, size_type __n);
1279
1280      /**
1281       *  @brief  Insert a C string.
1282       *  @param __pos  Iterator referencing location in string to insert at.
1283       *  @param __s  The C string to insert.
1284       *  @return  Reference to this string.
1285       *  @throw  std::length_error  If new length exceeds @c max_size().
1286       *  @throw  std::out_of_range  If @a pos is beyond the end of this
1287       *  string.
1288       *
1289       *  Inserts the first @a n characters of @a __s starting at @a __pos.  If
1290       *  adding characters causes the length to exceed max_size(),
1291       *  length_error is thrown.  If @a __pos is beyond end(), out_of_range is
1292       *  thrown.  The value of the string doesn't change if an error is
1293       *  thrown.
1294      */
1295      basic_string&
1296      insert(size_type __pos, const _CharT* __s)
1297      {
1298	__glibcxx_requires_string(__s);
1299	return this->insert(__pos, __s, traits_type::length(__s));
1300      }
1301
1302      /**
1303       *  @brief  Insert multiple characters.
1304       *  @param __pos  Index in string to insert at.
1305       *  @param __n  Number of characters to insert
1306       *  @param __c  The character to insert.
1307       *  @return  Reference to this string.
1308       *  @throw  std::length_error  If new length exceeds @c max_size().
1309       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1310       *  string.
1311       *
1312       *  Inserts @a __n copies of character @a __c starting at index
1313       *  @a __pos.  If adding characters causes the length to exceed
1314       *  max_size(), length_error is thrown.  If @a __pos > length(),
1315       *  out_of_range is thrown.  The value of the string doesn't
1316       *  change if an error is thrown.
1317      */
1318      basic_string&
1319      insert(size_type __pos, size_type __n, _CharT __c)
1320      { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
1321			      size_type(0), __n, __c); }
1322
1323      /**
1324       *  @brief  Insert one character.
1325       *  @param __p  Iterator referencing position in string to insert at.
1326       *  @param __c  The character to insert.
1327       *  @return  Iterator referencing newly inserted char.
1328       *  @throw  std::length_error  If new length exceeds @c max_size().
1329       *
1330       *  Inserts character @a __c at position referenced by @a __p.
1331       *  If adding character causes the length to exceed max_size(),
1332       *  length_error is thrown.  If @a __p is beyond end of string,
1333       *  out_of_range is thrown.  The value of the string doesn't
1334       *  change if an error is thrown.
1335      */
1336      iterator
1337      insert(iterator __p, _CharT __c)
1338      {
1339	_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
1340	const size_type __pos = __p - _M_ibegin();
1341	_M_replace_aux(__pos, size_type(0), size_type(1), __c);
1342	_M_rep()->_M_set_leaked();
1343	return iterator(_M_data() + __pos);
1344      }
1345
1346      /**
1347       *  @brief  Remove characters.
1348       *  @param __pos  Index of first character to remove (default 0).
1349       *  @param __n  Number of characters to remove (default remainder).
1350       *  @return  Reference to this string.
1351       *  @throw  std::out_of_range  If @a pos is beyond the end of this
1352       *  string.
1353       *
1354       *  Removes @a __n characters from this string starting at @a
1355       *  __pos.  The length of the string is reduced by @a __n.  If
1356       *  there are < @a __n characters to remove, the remainder of
1357       *  the string is truncated.  If @a __p is beyond end of string,
1358       *  out_of_range is thrown.  The value of the string doesn't
1359       *  change if an error is thrown.
1360      */
1361      basic_string&
1362      erase(size_type __pos = 0, size_type __n = npos)
1363      {
1364	_M_mutate(_M_check(__pos, "basic_string::erase"),
1365		  _M_limit(__pos, __n), size_type(0));
1366	return *this;
1367      }
1368
1369      /**
1370       *  @brief  Remove one character.
1371       *  @param __position  Iterator referencing the character to remove.
1372       *  @return  iterator referencing same location after removal.
1373       *
1374       *  Removes the character at @a __position from this string. The value
1375       *  of the string doesn't change if an error is thrown.
1376      */
1377      iterator
1378      erase(iterator __position)
1379      {
1380	_GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
1381				 && __position < _M_iend());
1382	const size_type __pos = __position - _M_ibegin();
1383	_M_mutate(__pos, size_type(1), size_type(0));
1384	_M_rep()->_M_set_leaked();
1385	return iterator(_M_data() + __pos);
1386      }
1387
1388      /**
1389       *  @brief  Remove a range of characters.
1390       *  @param __first  Iterator referencing the first character to remove.
1391       *  @param __last  Iterator referencing the end of the range.
1392       *  @return  Iterator referencing location of first after removal.
1393       *
1394       *  Removes the characters in the range [first,last) from this string.
1395       *  The value of the string doesn't change if an error is thrown.
1396      */
1397      iterator
1398      erase(iterator __first, iterator __last);
1399
1400#if __cplusplus >= 201103L
1401      /**
1402       *  @brief  Remove the last character.
1403       *
1404       *  The string must be non-empty.
1405       */
1406      void
1407      pop_back()
1408      { erase(size()-1, 1); }
1409#endif // C++11
1410
1411      /**
1412       *  @brief  Replace characters with value from another string.
1413       *  @param __pos  Index of first character to replace.
1414       *  @param __n  Number of characters to be replaced.
1415       *  @param __str  String to insert.
1416       *  @return  Reference to this string.
1417       *  @throw  std::out_of_range  If @a pos is beyond the end of this
1418       *  string.
1419       *  @throw  std::length_error  If new length exceeds @c max_size().
1420       *
1421       *  Removes the characters in the range [__pos,__pos+__n) from
1422       *  this string.  In place, the value of @a __str is inserted.
1423       *  If @a __pos is beyond end of string, out_of_range is thrown.
1424       *  If the length of the result exceeds max_size(), length_error
1425       *  is thrown.  The value of the string doesn't change if an
1426       *  error is thrown.
1427      */
1428      basic_string&
1429      replace(size_type __pos, size_type __n, const basic_string& __str)
1430      { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
1431
1432      /**
1433       *  @brief  Replace characters with value from another string.
1434       *  @param __pos1  Index of first character to replace.
1435       *  @param __n1  Number of characters to be replaced.
1436       *  @param __str  String to insert.
1437       *  @param __pos2  Index of first character of str to use.
1438       *  @param __n2  Number of characters from str to use.
1439       *  @return  Reference to this string.
1440       *  @throw  std::out_of_range  If @a __pos1 > size() or @a __pos2 >
1441       *  __str.size().
1442       *  @throw  std::length_error  If new length exceeds @c max_size().
1443       *
1444       *  Removes the characters in the range [__pos1,__pos1 + n) from this
1445       *  string.  In place, the value of @a __str is inserted.  If @a __pos is
1446       *  beyond end of string, out_of_range is thrown.  If the length of the
1447       *  result exceeds max_size(), length_error is thrown.  The value of the
1448       *  string doesn't change if an error is thrown.
1449      */
1450      basic_string&
1451      replace(size_type __pos1, size_type __n1, const basic_string& __str,
1452	      size_type __pos2, size_type __n2)
1453      { return this->replace(__pos1, __n1, __str._M_data()
1454			     + __str._M_check(__pos2, "basic_string::replace"),
1455			     __str._M_limit(__pos2, __n2)); }
1456
1457      /**
1458       *  @brief  Replace characters with value of a C substring.
1459       *  @param __pos  Index of first character to replace.
1460       *  @param __n1  Number of characters to be replaced.
1461       *  @param __s  C string to insert.
1462       *  @param __n2  Number of characters from @a s to use.
1463       *  @return  Reference to this string.
1464       *  @throw  std::out_of_range  If @a pos1 > size().
1465       *  @throw  std::length_error  If new length exceeds @c max_size().
1466       *
1467       *  Removes the characters in the range [__pos,__pos + __n1)
1468       *  from this string.  In place, the first @a __n2 characters of
1469       *  @a __s are inserted, or all of @a __s if @a __n2 is too large.  If
1470       *  @a __pos is beyond end of string, out_of_range is thrown.  If
1471       *  the length of result exceeds max_size(), length_error is
1472       *  thrown.  The value of the string doesn't change if an error
1473       *  is thrown.
1474      */
1475      basic_string&
1476      replace(size_type __pos, size_type __n1, const _CharT* __s,
1477	      size_type __n2);
1478
1479      /**
1480       *  @brief  Replace characters with value of a C string.
1481       *  @param __pos  Index of first character to replace.
1482       *  @param __n1  Number of characters to be replaced.
1483       *  @param __s  C string to insert.
1484       *  @return  Reference to this string.
1485       *  @throw  std::out_of_range  If @a pos > size().
1486       *  @throw  std::length_error  If new length exceeds @c max_size().
1487       *
1488       *  Removes the characters in the range [__pos,__pos + __n1)
1489       *  from this string.  In place, the characters of @a __s are
1490       *  inserted.  If @a __pos is beyond end of string, out_of_range
1491       *  is thrown.  If the length of result exceeds max_size(),
1492       *  length_error is thrown.  The value of the string doesn't
1493       *  change if an error is thrown.
1494      */
1495      basic_string&
1496      replace(size_type __pos, size_type __n1, const _CharT* __s)
1497      {
1498	__glibcxx_requires_string(__s);
1499	return this->replace(__pos, __n1, __s, traits_type::length(__s));
1500      }
1501
1502      /**
1503       *  @brief  Replace characters with multiple characters.
1504       *  @param __pos  Index of first character to replace.
1505       *  @param __n1  Number of characters to be replaced.
1506       *  @param __n2  Number of characters to insert.
1507       *  @param __c  Character to insert.
1508       *  @return  Reference to this string.
1509       *  @throw  std::out_of_range  If @a __pos > size().
1510       *  @throw  std::length_error  If new length exceeds @c max_size().
1511       *
1512       *  Removes the characters in the range [pos,pos + n1) from this
1513       *  string.  In place, @a __n2 copies of @a __c are inserted.
1514       *  If @a __pos is beyond end of string, out_of_range is thrown.
1515       *  If the length of result exceeds max_size(), length_error is
1516       *  thrown.  The value of the string doesn't change if an error
1517       *  is thrown.
1518      */
1519      basic_string&
1520      replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
1521      { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
1522			      _M_limit(__pos, __n1), __n2, __c); }
1523
1524      /**
1525       *  @brief  Replace range of characters with string.
1526       *  @param __i1  Iterator referencing start of range to replace.
1527       *  @param __i2  Iterator referencing end of range to replace.
1528       *  @param __str  String value to insert.
1529       *  @return  Reference to this string.
1530       *  @throw  std::length_error  If new length exceeds @c max_size().
1531       *
1532       *  Removes the characters in the range [__i1,__i2).  In place,
1533       *  the value of @a __str is inserted.  If the length of result
1534       *  exceeds max_size(), length_error is thrown.  The value of
1535       *  the string doesn't change if an error is thrown.
1536      */
1537      basic_string&
1538      replace(iterator __i1, iterator __i2, const basic_string& __str)
1539      { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
1540
1541      /**
1542       *  @brief  Replace range of characters with C substring.
1543       *  @param __i1  Iterator referencing start of range to replace.
1544       *  @param __i2  Iterator referencing end of range to replace.
1545       *  @param __s  C string value to insert.
1546       *  @param __n  Number of characters from s to insert.
1547       *  @return  Reference to this string.
1548       *  @throw  std::length_error  If new length exceeds @c max_size().
1549       *
1550       *  Removes the characters in the range [__i1,__i2).  In place,
1551       *  the first @a __n characters of @a __s are inserted.  If the
1552       *  length of result exceeds max_size(), length_error is thrown.
1553       *  The value of the string doesn't change if an error is
1554       *  thrown.
1555      */
1556      basic_string&
1557      replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
1558      {
1559	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1560				 && __i2 <= _M_iend());
1561	return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
1562      }
1563
1564      /**
1565       *  @brief  Replace range of characters with C string.
1566       *  @param __i1  Iterator referencing start of range to replace.
1567       *  @param __i2  Iterator referencing end of range to replace.
1568       *  @param __s  C string value to insert.
1569       *  @return  Reference to this string.
1570       *  @throw  std::length_error  If new length exceeds @c max_size().
1571       *
1572       *  Removes the characters in the range [__i1,__i2).  In place,
1573       *  the characters of @a __s are inserted.  If the length of
1574       *  result exceeds max_size(), length_error is thrown.  The
1575       *  value of the string doesn't change if an error is thrown.
1576      */
1577      basic_string&
1578      replace(iterator __i1, iterator __i2, const _CharT* __s)
1579      {
1580	__glibcxx_requires_string(__s);
1581	return this->replace(__i1, __i2, __s, traits_type::length(__s));
1582      }
1583
1584      /**
1585       *  @brief  Replace range of characters with multiple characters
1586       *  @param __i1  Iterator referencing start of range to replace.
1587       *  @param __i2  Iterator referencing end of range to replace.
1588       *  @param __n  Number of characters to insert.
1589       *  @param __c  Character to insert.
1590       *  @return  Reference to this string.
1591       *  @throw  std::length_error  If new length exceeds @c max_size().
1592       *
1593       *  Removes the characters in the range [__i1,__i2).  In place,
1594       *  @a __n copies of @a __c are inserted.  If the length of
1595       *  result exceeds max_size(), length_error is thrown.  The
1596       *  value of the string doesn't change if an error is thrown.
1597      */
1598      basic_string&
1599      replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
1600      {
1601	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1602				 && __i2 <= _M_iend());
1603	return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
1604      }
1605
1606      /**
1607       *  @brief  Replace range of characters with range.
1608       *  @param __i1  Iterator referencing start of range to replace.
1609       *  @param __i2  Iterator referencing end of range to replace.
1610       *  @param __k1  Iterator referencing start of range to insert.
1611       *  @param __k2  Iterator referencing end of range to insert.
1612       *  @return  Reference to this string.
1613       *  @throw  std::length_error  If new length exceeds @c max_size().
1614       *
1615       *  Removes the characters in the range [__i1,__i2).  In place,
1616       *  characters in the range [__k1,__k2) are inserted.  If the
1617       *  length of result exceeds max_size(), length_error is thrown.
1618       *  The value of the string doesn't change if an error is
1619       *  thrown.
1620      */
1621      template<class _InputIterator>
1622        basic_string&
1623        replace(iterator __i1, iterator __i2,
1624		_InputIterator __k1, _InputIterator __k2)
1625        {
1626	  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1627				   && __i2 <= _M_iend());
1628	  __glibcxx_requires_valid_range(__k1, __k2);
1629	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1630	  return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
1631	}
1632
1633      // Specializations for the common case of pointer and iterator:
1634      // useful to avoid the overhead of temporary buffering in _M_replace.
1635      basic_string&
1636      replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
1637      {
1638	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1639				 && __i2 <= _M_iend());
1640	__glibcxx_requires_valid_range(__k1, __k2);
1641	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1642			     __k1, __k2 - __k1);
1643      }
1644
1645      basic_string&
1646      replace(iterator __i1, iterator __i2,
1647	      const _CharT* __k1, const _CharT* __k2)
1648      {
1649	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1650				 && __i2 <= _M_iend());
1651	__glibcxx_requires_valid_range(__k1, __k2);
1652	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1653			     __k1, __k2 - __k1);
1654      }
1655
1656      basic_string&
1657      replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
1658      {
1659	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1660				 && __i2 <= _M_iend());
1661	__glibcxx_requires_valid_range(__k1, __k2);
1662	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1663			     __k1.base(), __k2 - __k1);
1664      }
1665
1666      basic_string&
1667      replace(iterator __i1, iterator __i2,
1668	      const_iterator __k1, const_iterator __k2)
1669      {
1670	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1671				 && __i2 <= _M_iend());
1672	__glibcxx_requires_valid_range(__k1, __k2);
1673	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1674			     __k1.base(), __k2 - __k1);
1675      }
1676
1677#if __cplusplus >= 201103L
1678      /**
1679       *  @brief  Replace range of characters with initializer_list.
1680       *  @param __i1  Iterator referencing start of range to replace.
1681       *  @param __i2  Iterator referencing end of range to replace.
1682       *  @param __l  The initializer_list of characters to insert.
1683       *  @return  Reference to this string.
1684       *  @throw  std::length_error  If new length exceeds @c max_size().
1685       *
1686       *  Removes the characters in the range [__i1,__i2).  In place,
1687       *  characters in the range [__k1,__k2) are inserted.  If the
1688       *  length of result exceeds max_size(), length_error is thrown.
1689       *  The value of the string doesn't change if an error is
1690       *  thrown.
1691      */
1692      basic_string& replace(iterator __i1, iterator __i2,
1693			    initializer_list<_CharT> __l)
1694      { return this->replace(__i1, __i2, __l.begin(), __l.end()); }
1695#endif // C++11
1696
1697    private:
1698      template<class _Integer>
1699	basic_string&
1700	_M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
1701			    _Integer __val, __true_type)
1702        { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
1703
1704      template<class _InputIterator>
1705	basic_string&
1706	_M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
1707			    _InputIterator __k2, __false_type);
1708
1709      basic_string&
1710      _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
1711		     _CharT __c);
1712
1713      basic_string&
1714      _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
1715		      size_type __n2);
1716
1717      // _S_construct_aux is used to implement the 21.3.1 para 15 which
1718      // requires special behaviour if _InIter is an integral type
1719      template<class _InIterator>
1720        static _CharT*
1721        _S_construct_aux(_InIterator __beg, _InIterator __end,
1722			 const _Alloc& __a, __false_type)
1723	{
1724          typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
1725          return _S_construct(__beg, __end, __a, _Tag());
1726	}
1727
1728      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1729      // 438. Ambiguity in the "do the right thing" clause
1730      template<class _Integer>
1731        static _CharT*
1732        _S_construct_aux(_Integer __beg, _Integer __end,
1733			 const _Alloc& __a, __true_type)
1734        { return _S_construct_aux_2(static_cast<size_type>(__beg),
1735				    __end, __a); }
1736
1737      static _CharT*
1738      _S_construct_aux_2(size_type __req, _CharT __c, const _Alloc& __a)
1739      { return _S_construct(__req, __c, __a); }
1740
1741      template<class _InIterator>
1742        static _CharT*
1743        _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
1744	{
1745	  typedef typename std::__is_integer<_InIterator>::__type _Integral;
1746	  return _S_construct_aux(__beg, __end, __a, _Integral());
1747        }
1748
1749      // For Input Iterators, used in istreambuf_iterators, etc.
1750      template<class _InIterator>
1751        static _CharT*
1752         _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
1753		      input_iterator_tag);
1754
1755      // For forward_iterators up to random_access_iterators, used for
1756      // string::iterator, _CharT*, etc.
1757      template<class _FwdIterator>
1758        static _CharT*
1759        _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
1760		     forward_iterator_tag);
1761
1762      static _CharT*
1763      _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
1764
1765    public:
1766
1767      /**
1768       *  @brief  Copy substring into C string.
1769       *  @param __s  C string to copy value into.
1770       *  @param __n  Number of characters to copy.
1771       *  @param __pos  Index of first character to copy.
1772       *  @return  Number of characters actually copied
1773       *  @throw  std::out_of_range  If __pos > size().
1774       *
1775       *  Copies up to @a __n characters starting at @a __pos into the
1776       *  C string @a __s.  If @a __pos is %greater than size(),
1777       *  out_of_range is thrown.
1778      */
1779      size_type
1780      copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
1781
1782      /**
1783       *  @brief  Swap contents with another string.
1784       *  @param __s  String to swap with.
1785       *
1786       *  Exchanges the contents of this string with that of @a __s in constant
1787       *  time.
1788      */
1789      void
1790      swap(basic_string& __s);
1791
1792      // String operations:
1793      /**
1794       *  @brief  Return const pointer to null-terminated contents.
1795       *
1796       *  This is a handle to internal data.  Do not modify or dire things may
1797       *  happen.
1798      */
1799      const _CharT*
1800      c_str() const _GLIBCXX_NOEXCEPT
1801      { return _M_data(); }
1802
1803      /**
1804       *  @brief  Return const pointer to contents.
1805       *
1806       *  This is a handle to internal data.  Do not modify or dire things may
1807       *  happen.
1808      */
1809      const _CharT*
1810      data() const _GLIBCXX_NOEXCEPT
1811      { return _M_data(); }
1812
1813      /**
1814       *  @brief  Return copy of allocator used to construct this string.
1815      */
1816      allocator_type
1817      get_allocator() const _GLIBCXX_NOEXCEPT
1818      { return _M_dataplus; }
1819
1820      /**
1821       *  @brief  Find position of a C substring.
1822       *  @param __s  C string to locate.
1823       *  @param __pos  Index of character to search from.
1824       *  @param __n  Number of characters from @a s to search for.
1825       *  @return  Index of start of first occurrence.
1826       *
1827       *  Starting from @a __pos, searches forward for the first @a
1828       *  __n characters in @a __s within this string.  If found,
1829       *  returns the index where it begins.  If not found, returns
1830       *  npos.
1831      */
1832      size_type
1833      find(const _CharT* __s, size_type __pos, size_type __n) const;
1834
1835      /**
1836       *  @brief  Find position of a string.
1837       *  @param __str  String to locate.
1838       *  @param __pos  Index of character to search from (default 0).
1839       *  @return  Index of start of first occurrence.
1840       *
1841       *  Starting from @a __pos, searches forward for value of @a __str within
1842       *  this string.  If found, returns the index where it begins.  If not
1843       *  found, returns npos.
1844      */
1845      size_type
1846      find(const basic_string& __str, size_type __pos = 0) const
1847	_GLIBCXX_NOEXCEPT
1848      { return this->find(__str.data(), __pos, __str.size()); }
1849
1850      /**
1851       *  @brief  Find position of a C string.
1852       *  @param __s  C string to locate.
1853       *  @param __pos  Index of character to search from (default 0).
1854       *  @return  Index of start of first occurrence.
1855       *
1856       *  Starting from @a __pos, searches forward for the value of @a
1857       *  __s within this string.  If found, returns the index where
1858       *  it begins.  If not found, returns npos.
1859      */
1860      size_type
1861      find(const _CharT* __s, size_type __pos = 0) const
1862      {
1863	__glibcxx_requires_string(__s);
1864	return this->find(__s, __pos, traits_type::length(__s));
1865      }
1866
1867      /**
1868       *  @brief  Find position of a character.
1869       *  @param __c  Character to locate.
1870       *  @param __pos  Index of character to search from (default 0).
1871       *  @return  Index of first occurrence.
1872       *
1873       *  Starting from @a __pos, searches forward for @a __c within
1874       *  this string.  If found, returns the index where it was
1875       *  found.  If not found, returns npos.
1876      */
1877      size_type
1878      find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
1879
1880      /**
1881       *  @brief  Find last position of a string.
1882       *  @param __str  String to locate.
1883       *  @param __pos  Index of character to search back from (default end).
1884       *  @return  Index of start of last occurrence.
1885       *
1886       *  Starting from @a __pos, searches backward for value of @a
1887       *  __str within this string.  If found, returns the index where
1888       *  it begins.  If not found, returns npos.
1889      */
1890      size_type
1891      rfind(const basic_string& __str, size_type __pos = npos) const
1892	_GLIBCXX_NOEXCEPT
1893      { return this->rfind(__str.data(), __pos, __str.size()); }
1894
1895      /**
1896       *  @brief  Find last position of a C substring.
1897       *  @param __s  C string to locate.
1898       *  @param __pos  Index of character to search back from.
1899       *  @param __n  Number of characters from s to search for.
1900       *  @return  Index of start of last occurrence.
1901       *
1902       *  Starting from @a __pos, searches backward for the first @a
1903       *  __n characters in @a __s within this string.  If found,
1904       *  returns the index where it begins.  If not found, returns
1905       *  npos.
1906      */
1907      size_type
1908      rfind(const _CharT* __s, size_type __pos, size_type __n) const;
1909
1910      /**
1911       *  @brief  Find last position of a C string.
1912       *  @param __s  C string to locate.
1913       *  @param __pos  Index of character to start search at (default end).
1914       *  @return  Index of start of  last occurrence.
1915       *
1916       *  Starting from @a __pos, searches backward for the value of
1917       *  @a __s within this string.  If found, returns the index
1918       *  where it begins.  If not found, returns npos.
1919      */
1920      size_type
1921      rfind(const _CharT* __s, size_type __pos = npos) const
1922      {
1923	__glibcxx_requires_string(__s);
1924	return this->rfind(__s, __pos, traits_type::length(__s));
1925      }
1926
1927      /**
1928       *  @brief  Find last position of a character.
1929       *  @param __c  Character to locate.
1930       *  @param __pos  Index of character to search back from (default end).
1931       *  @return  Index of last occurrence.
1932       *
1933       *  Starting from @a __pos, searches backward for @a __c within
1934       *  this string.  If found, returns the index where it was
1935       *  found.  If not found, returns npos.
1936      */
1937      size_type
1938      rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
1939
1940      /**
1941       *  @brief  Find position of a character of string.
1942       *  @param __str  String containing characters to locate.
1943       *  @param __pos  Index of character to search from (default 0).
1944       *  @return  Index of first occurrence.
1945       *
1946       *  Starting from @a __pos, searches forward for one of the
1947       *  characters of @a __str within this string.  If found,
1948       *  returns the index where it was found.  If not found, returns
1949       *  npos.
1950      */
1951      size_type
1952      find_first_of(const basic_string& __str, size_type __pos = 0) const
1953	_GLIBCXX_NOEXCEPT
1954      { return this->find_first_of(__str.data(), __pos, __str.size()); }
1955
1956      /**
1957       *  @brief  Find position of a character of C substring.
1958       *  @param __s  String containing characters to locate.
1959       *  @param __pos  Index of character to search from.
1960       *  @param __n  Number of characters from s to search for.
1961       *  @return  Index of first occurrence.
1962       *
1963       *  Starting from @a __pos, searches forward for one of the
1964       *  first @a __n characters of @a __s within this string.  If
1965       *  found, returns the index where it was found.  If not found,
1966       *  returns npos.
1967      */
1968      size_type
1969      find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
1970
1971      /**
1972       *  @brief  Find position of a character of C string.
1973       *  @param __s  String containing characters to locate.
1974       *  @param __pos  Index of character to search from (default 0).
1975       *  @return  Index of first occurrence.
1976       *
1977       *  Starting from @a __pos, searches forward for one of the
1978       *  characters of @a __s within this string.  If found, returns
1979       *  the index where it was found.  If not found, returns npos.
1980      */
1981      size_type
1982      find_first_of(const _CharT* __s, size_type __pos = 0) const
1983      {
1984	__glibcxx_requires_string(__s);
1985	return this->find_first_of(__s, __pos, traits_type::length(__s));
1986      }
1987
1988      /**
1989       *  @brief  Find position of a character.
1990       *  @param __c  Character to locate.
1991       *  @param __pos  Index of character to search from (default 0).
1992       *  @return  Index of first occurrence.
1993       *
1994       *  Starting from @a __pos, searches forward for the character
1995       *  @a __c within this string.  If found, returns the index
1996       *  where it was found.  If not found, returns npos.
1997       *
1998       *  Note: equivalent to find(__c, __pos).
1999      */
2000      size_type
2001      find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
2002      { return this->find(__c, __pos); }
2003
2004      /**
2005       *  @brief  Find last position of a character of string.
2006       *  @param __str  String containing characters to locate.
2007       *  @param __pos  Index of character to search back from (default end).
2008       *  @return  Index of last occurrence.
2009       *
2010       *  Starting from @a __pos, searches backward for one of the
2011       *  characters of @a __str within this string.  If found,
2012       *  returns the index where it was found.  If not found, returns
2013       *  npos.
2014      */
2015      size_type
2016      find_last_of(const basic_string& __str, size_type __pos = npos) const
2017	_GLIBCXX_NOEXCEPT
2018      { return this->find_last_of(__str.data(), __pos, __str.size()); }
2019
2020      /**
2021       *  @brief  Find last position of a character of C substring.
2022       *  @param __s  C string containing characters to locate.
2023       *  @param __pos  Index of character to search back from.
2024       *  @param __n  Number of characters from s to search for.
2025       *  @return  Index of last occurrence.
2026       *
2027       *  Starting from @a __pos, searches backward for one of the
2028       *  first @a __n characters of @a __s within this string.  If
2029       *  found, returns the index where it was found.  If not found,
2030       *  returns npos.
2031      */
2032      size_type
2033      find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
2034
2035      /**
2036       *  @brief  Find last position of a character of C string.
2037       *  @param __s  C string containing characters to locate.
2038       *  @param __pos  Index of character to search back from (default end).
2039       *  @return  Index of last occurrence.
2040       *
2041       *  Starting from @a __pos, searches backward for one of the
2042       *  characters of @a __s within this string.  If found, returns
2043       *  the index where it was found.  If not found, returns npos.
2044      */
2045      size_type
2046      find_last_of(const _CharT* __s, size_type __pos = npos) const
2047      {
2048	__glibcxx_requires_string(__s);
2049	return this->find_last_of(__s, __pos, traits_type::length(__s));
2050      }
2051
2052      /**
2053       *  @brief  Find last position of a character.
2054       *  @param __c  Character to locate.
2055       *  @param __pos  Index of character to search back from (default end).
2056       *  @return  Index of last occurrence.
2057       *
2058       *  Starting from @a __pos, searches backward for @a __c within
2059       *  this string.  If found, returns the index where it was
2060       *  found.  If not found, returns npos.
2061       *
2062       *  Note: equivalent to rfind(__c, __pos).
2063      */
2064      size_type
2065      find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
2066      { return this->rfind(__c, __pos); }
2067
2068      /**
2069       *  @brief  Find position of a character not in string.
2070       *  @param __str  String containing characters to avoid.
2071       *  @param __pos  Index of character to search from (default 0).
2072       *  @return  Index of first occurrence.
2073       *
2074       *  Starting from @a __pos, searches forward for a character not contained
2075       *  in @a __str within this string.  If found, returns the index where it
2076       *  was found.  If not found, returns npos.
2077      */
2078      size_type
2079      find_first_not_of(const basic_string& __str, size_type __pos = 0) const
2080	_GLIBCXX_NOEXCEPT
2081      { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
2082
2083      /**
2084       *  @brief  Find position of a character not in C substring.
2085       *  @param __s  C string containing characters to avoid.
2086       *  @param __pos  Index of character to search from.
2087       *  @param __n  Number of characters from __s to consider.
2088       *  @return  Index of first occurrence.
2089       *
2090       *  Starting from @a __pos, searches forward for a character not
2091       *  contained in the first @a __n characters of @a __s within
2092       *  this string.  If found, returns the index where it was
2093       *  found.  If not found, returns npos.
2094      */
2095      size_type
2096      find_first_not_of(const _CharT* __s, size_type __pos,
2097			size_type __n) const;
2098
2099      /**
2100       *  @brief  Find position of a character not in C string.
2101       *  @param __s  C string containing characters to avoid.
2102       *  @param __pos  Index of character to search from (default 0).
2103       *  @return  Index of first occurrence.
2104       *
2105       *  Starting from @a __pos, searches forward for a character not
2106       *  contained in @a __s within this string.  If found, returns
2107       *  the index where it was found.  If not found, returns npos.
2108      */
2109      size_type
2110      find_first_not_of(const _CharT* __s, size_type __pos = 0) const
2111      {
2112	__glibcxx_requires_string(__s);
2113	return this->find_first_not_of(__s, __pos, traits_type::length(__s));
2114      }
2115
2116      /**
2117       *  @brief  Find position of a different character.
2118       *  @param __c  Character to avoid.
2119       *  @param __pos  Index of character to search from (default 0).
2120       *  @return  Index of first occurrence.
2121       *
2122       *  Starting from @a __pos, searches forward for a character
2123       *  other than @a __c within this string.  If found, returns the
2124       *  index where it was found.  If not found, returns npos.
2125      */
2126      size_type
2127      find_first_not_of(_CharT __c, size_type __pos = 0) const
2128	_GLIBCXX_NOEXCEPT;
2129
2130      /**
2131       *  @brief  Find last position of a character not in string.
2132       *  @param __str  String containing characters to avoid.
2133       *  @param __pos  Index of character to search back from (default end).
2134       *  @return  Index of last occurrence.
2135       *
2136       *  Starting from @a __pos, searches backward for a character
2137       *  not contained in @a __str within this string.  If found,
2138       *  returns the index where it was found.  If not found, returns
2139       *  npos.
2140      */
2141      size_type
2142      find_last_not_of(const basic_string& __str, size_type __pos = npos) const
2143	_GLIBCXX_NOEXCEPT
2144      { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
2145
2146      /**
2147       *  @brief  Find last position of a character not in C substring.
2148       *  @param __s  C string containing characters to avoid.
2149       *  @param __pos  Index of character to search back from.
2150       *  @param __n  Number of characters from s to consider.
2151       *  @return  Index of last occurrence.
2152       *
2153       *  Starting from @a __pos, searches backward for a character not
2154       *  contained in the first @a __n characters of @a __s within this string.
2155       *  If found, returns the index where it was found.  If not found,
2156       *  returns npos.
2157      */
2158      size_type
2159      find_last_not_of(const _CharT* __s, size_type __pos,
2160		       size_type __n) const;
2161      /**
2162       *  @brief  Find last position of a character not in C string.
2163       *  @param __s  C string containing characters to avoid.
2164       *  @param __pos  Index of character to search back from (default end).
2165       *  @return  Index of last occurrence.
2166       *
2167       *  Starting from @a __pos, searches backward for a character
2168       *  not contained in @a __s within this string.  If found,
2169       *  returns the index where it was found.  If not found, returns
2170       *  npos.
2171      */
2172      size_type
2173      find_last_not_of(const _CharT* __s, size_type __pos = npos) const
2174      {
2175	__glibcxx_requires_string(__s);
2176	return this->find_last_not_of(__s, __pos, traits_type::length(__s));
2177      }
2178
2179      /**
2180       *  @brief  Find last position of a different character.
2181       *  @param __c  Character to avoid.
2182       *  @param __pos  Index of character to search back from (default end).
2183       *  @return  Index of last occurrence.
2184       *
2185       *  Starting from @a __pos, searches backward for a character other than
2186       *  @a __c within this string.  If found, returns the index where it was
2187       *  found.  If not found, returns npos.
2188      */
2189      size_type
2190      find_last_not_of(_CharT __c, size_type __pos = npos) const
2191	_GLIBCXX_NOEXCEPT;
2192
2193      /**
2194       *  @brief  Get a substring.
2195       *  @param __pos  Index of first character (default 0).
2196       *  @param __n  Number of characters in substring (default remainder).
2197       *  @return  The new string.
2198       *  @throw  std::out_of_range  If __pos > size().
2199       *
2200       *  Construct and return a new string using the @a __n
2201       *  characters starting at @a __pos.  If the string is too
2202       *  short, use the remainder of the characters.  If @a __pos is
2203       *  beyond the end of the string, out_of_range is thrown.
2204      */
2205      basic_string
2206      substr(size_type __pos = 0, size_type __n = npos) const
2207      { return basic_string(*this,
2208			    _M_check(__pos, "basic_string::substr"), __n); }
2209
2210      /**
2211       *  @brief  Compare to a string.
2212       *  @param __str  String to compare against.
2213       *  @return  Integer < 0, 0, or > 0.
2214       *
2215       *  Returns an integer < 0 if this string is ordered before @a
2216       *  __str, 0 if their values are equivalent, or > 0 if this
2217       *  string is ordered after @a __str.  Determines the effective
2218       *  length rlen of the strings to compare as the smallest of
2219       *  size() and str.size().  The function then compares the two
2220       *  strings by calling traits::compare(data(), str.data(),rlen).
2221       *  If the result of the comparison is nonzero returns it,
2222       *  otherwise the shorter one is ordered first.
2223      */
2224      int
2225      compare(const basic_string& __str) const
2226      {
2227	const size_type __size = this->size();
2228	const size_type __osize = __str.size();
2229	const size_type __len = std::min(__size, __osize);
2230
2231	int __r = traits_type::compare(_M_data(), __str.data(), __len);
2232	if (!__r)
2233	  __r = _S_compare(__size, __osize);
2234	return __r;
2235      }
2236
2237      /**
2238       *  @brief  Compare substring to a string.
2239       *  @param __pos  Index of first character of substring.
2240       *  @param __n  Number of characters in substring.
2241       *  @param __str  String to compare against.
2242       *  @return  Integer < 0, 0, or > 0.
2243       *
2244       *  Form the substring of this string from the @a __n characters
2245       *  starting at @a __pos.  Returns an integer < 0 if the
2246       *  substring is ordered before @a __str, 0 if their values are
2247       *  equivalent, or > 0 if the substring is ordered after @a
2248       *  __str.  Determines the effective length rlen of the strings
2249       *  to compare as the smallest of the length of the substring
2250       *  and @a __str.size().  The function then compares the two
2251       *  strings by calling
2252       *  traits::compare(substring.data(),str.data(),rlen).  If the
2253       *  result of the comparison is nonzero returns it, otherwise
2254       *  the shorter one is ordered first.
2255      */
2256      int
2257      compare(size_type __pos, size_type __n, const basic_string& __str) const;
2258
2259      /**
2260       *  @brief  Compare substring to a substring.
2261       *  @param __pos1  Index of first character of substring.
2262       *  @param __n1  Number of characters in substring.
2263       *  @param __str  String to compare against.
2264       *  @param __pos2  Index of first character of substring of str.
2265       *  @param __n2  Number of characters in substring of str.
2266       *  @return  Integer < 0, 0, or > 0.
2267       *
2268       *  Form the substring of this string from the @a __n1
2269       *  characters starting at @a __pos1.  Form the substring of @a
2270       *  __str from the @a __n2 characters starting at @a __pos2.
2271       *  Returns an integer < 0 if this substring is ordered before
2272       *  the substring of @a __str, 0 if their values are equivalent,
2273       *  or > 0 if this substring is ordered after the substring of
2274       *  @a __str.  Determines the effective length rlen of the
2275       *  strings to compare as the smallest of the lengths of the
2276       *  substrings.  The function then compares the two strings by
2277       *  calling
2278       *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
2279       *  If the result of the comparison is nonzero returns it,
2280       *  otherwise the shorter one is ordered first.
2281      */
2282      int
2283      compare(size_type __pos1, size_type __n1, const basic_string& __str,
2284	      size_type __pos2, size_type __n2) const;
2285
2286      /**
2287       *  @brief  Compare to a C string.
2288       *  @param __s  C string to compare against.
2289       *  @return  Integer < 0, 0, or > 0.
2290       *
2291       *  Returns an integer < 0 if this string is ordered before @a __s, 0 if
2292       *  their values are equivalent, or > 0 if this string is ordered after
2293       *  @a __s.  Determines the effective length rlen of the strings to
2294       *  compare as the smallest of size() and the length of a string
2295       *  constructed from @a __s.  The function then compares the two strings
2296       *  by calling traits::compare(data(),s,rlen).  If the result of the
2297       *  comparison is nonzero returns it, otherwise the shorter one is
2298       *  ordered first.
2299      */
2300      int
2301      compare(const _CharT* __s) const;
2302
2303      // _GLIBCXX_RESOLVE_LIB_DEFECTS
2304      // 5 String::compare specification questionable
2305      /**
2306       *  @brief  Compare substring to a C string.
2307       *  @param __pos  Index of first character of substring.
2308       *  @param __n1  Number of characters in substring.
2309       *  @param __s  C string to compare against.
2310       *  @return  Integer < 0, 0, or > 0.
2311       *
2312       *  Form the substring of this string from the @a __n1
2313       *  characters starting at @a pos.  Returns an integer < 0 if
2314       *  the substring is ordered before @a __s, 0 if their values
2315       *  are equivalent, or > 0 if the substring is ordered after @a
2316       *  __s.  Determines the effective length rlen of the strings to
2317       *  compare as the smallest of the length of the substring and
2318       *  the length of a string constructed from @a __s.  The
2319       *  function then compares the two string by calling
2320       *  traits::compare(substring.data(),__s,rlen).  If the result of
2321       *  the comparison is nonzero returns it, otherwise the shorter
2322       *  one is ordered first.
2323      */
2324      int
2325      compare(size_type __pos, size_type __n1, const _CharT* __s) const;
2326
2327      /**
2328       *  @brief  Compare substring against a character %array.
2329       *  @param __pos  Index of first character of substring.
2330       *  @param __n1  Number of characters in substring.
2331       *  @param __s  character %array to compare against.
2332       *  @param __n2  Number of characters of s.
2333       *  @return  Integer < 0, 0, or > 0.
2334       *
2335       *  Form the substring of this string from the @a __n1
2336       *  characters starting at @a __pos.  Form a string from the
2337       *  first @a __n2 characters of @a __s.  Returns an integer < 0
2338       *  if this substring is ordered before the string from @a __s,
2339       *  0 if their values are equivalent, or > 0 if this substring
2340       *  is ordered after the string from @a __s.  Determines the
2341       *  effective length rlen of the strings to compare as the
2342       *  smallest of the length of the substring and @a __n2.  The
2343       *  function then compares the two strings by calling
2344       *  traits::compare(substring.data(),s,rlen).  If the result of
2345       *  the comparison is nonzero returns it, otherwise the shorter
2346       *  one is ordered first.
2347       *
2348       *  NB: s must have at least n2 characters, &apos;\\0&apos; has
2349       *  no special meaning.
2350      */
2351      int
2352      compare(size_type __pos, size_type __n1, const _CharT* __s,
2353	      size_type __n2) const;
2354  };
2355
2356  // operator+
2357  /**
2358   *  @brief  Concatenate two strings.
2359   *  @param __lhs  First string.
2360   *  @param __rhs  Last string.
2361   *  @return  New string with value of @a __lhs followed by @a __rhs.
2362   */
2363  template<typename _CharT, typename _Traits, typename _Alloc>
2364    basic_string<_CharT, _Traits, _Alloc>
2365    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2366	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2367    {
2368      basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
2369      __str.append(__rhs);
2370      return __str;
2371    }
2372
2373  /**
2374   *  @brief  Concatenate C string and string.
2375   *  @param __lhs  First string.
2376   *  @param __rhs  Last string.
2377   *  @return  New string with value of @a __lhs followed by @a __rhs.
2378   */
2379  template<typename _CharT, typename _Traits, typename _Alloc>
2380    basic_string<_CharT,_Traits,_Alloc>
2381    operator+(const _CharT* __lhs,
2382	      const basic_string<_CharT,_Traits,_Alloc>& __rhs);
2383
2384  /**
2385   *  @brief  Concatenate character and string.
2386   *  @param __lhs  First string.
2387   *  @param __rhs  Last string.
2388   *  @return  New string with @a __lhs followed by @a __rhs.
2389   */
2390  template<typename _CharT, typename _Traits, typename _Alloc>
2391    basic_string<_CharT,_Traits,_Alloc>
2392    operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
2393
2394  /**
2395   *  @brief  Concatenate string and C string.
2396   *  @param __lhs  First string.
2397   *  @param __rhs  Last string.
2398   *  @return  New string with @a __lhs followed by @a __rhs.
2399   */
2400  template<typename _CharT, typename _Traits, typename _Alloc>
2401    inline basic_string<_CharT, _Traits, _Alloc>
2402    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2403	     const _CharT* __rhs)
2404    {
2405      basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
2406      __str.append(__rhs);
2407      return __str;
2408    }
2409
2410  /**
2411   *  @brief  Concatenate string and character.
2412   *  @param __lhs  First string.
2413   *  @param __rhs  Last string.
2414   *  @return  New string with @a __lhs followed by @a __rhs.
2415   */
2416  template<typename _CharT, typename _Traits, typename _Alloc>
2417    inline basic_string<_CharT, _Traits, _Alloc>
2418    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
2419    {
2420      typedef basic_string<_CharT, _Traits, _Alloc>	__string_type;
2421      typedef typename __string_type::size_type		__size_type;
2422      __string_type __str(__lhs);
2423      __str.append(__size_type(1), __rhs);
2424      return __str;
2425    }
2426
2427#if __cplusplus >= 201103L
2428  template<typename _CharT, typename _Traits, typename _Alloc>
2429    inline basic_string<_CharT, _Traits, _Alloc>
2430    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
2431	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2432    { return std::move(__lhs.append(__rhs)); }
2433
2434  template<typename _CharT, typename _Traits, typename _Alloc>
2435    inline basic_string<_CharT, _Traits, _Alloc>
2436    operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2437	      basic_string<_CharT, _Traits, _Alloc>&& __rhs)
2438    { return std::move(__rhs.insert(0, __lhs)); }
2439
2440  template<typename _CharT, typename _Traits, typename _Alloc>
2441    inline basic_string<_CharT, _Traits, _Alloc>
2442    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
2443	      basic_string<_CharT, _Traits, _Alloc>&& __rhs)
2444    {
2445      const auto __size = __lhs.size() + __rhs.size();
2446      const bool __cond = (__size > __lhs.capacity()
2447			   && __size <= __rhs.capacity());
2448      return __cond ? std::move(__rhs.insert(0, __lhs))
2449	            : std::move(__lhs.append(__rhs));
2450    }
2451
2452  template<typename _CharT, typename _Traits, typename _Alloc>
2453    inline basic_string<_CharT, _Traits, _Alloc>
2454    operator+(const _CharT* __lhs,
2455	      basic_string<_CharT, _Traits, _Alloc>&& __rhs)
2456    { return std::move(__rhs.insert(0, __lhs)); }
2457
2458  template<typename _CharT, typename _Traits, typename _Alloc>
2459    inline basic_string<_CharT, _Traits, _Alloc>
2460    operator+(_CharT __lhs,
2461	      basic_string<_CharT, _Traits, _Alloc>&& __rhs)
2462    { return std::move(__rhs.insert(0, 1, __lhs)); }
2463
2464  template<typename _CharT, typename _Traits, typename _Alloc>
2465    inline basic_string<_CharT, _Traits, _Alloc>
2466    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
2467	      const _CharT* __rhs)
2468    { return std::move(__lhs.append(__rhs)); }
2469
2470  template<typename _CharT, typename _Traits, typename _Alloc>
2471    inline basic_string<_CharT, _Traits, _Alloc>
2472    operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
2473	      _CharT __rhs)
2474    { return std::move(__lhs.append(1, __rhs)); }
2475#endif
2476
2477  // operator ==
2478  /**
2479   *  @brief  Test equivalence of two strings.
2480   *  @param __lhs  First string.
2481   *  @param __rhs  Second string.
2482   *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
2483   */
2484  template<typename _CharT, typename _Traits, typename _Alloc>
2485    inline bool
2486    operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2487	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2488    { return __lhs.compare(__rhs) == 0; }
2489
2490  template<typename _CharT>
2491    inline
2492    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
2493    operator==(const basic_string<_CharT>& __lhs,
2494	       const basic_string<_CharT>& __rhs)
2495    { return (__lhs.size() == __rhs.size()
2496	      && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
2497						    __lhs.size())); }
2498
2499  /**
2500   *  @brief  Test equivalence of C string and string.
2501   *  @param __lhs  C string.
2502   *  @param __rhs  String.
2503   *  @return  True if @a __rhs.compare(@a __lhs) == 0.  False otherwise.
2504   */
2505  template<typename _CharT, typename _Traits, typename _Alloc>
2506    inline bool
2507    operator==(const _CharT* __lhs,
2508	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2509    { return __rhs.compare(__lhs) == 0; }
2510
2511  /**
2512   *  @brief  Test equivalence of string and C string.
2513   *  @param __lhs  String.
2514   *  @param __rhs  C string.
2515   *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
2516   */
2517  template<typename _CharT, typename _Traits, typename _Alloc>
2518    inline bool
2519    operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2520	       const _CharT* __rhs)
2521    { return __lhs.compare(__rhs) == 0; }
2522
2523  // operator !=
2524  /**
2525   *  @brief  Test difference of two strings.
2526   *  @param __lhs  First string.
2527   *  @param __rhs  Second string.
2528   *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
2529   */
2530  template<typename _CharT, typename _Traits, typename _Alloc>
2531    inline bool
2532    operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2533	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2534    { return !(__lhs == __rhs); }
2535
2536  /**
2537   *  @brief  Test difference of C string and string.
2538   *  @param __lhs  C string.
2539   *  @param __rhs  String.
2540   *  @return  True if @a __rhs.compare(@a __lhs) != 0.  False otherwise.
2541   */
2542  template<typename _CharT, typename _Traits, typename _Alloc>
2543    inline bool
2544    operator!=(const _CharT* __lhs,
2545	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2546    { return !(__lhs == __rhs); }
2547
2548  /**
2549   *  @brief  Test difference of string and C string.
2550   *  @param __lhs  String.
2551   *  @param __rhs  C string.
2552   *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
2553   */
2554  template<typename _CharT, typename _Traits, typename _Alloc>
2555    inline bool
2556    operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2557	       const _CharT* __rhs)
2558    { return !(__lhs == __rhs); }
2559
2560  // operator <
2561  /**
2562   *  @brief  Test if string precedes string.
2563   *  @param __lhs  First string.
2564   *  @param __rhs  Second string.
2565   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
2566   */
2567  template<typename _CharT, typename _Traits, typename _Alloc>
2568    inline bool
2569    operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2570	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2571    { return __lhs.compare(__rhs) < 0; }
2572
2573  /**
2574   *  @brief  Test if string precedes C string.
2575   *  @param __lhs  String.
2576   *  @param __rhs  C string.
2577   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
2578   */
2579  template<typename _CharT, typename _Traits, typename _Alloc>
2580    inline bool
2581    operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2582	      const _CharT* __rhs)
2583    { return __lhs.compare(__rhs) < 0; }
2584
2585  /**
2586   *  @brief  Test if C string precedes string.
2587   *  @param __lhs  C string.
2588   *  @param __rhs  String.
2589   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
2590   */
2591  template<typename _CharT, typename _Traits, typename _Alloc>
2592    inline bool
2593    operator<(const _CharT* __lhs,
2594	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2595    { return __rhs.compare(__lhs) > 0; }
2596
2597  // operator >
2598  /**
2599   *  @brief  Test if string follows string.
2600   *  @param __lhs  First string.
2601   *  @param __rhs  Second string.
2602   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
2603   */
2604  template<typename _CharT, typename _Traits, typename _Alloc>
2605    inline bool
2606    operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2607	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2608    { return __lhs.compare(__rhs) > 0; }
2609
2610  /**
2611   *  @brief  Test if string follows C string.
2612   *  @param __lhs  String.
2613   *  @param __rhs  C string.
2614   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
2615   */
2616  template<typename _CharT, typename _Traits, typename _Alloc>
2617    inline bool
2618    operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2619	      const _CharT* __rhs)
2620    { return __lhs.compare(__rhs) > 0; }
2621
2622  /**
2623   *  @brief  Test if C string follows string.
2624   *  @param __lhs  C string.
2625   *  @param __rhs  String.
2626   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
2627   */
2628  template<typename _CharT, typename _Traits, typename _Alloc>
2629    inline bool
2630    operator>(const _CharT* __lhs,
2631	      const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2632    { return __rhs.compare(__lhs) < 0; }
2633
2634  // operator <=
2635  /**
2636   *  @brief  Test if string doesn't follow string.
2637   *  @param __lhs  First string.
2638   *  @param __rhs  Second string.
2639   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
2640   */
2641  template<typename _CharT, typename _Traits, typename _Alloc>
2642    inline bool
2643    operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2644	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2645    { return __lhs.compare(__rhs) <= 0; }
2646
2647  /**
2648   *  @brief  Test if string doesn't follow C string.
2649   *  @param __lhs  String.
2650   *  @param __rhs  C string.
2651   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
2652   */
2653  template<typename _CharT, typename _Traits, typename _Alloc>
2654    inline bool
2655    operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2656	       const _CharT* __rhs)
2657    { return __lhs.compare(__rhs) <= 0; }
2658
2659  /**
2660   *  @brief  Test if C string doesn't follow string.
2661   *  @param __lhs  C string.
2662   *  @param __rhs  String.
2663   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
2664   */
2665  template<typename _CharT, typename _Traits, typename _Alloc>
2666    inline bool
2667    operator<=(const _CharT* __lhs,
2668	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2669    { return __rhs.compare(__lhs) >= 0; }
2670
2671  // operator >=
2672  /**
2673   *  @brief  Test if string doesn't precede string.
2674   *  @param __lhs  First string.
2675   *  @param __rhs  Second string.
2676   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
2677   */
2678  template<typename _CharT, typename _Traits, typename _Alloc>
2679    inline bool
2680    operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2681	       const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2682    { return __lhs.compare(__rhs) >= 0; }
2683
2684  /**
2685   *  @brief  Test if string doesn't precede C string.
2686   *  @param __lhs  String.
2687   *  @param __rhs  C string.
2688   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
2689   */
2690  template<typename _CharT, typename _Traits, typename _Alloc>
2691    inline bool
2692    operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2693	       const _CharT* __rhs)
2694    { return __lhs.compare(__rhs) >= 0; }
2695
2696  /**
2697   *  @brief  Test if C string doesn't precede string.
2698   *  @param __lhs  C string.
2699   *  @param __rhs  String.
2700   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
2701   */
2702  template<typename _CharT, typename _Traits, typename _Alloc>
2703    inline bool
2704    operator>=(const _CharT* __lhs,
2705	     const basic_string<_CharT, _Traits, _Alloc>& __rhs)
2706    { return __rhs.compare(__lhs) <= 0; }
2707
2708  /**
2709   *  @brief  Swap contents of two strings.
2710   *  @param __lhs  First string.
2711   *  @param __rhs  Second string.
2712   *
2713   *  Exchanges the contents of @a __lhs and @a __rhs in constant time.
2714   */
2715  template<typename _CharT, typename _Traits, typename _Alloc>
2716    inline void
2717    swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
2718	 basic_string<_CharT, _Traits, _Alloc>& __rhs)
2719    { __lhs.swap(__rhs); }
2720
2721  /**
2722   *  @brief  Read stream into a string.
2723   *  @param __is  Input stream.
2724   *  @param __str  Buffer to store into.
2725   *  @return  Reference to the input stream.
2726   *
2727   *  Stores characters from @a __is into @a __str until whitespace is
2728   *  found, the end of the stream is encountered, or str.max_size()
2729   *  is reached.  If is.width() is non-zero, that is the limit on the
2730   *  number of characters stored into @a __str.  Any previous
2731   *  contents of @a __str are erased.
2732   */
2733  template<typename _CharT, typename _Traits, typename _Alloc>
2734    basic_istream<_CharT, _Traits>&
2735    operator>>(basic_istream<_CharT, _Traits>& __is,
2736	       basic_string<_CharT, _Traits, _Alloc>& __str);
2737
2738  template<>
2739    basic_istream<char>&
2740    operator>>(basic_istream<char>& __is, basic_string<char>& __str);
2741
2742  /**
2743   *  @brief  Write string to a stream.
2744   *  @param __os  Output stream.
2745   *  @param __str  String to write out.
2746   *  @return  Reference to the output stream.
2747   *
2748   *  Output characters of @a __str into os following the same rules as for
2749   *  writing a C string.
2750   */
2751  template<typename _CharT, typename _Traits, typename _Alloc>
2752    inline basic_ostream<_CharT, _Traits>&
2753    operator<<(basic_ostream<_CharT, _Traits>& __os,
2754	       const basic_string<_CharT, _Traits, _Alloc>& __str)
2755    {
2756      // _GLIBCXX_RESOLVE_LIB_DEFECTS
2757      // 586. string inserter not a formatted function
2758      return __ostream_insert(__os, __str.data(), __str.size());
2759    }
2760
2761  /**
2762   *  @brief  Read a line from stream into a string.
2763   *  @param __is  Input stream.
2764   *  @param __str  Buffer to store into.
2765   *  @param __delim  Character marking end of line.
2766   *  @return  Reference to the input stream.
2767   *
2768   *  Stores characters from @a __is into @a __str until @a __delim is
2769   *  found, the end of the stream is encountered, or str.max_size()
2770   *  is reached.  Any previous contents of @a __str are erased.  If
2771   *  @a __delim is encountered, it is extracted but not stored into
2772   *  @a __str.
2773   */
2774  template<typename _CharT, typename _Traits, typename _Alloc>
2775    basic_istream<_CharT, _Traits>&
2776    getline(basic_istream<_CharT, _Traits>& __is,
2777	    basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
2778
2779  /**
2780   *  @brief  Read a line from stream into a string.
2781   *  @param __is  Input stream.
2782   *  @param __str  Buffer to store into.
2783   *  @return  Reference to the input stream.
2784   *
2785   *  Stores characters from is into @a __str until &apos;\n&apos; is
2786   *  found, the end of the stream is encountered, or str.max_size()
2787   *  is reached.  Any previous contents of @a __str are erased.  If
2788   *  end of line is encountered, it is extracted but not stored into
2789   *  @a __str.
2790   */
2791  template<typename _CharT, typename _Traits, typename _Alloc>
2792    inline basic_istream<_CharT, _Traits>&
2793    getline(basic_istream<_CharT, _Traits>& __is,
2794	    basic_string<_CharT, _Traits, _Alloc>& __str)
2795    { return getline(__is, __str, __is.widen('\n')); }
2796
2797  template<>
2798    basic_istream<char>&
2799    getline(basic_istream<char>& __in, basic_string<char>& __str,
2800	    char __delim);
2801
2802#ifdef _GLIBCXX_USE_WCHAR_T
2803  template<>
2804    basic_istream<wchar_t>&
2805    getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
2806	    wchar_t __delim);
2807#endif
2808
2809_GLIBCXX_END_NAMESPACE_VERSION
2810} // namespace
2811
2812#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
2813     && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
2814
2815#include <ext/string_conversions.h>
2816
2817namespace std _GLIBCXX_VISIBILITY(default)
2818{
2819_GLIBCXX_BEGIN_NAMESPACE_VERSION
2820
2821  // 21.4 Numeric Conversions [string.conversions].
2822  inline int
2823  stoi(const string& __str, size_t* __idx = 0, int __base = 10)
2824  { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
2825					__idx, __base); }
2826
2827  inline long
2828  stol(const string& __str, size_t* __idx = 0, int __base = 10)
2829  { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
2830			     __idx, __base); }
2831
2832  inline unsigned long
2833  stoul(const string& __str, size_t* __idx = 0, int __base = 10)
2834  { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
2835			     __idx, __base); }
2836
2837  inline long long
2838  stoll(const string& __str, size_t* __idx = 0, int __base = 10)
2839  { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
2840			     __idx, __base); }
2841
2842  inline unsigned long long
2843  stoull(const string& __str, size_t* __idx = 0, int __base = 10)
2844  { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
2845			     __idx, __base); }
2846
2847  // NB: strtof vs strtod.
2848  inline float
2849  stof(const string& __str, size_t* __idx = 0)
2850  { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
2851
2852  inline double
2853  stod(const string& __str, size_t* __idx = 0)
2854  { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
2855
2856  inline long double
2857  stold(const string& __str, size_t* __idx = 0)
2858  { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
2859
2860  // NB: (v)snprintf vs sprintf.
2861
2862  // DR 1261.
2863  inline string
2864  to_string(int __val)
2865  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int),
2866					   "%d", __val); }
2867
2868  inline string
2869  to_string(unsigned __val)
2870  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
2871					   4 * sizeof(unsigned),
2872					   "%u", __val); }
2873
2874  inline string
2875  to_string(long __val)
2876  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long),
2877					   "%ld", __val); }
2878
2879  inline string
2880  to_string(unsigned long __val)
2881  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
2882					   4 * sizeof(unsigned long),
2883					   "%lu", __val); }
2884
2885  inline string
2886  to_string(long long __val)
2887  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
2888					   4 * sizeof(long long),
2889					   "%lld", __val); }
2890
2891  inline string
2892  to_string(unsigned long long __val)
2893  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
2894					   4 * sizeof(unsigned long long),
2895					   "%llu", __val); }
2896
2897  inline string
2898  to_string(float __val)
2899  {
2900    const int __n =
2901      __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
2902    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
2903					   "%f", __val);
2904  }
2905
2906  inline string
2907  to_string(double __val)
2908  {
2909    const int __n =
2910      __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
2911    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
2912					   "%f", __val);
2913  }
2914
2915  inline string
2916  to_string(long double __val)
2917  {
2918    const int __n =
2919      __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
2920    return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
2921					   "%Lf", __val);
2922  }
2923
2924#ifdef _GLIBCXX_USE_WCHAR_T
2925  inline int
2926  stoi(const wstring& __str, size_t* __idx = 0, int __base = 10)
2927  { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
2928					__idx, __base); }
2929
2930  inline long
2931  stol(const wstring& __str, size_t* __idx = 0, int __base = 10)
2932  { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
2933			     __idx, __base); }
2934
2935  inline unsigned long
2936  stoul(const wstring& __str, size_t* __idx = 0, int __base = 10)
2937  { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
2938			     __idx, __base); }
2939
2940  inline long long
2941  stoll(const wstring& __str, size_t* __idx = 0, int __base = 10)
2942  { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
2943			     __idx, __base); }
2944
2945  inline unsigned long long
2946  stoull(const wstring& __str, size_t* __idx = 0, int __base = 10)
2947  { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
2948			     __idx, __base); }
2949
2950  // NB: wcstof vs wcstod.
2951  inline float
2952  stof(const wstring& __str, size_t* __idx = 0)
2953  { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
2954
2955  inline double
2956  stod(const wstring& __str, size_t* __idx = 0)
2957  { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
2958
2959  inline long double
2960  stold(const wstring& __str, size_t* __idx = 0)
2961  { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
2962
2963  // DR 1261.
2964  inline wstring
2965  to_wstring(int __val)
2966  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(int),
2967					    L"%d", __val); }
2968
2969  inline wstring
2970  to_wstring(unsigned __val)
2971  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
2972					    4 * sizeof(unsigned),
2973					    L"%u", __val); }
2974
2975  inline wstring
2976  to_wstring(long __val)
2977  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(long),
2978					    L"%ld", __val); }
2979
2980  inline wstring
2981  to_wstring(unsigned long __val)
2982  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
2983					    4 * sizeof(unsigned long),
2984					    L"%lu", __val); }
2985
2986  inline wstring
2987  to_wstring(long long __val)
2988  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
2989					    4 * sizeof(long long),
2990					    L"%lld", __val); }
2991
2992  inline wstring
2993  to_wstring(unsigned long long __val)
2994  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
2995					    4 * sizeof(unsigned long long),
2996					    L"%llu", __val); }
2997
2998  inline wstring
2999  to_wstring(float __val)
3000  {
3001    const int __n =
3002      __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
3003    return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
3004					    L"%f", __val);
3005  }
3006
3007  inline wstring
3008  to_wstring(double __val)
3009  {
3010    const int __n =
3011      __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
3012    return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
3013					    L"%f", __val);
3014  }
3015
3016  inline wstring
3017  to_wstring(long double __val)
3018  {
3019    const int __n =
3020      __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
3021    return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
3022					    L"%Lf", __val);
3023  }
3024#endif
3025
3026_GLIBCXX_END_NAMESPACE_VERSION
3027} // namespace
3028
3029#endif /* C++11 && _GLIBCXX_USE_C99 ... */
3030
3031#if __cplusplus >= 201103L
3032
3033#include <bits/functional_hash.h>
3034
3035namespace std _GLIBCXX_VISIBILITY(default)
3036{
3037_GLIBCXX_BEGIN_NAMESPACE_VERSION
3038
3039  // DR 1182.
3040
3041#ifndef _GLIBCXX_COMPATIBILITY_CXX0X
3042  /// std::hash specialization for string.
3043  template<>
3044    struct hash<string>
3045    : public __hash_base<size_t, string>
3046    {
3047      size_t
3048      operator()(const string& __s) const noexcept
3049      { return std::_Hash_impl::hash(__s.data(), __s.length()); }
3050    };
3051
3052  template<>
3053    struct __is_fast_hash<hash<string>> : std::false_type
3054    { };
3055
3056#ifdef _GLIBCXX_USE_WCHAR_T
3057  /// std::hash specialization for wstring.
3058  template<>
3059    struct hash<wstring>
3060    : public __hash_base<size_t, wstring>
3061    {
3062      size_t
3063      operator()(const wstring& __s) const noexcept
3064      { return std::_Hash_impl::hash(__s.data(),
3065                                     __s.length() * sizeof(wchar_t)); }
3066    };
3067
3068  template<>
3069    struct __is_fast_hash<hash<wstring>> : std::false_type
3070    { };
3071#endif
3072#endif /* _GLIBCXX_COMPATIBILITY_CXX0X */
3073
3074#ifdef _GLIBCXX_USE_C99_STDINT_TR1
3075  /// std::hash specialization for u16string.
3076  template<>
3077    struct hash<u16string>
3078    : public __hash_base<size_t, u16string>
3079    {
3080      size_t
3081      operator()(const u16string& __s) const noexcept
3082      { return std::_Hash_impl::hash(__s.data(),
3083                                     __s.length() * sizeof(char16_t)); }
3084    };
3085
3086  template<>
3087    struct __is_fast_hash<hash<u16string>> : std::false_type
3088    { };
3089
3090  /// std::hash specialization for u32string.
3091  template<>
3092    struct hash<u32string>
3093    : public __hash_base<size_t, u32string>
3094    {
3095      size_t
3096      operator()(const u32string& __s) const noexcept
3097      { return std::_Hash_impl::hash(__s.data(),
3098                                     __s.length() * sizeof(char32_t)); }
3099    };
3100
3101  template<>
3102    struct __is_fast_hash<hash<u32string>> : std::false_type
3103    { };
3104#endif
3105
3106_GLIBCXX_END_NAMESPACE_VERSION
3107} // namespace
3108
3109#endif // C++11
3110
3111#endif /* _BASIC_STRING_H */
3112