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   	
45   	namespace 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 	
2817 	namespace 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 	
3035 	namespace 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