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