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