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