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