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