• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/arm-linux/include/c++/4.5.3/ext/
1// Versatile string -*- C++ -*-
2
3// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
4// Free Software Foundation, Inc.
5//
6// This file is part of the GNU ISO C++ Library.  This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 3, or (at your option)
10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15// GNU General Public License for more details.
16
17// Under Section 7 of GPL version 3, you are granted additional
18// permissions described in the GCC Runtime Library Exception, version
19// 3.1, as published by the Free Software Foundation.
20
21// You should have received a copy of the GNU General Public License and
22// a copy of the GCC Runtime Library Exception along with this program;
23// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24// <http://www.gnu.org/licenses/>.
25
26/** @file ext/vstring.h
27 *  This file is a GNU extension to the Standard C++ Library.
28 */
29
30#ifndef _VSTRING_H
31#define _VSTRING_H 1
32
33#pragma GCC system_header
34
35#include <initializer_list>
36#include <ext/vstring_util.h>
37#include <ext/rc_string_base.h>
38#include <ext/sso_string_base.h>
39
40_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
41
42  /**
43   *  @class __versa_string vstring.h
44   *  @brief  Template class __versa_string.
45   *  @ingroup extensions
46   *
47   *  Data structure managing sequences of characters and
48   *  character-like objects.
49   */
50  template<typename _CharT, typename _Traits, typename _Alloc,
51	   template <typename, typename, typename> class _Base>
52    class __versa_string
53    : private _Base<_CharT, _Traits, _Alloc>
54    {
55      typedef _Base<_CharT, _Traits, _Alloc>                __vstring_base;
56      typedef typename __vstring_base::_CharT_alloc_type    _CharT_alloc_type;
57
58      // Types:
59    public:
60      typedef _Traits					    traits_type;
61      typedef typename _Traits::char_type		    value_type;
62      typedef _Alloc					    allocator_type;
63      typedef typename _CharT_alloc_type::size_type	    size_type;
64      typedef typename _CharT_alloc_type::difference_type   difference_type;
65      typedef typename _CharT_alloc_type::reference	    reference;
66      typedef typename _CharT_alloc_type::const_reference   const_reference;
67      typedef typename _CharT_alloc_type::pointer	    pointer;
68      typedef typename _CharT_alloc_type::const_pointer	    const_pointer;
69      typedef __gnu_cxx::__normal_iterator<pointer, __versa_string>  iterator;
70      typedef __gnu_cxx::__normal_iterator<const_pointer, __versa_string>
71                                                            const_iterator;
72      typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;
73      typedef std::reverse_iterator<iterator>		    reverse_iterator;
74
75      // Data Member (public):
76      ///  Value returned by various member functions when they fail.
77      static const size_type	npos = static_cast<size_type>(-1);
78
79    private:
80      size_type
81      _M_check(size_type __pos, const char* __s) const
82      {
83	if (__pos > this->size())
84	  std::__throw_out_of_range(__N(__s));
85	return __pos;
86      }
87
88      void
89      _M_check_length(size_type __n1, size_type __n2, const char* __s) const
90      {
91	if (this->max_size() - (this->size() - __n1) < __n2)
92	  std::__throw_length_error(__N(__s));
93      }
94
95      // NB: _M_limit doesn't check for a bad __pos value.
96      size_type
97      _M_limit(size_type __pos, size_type __off) const
98      {
99	const bool __testoff =  __off < this->size() - __pos;
100	return __testoff ? __off : this->size() - __pos;
101      }
102
103      // True if _Rep and source do not overlap.
104      bool
105      _M_disjunct(const _CharT* __s) const
106      {
107	return (std::less<const _CharT*>()(__s, this->_M_data())
108		|| std::less<const _CharT*>()(this->_M_data()
109					      + this->size(), __s));
110      }
111
112      // For the internal use we have functions similar to `begin'/`end'
113      // but they do not call _M_leak.
114      iterator
115      _M_ibegin() const
116      { return iterator(this->_M_data()); }
117
118      iterator
119      _M_iend() const
120      { return iterator(this->_M_data() + this->_M_length()); }
121
122    public:
123      // Construct/copy/destroy:
124      // NB: We overload ctors in some cases instead of using default
125      // arguments, per 17.4.4.4 para. 2 item 2.
126
127      /**
128       *  @brief  Default constructor creates an empty string.
129       */
130      __versa_string()
131      : __vstring_base() { }
132
133      /**
134       *  @brief  Construct an empty string using allocator @a a.
135       */
136      explicit
137      __versa_string(const _Alloc& __a)
138      : __vstring_base(__a) { }
139
140      // NB: per LWG issue 42, semantics different from IS:
141      /**
142       *  @brief  Construct string with copy of value of @a str.
143       *  @param  __str  Source string.
144       */
145      __versa_string(const __versa_string& __str)
146      : __vstring_base(__str) { }
147
148#ifdef __GXX_EXPERIMENTAL_CXX0X__
149      /**
150       *  @brief  String move constructor.
151       *  @param  __str  Source string.
152       *
153       *  The newly-constructed %string contains the exact contents of
154       *  @a str.  The contents of @a str are a valid, but unspecified
155       *  string.
156       */
157      __versa_string(__versa_string&& __str)
158      : __vstring_base(std::forward<__vstring_base>(__str)) { }
159
160      /**
161       *  @brief  Construct string from an initializer list.
162       *  @param  __l  std::initializer_list of characters.
163       *  @param  __a  Allocator to use (default is default allocator).
164       */
165      __versa_string(std::initializer_list<_CharT> __l,
166		     const _Alloc& __a = _Alloc())
167      : __vstring_base(__l.begin(), __l.end(), __a) { }
168#endif
169
170      /**
171       *  @brief  Construct string as copy of a substring.
172       *  @param  __str  Source string.
173       *  @param  __pos  Index of first character to copy from.
174       *  @param  __n  Number of characters to copy (default remainder).
175       */
176      __versa_string(const __versa_string& __str, size_type __pos,
177		     size_type __n = npos)
178      : __vstring_base(__str._M_data()
179		       + __str._M_check(__pos,
180					"__versa_string::__versa_string"),
181		       __str._M_data() + __str._M_limit(__pos, __n)
182		       + __pos, _Alloc()) { }
183
184      /**
185       *  @brief  Construct string as copy of a substring.
186       *  @param  __str  Source string.
187       *  @param  __pos  Index of first character to copy from.
188       *  @param  __n  Number of characters to copy.
189       *  @param  __a  Allocator to use.
190       */
191      __versa_string(const __versa_string& __str, size_type __pos,
192		     size_type __n, const _Alloc& __a)
193      : __vstring_base(__str._M_data()
194		       + __str._M_check(__pos,
195					"__versa_string::__versa_string"),
196		       __str._M_data() + __str._M_limit(__pos, __n)
197		       + __pos, __a) { }
198
199      /**
200       *  @brief  Construct string initialized by a character array.
201       *  @param  __s  Source character array.
202       *  @param  __n  Number of characters to copy.
203       *  @param  __a  Allocator to use (default is default allocator).
204       *
205       *  NB: @a __s must have at least @a __n characters, '\\0' has no special
206       *  meaning.
207       */
208      __versa_string(const _CharT* __s, size_type __n,
209		     const _Alloc& __a = _Alloc())
210      : __vstring_base(__s, __s + __n, __a) { }
211
212      /**
213       *  @brief  Construct string as copy of a C string.
214       *  @param  __s  Source C string.
215       *  @param  __a  Allocator to use (default is default allocator).
216       */
217      __versa_string(const _CharT* __s, const _Alloc& __a = _Alloc())
218      : __vstring_base(__s, __s ? __s + traits_type::length(__s) :
219		       __s + npos, __a) { }
220
221      /**
222       *  @brief  Construct string as multiple characters.
223       *  @param  __n  Number of characters.
224       *  @param  __c  Character to use.
225       *  @param  __a  Allocator to use (default is default allocator).
226       */
227      __versa_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
228      : __vstring_base(__n, __c, __a) { }
229
230      /**
231       *  @brief  Construct string as copy of a range.
232       *  @param  __beg  Start of range.
233       *  @param  __end  End of range.
234       *  @param  __a  Allocator to use (default is default allocator).
235       */
236      template<class _InputIterator>
237        __versa_string(_InputIterator __beg, _InputIterator __end,
238		       const _Alloc& __a = _Alloc())
239	: __vstring_base(__beg, __end, __a) { }
240
241      /**
242       *  @brief  Destroy the string instance.
243       */
244      ~__versa_string() { }
245
246      /**
247       *  @brief  Assign the value of @a str to this string.
248       *  @param  __str  Source string.
249       */
250      __versa_string&
251      operator=(const __versa_string& __str)
252      { return this->assign(__str); }
253
254#ifdef __GXX_EXPERIMENTAL_CXX0X__
255      /**
256       *  @brief  String move assignment operator.
257       *  @param  __str  Source string.
258       *
259       *  The contents of @a __str are moved into this string (without
260       *  copying).  @a __str is a valid, but unspecified string.
261       */
262      __versa_string&
263      operator=(__versa_string&& __str)
264      {
265	// NB: DR 1204.
266	this->swap(__str);
267	return *this;
268      }
269
270      /**
271       *  @brief  Set value to string constructed from initializer list.
272       *  @param  __l  std::initializer_list.
273       */
274      __versa_string&
275      operator=(std::initializer_list<_CharT> __l)
276      {
277	this->assign(__l.begin(), __l.end());
278	return *this;
279      }
280#endif
281
282      /**
283       *  @brief  Copy contents of @a __s into this string.
284       *  @param  __s  Source null-terminated string.
285       */
286      __versa_string&
287      operator=(const _CharT* __s)
288      { return this->assign(__s); }
289
290      /**
291       *  @brief  Set value to string of length 1.
292       *  @param  __c  Source character.
293       *
294       *  Assigning to a character makes this string length 1 and
295       *  (*this)[0] == @a __c.
296       */
297      __versa_string&
298      operator=(_CharT __c)
299      {
300	this->assign(1, __c);
301	return *this;
302      }
303
304      // Iterators:
305      /**
306       *  Returns a read/write iterator that points to the first character in
307       *  the %string.  Unshares the string.
308       */
309      iterator
310      begin()
311      {
312	this->_M_leak();
313	return iterator(this->_M_data());
314      }
315
316      /**
317       *  Returns a read-only (constant) iterator that points to the first
318       *  character in the %string.
319       */
320      const_iterator
321      begin() const
322      { return const_iterator(this->_M_data()); }
323
324      /**
325       *  Returns a read/write iterator that points one past the last
326       *  character in the %string.  Unshares the string.
327       */
328      iterator
329      end()
330      {
331	this->_M_leak();
332	return iterator(this->_M_data() + this->size());
333      }
334
335      /**
336       *  Returns a read-only (constant) iterator that points one past the
337       *  last character in the %string.
338       */
339      const_iterator
340      end() const
341      { return const_iterator(this->_M_data() + this->size()); }
342
343      /**
344       *  Returns a read/write reverse iterator that points to the last
345       *  character in the %string.  Iteration is done in reverse element
346       *  order.  Unshares the string.
347       */
348      reverse_iterator
349      rbegin()
350      { return reverse_iterator(this->end()); }
351
352      /**
353       *  Returns a read-only (constant) reverse iterator that points
354       *  to the last character in the %string.  Iteration is done in
355       *  reverse element order.
356       */
357      const_reverse_iterator
358      rbegin() const
359      { return const_reverse_iterator(this->end()); }
360
361      /**
362       *  Returns a read/write reverse iterator that points to one before the
363       *  first character in the %string.  Iteration is done in reverse
364       *  element order.  Unshares the string.
365       */
366      reverse_iterator
367      rend()
368      { return reverse_iterator(this->begin()); }
369
370      /**
371       *  Returns a read-only (constant) reverse iterator that points
372       *  to one before the first character in the %string.  Iteration
373       *  is done in reverse element order.
374       */
375      const_reverse_iterator
376      rend() const
377      { return const_reverse_iterator(this->begin()); }
378
379#ifdef __GXX_EXPERIMENTAL_CXX0X__
380      /**
381       *  Returns a read-only (constant) iterator that points to the first
382       *  character in the %string.
383       */
384      const_iterator
385      cbegin() const
386      { return const_iterator(this->_M_data()); }
387
388      /**
389       *  Returns a read-only (constant) iterator that points one past the
390       *  last character in the %string.
391       */
392      const_iterator
393      cend() const
394      { return const_iterator(this->_M_data() + this->size()); }
395
396      /**
397       *  Returns a read-only (constant) reverse iterator that points
398       *  to the last character in the %string.  Iteration is done in
399       *  reverse element order.
400       */
401      const_reverse_iterator
402      crbegin() const
403      { return const_reverse_iterator(this->end()); }
404
405      /**
406       *  Returns a read-only (constant) reverse iterator that points
407       *  to one before the first character in the %string.  Iteration
408       *  is done in reverse element order.
409       */
410      const_reverse_iterator
411      crend() const
412      { return const_reverse_iterator(this->begin()); }
413#endif
414
415    public:
416      // Capacity:
417      ///  Returns the number of characters in the string, not including any
418      ///  null-termination.
419      size_type
420      size() const
421      { return this->_M_length(); }
422
423      ///  Returns the number of characters in the string, not including any
424      ///  null-termination.
425      size_type
426      length() const
427      { return this->_M_length(); }
428
429      /// Returns the size() of the largest possible %string.
430      size_type
431      max_size() const
432      { return this->_M_max_size(); }
433
434      /**
435       *  @brief  Resizes the %string to the specified number of characters.
436       *  @param  __n  Number of characters the %string should contain.
437       *  @param  __c  Character to fill any new elements.
438       *
439       *  This function will %resize the %string to the specified
440       *  number of characters.  If the number is smaller than the
441       *  %string's current size the %string is truncated, otherwise
442       *  the %string is extended and new elements are set to @a __c.
443       */
444      void
445      resize(size_type __n, _CharT __c);
446
447      /**
448       *  @brief  Resizes the %string to the specified number of characters.
449       *  @param  __n  Number of characters the %string should contain.
450       *
451       *  This function will resize the %string to the specified
452       *  length.  If the new size is smaller than the %string's
453       *  current size the %string is truncated, otherwise the %string
454       *  is extended and new characters are default-constructed.  For
455       *  basic types such as char, this means setting them to 0.
456       */
457      void
458      resize(size_type __n)
459      { this->resize(__n, _CharT()); }
460
461#ifdef __GXX_EXPERIMENTAL_CXX0X__
462      /// A non-binding request to reduce capacity() to size().
463      void
464      shrink_to_fit()
465      {
466	__try
467	  { this->reserve(0); }
468	__catch(...)
469	  { }
470      }
471#endif
472
473      /**
474       *  Returns the total number of characters that the %string can
475       *  hold before needing to allocate more memory.
476       */
477      size_type
478      capacity() const
479      { return this->_M_capacity(); }
480
481      /**
482       *  @brief  Attempt to preallocate enough memory for specified number of
483       *          characters.
484       *  @param  __res_arg  Number of characters required.
485       *  @throw  std::length_error  If @a __res_arg exceeds @c max_size().
486       *
487       *  This function attempts to reserve enough memory for the
488       *  %string to hold the specified number of characters.  If the
489       *  number requested is more than max_size(), length_error is
490       *  thrown.
491       *
492       *  The advantage of this function is that if optimal code is a
493       *  necessity and the user can determine the string length that
494       *  will be required, the user can reserve the memory in
495       *  %advance, and thus prevent a possible reallocation of memory
496       *  and copying of %string data.
497       */
498      void
499      reserve(size_type __res_arg = 0)
500      { this->_M_reserve(__res_arg); }
501
502      /**
503       *  Erases the string, making it empty.
504       */
505      void
506      clear()
507      { this->_M_clear(); }
508
509      /**
510       *  Returns true if the %string is empty.  Equivalent to
511       *  <code>*this == ""</code>.
512       */
513      bool
514      empty() const
515      { return this->size() == 0; }
516
517      // Element access:
518      /**
519       *  @brief  Subscript access to the data contained in the %string.
520       *  @param  __pos  The index of the character to access.
521       *  @return  Read-only (constant) reference to the character.
522       *
523       *  This operator allows for easy, array-style, data access.
524       *  Note that data access with this operator is unchecked and
525       *  out_of_range lookups are not defined. (For checked lookups
526       *  see at().)
527       */
528      const_reference
529      operator[] (size_type __pos) const
530      {
531	_GLIBCXX_DEBUG_ASSERT(__pos <= this->size());
532	return this->_M_data()[__pos];
533      }
534
535      /**
536       *  @brief  Subscript access to the data contained in the %string.
537       *  @param  __pos  The index of the character to access.
538       *  @return  Read/write reference to the character.
539       *
540       *  This operator allows for easy, array-style, data access.
541       *  Note that data access with this operator is unchecked and
542       *  out_of_range lookups are not defined. (For checked lookups
543       *  see at().)  Unshares the string.
544       */
545      reference
546      operator[](size_type __pos)
547      {
548        // allow pos == size() as v3 extension:
549	_GLIBCXX_DEBUG_ASSERT(__pos <= this->size());
550        // but be strict in pedantic mode:
551	_GLIBCXX_DEBUG_PEDASSERT(__pos < this->size());
552	this->_M_leak();
553	return this->_M_data()[__pos];
554      }
555
556      /**
557       *  @brief  Provides access to the data contained in the %string.
558       *  @param __n The index of the character to access.
559       *  @return  Read-only (const) reference to the character.
560       *  @throw  std::out_of_range  If @a __n is an invalid index.
561       *
562       *  This function provides for safer data access.  The parameter
563       *  is first checked that it is in the range of the string.  The
564       *  function throws out_of_range if the check fails.
565       */
566      const_reference
567      at(size_type __n) const
568      {
569	if (__n >= this->size())
570	  std::__throw_out_of_range(__N("__versa_string::at"));
571	return this->_M_data()[__n];
572      }
573
574      /**
575       *  @brief  Provides access to the data contained in the %string.
576       *  @param __n The index of the character to access.
577       *  @return  Read/write reference to the character.
578       *  @throw  std::out_of_range  If @a __n is an invalid index.
579       *
580       *  This function provides for safer data access.  The parameter
581       *  is first checked that it is in the range of the string.  The
582       *  function throws out_of_range if the check fails.  Success
583       *  results in unsharing the string.
584       */
585      reference
586      at(size_type __n)
587      {
588	if (__n >= this->size())
589	  std::__throw_out_of_range(__N("__versa_string::at"));
590	this->_M_leak();
591	return this->_M_data()[__n];
592      }
593
594#ifdef __GXX_EXPERIMENTAL_CXX0X__
595      /**
596       *  Returns a read/write reference to the data at the first
597       *  element of the %string.
598       */
599      reference
600      front()
601      { return *begin(); }
602
603      /**
604       *  Returns a read-only (constant) reference to the data at the first
605       *  element of the %string.
606       */
607      const_reference
608      front() const
609      { return *begin(); }
610
611      /**
612       *  Returns a read/write reference to the data at the last
613       *  element of the %string.
614       */
615      reference
616      back()
617      { return *(end() - 1); }
618
619      /**
620       *  Returns a read-only (constant) reference to the data at the
621       *  last element of the %string.
622       */
623      const_reference
624      back() const
625      { return *(end() - 1); }
626#endif
627
628      // Modifiers:
629      /**
630       *  @brief  Append a string to this string.
631       *  @param __str  The string to append.
632       *  @return  Reference to this string.
633       */
634      __versa_string&
635      operator+=(const __versa_string& __str)
636      { return this->append(__str); }
637
638      /**
639       *  @brief  Append a C string.
640       *  @param __s  The C string to append.
641       *  @return  Reference to this string.
642       */
643      __versa_string&
644      operator+=(const _CharT* __s)
645      { return this->append(__s); }
646
647      /**
648       *  @brief  Append a character.
649       *  @param __c  The character to append.
650       *  @return  Reference to this string.
651       */
652      __versa_string&
653      operator+=(_CharT __c)
654      {
655	this->push_back(__c);
656	return *this;
657      }
658
659#ifdef __GXX_EXPERIMENTAL_CXX0X__
660      /**
661       *  @brief  Append an initializer_list of characters.
662       *  @param __l  The initializer_list of characters to be appended.
663       *  @return  Reference to this string.
664       */
665      __versa_string&
666      operator+=(std::initializer_list<_CharT> __l)
667      { return this->append(__l.begin(), __l.end()); }
668#endif // __GXX_EXPERIMENTAL_CXX0X__
669
670      /**
671       *  @brief  Append a string to this string.
672       *  @param __str  The string to append.
673       *  @return  Reference to this string.
674       */
675      __versa_string&
676      append(const __versa_string& __str)
677      { return _M_append(__str._M_data(), __str.size()); }
678
679      /**
680       *  @brief  Append a substring.
681       *  @param __str  The string to append.
682       *  @param __pos  Index of the first character of str to append.
683       *  @param __n  The number of characters to append.
684       *  @return  Reference to this string.
685       *  @throw  std::out_of_range if @a pos is not a valid index.
686       *
687       *  This function appends @a __n characters from @a __str
688       *  starting at @a __pos to this string.  If @a __n is is larger
689       *  than the number of available characters in @a __str, the
690       *  remainder of @a __str is appended.
691       */
692      __versa_string&
693      append(const __versa_string& __str, size_type __pos, size_type __n)
694      { return _M_append(__str._M_data()
695			 + __str._M_check(__pos, "__versa_string::append"),
696			 __str._M_limit(__pos, __n)); }
697
698      /**
699       *  @brief  Append a C substring.
700       *  @param __s  The C string to append.
701       *  @param __n  The number of characters to append.
702       *  @return  Reference to this string.
703       */
704      __versa_string&
705      append(const _CharT* __s, size_type __n)
706      {
707	__glibcxx_requires_string_len(__s, __n);
708	_M_check_length(size_type(0), __n, "__versa_string::append");
709	return _M_append(__s, __n);
710      }
711
712      /**
713       *  @brief  Append a C string.
714       *  @param __s  The C string to append.
715       *  @return  Reference to this string.
716       */
717      __versa_string&
718      append(const _CharT* __s)
719      {
720	__glibcxx_requires_string(__s);
721	const size_type __n = traits_type::length(__s);
722	_M_check_length(size_type(0), __n, "__versa_string::append");
723	return _M_append(__s, __n);
724      }
725
726      /**
727       *  @brief  Append multiple characters.
728       *  @param __n  The number of characters to append.
729       *  @param __c  The character to use.
730       *  @return  Reference to this string.
731       *
732       *  Appends n copies of c to this string.
733       */
734      __versa_string&
735      append(size_type __n, _CharT __c)
736      { return _M_replace_aux(this->size(), size_type(0), __n, __c); }
737
738#ifdef __GXX_EXPERIMENTAL_CXX0X__
739      /**
740       *  @brief  Append an initializer_list of characters.
741       *  @param __l  The initializer_list of characters to append.
742       *  @return  Reference to this string.
743       */
744      __versa_string&
745      append(std::initializer_list<_CharT> __l)
746      { return this->append(__l.begin(), __l.end()); }
747#endif // __GXX_EXPERIMENTAL_CXX0X__
748
749      /**
750       *  @brief  Append a range of characters.
751       *  @param __first  Iterator referencing the first character to append.
752       *  @param __last  Iterator marking the end of the range.
753       *  @return  Reference to this string.
754       *
755       *  Appends characters in the range [first,last) to this string.
756       */
757      template<class _InputIterator>
758        __versa_string&
759        append(_InputIterator __first, _InputIterator __last)
760        { return this->replace(_M_iend(), _M_iend(), __first, __last); }
761
762      /**
763       *  @brief  Append a single character.
764       *  @param __c  Character to append.
765       */
766      void
767      push_back(_CharT __c)
768      {
769	const size_type __size = this->size();
770	if (__size + 1 > this->capacity() || this->_M_is_shared())
771	  this->_M_mutate(__size, size_type(0), 0, size_type(1));
772	traits_type::assign(this->_M_data()[__size], __c);
773	this->_M_set_length(__size + 1);
774      }
775
776      /**
777       *  @brief  Set value to contents of another string.
778       *  @param  __str  Source string to use.
779       *  @return  Reference to this string.
780       */
781      __versa_string&
782      assign(const __versa_string& __str)
783      {
784	this->_M_assign(__str);
785	return *this;
786      }
787
788#ifdef __GXX_EXPERIMENTAL_CXX0X__
789      /**
790       *  @brief  Set value to contents of another string.
791       *  @param  __str  Source string to use.
792       *  @return  Reference to this string.
793       *
794       *  This function sets this string to the exact contents of @a __str.
795       *  @a __str is a valid, but unspecified string.
796       */
797      __versa_string&
798      assign(__versa_string&& __str)
799      {
800	this->swap(__str);
801	return *this;
802      }
803#endif // __GXX_EXPERIMENTAL_CXX0X__
804
805      /**
806       *  @brief  Set value to a substring of a string.
807       *  @param __str  The string to use.
808       *  @param __pos  Index of the first character of str.
809       *  @param __n  Number of characters to use.
810       *  @return  Reference to this string.
811       *  @throw  std::out_of_range if @a __pos is not a valid index.
812       *
813       *  This function sets this string to the substring of @a __str
814       *  consisting of @a __n characters at @a __pos.  If @a __n is
815       *  is larger than the number of available characters in @a
816       *  __str, the remainder of @a __str is used.
817       */
818      __versa_string&
819      assign(const __versa_string& __str, size_type __pos, size_type __n)
820      { return _M_replace(size_type(0), this->size(), __str._M_data()
821			  + __str._M_check(__pos, "__versa_string::assign"),
822			  __str._M_limit(__pos, __n)); }
823
824      /**
825       *  @brief  Set value to a C substring.
826       *  @param __s  The C string to use.
827       *  @param __n  Number of characters to use.
828       *  @return  Reference to this string.
829       *
830       *  This function sets the value of this string to the first @a
831       *  __n characters of @a __s.  If @a __n is is larger than the
832       *  number of available characters in @a __s, the remainder of
833       *  @a __s is used.
834       */
835      __versa_string&
836      assign(const _CharT* __s, size_type __n)
837      {
838	__glibcxx_requires_string_len(__s, __n);
839	return _M_replace(size_type(0), this->size(), __s, __n);
840      }
841
842      /**
843       *  @brief  Set value to contents of a C string.
844       *  @param __s  The C string to use.
845       *  @return  Reference to this string.
846       *
847       *  This function sets the value of this string to the value of
848       *  @a __s.  The data is copied, so there is no dependence on @a
849       *  __s once the function returns.
850       */
851      __versa_string&
852      assign(const _CharT* __s)
853      {
854	__glibcxx_requires_string(__s);
855	return _M_replace(size_type(0), this->size(), __s,
856			  traits_type::length(__s));
857      }
858
859      /**
860       *  @brief  Set value to multiple characters.
861       *  @param __n  Length of the resulting string.
862       *  @param __c  The character to use.
863       *  @return  Reference to this string.
864       *
865       *  This function sets the value of this string to @a __n copies of
866       *  character @a __c.
867       */
868      __versa_string&
869      assign(size_type __n, _CharT __c)
870      { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
871
872      /**
873       *  @brief  Set value to a range of characters.
874       *  @param __first  Iterator referencing the first character to append.
875       *  @param __last  Iterator marking the end of the range.
876       *  @return  Reference to this string.
877       *
878       *  Sets value of string to characters in the range
879       *  [first,last).
880      */
881      template<class _InputIterator>
882        __versa_string&
883        assign(_InputIterator __first, _InputIterator __last)
884        { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
885
886#ifdef __GXX_EXPERIMENTAL_CXX0X__
887      /**
888       *  @brief  Set value to an initializer_list of characters.
889       *  @param __l  The initializer_list of characters to assign.
890       *  @return  Reference to this string.
891       */
892      __versa_string&
893      assign(std::initializer_list<_CharT> __l)
894      { return this->assign(__l.begin(), __l.end()); }
895#endif // __GXX_EXPERIMENTAL_CXX0X__
896
897      /**
898       *  @brief  Insert multiple characters.
899       *  @param __p  Iterator referencing location in string to insert at.
900       *  @param __n  Number of characters to insert
901       *  @param __c  The character to insert.
902       *  @throw  std::length_error  If new length exceeds @c max_size().
903       *
904       *  Inserts @a __n copies of character @a __c starting at the
905       *  position referenced by iterator @a __p.  If adding
906       *  characters causes the length to exceed max_size(),
907       *  length_error is thrown.  The value of the string doesn't
908       *  change if an error is thrown.
909      */
910      void
911      insert(iterator __p, size_type __n, _CharT __c)
912      {	this->replace(__p, __p, __n, __c);  }
913
914      /**
915       *  @brief  Insert a range of characters.
916       *  @param __p  Iterator referencing location in string to insert at.
917       *  @param __beg  Start of range.
918       *  @param __end  End of range.
919       *  @throw  std::length_error  If new length exceeds @c max_size().
920       *
921       *  Inserts characters in range [beg,end).  If adding characters
922       *  causes the length to exceed max_size(), length_error is
923       *  thrown.  The value of the string doesn't change if an error
924       *  is thrown.
925      */
926      template<class _InputIterator>
927        void
928        insert(iterator __p, _InputIterator __beg, _InputIterator __end)
929        { this->replace(__p, __p, __beg, __end); }
930
931#ifdef __GXX_EXPERIMENTAL_CXX0X__
932      /**
933       *  @brief  Insert an initializer_list of characters.
934       *  @param __p  Iterator referencing location in string to insert at.
935       *  @param __l  The initializer_list of characters to insert.
936       *  @throw  std::length_error  If new length exceeds @c max_size().
937       */
938      void
939      insert(iterator __p, std::initializer_list<_CharT> __l)
940      { this->insert(__p, __l.begin(), __l.end()); }
941#endif // __GXX_EXPERIMENTAL_CXX0X__
942
943      /**
944       *  @brief  Insert value of a string.
945       *  @param __pos1  Iterator referencing location in string to insert at.
946       *  @param __str  The string to insert.
947       *  @return  Reference to this string.
948       *  @throw  std::length_error  If new length exceeds @c max_size().
949       *
950       *  Inserts value of @a __str starting at @a __pos1.  If adding
951       *  characters causes the length to exceed max_size(),
952       *  length_error is thrown.  The value of the string doesn't
953       *  change if an error is thrown.
954      */
955      __versa_string&
956      insert(size_type __pos1, const __versa_string& __str)
957      { return this->replace(__pos1, size_type(0),
958			     __str._M_data(), __str.size()); }
959
960      /**
961       *  @brief  Insert a substring.
962       *  @param __pos1  Iterator referencing location in string to insert at.
963       *  @param __str  The string to insert.
964       *  @param __pos2  Start of characters in str to insert.
965       *  @param __n  Number of characters to insert.
966       *  @return  Reference to this string.
967       *  @throw  std::length_error  If new length exceeds @c max_size().
968       *  @throw  std::out_of_range  If @a __pos1 > size() or
969       *  @a __pos2 > @a __str.size().
970       *
971       *  Starting at @a __pos1, insert @a __n character of @a __str
972       *  beginning with @a __pos2.  If adding characters causes the
973       *  length to exceed max_size(), length_error is thrown.  If @a
974       *  __pos1 is beyond the end of this string or @a __pos2 is
975       *  beyond the end of @a __str, out_of_range is thrown.  The
976       *  value of the string doesn't change if an error is thrown.
977      */
978      __versa_string&
979      insert(size_type __pos1, const __versa_string& __str,
980	     size_type __pos2, size_type __n)
981      { return this->replace(__pos1, size_type(0), __str._M_data()
982			     + __str._M_check(__pos2, "__versa_string::insert"),
983			     __str._M_limit(__pos2, __n)); }
984
985      /**
986       *  @brief  Insert a C substring.
987       *  @param __pos  Iterator referencing location in string to insert at.
988       *  @param __s  The C string to insert.
989       *  @param __n  The number of characters to insert.
990       *  @return  Reference to this string.
991       *  @throw  std::length_error  If new length exceeds @c max_size().
992       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
993       *  string.
994       *
995       *  Inserts the first @a __n characters of @a __s starting at @a
996       *  __pos.  If adding characters causes the length to exceed
997       *  max_size(), length_error is thrown.  If @a __pos is beyond
998       *  end(), out_of_range is thrown.  The value of the string
999       *  doesn't change if an error is thrown.
1000      */
1001      __versa_string&
1002      insert(size_type __pos, const _CharT* __s, size_type __n)
1003      { return this->replace(__pos, size_type(0), __s, __n); }
1004
1005      /**
1006       *  @brief  Insert a C string.
1007       *  @param __pos  Iterator referencing location in string to insert at.
1008       *  @param __s  The C string to insert.
1009       *  @return  Reference to this string.
1010       *  @throw  std::length_error  If new length exceeds @c max_size().
1011       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1012       *  string.
1013       *
1014       *  Inserts the first @a __n characters of @a __s starting at @a
1015       *  __pos.  If adding characters causes the length to exceed
1016       *  max_size(), length_error is thrown.  If @a __pos is beyond
1017       *  end(), out_of_range is thrown.  The value of the string
1018       *  doesn't change if an error is thrown.
1019      */
1020      __versa_string&
1021      insert(size_type __pos, const _CharT* __s)
1022      {
1023	__glibcxx_requires_string(__s);
1024	return this->replace(__pos, size_type(0), __s,
1025			     traits_type::length(__s));
1026      }
1027
1028      /**
1029       *  @brief  Insert multiple characters.
1030       *  @param __pos  Index in string to insert at.
1031       *  @param __n  Number of characters to insert
1032       *  @param __c  The character to insert.
1033       *  @return  Reference to this string.
1034       *  @throw  std::length_error  If new length exceeds @c max_size().
1035       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1036       *  string.
1037       *
1038       *  Inserts @a __n copies of character @a __c starting at index
1039       *  @a __pos.  If adding characters causes the length to exceed
1040       *  max_size(), length_error is thrown.  If @a __pos > length(),
1041       *  out_of_range is thrown.  The value of the string doesn't
1042       *  change if an error is thrown.
1043      */
1044      __versa_string&
1045      insert(size_type __pos, size_type __n, _CharT __c)
1046      { return _M_replace_aux(_M_check(__pos, "__versa_string::insert"),
1047			      size_type(0), __n, __c); }
1048
1049      /**
1050       *  @brief  Insert one character.
1051       *  @param __p  Iterator referencing position in string to insert at.
1052       *  @param __c  The character to insert.
1053       *  @return  Iterator referencing newly inserted char.
1054       *  @throw  std::length_error  If new length exceeds @c max_size().
1055       *
1056       *  Inserts character @a __c at position referenced by @a __p.
1057       *  If adding character causes the length to exceed max_size(),
1058       *  length_error is thrown.  If @a __p is beyond end of string,
1059       *  out_of_range is thrown.  The value of the string doesn't
1060       *  change if an error is thrown.
1061      */
1062      iterator
1063      insert(iterator __p, _CharT __c)
1064      {
1065	_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
1066	const size_type __pos = __p - _M_ibegin();
1067	_M_replace_aux(__pos, size_type(0), size_type(1), __c);
1068	this->_M_set_leaked();
1069	return iterator(this->_M_data() + __pos);
1070      }
1071
1072      /**
1073       *  @brief  Remove characters.
1074       *  @param __pos  Index of first character to remove (default 0).
1075       *  @param __n  Number of characters to remove (default remainder).
1076       *  @return  Reference to this string.
1077       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1078       *  string.
1079       *
1080       *  Removes @a __n characters from this string starting at @a
1081       *  __pos.  The length of the string is reduced by @a __n.  If
1082       *  there are < @a __n characters to remove, the remainder of
1083       *  the string is truncated.  If @a __p is beyond end of string,
1084       *  out_of_range is thrown.  The value of the string doesn't
1085       *  change if an error is thrown.
1086      */
1087      __versa_string&
1088      erase(size_type __pos = 0, size_type __n = npos)
1089      {
1090	this->_M_erase(_M_check(__pos, "__versa_string::erase"),
1091		       _M_limit(__pos, __n));
1092	return *this;
1093      }
1094
1095      /**
1096       *  @brief  Remove one character.
1097       *  @param __position  Iterator referencing the character to remove.
1098       *  @return  iterator referencing same location after removal.
1099       *
1100       *  Removes the character at @a __position from this string. The
1101       *  value of the string doesn't change if an error is thrown.
1102      */
1103      iterator
1104      erase(iterator __position)
1105      {
1106	_GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
1107				 && __position < _M_iend());
1108	const size_type __pos = __position - _M_ibegin();
1109	this->_M_erase(__pos, size_type(1));
1110	this->_M_set_leaked();
1111	return iterator(this->_M_data() + __pos);
1112      }
1113
1114      /**
1115       *  @brief  Remove a range of characters.
1116       *  @param __first  Iterator referencing the first character to remove.
1117       *  @param __last  Iterator referencing the end of the range.
1118       *  @return  Iterator referencing location of first after removal.
1119       *
1120       *  Removes the characters in the range [first,last) from this
1121       *  string.  The value of the string doesn't change if an error
1122       *  is thrown.
1123      */
1124      iterator
1125      erase(iterator __first, iterator __last)
1126      {
1127	_GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last
1128				 && __last <= _M_iend());
1129        const size_type __pos = __first - _M_ibegin();
1130	this->_M_erase(__pos, __last - __first);
1131	this->_M_set_leaked();
1132	return iterator(this->_M_data() + __pos);
1133      }
1134
1135      /**
1136       *  @brief  Replace characters with value from another string.
1137       *  @param __pos  Index of first character to replace.
1138       *  @param __n  Number of characters to be replaced.
1139       *  @param __str  String to insert.
1140       *  @return  Reference to this string.
1141       *  @throw  std::out_of_range  If @a __pos is beyond the end of this
1142       *  string.
1143       *  @throw  std::length_error  If new length exceeds @c max_size().
1144       *
1145       *  Removes the characters in the range [pos,pos+n) from this
1146       *  string.  In place, the value of @a __str is inserted.  If @a
1147       *  __pos is beyond end of string, out_of_range is thrown.  If
1148       *  the length of the result exceeds max_size(), length_error is
1149       *  thrown.  The value of the string doesn't change if an error
1150       *  is thrown.
1151      */
1152      __versa_string&
1153      replace(size_type __pos, size_type __n, const __versa_string& __str)
1154      { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
1155
1156      /**
1157       *  @brief  Replace characters with value from another string.
1158       *  @param __pos1  Index of first character to replace.
1159       *  @param __n1  Number of characters to be replaced.
1160       *  @param __str  String to insert.
1161       *  @param __pos2  Index of first character of str to use.
1162       *  @param __n2  Number of characters from str to use.
1163       *  @return  Reference to this string.
1164       *  @throw  std::out_of_range  If @a __pos1 > size() or @a __pos2 >
1165       *  str.size().
1166       *  @throw  std::length_error  If new length exceeds @c max_size().
1167       *
1168       *  Removes the characters in the range [pos1,pos1 + n) from
1169       *  this string.  In place, the value of @a __str is inserted.
1170       *  If @a __pos is beyond end of string, out_of_range is thrown.
1171       *  If the length of the result exceeds max_size(), length_error
1172       *  is thrown.  The value of the string doesn't change if an
1173       *  error is thrown.
1174      */
1175      __versa_string&
1176      replace(size_type __pos1, size_type __n1, const __versa_string& __str,
1177	      size_type __pos2, size_type __n2)
1178      {
1179	return this->replace(__pos1, __n1, __str._M_data()
1180			     + __str._M_check(__pos2,
1181					      "__versa_string::replace"),
1182			     __str._M_limit(__pos2, __n2));
1183      }
1184
1185      /**
1186       *  @brief  Replace characters with value of a C substring.
1187       *  @param __pos  Index of first character to replace.
1188       *  @param __n1  Number of characters to be replaced.
1189       *  @param __s  C string to insert.
1190       *  @param __n2  Number of characters from @a __s to use.
1191       *  @return  Reference to this string.
1192       *  @throw  std::out_of_range  If @a __pos1 > size().
1193       *  @throw  std::length_error  If new length exceeds @c max_size().
1194       *
1195       *  Removes the characters in the range [pos,pos + n1) from this
1196       *  string.  In place, the first @a __n2 characters of @a __s
1197       *  are inserted, or all of @a __s if @a __n2 is too large.  If
1198       *  @a __pos is beyond end of string, out_of_range is thrown.
1199       *  If the length of result exceeds max_size(), length_error is
1200       *  thrown.  The value of the string doesn't change if an error
1201       *  is thrown.
1202      */
1203      __versa_string&
1204      replace(size_type __pos, size_type __n1, const _CharT* __s,
1205	      size_type __n2)
1206      {
1207	__glibcxx_requires_string_len(__s, __n2);
1208	return _M_replace(_M_check(__pos, "__versa_string::replace"),
1209			  _M_limit(__pos, __n1), __s, __n2);
1210      }
1211
1212      /**
1213       *  @brief  Replace characters with value of a C string.
1214       *  @param __pos  Index of first character to replace.
1215       *  @param __n1  Number of characters to be replaced.
1216       *  @param __s  C string to insert.
1217       *  @return  Reference to this string.
1218       *  @throw  std::out_of_range  If @a __pos > size().
1219       *  @throw  std::length_error  If new length exceeds @c max_size().
1220       *
1221       *  Removes the characters in the range [pos,pos + n1) from this
1222       *  string.  In place, the characters of @a __s are inserted.  If
1223       *  @a pos is beyond end of string, out_of_range is thrown.  If
1224       *  the length of result exceeds max_size(), length_error is thrown.
1225       *  The value of the string doesn't change if an error is thrown.
1226      */
1227      __versa_string&
1228      replace(size_type __pos, size_type __n1, const _CharT* __s)
1229      {
1230	__glibcxx_requires_string(__s);
1231	return this->replace(__pos, __n1, __s, traits_type::length(__s));
1232      }
1233
1234      /**
1235       *  @brief  Replace characters with multiple characters.
1236       *  @param __pos  Index of first character to replace.
1237       *  @param __n1  Number of characters to be replaced.
1238       *  @param __n2  Number of characters to insert.
1239       *  @param __c  Character to insert.
1240       *  @return  Reference to this string.
1241       *  @throw  std::out_of_range  If @a __pos > size().
1242       *  @throw  std::length_error  If new length exceeds @c max_size().
1243       *
1244       *  Removes the characters in the range [pos,pos + n1) from this
1245       *  string.  In place, @a __n2 copies of @a __c are inserted.
1246       *  If @a __pos is beyond end of string, out_of_range is thrown.
1247       *  If the length of result exceeds max_size(), length_error is
1248       *  thrown.  The value of the string doesn't change if an error
1249       *  is thrown.
1250      */
1251      __versa_string&
1252      replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
1253      { return _M_replace_aux(_M_check(__pos, "__versa_string::replace"),
1254			      _M_limit(__pos, __n1), __n2, __c); }
1255
1256      /**
1257       *  @brief  Replace range of characters with string.
1258       *  @param __i1  Iterator referencing start of range to replace.
1259       *  @param __i2  Iterator referencing end of range to replace.
1260       *  @param __str  String value to insert.
1261       *  @return  Reference to this string.
1262       *  @throw  std::length_error  If new length exceeds @c max_size().
1263       *
1264       *  Removes the characters in the range [i1,i2).  In place, the
1265       *  value of @a __str is inserted.  If the length of result
1266       *  exceeds max_size(), length_error is thrown.  The value of
1267       *  the string doesn't change if an error is thrown.
1268      */
1269      __versa_string&
1270      replace(iterator __i1, iterator __i2, const __versa_string& __str)
1271      { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
1272
1273      /**
1274       *  @brief  Replace range of characters with C substring.
1275       *  @param __i1  Iterator referencing start of range to replace.
1276       *  @param __i2  Iterator referencing end of range to replace.
1277       *  @param __s  C string value to insert.
1278       *  @param __n  Number of characters from s to insert.
1279       *  @return  Reference to this string.
1280       *  @throw  std::length_error  If new length exceeds @c max_size().
1281       *
1282       *  Removes the characters in the range [i1,i2).  In place, the
1283       *  first @a n characters of @a __s are inserted.  If the length
1284       *  of result exceeds max_size(), length_error is thrown.  The
1285       *  value of the string doesn't change if an error is thrown.
1286      */
1287      __versa_string&
1288      replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
1289      {
1290	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1291				 && __i2 <= _M_iend());
1292	return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
1293      }
1294
1295      /**
1296       *  @brief  Replace range of characters with C string.
1297       *  @param __i1  Iterator referencing start of range to replace.
1298       *  @param __i2  Iterator referencing end of range to replace.
1299       *  @param __s  C string value to insert.
1300       *  @return  Reference to this string.
1301       *  @throw  std::length_error  If new length exceeds @c max_size().
1302       *
1303       *  Removes the characters in the range [i1,i2).  In place, the
1304       *  characters of @a __s are inserted.  If the length of result
1305       *  exceeds max_size(), length_error is thrown.  The value of
1306       *  the string doesn't change if an error is thrown.
1307      */
1308      __versa_string&
1309      replace(iterator __i1, iterator __i2, const _CharT* __s)
1310      {
1311	__glibcxx_requires_string(__s);
1312	return this->replace(__i1, __i2, __s, traits_type::length(__s));
1313      }
1314
1315      /**
1316       *  @brief  Replace range of characters with multiple characters
1317       *  @param __i1  Iterator referencing start of range to replace.
1318       *  @param __i2  Iterator referencing end of range to replace.
1319       *  @param __n  Number of characters to insert.
1320       *  @param __c  Character to insert.
1321       *  @return  Reference to this string.
1322       *  @throw  std::length_error  If new length exceeds @c max_size().
1323       *
1324       *  Removes the characters in the range [i1,i2).  In place, @a
1325       *  __n copies of @a __c are inserted.  If the length of result
1326       *  exceeds max_size(), length_error is thrown.  The value of
1327       *  the string doesn't change if an error is thrown.
1328      */
1329      __versa_string&
1330      replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
1331      {
1332	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1333				 && __i2 <= _M_iend());
1334	return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
1335      }
1336
1337      /**
1338       *  @brief  Replace range of characters with range.
1339       *  @param __i1  Iterator referencing start of range to replace.
1340       *  @param __i2  Iterator referencing end of range to replace.
1341       *  @param __k1  Iterator referencing start of range to insert.
1342       *  @param __k2  Iterator referencing end of range to insert.
1343       *  @return  Reference to this string.
1344       *  @throw  std::length_error  If new length exceeds @c max_size().
1345       *
1346       *  Removes the characters in the range [i1,i2).  In place,
1347       *  characters in the range [k1,k2) are inserted.  If the length
1348       *  of result exceeds max_size(), length_error is thrown.  The
1349       *  value of the string doesn't change if an error is thrown.
1350      */
1351      template<class _InputIterator>
1352        __versa_string&
1353        replace(iterator __i1, iterator __i2,
1354		_InputIterator __k1, _InputIterator __k2)
1355        {
1356	  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1357				   && __i2 <= _M_iend());
1358	  __glibcxx_requires_valid_range(__k1, __k2);
1359	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1360	  return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
1361	}
1362
1363      // Specializations for the common case of pointer and iterator:
1364      // useful to avoid the overhead of temporary buffering in _M_replace.
1365      __versa_string&
1366      replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
1367      {
1368	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1369				 && __i2 <= _M_iend());
1370	__glibcxx_requires_valid_range(__k1, __k2);
1371	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1372			     __k1, __k2 - __k1);
1373      }
1374
1375      __versa_string&
1376      replace(iterator __i1, iterator __i2,
1377	      const _CharT* __k1, const _CharT* __k2)
1378      {
1379	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1380				 && __i2 <= _M_iend());
1381	__glibcxx_requires_valid_range(__k1, __k2);
1382	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1383			     __k1, __k2 - __k1);
1384      }
1385
1386      __versa_string&
1387      replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
1388      {
1389	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1390				 && __i2 <= _M_iend());
1391	__glibcxx_requires_valid_range(__k1, __k2);
1392	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1393			     __k1.base(), __k2 - __k1);
1394      }
1395
1396      __versa_string&
1397      replace(iterator __i1, iterator __i2,
1398	      const_iterator __k1, const_iterator __k2)
1399      {
1400	_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1401				 && __i2 <= _M_iend());
1402	__glibcxx_requires_valid_range(__k1, __k2);
1403	return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1404			     __k1.base(), __k2 - __k1);
1405      }
1406
1407#ifdef __GXX_EXPERIMENTAL_CXX0X__
1408      /**
1409       *  @brief  Replace range of characters with initializer_list.
1410       *  @param __i1  Iterator referencing start of range to replace.
1411       *  @param __i2  Iterator referencing end of range to replace.
1412       *  @param __l  The initializer_list of characters to insert.
1413       *  @return  Reference to this string.
1414       *  @throw  std::length_error  If new length exceeds @c max_size().
1415       *
1416       *  Removes the characters in the range [i1,i2).  In place,
1417       *  characters in the range [k1,k2) are inserted.  If the length
1418       *  of result exceeds max_size(), length_error is thrown.  The
1419       *  value of the string doesn't change if an error is thrown.
1420      */
1421      __versa_string& replace(iterator __i1, iterator __i2,
1422			      std::initializer_list<_CharT> __l)
1423      { return this->replace(__i1, __i2, __l.begin(), __l.end()); }
1424#endif // __GXX_EXPERIMENTAL_CXX0X__
1425
1426    private:
1427      template<class _Integer>
1428	__versa_string&
1429	_M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
1430			    _Integer __val, std::__true_type)
1431        { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
1432
1433      template<class _InputIterator>
1434	__versa_string&
1435	_M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
1436			    _InputIterator __k2, std::__false_type);
1437
1438      __versa_string&
1439      _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
1440		     _CharT __c);
1441
1442      __versa_string&
1443      _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
1444		 const size_type __len2);
1445
1446      __versa_string&
1447      _M_append(const _CharT* __s, size_type __n);
1448
1449    public:
1450
1451      /**
1452       *  @brief  Copy substring into C string.
1453       *  @param __s  C string to copy value into.
1454       *  @param __n  Number of characters to copy.
1455       *  @param __pos  Index of first character to copy.
1456       *  @return  Number of characters actually copied
1457       *  @throw  std::out_of_range  If pos > size().
1458       *
1459       *  Copies up to @a __n characters starting at @a __pos into the
1460       *  C string @a s.  If @a __pos is greater than size(),
1461       *  out_of_range is thrown.
1462      */
1463      size_type
1464      copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
1465
1466      /**
1467       *  @brief  Swap contents with another string.
1468       *  @param __s  String to swap with.
1469       *
1470       *  Exchanges the contents of this string with that of @a __s in
1471       *  constant time.
1472      */
1473      void
1474      swap(__versa_string& __s)
1475      { this->_M_swap(__s); }
1476
1477      // String operations:
1478      /**
1479       *  @brief  Return const pointer to null-terminated contents.
1480       *
1481       *  This is a handle to internal data.  Do not modify or dire things may
1482       *  happen.
1483      */
1484      const _CharT*
1485      c_str() const
1486      { return this->_M_data(); }
1487
1488      /**
1489       *  @brief  Return const pointer to contents.
1490       *
1491       *  This is a handle to internal data.  Do not modify or dire things may
1492       *  happen.
1493      */
1494      const _CharT*
1495      data() const
1496      { return this->_M_data(); }
1497
1498      /**
1499       *  @brief  Return copy of allocator used to construct this string.
1500      */
1501      allocator_type
1502      get_allocator() const
1503      { return allocator_type(this->_M_get_allocator()); }
1504
1505      /**
1506       *  @brief  Find position of a C substring.
1507       *  @param __s  C string to locate.
1508       *  @param __pos  Index of character to search from.
1509       *  @param __n  Number of characters from @a __s to search for.
1510       *  @return  Index of start of first occurrence.
1511       *
1512       *  Starting from @a __pos, searches forward for the first @a
1513       *  __n characters in @a __s within this string.  If found,
1514       *  returns the index where it begins.  If not found, returns
1515       *  npos.
1516      */
1517      size_type
1518      find(const _CharT* __s, size_type __pos, size_type __n) const;
1519
1520      /**
1521       *  @brief  Find position of a string.
1522       *  @param __str  String to locate.
1523       *  @param __pos  Index of character to search from (default 0).
1524       *  @return  Index of start of first occurrence.
1525       *
1526       *  Starting from @a __pos, searches forward for value of @a
1527       *  __str within this string.  If found, returns the index where
1528       *  it begins.  If not found, returns npos.
1529      */
1530      size_type
1531      find(const __versa_string& __str, size_type __pos = 0) const
1532      { return this->find(__str.data(), __pos, __str.size()); }
1533
1534      /**
1535       *  @brief  Find position of a C string.
1536       *  @param __s  C string to locate.
1537       *  @param __pos  Index of character to search from (default 0).
1538       *  @return  Index of start of first occurrence.
1539       *
1540       *  Starting from @a __pos, searches forward for the value of @a
1541       *  __s within this string.  If found, returns the index where
1542       *  it begins.  If not found, returns npos.
1543      */
1544      size_type
1545      find(const _CharT* __s, size_type __pos = 0) const
1546      {
1547	__glibcxx_requires_string(__s);
1548	return this->find(__s, __pos, traits_type::length(__s));
1549      }
1550
1551      /**
1552       *  @brief  Find position of a character.
1553       *  @param __c  Character to locate.
1554       *  @param __pos  Index of character to search from (default 0).
1555       *  @return  Index of first occurrence.
1556       *
1557       *  Starting from @a __pos, searches forward for @a __c within
1558       *  this string.  If found, returns the index where it was
1559       *  found.  If not found, returns npos.
1560      */
1561      size_type
1562      find(_CharT __c, size_type __pos = 0) const;
1563
1564      /**
1565       *  @brief  Find last position of a string.
1566       *  @param __str  String to locate.
1567       *  @param __pos  Index of character to search back from (default end).
1568       *  @return  Index of start of last occurrence.
1569       *
1570       *  Starting from @a __pos, searches backward for value of @a
1571       *  __str within this string.  If found, returns the index where
1572       *  it begins.  If not found, returns npos.
1573      */
1574      size_type
1575      rfind(const __versa_string& __str, size_type __pos = npos) const
1576      { return this->rfind(__str.data(), __pos, __str.size()); }
1577
1578      /**
1579       *  @brief  Find last position of a C substring.
1580       *  @param __s  C string to locate.
1581       *  @param __pos  Index of character to search back from.
1582       *  @param __n  Number of characters from s to search for.
1583       *  @return  Index of start of last occurrence.
1584       *
1585       *  Starting from @a __pos, searches backward for the first @a
1586       *  __n characters in @a __s within this string.  If found,
1587       *  returns the index where it begins.  If not found, returns
1588       *  npos.
1589      */
1590      size_type
1591      rfind(const _CharT* __s, size_type __pos, size_type __n) const;
1592
1593      /**
1594       *  @brief  Find last position of a C string.
1595       *  @param __s  C string to locate.
1596       *  @param __pos  Index of character to start search at (default end).
1597       *  @return  Index of start of  last occurrence.
1598       *
1599       *  Starting from @a __pos, searches backward for the value of
1600       *  @a __s within this string.  If found, returns the index
1601       *  where it begins.  If not found, returns npos.
1602      */
1603      size_type
1604      rfind(const _CharT* __s, size_type __pos = npos) const
1605      {
1606	__glibcxx_requires_string(__s);
1607	return this->rfind(__s, __pos, traits_type::length(__s));
1608      }
1609
1610      /**
1611       *  @brief  Find last position of a character.
1612       *  @param __c  Character to locate.
1613       *  @param __pos  Index of character to search back from (default end).
1614       *  @return  Index of last occurrence.
1615       *
1616       *  Starting from @a __pos, searches backward for @a __c within
1617       *  this string.  If found, returns the index where it was
1618       *  found.  If not found, returns npos.
1619      */
1620      size_type
1621      rfind(_CharT __c, size_type __pos = npos) const;
1622
1623      /**
1624       *  @brief  Find position of a character of string.
1625       *  @param __str  String containing characters to locate.
1626       *  @param __pos  Index of character to search from (default 0).
1627       *  @return  Index of first occurrence.
1628       *
1629       *  Starting from @a __pos, searches forward for one of the characters of
1630       *  @a __str within this string.  If found, returns the index where it was
1631       *  found.  If not found, returns npos.
1632      */
1633      size_type
1634      find_first_of(const __versa_string& __str, size_type __pos = 0) const
1635      { return this->find_first_of(__str.data(), __pos, __str.size()); }
1636
1637      /**
1638       *  @brief  Find position of a character of C substring.
1639       *  @param __s  String containing characters to locate.
1640       *  @param __pos  Index of character to search from.
1641       *  @param __n  Number of characters from s to search for.
1642       *  @return  Index of first occurrence.
1643       *
1644       *  Starting from @a __pos, searches forward for one of the
1645       *  first @a __n characters of @a __s within this string.  If
1646       *  found, returns the index where it was found.  If not found,
1647       *  returns npos.
1648      */
1649      size_type
1650      find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
1651
1652      /**
1653       *  @brief  Find position of a character of C string.
1654       *  @param __s  String containing characters to locate.
1655       *  @param __pos  Index of character to search from (default 0).
1656       *  @return  Index of first occurrence.
1657       *
1658       *  Starting from @a __pos, searches forward for one of the
1659       *  characters of @a __s within this string.  If found, returns
1660       *  the index where it was found.  If not found, returns npos.
1661      */
1662      size_type
1663      find_first_of(const _CharT* __s, size_type __pos = 0) const
1664      {
1665	__glibcxx_requires_string(__s);
1666	return this->find_first_of(__s, __pos, traits_type::length(__s));
1667      }
1668
1669      /**
1670       *  @brief  Find position of a character.
1671       *  @param __c  Character to locate.
1672       *  @param __pos  Index of character to search from (default 0).
1673       *  @return  Index of first occurrence.
1674       *
1675       *  Starting from @a __pos, searches forward for the character
1676       *  @a __c within this string.  If found, returns the index
1677       *  where it was found.  If not found, returns npos.
1678       *
1679       *  Note: equivalent to find(c, pos).
1680      */
1681      size_type
1682      find_first_of(_CharT __c, size_type __pos = 0) const
1683      { return this->find(__c, __pos); }
1684
1685      /**
1686       *  @brief  Find last position of a character of string.
1687       *  @param __str  String containing characters to locate.
1688       *  @param __pos  Index of character to search back from (default end).
1689       *  @return  Index of last occurrence.
1690       *
1691       *  Starting from @a __pos, searches backward for one of the
1692       *  characters of @a __str within this string.  If found,
1693       *  returns the index where it was found.  If not found, returns
1694       *  npos.
1695      */
1696      size_type
1697      find_last_of(const __versa_string& __str, size_type __pos = npos) const
1698      { return this->find_last_of(__str.data(), __pos, __str.size()); }
1699
1700      /**
1701       *  @brief  Find last position of a character of C substring.
1702       *  @param __s  C string containing characters to locate.
1703       *  @param __pos  Index of character to search back from.
1704       *  @param __n  Number of characters from s to search for.
1705       *  @return  Index of last occurrence.
1706       *
1707       *  Starting from @a __pos, searches backward for one of the
1708       *  first @a __n characters of @a __s within this string.  If
1709       *  found, returns the index where it was found.  If not found,
1710       *  returns npos.
1711      */
1712      size_type
1713      find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
1714
1715      /**
1716       *  @brief  Find last position of a character of C string.
1717       *  @param __s  C string containing characters to locate.
1718       *  @param __pos  Index of character to search back from (default end).
1719       *  @return  Index of last occurrence.
1720       *
1721       *  Starting from @a __pos, searches backward for one of the
1722       *  characters of @a __s within this string.  If found, returns
1723       *  the index where it was found.  If not found, returns npos.
1724      */
1725      size_type
1726      find_last_of(const _CharT* __s, size_type __pos = npos) const
1727      {
1728	__glibcxx_requires_string(__s);
1729	return this->find_last_of(__s, __pos, traits_type::length(__s));
1730      }
1731
1732      /**
1733       *  @brief  Find last position of a character.
1734       *  @param __c  Character to locate.
1735       *  @param __pos  Index of character to search back from (default end).
1736       *  @return  Index of last occurrence.
1737       *
1738       *  Starting from @a __pos, searches backward for @a __c within
1739       *  this string.  If found, returns the index where it was
1740       *  found.  If not found, returns npos.
1741       *
1742       *  Note: equivalent to rfind(c, pos).
1743      */
1744      size_type
1745      find_last_of(_CharT __c, size_type __pos = npos) const
1746      { return this->rfind(__c, __pos); }
1747
1748      /**
1749       *  @brief  Find position of a character not in string.
1750       *  @param __str  String containing characters to avoid.
1751       *  @param __pos  Index of character to search from (default 0).
1752       *  @return  Index of first occurrence.
1753       *
1754       *  Starting from @a __pos, searches forward for a character not
1755       *  contained in @a __str within this string.  If found, returns
1756       *  the index where it was found.  If not found, returns npos.
1757      */
1758      size_type
1759      find_first_not_of(const __versa_string& __str, size_type __pos = 0) const
1760      { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
1761
1762      /**
1763       *  @brief  Find position of a character not in C substring.
1764       *  @param __s  C string containing characters to avoid.
1765       *  @param __pos  Index of character to search from.
1766       *  @param __n  Number of characters from s to consider.
1767       *  @return  Index of first occurrence.
1768       *
1769       *  Starting from @a __pos, searches forward for a character not
1770       *  contained in the first @a __n characters of @a __s within
1771       *  this string.  If found, returns the index where it was
1772       *  found.  If not found, returns npos.
1773      */
1774      size_type
1775      find_first_not_of(const _CharT* __s, size_type __pos,
1776			size_type __n) const;
1777
1778      /**
1779       *  @brief  Find position of a character not in C string.
1780       *  @param __s  C string containing characters to avoid.
1781       *  @param __pos  Index of character to search from (default 0).
1782       *  @return  Index of first occurrence.
1783       *
1784       *  Starting from @a __pos, searches forward for a character not
1785       *  contained in @a __s within this string.  If found, returns
1786       *  the index where it was found.  If not found, returns npos.
1787      */
1788      size_type
1789      find_first_not_of(const _CharT* __s, size_type __pos = 0) const
1790      {
1791	__glibcxx_requires_string(__s);
1792	return this->find_first_not_of(__s, __pos, traits_type::length(__s));
1793      }
1794
1795      /**
1796       *  @brief  Find position of a different character.
1797       *  @param __c  Character to avoid.
1798       *  @param __pos  Index of character to search from (default 0).
1799       *  @return  Index of first occurrence.
1800       *
1801       *  Starting from @a __pos, searches forward for a character
1802       *  other than @a __c within this string.  If found, returns the
1803       *  index where it was found.  If not found, returns npos.
1804      */
1805      size_type
1806      find_first_not_of(_CharT __c, size_type __pos = 0) const;
1807
1808      /**
1809       *  @brief  Find last position of a character not in string.
1810       *  @param __str  String containing characters to avoid.
1811       *  @param __pos  Index of character to search back from (default end).
1812       *  @return  Index of last occurrence.
1813       *
1814       *  Starting from @a __pos, searches backward for a character
1815       *  not contained in @a __str within this string.  If found,
1816       *  returns the index where it was found.  If not found, returns
1817       *  npos.
1818      */
1819      size_type
1820      find_last_not_of(const __versa_string& __str,
1821		       size_type __pos = npos) const
1822      { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
1823
1824      /**
1825       *  @brief  Find last position of a character not in C substring.
1826       *  @param __s  C string containing characters to avoid.
1827       *  @param __pos  Index of character to search back from.
1828       *  @param __n  Number of characters from s to consider.
1829       *  @return  Index of last occurrence.
1830       *
1831       *  Starting from @a __pos, searches backward for a character
1832       *  not contained in the first @a __n characters of @a __s
1833       *  within this string.  If found, returns the index where it
1834       *  was found.  If not found, returns npos.
1835      */
1836      size_type
1837      find_last_not_of(const _CharT* __s, size_type __pos,
1838		       size_type __n) const;
1839      /**
1840       *  @brief  Find last position of a character not in C string.
1841       *  @param __s  C string containing characters to avoid.
1842       *  @param __pos  Index of character to search back from (default end).
1843       *  @return  Index of last occurrence.
1844       *
1845       *  Starting from @a __pos, searches backward for a character
1846       *  not contained in @a __s within this string.  If found,
1847       *  returns the index where it was found.  If not found, returns
1848       *  npos.
1849      */
1850      size_type
1851      find_last_not_of(const _CharT* __s, size_type __pos = npos) const
1852      {
1853	__glibcxx_requires_string(__s);
1854	return this->find_last_not_of(__s, __pos, traits_type::length(__s));
1855      }
1856
1857      /**
1858       *  @brief  Find last position of a different character.
1859       *  @param __c  Character to avoid.
1860       *  @param __pos  Index of character to search back from (default end).
1861       *  @return  Index of last occurrence.
1862       *
1863       *  Starting from @a __pos, searches backward for a character
1864       *  other than @a __c within this string.  If found, returns the
1865       *  index where it was found.  If not found, returns npos.
1866      */
1867      size_type
1868      find_last_not_of(_CharT __c, size_type __pos = npos) const;
1869
1870      /**
1871       *  @brief  Get a substring.
1872       *  @param __pos  Index of first character (default 0).
1873       *  @param __n  Number of characters in substring (default remainder).
1874       *  @return  The new string.
1875       *  @throw  std::out_of_range  If pos > size().
1876       *
1877       *  Construct and return a new string using the @a __n
1878       *  characters starting at @a __pos.  If the string is too
1879       *  short, use the remainder of the characters.  If @a __pos is
1880       *  beyond the end of the string, out_of_range is thrown.
1881      */
1882      __versa_string
1883      substr(size_type __pos = 0, size_type __n = npos) const
1884      {
1885	return __versa_string(*this, _M_check(__pos, "__versa_string::substr"),
1886			      __n);
1887      }
1888
1889      /**
1890       *  @brief  Compare to a string.
1891       *  @param __str  String to compare against.
1892       *  @return  Integer < 0, 0, or > 0.
1893       *
1894       *  Returns an integer < 0 if this string is ordered before @a
1895       *  __str, 0 if their values are equivalent, or > 0 if this
1896       *  string is ordered after @a __str.  Determines the effective
1897       *  length rlen of the strings to compare as the smallest of
1898       *  size() and str.size().  The function then compares the two
1899       *  strings by calling traits::compare(data(), str.data(),rlen).
1900       *  If the result of the comparison is nonzero returns it,
1901       *  otherwise the shorter one is ordered first.
1902      */
1903      int
1904      compare(const __versa_string& __str) const
1905      {
1906	if (this->_M_compare(__str))
1907	  return 0;
1908
1909	const size_type __size = this->size();
1910	const size_type __osize = __str.size();
1911	const size_type __len = std::min(__size, __osize);
1912
1913	int __r = traits_type::compare(this->_M_data(), __str.data(), __len);
1914	if (!__r)
1915	  __r = _S_compare(__size, __osize);
1916	return __r;
1917      }
1918
1919      /**
1920       *  @brief  Compare substring to a string.
1921       *  @param __pos  Index of first character of substring.
1922       *  @param __n  Number of characters in substring.
1923       *  @param __str  String to compare against.
1924       *  @return  Integer < 0, 0, or > 0.
1925       *
1926       *  Form the substring of this string from the @a __n characters
1927       *  starting at @a __pos.  Returns an integer < 0 if the
1928       *  substring is ordered before @a __str, 0 if their values are
1929       *  equivalent, or > 0 if the substring is ordered after @a
1930       *  __str.  Determines the effective length rlen of the strings
1931       *  to compare as the smallest of the length of the substring
1932       *  and @a __str.size().  The function then compares the two
1933       *  strings by calling
1934       *  traits::compare(substring.data(),str.data(),rlen).  If the
1935       *  result of the comparison is nonzero returns it, otherwise
1936       *  the shorter one is ordered first.
1937      */
1938      int
1939      compare(size_type __pos, size_type __n,
1940	      const __versa_string& __str) const;
1941
1942      /**
1943       *  @brief  Compare substring to a substring.
1944       *  @param __pos1  Index of first character of substring.
1945       *  @param __n1  Number of characters in substring.
1946       *  @param __str  String to compare against.
1947       *  @param __pos2  Index of first character of substring of str.
1948       *  @param __n2  Number of characters in substring of str.
1949       *  @return  Integer < 0, 0, or > 0.
1950       *
1951       *  Form the substring of this string from the @a __n1
1952       *  characters starting at @a __pos1.  Form the substring of @a
1953       *  __str from the @a __n2 characters starting at @a __pos2.
1954       *  Returns an integer < 0 if this substring is ordered before
1955       *  the substring of @a __str, 0 if their values are equivalent,
1956       *  or > 0 if this substring is ordered after the substring of
1957       *  @a __str.  Determines the effective length rlen of the
1958       *  strings to compare as the smallest of the lengths of the
1959       *  substrings.  The function then compares the two strings by
1960       *  calling
1961       *  traits::compare(substring.data(),str.substr(pos2,n2).data(),rlen).
1962       *  If the result of the comparison is nonzero returns it,
1963       *  otherwise the shorter one is ordered first.
1964      */
1965      int
1966      compare(size_type __pos1, size_type __n1, const __versa_string& __str,
1967	      size_type __pos2, size_type __n2) const;
1968
1969      /**
1970       *  @brief  Compare to a C string.
1971       *  @param __s  C string to compare against.
1972       *  @return  Integer < 0, 0, or > 0.
1973       *
1974       *  Returns an integer < 0 if this string is ordered before @a
1975       *  __s, 0 if their values are equivalent, or > 0 if this string
1976       *  is ordered after @a __s.  Determines the effective length
1977       *  rlen of the strings to compare as the smallest of size() and
1978       *  the length of a string constructed from @a __s.  The
1979       *  function then compares the two strings by calling
1980       *  traits::compare(data(),s,rlen).  If the result of the
1981       *  comparison is nonzero returns it, otherwise the shorter one
1982       *  is ordered first.
1983      */
1984      int
1985      compare(const _CharT* __s) const;
1986
1987      // _GLIBCXX_RESOLVE_LIB_DEFECTS
1988      // 5 String::compare specification questionable
1989      /**
1990       *  @brief  Compare substring to a C string.
1991       *  @param __pos  Index of first character of substring.
1992       *  @param __n1  Number of characters in substring.
1993       *  @param __s  C string to compare against.
1994       *  @return  Integer < 0, 0, or > 0.
1995       *
1996       *  Form the substring of this string from the @a __n1
1997       *  characters starting at @a __pos.  Returns an integer < 0 if
1998       *  the substring is ordered before @a __s, 0 if their values
1999       *  are equivalent, or > 0 if the substring is ordered after @a
2000       *  __s.  Determines the effective length rlen of the strings to
2001       *  compare as the smallest of the length of the substring and
2002       *  the length of a string constructed from @a __s.  The
2003       *  function then compares the two string by calling
2004       *  traits::compare(substring.data(),s,rlen).  If the result of
2005       *  the comparison is nonzero returns it, otherwise the shorter
2006       *  one is ordered first.
2007      */
2008      int
2009      compare(size_type __pos, size_type __n1, const _CharT* __s) const;
2010
2011      /**
2012       *  @brief  Compare substring against a character array.
2013       *  @param __pos1  Index of first character of substring.
2014       *  @param __n1  Number of characters in substring.
2015       *  @param __s  character array to compare against.
2016       *  @param __n2  Number of characters of s.
2017       *  @return  Integer < 0, 0, or > 0.
2018       *
2019       *  Form the substring of this string from the @a __n1
2020       *  characters starting at @a __pos1.  Form a string from the
2021       *  first @a __n2 characters of @a __s.  Returns an integer < 0
2022       *  if this substring is ordered before the string from @a __s,
2023       *  0 if their values are equivalent, or > 0 if this substring
2024       *  is ordered after the string from @a __s.  Determines the
2025       *  effective length rlen of the strings to compare as the
2026       *  smallest of the length of the substring and @a __n2.  The
2027       *  function then compares the two strings by calling
2028       *  traits::compare(substring.data(),s,rlen).  If the result of
2029       *  the comparison is nonzero returns it, otherwise the shorter
2030       *  one is ordered first.
2031       *
2032       *  NB: s must have at least n2 characters, <em>\\0</em> has no special
2033       *  meaning.
2034      */
2035      int
2036      compare(size_type __pos, size_type __n1, const _CharT* __s,
2037	      size_type __n2) const;
2038    };
2039
2040  // operator+
2041  /**
2042   *  @brief  Concatenate two strings.
2043   *  @param __lhs  First string.
2044   *  @param __rhs  Last string.
2045   *  @return  New string with value of @a __lhs followed by @a __rhs.
2046   */
2047  template<typename _CharT, typename _Traits, typename _Alloc,
2048	   template <typename, typename, typename> class _Base>
2049    __versa_string<_CharT, _Traits, _Alloc, _Base>
2050    operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2051	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
2052
2053  /**
2054   *  @brief  Concatenate C string and string.
2055   *  @param __lhs  First string.
2056   *  @param __rhs  Last string.
2057   *  @return  New string with value of @a __lhs followed by @a __rhs.
2058   */
2059  template<typename _CharT, typename _Traits, typename _Alloc,
2060	   template <typename, typename, typename> class _Base>
2061    __versa_string<_CharT, _Traits, _Alloc, _Base>
2062    operator+(const _CharT* __lhs,
2063	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
2064
2065  /**
2066   *  @brief  Concatenate character and string.
2067   *  @param __lhs  First string.
2068   *  @param __rhs  Last string.
2069   *  @return  New string with @a __lhs followed by @a __rhs.
2070   */
2071  template<typename _CharT, typename _Traits, typename _Alloc,
2072	   template <typename, typename, typename> class _Base>
2073    __versa_string<_CharT, _Traits, _Alloc, _Base>
2074    operator+(_CharT __lhs,
2075	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs);
2076
2077  /**
2078   *  @brief  Concatenate string and C string.
2079   *  @param __lhs  First string.
2080   *  @param __rhs  Last string.
2081   *  @return  New string with @a __lhs followed by @a __rhs.
2082   */
2083  template<typename _CharT, typename _Traits, typename _Alloc,
2084	   template <typename, typename, typename> class _Base>
2085    __versa_string<_CharT, _Traits, _Alloc, _Base>
2086    operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2087	      const _CharT* __rhs);
2088
2089  /**
2090   *  @brief  Concatenate string and character.
2091   *  @param __lhs  First string.
2092   *  @param __rhs  Last string.
2093   *  @return  New string with @a __lhs followed by @a __rhs.
2094   */
2095  template<typename _CharT, typename _Traits, typename _Alloc,
2096	   template <typename, typename, typename> class _Base>
2097    __versa_string<_CharT, _Traits, _Alloc, _Base>
2098    operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2099	      _CharT __rhs);
2100
2101  // operator ==
2102  /**
2103   *  @brief  Test equivalence of two strings.
2104   *  @param __lhs  First string.
2105   *  @param __rhs  Second string.
2106   *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
2107   */
2108  template<typename _CharT, typename _Traits, typename _Alloc,
2109	   template <typename, typename, typename> class _Base>
2110    inline bool
2111    operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2112	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2113    { return __lhs.compare(__rhs) == 0; }
2114
2115  template<typename _CharT,
2116	   template <typename, typename, typename> class _Base>
2117    inline typename __enable_if<std::__is_char<_CharT>::__value, bool>::__type
2118    operator==(const __versa_string<_CharT, std::char_traits<_CharT>,
2119	       std::allocator<_CharT>, _Base>& __lhs,
2120	       const __versa_string<_CharT, std::char_traits<_CharT>,
2121	       std::allocator<_CharT>, _Base>& __rhs)
2122    { return (__lhs.size() == __rhs.size()
2123	      && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
2124						    __lhs.size())); }
2125
2126  /**
2127   *  @brief  Test equivalence of C string and string.
2128   *  @param __lhs  C string.
2129   *  @param __rhs  String.
2130   *  @return  True if @a __rhs.compare(@a __lhs) == 0.  False otherwise.
2131   */
2132  template<typename _CharT, typename _Traits, typename _Alloc,
2133	   template <typename, typename, typename> class _Base>
2134    inline bool
2135    operator==(const _CharT* __lhs,
2136	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2137    { return __rhs.compare(__lhs) == 0; }
2138
2139  /**
2140   *  @brief  Test equivalence of string and C string.
2141   *  @param __lhs  String.
2142   *  @param __rhs  C string.
2143   *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
2144   */
2145  template<typename _CharT, typename _Traits, typename _Alloc,
2146	   template <typename, typename, typename> class _Base>
2147    inline bool
2148    operator==(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2149	       const _CharT* __rhs)
2150    { return __lhs.compare(__rhs) == 0; }
2151
2152  // operator !=
2153  /**
2154   *  @brief  Test difference of two strings.
2155   *  @param __lhs  First string.
2156   *  @param __rhs  Second string.
2157   *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
2158   */
2159  template<typename _CharT, typename _Traits, typename _Alloc,
2160	   template <typename, typename, typename> class _Base>
2161    inline bool
2162    operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2163	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2164    { return !(__lhs == __rhs); }
2165
2166  /**
2167   *  @brief  Test difference of C string and string.
2168   *  @param __lhs  C string.
2169   *  @param __rhs  String.
2170   *  @return  True if @a __rhs.compare(@a __lhs) != 0.  False otherwise.
2171   */
2172  template<typename _CharT, typename _Traits, typename _Alloc,
2173	   template <typename, typename, typename> class _Base>
2174    inline bool
2175    operator!=(const _CharT* __lhs,
2176	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2177    { return !(__lhs == __rhs); }
2178
2179  /**
2180   *  @brief  Test difference of string and C string.
2181   *  @param __lhs  String.
2182   *  @param __rhs  C string.
2183   *  @return  True if @a __lhs.compare(@a __rhs) != 0.  False otherwise.
2184   */
2185  template<typename _CharT, typename _Traits, typename _Alloc,
2186	   template <typename, typename, typename> class _Base>
2187    inline bool
2188    operator!=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2189	       const _CharT* __rhs)
2190    { return !(__lhs == __rhs); }
2191
2192  // operator <
2193  /**
2194   *  @brief  Test if string precedes string.
2195   *  @param __lhs  First string.
2196   *  @param __rhs  Second string.
2197   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
2198   */
2199  template<typename _CharT, typename _Traits, typename _Alloc,
2200	   template <typename, typename, typename> class _Base>
2201    inline bool
2202    operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2203	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2204    { return __lhs.compare(__rhs) < 0; }
2205
2206  /**
2207   *  @brief  Test if string precedes C string.
2208   *  @param __lhs  String.
2209   *  @param __rhs  C string.
2210   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
2211   */
2212  template<typename _CharT, typename _Traits, typename _Alloc,
2213	   template <typename, typename, typename> class _Base>
2214    inline bool
2215    operator<(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2216	      const _CharT* __rhs)
2217    { return __lhs.compare(__rhs) < 0; }
2218
2219  /**
2220   *  @brief  Test if C string precedes string.
2221   *  @param __lhs  C string.
2222   *  @param __rhs  String.
2223   *  @return  True if @a __lhs precedes @a __rhs.  False otherwise.
2224   */
2225  template<typename _CharT, typename _Traits, typename _Alloc,
2226	   template <typename, typename, typename> class _Base>
2227    inline bool
2228    operator<(const _CharT* __lhs,
2229	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2230    { return __rhs.compare(__lhs) > 0; }
2231
2232  // operator >
2233  /**
2234   *  @brief  Test if string follows string.
2235   *  @param __lhs  First string.
2236   *  @param __rhs  Second string.
2237   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
2238   */
2239  template<typename _CharT, typename _Traits, typename _Alloc,
2240	   template <typename, typename, typename> class _Base>
2241    inline bool
2242    operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2243	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2244    { return __lhs.compare(__rhs) > 0; }
2245
2246  /**
2247   *  @brief  Test if string follows C string.
2248   *  @param __lhs  String.
2249   *  @param __rhs  C string.
2250   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
2251   */
2252  template<typename _CharT, typename _Traits, typename _Alloc,
2253	   template <typename, typename, typename> class _Base>
2254    inline bool
2255    operator>(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2256	      const _CharT* __rhs)
2257    { return __lhs.compare(__rhs) > 0; }
2258
2259  /**
2260   *  @brief  Test if C string follows string.
2261   *  @param __lhs  C string.
2262   *  @param __rhs  String.
2263   *  @return  True if @a __lhs follows @a __rhs.  False otherwise.
2264   */
2265  template<typename _CharT, typename _Traits, typename _Alloc,
2266	   template <typename, typename, typename> class _Base>
2267    inline bool
2268    operator>(const _CharT* __lhs,
2269	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2270    { return __rhs.compare(__lhs) < 0; }
2271
2272  // operator <=
2273  /**
2274   *  @brief  Test if string doesn't follow string.
2275   *  @param __lhs  First string.
2276   *  @param __rhs  Second string.
2277   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
2278   */
2279  template<typename _CharT, typename _Traits, typename _Alloc,
2280	   template <typename, typename, typename> class _Base>
2281    inline bool
2282    operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2283	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2284    { return __lhs.compare(__rhs) <= 0; }
2285
2286  /**
2287   *  @brief  Test if string doesn't follow C string.
2288   *  @param __lhs  String.
2289   *  @param __rhs  C string.
2290   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
2291   */
2292  template<typename _CharT, typename _Traits, typename _Alloc,
2293	   template <typename, typename, typename> class _Base>
2294    inline bool
2295    operator<=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2296	       const _CharT* __rhs)
2297    { return __lhs.compare(__rhs) <= 0; }
2298
2299  /**
2300   *  @brief  Test if C string doesn't follow string.
2301   *  @param __lhs  C string.
2302   *  @param __rhs  String.
2303   *  @return  True if @a __lhs doesn't follow @a __rhs.  False otherwise.
2304   */
2305  template<typename _CharT, typename _Traits, typename _Alloc,
2306	   template <typename, typename, typename> class _Base>
2307    inline bool
2308    operator<=(const _CharT* __lhs,
2309	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2310    { return __rhs.compare(__lhs) >= 0; }
2311
2312  // operator >=
2313  /**
2314   *  @brief  Test if string doesn't precede string.
2315   *  @param __lhs  First string.
2316   *  @param __rhs  Second string.
2317   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
2318   */
2319  template<typename _CharT, typename _Traits, typename _Alloc,
2320	   template <typename, typename, typename> class _Base>
2321    inline bool
2322    operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2323	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2324    { return __lhs.compare(__rhs) >= 0; }
2325
2326  /**
2327   *  @brief  Test if string doesn't precede C string.
2328   *  @param __lhs  String.
2329   *  @param __rhs  C string.
2330   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
2331   */
2332  template<typename _CharT, typename _Traits, typename _Alloc,
2333	   template <typename, typename, typename> class _Base>
2334    inline bool
2335    operator>=(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2336	       const _CharT* __rhs)
2337    { return __lhs.compare(__rhs) >= 0; }
2338
2339  /**
2340   *  @brief  Test if C string doesn't precede string.
2341   *  @param __lhs  C string.
2342   *  @param __rhs  String.
2343   *  @return  True if @a __lhs doesn't precede @a __rhs.  False otherwise.
2344   */
2345  template<typename _CharT, typename _Traits, typename _Alloc,
2346	   template <typename, typename, typename> class _Base>
2347    inline bool
2348    operator>=(const _CharT* __lhs,
2349	       const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2350    { return __rhs.compare(__lhs) <= 0; }
2351
2352  /**
2353   *  @brief  Swap contents of two strings.
2354   *  @param __lhs  First string.
2355   *  @param __rhs  Second string.
2356   *
2357   *  Exchanges the contents of @a __lhs and @a __rhs in constant time.
2358   */
2359  template<typename _CharT, typename _Traits, typename _Alloc,
2360	   template <typename, typename, typename> class _Base>
2361    inline void
2362    swap(__versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
2363	 __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
2364    { __lhs.swap(__rhs); }
2365
2366_GLIBCXX_END_NAMESPACE
2367
2368_GLIBCXX_BEGIN_NAMESPACE(std)
2369
2370  /**
2371   *  @brief  Read stream into a string.
2372   *  @param __is  Input stream.
2373   *  @param __str  Buffer to store into.
2374   *  @return  Reference to the input stream.
2375   *
2376   *  Stores characters from @a __is into @a __str until whitespace is
2377   *  found, the end of the stream is encountered, or str.max_size()
2378   *  is reached.  If is.width() is non-zero, that is the limit on the
2379   *  number of characters stored into @a __str.  Any previous
2380   *  contents of @a __str are erased.
2381   */
2382  template<typename _CharT, typename _Traits, typename _Alloc,
2383           template <typename, typename, typename> class _Base>
2384    basic_istream<_CharT, _Traits>&
2385    operator>>(basic_istream<_CharT, _Traits>& __is,
2386	       __gnu_cxx::__versa_string<_CharT, _Traits,
2387	                                 _Alloc, _Base>& __str);
2388
2389  /**
2390   *  @brief  Write string to a stream.
2391   *  @param __os  Output stream.
2392   *  @param __str  String to write out.
2393   *  @return  Reference to the output stream.
2394   *
2395   *  Output characters of @a __str into os following the same rules as for
2396   *  writing a C string.
2397   */
2398  template<typename _CharT, typename _Traits, typename _Alloc,
2399	   template <typename, typename, typename> class _Base>
2400    inline basic_ostream<_CharT, _Traits>&
2401    operator<<(basic_ostream<_CharT, _Traits>& __os,
2402	       const __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc,
2403	       _Base>& __str)
2404    {
2405      // _GLIBCXX_RESOLVE_LIB_DEFECTS
2406      // 586. string inserter not a formatted function
2407      return __ostream_insert(__os, __str.data(), __str.size());
2408    }
2409
2410  /**
2411   *  @brief  Read a line from stream into a string.
2412   *  @param __is  Input stream.
2413   *  @param __str  Buffer to store into.
2414   *  @param __delim  Character marking end of line.
2415   *  @return  Reference to the input stream.
2416   *
2417   *  Stores characters from @a __is into @a __str until @a __delim is
2418   *  found, the end of the stream is encountered, or str.max_size()
2419   *  is reached.  If is.width() is non-zero, that is the limit on the
2420   *  number of characters stored into @a __str.  Any previous
2421   *  contents of @a __str are erased.  If @a delim was encountered,
2422   *  it is extracted but not stored into @a __str.
2423   */
2424  template<typename _CharT, typename _Traits, typename _Alloc,
2425           template <typename, typename, typename> class _Base>
2426    basic_istream<_CharT, _Traits>&
2427    getline(basic_istream<_CharT, _Traits>& __is,
2428	    __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str,
2429	    _CharT __delim);
2430
2431  /**
2432   *  @brief  Read a line from stream into a string.
2433   *  @param __is  Input stream.
2434   *  @param __str  Buffer to store into.
2435   *  @return  Reference to the input stream.
2436   *
2437   *  Stores characters from is into @a __str until &apos;\n&apos; is
2438   *  found, the end of the stream is encountered, or str.max_size()
2439   *  is reached.  If is.width() is non-zero, that is the limit on the
2440   *  number of characters stored into @a __str.  Any previous
2441   *  contents of @a __str are erased.  If end of line was
2442   *  encountered, it is extracted but not stored into @a __str.
2443   */
2444  template<typename _CharT, typename _Traits, typename _Alloc,
2445           template <typename, typename, typename> class _Base>
2446    inline basic_istream<_CharT, _Traits>&
2447    getline(basic_istream<_CharT, _Traits>& __is,
2448	    __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str)
2449    { return getline(__is, __str, __is.widen('\n')); }
2450
2451_GLIBCXX_END_NAMESPACE
2452
2453#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99))
2454
2455#include <ext/string_conversions.h>
2456
2457_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
2458
2459  // 21.4 Numeric Conversions [string.conversions].
2460  inline int
2461  stoi(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
2462  { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
2463					__idx, __base); }
2464
2465  inline long
2466  stol(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
2467  { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
2468			     __idx, __base); }
2469
2470  inline unsigned long
2471  stoul(const __vstring& __str, std::size_t* __idx = 0, int __base = 10)
2472  { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
2473			     __idx, __base); }
2474
2475  inline long long
2476  stoll(const __vstring& __str, std::size_t* __idx = 0,	int __base = 10)
2477  { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
2478			     __idx, __base); }
2479
2480  inline unsigned long long
2481  stoull(const __vstring& __str, std::size_t* __idx, int __base = 10)
2482  { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
2483			     __idx, __base); }
2484
2485  // NB: strtof vs strtod.
2486  inline float
2487  stof(const __vstring& __str, std::size_t* __idx = 0)
2488  { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
2489
2490  inline double
2491  stod(const __vstring& __str, std::size_t* __idx = 0)
2492  { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
2493
2494  inline long double
2495  stold(const __vstring& __str, std::size_t* __idx = 0)
2496  { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
2497
2498  // NB: (v)snprintf vs sprintf.
2499
2500  // DR 1261.
2501  inline __vstring
2502  to_string(int __val)
2503  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, 4 * sizeof(int),
2504					      "%d", __val); }
2505
2506  inline __vstring
2507  to_string(unsigned __val)
2508  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2509					      4 * sizeof(unsigned),
2510					      "%u", __val); }
2511
2512  inline __vstring
2513  to_string(long __val)
2514  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2515					      4 * sizeof(long),
2516					      "%ld", __val); }
2517
2518  inline __vstring
2519  to_string(unsigned long __val)
2520  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2521					      4 * sizeof(unsigned long),
2522					      "%lu", __val); }
2523
2524
2525  inline __vstring
2526  to_string(long long __val)
2527  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2528					      4 * sizeof(long long),
2529					      "%lld", __val); }
2530
2531  inline __vstring
2532  to_string(unsigned long long __val)
2533  { return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf,
2534					      4 * sizeof(unsigned long long),
2535					      "%llu", __val); }
2536
2537  inline __vstring
2538  to_string(float __val)
2539  {
2540    const int __n = __numeric_traits<float>::__max_exponent10 + 20;
2541    return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n,
2542					      "%f", __val);
2543  }
2544
2545  inline __vstring
2546  to_string(double __val)
2547  {
2548    const int __n = __numeric_traits<double>::__max_exponent10 + 20;
2549    return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n,
2550					      "%f", __val);
2551  }
2552
2553  inline __vstring
2554  to_string(long double __val)
2555  {
2556    const int __n = __numeric_traits<long double>::__max_exponent10 + 20;
2557    return __gnu_cxx::__to_xstring<__vstring>(&std::vsnprintf, __n,
2558					      "%Lf", __val);
2559  }
2560
2561#ifdef _GLIBCXX_USE_WCHAR_T
2562  inline int
2563  stoi(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2564  { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
2565					__idx, __base); }
2566
2567  inline long
2568  stol(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2569  { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
2570			     __idx, __base); }
2571
2572  inline unsigned long
2573  stoul(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2574  { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
2575			     __idx, __base); }
2576
2577  inline long long
2578  stoll(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2579  { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
2580			     __idx, __base); }
2581
2582  inline unsigned long long
2583  stoull(const __wvstring& __str, std::size_t* __idx = 0, int __base = 10)
2584  { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
2585			     __idx, __base); }
2586
2587  // NB: wcstof vs wcstod.
2588  inline float
2589  stof(const __wvstring& __str, std::size_t* __idx = 0)
2590  { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
2591
2592  inline double
2593  stod(const __wvstring& __str, std::size_t* __idx = 0)
2594  { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
2595
2596  inline long double
2597  stold(const __wvstring& __str, std::size_t* __idx = 0)
2598  { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
2599
2600#ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
2601  // DR 1261.
2602  inline __wvstring
2603  to_wstring(int __val)
2604  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2605					       4 * sizeof(int),
2606					       L"%d", __val); }
2607
2608  inline __wvstring
2609  to_wstring(unsigned __val)
2610  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2611					       4 * sizeof(unsigned),
2612					       L"%u", __val); }
2613
2614  inline __wvstring
2615  to_wstring(long __val)
2616  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2617					       4 * sizeof(long),
2618					       L"%ld", __val); }
2619
2620  inline __wvstring
2621  to_wstring(unsigned long __val)
2622  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2623					       4 * sizeof(unsigned long),
2624					       L"%lu", __val); }
2625
2626  inline __wvstring
2627  to_wstring(long long __val)
2628  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2629					       4 * sizeof(long long),
2630					       L"%lld", __val); }
2631
2632  inline __wvstring
2633  to_wstring(unsigned long long __val)
2634  { return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf,
2635					       4 * sizeof(unsigned long long),
2636					       L"%llu", __val); }
2637
2638  inline __wvstring
2639  to_wstring(float __val)
2640  {
2641    const int __n = __numeric_traits<float>::__max_exponent10 + 20;
2642    return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n,
2643					       L"%f", __val);
2644  }
2645
2646  inline __wvstring
2647  to_wstring(double __val)
2648  {
2649    const int __n = __numeric_traits<double>::__max_exponent10 + 20;
2650    return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n,
2651					       L"%f", __val);
2652  }
2653
2654  inline __wvstring
2655  to_wstring(long double __val)
2656  {
2657    const int __n = __numeric_traits<long double>::__max_exponent10 + 20;
2658    return __gnu_cxx::__to_xstring<__wvstring>(&std::vswprintf, __n,
2659					       L"%Lf", __val);
2660  }
2661#endif
2662#endif
2663
2664_GLIBCXX_END_NAMESPACE
2665
2666#endif
2667
2668#ifndef _GLIBCXX_EXPORT_TEMPLATE
2669# include "vstring.tcc"
2670#endif
2671
2672#endif /* _VSTRING_H */
2673