2 //===--------------------------- string -----------------------------------===//
4 // The LLVM Compiler Infrastructure
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
9 //===----------------------------------------------------------------------===//
11 #ifndef _LIBCPP_STRING
12 #define _LIBCPP_STRING
20 template <class stateT>
26 fpos(streamoff = streamoff());
28 operator streamoff() const;
33 fpos& operator+=(streamoff);
34 fpos operator+ (streamoff) const;
35 fpos& operator-=(streamoff);
36 fpos operator- (streamoff) const;
39 template <class stateT> streamoff operator-(const fpos<stateT>& x, const fpos<stateT>& y);
41 template <class stateT> bool operator==(const fpos<stateT>& x, const fpos<stateT>& y);
42 template <class stateT> bool operator!=(const fpos<stateT>& x, const fpos<stateT>& y);
44 template <class charT>
47 typedef charT char_type;
49 typedef streamoff off_type;
50 typedef streampos pos_type;
51 typedef mbstate_t state_type;
53 static void assign(char_type& c1, const char_type& c2) noexcept;
54 static constexpr bool eq(char_type c1, char_type c2) noexcept;
55 static constexpr bool lt(char_type c1, char_type c2) noexcept;
57 static int compare(const char_type* s1, const char_type* s2, size_t n);
58 static size_t length(const char_type* s);
59 static const char_type* find(const char_type* s, size_t n, const char_type& a);
60 static char_type* move(char_type* s1, const char_type* s2, size_t n);
61 static char_type* copy(char_type* s1, const char_type* s2, size_t n);
62 static char_type* assign(char_type* s, size_t n, char_type a);
64 static constexpr int_type not_eof(int_type c) noexcept;
65 static constexpr char_type to_char_type(int_type c) noexcept;
66 static constexpr int_type to_int_type(char_type c) noexcept;
67 static constexpr bool eq_int_type(int_type c1, int_type c2) noexcept;
68 static constexpr int_type eof() noexcept;
71 template <> struct char_traits<char>;
72 template <> struct char_traits<wchar_t>;
74 template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
79 typedef traits traits_type;
80 typedef typename traits_type::char_type value_type;
81 typedef Allocator allocator_type;
82 typedef typename allocator_type::size_type size_type;
83 typedef typename allocator_type::difference_type difference_type;
84 typedef typename allocator_type::reference reference;
85 typedef typename allocator_type::const_reference const_reference;
86 typedef typename allocator_type::pointer pointer;
87 typedef typename allocator_type::const_pointer const_pointer;
88 typedef implementation-defined iterator;
89 typedef implementation-defined const_iterator;
90 typedef std::reverse_iterator<iterator> reverse_iterator;
91 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
93 static const size_type npos = -1;
96 noexcept(is_nothrow_default_constructible<allocator_type>::value);
97 explicit basic_string(const allocator_type& a);
98 basic_string(const basic_string& str);
99 basic_string(basic_string&& str)
100 noexcept(is_nothrow_move_constructible<allocator_type>::value);
101 basic_string(const basic_string& str, size_type pos, size_type n = npos,
102 const allocator_type& a = allocator_type());
103 basic_string(const value_type* s, const allocator_type& a = allocator_type());
104 basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type());
105 basic_string(size_type n, value_type c, const allocator_type& a = allocator_type());
106 template<class InputIterator>
107 basic_string(InputIterator begin, InputIterator end,
108 const allocator_type& a = allocator_type());
109 basic_string(initializer_list<value_type>, const Allocator& = Allocator());
110 basic_string(const basic_string&, const Allocator&);
111 basic_string(basic_string&&, const Allocator&);
115 basic_string& operator=(const basic_string& str);
116 basic_string& operator=(basic_string&& str)
118 allocator_type::propagate_on_container_move_assignment::value ||
119 allocator_type::is_always_equal::value ); // C++17
120 basic_string& operator=(const value_type* s);
121 basic_string& operator=(value_type c);
122 basic_string& operator=(initializer_list<value_type>);
124 iterator begin() noexcept;
125 const_iterator begin() const noexcept;
126 iterator end() noexcept;
127 const_iterator end() const noexcept;
129 reverse_iterator rbegin() noexcept;
130 const_reverse_iterator rbegin() const noexcept;
131 reverse_iterator rend() noexcept;
132 const_reverse_iterator rend() const noexcept;
134 const_iterator cbegin() const noexcept;
135 const_iterator cend() const noexcept;
136 const_reverse_iterator crbegin() const noexcept;
137 const_reverse_iterator crend() const noexcept;
139 size_type size() const noexcept;
140 size_type length() const noexcept;
141 size_type max_size() const noexcept;
142 size_type capacity() const noexcept;
144 void resize(size_type n, value_type c);
145 void resize(size_type n);
147 void reserve(size_type res_arg = 0);
148 void shrink_to_fit();
149 void clear() noexcept;
150 bool empty() const noexcept;
152 const_reference operator[](size_type pos) const;
153 reference operator[](size_type pos);
155 const_reference at(size_type n) const;
156 reference at(size_type n);
158 basic_string& operator+=(const basic_string& str);
159 basic_string& operator+=(const value_type* s);
160 basic_string& operator+=(value_type c);
161 basic_string& operator+=(initializer_list<value_type>);
163 basic_string& append(const basic_string& str);
164 basic_string& append(const basic_string& str, size_type pos, size_type n=npos); //C++14
165 basic_string& append(const value_type* s, size_type n);
166 basic_string& append(const value_type* s);
167 basic_string& append(size_type n, value_type c);
168 template<class InputIterator>
169 basic_string& append(InputIterator first, InputIterator last);
170 basic_string& append(initializer_list<value_type>);
172 void push_back(value_type c);
175 const_reference front() const;
177 const_reference back() const;
179 basic_string& assign(const basic_string& str);
180 basic_string& assign(basic_string&& str);
181 basic_string& assign(const basic_string& str, size_type pos, size_type n=npos); // C++14
182 basic_string& assign(const value_type* s, size_type n);
183 basic_string& assign(const value_type* s);
184 basic_string& assign(size_type n, value_type c);
185 template<class InputIterator>
186 basic_string& assign(InputIterator first, InputIterator last);
187 basic_string& assign(initializer_list<value_type>);
189 basic_string& insert(size_type pos1, const basic_string& str);
190 basic_string& insert(size_type pos1, const basic_string& str,
191 size_type pos2, size_type n);
192 basic_string& insert(size_type pos, const value_type* s, size_type n=npos); //C++14
193 basic_string& insert(size_type pos, const value_type* s);
194 basic_string& insert(size_type pos, size_type n, value_type c);
195 iterator insert(const_iterator p, value_type c);
196 iterator insert(const_iterator p, size_type n, value_type c);
197 template<class InputIterator>
198 iterator insert(const_iterator p, InputIterator first, InputIterator last);
199 iterator insert(const_iterator p, initializer_list<value_type>);
201 basic_string& erase(size_type pos = 0, size_type n = npos);
202 iterator erase(const_iterator position);
203 iterator erase(const_iterator first, const_iterator last);
205 basic_string& replace(size_type pos1, size_type n1, const basic_string& str);
206 basic_string& replace(size_type pos1, size_type n1, const basic_string& str,
207 size_type pos2, size_type n2=npos); // C++14
208 basic_string& replace(size_type pos, size_type n1, const value_type* s, size_type n2);
209 basic_string& replace(size_type pos, size_type n1, const value_type* s);
210 basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c);
211 basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str);
212 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n);
213 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s);
214 basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c);
215 template<class InputIterator>
216 basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
217 basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>);
219 size_type copy(value_type* s, size_type n, size_type pos = 0) const;
220 basic_string substr(size_type pos = 0, size_type n = npos) const;
222 void swap(basic_string& str)
223 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
224 allocator_traits<allocator_type>::is_always_equal::value); // C++17
226 const value_type* c_str() const noexcept;
227 const value_type* data() const noexcept;
229 allocator_type get_allocator() const noexcept;
231 size_type find(const basic_string& str, size_type pos = 0) const noexcept;
232 size_type find(const value_type* s, size_type pos, size_type n) const noexcept;
233 size_type find(const value_type* s, size_type pos = 0) const noexcept;
234 size_type find(value_type c, size_type pos = 0) const noexcept;
236 size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
237 size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept;
238 size_type rfind(const value_type* s, size_type pos = npos) const noexcept;
239 size_type rfind(value_type c, size_type pos = npos) const noexcept;
241 size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
242 size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept;
243 size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept;
244 size_type find_first_of(value_type c, size_type pos = 0) const noexcept;
246 size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept;
247 size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept;
248 size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept;
249 size_type find_last_of(value_type c, size_type pos = npos) const noexcept;
251 size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;
252 size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
253 size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept;
254 size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept;
256 size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept;
257 size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
258 size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept;
259 size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept;
261 int compare(const basic_string& str) const noexcept;
262 int compare(size_type pos1, size_type n1, const basic_string& str) const;
263 int compare(size_type pos1, size_type n1, const basic_string& str,
264 size_type pos2, size_type n2=npos) const; // C++14
265 int compare(const value_type* s) const noexcept;
266 int compare(size_type pos1, size_type n1, const value_type* s) const;
267 int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const;
269 bool __invariants() const;
272 template<class charT, class traits, class Allocator>
273 basic_string<charT, traits, Allocator>
274 operator+(const basic_string<charT, traits, Allocator>& lhs,
275 const basic_string<charT, traits, Allocator>& rhs);
277 template<class charT, class traits, class Allocator>
278 basic_string<charT, traits, Allocator>
279 operator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs);
281 template<class charT, class traits, class Allocator>
282 basic_string<charT, traits, Allocator>
283 operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs);
285 template<class charT, class traits, class Allocator>
286 basic_string<charT, traits, Allocator>
287 operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
289 template<class charT, class traits, class Allocator>
290 basic_string<charT, traits, Allocator>
291 operator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs);
293 template<class charT, class traits, class Allocator>
294 bool operator==(const basic_string<charT, traits, Allocator>& lhs,
295 const basic_string<charT, traits, Allocator>& rhs) noexcept;
297 template<class charT, class traits, class Allocator>
298 bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
300 template<class charT, class traits, class Allocator>
301 bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept;
303 template<class charT, class traits, class Allocator>
304 bool operator!=(const basic_string<charT,traits,Allocator>& lhs,
305 const basic_string<charT, traits, Allocator>& rhs) noexcept;
307 template<class charT, class traits, class Allocator>
308 bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
310 template<class charT, class traits, class Allocator>
311 bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
313 template<class charT, class traits, class Allocator>
314 bool operator< (const basic_string<charT, traits, Allocator>& lhs,
315 const basic_string<charT, traits, Allocator>& rhs) noexcept;
317 template<class charT, class traits, class Allocator>
318 bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
320 template<class charT, class traits, class Allocator>
321 bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
323 template<class charT, class traits, class Allocator>
324 bool operator> (const basic_string<charT, traits, Allocator>& lhs,
325 const basic_string<charT, traits, Allocator>& rhs) noexcept;
327 template<class charT, class traits, class Allocator>
328 bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
330 template<class charT, class traits, class Allocator>
331 bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
333 template<class charT, class traits, class Allocator>
334 bool operator<=(const basic_string<charT, traits, Allocator>& lhs,
335 const basic_string<charT, traits, Allocator>& rhs) noexcept;
337 template<class charT, class traits, class Allocator>
338 bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
340 template<class charT, class traits, class Allocator>
341 bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
343 template<class charT, class traits, class Allocator>
344 bool operator>=(const basic_string<charT, traits, Allocator>& lhs,
345 const basic_string<charT, traits, Allocator>& rhs) noexcept;
347 template<class charT, class traits, class Allocator>
348 bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
350 template<class charT, class traits, class Allocator>
351 bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
353 template<class charT, class traits, class Allocator>
354 void swap(basic_string<charT, traits, Allocator>& lhs,
355 basic_string<charT, traits, Allocator>& rhs)
356 noexcept(noexcept(lhs.swap(rhs)));
358 template<class charT, class traits, class Allocator>
359 basic_istream<charT, traits>&
360 operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
362 template<class charT, class traits, class Allocator>
363 basic_ostream<charT, traits>&
364 operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
366 template<class charT, class traits, class Allocator>
367 basic_istream<charT, traits>&
368 getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str,
371 template<class charT, class traits, class Allocator>
372 basic_istream<charT, traits>&
373 getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
375 typedef basic_string<char> string;
376 typedef basic_string<wchar_t> wstring;
377 typedef basic_string<char16_t> u16string;
378 typedef basic_string<char32_t> u32string;
380 int stoi (const string& str, size_t* idx = 0, int base = 10);
381 long stol (const string& str, size_t* idx = 0, int base = 10);
382 unsigned long stoul (const string& str, size_t* idx = 0, int base = 10);
383 long long stoll (const string& str, size_t* idx = 0, int base = 10);
384 unsigned long long stoull(const string& str, size_t* idx = 0, int base = 10);
386 float stof (const string& str, size_t* idx = 0);
387 double stod (const string& str, size_t* idx = 0);
388 long double stold(const string& str, size_t* idx = 0);
390 string to_string(int val);
391 string to_string(unsigned val);
392 string to_string(long val);
393 string to_string(unsigned long val);
394 string to_string(long long val);
395 string to_string(unsigned long long val);
396 string to_string(float val);
397 string to_string(double val);
398 string to_string(long double val);
400 int stoi (const wstring& str, size_t* idx = 0, int base = 10);
401 long stol (const wstring& str, size_t* idx = 0, int base = 10);
402 unsigned long stoul (const wstring& str, size_t* idx = 0, int base = 10);
403 long long stoll (const wstring& str, size_t* idx = 0, int base = 10);
404 unsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10);
406 float stof (const wstring& str, size_t* idx = 0);
407 double stod (const wstring& str, size_t* idx = 0);
408 long double stold(const wstring& str, size_t* idx = 0);
410 wstring to_wstring(int val);
411 wstring to_wstring(unsigned val);
412 wstring to_wstring(long val);
413 wstring to_wstring(unsigned long val);
414 wstring to_wstring(long long val);
415 wstring to_wstring(unsigned long long val);
416 wstring to_wstring(float val);
417 wstring to_wstring(double val);
418 wstring to_wstring(long double val);
420 template <> struct hash<string>;
421 template <> struct hash<u16string>;
422 template <> struct hash<u32string>;
423 template <> struct hash<wstring>;
425 basic_string<char> operator "" s( const char *str, size_t len ); // C++14
426 basic_string<wchar_t> operator "" s( const wchar_t *str, size_t len ); // C++14
427 basic_string<char16_t> operator "" s( const char16_t *str, size_t len ); // C++14
428 basic_string<char32_t> operator "" s( const char32_t *str, size_t len ); // C++14
437 #include <cstdio> // For EOF.
444 #include <type_traits>
445 #include <initializer_list>
446 #include <__functional_base>
447 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
450 #if defined(_LIBCPP_NO_EXCEPTIONS)
454 #include <__undef_min_max>
458 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
459 #pragma GCC system_header
462 _LIBCPP_BEGIN_NAMESPACE_STD
466 template <class _StateT>
467 class _LIBCPP_TYPE_VIS_ONLY fpos
473 _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {}
475 _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;}
477 _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;}
478 _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;}
480 _LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;}
481 _LIBCPP_INLINE_VISIBILITY fpos operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;}
482 _LIBCPP_INLINE_VISIBILITY fpos& operator-=(streamoff __off) {__off_ -= __off; return *this;}
483 _LIBCPP_INLINE_VISIBILITY fpos operator- (streamoff __off) const {fpos __t(*this); __t -= __off; return __t;}
486 template <class _StateT>
487 inline _LIBCPP_INLINE_VISIBILITY
488 streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
489 {return streamoff(__x) - streamoff(__y);}
491 template <class _StateT>
492 inline _LIBCPP_INLINE_VISIBILITY
493 bool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
494 {return streamoff(__x) == streamoff(__y);}
496 template <class _StateT>
497 inline _LIBCPP_INLINE_VISIBILITY
498 bool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
499 {return streamoff(__x) != streamoff(__y);}
503 template <class _CharT>
504 struct _LIBCPP_TYPE_VIS_ONLY char_traits
506 typedef _CharT char_type;
507 typedef int int_type;
508 typedef streamoff off_type;
509 typedef streampos pos_type;
510 typedef mbstate_t state_type;
512 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
514 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
515 {return __c1 == __c2;}
516 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
517 {return __c1 < __c2;}
519 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
520 _LIBCPP_INLINE_VISIBILITY
521 static size_t length(const char_type* __s);
522 _LIBCPP_INLINE_VISIBILITY
523 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
524 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
525 _LIBCPP_INLINE_VISIBILITY
526 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
527 _LIBCPP_INLINE_VISIBILITY
528 static char_type* assign(char_type* __s, size_t __n, char_type __a);
530 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
531 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
532 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
533 {return char_type(__c);}
534 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
535 {return int_type(__c);}
536 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
537 {return __c1 == __c2;}
538 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
539 {return int_type(EOF);}
542 template <class _CharT>
544 char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
546 for (; __n; --__n, ++__s1, ++__s2)
548 if (lt(*__s1, *__s2))
550 if (lt(*__s2, *__s1))
556 template <class _CharT>
559 char_traits<_CharT>::length(const char_type* __s)
562 for (; !eq(*__s, char_type(0)); ++__s)
567 template <class _CharT>
570 char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a)
581 template <class _CharT>
583 char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n)
585 char_type* __r = __s1;
588 for (; __n; --__n, ++__s1, ++__s2)
589 assign(*__s1, *__s2);
591 else if (__s2 < __s1)
596 assign(*--__s1, *--__s2);
601 template <class _CharT>
604 char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
606 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
607 char_type* __r = __s1;
608 for (; __n; --__n, ++__s1, ++__s2)
609 assign(*__s1, *__s2);
613 template <class _CharT>
616 char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a)
618 char_type* __r = __s;
619 for (; __n; --__n, ++__s)
627 struct _LIBCPP_TYPE_VIS_ONLY char_traits<char>
629 typedef char char_type;
630 typedef int int_type;
631 typedef streamoff off_type;
632 typedef streampos pos_type;
633 typedef mbstate_t state_type;
635 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
637 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
638 {return __c1 == __c2;}
639 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
640 {return (unsigned char)__c1 < (unsigned char)__c2;}
642 static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
643 {return __n == 0 ? 0 : memcmp(__s1, __s2, __n);}
644 static inline size_t length(const char_type* __s) {return strlen(__s);}
645 static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
646 {return __n == 0 ? NULL : (const char_type*) memchr(__s, to_int_type(__a), __n);}
647 static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
648 {return __n == 0 ? __s1 : (char_type*) memmove(__s1, __s2, __n);}
649 static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
651 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
652 return __n == 0 ? __s1 : (char_type*)memcpy(__s1, __s2, __n);
654 static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
655 {return __n == 0 ? __s : (char_type*)memset(__s, to_int_type(__a), __n);}
657 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
658 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
659 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
660 {return char_type(__c);}
661 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
662 {return int_type((unsigned char)__c);}
663 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
664 {return __c1 == __c2;}
665 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
666 {return int_type(EOF);}
669 // char_traits<wchar_t>
672 struct _LIBCPP_TYPE_VIS_ONLY char_traits<wchar_t>
674 typedef wchar_t char_type;
675 typedef wint_t int_type;
676 typedef streamoff off_type;
677 typedef streampos pos_type;
678 typedef mbstate_t state_type;
680 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
682 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
683 {return __c1 == __c2;}
684 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
685 {return __c1 < __c2;}
687 static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
688 {return __n == 0 ? 0 : wmemcmp(__s1, __s2, __n);}
689 static inline size_t length(const char_type* __s)
690 {return wcslen(__s);}
691 static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
692 {return __n == 0 ? NULL : (const char_type*)wmemchr(__s, __a, __n);}
693 static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
694 {return __n == 0 ? __s1 : (char_type*)wmemmove(__s1, __s2, __n);}
695 static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
697 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
698 return __n == 0 ? __s1 : (char_type*)wmemcpy(__s1, __s2, __n);
700 static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
701 {return __n == 0 ? __s : (char_type*)wmemset(__s, __a, __n);}
703 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
704 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
705 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
706 {return char_type(__c);}
707 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
708 {return int_type(__c);}
709 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
710 {return __c1 == __c2;}
711 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
712 {return int_type(WEOF);}
715 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
718 struct _LIBCPP_TYPE_VIS_ONLY char_traits<char16_t>
720 typedef char16_t char_type;
721 typedef uint_least16_t int_type;
722 typedef streamoff off_type;
723 typedef u16streampos pos_type;
724 typedef mbstate_t state_type;
726 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
728 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
729 {return __c1 == __c2;}
730 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
731 {return __c1 < __c2;}
733 _LIBCPP_INLINE_VISIBILITY
734 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
735 _LIBCPP_INLINE_VISIBILITY
736 static size_t length(const char_type* __s);
737 _LIBCPP_INLINE_VISIBILITY
738 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
739 _LIBCPP_INLINE_VISIBILITY
740 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
741 _LIBCPP_INLINE_VISIBILITY
742 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
743 _LIBCPP_INLINE_VISIBILITY
744 static char_type* assign(char_type* __s, size_t __n, char_type __a);
746 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
747 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
748 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
749 {return char_type(__c);}
750 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
751 {return int_type(__c);}
752 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
753 {return __c1 == __c2;}
754 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
755 {return int_type(0xFFFF);}
760 char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
762 for (; __n; --__n, ++__s1, ++__s2)
764 if (lt(*__s1, *__s2))
766 if (lt(*__s2, *__s1))
774 char_traits<char16_t>::length(const char_type* __s)
777 for (; !eq(*__s, char_type(0)); ++__s)
784 char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a)
797 char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
799 char_type* __r = __s1;
802 for (; __n; --__n, ++__s1, ++__s2)
803 assign(*__s1, *__s2);
805 else if (__s2 < __s1)
810 assign(*--__s1, *--__s2);
817 char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
819 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
820 char_type* __r = __s1;
821 for (; __n; --__n, ++__s1, ++__s2)
822 assign(*__s1, *__s2);
828 char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a)
830 char_type* __r = __s;
831 for (; __n; --__n, ++__s)
837 struct _LIBCPP_TYPE_VIS_ONLY char_traits<char32_t>
839 typedef char32_t char_type;
840 typedef uint_least32_t int_type;
841 typedef streamoff off_type;
842 typedef u32streampos pos_type;
843 typedef mbstate_t state_type;
845 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
847 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
848 {return __c1 == __c2;}
849 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
850 {return __c1 < __c2;}
852 _LIBCPP_INLINE_VISIBILITY
853 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
854 _LIBCPP_INLINE_VISIBILITY
855 static size_t length(const char_type* __s);
856 _LIBCPP_INLINE_VISIBILITY
857 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
858 _LIBCPP_INLINE_VISIBILITY
859 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
860 _LIBCPP_INLINE_VISIBILITY
861 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
862 _LIBCPP_INLINE_VISIBILITY
863 static char_type* assign(char_type* __s, size_t __n, char_type __a);
865 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
866 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
867 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
868 {return char_type(__c);}
869 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
870 {return int_type(__c);}
871 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
872 {return __c1 == __c2;}
873 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
874 {return int_type(0xFFFFFFFF);}
879 char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
881 for (; __n; --__n, ++__s1, ++__s2)
883 if (lt(*__s1, *__s2))
885 if (lt(*__s2, *__s1))
893 char_traits<char32_t>::length(const char_type* __s)
896 for (; !eq(*__s, char_type(0)); ++__s)
903 char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a)
916 char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
918 char_type* __r = __s1;
921 for (; __n; --__n, ++__s1, ++__s2)
922 assign(*__s1, *__s2);
924 else if (__s2 < __s1)
929 assign(*--__s1, *--__s2);
936 char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
938 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
939 char_type* __r = __s1;
940 for (; __n; --__n, ++__s1, ++__s2)
941 assign(*__s1, *__s2);
947 char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a)
949 char_type* __r = __s;
950 for (; __n; --__n, ++__s)
955 #endif // _LIBCPP_HAS_NO_UNICODE_CHARS
957 // helper fns for basic_string
960 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
961 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
962 __str_find(const _CharT *__p, _SizeT __sz,
963 _CharT __c, _SizeT __pos) _NOEXCEPT
967 const _CharT* __r = _Traits::find(__p + __pos, __sz - __pos, __c);
970 return static_cast<_SizeT>(__r - __p);
973 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
974 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
975 __str_find(const _CharT *__p, _SizeT __sz,
976 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
978 if (__pos > __sz || __sz - __pos < __n)
983 _VSTD::__search(__p + __pos, __p + __sz,
984 __s, __s + __n, _Traits::eq,
985 random_access_iterator_tag(), random_access_iterator_tag());
986 if (__r == __p + __sz)
988 return static_cast<_SizeT>(__r - __p);
994 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
995 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
996 __str_rfind(const _CharT *__p, _SizeT __sz,
997 _CharT __c, _SizeT __pos) _NOEXCEPT
1005 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1007 if (_Traits::eq(*--__ps, __c))
1008 return static_cast<_SizeT>(__ps - __p);
1013 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1014 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1015 __str_rfind(const _CharT *__p, _SizeT __sz,
1016 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1018 __pos = _VSTD::min(__pos, __sz);
1019 if (__n < __sz - __pos)
1023 const _CharT* __r = _VSTD::__find_end(
1024 __p, __p + __pos, __s, __s + __n, _Traits::eq,
1025 random_access_iterator_tag(), random_access_iterator_tag());
1026 if (__n > 0 && __r == __p + __pos)
1028 return static_cast<_SizeT>(__r - __p);
1031 // __str_find_first_of
1032 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1033 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1034 __str_find_first_of(const _CharT *__p, _SizeT __sz,
1035 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1037 if (__pos >= __sz || __n == 0)
1039 const _CharT* __r = _VSTD::__find_first_of_ce
1040 (__p + __pos, __p + __sz, __s, __s + __n, _Traits::eq );
1041 if (__r == __p + __sz)
1043 return static_cast<_SizeT>(__r - __p);
1047 // __str_find_last_of
1048 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1049 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1050 __str_find_last_of(const _CharT *__p, _SizeT __sz,
1051 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1059 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1061 const _CharT* __r = _Traits::find(__s, __n, *--__ps);
1063 return static_cast<_SizeT>(__ps - __p);
1070 // __str_find_first_not_of
1071 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1072 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1073 __str_find_first_not_of(const _CharT *__p, _SizeT __sz,
1074 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1078 const _CharT* __pe = __p + __sz;
1079 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1080 if (_Traits::find(__s, __n, *__ps) == 0)
1081 return static_cast<_SizeT>(__ps - __p);
1087 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1088 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1089 __str_find_first_not_of(const _CharT *__p, _SizeT __sz,
1090 _CharT __c, _SizeT __pos) _NOEXCEPT
1094 const _CharT* __pe = __p + __sz;
1095 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1096 if (!_Traits::eq(*__ps, __c))
1097 return static_cast<_SizeT>(__ps - __p);
1103 // __str_find_last_not_of
1104 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1105 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1106 __str_find_last_not_of(const _CharT *__p, _SizeT __sz,
1107 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1113 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1114 if (_Traits::find(__s, __n, *--__ps) == 0)
1115 return static_cast<_SizeT>(__ps - __p);
1120 template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1121 _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
1122 __str_find_last_not_of(const _CharT *__p, _SizeT __sz,
1123 _CharT __c, _SizeT __pos) _NOEXCEPT
1129 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1130 if (!_Traits::eq(*--__ps, __c))
1131 return static_cast<_SizeT>(__ps - __p);
1135 template<class _Ptr>
1136 size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e)
1138 typedef typename iterator_traits<_Ptr>::value_type value_type;
1139 return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type));
1144 template<class _CharT, class _Traits, class _Allocator>
1145 basic_string<_CharT, _Traits, _Allocator>
1146 operator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
1147 const basic_string<_CharT, _Traits, _Allocator>& __y);
1149 template<class _CharT, class _Traits, class _Allocator>
1150 basic_string<_CharT, _Traits, _Allocator>
1151 operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
1153 template<class _CharT, class _Traits, class _Allocator>
1154 basic_string<_CharT, _Traits, _Allocator>
1155 operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
1157 template<class _CharT, class _Traits, class _Allocator>
1158 basic_string<_CharT, _Traits, _Allocator>
1159 operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
1161 template<class _CharT, class _Traits, class _Allocator>
1162 basic_string<_CharT, _Traits, _Allocator>
1163 operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
1166 class _LIBCPP_TYPE_VIS_ONLY __basic_string_common
1169 void __throw_length_error() const;
1170 void __throw_out_of_range() const;
1175 __basic_string_common<__b>::__throw_length_error() const
1177 #ifndef _LIBCPP_NO_EXCEPTIONS
1178 throw length_error("basic_string");
1180 assert(!"basic_string length_error");
1186 __basic_string_common<__b>::__throw_out_of_range() const
1188 #ifndef _LIBCPP_NO_EXCEPTIONS
1189 throw out_of_range("basic_string");
1191 assert(!"basic_string out_of_range");
1196 #pragma warning( push )
1197 #pragma warning( disable: 4231 )
1198 #endif // _LIBCPP_MSVC
1199 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS __basic_string_common<true>)
1201 #pragma warning( pop )
1202 #endif // _LIBCPP_MSVC
1204 #ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
1206 template <class _CharT, size_t = sizeof(_CharT)>
1209 unsigned char __xx[sizeof(_CharT)-1];
1212 template <class _CharT>
1213 struct __padding<_CharT, 1>
1217 #endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
1219 template<class _CharT, class _Traits, class _Allocator>
1220 class _LIBCPP_TYPE_VIS_ONLY basic_string
1221 : private __basic_string_common<true>
1224 typedef basic_string __self;
1225 typedef _Traits traits_type;
1226 typedef typename traits_type::char_type value_type;
1227 typedef _Allocator allocator_type;
1228 typedef allocator_traits<allocator_type> __alloc_traits;
1229 typedef typename __alloc_traits::size_type size_type;
1230 typedef typename __alloc_traits::difference_type difference_type;
1231 typedef value_type& reference;
1232 typedef const value_type& const_reference;
1233 typedef typename __alloc_traits::pointer pointer;
1234 typedef typename __alloc_traits::const_pointer const_pointer;
1236 static_assert(is_pod<value_type>::value, "Character type of basic_string must be a POD");
1237 static_assert((is_same<_CharT, value_type>::value),
1238 "traits_type::char_type must be the same type as CharT");
1239 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1240 "Allocator::value_type must be same type as value_type");
1241 #if defined(_LIBCPP_RAW_ITERATORS)
1242 typedef pointer iterator;
1243 typedef const_pointer const_iterator;
1244 #else // defined(_LIBCPP_RAW_ITERATORS)
1245 typedef __wrap_iter<pointer> iterator;
1246 typedef __wrap_iter<const_pointer> const_iterator;
1247 #endif // defined(_LIBCPP_RAW_ITERATORS)
1248 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1249 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
1253 #ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
1262 #if _LIBCPP_BIG_ENDIAN
1263 enum {__short_mask = 0x01};
1264 enum {__long_mask = 0x1ul};
1265 #else // _LIBCPP_BIG_ENDIAN
1266 enum {__short_mask = 0x80};
1267 enum {__long_mask = ~(size_type(~0) >> 1)};
1268 #endif // _LIBCPP_BIG_ENDIAN
1270 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1271 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1275 value_type __data_[__min_cap];
1277 : __padding<value_type>
1279 unsigned char __size_;
1292 #if _LIBCPP_BIG_ENDIAN
1293 enum {__short_mask = 0x80};
1294 enum {__long_mask = ~(size_type(~0) >> 1)};
1295 #else // _LIBCPP_BIG_ENDIAN
1296 enum {__short_mask = 0x01};
1297 enum {__long_mask = 0x1ul};
1298 #endif // _LIBCPP_BIG_ENDIAN
1300 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1301 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1307 unsigned char __size_;
1310 value_type __data_[__min_cap];
1313 #endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
1315 union __ulx{__long __lx; __short __lxx;};
1317 enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
1321 size_type __words[__n_words];
1334 __compressed_pair<__rep, allocator_type> __r_;
1337 static const size_type npos = -1;
1339 _LIBCPP_INLINE_VISIBILITY basic_string()
1340 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
1342 _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a)
1343 #if _LIBCPP_STD_VER <= 14
1344 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
1349 basic_string(const basic_string& __str);
1350 basic_string(const basic_string& __str, const allocator_type& __a);
1352 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1353 _LIBCPP_INLINE_VISIBILITY
1354 basic_string(basic_string&& __str)
1355 #if _LIBCPP_STD_VER <= 14
1356 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
1361 _LIBCPP_INLINE_VISIBILITY
1362 basic_string(basic_string&& __str, const allocator_type& __a);
1363 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1364 _LIBCPP_INLINE_VISIBILITY basic_string(const value_type* __s);
1365 _LIBCPP_INLINE_VISIBILITY
1366 basic_string(const value_type* __s, const allocator_type& __a);
1367 _LIBCPP_INLINE_VISIBILITY
1368 basic_string(const value_type* __s, size_type __n);
1369 _LIBCPP_INLINE_VISIBILITY
1370 basic_string(const value_type* __s, size_type __n, const allocator_type& __a);
1371 _LIBCPP_INLINE_VISIBILITY
1372 basic_string(size_type __n, value_type __c);
1373 _LIBCPP_INLINE_VISIBILITY
1374 basic_string(size_type __n, value_type __c, const allocator_type& __a);
1375 basic_string(const basic_string& __str, size_type __pos, size_type __n = npos,
1376 const allocator_type& __a = allocator_type());
1377 template<class _InputIterator>
1378 _LIBCPP_INLINE_VISIBILITY
1379 basic_string(_InputIterator __first, _InputIterator __last);
1380 template<class _InputIterator>
1381 _LIBCPP_INLINE_VISIBILITY
1382 basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);
1383 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1384 _LIBCPP_INLINE_VISIBILITY
1385 basic_string(initializer_list<value_type> __il);
1386 _LIBCPP_INLINE_VISIBILITY
1387 basic_string(initializer_list<value_type> __il, const allocator_type& __a);
1388 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1392 basic_string& operator=(const basic_string& __str);
1393 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1394 _LIBCPP_INLINE_VISIBILITY
1395 basic_string& operator=(basic_string&& __str)
1396 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
1398 _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);}
1399 basic_string& operator=(value_type __c);
1400 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1401 _LIBCPP_INLINE_VISIBILITY
1402 basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
1403 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1405 #if _LIBCPP_DEBUG_LEVEL >= 2
1406 _LIBCPP_INLINE_VISIBILITY
1407 iterator begin() _NOEXCEPT
1408 {return iterator(this, __get_pointer());}
1409 _LIBCPP_INLINE_VISIBILITY
1410 const_iterator begin() const _NOEXCEPT
1411 {return const_iterator(this, __get_pointer());}
1412 _LIBCPP_INLINE_VISIBILITY
1413 iterator end() _NOEXCEPT
1414 {return iterator(this, __get_pointer() + size());}
1415 _LIBCPP_INLINE_VISIBILITY
1416 const_iterator end() const _NOEXCEPT
1417 {return const_iterator(this, __get_pointer() + size());}
1419 _LIBCPP_INLINE_VISIBILITY
1420 iterator begin() _NOEXCEPT
1421 {return iterator(__get_pointer());}
1422 _LIBCPP_INLINE_VISIBILITY
1423 const_iterator begin() const _NOEXCEPT
1424 {return const_iterator(__get_pointer());}
1425 _LIBCPP_INLINE_VISIBILITY
1426 iterator end() _NOEXCEPT
1427 {return iterator(__get_pointer() + size());}
1428 _LIBCPP_INLINE_VISIBILITY
1429 const_iterator end() const _NOEXCEPT
1430 {return const_iterator(__get_pointer() + size());}
1431 #endif // _LIBCPP_DEBUG_LEVEL >= 2
1432 _LIBCPP_INLINE_VISIBILITY
1433 reverse_iterator rbegin() _NOEXCEPT
1434 {return reverse_iterator(end());}
1435 _LIBCPP_INLINE_VISIBILITY
1436 const_reverse_iterator rbegin() const _NOEXCEPT
1437 {return const_reverse_iterator(end());}
1438 _LIBCPP_INLINE_VISIBILITY
1439 reverse_iterator rend() _NOEXCEPT
1440 {return reverse_iterator(begin());}
1441 _LIBCPP_INLINE_VISIBILITY
1442 const_reverse_iterator rend() const _NOEXCEPT
1443 {return const_reverse_iterator(begin());}
1445 _LIBCPP_INLINE_VISIBILITY
1446 const_iterator cbegin() const _NOEXCEPT
1448 _LIBCPP_INLINE_VISIBILITY
1449 const_iterator cend() const _NOEXCEPT
1451 _LIBCPP_INLINE_VISIBILITY
1452 const_reverse_iterator crbegin() const _NOEXCEPT
1454 _LIBCPP_INLINE_VISIBILITY
1455 const_reverse_iterator crend() const _NOEXCEPT
1458 _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
1459 {return __is_long() ? __get_long_size() : __get_short_size();}
1460 _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
1461 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
1462 _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
1463 {return (__is_long() ? __get_long_cap()
1464 : static_cast<size_type>(__min_cap)) - 1;}
1466 void resize(size_type __n, value_type __c);
1467 _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
1469 void reserve(size_type res_arg = 0);
1470 _LIBCPP_INLINE_VISIBILITY
1471 void shrink_to_fit() _NOEXCEPT {reserve();}
1472 _LIBCPP_INLINE_VISIBILITY
1473 void clear() _NOEXCEPT;
1474 _LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;}
1476 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const;
1477 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos);
1479 const_reference at(size_type __n) const;
1480 reference at(size_type __n);
1482 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
1483 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s) {return append(__s);}
1484 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;}
1485 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1486 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
1487 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1489 _LIBCPP_INLINE_VISIBILITY
1490 basic_string& append(const basic_string& __str);
1491 basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
1492 basic_string& append(const value_type* __s, size_type __n);
1493 basic_string& append(const value_type* __s);
1494 basic_string& append(size_type __n, value_type __c);
1495 template<class _InputIterator>
1498 __is_input_iterator <_InputIterator>::value &&
1499 !__is_forward_iterator<_InputIterator>::value,
1502 append(_InputIterator __first, _InputIterator __last);
1503 template<class _ForwardIterator>
1506 __is_forward_iterator<_ForwardIterator>::value,
1509 append(_ForwardIterator __first, _ForwardIterator __last);
1510 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1511 _LIBCPP_INLINE_VISIBILITY
1512 basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
1513 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1515 void push_back(value_type __c);
1516 _LIBCPP_INLINE_VISIBILITY
1518 _LIBCPP_INLINE_VISIBILITY reference front();
1519 _LIBCPP_INLINE_VISIBILITY const_reference front() const;
1520 _LIBCPP_INLINE_VISIBILITY reference back();
1521 _LIBCPP_INLINE_VISIBILITY const_reference back() const;
1523 _LIBCPP_INLINE_VISIBILITY
1524 basic_string& assign(const basic_string& __str);
1525 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1526 _LIBCPP_INLINE_VISIBILITY
1527 basic_string& assign(basic_string&& str)
1528 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
1529 {*this = _VSTD::move(str); return *this;}
1531 basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos);
1532 basic_string& assign(const value_type* __s, size_type __n);
1533 basic_string& assign(const value_type* __s);
1534 basic_string& assign(size_type __n, value_type __c);
1535 template<class _InputIterator>
1538 __is_input_iterator <_InputIterator>::value &&
1539 !__is_forward_iterator<_InputIterator>::value,
1542 assign(_InputIterator __first, _InputIterator __last);
1543 template<class _ForwardIterator>
1546 __is_forward_iterator<_ForwardIterator>::value,
1549 assign(_ForwardIterator __first, _ForwardIterator __last);
1550 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1551 _LIBCPP_INLINE_VISIBILITY
1552 basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
1553 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1555 _LIBCPP_INLINE_VISIBILITY
1556 basic_string& insert(size_type __pos1, const basic_string& __str);
1557 basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos);
1558 basic_string& insert(size_type __pos, const value_type* __s, size_type __n);
1559 basic_string& insert(size_type __pos, const value_type* __s);
1560 basic_string& insert(size_type __pos, size_type __n, value_type __c);
1561 iterator insert(const_iterator __pos, value_type __c);
1562 _LIBCPP_INLINE_VISIBILITY
1563 iterator insert(const_iterator __pos, size_type __n, value_type __c);
1564 template<class _InputIterator>
1567 __is_input_iterator <_InputIterator>::value &&
1568 !__is_forward_iterator<_InputIterator>::value,
1571 insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
1572 template<class _ForwardIterator>
1575 __is_forward_iterator<_ForwardIterator>::value,
1578 insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
1579 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1580 _LIBCPP_INLINE_VISIBILITY
1581 iterator insert(const_iterator __pos, initializer_list<value_type> __il)
1582 {return insert(__pos, __il.begin(), __il.end());}
1583 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1585 basic_string& erase(size_type __pos = 0, size_type __n = npos);
1586 _LIBCPP_INLINE_VISIBILITY
1587 iterator erase(const_iterator __pos);
1588 _LIBCPP_INLINE_VISIBILITY
1589 iterator erase(const_iterator __first, const_iterator __last);
1591 _LIBCPP_INLINE_VISIBILITY
1592 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
1593 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos);
1594 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
1595 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s);
1596 basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
1597 _LIBCPP_INLINE_VISIBILITY
1598 basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
1599 _LIBCPP_INLINE_VISIBILITY
1600 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n);
1601 _LIBCPP_INLINE_VISIBILITY
1602 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s);
1603 _LIBCPP_INLINE_VISIBILITY
1604 basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
1605 template<class _InputIterator>
1608 __is_input_iterator<_InputIterator>::value,
1611 replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
1612 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1613 _LIBCPP_INLINE_VISIBILITY
1614 basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
1615 {return replace(__i1, __i2, __il.begin(), __il.end());}
1616 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1618 size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
1619 _LIBCPP_INLINE_VISIBILITY
1620 basic_string substr(size_type __pos = 0, size_type __n = npos) const;
1622 _LIBCPP_INLINE_VISIBILITY
1623 void swap(basic_string& __str)
1624 #if _LIBCPP_STD_VER >= 14
1627 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1628 __is_nothrow_swappable<allocator_type>::value);
1631 _LIBCPP_INLINE_VISIBILITY
1632 const value_type* c_str() const _NOEXCEPT {return data();}
1633 _LIBCPP_INLINE_VISIBILITY
1634 const value_type* data() const _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());}
1636 _LIBCPP_INLINE_VISIBILITY
1637 allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
1639 _LIBCPP_INLINE_VISIBILITY
1640 size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
1641 size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1642 _LIBCPP_INLINE_VISIBILITY
1643 size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
1644 size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1646 _LIBCPP_INLINE_VISIBILITY
1647 size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
1648 size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1649 _LIBCPP_INLINE_VISIBILITY
1650 size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
1651 size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1653 _LIBCPP_INLINE_VISIBILITY
1654 size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
1655 size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1656 _LIBCPP_INLINE_VISIBILITY
1657 size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
1658 _LIBCPP_INLINE_VISIBILITY
1659 size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1661 _LIBCPP_INLINE_VISIBILITY
1662 size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
1663 size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1664 _LIBCPP_INLINE_VISIBILITY
1665 size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
1666 _LIBCPP_INLINE_VISIBILITY
1667 size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1669 _LIBCPP_INLINE_VISIBILITY
1670 size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
1671 size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1672 _LIBCPP_INLINE_VISIBILITY
1673 size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
1674 _LIBCPP_INLINE_VISIBILITY
1675 size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1677 _LIBCPP_INLINE_VISIBILITY
1678 size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
1679 size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1680 _LIBCPP_INLINE_VISIBILITY
1681 size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
1682 _LIBCPP_INLINE_VISIBILITY
1683 size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1685 _LIBCPP_INLINE_VISIBILITY
1686 int compare(const basic_string& __str) const _NOEXCEPT;
1687 _LIBCPP_INLINE_VISIBILITY
1688 int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
1689 int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos) const;
1690 int compare(const value_type* __s) const _NOEXCEPT;
1691 int compare(size_type __pos1, size_type __n1, const value_type* __s) const;
1692 int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
1694 _LIBCPP_INLINE_VISIBILITY bool __invariants() const;
1696 _LIBCPP_INLINE_VISIBILITY
1697 bool __is_long() const _NOEXCEPT
1698 {return bool(__r_.first().__s.__size_ & __short_mask);}
1700 #if _LIBCPP_DEBUG_LEVEL >= 2
1702 bool __dereferenceable(const const_iterator* __i) const;
1703 bool __decrementable(const const_iterator* __i) const;
1704 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
1705 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
1707 #endif // _LIBCPP_DEBUG_LEVEL >= 2
1710 _LIBCPP_INLINE_VISIBILITY
1711 allocator_type& __alloc() _NOEXCEPT
1712 {return __r_.second();}
1713 _LIBCPP_INLINE_VISIBILITY
1714 const allocator_type& __alloc() const _NOEXCEPT
1715 {return __r_.second();}
1717 #ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
1719 _LIBCPP_INLINE_VISIBILITY
1720 void __set_short_size(size_type __s) _NOEXCEPT
1721 # if _LIBCPP_BIG_ENDIAN
1722 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
1724 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1727 _LIBCPP_INLINE_VISIBILITY
1728 size_type __get_short_size() const _NOEXCEPT
1729 # if _LIBCPP_BIG_ENDIAN
1730 {return __r_.first().__s.__size_ >> 1;}
1732 {return __r_.first().__s.__size_;}
1735 #else // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
1737 _LIBCPP_INLINE_VISIBILITY
1738 void __set_short_size(size_type __s) _NOEXCEPT
1739 # if _LIBCPP_BIG_ENDIAN
1740 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1742 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
1745 _LIBCPP_INLINE_VISIBILITY
1746 size_type __get_short_size() const _NOEXCEPT
1747 # if _LIBCPP_BIG_ENDIAN
1748 {return __r_.first().__s.__size_;}
1750 {return __r_.first().__s.__size_ >> 1;}
1753 #endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
1755 _LIBCPP_INLINE_VISIBILITY
1756 void __set_long_size(size_type __s) _NOEXCEPT
1757 {__r_.first().__l.__size_ = __s;}
1758 _LIBCPP_INLINE_VISIBILITY
1759 size_type __get_long_size() const _NOEXCEPT
1760 {return __r_.first().__l.__size_;}
1761 _LIBCPP_INLINE_VISIBILITY
1762 void __set_size(size_type __s) _NOEXCEPT
1763 {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
1765 _LIBCPP_INLINE_VISIBILITY
1766 void __set_long_cap(size_type __s) _NOEXCEPT
1767 {__r_.first().__l.__cap_ = __long_mask | __s;}
1768 _LIBCPP_INLINE_VISIBILITY
1769 size_type __get_long_cap() const _NOEXCEPT
1770 {return __r_.first().__l.__cap_ & size_type(~__long_mask);}
1772 _LIBCPP_INLINE_VISIBILITY
1773 void __set_long_pointer(pointer __p) _NOEXCEPT
1774 {__r_.first().__l.__data_ = __p;}
1775 _LIBCPP_INLINE_VISIBILITY
1776 pointer __get_long_pointer() _NOEXCEPT
1777 {return __r_.first().__l.__data_;}
1778 _LIBCPP_INLINE_VISIBILITY
1779 const_pointer __get_long_pointer() const _NOEXCEPT
1780 {return __r_.first().__l.__data_;}
1781 _LIBCPP_INLINE_VISIBILITY
1782 pointer __get_short_pointer() _NOEXCEPT
1783 {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
1784 _LIBCPP_INLINE_VISIBILITY
1785 const_pointer __get_short_pointer() const _NOEXCEPT
1786 {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
1787 _LIBCPP_INLINE_VISIBILITY
1788 pointer __get_pointer() _NOEXCEPT
1789 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
1790 _LIBCPP_INLINE_VISIBILITY
1791 const_pointer __get_pointer() const _NOEXCEPT
1792 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
1794 _LIBCPP_INLINE_VISIBILITY
1795 void __zero() _NOEXCEPT
1797 size_type (&__a)[__n_words] = __r_.first().__r.__words;
1798 for (unsigned __i = 0; __i < __n_words; ++__i)
1802 template <size_type __a> static
1803 _LIBCPP_INLINE_VISIBILITY
1804 size_type __align_it(size_type __s) _NOEXCEPT
1805 {return (__s + (__a-1)) & ~(__a-1);}
1806 enum {__alignment = 16};
1807 static _LIBCPP_INLINE_VISIBILITY
1808 size_type __recommend(size_type __s) _NOEXCEPT
1809 {return (__s < __min_cap ? static_cast<size_type>(__min_cap) :
1810 __align_it<sizeof(value_type) < __alignment ?
1811 __alignment/sizeof(value_type) : 1 > (__s+1)) - 1;}
1813 void __init(const value_type* __s, size_type __sz, size_type __reserve);
1814 void __init(const value_type* __s, size_type __sz);
1815 void __init(size_type __n, value_type __c);
1817 template <class _InputIterator>
1820 __is_input_iterator <_InputIterator>::value &&
1821 !__is_forward_iterator<_InputIterator>::value,
1824 __init(_InputIterator __first, _InputIterator __last);
1826 template <class _ForwardIterator>
1829 __is_forward_iterator<_ForwardIterator>::value,
1832 __init(_ForwardIterator __first, _ForwardIterator __last);
1834 void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1835 size_type __n_copy, size_type __n_del, size_type __n_add = 0);
1836 void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1837 size_type __n_copy, size_type __n_del,
1838 size_type __n_add, const value_type* __p_new_stuff);
1840 _LIBCPP_INLINE_VISIBILITY
1841 void __erase_to_end(size_type __pos);
1843 _LIBCPP_INLINE_VISIBILITY
1844 void __copy_assign_alloc(const basic_string& __str)
1845 {__copy_assign_alloc(__str, integral_constant<bool,
1846 __alloc_traits::propagate_on_container_copy_assignment::value>());}
1848 _LIBCPP_INLINE_VISIBILITY
1849 void __copy_assign_alloc(const basic_string& __str, true_type)
1851 if (__alloc() != __str.__alloc())
1856 __alloc() = __str.__alloc();
1859 _LIBCPP_INLINE_VISIBILITY
1860 void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
1863 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1864 _LIBCPP_INLINE_VISIBILITY
1865 void __move_assign(basic_string& __str, false_type)
1866 _NOEXCEPT_(__alloc_traits::is_always_equal::value);
1867 _LIBCPP_INLINE_VISIBILITY
1868 void __move_assign(basic_string& __str, true_type)
1869 #if _LIBCPP_STD_VER > 14
1872 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
1876 _LIBCPP_INLINE_VISIBILITY
1878 __move_assign_alloc(basic_string& __str)
1880 !__alloc_traits::propagate_on_container_move_assignment::value ||
1881 is_nothrow_move_assignable<allocator_type>::value)
1882 {__move_assign_alloc(__str, integral_constant<bool,
1883 __alloc_traits::propagate_on_container_move_assignment::value>());}
1885 _LIBCPP_INLINE_VISIBILITY
1886 void __move_assign_alloc(basic_string& __c, true_type)
1887 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1889 __alloc() = _VSTD::move(__c.__alloc());
1892 _LIBCPP_INLINE_VISIBILITY
1893 void __move_assign_alloc(basic_string&, false_type)
1897 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
1898 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type);
1900 friend basic_string operator+<>(const basic_string&, const basic_string&);
1901 friend basic_string operator+<>(const value_type*, const basic_string&);
1902 friend basic_string operator+<>(value_type, const basic_string&);
1903 friend basic_string operator+<>(const basic_string&, const value_type*);
1904 friend basic_string operator+<>(const basic_string&, value_type);
1907 template <class _CharT, class _Traits, class _Allocator>
1908 inline _LIBCPP_INLINE_VISIBILITY
1910 basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators()
1912 #if _LIBCPP_DEBUG_LEVEL >= 2
1913 __get_db()->__invalidate_all(this);
1914 #endif // _LIBCPP_DEBUG_LEVEL >= 2
1917 template <class _CharT, class _Traits, class _Allocator>
1918 inline _LIBCPP_INLINE_VISIBILITY
1920 basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type
1921 #if _LIBCPP_DEBUG_LEVEL >= 2
1926 #if _LIBCPP_DEBUG_LEVEL >= 2
1927 __c_node* __c = __get_db()->__find_c_and_lock(this);
1930 const_pointer __new_last = __get_pointer() + __pos;
1931 for (__i_node** __p = __c->end_; __p != __c->beg_; )
1934 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
1935 if (__i->base() > __new_last)
1937 (*__p)->__c_ = nullptr;
1938 if (--__c->end_ != __p)
1939 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
1942 __get_db()->unlock();
1944 #endif // _LIBCPP_DEBUG_LEVEL >= 2
1947 template <class _CharT, class _Traits, class _Allocator>
1948 inline _LIBCPP_INLINE_VISIBILITY
1949 basic_string<_CharT, _Traits, _Allocator>::basic_string()
1950 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
1952 #if _LIBCPP_DEBUG_LEVEL >= 2
1953 __get_db()->__insert_c(this);
1958 template <class _CharT, class _Traits, class _Allocator>
1959 inline _LIBCPP_INLINE_VISIBILITY
1960 basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
1961 #if _LIBCPP_STD_VER <= 14
1962 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
1968 #if _LIBCPP_DEBUG_LEVEL >= 2
1969 __get_db()->__insert_c(this);
1974 template <class _CharT, class _Traits, class _Allocator>
1976 basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz, size_type __reserve)
1978 if (__reserve > max_size())
1979 this->__throw_length_error();
1981 if (__reserve < __min_cap)
1983 __set_short_size(__sz);
1984 __p = __get_short_pointer();
1988 size_type __cap = __recommend(__reserve);
1989 __p = __alloc_traits::allocate(__alloc(), __cap+1);
1990 __set_long_pointer(__p);
1991 __set_long_cap(__cap+1);
1992 __set_long_size(__sz);
1994 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
1995 traits_type::assign(__p[__sz], value_type());
1998 template <class _CharT, class _Traits, class _Allocator>
2000 basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
2002 if (__sz > max_size())
2003 this->__throw_length_error();
2005 if (__sz < __min_cap)
2007 __set_short_size(__sz);
2008 __p = __get_short_pointer();
2012 size_type __cap = __recommend(__sz);
2013 __p = __alloc_traits::allocate(__alloc(), __cap+1);
2014 __set_long_pointer(__p);
2015 __set_long_cap(__cap+1);
2016 __set_long_size(__sz);
2018 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
2019 traits_type::assign(__p[__sz], value_type());
2022 template <class _CharT, class _Traits, class _Allocator>
2023 inline _LIBCPP_INLINE_VISIBILITY
2024 basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s)
2026 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
2027 __init(__s, traits_type::length(__s));
2028 #if _LIBCPP_DEBUG_LEVEL >= 2
2029 __get_db()->__insert_c(this);
2033 template <class _CharT, class _Traits, class _Allocator>
2034 inline _LIBCPP_INLINE_VISIBILITY
2035 basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, const allocator_type& __a)
2038 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
2039 __init(__s, traits_type::length(__s));
2040 #if _LIBCPP_DEBUG_LEVEL >= 2
2041 __get_db()->__insert_c(this);
2045 template <class _CharT, class _Traits, class _Allocator>
2046 inline _LIBCPP_INLINE_VISIBILITY
2047 basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n)
2049 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
2051 #if _LIBCPP_DEBUG_LEVEL >= 2
2052 __get_db()->__insert_c(this);
2056 template <class _CharT, class _Traits, class _Allocator>
2057 inline _LIBCPP_INLINE_VISIBILITY
2058 basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n, const allocator_type& __a)
2061 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
2063 #if _LIBCPP_DEBUG_LEVEL >= 2
2064 __get_db()->__insert_c(this);
2068 template <class _CharT, class _Traits, class _Allocator>
2069 basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
2070 : __r_(__alloc_traits::select_on_container_copy_construction(__str.__alloc()))
2072 if (!__str.__is_long())
2073 __r_.first().__r = __str.__r_.first().__r;
2075 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
2076 #if _LIBCPP_DEBUG_LEVEL >= 2
2077 __get_db()->__insert_c(this);
2081 template <class _CharT, class _Traits, class _Allocator>
2082 basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, const allocator_type& __a)
2085 if (!__str.__is_long())
2086 __r_.first().__r = __str.__r_.first().__r;
2088 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
2089 #if _LIBCPP_DEBUG_LEVEL >= 2
2090 __get_db()->__insert_c(this);
2094 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2096 template <class _CharT, class _Traits, class _Allocator>
2097 inline _LIBCPP_INLINE_VISIBILITY
2098 basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str)
2099 #if _LIBCPP_STD_VER <= 14
2100 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
2104 : __r_(_VSTD::move(__str.__r_))
2107 #if _LIBCPP_DEBUG_LEVEL >= 2
2108 __get_db()->__insert_c(this);
2110 __get_db()->swap(this, &__str);
2114 template <class _CharT, class _Traits, class _Allocator>
2115 inline _LIBCPP_INLINE_VISIBILITY
2116 basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)
2119 if (__str.__is_long() && __a != __str.__alloc()) // copy, not move
2120 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
2123 __r_.first().__r = __str.__r_.first().__r;
2126 #if _LIBCPP_DEBUG_LEVEL >= 2
2127 __get_db()->__insert_c(this);
2129 __get_db()->swap(this, &__str);
2133 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2135 template <class _CharT, class _Traits, class _Allocator>
2137 basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
2139 if (__n > max_size())
2140 this->__throw_length_error();
2142 if (__n < __min_cap)
2144 __set_short_size(__n);
2145 __p = __get_short_pointer();
2149 size_type __cap = __recommend(__n);
2150 __p = __alloc_traits::allocate(__alloc(), __cap+1);
2151 __set_long_pointer(__p);
2152 __set_long_cap(__cap+1);
2153 __set_long_size(__n);
2155 traits_type::assign(_VSTD::__to_raw_pointer(__p), __n, __c);
2156 traits_type::assign(__p[__n], value_type());
2159 template <class _CharT, class _Traits, class _Allocator>
2160 inline _LIBCPP_INLINE_VISIBILITY
2161 basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c)
2164 #if _LIBCPP_DEBUG_LEVEL >= 2
2165 __get_db()->__insert_c(this);
2169 template <class _CharT, class _Traits, class _Allocator>
2170 inline _LIBCPP_INLINE_VISIBILITY
2171 basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c, const allocator_type& __a)
2175 #if _LIBCPP_DEBUG_LEVEL >= 2
2176 __get_db()->__insert_c(this);
2180 template <class _CharT, class _Traits, class _Allocator>
2181 basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, size_type __n,
2182 const allocator_type& __a)
2185 size_type __str_sz = __str.size();
2186 if (__pos > __str_sz)
2187 this->__throw_out_of_range();
2188 __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos));
2189 #if _LIBCPP_DEBUG_LEVEL >= 2
2190 __get_db()->__insert_c(this);
2194 template <class _CharT, class _Traits, class _Allocator>
2195 template <class _InputIterator>
2198 __is_input_iterator <_InputIterator>::value &&
2199 !__is_forward_iterator<_InputIterator>::value,
2202 basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
2205 #ifndef _LIBCPP_NO_EXCEPTIONS
2208 #endif // _LIBCPP_NO_EXCEPTIONS
2209 for (; __first != __last; ++__first)
2210 push_back(*__first);
2211 #ifndef _LIBCPP_NO_EXCEPTIONS
2216 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2219 #endif // _LIBCPP_NO_EXCEPTIONS
2222 template <class _CharT, class _Traits, class _Allocator>
2223 template <class _ForwardIterator>
2226 __is_forward_iterator<_ForwardIterator>::value,
2229 basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
2231 size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last));
2232 if (__sz > max_size())
2233 this->__throw_length_error();
2235 if (__sz < __min_cap)
2237 __set_short_size(__sz);
2238 __p = __get_short_pointer();
2242 size_type __cap = __recommend(__sz);
2243 __p = __alloc_traits::allocate(__alloc(), __cap+1);
2244 __set_long_pointer(__p);
2245 __set_long_cap(__cap+1);
2246 __set_long_size(__sz);
2248 for (; __first != __last; ++__first, (void) ++__p)
2249 traits_type::assign(*__p, *__first);
2250 traits_type::assign(*__p, value_type());
2253 template <class _CharT, class _Traits, class _Allocator>
2254 template<class _InputIterator>
2255 inline _LIBCPP_INLINE_VISIBILITY
2256 basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last)
2258 __init(__first, __last);
2259 #if _LIBCPP_DEBUG_LEVEL >= 2
2260 __get_db()->__insert_c(this);
2264 template <class _CharT, class _Traits, class _Allocator>
2265 template<class _InputIterator>
2266 inline _LIBCPP_INLINE_VISIBILITY
2267 basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last,
2268 const allocator_type& __a)
2271 __init(__first, __last);
2272 #if _LIBCPP_DEBUG_LEVEL >= 2
2273 __get_db()->__insert_c(this);
2277 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2279 template <class _CharT, class _Traits, class _Allocator>
2280 inline _LIBCPP_INLINE_VISIBILITY
2281 basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il)
2283 __init(__il.begin(), __il.end());
2284 #if _LIBCPP_DEBUG_LEVEL >= 2
2285 __get_db()->__insert_c(this);
2289 template <class _CharT, class _Traits, class _Allocator>
2290 inline _LIBCPP_INLINE_VISIBILITY
2291 basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il, const allocator_type& __a)
2294 __init(__il.begin(), __il.end());
2295 #if _LIBCPP_DEBUG_LEVEL >= 2
2296 __get_db()->__insert_c(this);
2300 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2302 template <class _CharT, class _Traits, class _Allocator>
2303 basic_string<_CharT, _Traits, _Allocator>::~basic_string()
2305 #if _LIBCPP_DEBUG_LEVEL >= 2
2306 __get_db()->__erase_c(this);
2309 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2312 template <class _CharT, class _Traits, class _Allocator>
2314 basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
2315 (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2316 size_type __n_copy, size_type __n_del, size_type __n_add, const value_type* __p_new_stuff)
2318 size_type __ms = max_size();
2319 if (__delta_cap > __ms - __old_cap - 1)
2320 this->__throw_length_error();
2321 pointer __old_p = __get_pointer();
2322 size_type __cap = __old_cap < __ms / 2 - __alignment ?
2323 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
2325 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
2326 __invalidate_all_iterators();
2328 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2329 _VSTD::__to_raw_pointer(__old_p), __n_copy);
2331 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy, __p_new_stuff, __n_add);
2332 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2333 if (__sec_cp_sz != 0)
2334 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2335 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del, __sec_cp_sz);
2336 if (__old_cap+1 != __min_cap)
2337 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
2338 __set_long_pointer(__p);
2339 __set_long_cap(__cap+1);
2340 __old_sz = __n_copy + __n_add + __sec_cp_sz;
2341 __set_long_size(__old_sz);
2342 traits_type::assign(__p[__old_sz], value_type());
2345 template <class _CharT, class _Traits, class _Allocator>
2347 basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2348 size_type __n_copy, size_type __n_del, size_type __n_add)
2350 size_type __ms = max_size();
2351 if (__delta_cap > __ms - __old_cap)
2352 this->__throw_length_error();
2353 pointer __old_p = __get_pointer();
2354 size_type __cap = __old_cap < __ms / 2 - __alignment ?
2355 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
2357 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
2358 __invalidate_all_iterators();
2360 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2361 _VSTD::__to_raw_pointer(__old_p), __n_copy);
2362 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2363 if (__sec_cp_sz != 0)
2364 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2365 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del,
2367 if (__old_cap+1 != __min_cap)
2368 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
2369 __set_long_pointer(__p);
2370 __set_long_cap(__cap+1);
2375 template <class _CharT, class _Traits, class _Allocator>
2376 basic_string<_CharT, _Traits, _Allocator>&
2377 basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
2379 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr");
2380 size_type __cap = capacity();
2383 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
2384 traits_type::move(__p, __s, __n);
2385 traits_type::assign(__p[__n], value_type());
2387 __invalidate_iterators_past(__n);
2391 size_type __sz = size();
2392 __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
2397 template <class _CharT, class _Traits, class _Allocator>
2398 basic_string<_CharT, _Traits, _Allocator>&
2399 basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
2401 size_type __cap = capacity();
2404 size_type __sz = size();
2405 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2408 __invalidate_iterators_past(__n);
2409 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
2410 traits_type::assign(__p, __n, __c);
2411 traits_type::assign(__p[__n], value_type());
2416 template <class _CharT, class _Traits, class _Allocator>
2417 basic_string<_CharT, _Traits, _Allocator>&
2418 basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
2423 __p = __get_long_pointer();
2428 __p = __get_short_pointer();
2429 __set_short_size(1);
2431 traits_type::assign(*__p, __c);
2432 traits_type::assign(*++__p, value_type());
2433 __invalidate_iterators_past(1);
2437 template <class _CharT, class _Traits, class _Allocator>
2438 basic_string<_CharT, _Traits, _Allocator>&
2439 basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
2443 __copy_assign_alloc(__str);
2449 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2451 template <class _CharT, class _Traits, class _Allocator>
2452 inline _LIBCPP_INLINE_VISIBILITY
2454 basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
2455 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
2457 if (__alloc() != __str.__alloc())
2460 __move_assign(__str, true_type());
2463 template <class _CharT, class _Traits, class _Allocator>
2464 inline _LIBCPP_INLINE_VISIBILITY
2466 basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
2467 #if _LIBCPP_STD_VER > 14
2470 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
2475 __r_.first() = __str.__r_.first();
2476 __move_assign_alloc(__str);
2480 template <class _CharT, class _Traits, class _Allocator>
2481 inline _LIBCPP_INLINE_VISIBILITY
2482 basic_string<_CharT, _Traits, _Allocator>&
2483 basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str)
2484 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
2486 __move_assign(__str, integral_constant<bool,
2487 __alloc_traits::propagate_on_container_move_assignment::value>());
2493 template <class _CharT, class _Traits, class _Allocator>
2494 template<class _InputIterator>
2497 __is_input_iterator <_InputIterator>::value &&
2498 !__is_forward_iterator<_InputIterator>::value,
2499 basic_string<_CharT, _Traits, _Allocator>&
2501 basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2504 for (; __first != __last; ++__first)
2505 push_back(*__first);
2509 template <class _CharT, class _Traits, class _Allocator>
2510 template<class _ForwardIterator>
2513 __is_forward_iterator<_ForwardIterator>::value,
2514 basic_string<_CharT, _Traits, _Allocator>&
2516 basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2518 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2519 size_type __cap = capacity();
2522 size_type __sz = size();
2523 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2526 __invalidate_iterators_past(__n);
2527 pointer __p = __get_pointer();
2528 for (; __first != __last; ++__first, ++__p)
2529 traits_type::assign(*__p, *__first);
2530 traits_type::assign(*__p, value_type());
2535 template <class _CharT, class _Traits, class _Allocator>
2536 inline _LIBCPP_INLINE_VISIBILITY
2537 basic_string<_CharT, _Traits, _Allocator>&
2538 basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str)
2540 return assign(__str.data(), __str.size());
2543 template <class _CharT, class _Traits, class _Allocator>
2544 basic_string<_CharT, _Traits, _Allocator>&
2545 basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
2547 size_type __sz = __str.size();
2549 this->__throw_out_of_range();
2550 return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
2553 template <class _CharT, class _Traits, class _Allocator>
2554 basic_string<_CharT, _Traits, _Allocator>&
2555 basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
2557 _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
2558 return assign(__s, traits_type::length(__s));
2563 template <class _CharT, class _Traits, class _Allocator>
2564 basic_string<_CharT, _Traits, _Allocator>&
2565 basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
2567 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
2568 size_type __cap = capacity();
2569 size_type __sz = size();
2570 if (__cap - __sz >= __n)
2574 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
2575 traits_type::copy(__p + __sz, __s, __n);
2578 traits_type::assign(__p[__sz], value_type());
2582 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
2586 template <class _CharT, class _Traits, class _Allocator>
2587 basic_string<_CharT, _Traits, _Allocator>&
2588 basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
2592 size_type __cap = capacity();
2593 size_type __sz = size();
2594 if (__cap - __sz < __n)
2595 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2596 pointer __p = __get_pointer();
2597 traits_type::assign(_VSTD::__to_raw_pointer(__p) + __sz, __n, __c);
2600 traits_type::assign(__p[__sz], value_type());
2605 template <class _CharT, class _Traits, class _Allocator>
2607 basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
2609 bool __is_short = !__is_long();
2614 __cap = __min_cap - 1;
2615 __sz = __get_short_size();
2619 __cap = __get_long_cap() - 1;
2620 __sz = __get_long_size();
2624 __grow_by(__cap, 1, __sz, __sz, 0);
2625 __is_short = !__is_long();
2630 __p = __get_short_pointer() + __sz;
2631 __set_short_size(__sz+1);
2635 __p = __get_long_pointer() + __sz;
2636 __set_long_size(__sz+1);
2638 traits_type::assign(*__p, __c);
2639 traits_type::assign(*++__p, value_type());
2642 template <class _CharT, class _Traits, class _Allocator>
2643 template<class _InputIterator>
2646 __is_input_iterator <_InputIterator>::value &&
2647 !__is_forward_iterator<_InputIterator>::value,
2648 basic_string<_CharT, _Traits, _Allocator>&
2650 basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last)
2652 for (; __first != __last; ++__first)
2653 push_back(*__first);
2657 template <class _CharT, class _Traits, class _Allocator>
2658 template<class _ForwardIterator>
2661 __is_forward_iterator<_ForwardIterator>::value,
2662 basic_string<_CharT, _Traits, _Allocator>&
2664 basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last)
2666 size_type __sz = size();
2667 size_type __cap = capacity();
2668 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2671 if (__cap - __sz < __n)
2672 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2673 pointer __p = __get_pointer() + __sz;
2674 for (; __first != __last; ++__p, ++__first)
2675 traits_type::assign(*__p, *__first);
2676 traits_type::assign(*__p, value_type());
2677 __set_size(__sz + __n);
2682 template <class _CharT, class _Traits, class _Allocator>
2683 inline _LIBCPP_INLINE_VISIBILITY
2684 basic_string<_CharT, _Traits, _Allocator>&
2685 basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
2687 return append(__str.data(), __str.size());
2690 template <class _CharT, class _Traits, class _Allocator>
2691 basic_string<_CharT, _Traits, _Allocator>&
2692 basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
2694 size_type __sz = __str.size();
2696 this->__throw_out_of_range();
2697 return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
2700 template <class _CharT, class _Traits, class _Allocator>
2701 basic_string<_CharT, _Traits, _Allocator>&
2702 basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
2704 _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
2705 return append(__s, traits_type::length(__s));
2710 template <class _CharT, class _Traits, class _Allocator>
2711 basic_string<_CharT, _Traits, _Allocator>&
2712 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
2714 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
2715 size_type __sz = size();
2717 this->__throw_out_of_range();
2718 size_type __cap = capacity();
2719 if (__cap - __sz >= __n)
2723 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
2724 size_type __n_move = __sz - __pos;
2727 if (__p + __pos <= __s && __s < __p + __sz)
2729 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2731 traits_type::move(__p + __pos, __s, __n);
2734 traits_type::assign(__p[__sz], value_type());
2738 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2742 template <class _CharT, class _Traits, class _Allocator>
2743 basic_string<_CharT, _Traits, _Allocator>&
2744 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
2746 size_type __sz = size();
2748 this->__throw_out_of_range();
2751 size_type __cap = capacity();
2753 if (__cap - __sz >= __n)
2755 __p = _VSTD::__to_raw_pointer(__get_pointer());
2756 size_type __n_move = __sz - __pos;
2758 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2762 __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
2763 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
2765 traits_type::assign(__p + __pos, __n, __c);
2768 traits_type::assign(__p[__sz], value_type());
2773 template <class _CharT, class _Traits, class _Allocator>
2774 template<class _InputIterator>
2777 __is_input_iterator <_InputIterator>::value &&
2778 !__is_forward_iterator<_InputIterator>::value,
2779 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2781 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
2783 #if _LIBCPP_DEBUG_LEVEL >= 2
2784 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2785 "string::insert(iterator, range) called with an iterator not"
2786 " referring to this string");
2788 size_type __old_sz = size();
2789 difference_type __ip = __pos - begin();
2790 for (; __first != __last; ++__first)
2791 push_back(*__first);
2792 pointer __p = __get_pointer();
2793 _VSTD::rotate(__p + __ip, __p + __old_sz, __p + size());
2794 #if _LIBCPP_DEBUG_LEVEL >= 2
2795 return iterator(this, __p + __ip);
2797 return iterator(__p + __ip);
2801 template <class _CharT, class _Traits, class _Allocator>
2802 template<class _ForwardIterator>
2805 __is_forward_iterator<_ForwardIterator>::value,
2806 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2808 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
2810 #if _LIBCPP_DEBUG_LEVEL >= 2
2811 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2812 "string::insert(iterator, range) called with an iterator not"
2813 " referring to this string");
2815 size_type __ip = static_cast<size_type>(__pos - begin());
2816 size_type __sz = size();
2817 size_type __cap = capacity();
2818 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2822 if (__cap - __sz >= __n)
2824 __p = _VSTD::__to_raw_pointer(__get_pointer());
2825 size_type __n_move = __sz - __ip;
2827 traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
2831 __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
2832 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
2836 traits_type::assign(__p[__sz], value_type());
2837 for (__p += __ip; __first != __last; ++__p, ++__first)
2838 traits_type::assign(*__p, *__first);
2840 return begin() + __ip;
2843 template <class _CharT, class _Traits, class _Allocator>
2844 inline _LIBCPP_INLINE_VISIBILITY
2845 basic_string<_CharT, _Traits, _Allocator>&
2846 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str)
2848 return insert(__pos1, __str.data(), __str.size());
2851 template <class _CharT, class _Traits, class _Allocator>
2852 basic_string<_CharT, _Traits, _Allocator>&
2853 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
2854 size_type __pos2, size_type __n)
2856 size_type __str_sz = __str.size();
2857 if (__pos2 > __str_sz)
2858 this->__throw_out_of_range();
2859 return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
2862 template <class _CharT, class _Traits, class _Allocator>
2863 basic_string<_CharT, _Traits, _Allocator>&
2864 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
2866 _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
2867 return insert(__pos, __s, traits_type::length(__s));
2870 template <class _CharT, class _Traits, class _Allocator>
2871 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2872 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
2874 size_type __ip = static_cast<size_type>(__pos - begin());
2875 size_type __sz = size();
2876 size_type __cap = capacity();
2880 __grow_by(__cap, 1, __sz, __ip, 0, 1);
2881 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
2885 __p = _VSTD::__to_raw_pointer(__get_pointer());
2886 size_type __n_move = __sz - __ip;
2888 traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
2890 traits_type::assign(__p[__ip], __c);
2891 traits_type::assign(__p[++__sz], value_type());
2893 return begin() + static_cast<difference_type>(__ip);
2896 template <class _CharT, class _Traits, class _Allocator>
2897 inline _LIBCPP_INLINE_VISIBILITY
2898 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2899 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c)
2901 #if _LIBCPP_DEBUG_LEVEL >= 2
2902 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2903 "string::insert(iterator, n, value) called with an iterator not"
2904 " referring to this string");
2906 difference_type __p = __pos - begin();
2907 insert(static_cast<size_type>(__p), __n, __c);
2908 return begin() + __p;
2913 template <class _CharT, class _Traits, class _Allocator>
2914 basic_string<_CharT, _Traits, _Allocator>&
2915 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2)
2917 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
2918 size_type __sz = size();
2920 this->__throw_out_of_range();
2921 __n1 = _VSTD::min(__n1, __sz - __pos);
2922 size_type __cap = capacity();
2923 if (__cap - __sz + __n1 >= __n2)
2925 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
2928 size_type __n_move = __sz - __pos - __n1;
2933 traits_type::move(__p + __pos, __s, __n2);
2934 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2937 if (__p + __pos < __s && __s < __p + __sz)
2939 if (__p + __pos + __n1 <= __s)
2941 else // __p + __pos < __s < __p + __pos + __n1
2943 traits_type::move(__p + __pos, __s, __n1);
2950 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2953 traits_type::move(__p + __pos, __s, __n2);
2955 __sz += __n2 - __n1;
2957 __invalidate_iterators_past(__sz);
2958 traits_type::assign(__p[__sz], value_type());
2961 __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
2965 template <class _CharT, class _Traits, class _Allocator>
2966 basic_string<_CharT, _Traits, _Allocator>&
2967 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
2969 size_type __sz = size();
2971 this->__throw_out_of_range();
2972 __n1 = _VSTD::min(__n1, __sz - __pos);
2973 size_type __cap = capacity();
2975 if (__cap - __sz + __n1 >= __n2)
2977 __p = _VSTD::__to_raw_pointer(__get_pointer());
2980 size_type __n_move = __sz - __pos - __n1;
2982 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2987 __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
2988 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
2990 traits_type::assign(__p + __pos, __n2, __c);
2991 __sz += __n2 - __n1;
2993 __invalidate_iterators_past(__sz);
2994 traits_type::assign(__p[__sz], value_type());
2998 template <class _CharT, class _Traits, class _Allocator>
2999 template<class _InputIterator>
3002 __is_input_iterator<_InputIterator>::value,
3003 basic_string<_CharT, _Traits, _Allocator>&
3005 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
3006 _InputIterator __j1, _InputIterator __j2)
3008 for (; true; ++__i1, ++__j1)
3013 insert(__i1, __j1, __j2);
3021 traits_type::assign(const_cast<value_type&>(*__i1), *__j1);
3026 template <class _CharT, class _Traits, class _Allocator>
3027 inline _LIBCPP_INLINE_VISIBILITY
3028 basic_string<_CharT, _Traits, _Allocator>&
3029 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str)
3031 return replace(__pos1, __n1, __str.data(), __str.size());
3034 template <class _CharT, class _Traits, class _Allocator>
3035 basic_string<_CharT, _Traits, _Allocator>&
3036 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
3037 size_type __pos2, size_type __n2)
3039 size_type __str_sz = __str.size();
3040 if (__pos2 > __str_sz)
3041 this->__throw_out_of_range();
3042 return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
3045 template <class _CharT, class _Traits, class _Allocator>
3046 basic_string<_CharT, _Traits, _Allocator>&
3047 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
3049 _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr");
3050 return replace(__pos, __n1, __s, traits_type::length(__s));
3053 template <class _CharT, class _Traits, class _Allocator>
3054 inline _LIBCPP_INLINE_VISIBILITY
3055 basic_string<_CharT, _Traits, _Allocator>&
3056 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str)
3058 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1),
3059 __str.data(), __str.size());
3062 template <class _CharT, class _Traits, class _Allocator>
3063 inline _LIBCPP_INLINE_VISIBILITY
3064 basic_string<_CharT, _Traits, _Allocator>&
3065 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n)
3067 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
3070 template <class _CharT, class _Traits, class _Allocator>
3071 inline _LIBCPP_INLINE_VISIBILITY
3072 basic_string<_CharT, _Traits, _Allocator>&
3073 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s)
3075 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
3078 template <class _CharT, class _Traits, class _Allocator>
3079 inline _LIBCPP_INLINE_VISIBILITY
3080 basic_string<_CharT, _Traits, _Allocator>&
3081 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c)
3083 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
3088 template <class _CharT, class _Traits, class _Allocator>
3089 basic_string<_CharT, _Traits, _Allocator>&
3090 basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n)
3092 size_type __sz = size();
3094 this->__throw_out_of_range();
3097 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
3098 __n = _VSTD::min(__n, __sz - __pos);
3099 size_type __n_move = __sz - __pos - __n;
3101 traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
3104 __invalidate_iterators_past(__sz);
3105 traits_type::assign(__p[__sz], value_type());
3110 template <class _CharT, class _Traits, class _Allocator>
3111 inline _LIBCPP_INLINE_VISIBILITY
3112 typename basic_string<_CharT, _Traits, _Allocator>::iterator
3113 basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
3115 #if _LIBCPP_DEBUG_LEVEL >= 2
3116 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
3117 "string::erase(iterator) called with an iterator not"
3118 " referring to this string");
3120 _LIBCPP_ASSERT(__pos != end(),
3121 "string::erase(iterator) called with a non-dereferenceable iterator");
3122 iterator __b = begin();
3123 size_type __r = static_cast<size_type>(__pos - __b);
3125 return __b + static_cast<difference_type>(__r);
3128 template <class _CharT, class _Traits, class _Allocator>
3129 inline _LIBCPP_INLINE_VISIBILITY
3130 typename basic_string<_CharT, _Traits, _Allocator>::iterator
3131 basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
3133 #if _LIBCPP_DEBUG_LEVEL >= 2
3134 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
3135 "string::erase(iterator, iterator) called with an iterator not"
3136 " referring to this string");
3138 _LIBCPP_ASSERT(__first <= __last, "string::erase(first, last) called with invalid range");
3139 iterator __b = begin();
3140 size_type __r = static_cast<size_type>(__first - __b);
3141 erase(__r, static_cast<size_type>(__last - __first));
3142 return __b + static_cast<difference_type>(__r);
3145 template <class _CharT, class _Traits, class _Allocator>
3146 inline _LIBCPP_INLINE_VISIBILITY
3148 basic_string<_CharT, _Traits, _Allocator>::pop_back()
3150 _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty");
3154 __sz = __get_long_size() - 1;
3155 __set_long_size(__sz);
3156 traits_type::assign(*(__get_long_pointer() + __sz), value_type());
3160 __sz = __get_short_size() - 1;
3161 __set_short_size(__sz);
3162 traits_type::assign(*(__get_short_pointer() + __sz), value_type());
3164 __invalidate_iterators_past(__sz);
3167 template <class _CharT, class _Traits, class _Allocator>
3168 inline _LIBCPP_INLINE_VISIBILITY
3170 basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
3172 __invalidate_all_iterators();
3175 traits_type::assign(*__get_long_pointer(), value_type());
3180 traits_type::assign(*__get_short_pointer(), value_type());
3181 __set_short_size(0);
3185 template <class _CharT, class _Traits, class _Allocator>
3186 inline _LIBCPP_INLINE_VISIBILITY
3188 basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
3192 traits_type::assign(*(__get_long_pointer() + __pos), value_type());
3193 __set_long_size(__pos);
3197 traits_type::assign(*(__get_short_pointer() + __pos), value_type());
3198 __set_short_size(__pos);
3200 __invalidate_iterators_past(__pos);
3203 template <class _CharT, class _Traits, class _Allocator>
3205 basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
3207 size_type __sz = size();
3209 append(__n - __sz, __c);
3211 __erase_to_end(__n);
3214 template <class _CharT, class _Traits, class _Allocator>
3215 inline _LIBCPP_INLINE_VISIBILITY
3216 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3217 basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT
3219 size_type __m = __alloc_traits::max_size(__alloc());
3220 #if _LIBCPP_BIG_ENDIAN
3221 return (__m <= ~__long_mask ? __m : __m/2) - __alignment;
3223 return __m - __alignment;
3227 template <class _CharT, class _Traits, class _Allocator>
3229 basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
3231 if (__res_arg > max_size())
3232 this->__throw_length_error();
3233 size_type __cap = capacity();
3234 size_type __sz = size();
3235 __res_arg = _VSTD::max(__res_arg, __sz);
3236 __res_arg = __recommend(__res_arg);
3237 if (__res_arg != __cap)
3239 pointer __new_data, __p;
3240 bool __was_long, __now_long;
3241 if (__res_arg == __min_cap - 1)
3245 __new_data = __get_short_pointer();
3246 __p = __get_long_pointer();
3250 if (__res_arg > __cap)
3251 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
3254 #ifndef _LIBCPP_NO_EXCEPTIONS
3257 #endif // _LIBCPP_NO_EXCEPTIONS
3258 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
3259 #ifndef _LIBCPP_NO_EXCEPTIONS
3265 #else // _LIBCPP_NO_EXCEPTIONS
3266 if (__new_data == nullptr)
3268 #endif // _LIBCPP_NO_EXCEPTIONS
3271 __was_long = __is_long();
3272 __p = __get_pointer();
3274 traits_type::copy(_VSTD::__to_raw_pointer(__new_data),
3275 _VSTD::__to_raw_pointer(__p), size()+1);
3277 __alloc_traits::deallocate(__alloc(), __p, __cap+1);
3280 __set_long_cap(__res_arg+1);
3281 __set_long_size(__sz);
3282 __set_long_pointer(__new_data);
3285 __set_short_size(__sz);
3286 __invalidate_all_iterators();
3290 template <class _CharT, class _Traits, class _Allocator>
3291 inline _LIBCPP_INLINE_VISIBILITY
3292 typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3293 basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const
3295 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
3296 return *(data() + __pos);
3299 template <class _CharT, class _Traits, class _Allocator>
3300 inline _LIBCPP_INLINE_VISIBILITY
3301 typename basic_string<_CharT, _Traits, _Allocator>::reference
3302 basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos)
3304 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
3305 return *(__get_pointer() + __pos);
3308 template <class _CharT, class _Traits, class _Allocator>
3309 typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3310 basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
3313 this->__throw_out_of_range();
3314 return (*this)[__n];
3317 template <class _CharT, class _Traits, class _Allocator>
3318 typename basic_string<_CharT, _Traits, _Allocator>::reference
3319 basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
3322 this->__throw_out_of_range();
3323 return (*this)[__n];
3326 template <class _CharT, class _Traits, class _Allocator>
3327 inline _LIBCPP_INLINE_VISIBILITY
3328 typename basic_string<_CharT, _Traits, _Allocator>::reference
3329 basic_string<_CharT, _Traits, _Allocator>::front()
3331 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
3332 return *__get_pointer();
3335 template <class _CharT, class _Traits, class _Allocator>
3336 inline _LIBCPP_INLINE_VISIBILITY
3337 typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3338 basic_string<_CharT, _Traits, _Allocator>::front() const
3340 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
3344 template <class _CharT, class _Traits, class _Allocator>
3345 inline _LIBCPP_INLINE_VISIBILITY
3346 typename basic_string<_CharT, _Traits, _Allocator>::reference
3347 basic_string<_CharT, _Traits, _Allocator>::back()
3349 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
3350 return *(__get_pointer() + size() - 1);
3353 template <class _CharT, class _Traits, class _Allocator>
3354 inline _LIBCPP_INLINE_VISIBILITY
3355 typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3356 basic_string<_CharT, _Traits, _Allocator>::back() const
3358 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
3359 return *(data() + size() - 1);
3362 template <class _CharT, class _Traits, class _Allocator>
3363 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3364 basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
3366 size_type __sz = size();
3368 this->__throw_out_of_range();
3369 size_type __rlen = _VSTD::min(__n, __sz - __pos);
3370 traits_type::copy(__s, data() + __pos, __rlen);
3374 template <class _CharT, class _Traits, class _Allocator>
3375 inline _LIBCPP_INLINE_VISIBILITY
3376 basic_string<_CharT, _Traits, _Allocator>
3377 basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const
3379 return basic_string(*this, __pos, __n, __alloc());
3382 template <class _CharT, class _Traits, class _Allocator>
3383 inline _LIBCPP_INLINE_VISIBILITY
3385 basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
3386 #if _LIBCPP_STD_VER >= 14
3389 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3390 __is_nothrow_swappable<allocator_type>::value)
3393 #if _LIBCPP_DEBUG_LEVEL >= 2
3395 __get_db()->__invalidate_all(this);
3396 if (!__str.__is_long())
3397 __get_db()->__invalidate_all(&__str);
3398 __get_db()->swap(this, &__str);
3400 _VSTD::swap(__r_.first(), __str.__r_.first());
3401 __swap_allocator(__alloc(), __str.__alloc());
3406 template <class _Traits>
3407 struct _LIBCPP_HIDDEN __traits_eq
3409 typedef typename _Traits::char_type char_type;
3410 _LIBCPP_INLINE_VISIBILITY
3411 bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
3412 {return _Traits::eq(__x, __y);}
3415 template<class _CharT, class _Traits, class _Allocator>
3416 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3417 basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
3419 size_type __n) const _NOEXCEPT
3421 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr");
3422 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
3423 (data(), size(), __s, __pos, __n);
3426 template<class _CharT, class _Traits, class _Allocator>
3427 inline _LIBCPP_INLINE_VISIBILITY
3428 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3429 basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
3430 size_type __pos) const _NOEXCEPT
3432 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
3433 (data(), size(), __str.data(), __pos, __str.size());
3436 template<class _CharT, class _Traits, class _Allocator>
3437 inline _LIBCPP_INLINE_VISIBILITY
3438 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3439 basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
3440 size_type __pos) const _NOEXCEPT
3442 _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr");
3443 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
3444 (data(), size(), __s, __pos, traits_type::length(__s));
3447 template<class _CharT, class _Traits, class _Allocator>
3448 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3449 basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
3450 size_type __pos) const _NOEXCEPT
3452 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
3453 (data(), size(), __c, __pos);
3458 template<class _CharT, class _Traits, class _Allocator>
3459 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3460 basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
3462 size_type __n) const _NOEXCEPT
3464 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr");
3465 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
3466 (data(), size(), __s, __pos, __n);
3469 template<class _CharT, class _Traits, class _Allocator>
3470 inline _LIBCPP_INLINE_VISIBILITY
3471 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3472 basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
3473 size_type __pos) const _NOEXCEPT
3475 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
3476 (data(), size(), __str.data(), __pos, __str.size());
3479 template<class _CharT, class _Traits, class _Allocator>
3480 inline _LIBCPP_INLINE_VISIBILITY
3481 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3482 basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
3483 size_type __pos) const _NOEXCEPT
3485 _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr");
3486 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
3487 (data(), size(), __s, __pos, traits_type::length(__s));
3490 template<class _CharT, class _Traits, class _Allocator>
3491 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3492 basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
3493 size_type __pos) const _NOEXCEPT
3495 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
3496 (data(), size(), __c, __pos);
3501 template<class _CharT, class _Traits, class _Allocator>
3502 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3503 basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
3505 size_type __n) const _NOEXCEPT
3507 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr");
3508 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
3509 (data(), size(), __s, __pos, __n);
3512 template<class _CharT, class _Traits, class _Allocator>
3513 inline _LIBCPP_INLINE_VISIBILITY
3514 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3515 basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
3516 size_type __pos) const _NOEXCEPT
3518 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
3519 (data(), size(), __str.data(), __pos, __str.size());
3522 template<class _CharT, class _Traits, class _Allocator>
3523 inline _LIBCPP_INLINE_VISIBILITY
3524 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3525 basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
3526 size_type __pos) const _NOEXCEPT
3528 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr");
3529 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
3530 (data(), size(), __s, __pos, traits_type::length(__s));
3533 template<class _CharT, class _Traits, class _Allocator>
3534 inline _LIBCPP_INLINE_VISIBILITY
3535 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3536 basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
3537 size_type __pos) const _NOEXCEPT
3539 return find(__c, __pos);
3544 template<class _CharT, class _Traits, class _Allocator>
3545 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3546 basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
3548 size_type __n) const _NOEXCEPT
3550 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr");
3551 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
3552 (data(), size(), __s, __pos, __n);
3555 template<class _CharT, class _Traits, class _Allocator>
3556 inline _LIBCPP_INLINE_VISIBILITY
3557 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3558 basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
3559 size_type __pos) const _NOEXCEPT
3561 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
3562 (data(), size(), __str.data(), __pos, __str.size());
3565 template<class _CharT, class _Traits, class _Allocator>
3566 inline _LIBCPP_INLINE_VISIBILITY
3567 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3568 basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
3569 size_type __pos) const _NOEXCEPT
3571 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr");
3572 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
3573 (data(), size(), __s, __pos, traits_type::length(__s));
3576 template<class _CharT, class _Traits, class _Allocator>
3577 inline _LIBCPP_INLINE_VISIBILITY
3578 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3579 basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
3580 size_type __pos) const _NOEXCEPT
3582 return rfind(__c, __pos);
3585 // find_first_not_of
3587 template<class _CharT, class _Traits, class _Allocator>
3588 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3589 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
3591 size_type __n) const _NOEXCEPT
3593 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr");
3594 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
3595 (data(), size(), __s, __pos, __n);
3598 template<class _CharT, class _Traits, class _Allocator>
3599 inline _LIBCPP_INLINE_VISIBILITY
3600 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3601 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
3602 size_type __pos) const _NOEXCEPT
3604 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
3605 (data(), size(), __str.data(), __pos, __str.size());
3608 template<class _CharT, class _Traits, class _Allocator>
3609 inline _LIBCPP_INLINE_VISIBILITY
3610 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3611 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
3612 size_type __pos) const _NOEXCEPT
3614 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr");
3615 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
3616 (data(), size(), __s, __pos, traits_type::length(__s));
3619 template<class _CharT, class _Traits, class _Allocator>
3620 inline _LIBCPP_INLINE_VISIBILITY
3621 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3622 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
3623 size_type __pos) const _NOEXCEPT
3625 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
3626 (data(), size(), __c, __pos);
3631 template<class _CharT, class _Traits, class _Allocator>
3632 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3633 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
3635 size_type __n) const _NOEXCEPT
3637 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr");
3638 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
3639 (data(), size(), __s, __pos, __n);
3642 template<class _CharT, class _Traits, class _Allocator>
3643 inline _LIBCPP_INLINE_VISIBILITY
3644 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3645 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
3646 size_type __pos) const _NOEXCEPT
3648 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
3649 (data(), size(), __str.data(), __pos, __str.size());
3652 template<class _CharT, class _Traits, class _Allocator>
3653 inline _LIBCPP_INLINE_VISIBILITY
3654 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3655 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
3656 size_type __pos) const _NOEXCEPT
3658 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr");
3659 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
3660 (data(), size(), __s, __pos, traits_type::length(__s));
3663 template<class _CharT, class _Traits, class _Allocator>
3664 inline _LIBCPP_INLINE_VISIBILITY
3665 typename basic_string<_CharT, _Traits, _Allocator>::size_type
3666 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
3667 size_type __pos) const _NOEXCEPT
3669 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
3670 (data(), size(), __c, __pos);
3675 template <class _CharT, class _Traits, class _Allocator>
3676 inline _LIBCPP_INLINE_VISIBILITY
3678 basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
3680 size_t __lhs_sz = size();
3681 size_t __rhs_sz = __str.size();
3682 int __result = traits_type::compare(data(), __str.data(),
3683 _VSTD::min(__lhs_sz, __rhs_sz));
3686 if (__lhs_sz < __rhs_sz)
3688 if (__lhs_sz > __rhs_sz)
3693 template <class _CharT, class _Traits, class _Allocator>
3694 inline _LIBCPP_INLINE_VISIBILITY
3696 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3698 const basic_string& __str) const
3700 return compare(__pos1, __n1, __str.data(), __str.size());
3703 template <class _CharT, class _Traits, class _Allocator>
3705 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3707 const basic_string& __str,
3709 size_type __n2) const
3711 size_type __sz = __str.size();
3713 this->__throw_out_of_range();
3714 return compare(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2,
3718 template <class _CharT, class _Traits, class _Allocator>
3720 basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
3722 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
3723 return compare(0, npos, __s, traits_type::length(__s));
3726 template <class _CharT, class _Traits, class _Allocator>
3728 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3730 const value_type* __s) const
3732 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
3733 return compare(__pos1, __n1, __s, traits_type::length(__s));
3736 template <class _CharT, class _Traits, class _Allocator>
3738 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3740 const value_type* __s,
3741 size_type __n2) const
3743 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr");
3744 size_type __sz = size();
3745 if (__pos1 > __sz || __n2 == npos)
3746 this->__throw_out_of_range();
3747 size_type __rlen = _VSTD::min(__n1, __sz - __pos1);
3748 int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2));
3753 else if (__rlen > __n2)
3761 template<class _CharT, class _Traits, class _Allocator>
3762 inline _LIBCPP_INLINE_VISIBILITY
3764 basic_string<_CharT, _Traits, _Allocator>::__invariants() const
3766 if (size() > capacity())
3768 if (capacity() < __min_cap - 1)
3772 if (data()[size()] != value_type(0))
3779 template<class _CharT, class _Traits, class _Allocator>
3780 inline _LIBCPP_INLINE_VISIBILITY
3782 operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3783 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3785 size_t __lhs_sz = __lhs.size();
3786 return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(),
3791 template<class _Allocator>
3792 inline _LIBCPP_INLINE_VISIBILITY
3794 operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
3795 const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT
3797 size_t __lhs_sz = __lhs.size();
3798 if (__lhs_sz != __rhs.size())
3800 const char* __lp = __lhs.data();
3801 const char* __rp = __rhs.data();
3802 if (__lhs.__is_long())
3803 return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
3804 for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
3810 template<class _CharT, class _Traits, class _Allocator>
3811 inline _LIBCPP_INLINE_VISIBILITY
3813 operator==(const _CharT* __lhs,
3814 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3816 typedef basic_string<_CharT, _Traits, _Allocator> _String;
3817 _LIBCPP_ASSERT(__lhs != nullptr, "operator==(char*, basic_string): received nullptr");
3818 size_t __lhs_len = _Traits::length(__lhs);
3819 if (__lhs_len != __rhs.size()) return false;
3820 return __rhs.compare(0, _String::npos, __lhs, __lhs_len) == 0;
3823 template<class _CharT, class _Traits, class _Allocator>
3824 inline _LIBCPP_INLINE_VISIBILITY
3826 operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
3827 const _CharT* __rhs) _NOEXCEPT
3829 typedef basic_string<_CharT, _Traits, _Allocator> _String;
3830 _LIBCPP_ASSERT(__rhs != nullptr, "operator==(basic_string, char*): received nullptr");
3831 size_t __rhs_len = _Traits::length(__rhs);
3832 if (__rhs_len != __lhs.size()) return false;
3833 return __lhs.compare(0, _String::npos, __rhs, __rhs_len) == 0;
3838 template<class _CharT, class _Traits, class _Allocator>
3839 inline _LIBCPP_INLINE_VISIBILITY
3841 operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
3842 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3844 return !(__lhs == __rhs);
3847 template<class _CharT, class _Traits, class _Allocator>
3848 inline _LIBCPP_INLINE_VISIBILITY
3850 operator!=(const _CharT* __lhs,
3851 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3853 return !(__lhs == __rhs);
3856 template<class _CharT, class _Traits, class _Allocator>
3857 inline _LIBCPP_INLINE_VISIBILITY
3859 operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3860 const _CharT* __rhs) _NOEXCEPT
3862 return !(__lhs == __rhs);
3867 template<class _CharT, class _Traits, class _Allocator>
3868 inline _LIBCPP_INLINE_VISIBILITY
3870 operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3871 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3873 return __lhs.compare(__rhs) < 0;
3876 template<class _CharT, class _Traits, class _Allocator>
3877 inline _LIBCPP_INLINE_VISIBILITY
3879 operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3880 const _CharT* __rhs) _NOEXCEPT
3882 return __lhs.compare(__rhs) < 0;
3885 template<class _CharT, class _Traits, class _Allocator>
3886 inline _LIBCPP_INLINE_VISIBILITY
3888 operator< (const _CharT* __lhs,
3889 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3891 return __rhs.compare(__lhs) > 0;
3896 template<class _CharT, class _Traits, class _Allocator>
3897 inline _LIBCPP_INLINE_VISIBILITY
3899 operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3900 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3902 return __rhs < __lhs;
3905 template<class _CharT, class _Traits, class _Allocator>
3906 inline _LIBCPP_INLINE_VISIBILITY
3908 operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3909 const _CharT* __rhs) _NOEXCEPT
3911 return __rhs < __lhs;
3914 template<class _CharT, class _Traits, class _Allocator>
3915 inline _LIBCPP_INLINE_VISIBILITY
3917 operator> (const _CharT* __lhs,
3918 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3920 return __rhs < __lhs;
3925 template<class _CharT, class _Traits, class _Allocator>
3926 inline _LIBCPP_INLINE_VISIBILITY
3928 operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3929 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3931 return !(__rhs < __lhs);
3934 template<class _CharT, class _Traits, class _Allocator>
3935 inline _LIBCPP_INLINE_VISIBILITY
3937 operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3938 const _CharT* __rhs) _NOEXCEPT
3940 return !(__rhs < __lhs);
3943 template<class _CharT, class _Traits, class _Allocator>
3944 inline _LIBCPP_INLINE_VISIBILITY
3946 operator<=(const _CharT* __lhs,
3947 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3949 return !(__rhs < __lhs);
3954 template<class _CharT, class _Traits, class _Allocator>
3955 inline _LIBCPP_INLINE_VISIBILITY
3957 operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3958 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3960 return !(__lhs < __rhs);
3963 template<class _CharT, class _Traits, class _Allocator>
3964 inline _LIBCPP_INLINE_VISIBILITY
3966 operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3967 const _CharT* __rhs) _NOEXCEPT
3969 return !(__lhs < __rhs);
3972 template<class _CharT, class _Traits, class _Allocator>
3973 inline _LIBCPP_INLINE_VISIBILITY
3975 operator>=(const _CharT* __lhs,
3976 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3978 return !(__lhs < __rhs);
3983 template<class _CharT, class _Traits, class _Allocator>
3984 basic_string<_CharT, _Traits, _Allocator>
3985 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3986 const basic_string<_CharT, _Traits, _Allocator>& __rhs)
3988 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
3989 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
3990 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
3991 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
3992 __r.append(__rhs.data(), __rhs_sz);
3996 template<class _CharT, class _Traits, class _Allocator>
3997 basic_string<_CharT, _Traits, _Allocator>
3998 operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4000 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
4001 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs);
4002 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
4003 __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
4004 __r.append(__rhs.data(), __rhs_sz);
4008 template<class _CharT, class _Traits, class _Allocator>
4009 basic_string<_CharT, _Traits, _Allocator>
4010 operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4012 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
4013 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
4014 __r.__init(&__lhs, 1, 1 + __rhs_sz);
4015 __r.append(__rhs.data(), __rhs_sz);
4019 template<class _CharT, class _Traits, class _Allocator>
4020 basic_string<_CharT, _Traits, _Allocator>
4021 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
4023 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4024 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4025 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs);
4026 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
4027 __r.append(__rhs, __rhs_sz);
4031 template<class _CharT, class _Traits, class _Allocator>
4032 basic_string<_CharT, _Traits, _Allocator>
4033 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
4035 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4036 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4037 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
4038 __r.push_back(__rhs);
4042 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4044 template<class _CharT, class _Traits, class _Allocator>
4045 inline _LIBCPP_INLINE_VISIBILITY
4046 basic_string<_CharT, _Traits, _Allocator>
4047 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4049 return _VSTD::move(__lhs.append(__rhs));
4052 template<class _CharT, class _Traits, class _Allocator>
4053 inline _LIBCPP_INLINE_VISIBILITY
4054 basic_string<_CharT, _Traits, _Allocator>
4055 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4057 return _VSTD::move(__rhs.insert(0, __lhs));
4060 template<class _CharT, class _Traits, class _Allocator>
4061 inline _LIBCPP_INLINE_VISIBILITY
4062 basic_string<_CharT, _Traits, _Allocator>
4063 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4065 return _VSTD::move(__lhs.append(__rhs));
4068 template<class _CharT, class _Traits, class _Allocator>
4069 inline _LIBCPP_INLINE_VISIBILITY
4070 basic_string<_CharT, _Traits, _Allocator>
4071 operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4073 return _VSTD::move(__rhs.insert(0, __lhs));
4076 template<class _CharT, class _Traits, class _Allocator>
4077 inline _LIBCPP_INLINE_VISIBILITY
4078 basic_string<_CharT, _Traits, _Allocator>
4079 operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4081 __rhs.insert(__rhs.begin(), __lhs);
4082 return _VSTD::move(__rhs);
4085 template<class _CharT, class _Traits, class _Allocator>
4086 inline _LIBCPP_INLINE_VISIBILITY
4087 basic_string<_CharT, _Traits, _Allocator>
4088 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
4090 return _VSTD::move(__lhs.append(__rhs));
4093 template<class _CharT, class _Traits, class _Allocator>
4094 inline _LIBCPP_INLINE_VISIBILITY
4095 basic_string<_CharT, _Traits, _Allocator>
4096 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
4098 __lhs.push_back(__rhs);
4099 return _VSTD::move(__lhs);
4102 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4106 template<class _CharT, class _Traits, class _Allocator>
4107 inline _LIBCPP_INLINE_VISIBILITY
4109 swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
4110 basic_string<_CharT, _Traits, _Allocator>& __rhs)
4111 _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
4116 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
4118 typedef basic_string<char16_t> u16string;
4119 typedef basic_string<char32_t> u32string;
4121 #endif // _LIBCPP_HAS_NO_UNICODE_CHARS
4123 _LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* __idx = 0, int __base = 10);
4124 _LIBCPP_FUNC_VIS long stol (const string& __str, size_t* __idx = 0, int __base = 10);
4125 _LIBCPP_FUNC_VIS unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10);
4126 _LIBCPP_FUNC_VIS long long stoll (const string& __str, size_t* __idx = 0, int __base = 10);
4127 _LIBCPP_FUNC_VIS unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10);
4129 _LIBCPP_FUNC_VIS float stof (const string& __str, size_t* __idx = 0);
4130 _LIBCPP_FUNC_VIS double stod (const string& __str, size_t* __idx = 0);
4131 _LIBCPP_FUNC_VIS long double stold(const string& __str, size_t* __idx = 0);
4133 _LIBCPP_FUNC_VIS string to_string(int __val);
4134 _LIBCPP_FUNC_VIS string to_string(unsigned __val);
4135 _LIBCPP_FUNC_VIS string to_string(long __val);
4136 _LIBCPP_FUNC_VIS string to_string(unsigned long __val);
4137 _LIBCPP_FUNC_VIS string to_string(long long __val);
4138 _LIBCPP_FUNC_VIS string to_string(unsigned long long __val);
4139 _LIBCPP_FUNC_VIS string to_string(float __val);
4140 _LIBCPP_FUNC_VIS string to_string(double __val);
4141 _LIBCPP_FUNC_VIS string to_string(long double __val);
4143 _LIBCPP_FUNC_VIS int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10);
4144 _LIBCPP_FUNC_VIS long stol (const wstring& __str, size_t* __idx = 0, int __base = 10);
4145 _LIBCPP_FUNC_VIS unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10);
4146 _LIBCPP_FUNC_VIS long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10);
4147 _LIBCPP_FUNC_VIS unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10);
4149 _LIBCPP_FUNC_VIS float stof (const wstring& __str, size_t* __idx = 0);
4150 _LIBCPP_FUNC_VIS double stod (const wstring& __str, size_t* __idx = 0);
4151 _LIBCPP_FUNC_VIS long double stold(const wstring& __str, size_t* __idx = 0);
4153 _LIBCPP_FUNC_VIS wstring to_wstring(int __val);
4154 _LIBCPP_FUNC_VIS wstring to_wstring(unsigned __val);
4155 _LIBCPP_FUNC_VIS wstring to_wstring(long __val);
4156 _LIBCPP_FUNC_VIS wstring to_wstring(unsigned long __val);
4157 _LIBCPP_FUNC_VIS wstring to_wstring(long long __val);
4158 _LIBCPP_FUNC_VIS wstring to_wstring(unsigned long long __val);
4159 _LIBCPP_FUNC_VIS wstring to_wstring(float __val);
4160 _LIBCPP_FUNC_VIS wstring to_wstring(double __val);
4161 _LIBCPP_FUNC_VIS wstring to_wstring(long double __val);
4163 template<class _CharT, class _Traits, class _Allocator>
4164 const typename basic_string<_CharT, _Traits, _Allocator>::size_type
4165 basic_string<_CharT, _Traits, _Allocator>::npos;
4167 template<class _CharT, class _Traits, class _Allocator>
4168 struct _LIBCPP_TYPE_VIS_ONLY hash<basic_string<_CharT, _Traits, _Allocator> >
4169 : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t>
4172 operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT;
4175 template<class _CharT, class _Traits, class _Allocator>
4177 hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(
4178 const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT
4180 return __do_string_hash(__val.data(), __val.data() + __val.size());
4183 template<class _CharT, class _Traits, class _Allocator>
4184 basic_ostream<_CharT, _Traits>&
4185 operator<<(basic_ostream<_CharT, _Traits>& __os,
4186 const basic_string<_CharT, _Traits, _Allocator>& __str);
4188 template<class _CharT, class _Traits, class _Allocator>
4189 basic_istream<_CharT, _Traits>&
4190 operator>>(basic_istream<_CharT, _Traits>& __is,
4191 basic_string<_CharT, _Traits, _Allocator>& __str);
4193 template<class _CharT, class _Traits, class _Allocator>
4194 basic_istream<_CharT, _Traits>&
4195 getline(basic_istream<_CharT, _Traits>& __is,
4196 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4198 template<class _CharT, class _Traits, class _Allocator>
4199 inline _LIBCPP_INLINE_VISIBILITY
4200 basic_istream<_CharT, _Traits>&
4201 getline(basic_istream<_CharT, _Traits>& __is,
4202 basic_string<_CharT, _Traits, _Allocator>& __str);
4204 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4206 template<class _CharT, class _Traits, class _Allocator>
4207 inline _LIBCPP_INLINE_VISIBILITY
4208 basic_istream<_CharT, _Traits>&
4209 getline(basic_istream<_CharT, _Traits>&& __is,
4210 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4212 template<class _CharT, class _Traits, class _Allocator>
4213 inline _LIBCPP_INLINE_VISIBILITY
4214 basic_istream<_CharT, _Traits>&
4215 getline(basic_istream<_CharT, _Traits>&& __is,
4216 basic_string<_CharT, _Traits, _Allocator>& __str);
4218 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4220 #if _LIBCPP_DEBUG_LEVEL >= 2
4222 template<class _CharT, class _Traits, class _Allocator>
4224 basic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const
4226 return this->data() <= _VSTD::__to_raw_pointer(__i->base()) &&
4227 _VSTD::__to_raw_pointer(__i->base()) < this->data() + this->size();
4230 template<class _CharT, class _Traits, class _Allocator>
4232 basic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const
4234 return this->data() < _VSTD::__to_raw_pointer(__i->base()) &&
4235 _VSTD::__to_raw_pointer(__i->base()) <= this->data() + this->size();
4238 template<class _CharT, class _Traits, class _Allocator>
4240 basic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
4242 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4243 return this->data() <= __p && __p <= this->data() + this->size();
4246 template<class _CharT, class _Traits, class _Allocator>
4248 basic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
4250 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4251 return this->data() <= __p && __p < this->data() + this->size();
4254 #endif // _LIBCPP_DEBUG_LEVEL >= 2
4256 #if _LIBCPP_STD_VER > 11
4257 // Literal suffixes for basic_string [basic.string.literals]
4258 inline namespace literals
4260 inline namespace string_literals
4262 inline _LIBCPP_INLINE_VISIBILITY
4263 basic_string<char> operator "" s( const char *__str, size_t __len )
4265 return basic_string<char> (__str, __len);
4268 inline _LIBCPP_INLINE_VISIBILITY
4269 basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
4271 return basic_string<wchar_t> (__str, __len);
4274 inline _LIBCPP_INLINE_VISIBILITY
4275 basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len )
4277 return basic_string<char16_t> (__str, __len);
4280 inline _LIBCPP_INLINE_VISIBILITY
4281 basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len )
4283 return basic_string<char32_t> (__str, __len);
4289 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<char>)
4290 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<wchar_t>)
4291 _LIBCPP_EXTERN_TEMPLATE(string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
4293 _LIBCPP_END_NAMESPACE_STD
4295 #endif // _LIBCPP_STRING