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_pointer s, const allocator_type& a = allocator_type());
104
basic_string(const_pointer 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
is_nothrow_move_assignable<allocator_type>::value);
120
basic_string& operator=(const_pointer 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_pointer 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);
165
basic_string& append(const_pointer s, size_type n);
166
basic_string& append(const_pointer 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);
182
basic_string& assign(const_pointer s, size_type n);
183
basic_string& assign(const_pointer 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_pointer s, size_type n);
193
basic_string& insert(size_type pos, const_pointer 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);
208
basic_string& replace(size_type pos, size_type n1, const_pointer s, size_type n2);
209
basic_string& replace(size_type pos, size_type n1, const_pointer 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_pointer s, size_type n);
213
basic_string& replace(const_iterator i1, const_iterator i2, const_pointer 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(pointer 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_type::propagate_on_container_swap::value ||
224
__is_nothrow_swappable<allocator_type>::value)
226
const_pointer c_str() const noexcept;
227
const_pointer 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_pointer s, size_type pos, size_type n) const noexcept;
233
size_type find(const_pointer 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_pointer s, size_type pos, size_type n) const noexcept;
238
size_type rfind(const_pointer 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_pointer s, size_type pos, size_type n) const noexcept;
243
size_type find_first_of(const_pointer 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_pointer s, size_type pos, size_type n) const noexcept;
248
size_type find_last_of(const_pointer 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_pointer s, size_type pos, size_type n) const noexcept;
253
size_type find_first_not_of(const_pointer 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_pointer s, size_type pos, size_type n) const noexcept;
258
size_type find_last_not_of(const_pointer 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) const;
265
int compare(const_pointer s) const noexcept;
266
int compare(size_type pos1, size_type n1, const_pointer s) const;
267
int compare(size_type pos1, size_type n1, const_pointer 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>;
432
#include <cstdio> // For EOF.
439
#include <type_traits>
440
#include <initializer_list>
441
#include <__functional_base>
442
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
445
#if defined(_LIBCPP_NO_EXCEPTIONS) || defined(_LIBCPP_DEBUG)
449
#include <__undef_min_max>
451
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
452
#pragma GCC system_header
455
_LIBCPP_BEGIN_NAMESPACE_STD
459
template <class _StateT>
460
class _LIBCPP_TYPE_VIS fpos
466
_LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {}
468
_LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;}
470
_LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;}
471
_LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;}
473
_LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;}
474
_LIBCPP_INLINE_VISIBILITY fpos operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;}
475
_LIBCPP_INLINE_VISIBILITY fpos& operator-=(streamoff __off) {__off_ -= __off; return *this;}
476
_LIBCPP_INLINE_VISIBILITY fpos operator- (streamoff __off) const {fpos __t(*this); __t -= __off; return __t;}
479
template <class _StateT>
480
inline _LIBCPP_INLINE_VISIBILITY
481
streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
482
{return streamoff(__x) - streamoff(__y);}
484
template <class _StateT>
485
inline _LIBCPP_INLINE_VISIBILITY
486
bool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
487
{return streamoff(__x) == streamoff(__y);}
489
template <class _StateT>
490
inline _LIBCPP_INLINE_VISIBILITY
491
bool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
492
{return streamoff(__x) != streamoff(__y);}
496
template <class _CharT>
497
struct _LIBCPP_TYPE_VIS char_traits
499
typedef _CharT char_type;
500
typedef int int_type;
501
typedef streamoff off_type;
502
typedef streampos pos_type;
503
typedef mbstate_t state_type;
505
_LIBCPP_INLINE_VISIBILITY
506
static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
508
_LIBCPP_INLINE_VISIBILITY
509
static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
510
{return __c1 == __c2;}
511
_LIBCPP_INLINE_VISIBILITY
512
static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
513
{return __c1 < __c2;}
515
static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
516
static size_t length(const char_type* __s);
517
static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
518
static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
519
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
520
static char_type* assign(char_type* __s, size_t __n, char_type __a);
522
_LIBCPP_INLINE_VISIBILITY
523
static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
524
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
525
_LIBCPP_INLINE_VISIBILITY
526
static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
527
{return char_type(__c);}
528
_LIBCPP_INLINE_VISIBILITY
529
static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
530
{return int_type(__c);}
531
_LIBCPP_INLINE_VISIBILITY
532
static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
533
{return __c1 == __c2;}
534
_LIBCPP_INLINE_VISIBILITY
535
static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
536
{return int_type(EOF);}
539
template <class _CharT>
541
char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
543
for (; __n; --__n, ++__s1, ++__s2)
545
if (lt(*__s1, *__s2))
547
if (lt(*__s2, *__s1))
553
template <class _CharT>
554
inline _LIBCPP_INLINE_VISIBILITY
556
char_traits<_CharT>::length(const char_type* __s)
559
for (; !eq(*__s, char_type(0)); ++__s)
564
template <class _CharT>
565
inline _LIBCPP_INLINE_VISIBILITY
567
char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a)
578
template <class _CharT>
580
char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n)
582
char_type* __r = __s1;
585
for (; __n; --__n, ++__s1, ++__s2)
586
assign(*__s1, *__s2);
588
else if (__s2 < __s1)
593
assign(*--__s1, *--__s2);
598
template <class _CharT>
599
inline _LIBCPP_INLINE_VISIBILITY
601
char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
603
char_type* __r = __s1;
604
for (; __n; --__n, ++__s1, ++__s2)
605
assign(*__s1, *__s2);
609
template <class _CharT>
610
inline _LIBCPP_INLINE_VISIBILITY
612
char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a)
614
char_type* __r = __s;
615
for (; __n; --__n, ++__s)
623
struct _LIBCPP_TYPE_VIS char_traits<char>
625
typedef char char_type;
626
typedef int int_type;
627
typedef streamoff off_type;
628
typedef streampos pos_type;
629
typedef mbstate_t state_type;
631
_LIBCPP_INLINE_VISIBILITY
632
static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
634
_LIBCPP_INLINE_VISIBILITY
635
static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
636
{return __c1 == __c2;}
637
_LIBCPP_INLINE_VISIBILITY
638
static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
639
{return (unsigned char)__c1 < (unsigned char)__c2;}
641
_LIBCPP_INLINE_VISIBILITY
642
static int compare(const char_type* __s1, const char_type* __s2, size_t __n)
643
{return memcmp(__s1, __s2, __n);}
644
_LIBCPP_INLINE_VISIBILITY
645
static size_t length(const char_type* __s) {return strlen(__s);}
646
_LIBCPP_INLINE_VISIBILITY
647
static const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
648
{return (const char_type*)memchr(__s, to_int_type(__a), __n);}
649
_LIBCPP_INLINE_VISIBILITY
650
static char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
651
{return (char_type*)memmove(__s1, __s2, __n);}
652
_LIBCPP_INLINE_VISIBILITY
653
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
654
{return (char_type*)memcpy(__s1, __s2, __n);}
655
_LIBCPP_INLINE_VISIBILITY
656
static char_type* assign(char_type* __s, size_t __n, char_type __a)
657
{return (char_type*)memset(__s, to_int_type(__a), __n);}
659
_LIBCPP_INLINE_VISIBILITY
660
static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
661
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
662
_LIBCPP_INLINE_VISIBILITY
663
static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
664
{return char_type(__c);}
665
_LIBCPP_INLINE_VISIBILITY
666
static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
667
{return int_type((unsigned char)__c);}
668
_LIBCPP_INLINE_VISIBILITY
669
static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
670
{return __c1 == __c2;}
671
_LIBCPP_INLINE_VISIBILITY
672
static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
673
{return int_type(EOF);}
676
// char_traits<wchar_t>
679
struct _LIBCPP_TYPE_VIS char_traits<wchar_t>
681
typedef wchar_t char_type;
682
typedef wint_t int_type;
683
typedef streamoff off_type;
684
typedef streampos pos_type;
685
typedef mbstate_t state_type;
687
_LIBCPP_INLINE_VISIBILITY
688
static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
690
_LIBCPP_INLINE_VISIBILITY
691
static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
692
{return __c1 == __c2;}
693
_LIBCPP_INLINE_VISIBILITY
694
static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
695
{return __c1 < __c2;}
697
_LIBCPP_INLINE_VISIBILITY
698
static int compare(const char_type* __s1, const char_type* __s2, size_t __n)
699
{return wmemcmp(__s1, __s2, __n);}
700
_LIBCPP_INLINE_VISIBILITY
701
static size_t length(const char_type* __s)
702
{return wcslen(__s);}
703
_LIBCPP_INLINE_VISIBILITY
704
static const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
705
{return (const char_type*)wmemchr(__s, __a, __n);}
706
_LIBCPP_INLINE_VISIBILITY
707
static char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
708
{return (char_type*)wmemmove(__s1, __s2, __n);}
709
_LIBCPP_INLINE_VISIBILITY
710
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
711
{return (char_type*)wmemcpy(__s1, __s2, __n);}
712
_LIBCPP_INLINE_VISIBILITY
713
static char_type* assign(char_type* __s, size_t __n, char_type __a)
714
{return (char_type*)wmemset(__s, __a, __n);}
716
_LIBCPP_INLINE_VISIBILITY
717
static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
718
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
719
_LIBCPP_INLINE_VISIBILITY
720
static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
721
{return char_type(__c);}
722
_LIBCPP_INLINE_VISIBILITY
723
static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
724
{return int_type(__c);}
725
_LIBCPP_INLINE_VISIBILITY
726
static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
727
{return __c1 == __c2;}
728
_LIBCPP_INLINE_VISIBILITY
729
static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
730
{return int_type(WEOF);}
733
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
736
struct _LIBCPP_TYPE_VIS char_traits<char16_t>
738
typedef char16_t char_type;
739
typedef uint_least16_t int_type;
740
typedef streamoff off_type;
741
typedef u16streampos pos_type;
742
typedef mbstate_t state_type;
744
_LIBCPP_INLINE_VISIBILITY
745
static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
747
_LIBCPP_INLINE_VISIBILITY
748
static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
749
{return __c1 == __c2;}
750
_LIBCPP_INLINE_VISIBILITY
751
static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
752
{return __c1 < __c2;}
754
static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
755
static size_t length(const char_type* __s);
756
static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
757
static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
758
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
759
static char_type* assign(char_type* __s, size_t __n, char_type __a);
761
_LIBCPP_INLINE_VISIBILITY
762
static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
763
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
764
_LIBCPP_INLINE_VISIBILITY
765
static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
766
{return char_type(__c);}
767
_LIBCPP_INLINE_VISIBILITY
768
static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
769
{return int_type(__c);}
770
_LIBCPP_INLINE_VISIBILITY
771
static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
772
{return __c1 == __c2;}
773
_LIBCPP_INLINE_VISIBILITY
774
static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
775
{return int_type(0xDFFF);}
778
inline _LIBCPP_INLINE_VISIBILITY
780
char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
782
for (; __n; --__n, ++__s1, ++__s2)
784
if (lt(*__s1, *__s2))
786
if (lt(*__s2, *__s1))
792
inline _LIBCPP_INLINE_VISIBILITY
794
char_traits<char16_t>::length(const char_type* __s)
797
for (; !eq(*__s, char_type(0)); ++__s)
802
inline _LIBCPP_INLINE_VISIBILITY
804
char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a)
815
inline _LIBCPP_INLINE_VISIBILITY
817
char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
819
char_type* __r = __s1;
822
for (; __n; --__n, ++__s1, ++__s2)
823
assign(*__s1, *__s2);
825
else if (__s2 < __s1)
830
assign(*--__s1, *--__s2);
835
inline _LIBCPP_INLINE_VISIBILITY
837
char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
839
char_type* __r = __s1;
840
for (; __n; --__n, ++__s1, ++__s2)
841
assign(*__s1, *__s2);
845
inline _LIBCPP_INLINE_VISIBILITY
847
char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a)
849
char_type* __r = __s;
850
for (; __n; --__n, ++__s)
856
struct _LIBCPP_TYPE_VIS char_traits<char32_t>
858
typedef char32_t char_type;
859
typedef uint_least32_t int_type;
860
typedef streamoff off_type;
861
typedef u32streampos pos_type;
862
typedef mbstate_t state_type;
864
_LIBCPP_INLINE_VISIBILITY
865
static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
867
_LIBCPP_INLINE_VISIBILITY
868
static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
869
{return __c1 == __c2;}
870
_LIBCPP_INLINE_VISIBILITY
871
static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
872
{return __c1 < __c2;}
874
static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
875
static size_t length(const char_type* __s);
876
static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
877
static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
878
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
879
static char_type* assign(char_type* __s, size_t __n, char_type __a);
881
_LIBCPP_INLINE_VISIBILITY
882
static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
883
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
884
_LIBCPP_INLINE_VISIBILITY
885
static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
886
{return char_type(__c);}
887
_LIBCPP_INLINE_VISIBILITY
888
static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
889
{return int_type(__c);}
890
_LIBCPP_INLINE_VISIBILITY
891
static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
892
{return __c1 == __c2;}
893
_LIBCPP_INLINE_VISIBILITY
894
static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
895
{return int_type(0xFFFFFFFF);}
898
inline _LIBCPP_INLINE_VISIBILITY
900
char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
902
for (; __n; --__n, ++__s1, ++__s2)
904
if (lt(*__s1, *__s2))
906
if (lt(*__s2, *__s1))
912
inline _LIBCPP_INLINE_VISIBILITY
914
char_traits<char32_t>::length(const char_type* __s)
917
for (; !eq(*__s, char_type(0)); ++__s)
922
inline _LIBCPP_INLINE_VISIBILITY
924
char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a)
935
inline _LIBCPP_INLINE_VISIBILITY
937
char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
939
char_type* __r = __s1;
942
for (; __n; --__n, ++__s1, ++__s2)
943
assign(*__s1, *__s2);
945
else if (__s2 < __s1)
950
assign(*--__s1, *--__s2);
955
inline _LIBCPP_INLINE_VISIBILITY
957
char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
959
char_type* __r = __s1;
960
for (; __n; --__n, ++__s1, ++__s2)
961
assign(*__s1, *__s2);
965
inline _LIBCPP_INLINE_VISIBILITY
967
char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a)
969
char_type* __r = __s;
970
for (; __n; --__n, ++__s)
975
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
979
template<class _CharT, class _Traits, class _Allocator>
980
basic_string<_CharT, _Traits, _Allocator>
981
operator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
982
const basic_string<_CharT, _Traits, _Allocator>& __y);
984
template<class _CharT, class _Traits, class _Allocator>
985
basic_string<_CharT, _Traits, _Allocator>
986
operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
988
template<class _CharT, class _Traits, class _Allocator>
989
basic_string<_CharT, _Traits, _Allocator>
990
operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
992
template<class _CharT, class _Traits, class _Allocator>
993
basic_string<_CharT, _Traits, _Allocator>
994
operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
996
template<class _CharT, class _Traits, class _Allocator>
997
basic_string<_CharT, _Traits, _Allocator>
998
operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
1001
class __basic_string_common
1004
void __throw_length_error() const;
1005
void __throw_out_of_range() const;
1010
__basic_string_common<__b>::__throw_length_error() const
1012
#ifndef _LIBCPP_NO_EXCEPTIONS
1013
throw length_error("basic_string");
1015
assert(!"basic_string length_error");
1021
__basic_string_common<__b>::__throw_out_of_range() const
1023
#ifndef _LIBCPP_NO_EXCEPTIONS
1024
throw out_of_range("basic_string");
1026
assert(!"basic_string out_of_range");
1031
#pragma warning( push )
1032
#pragma warning( disable: 4231 )
1034
_LIBCPP_EXTERN_TEMPLATE(class __basic_string_common<true>)
1036
#pragma warning( pop )
1039
template<class _CharT, class _Traits, class _Allocator>
1040
class _LIBCPP_TYPE_VIS basic_string
1041
: private __basic_string_common<true>
1044
typedef basic_string __self;
1045
typedef _Traits traits_type;
1046
typedef typename traits_type::char_type value_type;
1047
typedef _Allocator allocator_type;
1048
typedef allocator_traits<allocator_type> __alloc_traits;
1049
typedef typename __alloc_traits::size_type size_type;
1050
typedef typename __alloc_traits::difference_type difference_type;
1051
typedef value_type& reference;
1052
typedef const value_type& const_reference;
1053
typedef typename __alloc_traits::pointer pointer;
1054
typedef typename __alloc_traits::const_pointer const_pointer;
1055
#ifdef _LIBCPP_DEBUG
1056
typedef __debug_iter<basic_string, pointer> iterator;
1057
typedef __debug_iter<basic_string, const_pointer> const_iterator;
1059
friend class __debug_iter<basic_string, pointer>;
1060
friend class __debug_iter<basic_string, const_pointer>;
1061
#elif defined(_LIBCPP_RAW_ITERATORS)
1062
typedef pointer iterator;
1063
typedef const_pointer const_iterator;
1064
#else // defined(_LIBCPP_RAW_ITERATORS)
1065
typedef __wrap_iter<pointer> iterator;
1066
typedef __wrap_iter<const_pointer> const_iterator;
1067
#endif // defined(_LIBCPP_RAW_ITERATORS)
1068
typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1069
typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
1079
#if _LIBCPP_BIG_ENDIAN
1080
enum {__short_mask = 0x80};
1081
enum {__long_mask = ~(size_type(~0) >> 1)};
1082
#else // _LIBCPP_BIG_ENDIAN
1083
enum {__short_mask = 0x01};
1084
enum {__long_mask = 0x1ul};
1085
#endif // _LIBCPP_BIG_ENDIAN
1087
enum {__mask = size_type(~0) >> 1};
1089
enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1090
(sizeof(__long) - 1)/sizeof(value_type) : 2};
1096
unsigned char __size_;
1099
value_type __data_[__min_cap];
1102
union __lx{__long __lx; __short __lxx;};
1104
enum {__n_words = sizeof(__lx) / sizeof(size_type)};
1108
size_type __words[__n_words];
1121
__compressed_pair<__rep, allocator_type> __r_;
1123
#ifdef _LIBCPP_DEBUG
1125
pair<iterator*, const_iterator*> __iterator_list_;
1127
_LIBCPP_INLINE_VISIBILITY iterator*& __get_iterator_list(iterator*) {return __iterator_list_.first;}
1128
_LIBCPP_INLINE_VISIBILITY const_iterator*& __get_iterator_list(const_iterator*) {return __iterator_list_.second;}
1130
#endif // _LIBCPP_DEBUG
1133
static const size_type npos = -1;
1135
_LIBCPP_INLINE_VISIBILITY basic_string()
1136
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
1137
_LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a);
1138
basic_string(const basic_string& __str);
1139
basic_string(const basic_string& __str, const allocator_type& __a);
1140
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1141
_LIBCPP_INLINE_VISIBILITY
1142
basic_string(basic_string&& __str)
1143
_NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
1144
_LIBCPP_INLINE_VISIBILITY
1145
basic_string(basic_string&& __str, const allocator_type& __a);
1146
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1147
_LIBCPP_INLINE_VISIBILITY basic_string(const_pointer __s);
1148
_LIBCPP_INLINE_VISIBILITY
1149
basic_string(const_pointer __s, const allocator_type& __a);
1150
_LIBCPP_INLINE_VISIBILITY
1151
basic_string(const_pointer __s, size_type __n);
1152
_LIBCPP_INLINE_VISIBILITY
1153
basic_string(const_pointer __s, size_type __n, const allocator_type& __a);
1154
_LIBCPP_INLINE_VISIBILITY
1155
basic_string(size_type __n, value_type __c);
1156
_LIBCPP_INLINE_VISIBILITY
1157
basic_string(size_type __n, value_type __c, const allocator_type& __a);
1158
basic_string(const basic_string& __str, size_type __pos, size_type __n = npos,
1159
const allocator_type& __a = allocator_type());
1160
template<class _InputIterator>
1161
_LIBCPP_INLINE_VISIBILITY
1162
basic_string(_InputIterator __first, _InputIterator __last);
1163
template<class _InputIterator>
1164
_LIBCPP_INLINE_VISIBILITY
1165
basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);
1166
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1167
_LIBCPP_INLINE_VISIBILITY
1168
basic_string(initializer_list<value_type> __il);
1169
_LIBCPP_INLINE_VISIBILITY
1170
basic_string(initializer_list<value_type> __il, const allocator_type& __a);
1171
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1175
basic_string& operator=(const basic_string& __str);
1176
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1177
_LIBCPP_INLINE_VISIBILITY
1178
basic_string& operator=(basic_string&& __str)
1179
_NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1180
is_nothrow_move_assignable<allocator_type>::value);
1182
_LIBCPP_INLINE_VISIBILITY basic_string& operator=(const_pointer __s) {return assign(__s);}
1183
basic_string& operator=(value_type __c);
1184
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1185
_LIBCPP_INLINE_VISIBILITY
1186
basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
1187
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1189
#ifndef _LIBCPP_DEBUG
1190
_LIBCPP_INLINE_VISIBILITY
1191
iterator begin() _NOEXCEPT
1192
{return iterator(__get_pointer());}
1193
_LIBCPP_INLINE_VISIBILITY
1194
const_iterator begin() const _NOEXCEPT
1195
{return const_iterator(data());}
1196
_LIBCPP_INLINE_VISIBILITY
1197
iterator end() _NOEXCEPT
1198
{return iterator(__get_pointer() + size());}
1199
_LIBCPP_INLINE_VISIBILITY
1200
const_iterator end() const _NOEXCEPT
1201
{return const_iterator(data() + size());}
1202
#else // _LIBCPP_DEBUG
1203
_LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(this, __get_pointer());}
1204
_LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return const_iterator(this, data());}
1205
_LIBCPP_INLINE_VISIBILITY iterator end() {return iterator(this, __get_pointer() + size());}
1206
_LIBCPP_INLINE_VISIBILITY const_iterator end() const {return const_iterator(this, data() + size());}
1207
#endif // _LIBCPP_DEBUG
1208
_LIBCPP_INLINE_VISIBILITY
1209
reverse_iterator rbegin() _NOEXCEPT
1210
{return reverse_iterator(end());}
1211
_LIBCPP_INLINE_VISIBILITY
1212
const_reverse_iterator rbegin() const _NOEXCEPT
1213
{return const_reverse_iterator(end());}
1214
_LIBCPP_INLINE_VISIBILITY
1215
reverse_iterator rend() _NOEXCEPT
1216
{return reverse_iterator(begin());}
1217
_LIBCPP_INLINE_VISIBILITY
1218
const_reverse_iterator rend() const _NOEXCEPT
1219
{return const_reverse_iterator(begin());}
1221
_LIBCPP_INLINE_VISIBILITY
1222
const_iterator cbegin() const _NOEXCEPT
1224
_LIBCPP_INLINE_VISIBILITY
1225
const_iterator cend() const _NOEXCEPT
1227
_LIBCPP_INLINE_VISIBILITY
1228
const_reverse_iterator crbegin() const _NOEXCEPT
1230
_LIBCPP_INLINE_VISIBILITY
1231
const_reverse_iterator crend() const _NOEXCEPT
1234
_LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
1235
{return __is_long() ? __get_long_size() : __get_short_size();}
1236
_LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
1237
_LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
1238
_LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
1239
{return (__is_long() ? __get_long_cap() : __min_cap) - 1;}
1241
void resize(size_type __n, value_type __c);
1242
_LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
1244
void reserve(size_type res_arg = 0);
1245
_LIBCPP_INLINE_VISIBILITY
1246
void shrink_to_fit() _NOEXCEPT {reserve();}
1247
_LIBCPP_INLINE_VISIBILITY
1248
void clear() _NOEXCEPT;
1249
_LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;}
1251
_LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const;
1252
_LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos);
1254
const_reference at(size_type __n) const;
1255
reference at(size_type __n);
1257
_LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
1258
_LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const_pointer __s) {return append(__s);}
1259
_LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;}
1260
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1261
_LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
1262
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1264
_LIBCPP_INLINE_VISIBILITY
1265
basic_string& append(const basic_string& __str);
1266
basic_string& append(const basic_string& __str, size_type __pos, size_type __n);
1267
basic_string& append(const_pointer __s, size_type __n);
1268
basic_string& append(const_pointer __s);
1269
basic_string& append(size_type __n, value_type __c);
1270
template<class _InputIterator>
1273
__is_input_iterator <_InputIterator>::value &&
1274
!__is_forward_iterator<_InputIterator>::value,
1277
append(_InputIterator __first, _InputIterator __last);
1278
template<class _ForwardIterator>
1281
__is_forward_iterator<_ForwardIterator>::value,
1284
append(_ForwardIterator __first, _ForwardIterator __last);
1285
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1286
_LIBCPP_INLINE_VISIBILITY
1287
basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
1288
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1290
void push_back(value_type __c);
1291
_LIBCPP_INLINE_VISIBILITY
1293
_LIBCPP_INLINE_VISIBILITY reference front();
1294
_LIBCPP_INLINE_VISIBILITY const_reference front() const;
1295
_LIBCPP_INLINE_VISIBILITY reference back();
1296
_LIBCPP_INLINE_VISIBILITY const_reference back() const;
1298
_LIBCPP_INLINE_VISIBILITY
1299
basic_string& assign(const basic_string& __str);
1300
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1301
_LIBCPP_INLINE_VISIBILITY
1302
basic_string& assign(basic_string&& str)
1303
{*this = _VSTD::move(str); return *this;}
1305
basic_string& assign(const basic_string& __str, size_type __pos, size_type __n);
1306
basic_string& assign(const_pointer __s, size_type __n);
1307
basic_string& assign(const_pointer __s);
1308
basic_string& assign(size_type __n, value_type __c);
1309
template<class _InputIterator>
1312
__is_input_iterator <_InputIterator>::value &&
1313
!__is_forward_iterator<_InputIterator>::value,
1316
assign(_InputIterator __first, _InputIterator __last);
1317
template<class _ForwardIterator>
1320
__is_forward_iterator<_ForwardIterator>::value,
1323
assign(_ForwardIterator __first, _ForwardIterator __last);
1324
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1325
_LIBCPP_INLINE_VISIBILITY
1326
basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
1327
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1329
_LIBCPP_INLINE_VISIBILITY
1330
basic_string& insert(size_type __pos1, const basic_string& __str);
1331
basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n);
1332
basic_string& insert(size_type __pos, const_pointer __s, size_type __n);
1333
basic_string& insert(size_type __pos, const_pointer __s);
1334
basic_string& insert(size_type __pos, size_type __n, value_type __c);
1335
iterator insert(const_iterator __pos, value_type __c);
1336
_LIBCPP_INLINE_VISIBILITY
1337
iterator insert(const_iterator __pos, size_type __n, value_type __c);
1338
template<class _InputIterator>
1341
__is_input_iterator <_InputIterator>::value &&
1342
!__is_forward_iterator<_InputIterator>::value,
1345
insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
1346
template<class _ForwardIterator>
1349
__is_forward_iterator<_ForwardIterator>::value,
1352
insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
1353
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1354
_LIBCPP_INLINE_VISIBILITY
1355
iterator insert(const_iterator __pos, initializer_list<value_type> __il)
1356
{return insert(__pos, __il.begin(), __il.end());}
1357
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1359
basic_string& erase(size_type __pos = 0, size_type __n = npos);
1360
_LIBCPP_INLINE_VISIBILITY
1361
iterator erase(const_iterator __pos);
1362
_LIBCPP_INLINE_VISIBILITY
1363
iterator erase(const_iterator __first, const_iterator __last);
1365
_LIBCPP_INLINE_VISIBILITY
1366
basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
1367
basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2);
1368
basic_string& replace(size_type __pos, size_type __n1, const_pointer __s, size_type __n2);
1369
basic_string& replace(size_type __pos, size_type __n1, const_pointer __s);
1370
basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
1371
_LIBCPP_INLINE_VISIBILITY
1372
basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
1373
_LIBCPP_INLINE_VISIBILITY
1374
basic_string& replace(const_iterator __i1, const_iterator __i2, const_pointer __s, size_type __n);
1375
_LIBCPP_INLINE_VISIBILITY
1376
basic_string& replace(const_iterator __i1, const_iterator __i2, const_pointer __s);
1377
_LIBCPP_INLINE_VISIBILITY
1378
basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
1379
template<class _InputIterator>
1382
__is_input_iterator<_InputIterator>::value,
1385
replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
1386
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1387
_LIBCPP_INLINE_VISIBILITY
1388
basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
1389
{return replace(__i1, __i2, __il.begin(), __il.end());}
1390
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1392
size_type copy(pointer __s, size_type __n, size_type __pos = 0) const;
1393
_LIBCPP_INLINE_VISIBILITY
1394
basic_string substr(size_type __pos = 0, size_type __n = npos) const;
1396
_LIBCPP_INLINE_VISIBILITY
1397
void swap(basic_string& __str)
1398
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1399
__is_nothrow_swappable<allocator_type>::value);
1401
_LIBCPP_INLINE_VISIBILITY
1402
const_pointer c_str() const _NOEXCEPT {return data();}
1403
_LIBCPP_INLINE_VISIBILITY
1404
const_pointer data() const _NOEXCEPT {return __get_pointer();}
1406
_LIBCPP_INLINE_VISIBILITY
1407
allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
1409
_LIBCPP_INLINE_VISIBILITY
1410
size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
1411
size_type find(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
1412
_LIBCPP_INLINE_VISIBILITY
1413
size_type find(const_pointer __s, size_type __pos = 0) const _NOEXCEPT;
1414
size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1416
_LIBCPP_INLINE_VISIBILITY
1417
size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
1418
size_type rfind(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
1419
_LIBCPP_INLINE_VISIBILITY
1420
size_type rfind(const_pointer __s, size_type __pos = npos) const _NOEXCEPT;
1421
size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1423
_LIBCPP_INLINE_VISIBILITY
1424
size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
1425
size_type find_first_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
1426
_LIBCPP_INLINE_VISIBILITY
1427
size_type find_first_of(const_pointer __s, size_type __pos = 0) const _NOEXCEPT;
1428
_LIBCPP_INLINE_VISIBILITY
1429
size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1431
_LIBCPP_INLINE_VISIBILITY
1432
size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
1433
size_type find_last_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
1434
_LIBCPP_INLINE_VISIBILITY
1435
size_type find_last_of(const_pointer __s, size_type __pos = npos) const _NOEXCEPT;
1436
_LIBCPP_INLINE_VISIBILITY
1437
size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1439
_LIBCPP_INLINE_VISIBILITY
1440
size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
1441
size_type find_first_not_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
1442
_LIBCPP_INLINE_VISIBILITY
1443
size_type find_first_not_of(const_pointer __s, size_type __pos = 0) const _NOEXCEPT;
1444
_LIBCPP_INLINE_VISIBILITY
1445
size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1447
_LIBCPP_INLINE_VISIBILITY
1448
size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
1449
size_type find_last_not_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
1450
_LIBCPP_INLINE_VISIBILITY
1451
size_type find_last_not_of(const_pointer __s, size_type __pos = npos) const _NOEXCEPT;
1452
_LIBCPP_INLINE_VISIBILITY
1453
size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1455
_LIBCPP_INLINE_VISIBILITY
1456
int compare(const basic_string& __str) const _NOEXCEPT;
1457
_LIBCPP_INLINE_VISIBILITY
1458
int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
1459
int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2) const;
1460
int compare(const_pointer __s) const _NOEXCEPT;
1461
int compare(size_type __pos1, size_type __n1, const_pointer __s) const;
1462
int compare(size_type __pos1, size_type __n1, const_pointer __s, size_type __n2) const;
1464
_LIBCPP_INLINE_VISIBILITY bool __invariants() const;
1466
_LIBCPP_INLINE_VISIBILITY
1467
allocator_type& __alloc() _NOEXCEPT
1468
{return __r_.second();}
1469
_LIBCPP_INLINE_VISIBILITY
1470
const allocator_type& __alloc() const _NOEXCEPT
1471
{return __r_.second();}
1473
_LIBCPP_INLINE_VISIBILITY
1474
bool __is_long() const _NOEXCEPT
1475
{return bool(__r_.first().__s.__size_ & __short_mask);}
1477
_LIBCPP_INLINE_VISIBILITY
1478
void __set_short_size(size_type __s) _NOEXCEPT
1479
#if _LIBCPP_BIG_ENDIAN
1480
{__r_.first().__s.__size_ = (unsigned char)(__s);}
1482
{__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
1484
_LIBCPP_INLINE_VISIBILITY
1485
size_type __get_short_size() const _NOEXCEPT
1486
#if _LIBCPP_BIG_ENDIAN
1487
{return __r_.first().__s.__size_;}
1489
{return __r_.first().__s.__size_ >> 1;}
1491
_LIBCPP_INLINE_VISIBILITY
1492
void __set_long_size(size_type __s) _NOEXCEPT
1493
{__r_.first().__l.__size_ = __s;}
1494
_LIBCPP_INLINE_VISIBILITY
1495
size_type __get_long_size() const _NOEXCEPT
1496
{return __r_.first().__l.__size_;}
1497
_LIBCPP_INLINE_VISIBILITY
1498
void __set_size(size_type __s) _NOEXCEPT
1499
{if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
1501
_LIBCPP_INLINE_VISIBILITY
1502
void __set_long_cap(size_type __s) _NOEXCEPT
1503
{__r_.first().__l.__cap_ = __long_mask | __s;}
1504
_LIBCPP_INLINE_VISIBILITY
1505
size_type __get_long_cap() const _NOEXCEPT
1506
{return __r_.first().__l.__cap_ & size_type(~__long_mask);}
1508
_LIBCPP_INLINE_VISIBILITY
1509
void __set_long_pointer(pointer __p) _NOEXCEPT
1510
{__r_.first().__l.__data_ = __p;}
1511
_LIBCPP_INLINE_VISIBILITY
1512
pointer __get_long_pointer() _NOEXCEPT
1513
{return __r_.first().__l.__data_;}
1514
_LIBCPP_INLINE_VISIBILITY
1515
const_pointer __get_long_pointer() const _NOEXCEPT
1516
{return __r_.first().__l.__data_;}
1517
_LIBCPP_INLINE_VISIBILITY
1518
pointer __get_short_pointer() _NOEXCEPT
1519
{return __r_.first().__s.__data_;}
1520
_LIBCPP_INLINE_VISIBILITY
1521
const_pointer __get_short_pointer() const _NOEXCEPT
1522
{return __r_.first().__s.__data_;}
1523
_LIBCPP_INLINE_VISIBILITY
1524
pointer __get_pointer() _NOEXCEPT
1525
{return __is_long() ? __get_long_pointer() : __get_short_pointer();}
1526
_LIBCPP_INLINE_VISIBILITY
1527
const_pointer __get_pointer() const _NOEXCEPT
1528
{return __is_long() ? __get_long_pointer() : __get_short_pointer();}
1530
_LIBCPP_INLINE_VISIBILITY
1531
void __zero() _NOEXCEPT
1533
size_type (&__a)[__n_words] = __r_.first().__r.__words;
1534
for (unsigned __i = 0; __i < __n_words; ++__i)
1538
template <size_type __a> static
1539
_LIBCPP_INLINE_VISIBILITY
1540
size_type __align(size_type __s) _NOEXCEPT
1541
{return __s + (__a-1) & ~(__a-1);}
1542
enum {__alignment = 16};
1543
static _LIBCPP_INLINE_VISIBILITY
1544
size_type __recommend(size_type __s) _NOEXCEPT
1545
{return (__s < __min_cap ? __min_cap :
1546
__align<sizeof(value_type) < __alignment ?
1547
__alignment/sizeof(value_type) : 1 > (__s+1)) - 1;}
1549
void __init(const_pointer __s, size_type __sz, size_type __reserve);
1550
void __init(const_pointer __s, size_type __sz);
1551
void __init(size_type __n, value_type __c);
1553
template <class _InputIterator>
1556
__is_input_iterator <_InputIterator>::value &&
1557
!__is_forward_iterator<_InputIterator>::value,
1560
__init(_InputIterator __first, _InputIterator __last);
1562
template <class _ForwardIterator>
1565
__is_forward_iterator<_ForwardIterator>::value,
1568
__init(_ForwardIterator __first, _ForwardIterator __last);
1570
void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1571
size_type __n_copy, size_type __n_del, size_type __n_add = 0);
1572
void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1573
size_type __n_copy, size_type __n_del,
1574
size_type __n_add, const_pointer __p_new_stuff);
1576
_LIBCPP_INLINE_VISIBILITY
1577
void __erase_to_end(size_type __pos);
1579
_LIBCPP_INLINE_VISIBILITY
1580
void __copy_assign_alloc(const basic_string& __str)
1581
{__copy_assign_alloc(__str, integral_constant<bool,
1582
__alloc_traits::propagate_on_container_copy_assignment::value>());}
1584
_LIBCPP_INLINE_VISIBILITY
1585
void __copy_assign_alloc(const basic_string& __str, true_type)
1587
if (__alloc() != __str.__alloc())
1592
__alloc() = __str.__alloc();
1595
_LIBCPP_INLINE_VISIBILITY
1596
void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
1599
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1600
_LIBCPP_INLINE_VISIBILITY
1601
void __move_assign(basic_string& __str, false_type);
1602
_LIBCPP_INLINE_VISIBILITY
1603
void __move_assign(basic_string& __str, true_type)
1604
_NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
1607
_LIBCPP_INLINE_VISIBILITY
1609
__move_assign_alloc(basic_string& __str)
1611
!__alloc_traits::propagate_on_container_move_assignment::value ||
1612
is_nothrow_move_assignable<allocator_type>::value)
1613
{__move_assign_alloc(__str, integral_constant<bool,
1614
__alloc_traits::propagate_on_container_move_assignment::value>());}
1616
_LIBCPP_INLINE_VISIBILITY
1617
void __move_assign_alloc(basic_string& __c, true_type)
1618
_NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1620
__alloc() = _VSTD::move(__c.__alloc());
1623
_LIBCPP_INLINE_VISIBILITY
1624
void __move_assign_alloc(basic_string&, false_type)
1628
_LIBCPP_INLINE_VISIBILITY
1629
static void __swap_alloc(allocator_type& __x, allocator_type& __y)
1630
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1631
__is_nothrow_swappable<allocator_type>::value)
1632
{__swap_alloc(__x, __y, integral_constant<bool,
1633
__alloc_traits::propagate_on_container_swap::value>());}
1635
_LIBCPP_INLINE_VISIBILITY
1636
static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type)
1637
_NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value)
1642
_LIBCPP_INLINE_VISIBILITY
1643
static void __swap_alloc(allocator_type&, allocator_type&, false_type) _NOEXCEPT
1646
_LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
1647
_LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type);
1649
friend basic_string operator+<>(const basic_string&, const basic_string&);
1650
friend basic_string operator+<>(const value_type*, const basic_string&);
1651
friend basic_string operator+<>(value_type, const basic_string&);
1652
friend basic_string operator+<>(const basic_string&, const value_type*);
1653
friend basic_string operator+<>(const basic_string&, value_type);
1656
template <class _CharT, class _Traits, class _Allocator>
1657
#ifndef _LIBCPP_DEBUG
1658
_LIBCPP_INLINE_VISIBILITY inline
1661
basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators()
1663
#ifdef _LIBCPP_DEBUG
1664
iterator::__remove_all(this);
1665
const_iterator::__remove_all(this);
1666
#endif // _LIBCPP_DEBUG
1669
template <class _CharT, class _Traits, class _Allocator>
1670
#ifndef _LIBCPP_DEBUG
1671
_LIBCPP_INLINE_VISIBILITY inline
1674
basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type
1675
#ifdef _LIBCPP_DEBUG
1680
#ifdef _LIBCPP_DEBUG
1681
const_iterator __beg = begin();
1682
if (__iterator_list_.first)
1684
for (iterator* __p = __iterator_list_.first; __p;)
1686
if (*__p - __beg > static_cast<difference_type>(__pos))
1688
iterator* __n = __p;
1690
__n->__remove_owner();
1696
if (__iterator_list_.second)
1698
for (const_iterator* __p = __iterator_list_.second; __p;)
1700
if (*__p - __beg > static_cast<difference_type>(__pos))
1702
const_iterator* __n = __p;
1704
__n->__remove_owner();
1710
#endif // _LIBCPP_DEBUG
1713
template <class _CharT, class _Traits, class _Allocator>
1714
_LIBCPP_INLINE_VISIBILITY inline
1715
basic_string<_CharT, _Traits, _Allocator>::basic_string()
1716
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
1721
template <class _CharT, class _Traits, class _Allocator>
1722
_LIBCPP_INLINE_VISIBILITY inline
1723
basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
1729
template <class _CharT, class _Traits, class _Allocator>
1731
basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type __sz, size_type __reserve)
1733
if (__reserve > max_size())
1734
this->__throw_length_error();
1736
if (__reserve < __min_cap)
1738
__set_short_size(__sz);
1739
__p = __get_short_pointer();
1743
size_type __cap = __recommend(__reserve);
1744
__p = __alloc_traits::allocate(__alloc(), __cap+1);
1745
__set_long_pointer(__p);
1746
__set_long_cap(__cap+1);
1747
__set_long_size(__sz);
1749
traits_type::copy(__p, __s, __sz);
1750
traits_type::assign(__p[__sz], value_type());
1753
template <class _CharT, class _Traits, class _Allocator>
1755
basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type __sz)
1757
if (__sz > max_size())
1758
this->__throw_length_error();
1760
if (__sz < __min_cap)
1762
__set_short_size(__sz);
1763
__p = __get_short_pointer();
1767
size_type __cap = __recommend(__sz);
1768
__p = __alloc_traits::allocate(__alloc(), __cap+1);
1769
__set_long_pointer(__p);
1770
__set_long_cap(__cap+1);
1771
__set_long_size(__sz);
1773
traits_type::copy(__p, __s, __sz);
1774
traits_type::assign(__p[__sz], value_type());
1777
template <class _CharT, class _Traits, class _Allocator>
1778
_LIBCPP_INLINE_VISIBILITY inline
1779
basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s)
1781
#ifdef _LIBCPP_DEBUG
1784
__init(__s, traits_type::length(__s));
1787
template <class _CharT, class _Traits, class _Allocator>
1788
_LIBCPP_INLINE_VISIBILITY inline
1789
basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, const allocator_type& __a)
1792
#ifdef _LIBCPP_DEBUG
1795
__init(__s, traits_type::length(__s));
1798
template <class _CharT, class _Traits, class _Allocator>
1799
_LIBCPP_INLINE_VISIBILITY inline
1800
basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, size_type __n)
1802
#ifdef _LIBCPP_DEBUG
1808
template <class _CharT, class _Traits, class _Allocator>
1809
_LIBCPP_INLINE_VISIBILITY inline
1810
basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, size_type __n, const allocator_type& __a)
1813
#ifdef _LIBCPP_DEBUG
1819
template <class _CharT, class _Traits, class _Allocator>
1820
basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
1821
: __r_(__alloc_traits::select_on_container_copy_construction(__str.__alloc()))
1823
if (!__str.__is_long())
1824
__r_.first().__r = __str.__r_.first().__r;
1826
__init(__str.__get_long_pointer(), __str.__get_long_size());
1829
template <class _CharT, class _Traits, class _Allocator>
1830
basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, const allocator_type& __a)
1833
if (!__str.__is_long())
1834
__r_.first().__r = __str.__r_.first().__r;
1836
__init(__str.__get_long_pointer(), __str.__get_long_size());
1839
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1841
template <class _CharT, class _Traits, class _Allocator>
1842
_LIBCPP_INLINE_VISIBILITY inline
1843
basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str)
1844
_NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
1845
: __r_(_VSTD::move(__str.__r_))
1848
#ifdef _LIBCPP_DEBUG
1849
__str.__invalidate_all_iterators();
1853
template <class _CharT, class _Traits, class _Allocator>
1854
_LIBCPP_INLINE_VISIBILITY inline
1855
basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)
1858
if (__a == __str.__alloc() || !__str.__is_long())
1859
__r_.first().__r = __str.__r_.first().__r;
1861
__init(__str.__get_long_pointer(), __str.__get_long_size());
1863
#ifdef _LIBCPP_DEBUG
1864
__str.__invalidate_all_iterators();
1868
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1870
template <class _CharT, class _Traits, class _Allocator>
1872
basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
1874
if (__n > max_size())
1875
this->__throw_length_error();
1877
if (__n < __min_cap)
1879
__set_short_size(__n);
1880
__p = __get_short_pointer();
1884
size_type __cap = __recommend(__n);
1885
__p = __alloc_traits::allocate(__alloc(), __cap+1);
1886
__set_long_pointer(__p);
1887
__set_long_cap(__cap+1);
1888
__set_long_size(__n);
1890
traits_type::assign(__p, __n, __c);
1891
traits_type::assign(__p[__n], value_type());
1894
template <class _CharT, class _Traits, class _Allocator>
1895
_LIBCPP_INLINE_VISIBILITY inline
1896
basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c)
1901
template <class _CharT, class _Traits, class _Allocator>
1902
_LIBCPP_INLINE_VISIBILITY inline
1903
basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c, const allocator_type& __a)
1909
template <class _CharT, class _Traits, class _Allocator>
1910
basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, size_type __n,
1911
const allocator_type& __a)
1914
size_type __str_sz = __str.size();
1915
if (__pos > __str_sz)
1916
this->__throw_out_of_range();
1917
__init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos));
1920
template <class _CharT, class _Traits, class _Allocator>
1921
template <class _InputIterator>
1924
__is_input_iterator <_InputIterator>::value &&
1925
!__is_forward_iterator<_InputIterator>::value,
1928
basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
1931
#ifndef _LIBCPP_NO_EXCEPTIONS
1934
#endif // _LIBCPP_NO_EXCEPTIONS
1935
for (; __first != __last; ++__first)
1936
push_back(*__first);
1937
#ifndef _LIBCPP_NO_EXCEPTIONS
1942
__alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
1945
#endif // _LIBCPP_NO_EXCEPTIONS
1948
template <class _CharT, class _Traits, class _Allocator>
1949
template <class _ForwardIterator>
1952
__is_forward_iterator<_ForwardIterator>::value,
1955
basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
1957
size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last));
1958
if (__sz > max_size())
1959
this->__throw_length_error();
1961
if (__sz < __min_cap)
1963
__set_short_size(__sz);
1964
__p = __get_short_pointer();
1968
size_type __cap = __recommend(__sz);
1969
__p = __alloc_traits::allocate(__alloc(), __cap+1);
1970
__set_long_pointer(__p);
1971
__set_long_cap(__cap+1);
1972
__set_long_size(__sz);
1974
for (; __first != __last; ++__first, ++__p)
1975
traits_type::assign(*__p, *__first);
1976
traits_type::assign(*__p, value_type());
1979
template <class _CharT, class _Traits, class _Allocator>
1980
template<class _InputIterator>
1981
_LIBCPP_INLINE_VISIBILITY inline
1982
basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last)
1984
__init(__first, __last);
1987
template <class _CharT, class _Traits, class _Allocator>
1988
template<class _InputIterator>
1989
_LIBCPP_INLINE_VISIBILITY inline
1990
basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last,
1991
const allocator_type& __a)
1994
__init(__first, __last);
1997
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1999
template <class _CharT, class _Traits, class _Allocator>
2000
_LIBCPP_INLINE_VISIBILITY inline
2001
basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il)
2003
__init(__il.begin(), __il.end());
2006
template <class _CharT, class _Traits, class _Allocator>
2007
_LIBCPP_INLINE_VISIBILITY inline
2008
basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il, const allocator_type& __a)
2011
__init(__il.begin(), __il.end());
2014
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2016
template <class _CharT, class _Traits, class _Allocator>
2017
basic_string<_CharT, _Traits, _Allocator>::~basic_string()
2019
__invalidate_all_iterators();
2021
__alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2024
template <class _CharT, class _Traits, class _Allocator>
2026
basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
2027
(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2028
size_type __n_copy, size_type __n_del, size_type __n_add, const_pointer __p_new_stuff)
2030
size_type __ms = max_size();
2031
if (__delta_cap > __ms - __old_cap - 1)
2032
this->__throw_length_error();
2033
pointer __old_p = __get_pointer();
2034
size_type __cap = __old_cap < __ms / 2 - __alignment ?
2035
__recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
2037
pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
2038
__invalidate_all_iterators();
2040
traits_type::copy(__p, __old_p, __n_copy);
2042
traits_type::copy(__p + __n_copy, __p_new_stuff, __n_add);
2043
size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2044
if (__sec_cp_sz != 0)
2045
traits_type::copy(__p + __n_copy + __n_add, __old_p + __n_copy + __n_del, __sec_cp_sz);
2046
if (__old_cap+1 != __min_cap)
2047
__alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
2048
__set_long_pointer(__p);
2049
__set_long_cap(__cap+1);
2050
__old_sz = __n_copy + __n_add + __sec_cp_sz;
2051
__set_long_size(__old_sz);
2052
traits_type::assign(__p[__old_sz], value_type());
2055
template <class _CharT, class _Traits, class _Allocator>
2057
basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2058
size_type __n_copy, size_type __n_del, size_type __n_add)
2060
size_type __ms = max_size();
2061
if (__delta_cap > __ms - __old_cap - 1)
2062
this->__throw_length_error();
2063
pointer __old_p = __get_pointer();
2064
size_type __cap = __old_cap < __ms / 2 - __alignment ?
2065
__recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
2067
pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
2068
__invalidate_all_iterators();
2070
traits_type::copy(__p, __old_p, __n_copy);
2071
size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2072
if (__sec_cp_sz != 0)
2073
traits_type::copy(__p + __n_copy + __n_add, __old_p + __n_copy + __n_del, __sec_cp_sz);
2074
if (__old_cap+1 != __min_cap)
2075
__alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
2076
__set_long_pointer(__p);
2077
__set_long_cap(__cap+1);
2082
template <class _CharT, class _Traits, class _Allocator>
2083
basic_string<_CharT, _Traits, _Allocator>&
2084
basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s, size_type __n)
2086
#ifdef _LIBCPP_DEBUG
2089
size_type __cap = capacity();
2092
pointer __p = __get_pointer();
2093
traits_type::move(__p, __s, __n);
2094
traits_type::assign(__p[__n], value_type());
2096
__invalidate_iterators_past(__n);
2100
size_type __sz = size();
2101
__grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
2106
template <class _CharT, class _Traits, class _Allocator>
2107
basic_string<_CharT, _Traits, _Allocator>&
2108
basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
2110
size_type __cap = capacity();
2113
size_type __sz = size();
2114
__grow_by(__cap, __n - __cap, __sz, 0, __sz);
2117
__invalidate_iterators_past(__n);
2118
pointer __p = __get_pointer();
2119
traits_type::assign(__p, __n, __c);
2120
traits_type::assign(__p[__n], value_type());
2125
template <class _CharT, class _Traits, class _Allocator>
2126
basic_string<_CharT, _Traits, _Allocator>&
2127
basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
2132
__p = __get_long_pointer();
2137
__p = __get_short_pointer();
2138
__set_short_size(1);
2140
traits_type::assign(*__p, __c);
2141
traits_type::assign(*++__p, value_type());
2142
__invalidate_iterators_past(1);
2146
template <class _CharT, class _Traits, class _Allocator>
2147
basic_string<_CharT, _Traits, _Allocator>&
2148
basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
2152
__copy_assign_alloc(__str);
2158
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2160
template <class _CharT, class _Traits, class _Allocator>
2161
_LIBCPP_INLINE_VISIBILITY inline
2163
basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
2165
if (__alloc() != __str.__alloc())
2168
__move_assign(__str, true_type());
2171
template <class _CharT, class _Traits, class _Allocator>
2172
_LIBCPP_INLINE_VISIBILITY inline
2174
basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
2175
_NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
2179
__r_.first() = __str.__r_.first();
2180
__move_assign_alloc(__str);
2184
template <class _CharT, class _Traits, class _Allocator>
2185
_LIBCPP_INLINE_VISIBILITY inline
2186
basic_string<_CharT, _Traits, _Allocator>&
2187
basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str)
2188
_NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
2189
is_nothrow_move_assignable<allocator_type>::value)
2191
__move_assign(__str, integral_constant<bool,
2192
__alloc_traits::propagate_on_container_move_assignment::value>());
2198
template <class _CharT, class _Traits, class _Allocator>
2199
template<class _InputIterator>
2202
__is_input_iterator <_InputIterator>::value &&
2203
!__is_forward_iterator<_InputIterator>::value,
2204
basic_string<_CharT, _Traits, _Allocator>&
2206
basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2209
for (; __first != __last; ++__first)
2210
push_back(*__first);
2214
template <class _CharT, class _Traits, class _Allocator>
2215
template<class _ForwardIterator>
2218
__is_forward_iterator<_ForwardIterator>::value,
2219
basic_string<_CharT, _Traits, _Allocator>&
2221
basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2223
size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2224
size_type __cap = capacity();
2227
size_type __sz = size();
2228
__grow_by(__cap, __n - __cap, __sz, 0, __sz);
2231
__invalidate_iterators_past(__n);
2232
pointer __p = __get_pointer();
2233
for (; __first != __last; ++__first, ++__p)
2234
traits_type::assign(*__p, *__first);
2235
traits_type::assign(*__p, value_type());
2240
template <class _CharT, class _Traits, class _Allocator>
2241
_LIBCPP_INLINE_VISIBILITY inline
2242
basic_string<_CharT, _Traits, _Allocator>&
2243
basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str)
2245
return assign(__str.data(), __str.size());
2248
template <class _CharT, class _Traits, class _Allocator>
2249
basic_string<_CharT, _Traits, _Allocator>&
2250
basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
2252
size_type __sz = __str.size();
2254
this->__throw_out_of_range();
2255
return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
2258
template <class _CharT, class _Traits, class _Allocator>
2259
basic_string<_CharT, _Traits, _Allocator>&
2260
basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s)
2262
#ifdef _LIBCPP_DEBUG
2265
return assign(__s, traits_type::length(__s));
2270
template <class _CharT, class _Traits, class _Allocator>
2271
basic_string<_CharT, _Traits, _Allocator>&
2272
basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s, size_type __n)
2274
#ifdef _LIBCPP_DEBUG
2277
size_type __cap = capacity();
2278
size_type __sz = size();
2279
if (__cap - __sz >= __n)
2283
pointer __p = __get_pointer();
2284
traits_type::copy(__p + __sz, __s, __n);
2287
traits_type::assign(__p[__sz], value_type());
2291
__grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
2295
template <class _CharT, class _Traits, class _Allocator>
2296
basic_string<_CharT, _Traits, _Allocator>&
2297
basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
2301
size_type __cap = capacity();
2302
size_type __sz = size();
2303
if (__cap - __sz < __n)
2304
__grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2305
pointer __p = __get_pointer();
2306
traits_type::assign(__p + __sz, __n, __c);
2309
traits_type::assign(__p[__sz], value_type());
2314
template <class _CharT, class _Traits, class _Allocator>
2316
basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
2318
size_type __cap = capacity();
2319
size_type __sz = size();
2321
__grow_by(__cap, 1, __sz, __sz, 0);
2322
pointer __p = __get_pointer() + __sz;
2323
traits_type::assign(*__p, __c);
2324
traits_type::assign(*++__p, value_type());
2328
template <class _CharT, class _Traits, class _Allocator>
2329
template<class _InputIterator>
2332
__is_input_iterator <_InputIterator>::value &&
2333
!__is_forward_iterator<_InputIterator>::value,
2334
basic_string<_CharT, _Traits, _Allocator>&
2336
basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last)
2338
for (; __first != __last; ++__first)
2339
push_back(*__first);
2343
template <class _CharT, class _Traits, class _Allocator>
2344
template<class _ForwardIterator>
2347
__is_forward_iterator<_ForwardIterator>::value,
2348
basic_string<_CharT, _Traits, _Allocator>&
2350
basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last)
2352
size_type __sz = size();
2353
size_type __cap = capacity();
2354
size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2357
if (__cap - __sz < __n)
2358
__grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2359
pointer __p = __get_pointer() + __sz;
2360
for (; __first != __last; ++__p, ++__first)
2361
traits_type::assign(*__p, *__first);
2362
traits_type::assign(*__p, value_type());
2363
__set_size(__sz + __n);
2368
template <class _CharT, class _Traits, class _Allocator>
2369
_LIBCPP_INLINE_VISIBILITY inline
2370
basic_string<_CharT, _Traits, _Allocator>&
2371
basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
2373
return append(__str.data(), __str.size());
2376
template <class _CharT, class _Traits, class _Allocator>
2377
basic_string<_CharT, _Traits, _Allocator>&
2378
basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
2380
size_type __sz = __str.size();
2382
this->__throw_out_of_range();
2383
return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
2386
template <class _CharT, class _Traits, class _Allocator>
2387
basic_string<_CharT, _Traits, _Allocator>&
2388
basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s)
2390
#ifdef _LIBCPP_DEBUG
2393
return append(__s, traits_type::length(__s));
2398
template <class _CharT, class _Traits, class _Allocator>
2399
basic_string<_CharT, _Traits, _Allocator>&
2400
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const_pointer __s, size_type __n)
2402
#ifdef _LIBCPP_DEBUG
2405
size_type __sz = size();
2407
this->__throw_out_of_range();
2408
size_type __cap = capacity();
2409
if (__cap - __sz >= __n)
2413
pointer __p = __get_pointer();
2414
size_type __n_move = __sz - __pos;
2417
if (__p + __pos <= __s && __s < __p + __sz)
2419
traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2421
traits_type::move(__p + __pos, __s, __n);
2424
traits_type::assign(__p[__sz], value_type());
2428
__grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2432
template <class _CharT, class _Traits, class _Allocator>
2433
basic_string<_CharT, _Traits, _Allocator>&
2434
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
2436
size_type __sz = size();
2438
this->__throw_out_of_range();
2441
size_type __cap = capacity();
2443
if (__cap - __sz >= __n)
2445
__p = __get_pointer();
2446
size_type __n_move = __sz - __pos;
2448
traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2452
__grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
2453
__p = __get_long_pointer();
2455
traits_type::assign(__p + __pos, __n, __c);
2458
traits_type::assign(__p[__sz], value_type());
2463
template <class _CharT, class _Traits, class _Allocator>
2464
template<class _InputIterator>
2467
__is_input_iterator <_InputIterator>::value &&
2468
!__is_forward_iterator<_InputIterator>::value,
2469
typename basic_string<_CharT, _Traits, _Allocator>::iterator
2471
basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
2473
size_type __old_sz = size();
2474
difference_type __ip = __pos - begin();
2475
for (; __first != __last; ++__first)
2476
push_back(*__first);
2477
pointer __p = __get_pointer();
2478
_VSTD::rotate(__p + __ip, __p + __old_sz, __p + size());
2479
return iterator(__p + __ip);
2482
template <class _CharT, class _Traits, class _Allocator>
2483
template<class _ForwardIterator>
2486
__is_forward_iterator<_ForwardIterator>::value,
2487
typename basic_string<_CharT, _Traits, _Allocator>::iterator
2489
basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
2491
size_type __ip = static_cast<size_type>(__pos - begin());
2492
size_type __sz = size();
2493
size_type __cap = capacity();
2494
size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2498
if (__cap - __sz >= __n)
2500
__p = __get_pointer();
2501
size_type __n_move = __sz - __ip;
2503
traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
2507
__grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
2508
__p = __get_long_pointer();
2512
traits_type::assign(__p[__sz], value_type());
2513
for (__p += __ip; __first != __last; ++__p, ++__first)
2514
traits_type::assign(*__p, *__first);
2516
return begin() + __ip;
2519
template <class _CharT, class _Traits, class _Allocator>
2520
_LIBCPP_INLINE_VISIBILITY inline
2521
basic_string<_CharT, _Traits, _Allocator>&
2522
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str)
2524
return insert(__pos1, __str.data(), __str.size());
2527
template <class _CharT, class _Traits, class _Allocator>
2528
basic_string<_CharT, _Traits, _Allocator>&
2529
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
2530
size_type __pos2, size_type __n)
2532
size_type __str_sz = __str.size();
2533
if (__pos2 > __str_sz)
2534
this->__throw_out_of_range();
2535
return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
2538
template <class _CharT, class _Traits, class _Allocator>
2539
basic_string<_CharT, _Traits, _Allocator>&
2540
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const_pointer __s)
2542
#ifdef _LIBCPP_DEBUG
2545
return insert(__pos, __s, traits_type::length(__s));
2548
template <class _CharT, class _Traits, class _Allocator>
2549
typename basic_string<_CharT, _Traits, _Allocator>::iterator
2550
basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
2552
size_type __ip = static_cast<size_type>(__pos - begin());
2553
size_type __sz = size();
2554
size_type __cap = capacity();
2558
__grow_by(__cap, 1, __sz, __ip, 0, 1);
2559
__p = __get_long_pointer();
2563
__p = __get_pointer();
2564
size_type __n_move = __sz - __ip;
2566
traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
2568
traits_type::assign(__p[__ip], __c);
2569
traits_type::assign(__p[++__sz], value_type());
2571
return begin() + static_cast<difference_type>(__ip);
2574
template <class _CharT, class _Traits, class _Allocator>
2575
_LIBCPP_INLINE_VISIBILITY inline
2576
typename basic_string<_CharT, _Traits, _Allocator>::iterator
2577
basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c)
2579
difference_type __p = __pos - begin();
2580
insert(static_cast<size_type>(__p), __n, __c);
2581
return begin() + __p;
2586
template <class _CharT, class _Traits, class _Allocator>
2587
basic_string<_CharT, _Traits, _Allocator>&
2588
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const_pointer __s, size_type __n2)
2590
#ifdef _LIBCPP_DEBUG
2593
size_type __sz = size();
2595
this->__throw_out_of_range();
2596
__n1 = _VSTD::min(__n1, __sz - __pos);
2597
size_type __cap = capacity();
2598
if (__cap - __sz + __n1 >= __n2)
2600
pointer __p = __get_pointer();
2603
size_type __n_move = __sz - __pos - __n1;
2608
traits_type::move(__p + __pos, __s, __n2);
2609
traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2612
if (__p + __pos < __s && __s < __p + __sz)
2614
if (__p + __pos + __n1 <= __s)
2616
else // __p + __pos < __s < __p + __pos + __n1
2618
traits_type::move(__p + __pos, __s, __n1);
2625
traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2628
traits_type::move(__p + __pos, __s, __n2);
2630
__sz += __n2 - __n1;
2632
__invalidate_iterators_past(__sz);
2633
traits_type::assign(__p[__sz], value_type());
2636
__grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
2640
template <class _CharT, class _Traits, class _Allocator>
2641
basic_string<_CharT, _Traits, _Allocator>&
2642
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
2644
size_type __sz = size();
2646
this->__throw_out_of_range();
2647
__n1 = _VSTD::min(__n1, __sz - __pos);
2648
size_type __cap = capacity();
2650
if (__cap - __sz + __n1 >= __n2)
2652
__p = __get_pointer();
2655
size_type __n_move = __sz - __pos - __n1;
2657
traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2662
__grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
2663
__p = __get_long_pointer();
2665
traits_type::assign(__p + __pos, __n2, __c);
2666
__sz += __n2 - __n1;
2668
__invalidate_iterators_past(__sz);
2669
traits_type::assign(__p[__sz], value_type());
2673
template <class _CharT, class _Traits, class _Allocator>
2674
template<class _InputIterator>
2677
__is_input_iterator<_InputIterator>::value,
2678
basic_string<_CharT, _Traits, _Allocator>&
2680
basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
2681
_InputIterator __j1, _InputIterator __j2)
2683
for (; true; ++__i1, ++__j1)
2688
insert(__i1, __j1, __j2);
2696
traits_type::assign(const_cast<value_type&>(*__i1), *__j1);
2701
template <class _CharT, class _Traits, class _Allocator>
2702
_LIBCPP_INLINE_VISIBILITY inline
2703
basic_string<_CharT, _Traits, _Allocator>&
2704
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str)
2706
return replace(__pos1, __n1, __str.data(), __str.size());
2709
template <class _CharT, class _Traits, class _Allocator>
2710
basic_string<_CharT, _Traits, _Allocator>&
2711
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
2712
size_type __pos2, size_type __n2)
2714
size_type __str_sz = __str.size();
2715
if (__pos2 > __str_sz)
2716
this->__throw_out_of_range();
2717
return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
2720
template <class _CharT, class _Traits, class _Allocator>
2721
basic_string<_CharT, _Traits, _Allocator>&
2722
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const_pointer __s)
2724
#ifdef _LIBCPP_DEBUG
2727
return replace(__pos, __n1, __s, traits_type::length(__s));
2730
template <class _CharT, class _Traits, class _Allocator>
2731
_LIBCPP_INLINE_VISIBILITY inline
2732
basic_string<_CharT, _Traits, _Allocator>&
2733
basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str)
2735
return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1),
2736
__str.data(), __str.size());
2739
template <class _CharT, class _Traits, class _Allocator>
2740
_LIBCPP_INLINE_VISIBILITY inline
2741
basic_string<_CharT, _Traits, _Allocator>&
2742
basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const_pointer __s, size_type __n)
2744
return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
2747
template <class _CharT, class _Traits, class _Allocator>
2748
_LIBCPP_INLINE_VISIBILITY inline
2749
basic_string<_CharT, _Traits, _Allocator>&
2750
basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const_pointer __s)
2752
return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
2755
template <class _CharT, class _Traits, class _Allocator>
2756
_LIBCPP_INLINE_VISIBILITY inline
2757
basic_string<_CharT, _Traits, _Allocator>&
2758
basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c)
2760
return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
2765
template <class _CharT, class _Traits, class _Allocator>
2766
basic_string<_CharT, _Traits, _Allocator>&
2767
basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n)
2769
size_type __sz = size();
2771
this->__throw_out_of_range();
2774
pointer __p = __get_pointer();
2775
__n = _VSTD::min(__n, __sz - __pos);
2776
size_type __n_move = __sz - __pos - __n;
2778
traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
2781
__invalidate_iterators_past(__sz);
2782
traits_type::assign(__p[__sz], value_type());
2787
template <class _CharT, class _Traits, class _Allocator>
2788
_LIBCPP_INLINE_VISIBILITY inline
2789
typename basic_string<_CharT, _Traits, _Allocator>::iterator
2790
basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
2792
iterator __b = begin();
2793
size_type __r = static_cast<size_type>(__pos - __b);
2795
return __b + static_cast<difference_type>(__r);
2798
template <class _CharT, class _Traits, class _Allocator>
2799
_LIBCPP_INLINE_VISIBILITY inline
2800
typename basic_string<_CharT, _Traits, _Allocator>::iterator
2801
basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
2803
iterator __b = begin();
2804
size_type __r = static_cast<size_type>(__first - __b);
2805
erase(__r, static_cast<size_type>(__last - __first));
2806
return __b + static_cast<difference_type>(__r);
2809
template <class _CharT, class _Traits, class _Allocator>
2810
_LIBCPP_INLINE_VISIBILITY inline
2812
basic_string<_CharT, _Traits, _Allocator>::pop_back()
2814
#ifdef _LIBCPP_DEBUG
2820
__sz = __get_long_size() - 1;
2821
__set_long_size(__sz);
2822
traits_type::assign(*(__get_long_pointer() + __sz), value_type());
2826
__sz = __get_short_size() - 1;
2827
__set_short_size(__sz);
2828
traits_type::assign(*(__get_short_pointer() + __sz), value_type());
2830
__invalidate_iterators_past(__sz);
2833
template <class _CharT, class _Traits, class _Allocator>
2834
_LIBCPP_INLINE_VISIBILITY inline
2836
basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
2838
__invalidate_all_iterators();
2841
traits_type::assign(*__get_long_pointer(), value_type());
2846
traits_type::assign(*__get_short_pointer(), value_type());
2847
__set_short_size(0);
2851
template <class _CharT, class _Traits, class _Allocator>
2852
_LIBCPP_INLINE_VISIBILITY inline
2854
basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
2858
traits_type::assign(*(__get_long_pointer() + __pos), value_type());
2859
__set_long_size(__pos);
2863
traits_type::assign(*(__get_short_pointer() + __pos), value_type());
2864
__set_short_size(__pos);
2866
__invalidate_iterators_past(__pos);
2869
template <class _CharT, class _Traits, class _Allocator>
2871
basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
2873
size_type __sz = size();
2875
append(__n - __sz, __c);
2877
__erase_to_end(__n);
2880
template <class _CharT, class _Traits, class _Allocator>
2881
_LIBCPP_INLINE_VISIBILITY inline
2882
typename basic_string<_CharT, _Traits, _Allocator>::size_type
2883
basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT
2885
size_type __m = __alloc_traits::max_size(__alloc());
2886
#if _LIBCPP_BIG_ENDIAN
2887
return (__m <= ~__long_mask ? __m : __m/2) - 1;
2893
template <class _CharT, class _Traits, class _Allocator>
2895
basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
2897
if (__res_arg > max_size())
2898
this->__throw_length_error();
2899
size_type __cap = capacity();
2900
size_type __sz = size();
2901
__res_arg = _VSTD::max(__res_arg, __sz);
2902
__res_arg = __recommend(__res_arg);
2903
if (__res_arg != __cap)
2905
pointer __new_data, __p;
2906
bool __was_long, __now_long;
2907
if (__res_arg == __min_cap - 1)
2911
__new_data = __get_short_pointer();
2912
__p = __get_long_pointer();
2916
if (__res_arg > __cap)
2917
__new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
2920
#ifndef _LIBCPP_NO_EXCEPTIONS
2923
#endif // _LIBCPP_NO_EXCEPTIONS
2924
__new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
2925
#ifndef _LIBCPP_NO_EXCEPTIONS
2931
#else // _LIBCPP_NO_EXCEPTIONS
2932
if (__new_data == 0)
2934
#endif // _LIBCPP_NO_EXCEPTIONS
2937
__was_long = __is_long();
2938
__p = __get_pointer();
2940
traits_type::copy(__new_data, __p, size()+1);
2942
__alloc_traits::deallocate(__alloc(), __p, __cap+1);
2945
__set_long_cap(__res_arg+1);
2946
__set_long_size(__sz);
2947
__set_long_pointer(__new_data);
2950
__set_short_size(__sz);
2951
__invalidate_all_iterators();
2955
template <class _CharT, class _Traits, class _Allocator>
2956
_LIBCPP_INLINE_VISIBILITY inline
2957
typename basic_string<_CharT, _Traits, _Allocator>::const_reference
2958
basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const
2960
#ifdef __LIBCPP_DEBUG
2961
assert(__pos <= size());
2963
return *(data() + __pos);
2966
template <class _CharT, class _Traits, class _Allocator>
2967
_LIBCPP_INLINE_VISIBILITY inline
2968
typename basic_string<_CharT, _Traits, _Allocator>::reference
2969
basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos)
2971
#ifdef __LIBCPP_DEBUG
2972
assert(__pos < size());
2974
return *(__get_pointer() + __pos);
2977
template <class _CharT, class _Traits, class _Allocator>
2978
typename basic_string<_CharT, _Traits, _Allocator>::const_reference
2979
basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
2982
this->__throw_out_of_range();
2983
return (*this)[__n];
2986
template <class _CharT, class _Traits, class _Allocator>
2987
typename basic_string<_CharT, _Traits, _Allocator>::reference
2988
basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
2991
this->__throw_out_of_range();
2992
return (*this)[__n];
2995
template <class _CharT, class _Traits, class _Allocator>
2996
_LIBCPP_INLINE_VISIBILITY inline
2997
typename basic_string<_CharT, _Traits, _Allocator>::reference
2998
basic_string<_CharT, _Traits, _Allocator>::front()
3000
#ifdef _LIBCPP_DEBUG
3003
return *__get_pointer();
3006
template <class _CharT, class _Traits, class _Allocator>
3007
_LIBCPP_INLINE_VISIBILITY inline
3008
typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3009
basic_string<_CharT, _Traits, _Allocator>::front() const
3011
#ifdef _LIBCPP_DEBUG
3017
template <class _CharT, class _Traits, class _Allocator>
3018
_LIBCPP_INLINE_VISIBILITY inline
3019
typename basic_string<_CharT, _Traits, _Allocator>::reference
3020
basic_string<_CharT, _Traits, _Allocator>::back()
3022
#ifdef _LIBCPP_DEBUG
3025
return *(__get_pointer() + size() - 1);
3028
template <class _CharT, class _Traits, class _Allocator>
3029
_LIBCPP_INLINE_VISIBILITY inline
3030
typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3031
basic_string<_CharT, _Traits, _Allocator>::back() const
3033
#ifdef _LIBCPP_DEBUG
3036
return *(data() + size() - 1);
3039
template <class _CharT, class _Traits, class _Allocator>
3040
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3041
basic_string<_CharT, _Traits, _Allocator>::copy(pointer __s, size_type __n, size_type __pos) const
3043
size_type __sz = size();
3045
this->__throw_out_of_range();
3046
size_type __rlen = _VSTD::min(__n, __sz - __pos);
3047
traits_type::copy(__s, data() + __pos, __rlen);
3051
template <class _CharT, class _Traits, class _Allocator>
3052
_LIBCPP_INLINE_VISIBILITY inline
3053
basic_string<_CharT, _Traits, _Allocator>
3054
basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const
3056
return basic_string(*this, __pos, __n, __alloc());
3059
template <class _CharT, class _Traits, class _Allocator>
3060
_LIBCPP_INLINE_VISIBILITY inline
3062
basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
3063
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3064
__is_nothrow_swappable<allocator_type>::value)
3066
_VSTD::swap(__r_.first(), __str.__r_.first());
3067
__swap_alloc(__alloc(), __str.__alloc());
3068
#ifdef _LIBCPP_DEBUG
3069
__invalidate_all_iterators();
3070
__str.__invalidate_all_iterators();
3071
#endif // _LIBCPP_DEBUG
3076
template <class _Traits>
3077
struct _LIBCPP_HIDDEN __traits_eq
3079
typedef typename _Traits::char_type char_type;
3080
_LIBCPP_INLINE_VISIBILITY
3081
bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
3082
{return _Traits::eq(__x, __y);}
3085
template<class _CharT, class _Traits, class _Allocator>
3086
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3087
basic_string<_CharT, _Traits, _Allocator>::find(const_pointer __s,
3089
size_type __n) const _NOEXCEPT
3091
#ifdef _LIBCPP_DEBUG
3094
size_type __sz = size();
3095
if (__pos > __sz || __sz - __pos < __n)
3099
const_pointer __p = data();
3100
const_pointer __r = _VSTD::search(__p + __pos, __p + __sz, __s, __s + __n,
3101
__traits_eq<traits_type>());
3102
if (__r == __p + __sz)
3104
return static_cast<size_type>(__r - __p);
3107
template<class _CharT, class _Traits, class _Allocator>
3108
_LIBCPP_INLINE_VISIBILITY inline
3109
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3110
basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
3111
size_type __pos) const _NOEXCEPT
3113
return find(__str.data(), __pos, __str.size());
3116
template<class _CharT, class _Traits, class _Allocator>
3117
_LIBCPP_INLINE_VISIBILITY inline
3118
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3119
basic_string<_CharT, _Traits, _Allocator>::find(const_pointer __s,
3120
size_type __pos) const _NOEXCEPT
3122
#ifdef _LIBCPP_DEBUG
3125
return find(__s, __pos, traits_type::length(__s));
3128
template<class _CharT, class _Traits, class _Allocator>
3129
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3130
basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
3131
size_type __pos) const _NOEXCEPT
3133
size_type __sz = size();
3136
const_pointer __p = data();
3137
const_pointer __r = traits_type::find(__p + __pos, __sz - __pos, __c);
3140
return static_cast<size_type>(__r - __p);
3145
template<class _CharT, class _Traits, class _Allocator>
3146
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3147
basic_string<_CharT, _Traits, _Allocator>::rfind(const_pointer __s,
3149
size_type __n) const _NOEXCEPT
3151
#ifdef _LIBCPP_DEBUG
3154
size_type __sz = size();
3155
__pos = _VSTD::min(__pos, __sz);
3156
if (__n < __sz - __pos)
3160
const_pointer __p = data();
3161
const_pointer __r = _VSTD::find_end(__p, __p + __pos, __s, __s + __n,
3162
__traits_eq<traits_type>());
3163
if (__n > 0 && __r == __p + __pos)
3165
return static_cast<size_type>(__r - __p);
3168
template<class _CharT, class _Traits, class _Allocator>
3169
_LIBCPP_INLINE_VISIBILITY inline
3170
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3171
basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
3172
size_type __pos) const _NOEXCEPT
3174
return rfind(__str.data(), __pos, __str.size());
3177
template<class _CharT, class _Traits, class _Allocator>
3178
_LIBCPP_INLINE_VISIBILITY inline
3179
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3180
basic_string<_CharT, _Traits, _Allocator>::rfind(const_pointer __s,
3181
size_type __pos) const _NOEXCEPT
3183
#ifdef _LIBCPP_DEBUG
3186
return rfind(__s, __pos, traits_type::length(__s));
3189
template<class _CharT, class _Traits, class _Allocator>
3190
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3191
basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
3192
size_type __pos) const _NOEXCEPT
3194
size_type __sz = size();
3201
const_pointer __p = data();
3202
for (const_pointer __ps = __p + __pos; __ps != __p;)
3204
if (traits_type::eq(*--__ps, __c))
3205
return static_cast<size_type>(__ps - __p);
3213
template<class _CharT, class _Traits, class _Allocator>
3214
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3215
basic_string<_CharT, _Traits, _Allocator>::find_first_of(const_pointer __s,
3217
size_type __n) const _NOEXCEPT
3219
#ifdef _LIBCPP_DEBUG
3222
size_type __sz = size();
3223
if (__pos >= __sz || __n == 0)
3225
const_pointer __p = data();
3226
const_pointer __r = _VSTD::find_first_of(__p + __pos, __p + __sz, __s,
3227
__s + __n, __traits_eq<traits_type>());
3228
if (__r == __p + __sz)
3230
return static_cast<size_type>(__r - __p);
3233
template<class _CharT, class _Traits, class _Allocator>
3234
_LIBCPP_INLINE_VISIBILITY inline
3235
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3236
basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
3237
size_type __pos) const _NOEXCEPT
3239
return find_first_of(__str.data(), __pos, __str.size());
3242
template<class _CharT, class _Traits, class _Allocator>
3243
_LIBCPP_INLINE_VISIBILITY inline
3244
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3245
basic_string<_CharT, _Traits, _Allocator>::find_first_of(const_pointer __s,
3246
size_type __pos) const _NOEXCEPT
3248
#ifdef _LIBCPP_DEBUG
3251
return find_first_of(__s, __pos, traits_type::length(__s));
3254
template<class _CharT, class _Traits, class _Allocator>
3255
_LIBCPP_INLINE_VISIBILITY inline
3256
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3257
basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
3258
size_type __pos) const _NOEXCEPT
3260
return find(__c, __pos);
3265
template<class _CharT, class _Traits, class _Allocator>
3266
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3267
basic_string<_CharT, _Traits, _Allocator>::find_last_of(const_pointer __s,
3269
size_type __n) const _NOEXCEPT
3271
#ifdef _LIBCPP_DEBUG
3276
size_type __sz = size();
3281
const_pointer __p = data();
3282
for (const_pointer __ps = __p + __pos; __ps != __p;)
3284
const_pointer __r = traits_type::find(__s, __n, *--__ps);
3286
return static_cast<size_type>(__ps - __p);
3292
template<class _CharT, class _Traits, class _Allocator>
3293
_LIBCPP_INLINE_VISIBILITY inline
3294
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3295
basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
3296
size_type __pos) const _NOEXCEPT
3298
return find_last_of(__str.data(), __pos, __str.size());
3301
template<class _CharT, class _Traits, class _Allocator>
3302
_LIBCPP_INLINE_VISIBILITY inline
3303
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3304
basic_string<_CharT, _Traits, _Allocator>::find_last_of(const_pointer __s,
3305
size_type __pos) const _NOEXCEPT
3307
#ifdef _LIBCPP_DEBUG
3310
return find_last_of(__s, __pos, traits_type::length(__s));
3313
template<class _CharT, class _Traits, class _Allocator>
3314
_LIBCPP_INLINE_VISIBILITY inline
3315
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3316
basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
3317
size_type __pos) const _NOEXCEPT
3319
return rfind(__c, __pos);
3322
// find_first_not_of
3324
template<class _CharT, class _Traits, class _Allocator>
3325
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3326
basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const_pointer __s,
3328
size_type __n) const _NOEXCEPT
3330
#ifdef _LIBCPP_DEBUG
3333
size_type __sz = size();
3336
const_pointer __p = data();
3337
const_pointer __pe = __p + __sz;
3338
for (const_pointer __ps = __p + __pos; __ps != __pe; ++__ps)
3339
if (traits_type::find(__s, __n, *__ps) == 0)
3340
return static_cast<size_type>(__ps - __p);
3345
template<class _CharT, class _Traits, class _Allocator>
3346
_LIBCPP_INLINE_VISIBILITY inline
3347
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3348
basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
3349
size_type __pos) const _NOEXCEPT
3351
return find_first_not_of(__str.data(), __pos, __str.size());
3354
template<class _CharT, class _Traits, class _Allocator>
3355
_LIBCPP_INLINE_VISIBILITY inline
3356
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3357
basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const_pointer __s,
3358
size_type __pos) const _NOEXCEPT
3360
#ifdef _LIBCPP_DEBUG
3363
return find_first_not_of(__s, __pos, traits_type::length(__s));
3366
template<class _CharT, class _Traits, class _Allocator>
3367
_LIBCPP_INLINE_VISIBILITY inline
3368
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3369
basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
3370
size_type __pos) const _NOEXCEPT
3372
size_type __sz = size();
3375
const_pointer __p = data();
3376
const_pointer __pe = __p + __sz;
3377
for (const_pointer __ps = __p + __pos; __ps != __pe; ++__ps)
3378
if (!traits_type::eq(*__ps, __c))
3379
return static_cast<size_type>(__ps - __p);
3386
template<class _CharT, class _Traits, class _Allocator>
3387
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3388
basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const_pointer __s,
3390
size_type __n) const _NOEXCEPT
3392
#ifdef _LIBCPP_DEBUG
3395
size_type __sz = size();
3400
const_pointer __p = data();
3401
for (const_pointer __ps = __p + __pos; __ps != __p;)
3402
if (traits_type::find(__s, __n, *--__ps) == 0)
3403
return static_cast<size_type>(__ps - __p);
3407
template<class _CharT, class _Traits, class _Allocator>
3408
_LIBCPP_INLINE_VISIBILITY inline
3409
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3410
basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
3411
size_type __pos) const _NOEXCEPT
3413
return find_last_not_of(__str.data(), __pos, __str.size());
3416
template<class _CharT, class _Traits, class _Allocator>
3417
_LIBCPP_INLINE_VISIBILITY inline
3418
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3419
basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const_pointer __s,
3420
size_type __pos) const _NOEXCEPT
3422
#ifdef _LIBCPP_DEBUG
3425
return find_last_not_of(__s, __pos, traits_type::length(__s));
3428
template<class _CharT, class _Traits, class _Allocator>
3429
_LIBCPP_INLINE_VISIBILITY inline
3430
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3431
basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
3432
size_type __pos) const _NOEXCEPT
3434
size_type __sz = size();
3439
const_pointer __p = data();
3440
for (const_pointer __ps = __p + __pos; __ps != __p;)
3441
if (!traits_type::eq(*--__ps, __c))
3442
return static_cast<size_type>(__ps - __p);
3448
template <class _CharT, class _Traits, class _Allocator>
3449
_LIBCPP_INLINE_VISIBILITY inline
3451
basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
3453
size_t __lhs_sz = size();
3454
size_t __rhs_sz = __str.size();
3455
int __result = traits_type::compare(data(), __str.data(),
3456
_VSTD::min(__lhs_sz, __rhs_sz));
3459
if (__lhs_sz < __rhs_sz)
3461
if (__lhs_sz > __rhs_sz)
3466
template <class _CharT, class _Traits, class _Allocator>
3467
_LIBCPP_INLINE_VISIBILITY inline
3469
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3471
const basic_string& __str) const
3473
return compare(__pos1, __n1, __str.data(), __str.size());
3476
template <class _CharT, class _Traits, class _Allocator>
3478
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3480
const basic_string& __str,
3482
size_type __n2) const
3484
size_type __sz = __str.size();
3486
this->__throw_out_of_range();
3487
return compare(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2,
3491
template <class _CharT, class _Traits, class _Allocator>
3493
basic_string<_CharT, _Traits, _Allocator>::compare(const_pointer __s) const _NOEXCEPT
3495
#ifdef _LIBCPP_DEBUG
3498
return compare(0, npos, __s, traits_type::length(__s));
3501
template <class _CharT, class _Traits, class _Allocator>
3503
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3505
const_pointer __s) const
3507
#ifdef _LIBCPP_DEBUG
3510
return compare(__pos1, __n1, __s, traits_type::length(__s));
3513
template <class _CharT, class _Traits, class _Allocator>
3515
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3518
size_type __n2) const
3520
#ifdef _LIBCPP_DEBUG
3523
size_type __sz = size();
3524
if (__pos1 > __sz || __n2 == npos)
3525
this->__throw_out_of_range();
3526
size_type __rlen = _VSTD::min(__n1, __sz - __pos1);
3527
int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2));
3532
else if (__rlen > __n2)
3540
template<class _CharT, class _Traits, class _Allocator>
3541
_LIBCPP_INLINE_VISIBILITY inline
3543
basic_string<_CharT, _Traits, _Allocator>::__invariants() const
3545
if (size() > capacity())
3547
if (capacity() < __min_cap - 1)
3551
if (data()[size()] != value_type(0))
3558
template<class _CharT, class _Traits, class _Allocator>
3559
_LIBCPP_INLINE_VISIBILITY inline
3561
operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3562
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3564
return __lhs.size() == __rhs.size() && _Traits::compare(__lhs.data(),
3569
template<class _CharT, class _Traits, class _Allocator>
3570
_LIBCPP_INLINE_VISIBILITY inline
3572
operator==(const _CharT* __lhs,
3573
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3575
return __rhs.compare(__lhs) == 0;
3578
template<class _CharT, class _Traits, class _Allocator>
3579
_LIBCPP_INLINE_VISIBILITY inline
3581
operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
3582
const _CharT* __rhs) _NOEXCEPT
3584
return __lhs.compare(__rhs) == 0;
3589
template<class _CharT, class _Traits, class _Allocator>
3590
_LIBCPP_INLINE_VISIBILITY inline
3592
operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
3593
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3595
return !(__lhs == __rhs);
3598
template<class _CharT, class _Traits, class _Allocator>
3599
_LIBCPP_INLINE_VISIBILITY inline
3601
operator!=(const _CharT* __lhs,
3602
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3604
return !(__lhs == __rhs);
3607
template<class _CharT, class _Traits, class _Allocator>
3608
_LIBCPP_INLINE_VISIBILITY inline
3610
operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3611
const _CharT* __rhs) _NOEXCEPT
3613
return !(__lhs == __rhs);
3618
template<class _CharT, class _Traits, class _Allocator>
3619
_LIBCPP_INLINE_VISIBILITY inline
3621
operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3622
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3624
return __lhs.compare(__rhs) < 0;
3627
template<class _CharT, class _Traits, class _Allocator>
3628
_LIBCPP_INLINE_VISIBILITY inline
3630
operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3631
const _CharT* __rhs) _NOEXCEPT
3633
return __lhs.compare(__rhs) < 0;
3636
template<class _CharT, class _Traits, class _Allocator>
3637
_LIBCPP_INLINE_VISIBILITY inline
3639
operator< (const _CharT* __lhs,
3640
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3642
return __rhs.compare(__lhs) > 0;
3647
template<class _CharT, class _Traits, class _Allocator>
3648
_LIBCPP_INLINE_VISIBILITY inline
3650
operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3651
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3653
return __rhs < __lhs;
3656
template<class _CharT, class _Traits, class _Allocator>
3657
_LIBCPP_INLINE_VISIBILITY inline
3659
operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3660
const _CharT* __rhs) _NOEXCEPT
3662
return __rhs < __lhs;
3665
template<class _CharT, class _Traits, class _Allocator>
3666
_LIBCPP_INLINE_VISIBILITY inline
3668
operator> (const _CharT* __lhs,
3669
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3671
return __rhs < __lhs;
3676
template<class _CharT, class _Traits, class _Allocator>
3677
_LIBCPP_INLINE_VISIBILITY inline
3679
operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3680
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3682
return !(__rhs < __lhs);
3685
template<class _CharT, class _Traits, class _Allocator>
3686
_LIBCPP_INLINE_VISIBILITY inline
3688
operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3689
const _CharT* __rhs) _NOEXCEPT
3691
return !(__rhs < __lhs);
3694
template<class _CharT, class _Traits, class _Allocator>
3695
_LIBCPP_INLINE_VISIBILITY inline
3697
operator<=(const _CharT* __lhs,
3698
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3700
return !(__rhs < __lhs);
3705
template<class _CharT, class _Traits, class _Allocator>
3706
_LIBCPP_INLINE_VISIBILITY inline
3708
operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3709
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3711
return !(__lhs < __rhs);
3714
template<class _CharT, class _Traits, class _Allocator>
3715
_LIBCPP_INLINE_VISIBILITY inline
3717
operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3718
const _CharT* __rhs) _NOEXCEPT
3720
return !(__lhs < __rhs);
3723
template<class _CharT, class _Traits, class _Allocator>
3724
_LIBCPP_INLINE_VISIBILITY inline
3726
operator>=(const _CharT* __lhs,
3727
const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
3729
return !(__lhs < __rhs);
3734
template<class _CharT, class _Traits, class _Allocator>
3735
basic_string<_CharT, _Traits, _Allocator>
3736
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3737
const basic_string<_CharT, _Traits, _Allocator>& __rhs)
3739
basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
3740
typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
3741
typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
3742
__r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
3743
__r.append(__rhs.data(), __rhs_sz);
3747
template<class _CharT, class _Traits, class _Allocator>
3748
basic_string<_CharT, _Traits, _Allocator>
3749
operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
3751
basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
3752
typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs);
3753
typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
3754
__r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
3755
__r.append(__rhs.data(), __rhs_sz);
3759
template<class _CharT, class _Traits, class _Allocator>
3760
basic_string<_CharT, _Traits, _Allocator>
3761
operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
3763
basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
3764
typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
3765
__r.__init(&__lhs, 1, 1 + __rhs_sz);
3766
__r.append(__rhs.data(), __rhs_sz);
3770
template<class _CharT, class _Traits, class _Allocator>
3771
basic_string<_CharT, _Traits, _Allocator>
3772
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
3774
basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
3775
typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
3776
typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs);
3777
__r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
3778
__r.append(__rhs, __rhs_sz);
3782
template<class _CharT, class _Traits, class _Allocator>
3783
basic_string<_CharT, _Traits, _Allocator>
3784
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
3786
basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
3787
typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
3788
__r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
3789
__r.push_back(__rhs);
3793
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3795
template<class _CharT, class _Traits, class _Allocator>
3796
_LIBCPP_INLINE_VISIBILITY inline
3797
basic_string<_CharT, _Traits, _Allocator>
3798
operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
3800
return _VSTD::move(__lhs.append(__rhs));
3803
template<class _CharT, class _Traits, class _Allocator>
3804
_LIBCPP_INLINE_VISIBILITY inline
3805
basic_string<_CharT, _Traits, _Allocator>
3806
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
3808
return _VSTD::move(__rhs.insert(0, __lhs));
3811
template<class _CharT, class _Traits, class _Allocator>
3812
_LIBCPP_INLINE_VISIBILITY inline
3813
basic_string<_CharT, _Traits, _Allocator>
3814
operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
3816
return _VSTD::move(__lhs.append(__rhs));
3819
template<class _CharT, class _Traits, class _Allocator>
3820
_LIBCPP_INLINE_VISIBILITY inline
3821
basic_string<_CharT, _Traits, _Allocator>
3822
operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
3824
return _VSTD::move(__rhs.insert(0, __lhs));
3827
template<class _CharT, class _Traits, class _Allocator>
3828
_LIBCPP_INLINE_VISIBILITY inline
3829
basic_string<_CharT, _Traits, _Allocator>
3830
operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
3832
__rhs.insert(__rhs.begin(), __lhs);
3833
return _VSTD::move(__rhs);
3836
template<class _CharT, class _Traits, class _Allocator>
3837
_LIBCPP_INLINE_VISIBILITY inline
3838
basic_string<_CharT, _Traits, _Allocator>
3839
operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
3841
return _VSTD::move(__lhs.append(__rhs));
3844
template<class _CharT, class _Traits, class _Allocator>
3845
_LIBCPP_INLINE_VISIBILITY inline
3846
basic_string<_CharT, _Traits, _Allocator>
3847
operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
3849
__lhs.push_back(__rhs);
3850
return _VSTD::move(__lhs);
3853
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3857
template<class _CharT, class _Traits, class _Allocator>
3858
_LIBCPP_INLINE_VISIBILITY inline
3860
swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
3861
basic_string<_CharT, _Traits, _Allocator>& __rhs)
3862
_NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
3867
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
3869
typedef basic_string<char16_t> u16string;
3870
typedef basic_string<char32_t> u32string;
3872
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
3874
int stoi (const string& __str, size_t* __idx = 0, int __base = 10);
3875
long stol (const string& __str, size_t* __idx = 0, int __base = 10);
3876
unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10);
3877
long long stoll (const string& __str, size_t* __idx = 0, int __base = 10);
3878
unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10);
3880
float stof (const string& __str, size_t* __idx = 0);
3881
double stod (const string& __str, size_t* __idx = 0);
3882
long double stold(const string& __str, size_t* __idx = 0);
3884
string to_string(int __val);
3885
string to_string(unsigned __val);
3886
string to_string(long __val);
3887
string to_string(unsigned long __val);
3888
string to_string(long long __val);
3889
string to_string(unsigned long long __val);
3890
string to_string(float __val);
3891
string to_string(double __val);
3892
string to_string(long double __val);
3894
int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10);
3895
long stol (const wstring& __str, size_t* __idx = 0, int __base = 10);
3896
unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10);
3897
long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10);
3898
unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10);
3900
float stof (const wstring& __str, size_t* __idx = 0);
3901
double stod (const wstring& __str, size_t* __idx = 0);
3902
long double stold(const wstring& __str, size_t* __idx = 0);
3904
wstring to_wstring(int __val);
3905
wstring to_wstring(unsigned __val);
3906
wstring to_wstring(long __val);
3907
wstring to_wstring(unsigned long __val);
3908
wstring to_wstring(long long __val);
3909
wstring to_wstring(unsigned long long __val);
3910
wstring to_wstring(float __val);
3911
wstring to_wstring(double __val);
3912
wstring to_wstring(long double __val);
3914
template<class _CharT, class _Traits, class _Allocator>
3915
const typename basic_string<_CharT, _Traits, _Allocator>::size_type
3916
basic_string<_CharT, _Traits, _Allocator>::npos;
3918
template<class _Ptr>
3919
size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e)
3921
typedef typename iterator_traits<_Ptr>::value_type value_type;
3922
return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type));
3925
template<class _CharT, class _Traits, class _Allocator>
3926
struct _LIBCPP_TYPE_VIS hash<basic_string<_CharT, _Traits, _Allocator> >
3927
: public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t>
3930
operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT;
3933
template<class _CharT, class _Traits, class _Allocator>
3935
hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(
3936
const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT
3938
return __do_string_hash(__val.data(), __val.data() + __val.size());
3941
template<class _CharT, class _Traits, class _Allocator>
3942
basic_ostream<_CharT, _Traits>&
3943
operator<<(basic_ostream<_CharT, _Traits>& __os,
3944
const basic_string<_CharT, _Traits, _Allocator>& __str);
3946
template<class _CharT, class _Traits, class _Allocator>
3947
basic_istream<_CharT, _Traits>&
3948
operator>>(basic_istream<_CharT, _Traits>& __is,
3949
basic_string<_CharT, _Traits, _Allocator>& __str);
3951
template<class _CharT, class _Traits, class _Allocator>
3952
basic_istream<_CharT, _Traits>&
3953
getline(basic_istream<_CharT, _Traits>& __is,
3954
basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
3956
template<class _CharT, class _Traits, class _Allocator>
3957
inline _LIBCPP_INLINE_VISIBILITY
3958
basic_istream<_CharT, _Traits>&
3959
getline(basic_istream<_CharT, _Traits>& __is,
3960
basic_string<_CharT, _Traits, _Allocator>& __str);
3962
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3964
template<class _CharT, class _Traits, class _Allocator>
3965
inline _LIBCPP_INLINE_VISIBILITY
3966
basic_istream<_CharT, _Traits>&
3967
getline(basic_istream<_CharT, _Traits>&& __is,
3968
basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
3970
template<class _CharT, class _Traits, class _Allocator>
3971
inline _LIBCPP_INLINE_VISIBILITY
3972
basic_istream<_CharT, _Traits>&
3973
getline(basic_istream<_CharT, _Traits>&& __is,
3974
basic_string<_CharT, _Traits, _Allocator>& __str);
3976
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3978
_LIBCPP_EXTERN_TEMPLATE(class basic_string<char>)
3979
_LIBCPP_EXTERN_TEMPLATE(class basic_string<wchar_t>)
3983
operator+<char, char_traits<char>, allocator<char> >(char const*, string const&);
3985
_LIBCPP_END_NAMESPACE_STD
3987
#endif // _LIBCPP_STRING