STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
basic_string.h
Go to the documentation of this file.
1 // Components for manipulating sequences of characters -*- C++ -*-
2 
3 // Copyright (C) 1997-2013 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
30 //
31 // ISO C++ 14882: 21 Strings library
32 //
33 
34 #ifndef _BASIC_STRING_H
35 #define _BASIC_STRING_H 1
36 
37 #pragma GCC system_header
38 
39 #include <ext/atomicity.h>
40 #include <debug/debug.h>
41 #if __cplusplus >= 201103L
42 #include <initializer_list>
43 #endif
44 
45 namespace std _GLIBCXX_VISIBILITY(default)
46 {
47 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 
110  // 21.3 Template class basic_string
111  template<typename _CharT, typename _Traits, typename _Alloc>
112  class basic_string
113  {
114  typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
115 
116  // Types:
117  public:
118  typedef _Traits traits_type;
119  typedef typename _Traits::char_type value_type;
120  typedef _Alloc allocator_type;
121  typedef typename _CharT_alloc_type::size_type size_type;
122  typedef typename _CharT_alloc_type::difference_type difference_type;
123  typedef typename _CharT_alloc_type::reference reference;
124  typedef typename _CharT_alloc_type::const_reference const_reference;
125  typedef typename _CharT_alloc_type::pointer pointer;
126  typedef typename _CharT_alloc_type::const_pointer const_pointer;
127  typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
128  typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
129  const_iterator;
130  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
131  typedef std::reverse_iterator<iterator> reverse_iterator;
132 
133  private:
134  // _Rep: string representation
135  // Invariants:
136  // 1. String really contains _M_length + 1 characters: due to 21.3.4
137  // must be kept null-terminated.
138  // 2. _M_capacity >= _M_length
139  // Allocated memory is always (_M_capacity + 1) * sizeof(_CharT).
140  // 3. _M_refcount has three states:
141  // -1: leaked, one reference, no ref-copies allowed, non-const.
142  // 0: one reference, non-const.
143  // n>0: n + 1 references, operations require a lock, const.
144  // 4. All fields==0 is an empty string, given the extra storage
145  // beyond-the-end for a null terminator; thus, the shared
146  // empty string representation needs no constructor.
147 
148  struct _Rep_base
149  {
150  size_type _M_length;
151  size_type _M_capacity;
152  _Atomic_word _M_refcount;
153  };
154 
155  struct _Rep : _Rep_base
156  {
157  // Types:
158  typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
159 
160  // (Public) Data members:
161 
162  // The maximum number of individual char_type elements of an
163  // individual string is determined by _S_max_size. This is the
164  // value that will be returned by max_size(). (Whereas npos
165  // is the maximum number of bytes the allocator can allocate.)
166  // If one was to divvy up the theoretical largest size string,
167  // with a terminating character and m _CharT elements, it'd
168  // look like this:
169  // npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
170  // Solving for m:
171  // m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
172  // In addition, this implementation quarters this amount.
173  static const size_type _S_max_size;
174  static const _CharT _S_terminal;
175 
176  // The following storage is init'd to 0 by the linker, resulting
177  // (carefully) in an empty string with one reference.
178  static size_type _S_empty_rep_storage[];
179 
180  static _Rep&
181  _S_empty_rep()
182  {
183  // NB: Mild hack to avoid strict-aliasing warnings. Note that
184  // _S_empty_rep_storage is never modified and the punning should
185  // be reasonably safe in this case.
186  void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
187  return *reinterpret_cast<_Rep*>(__p);
188  }
189 
190  bool
191  _M_is_leaked() const
192  { return this->_M_refcount < 0; }
193 
194  bool
195  _M_is_shared() const
196  { return this->_M_refcount > 0; }
197 
198  void
199  _M_set_leaked()
200  { this->_M_refcount = -1; }
201 
202  void
203  _M_set_sharable()
204  { this->_M_refcount = 0; }
205 
206  void
207  _M_set_length_and_sharable(size_type __n)
208  {
209 #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
210  if (__builtin_expect(this != &_S_empty_rep(), false))
211 #endif
212  {
213  this->_M_set_sharable(); // One reference.
214  this->_M_length = __n;
215  traits_type::assign(this->_M_refdata()[__n], _S_terminal);
216  // grrr. (per 21.3.4)
217  // You cannot leave those LWG people alone for a second.
218  }
219  }
220 
221  _CharT*
222  _M_refdata() throw()
223  { return reinterpret_cast<_CharT*>(this + 1); }
224 
225  _CharT*
226  _M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
227  {
228  return (!_M_is_leaked() && __alloc1 == __alloc2)
229  ? _M_refcopy() : _M_clone(__alloc1);
230  }
231 
232  // Create & Destroy
233  static _Rep*
234  _S_create(size_type, size_type, const _Alloc&);
235 
236  void
237  _M_dispose(const _Alloc& __a)
238  {
239 #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
240  if (__builtin_expect(this != &_S_empty_rep(), false))
241 #endif
242  {
243  // Be race-detector-friendly. For more info see bits/c++config.
244  _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount);
245  if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount,
246  -1) <= 0)
247  {
248  _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount);
249  _M_destroy(__a);
250  }
251  }
252  } // XXX MT
253 
254  void
255  _M_destroy(const _Alloc&) throw();
256 
257  _CharT*
258  _M_refcopy() throw()
259  {
260 #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
261  if (__builtin_expect(this != &_S_empty_rep(), false))
262 #endif
263  __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
264  return _M_refdata();
265  } // XXX MT
266 
267  _CharT*
268  _M_clone(const _Alloc&, size_type __res = 0);
269  };
270 
271  // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
272  struct _Alloc_hider : _Alloc
273  {
274  _Alloc_hider(_CharT* __dat, const _Alloc& __a)
275  : _Alloc(__a), _M_p(__dat) { }
276 
277  _CharT* _M_p; // The actual data.
278  };
279 
280  public:
281  // Data Members (public):
282  // NB: This is an unsigned type, and thus represents the maximum
283  // size that the allocator can hold.
285  static const size_type npos = static_cast<size_type>(-1);
286 
287  private:
288  // Data Members (private):
289  mutable _Alloc_hider _M_dataplus;
290 
291  _CharT*
292  _M_data() const
293  { return _M_dataplus._M_p; }
294 
295  _CharT*
296  _M_data(_CharT* __p)
297  { return (_M_dataplus._M_p = __p); }
298 
299  _Rep*
300  _M_rep() const
301  { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
302 
303  // For the internal use we have functions similar to `begin'/`end'
304  // but they do not call _M_leak.
305  iterator
306  _M_ibegin() const
307  { return iterator(_M_data()); }
308 
309  iterator
310  _M_iend() const
311  { return iterator(_M_data() + this->size()); }
312 
313  void
314  _M_leak() // for use in begin() & non-const op[]
315  {
316  if (!_M_rep()->_M_is_leaked())
317  _M_leak_hard();
318  }
319 
320  size_type
321  _M_check(size_type __pos, const char* __s) const
322  {
323  if (__pos > this->size())
324  __throw_out_of_range(__N(__s));
325  return __pos;
326  }
327 
328  void
329  _M_check_length(size_type __n1, size_type __n2, const char* __s) const
330  {
331  if (this->max_size() - (this->size() - __n1) < __n2)
332  __throw_length_error(__N(__s));
333  }
334 
335  // NB: _M_limit doesn't check for a bad __pos value.
336  size_type
337  _M_limit(size_type __pos, size_type __off) const
338  {
339  const bool __testoff = __off < this->size() - __pos;
340  return __testoff ? __off : this->size() - __pos;
341  }
342 
343  // True if _Rep and source do not overlap.
344  bool
345  _M_disjunct(const _CharT* __s) const
346  {
347  return (less<const _CharT*>()(__s, _M_data())
348  || less<const _CharT*>()(_M_data() + this->size(), __s));
349  }
350 
351  // When __n = 1 way faster than the general multichar
352  // traits_type::copy/move/assign.
353  static void
354  _M_copy(_CharT* __d, const _CharT* __s, size_type __n)
355  {
356  if (__n == 1)
357  traits_type::assign(*__d, *__s);
358  else
359  traits_type::copy(__d, __s, __n);
360  }
361 
362  static void
363  _M_move(_CharT* __d, const _CharT* __s, size_type __n)
364  {
365  if (__n == 1)
366  traits_type::assign(*__d, *__s);
367  else
368  traits_type::move(__d, __s, __n);
369  }
370 
371  static void
372  _M_assign(_CharT* __d, size_type __n, _CharT __c)
373  {
374  if (__n == 1)
375  traits_type::assign(*__d, __c);
376  else
377  traits_type::assign(__d, __n, __c);
378  }
379 
380  // _S_copy_chars is a separate template to permit specialization
381  // to optimize for the common case of pointers as iterators.
382  template<class _Iterator>
383  static void
384  _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
385  {
386  for (; __k1 != __k2; ++__k1, ++__p)
387  traits_type::assign(*__p, *__k1); // These types are off.
388  }
389 
390  static void
391  _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2)
392  { _S_copy_chars(__p, __k1.base(), __k2.base()); }
393 
394  static void
395  _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
396  { _S_copy_chars(__p, __k1.base(), __k2.base()); }
397 
398  static void
399  _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
400  { _M_copy(__p, __k1, __k2 - __k1); }
401 
402  static void
403  _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
404  { _M_copy(__p, __k1, __k2 - __k1); }
405 
406  static int
407  _S_compare(size_type __n1, size_type __n2)
408  {
409  const difference_type __d = difference_type(__n1 - __n2);
410 
411  if (__d > __gnu_cxx::__numeric_traits<int>::__max)
412  return __gnu_cxx::__numeric_traits<int>::__max;
413  else if (__d < __gnu_cxx::__numeric_traits<int>::__min)
414  return __gnu_cxx::__numeric_traits<int>::__min;
415  else
416  return int(__d);
417  }
418 
419  void
420  _M_mutate(size_type __pos, size_type __len1, size_type __len2);
421 
422  void
423  _M_leak_hard();
424 
425  static _Rep&
426  _S_empty_rep()
427  { return _Rep::_S_empty_rep(); }
428 
429  public:
430  // Construct/copy/destroy:
431  // NB: We overload ctors in some cases instead of using default
432  // arguments, per 17.4.4.4 para. 2 item 2.
433 
437  basic_string()
438 #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
439  : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
440 #else
441  : _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc()){ }
442 #endif
443 
447  explicit
448  basic_string(const _Alloc& __a);
449 
450  // NB: per LWG issue 42, semantics different from IS:
455  basic_string(const basic_string& __str);
462  basic_string(const basic_string& __str, size_type __pos,
463  size_type __n = npos);
471  basic_string(const basic_string& __str, size_type __pos,
472  size_type __n, const _Alloc& __a);
473 
483  basic_string(const _CharT* __s, size_type __n,
484  const _Alloc& __a = _Alloc());
490  basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
497  basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
498 
499 #if __cplusplus >= 201103L
500 
507  basic_string(basic_string&& __str) noexcept
508  : _M_dataplus(__str._M_dataplus)
509  {
510 #if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
511  __str._M_data(_S_empty_rep()._M_refdata());
512 #else
513  __str._M_data(_S_construct(size_type(), _CharT(), get_allocator()));
514 #endif
515  }
516 
522  basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc());
523 #endif // C++11
524 
531  template<class _InputIterator>
532  basic_string(_InputIterator __beg, _InputIterator __end,
533  const _Alloc& __a = _Alloc());
534 
538  ~basic_string() _GLIBCXX_NOEXCEPT
539  { _M_rep()->_M_dispose(this->get_allocator()); }
540 
545  basic_string&
546  operator=(const basic_string& __str)
547  { return this->assign(__str); }
548 
553  basic_string&
554  operator=(const _CharT* __s)
555  { return this->assign(__s); }
556 
564  basic_string&
565  operator=(_CharT __c)
566  {
567  this->assign(1, __c);
568  return *this;
569  }
570 
571 #if __cplusplus >= 201103L
572 
579  basic_string&
580  operator=(basic_string&& __str)
581  {
582  // NB: DR 1204.
583  this->swap(__str);
584  return *this;
585  }
586 
591  basic_string&
592  operator=(initializer_list<_CharT> __l)
593  {
594  this->assign(__l.begin(), __l.size());
595  return *this;
596  }
597 #endif // C++11
598 
599  // Iterators:
604  iterator
605  begin() _GLIBCXX_NOEXCEPT
606  {
607  _M_leak();
608  return iterator(_M_data());
609  }
610 
615  const_iterator
616  begin() const _GLIBCXX_NOEXCEPT
617  { return const_iterator(_M_data()); }
618 
623  iterator
624  end() _GLIBCXX_NOEXCEPT
625  {
626  _M_leak();
627  return iterator(_M_data() + this->size());
628  }
629 
634  const_iterator
635  end() const _GLIBCXX_NOEXCEPT
636  { return const_iterator(_M_data() + this->size()); }
637 
643  reverse_iterator
644  rbegin() _GLIBCXX_NOEXCEPT
645  { return reverse_iterator(this->end()); }
646 
652  const_reverse_iterator
653  rbegin() const _GLIBCXX_NOEXCEPT
654  { return const_reverse_iterator(this->end()); }
655 
661  reverse_iterator
662  rend() _GLIBCXX_NOEXCEPT
663  { return reverse_iterator(this->begin()); }
664 
670  const_reverse_iterator
671  rend() const _GLIBCXX_NOEXCEPT
672  { return const_reverse_iterator(this->begin()); }
673 
674 #if __cplusplus >= 201103L
675 
679  const_iterator
680  cbegin() const noexcept
681  { return const_iterator(this->_M_data()); }
682 
687  const_iterator
688  cend() const noexcept
689  { return const_iterator(this->_M_data() + this->size()); }
690 
696  const_reverse_iterator
697  crbegin() const noexcept
698  { return const_reverse_iterator(this->end()); }
699 
705  const_reverse_iterator
706  crend() const noexcept
707  { return const_reverse_iterator(this->begin()); }
708 #endif
709 
710  public:
711  // Capacity:
714  size_type
715  size() const _GLIBCXX_NOEXCEPT
716  { return _M_rep()->_M_length; }
717 
720  size_type
721  length() const _GLIBCXX_NOEXCEPT
722  { return _M_rep()->_M_length; }
723 
725  size_type
726  max_size() const _GLIBCXX_NOEXCEPT
727  { return _Rep::_S_max_size; }
728 
739  void
740  resize(size_type __n, _CharT __c);
741 
752  void
753  resize(size_type __n)
754  { this->resize(__n, _CharT()); }
755 
756 #if __cplusplus >= 201103L
757  void
759  shrink_to_fit()
760  {
761  if (capacity() > size())
762  {
763  __try
764  { reserve(0); }
765  __catch(...)
766  { }
767  }
768  }
769 #endif
770 
775  size_type
776  capacity() const _GLIBCXX_NOEXCEPT
777  { return _M_rep()->_M_capacity; }
778 
796  void
797  reserve(size_type __res_arg = 0);
798 
802  void
803  clear() _GLIBCXX_NOEXCEPT
804  { _M_mutate(0, this->size(), 0); }
805 
810  bool
811  empty() const _GLIBCXX_NOEXCEPT
812  { return this->size() == 0; }
813 
814  // Element access:
825  const_reference
826  operator[] (size_type __pos) const
827  {
828  _GLIBCXX_DEBUG_ASSERT(__pos <= size());
829  return _M_data()[__pos];
830  }
831 
842  reference
843  operator[](size_type __pos)
844  {
845  // allow pos == size() as v3 extension:
846  _GLIBCXX_DEBUG_ASSERT(__pos <= size());
847  // but be strict in pedantic mode:
848  _GLIBCXX_DEBUG_PEDASSERT(__pos < size());
849  _M_leak();
850  return _M_data()[__pos];
851  }
852 
863  const_reference
864  at(size_type __n) const
865  {
866  if (__n >= this->size())
867  __throw_out_of_range(__N("basic_string::at"));
868  return _M_data()[__n];
869  }
870 
882  reference
883  at(size_type __n)
884  {
885  if (__n >= size())
886  __throw_out_of_range(__N("basic_string::at"));
887  _M_leak();
888  return _M_data()[__n];
889  }
890 
891 #if __cplusplus >= 201103L
892 
896  reference
897  front()
898  { return operator[](0); }
899 
904  const_reference
905  front() const
906  { return operator[](0); }
907 
912  reference
913  back()
914  { return operator[](this->size() - 1); }
915 
920  const_reference
921  back() const
922  { return operator[](this->size() - 1); }
923 #endif
924 
925  // Modifiers:
931  basic_string&
932  operator+=(const basic_string& __str)
933  { return this->append(__str); }
934 
940  basic_string&
941  operator+=(const _CharT* __s)
942  { return this->append(__s); }
943 
949  basic_string&
950  operator+=(_CharT __c)
951  {
952  this->push_back(__c);
953  return *this;
954  }
955 
956 #if __cplusplus >= 201103L
957 
962  basic_string&
963  operator+=(initializer_list<_CharT> __l)
964  { return this->append(__l.begin(), __l.size()); }
965 #endif // C++11
966 
972  basic_string&
973  append(const basic_string& __str);
974 
988  basic_string&
989  append(const basic_string& __str, size_type __pos, size_type __n);
990 
997  basic_string&
998  append(const _CharT* __s, size_type __n);
999 
1005  basic_string&
1006  append(const _CharT* __s)
1007  {
1009  return this->append(__s, traits_type::length(__s));
1010  }
1011 
1020  basic_string&
1021  append(size_type __n, _CharT __c);
1022 
1023 #if __cplusplus >= 201103L
1024 
1029  basic_string&
1030  append(initializer_list<_CharT> __l)
1031  { return this->append(__l.begin(), __l.size()); }
1032 #endif // C++11
1033 
1042  template<class _InputIterator>
1043  basic_string&
1044  append(_InputIterator __first, _InputIterator __last)
1045  { return this->replace(_M_iend(), _M_iend(), __first, __last); }
1046 
1051  void
1052  push_back(_CharT __c)
1053  {
1054  const size_type __len = 1 + this->size();
1055  if (__len > this->capacity() || _M_rep()->_M_is_shared())
1056  this->reserve(__len);
1057  traits_type::assign(_M_data()[this->size()], __c);
1058  _M_rep()->_M_set_length_and_sharable(__len);
1059  }
1060 
1066  basic_string&
1067  assign(const basic_string& __str);
1068 
1069 #if __cplusplus >= 201103L
1070 
1078  basic_string&
1079  assign(basic_string&& __str)
1080  {
1081  this->swap(__str);
1082  return *this;
1083  }
1084 #endif // C++11
1085 
1099  basic_string&
1100  assign(const basic_string& __str, size_type __pos, size_type __n)
1101  { return this->assign(__str._M_data()
1102  + __str._M_check(__pos, "basic_string::assign"),
1103  __str._M_limit(__pos, __n)); }
1104 
1115  basic_string&
1116  assign(const _CharT* __s, size_type __n);
1117 
1127  basic_string&
1128  assign(const _CharT* __s)
1129  {
1131  return this->assign(__s, traits_type::length(__s));
1132  }
1133 
1143  basic_string&
1144  assign(size_type __n, _CharT __c)
1145  { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
1146 
1155  template<class _InputIterator>
1156  basic_string&
1157  assign(_InputIterator __first, _InputIterator __last)
1158  { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
1159 
1160 #if __cplusplus >= 201103L
1161 
1166  basic_string&
1167  assign(initializer_list<_CharT> __l)
1168  { return this->assign(__l.begin(), __l.size()); }
1169 #endif // C++11
1170 
1184  void
1185  insert(iterator __p, size_type __n, _CharT __c)
1186  { this->replace(__p, __p, __n, __c); }
1187 
1200  template<class _InputIterator>
1201  void
1202  insert(iterator __p, _InputIterator __beg, _InputIterator __end)
1203  { this->replace(__p, __p, __beg, __end); }
1204 
1205 #if __cplusplus >= 201103L
1206 
1212  void
1213  insert(iterator __p, initializer_list<_CharT> __l)
1214  {
1215  _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
1216  this->insert(__p - _M_ibegin(), __l.begin(), __l.size());
1217  }
1218 #endif // C++11
1219 
1232  basic_string&
1233  insert(size_type __pos1, const basic_string& __str)
1234  { return this->insert(__pos1, __str, size_type(0), __str.size()); }
1235 
1254  basic_string&
1255  insert(size_type __pos1, const basic_string& __str,
1256  size_type __pos2, size_type __n)
1257  { return this->insert(__pos1, __str._M_data()
1258  + __str._M_check(__pos2, "basic_string::insert"),
1259  __str._M_limit(__pos2, __n)); }
1260 
1277  basic_string&
1278  insert(size_type __pos, const _CharT* __s, size_type __n);
1279 
1295  basic_string&
1296  insert(size_type __pos, const _CharT* __s)
1297  {
1299  return this->insert(__pos, __s, traits_type::length(__s));
1300  }
1301 
1318  basic_string&
1319  insert(size_type __pos, size_type __n, _CharT __c)
1320  { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
1321  size_type(0), __n, __c); }
1322 
1336  iterator
1337  insert(iterator __p, _CharT __c)
1338  {
1339  _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
1340  const size_type __pos = __p - _M_ibegin();
1341  _M_replace_aux(__pos, size_type(0), size_type(1), __c);
1342  _M_rep()->_M_set_leaked();
1343  return iterator(_M_data() + __pos);
1344  }
1345 
1361  basic_string&
1362  erase(size_type __pos = 0, size_type __n = npos)
1363  {
1364  _M_mutate(_M_check(__pos, "basic_string::erase"),
1365  _M_limit(__pos, __n), size_type(0));
1366  return *this;
1367  }
1368 
1377  iterator
1378  erase(iterator __position)
1379  {
1380  _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
1381  && __position < _M_iend());
1382  const size_type __pos = __position - _M_ibegin();
1383  _M_mutate(__pos, size_type(1), size_type(0));
1384  _M_rep()->_M_set_leaked();
1385  return iterator(_M_data() + __pos);
1386  }
1387 
1397  iterator
1398  erase(iterator __first, iterator __last);
1399 
1400 #if __cplusplus >= 201103L
1401 
1406  void
1407  pop_back()
1408  { erase(size()-1, 1); }
1409 #endif // C++11
1410 
1428  basic_string&
1429  replace(size_type __pos, size_type __n, const basic_string& __str)
1430  { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
1431 
1450  basic_string&
1451  replace(size_type __pos1, size_type __n1, const basic_string& __str,
1452  size_type __pos2, size_type __n2)
1453  { return this->replace(__pos1, __n1, __str._M_data()
1454  + __str._M_check(__pos2, "basic_string::replace"),
1455  __str._M_limit(__pos2, __n2)); }
1456 
1475  basic_string&
1476  replace(size_type __pos, size_type __n1, const _CharT* __s,
1477  size_type __n2);
1478 
1495  basic_string&
1496  replace(size_type __pos, size_type __n1, const _CharT* __s)
1497  {
1499  return this->replace(__pos, __n1, __s, traits_type::length(__s));
1500  }
1501 
1519  basic_string&
1520  replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
1521  { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
1522  _M_limit(__pos, __n1), __n2, __c); }
1523 
1537  basic_string&
1538  replace(iterator __i1, iterator __i2, const basic_string& __str)
1539  { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
1540 
1556  basic_string&
1557  replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
1558  {
1559  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1560  && __i2 <= _M_iend());
1561  return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
1562  }
1563 
1577  basic_string&
1578  replace(iterator __i1, iterator __i2, const _CharT* __s)
1579  {
1581  return this->replace(__i1, __i2, __s, traits_type::length(__s));
1582  }
1583 
1598  basic_string&
1599  replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
1600  {
1601  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1602  && __i2 <= _M_iend());
1603  return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
1604  }
1605 
1621  template<class _InputIterator>
1622  basic_string&
1623  replace(iterator __i1, iterator __i2,
1624  _InputIterator __k1, _InputIterator __k2)
1625  {
1626  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1627  && __i2 <= _M_iend());
1628  __glibcxx_requires_valid_range(__k1, __k2);
1629  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1630  return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
1631  }
1632 
1633  // Specializations for the common case of pointer and iterator:
1634  // useful to avoid the overhead of temporary buffering in _M_replace.
1635  basic_string&
1636  replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
1637  {
1638  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1639  && __i2 <= _M_iend());
1640  __glibcxx_requires_valid_range(__k1, __k2);
1641  return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1642  __k1, __k2 - __k1);
1643  }
1644 
1645  basic_string&
1646  replace(iterator __i1, iterator __i2,
1647  const _CharT* __k1, const _CharT* __k2)
1648  {
1649  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1650  && __i2 <= _M_iend());
1651  __glibcxx_requires_valid_range(__k1, __k2);
1652  return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1653  __k1, __k2 - __k1);
1654  }
1655 
1656  basic_string&
1657  replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
1658  {
1659  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1660  && __i2 <= _M_iend());
1661  __glibcxx_requires_valid_range(__k1, __k2);
1662  return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1663  __k1.base(), __k2 - __k1);
1664  }
1665 
1666  basic_string&
1667  replace(iterator __i1, iterator __i2,
1668  const_iterator __k1, const_iterator __k2)
1669  {
1670  _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
1671  && __i2 <= _M_iend());
1672  __glibcxx_requires_valid_range(__k1, __k2);
1673  return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
1674  __k1.base(), __k2 - __k1);
1675  }
1676 
1677 #if __cplusplus >= 201103L
1678 
1692  basic_string& replace(iterator __i1, iterator __i2,
1693  initializer_list<_CharT> __l)
1694  { return this->replace(__i1, __i2, __l.begin(), __l.end()); }
1695 #endif // C++11
1696 
1697  private:
1698  template<class _Integer>
1699  basic_string&
1700  _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
1701  _Integer __val, __true_type)
1702  { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
1703 
1704  template<class _InputIterator>
1705  basic_string&
1706  _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
1707  _InputIterator __k2, __false_type);
1708 
1709  basic_string&
1710  _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
1711  _CharT __c);
1712 
1713  basic_string&
1714  _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
1715  size_type __n2);
1716 
1717  // _S_construct_aux is used to implement the 21.3.1 para 15 which
1718  // requires special behaviour if _InIter is an integral type
1719  template<class _InIterator>
1720  static _CharT*
1721  _S_construct_aux(_InIterator __beg, _InIterator __end,
1722  const _Alloc& __a, __false_type)
1723  {
1724  typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
1725  return _S_construct(__beg, __end, __a, _Tag());
1726  }
1727 
1728  // _GLIBCXX_RESOLVE_LIB_DEFECTS
1729  // 438. Ambiguity in the "do the right thing" clause
1730  template<class _Integer>
1731  static _CharT*
1732  _S_construct_aux(_Integer __beg, _Integer __end,
1733  const _Alloc& __a, __true_type)
1734  { return _S_construct_aux_2(static_cast<size_type>(__beg),
1735  __end, __a); }
1736 
1737  static _CharT*
1738  _S_construct_aux_2(size_type __req, _CharT __c, const _Alloc& __a)
1739  { return _S_construct(__req, __c, __a); }
1740 
1741  template<class _InIterator>
1742  static _CharT*
1743  _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
1744  {
1745  typedef typename std::__is_integer<_InIterator>::__type _Integral;
1746  return _S_construct_aux(__beg, __end, __a, _Integral());
1747  }
1748 
1749  // For Input Iterators, used in istreambuf_iterators, etc.
1750  template<class _InIterator>
1751  static _CharT*
1752  _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
1753  input_iterator_tag);
1754 
1755  // For forward_iterators up to random_access_iterators, used for
1756  // string::iterator, _CharT*, etc.
1757  template<class _FwdIterator>
1758  static _CharT*
1759  _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
1760  forward_iterator_tag);
1761 
1762  static _CharT*
1763  _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
1764 
1765  public:
1766 
1779  size_type
1780  copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
1781 
1789  void
1790  swap(basic_string& __s);
1791 
1792  // String operations:
1799  const _CharT*
1800  c_str() const _GLIBCXX_NOEXCEPT
1801  { return _M_data(); }
1802 
1809  const _CharT*
1810  data() const _GLIBCXX_NOEXCEPT
1811  { return _M_data(); }
1812 
1816  allocator_type
1817  get_allocator() const _GLIBCXX_NOEXCEPT
1818  { return _M_dataplus; }
1819 
1832  size_type
1833  find(const _CharT* __s, size_type __pos, size_type __n) const;
1834 
1845  size_type
1846  find(const basic_string& __str, size_type __pos = 0) const
1847  _GLIBCXX_NOEXCEPT
1848  { return this->find(__str.data(), __pos, __str.size()); }
1849 
1860  size_type
1861  find(const _CharT* __s, size_type __pos = 0) const
1862  {
1864  return this->find(__s, __pos, traits_type::length(__s));
1865  }
1866 
1877  size_type
1878  find(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT;
1879 
1890  size_type
1891  rfind(const basic_string& __str, size_type __pos = npos) const
1892  _GLIBCXX_NOEXCEPT
1893  { return this->rfind(__str.data(), __pos, __str.size()); }
1894 
1907  size_type
1908  rfind(const _CharT* __s, size_type __pos, size_type __n) const;
1909 
1920  size_type
1921  rfind(const _CharT* __s, size_type __pos = npos) const
1922  {
1924  return this->rfind(__s, __pos, traits_type::length(__s));
1925  }
1926 
1937  size_type
1938  rfind(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT;
1939 
1951  size_type
1952  find_first_of(const basic_string& __str, size_type __pos = 0) const
1953  _GLIBCXX_NOEXCEPT
1954  { return this->find_first_of(__str.data(), __pos, __str.size()); }
1955 
1968  size_type
1969  find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
1970 
1981  size_type
1982  find_first_of(const _CharT* __s, size_type __pos = 0) const
1983  {
1985  return this->find_first_of(__s, __pos, traits_type::length(__s));
1986  }
1987 
2000  size_type
2001  find_first_of(_CharT __c, size_type __pos = 0) const _GLIBCXX_NOEXCEPT
2002  { return this->find(__c, __pos); }
2003 
2015  size_type
2016  find_last_of(const basic_string& __str, size_type __pos = npos) const
2017  _GLIBCXX_NOEXCEPT
2018  { return this->find_last_of(__str.data(), __pos, __str.size()); }
2019 
2032  size_type
2033  find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
2034 
2045  size_type
2046  find_last_of(const _CharT* __s, size_type __pos = npos) const
2047  {
2049  return this->find_last_of(__s, __pos, traits_type::length(__s));
2050  }
2051 
2064  size_type
2065  find_last_of(_CharT __c, size_type __pos = npos) const _GLIBCXX_NOEXCEPT
2066  { return this->rfind(__c, __pos); }
2067 
2078  size_type
2079  find_first_not_of(const basic_string& __str, size_type __pos = 0) const
2080  _GLIBCXX_NOEXCEPT
2081  { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
2082 
2095  size_type
2096  find_first_not_of(const _CharT* __s, size_type __pos,
2097  size_type __n) const;
2098 
2109  size_type
2110  find_first_not_of(const _CharT* __s, size_type __pos = 0) const
2111  {
2113  return this->find_first_not_of(__s, __pos, traits_type::length(__s));
2114  }
2115 
2126  size_type
2127  find_first_not_of(_CharT __c, size_type __pos = 0) const
2128  _GLIBCXX_NOEXCEPT;
2129 
2141  size_type
2142  find_last_not_of(const basic_string& __str, size_type __pos = npos) const
2143  _GLIBCXX_NOEXCEPT
2144  { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
2145 
2158  size_type
2159  find_last_not_of(const _CharT* __s, size_type __pos,
2160  size_type __n) const;
2172  size_type
2173  find_last_not_of(const _CharT* __s, size_type __pos = npos) const
2174  {
2176  return this->find_last_not_of(__s, __pos, traits_type::length(__s));
2177  }
2178 
2189  size_type
2190  find_last_not_of(_CharT __c, size_type __pos = npos) const
2191  _GLIBCXX_NOEXCEPT;
2192 
2205  basic_string
2206  substr(size_type __pos = 0, size_type __n = npos) const
2207  { return basic_string(*this,
2208  _M_check(__pos, "basic_string::substr"), __n); }
2209 
2224  int
2225  compare(const basic_string& __str) const
2226  {
2227  const size_type __size = this->size();
2228  const size_type __osize = __str.size();
2229  const size_type __len = std::min(__size, __osize);
2230 
2231  int __r = traits_type::compare(_M_data(), __str.data(), __len);
2232  if (!__r)
2233  __r = _S_compare(__size, __osize);
2234  return __r;
2235  }
2236 
2256  int
2257  compare(size_type __pos, size_type __n, const basic_string& __str) const;
2258 
2282  int
2283  compare(size_type __pos1, size_type __n1, const basic_string& __str,
2284  size_type __pos2, size_type __n2) const;
2285 
2300  int
2301  compare(const _CharT* __s) const;
2302 
2303  // _GLIBCXX_RESOLVE_LIB_DEFECTS
2304  // 5 String::compare specification questionable
2324  int
2325  compare(size_type __pos, size_type __n1, const _CharT* __s) const;
2326 
2351  int
2352  compare(size_type __pos, size_type __n1, const _CharT* __s,
2353  size_type __n2) const;
2354  };
2355 
2356  // operator+
2363  template<typename _CharT, typename _Traits, typename _Alloc>
2367  {
2369  __str.append(__rhs);
2370  return __str;
2371  }
2372 
2379  template<typename _CharT, typename _Traits, typename _Alloc>
2381  operator+(const _CharT* __lhs,
2383 
2390  template<typename _CharT, typename _Traits, typename _Alloc>
2392  operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
2393 
2400  template<typename _CharT, typename _Traits, typename _Alloc>
2403  const _CharT* __rhs)
2404  {
2406  __str.append(__rhs);
2407  return __str;
2408  }
2409 
2416  template<typename _CharT, typename _Traits, typename _Alloc>
2418  operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
2419  {
2420  typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
2421  typedef typename __string_type::size_type __size_type;
2422  __string_type __str(__lhs);
2423  __str.append(__size_type(1), __rhs);
2424  return __str;
2425  }
2426 
2427 #if __cplusplus >= 201103L
2428  template<typename _CharT, typename _Traits, typename _Alloc>
2432  { return std::move(__lhs.append(__rhs)); }
2433 
2434  template<typename _CharT, typename _Traits, typename _Alloc>
2438  { return std::move(__rhs.insert(0, __lhs)); }
2439 
2440  template<typename _CharT, typename _Traits, typename _Alloc>
2444  {
2445  const auto __size = __lhs.size() + __rhs.size();
2446  const bool __cond = (__size > __lhs.capacity()
2447  && __size <= __rhs.capacity());
2448  return __cond ? std::move(__rhs.insert(0, __lhs))
2449  : std::move(__lhs.append(__rhs));
2450  }
2451 
2452  template<typename _CharT, typename _Traits, typename _Alloc>
2454  operator+(const _CharT* __lhs,
2456  { return std::move(__rhs.insert(0, __lhs)); }
2457 
2458  template<typename _CharT, typename _Traits, typename _Alloc>
2460  operator+(_CharT __lhs,
2462  { return std::move(__rhs.insert(0, 1, __lhs)); }
2463 
2464  template<typename _CharT, typename _Traits, typename _Alloc>
2467  const _CharT* __rhs)
2468  { return std::move(__lhs.append(__rhs)); }
2469 
2470  template<typename _CharT, typename _Traits, typename _Alloc>
2473  _CharT __rhs)
2474  { return std::move(__lhs.append(1, __rhs)); }
2475 #endif
2476 
2477  // operator ==
2484  template<typename _CharT, typename _Traits, typename _Alloc>
2485  inline bool
2488  { return __lhs.compare(__rhs) == 0; }
2489 
2490  template<typename _CharT>
2491  inline
2492  typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
2493  operator==(const basic_string<_CharT>& __lhs,
2494  const basic_string<_CharT>& __rhs)
2495  { return (__lhs.size() == __rhs.size()
2496  && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
2497  __lhs.size())); }
2498 
2505  template<typename _CharT, typename _Traits, typename _Alloc>
2506  inline bool
2507  operator==(const _CharT* __lhs,
2509  { return __rhs.compare(__lhs) == 0; }
2510 
2517  template<typename _CharT, typename _Traits, typename _Alloc>
2518  inline bool
2520  const _CharT* __rhs)
2521  { return __lhs.compare(__rhs) == 0; }
2522 
2523  // operator !=
2530  template<typename _CharT, typename _Traits, typename _Alloc>
2531  inline bool
2534  { return !(__lhs == __rhs); }
2535 
2542  template<typename _CharT, typename _Traits, typename _Alloc>
2543  inline bool
2544  operator!=(const _CharT* __lhs,
2546  { return !(__lhs == __rhs); }
2547 
2554  template<typename _CharT, typename _Traits, typename _Alloc>
2555  inline bool
2557  const _CharT* __rhs)
2558  { return !(__lhs == __rhs); }
2559 
2560  // operator <
2567  template<typename _CharT, typename _Traits, typename _Alloc>
2568  inline bool
2569  operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2571  { return __lhs.compare(__rhs) < 0; }
2572 
2579  template<typename _CharT, typename _Traits, typename _Alloc>
2580  inline bool
2581  operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2582  const _CharT* __rhs)
2583  { return __lhs.compare(__rhs) < 0; }
2584 
2591  template<typename _CharT, typename _Traits, typename _Alloc>
2592  inline bool
2593  operator<(const _CharT* __lhs,
2595  { return __rhs.compare(__lhs) > 0; }
2596 
2597  // operator >
2604  template<typename _CharT, typename _Traits, typename _Alloc>
2605  inline bool
2608  { return __lhs.compare(__rhs) > 0; }
2609 
2616  template<typename _CharT, typename _Traits, typename _Alloc>
2617  inline bool
2619  const _CharT* __rhs)
2620  { return __lhs.compare(__rhs) > 0; }
2621 
2628  template<typename _CharT, typename _Traits, typename _Alloc>
2629  inline bool
2630  operator>(const _CharT* __lhs,
2632  { return __rhs.compare(__lhs) < 0; }
2633 
2634  // operator <=
2641  template<typename _CharT, typename _Traits, typename _Alloc>
2642  inline bool
2643  operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2645  { return __lhs.compare(__rhs) <= 0; }
2646 
2653  template<typename _CharT, typename _Traits, typename _Alloc>
2654  inline bool
2655  operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
2656  const _CharT* __rhs)
2657  { return __lhs.compare(__rhs) <= 0; }
2658 
2665  template<typename _CharT, typename _Traits, typename _Alloc>
2666  inline bool
2667  operator<=(const _CharT* __lhs,
2669  { return __rhs.compare(__lhs) >= 0; }
2670 
2671  // operator >=
2678  template<typename _CharT, typename _Traits, typename _Alloc>
2679  inline bool
2682  { return __lhs.compare(__rhs) >= 0; }
2683 
2690  template<typename _CharT, typename _Traits, typename _Alloc>
2691  inline bool
2693  const _CharT* __rhs)
2694  { return __lhs.compare(__rhs) >= 0; }
2695 
2702  template<typename _CharT, typename _Traits, typename _Alloc>
2703  inline bool
2704  operator>=(const _CharT* __lhs,
2706  { return __rhs.compare(__lhs) <= 0; }
2707 
2715  template<typename _CharT, typename _Traits, typename _Alloc>
2716  inline void
2719  { __lhs.swap(__rhs); }
2720 
2733  template<typename _CharT, typename _Traits, typename _Alloc>
2734  basic_istream<_CharT, _Traits>&
2735  operator>>(basic_istream<_CharT, _Traits>& __is,
2737 
2738  template<>
2739  basic_istream<char>&
2740  operator>>(basic_istream<char>& __is, basic_string<char>& __str);
2741 
2751  template<typename _CharT, typename _Traits, typename _Alloc>
2752  inline basic_ostream<_CharT, _Traits>&
2753  operator<<(basic_ostream<_CharT, _Traits>& __os,
2755  {
2756  // _GLIBCXX_RESOLVE_LIB_DEFECTS
2757  // 586. string inserter not a formatted function
2758  return __ostream_insert(__os, __str.data(), __str.size());
2759  }
2760 
2774  template<typename _CharT, typename _Traits, typename _Alloc>
2775  basic_istream<_CharT, _Traits>&
2776  getline(basic_istream<_CharT, _Traits>& __is,
2777  basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
2778 
2791  template<typename _CharT, typename _Traits, typename _Alloc>
2792  inline basic_istream<_CharT, _Traits>&
2793  getline(basic_istream<_CharT, _Traits>& __is,
2795  { return getline(__is, __str, __is.widen('\n')); }
2796 
2797  template<>
2798  basic_istream<char>&
2799  getline(basic_istream<char>& __in, basic_string<char>& __str,
2800  char __delim);
2801 
2802 #ifdef _GLIBCXX_USE_WCHAR_T
2803  template<>
2804  basic_istream<wchar_t>&
2805  getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str,
2806  wchar_t __delim);
2807 #endif
2808 
2809 _GLIBCXX_END_NAMESPACE_VERSION
2810 } // namespace
2811 
2812 #if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
2813  && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
2814 
2815 #include <ext/string_conversions.h>
2816 
2817 namespace std _GLIBCXX_VISIBILITY(default)
2818 {
2819 _GLIBCXX_BEGIN_NAMESPACE_VERSION
2820 
2821  // 21.4 Numeric Conversions [string.conversions].
2822  inline int
2823  stoi(const string& __str, size_t* __idx = 0, int __base = 10)
2824  { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
2825  __idx, __base); }
2826 
2827  inline long
2828  stol(const string& __str, size_t* __idx = 0, int __base = 10)
2829  { return __gnu_cxx::__stoa(&std::strtol, "stol", __str.c_str(),
2830  __idx, __base); }
2831 
2832  inline unsigned long
2833  stoul(const string& __str, size_t* __idx = 0, int __base = 10)
2834  { return __gnu_cxx::__stoa(&std::strtoul, "stoul", __str.c_str(),
2835  __idx, __base); }
2836 
2837  inline long long
2838  stoll(const string& __str, size_t* __idx = 0, int __base = 10)
2839  { return __gnu_cxx::__stoa(&std::strtoll, "stoll", __str.c_str(),
2840  __idx, __base); }
2841 
2842  inline unsigned long long
2843  stoull(const string& __str, size_t* __idx = 0, int __base = 10)
2844  { return __gnu_cxx::__stoa(&std::strtoull, "stoull", __str.c_str(),
2845  __idx, __base); }
2846 
2847  // NB: strtof vs strtod.
2848  inline float
2849  stof(const string& __str, size_t* __idx = 0)
2850  { return __gnu_cxx::__stoa(&std::strtof, "stof", __str.c_str(), __idx); }
2851 
2852  inline double
2853  stod(const string& __str, size_t* __idx = 0)
2854  { return __gnu_cxx::__stoa(&std::strtod, "stod", __str.c_str(), __idx); }
2855 
2856  inline long double
2857  stold(const string& __str, size_t* __idx = 0)
2858  { return __gnu_cxx::__stoa(&std::strtold, "stold", __str.c_str(), __idx); }
2859 
2860  // NB: (v)snprintf vs sprintf.
2861 
2862  // DR 1261.
2863  inline string
2864  to_string(int __val)
2865  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int),
2866  "%d", __val); }
2867 
2868  inline string
2869  to_string(unsigned __val)
2870  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
2871  4 * sizeof(unsigned),
2872  "%u", __val); }
2873 
2874  inline string
2875  to_string(long __val)
2876  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long),
2877  "%ld", __val); }
2878 
2879  inline string
2880  to_string(unsigned long __val)
2881  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
2882  4 * sizeof(unsigned long),
2883  "%lu", __val); }
2884 
2885  inline string
2886  to_string(long long __val)
2887  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
2888  4 * sizeof(long long),
2889  "%lld", __val); }
2890 
2891  inline string
2892  to_string(unsigned long long __val)
2893  { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
2894  4 * sizeof(unsigned long long),
2895  "%llu", __val); }
2896 
2897  inline string
2898  to_string(float __val)
2899  {
2900  const int __n =
2901  __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
2902  return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
2903  "%f", __val);
2904  }
2905 
2906  inline string
2907  to_string(double __val)
2908  {
2909  const int __n =
2910  __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
2911  return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
2912  "%f", __val);
2913  }
2914 
2915  inline string
2916  to_string(long double __val)
2917  {
2918  const int __n =
2919  __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
2920  return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, __n,
2921  "%Lf", __val);
2922  }
2923 
2924 #ifdef _GLIBCXX_USE_WCHAR_T
2925  inline int
2926  stoi(const wstring& __str, size_t* __idx = 0, int __base = 10)
2927  { return __gnu_cxx::__stoa<long, int>(&std::wcstol, "stoi", __str.c_str(),
2928  __idx, __base); }
2929 
2930  inline long
2931  stol(const wstring& __str, size_t* __idx = 0, int __base = 10)
2932  { return __gnu_cxx::__stoa(&std::wcstol, "stol", __str.c_str(),
2933  __idx, __base); }
2934 
2935  inline unsigned long
2936  stoul(const wstring& __str, size_t* __idx = 0, int __base = 10)
2937  { return __gnu_cxx::__stoa(&std::wcstoul, "stoul", __str.c_str(),
2938  __idx, __base); }
2939 
2940  inline long long
2941  stoll(const wstring& __str, size_t* __idx = 0, int __base = 10)
2942  { return __gnu_cxx::__stoa(&std::wcstoll, "stoll", __str.c_str(),
2943  __idx, __base); }
2944 
2945  inline unsigned long long
2946  stoull(const wstring& __str, size_t* __idx = 0, int __base = 10)
2947  { return __gnu_cxx::__stoa(&std::wcstoull, "stoull", __str.c_str(),
2948  __idx, __base); }
2949 
2950  // NB: wcstof vs wcstod.
2951  inline float
2952  stof(const wstring& __str, size_t* __idx = 0)
2953  { return __gnu_cxx::__stoa(&std::wcstof, "stof", __str.c_str(), __idx); }
2954 
2955  inline double
2956  stod(const wstring& __str, size_t* __idx = 0)
2957  { return __gnu_cxx::__stoa(&std::wcstod, "stod", __str.c_str(), __idx); }
2958 
2959  inline long double
2960  stold(const wstring& __str, size_t* __idx = 0)
2961  { return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
2962 
2963  // DR 1261.
2964  inline wstring
2965  to_wstring(int __val)
2966  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(int),
2967  L"%d", __val); }
2968 
2969  inline wstring
2970  to_wstring(unsigned __val)
2971  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
2972  4 * sizeof(unsigned),
2973  L"%u", __val); }
2974 
2975  inline wstring
2976  to_wstring(long __val)
2977  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(long),
2978  L"%ld", __val); }
2979 
2980  inline wstring
2981  to_wstring(unsigned long __val)
2982  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
2983  4 * sizeof(unsigned long),
2984  L"%lu", __val); }
2985 
2986  inline wstring
2987  to_wstring(long long __val)
2988  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
2989  4 * sizeof(long long),
2990  L"%lld", __val); }
2991 
2992  inline wstring
2993  to_wstring(unsigned long long __val)
2994  { return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf,
2995  4 * sizeof(unsigned long long),
2996  L"%llu", __val); }
2997 
2998  inline wstring
2999  to_wstring(float __val)
3000  {
3001  const int __n =
3002  __gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20;
3003  return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
3004  L"%f", __val);
3005  }
3006 
3007  inline wstring
3008  to_wstring(double __val)
3009  {
3010  const int __n =
3011  __gnu_cxx::__numeric_traits<double>::__max_exponent10 + 20;
3012  return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
3013  L"%f", __val);
3014  }
3015 
3016  inline wstring
3017  to_wstring(long double __val)
3018  {
3019  const int __n =
3020  __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 20;
3021  return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, __n,
3022  L"%Lf", __val);
3023  }
3024 #endif
3025 
3026 _GLIBCXX_END_NAMESPACE_VERSION
3027 } // namespace
3028 
3029 #endif /* C++11 && _GLIBCXX_USE_C99 ... */
3030 
3031 #if __cplusplus >= 201103L
3032 
3033 #include <bits/functional_hash.h>
3034 
3035 namespace std _GLIBCXX_VISIBILITY(default)
3036 {
3037 _GLIBCXX_BEGIN_NAMESPACE_VERSION
3038 
3039  // DR 1182.
3040 
3041 #ifndef _GLIBCXX_COMPATIBILITY_CXX0X
3042  template<>
3044  struct hash<string>
3045  : public __hash_base<size_t, string>
3046  {
3047  size_t
3048  operator()(const string& __s) const noexcept
3049  { return std::_Hash_impl::hash(__s.data(), __s.length()); }
3050  };
3051 
3052  template<>
3053  struct __is_fast_hash<hash<string>> : std::false_type
3054  { };
3055 
3056 #ifdef _GLIBCXX_USE_WCHAR_T
3057  template<>
3059  struct hash<wstring>
3060  : public __hash_base<size_t, wstring>
3061  {
3062  size_t
3063  operator()(const wstring& __s) const noexcept
3064  { return std::_Hash_impl::hash(__s.data(),
3065  __s.length() * sizeof(wchar_t)); }
3066  };
3067 
3068  template<>
3069  struct __is_fast_hash<hash<wstring>> : std::false_type
3070  { };
3071 #endif
3072 #endif /* _GLIBCXX_COMPATIBILITY_CXX0X */
3073 
3074 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
3075  template<>
3077  struct hash<u16string>
3078  : public __hash_base<size_t, u16string>
3079  {
3080  size_t
3081  operator()(const u16string& __s) const noexcept
3082  { return std::_Hash_impl::hash(__s.data(),
3083  __s.length() * sizeof(char16_t)); }
3084  };
3085 
3086  template<>
3087  struct __is_fast_hash<hash<u16string>> : std::false_type
3088  { };
3089 
3091  template<>
3092  struct hash<u32string>
3093  : public __hash_base<size_t, u32string>
3094  {
3095  size_t
3096  operator()(const u32string& __s) const noexcept
3097  { return std::_Hash_impl::hash(__s.data(),
3098  __s.length() * sizeof(char32_t)); }
3099  };
3100 
3101  template<>
3102  struct __is_fast_hash<hash<u32string>> : std::false_type
3103  { };
3104 #endif
3105 
3106 _GLIBCXX_END_NAMESPACE_VERSION
3107 } // namespace
3108 
3109 #endif // C++11
3110 
3111 #endif /* _BASIC_STRING_H */
bool operator>=(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:644
_Siter_base< _Iterator >::iterator_type __base(_Iterator __it)
Definition: functions.h:446
bool operator==(const exception_ptr &, const exception_ptr &) _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__))
std::size_t __size(__stack_t __stack)
Definition: profiler_node.h:68
#define __try
Definition: exception_defines.h:35
bool operator<=(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:580
#define _GLIBCXX_DEBUG_ASSERT(_Condition)
Definition: debug.h:61
#define __glibcxx_requires_string(_String)
Definition: debug.h:78
bool operator<(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:548
basic_string< char > string
Definition: string:1153
const _Tp & min(const _Tp &__a, const _Tp &__b)
Equivalent to std::min.
Definition: base.h:144
std::basic_istream< _CharT, _Traits > & operator>>(std::basic_istream< _CharT, _Traits > &__is, basic_string< _CharT, _Traits, _Allocator > &__str)
Definition: string:1122
namespace std _GLIBCXX_VISIBILITY(default)
Definition: auto_ptr.h:36
_Safe_iterator< _Iterator, _Sequence > operator+(typename _Safe_iterator< _Iterator, _Sequence >::difference_type __n, const _Safe_iterator< _Iterator, _Sequence > &__i)
Definition: safe_iterator.h:712
bool operator>(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:612
#define _GLIBCXX_DEBUG_PEDASSERT(_Condition)
Definition: debug.h:62
bool operator!=(const exception_ptr &, const exception_ptr &) _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__))
__WCHAR_TYPE__ wchar_t
Definition: stddef.h:324
std::basic_istream< _CharT, _Traits > & getline(std::basic_istream< _CharT, _Traits > &__is, basic_string< _CharT, _Traits, _Allocator > &__str, _CharT __delim)
Definition: string:1132
#define __catch(X)
Definition: exception_defines.h:36
Definition: basic_string.h:45
#define __glibcxx_requires_valid_range(_First, _Last)
Definition: debug.h:65
void swap(exception_ptr &__lhs, exception_ptr &__rhs)
Definition: exception_ptr.h:160
std::tr1::integral_constant< int, 0 > false_type
Definition: type_utils.hpp:71