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