1 // -*- C++ -*- 2 //===--------------------------- string -----------------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is distributed under the University of Illinois Open Source 7 // License. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _LIBCPP_STRING 12 #define _LIBCPP_STRING 13 14 /* 15 string synopsis 16 17 namespace std 18 { 19 20 template <class stateT> 21 class fpos 22 { 23 private: 24 stateT st; 25 public: 26 fpos(streamoff = streamoff()); 27 28 operator streamoff() const; 29 30 stateT state() const; 31 void state(stateT); 32 33 fpos& operator+=(streamoff); 34 fpos operator+ (streamoff) const; 35 fpos& operator-=(streamoff); 36 fpos operator- (streamoff) const; 37 }; 38 39 template <class stateT> streamoff operator-(const fpos<stateT>& x, const fpos<stateT>& y); 40 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); 43 44 template <class charT> 45 struct char_traits 46 { 47 typedef charT char_type; 48 typedef ... int_type; 49 typedef streamoff off_type; 50 typedef streampos pos_type; 51 typedef mbstate_t state_type; 52 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; 56 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); 63 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; 69 }; 70 71 template <> struct char_traits<char>; 72 template <> struct char_traits<wchar_t>; 73 74 template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 75 class basic_string 76 { 77 public: 78 // types: 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; 92 93 static const size_type npos = -1; 94 95 basic_string() 96 noexcept(is_nothrow_default_constructible<allocator_type>::value); 97 explicit basic_string(const allocator_type& a); 98 basic_string(const basic_string& str); 99 basic_string(basic_string&& str) 100 noexcept(is_nothrow_move_constructible<allocator_type>::value); 101 basic_string(const basic_string& str, size_type pos, size_type n = npos, 102 const allocator_type& a = allocator_type()); 103 basic_string(const value_type* s, const allocator_type& a = allocator_type()); 104 basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type()); 105 basic_string(size_type n, value_type c, const allocator_type& a = allocator_type()); 106 template<class InputIterator> 107 basic_string(InputIterator begin, InputIterator end, 108 const allocator_type& a = allocator_type()); 109 basic_string(initializer_list<value_type>, const Allocator& = Allocator()); 110 basic_string(const basic_string&, const Allocator&); 111 basic_string(basic_string&&, const Allocator&); 112 113 ~basic_string(); 114 115 basic_string& operator=(const basic_string& str); 116 basic_string& operator=(basic_string&& str) 117 noexcept( 118 allocator_type::propagate_on_container_move_assignment::value && 119 is_nothrow_move_assignable<allocator_type>::value); 120 basic_string& operator=(const value_type* s); 121 basic_string& operator=(value_type c); 122 basic_string& operator=(initializer_list<value_type>); 123 124 iterator begin() noexcept; 125 const_iterator begin() const noexcept; 126 iterator end() noexcept; 127 const_iterator end() const noexcept; 128 129 reverse_iterator rbegin() noexcept; 130 const_reverse_iterator rbegin() const noexcept; 131 reverse_iterator rend() noexcept; 132 const_reverse_iterator rend() const noexcept; 133 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; 138 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; 143 144 void resize(size_type n, value_type c); 145 void resize(size_type n); 146 147 void reserve(size_type res_arg = 0); 148 void shrink_to_fit(); 149 void clear() noexcept; 150 bool empty() const noexcept; 151 152 const_reference operator[](size_type pos) const; 153 reference operator[](size_type pos); 154 155 const_reference at(size_type n) const; 156 reference at(size_type n); 157 158 basic_string& operator+=(const basic_string& str); 159 basic_string& operator+=(const value_type* s); 160 basic_string& operator+=(value_type c); 161 basic_string& operator+=(initializer_list<value_type>); 162 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 value_type* s, size_type n); 166 basic_string& append(const value_type* s); 167 basic_string& append(size_type n, value_type c); 168 template<class InputIterator> 169 basic_string& append(InputIterator first, InputIterator last); 170 basic_string& append(initializer_list<value_type>); 171 172 void push_back(value_type c); 173 void pop_back(); 174 reference front(); 175 const_reference front() const; 176 reference back(); 177 const_reference back() const; 178 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 value_type* s, size_type n); 183 basic_string& assign(const value_type* s); 184 basic_string& assign(size_type n, value_type c); 185 template<class InputIterator> 186 basic_string& assign(InputIterator first, InputIterator last); 187 basic_string& assign(initializer_list<value_type>); 188 189 basic_string& insert(size_type pos1, const basic_string& str); 190 basic_string& insert(size_type pos1, const basic_string& str, 191 size_type pos2, size_type n); 192 basic_string& insert(size_type pos, const value_type* s, size_type n); 193 basic_string& insert(size_type pos, const value_type* s); 194 basic_string& insert(size_type pos, size_type n, value_type c); 195 iterator insert(const_iterator p, value_type c); 196 iterator insert(const_iterator p, size_type n, value_type c); 197 template<class InputIterator> 198 iterator insert(const_iterator p, InputIterator first, InputIterator last); 199 iterator insert(const_iterator p, initializer_list<value_type>); 200 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); 204 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 value_type* s, size_type n2); 209 basic_string& replace(size_type pos, size_type n1, const value_type* s); 210 basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c); 211 basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str); 212 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n); 213 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s); 214 basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c); 215 template<class InputIterator> 216 basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2); 217 basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>); 218 219 size_type copy(value_type* s, size_type n, size_type pos = 0) const; 220 basic_string substr(size_type pos = 0, size_type n = npos) const; 221 222 void swap(basic_string& str) 223 noexcept(!allocator_type::propagate_on_container_swap::value || 224 __is_nothrow_swappable<allocator_type>::value) 225 226 const value_type* c_str() const noexcept; 227 const value_type* data() const noexcept; 228 229 allocator_type get_allocator() const noexcept; 230 231 size_type find(const basic_string& str, size_type pos = 0) const noexcept; 232 size_type find(const value_type* s, size_type pos, size_type n) const noexcept; 233 size_type find(const value_type* s, size_type pos = 0) const noexcept; 234 size_type find(value_type c, size_type pos = 0) const noexcept; 235 236 size_type rfind(const basic_string& str, size_type pos = npos) const noexcept; 237 size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept; 238 size_type rfind(const value_type* s, size_type pos = npos) const noexcept; 239 size_type rfind(value_type c, size_type pos = npos) const noexcept; 240 241 size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept; 242 size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept; 243 size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept; 244 size_type find_first_of(value_type c, size_type pos = 0) const noexcept; 245 246 size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept; 247 size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept; 248 size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept; 249 size_type find_last_of(value_type c, size_type pos = npos) const noexcept; 250 251 size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept; 252 size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept; 253 size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept; 254 size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept; 255 256 size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept; 257 size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept; 258 size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept; 259 size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept; 260 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 value_type* s) const noexcept; 266 int compare(size_type pos1, size_type n1, const value_type* s) const; 267 int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const; 268 269 bool __invariants() const; 270 }; 271 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); 276 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); 280 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); 284 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); 288 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); 292 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; 296 297 template<class charT, class traits, class Allocator> 298 bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; 299 300 template<class charT, class traits, class Allocator> 301 bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept; 302 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; 306 307 template<class charT, class traits, class Allocator> 308 bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; 309 310 template<class charT, class traits, class Allocator> 311 bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; 312 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; 316 317 template<class charT, class traits, class Allocator> 318 bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; 319 320 template<class charT, class traits, class Allocator> 321 bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; 322 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; 326 327 template<class charT, class traits, class Allocator> 328 bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; 329 330 template<class charT, class traits, class Allocator> 331 bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; 332 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; 336 337 template<class charT, class traits, class Allocator> 338 bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; 339 340 template<class charT, class traits, class Allocator> 341 bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; 342 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; 346 347 template<class charT, class traits, class Allocator> 348 bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; 349 350 template<class charT, class traits, class Allocator> 351 bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; 352 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))); 357 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); 361 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); 365 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, 369 charT delim); 370 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); 374 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; 379 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); 385 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); 389 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); 399 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); 405 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); 409 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); 419 420 template <> struct hash<string>; 421 template <> struct hash<u16string>; 422 template <> struct hash<u32string>; 423 template <> struct hash<wstring>; 424 425 } // std 426 427 */ 428 429 #include <__config> 430 #include <iosfwd> 431 #include <cstring> 432 #include <cstdio> // For EOF. 433 #include <cwchar> 434 #include <algorithm> 435 #include <iterator> 436 #include <utility> 437 #include <memory> 438 #include <stdexcept> 439 #include <type_traits> 440 #include <initializer_list> 441 #include <__functional_base> 442 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 443 #include <cstdint> 444 #endif 445 #if defined(_LIBCPP_NO_EXCEPTIONS) || defined(_LIBCPP_DEBUG) 446 #include <cassert> 447 #endif 448 449 #include <__undef_min_max> 450 451 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 452 #pragma GCC system_header 453 #endif 454 455 _LIBCPP_BEGIN_NAMESPACE_STD 456 457 // fpos 458 459 template <class _StateT> 460 class _LIBCPP_TYPE_VIS fpos 461 { 462 private: 463 _StateT __st_; 464 streamoff __off_; 465 public: 466 _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {} 467 468 _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;} 469 470 _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;} 471 _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;} 472 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;} 477 }; 478 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);} 483 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);} 488 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);} 493 494 // char_traits 495 496 template <class _CharT> 497 struct _LIBCPP_TYPE_VIS char_traits 498 { 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; 504 505 _LIBCPP_INLINE_VISIBILITY 506 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT 507 {__c1 = __c2;} 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;} 514 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); 521 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);} 537 }; 538 539 template <class _CharT> 540 int 541 char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n) 542 { 543 for (; __n; --__n, ++__s1, ++__s2) 544 { 545 if (lt(*__s1, *__s2)) 546 return -1; 547 if (lt(*__s2, *__s1)) 548 return 1; 549 } 550 return 0; 551 } 552 553 template <class _CharT> 554 inline _LIBCPP_INLINE_VISIBILITY 555 size_t 556 char_traits<_CharT>::length(const char_type* __s) 557 { 558 size_t __len = 0; 559 for (; !eq(*__s, char_type(0)); ++__s) 560 ++__len; 561 return __len; 562 } 563 564 template <class _CharT> 565 inline _LIBCPP_INLINE_VISIBILITY 566 const _CharT* 567 char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a) 568 { 569 for (; __n; --__n) 570 { 571 if (eq(*__s, __a)) 572 return __s; 573 ++__s; 574 } 575 return 0; 576 } 577 578 template <class _CharT> 579 _CharT* 580 char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n) 581 { 582 char_type* __r = __s1; 583 if (__s1 < __s2) 584 { 585 for (; __n; --__n, ++__s1, ++__s2) 586 assign(*__s1, *__s2); 587 } 588 else if (__s2 < __s1) 589 { 590 __s1 += __n; 591 __s2 += __n; 592 for (; __n; --__n) 593 assign(*--__s1, *--__s2); 594 } 595 return __r; 596 } 597 598 template <class _CharT> 599 inline _LIBCPP_INLINE_VISIBILITY 600 _CharT* 601 char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n) 602 { 603 char_type* __r = __s1; 604 for (; __n; --__n, ++__s1, ++__s2) 605 assign(*__s1, *__s2); 606 return __r; 607 } 608 609 template <class _CharT> 610 inline _LIBCPP_INLINE_VISIBILITY 611 _CharT* 612 char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a) 613 { 614 char_type* __r = __s; 615 for (; __n; --__n, ++__s) 616 assign(*__s, __a); 617 return __r; 618 } 619 620 // char_traits<char> 621 622 template <> 623 struct _LIBCPP_TYPE_VIS char_traits<char> 624 { 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; 630 631 _LIBCPP_INLINE_VISIBILITY 632 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT 633 {__c1 = __c2;} 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;} 640 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);} 658 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);} 674 }; 675 676 // char_traits<wchar_t> 677 678 template <> 679 struct _LIBCPP_TYPE_VIS char_traits<wchar_t> 680 { 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; 686 687 _LIBCPP_INLINE_VISIBILITY 688 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT 689 {__c1 = __c2;} 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;} 696 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);} 715 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);} 731 }; 732 733 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 734 735 template <> 736 struct _LIBCPP_TYPE_VIS char_traits<char16_t> 737 { 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; 743 744 _LIBCPP_INLINE_VISIBILITY 745 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT 746 {__c1 = __c2;} 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;} 753 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); 760 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);} 776 }; 777 778 inline _LIBCPP_INLINE_VISIBILITY 779 int 780 char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) 781 { 782 for (; __n; --__n, ++__s1, ++__s2) 783 { 784 if (lt(*__s1, *__s2)) 785 return -1; 786 if (lt(*__s2, *__s1)) 787 return 1; 788 } 789 return 0; 790 } 791 792 inline _LIBCPP_INLINE_VISIBILITY 793 size_t 794 char_traits<char16_t>::length(const char_type* __s) 795 { 796 size_t __len = 0; 797 for (; !eq(*__s, char_type(0)); ++__s) 798 ++__len; 799 return __len; 800 } 801 802 inline _LIBCPP_INLINE_VISIBILITY 803 const char16_t* 804 char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a) 805 { 806 for (; __n; --__n) 807 { 808 if (eq(*__s, __a)) 809 return __s; 810 ++__s; 811 } 812 return 0; 813 } 814 815 inline _LIBCPP_INLINE_VISIBILITY 816 char16_t* 817 char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n) 818 { 819 char_type* __r = __s1; 820 if (__s1 < __s2) 821 { 822 for (; __n; --__n, ++__s1, ++__s2) 823 assign(*__s1, *__s2); 824 } 825 else if (__s2 < __s1) 826 { 827 __s1 += __n; 828 __s2 += __n; 829 for (; __n; --__n) 830 assign(*--__s1, *--__s2); 831 } 832 return __r; 833 } 834 835 inline _LIBCPP_INLINE_VISIBILITY 836 char16_t* 837 char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n) 838 { 839 char_type* __r = __s1; 840 for (; __n; --__n, ++__s1, ++__s2) 841 assign(*__s1, *__s2); 842 return __r; 843 } 844 845 inline _LIBCPP_INLINE_VISIBILITY 846 char16_t* 847 char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a) 848 { 849 char_type* __r = __s; 850 for (; __n; --__n, ++__s) 851 assign(*__s, __a); 852 return __r; 853 } 854 855 template <> 856 struct _LIBCPP_TYPE_VIS char_traits<char32_t> 857 { 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; 863 864 _LIBCPP_INLINE_VISIBILITY 865 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT 866 {__c1 = __c2;} 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;} 873 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); 880 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);} 896 }; 897 898 inline _LIBCPP_INLINE_VISIBILITY 899 int 900 char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) 901 { 902 for (; __n; --__n, ++__s1, ++__s2) 903 { 904 if (lt(*__s1, *__s2)) 905 return -1; 906 if (lt(*__s2, *__s1)) 907 return 1; 908 } 909 return 0; 910 } 911 912 inline _LIBCPP_INLINE_VISIBILITY 913 size_t 914 char_traits<char32_t>::length(const char_type* __s) 915 { 916 size_t __len = 0; 917 for (; !eq(*__s, char_type(0)); ++__s) 918 ++__len; 919 return __len; 920 } 921 922 inline _LIBCPP_INLINE_VISIBILITY 923 const char32_t* 924 char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a) 925 { 926 for (; __n; --__n) 927 { 928 if (eq(*__s, __a)) 929 return __s; 930 ++__s; 931 } 932 return 0; 933 } 934 935 inline _LIBCPP_INLINE_VISIBILITY 936 char32_t* 937 char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n) 938 { 939 char_type* __r = __s1; 940 if (__s1 < __s2) 941 { 942 for (; __n; --__n, ++__s1, ++__s2) 943 assign(*__s1, *__s2); 944 } 945 else if (__s2 < __s1) 946 { 947 __s1 += __n; 948 __s2 += __n; 949 for (; __n; --__n) 950 assign(*--__s1, *--__s2); 951 } 952 return __r; 953 } 954 955 inline _LIBCPP_INLINE_VISIBILITY 956 char32_t* 957 char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n) 958 { 959 char_type* __r = __s1; 960 for (; __n; --__n, ++__s1, ++__s2) 961 assign(*__s1, *__s2); 962 return __r; 963 } 964 965 inline _LIBCPP_INLINE_VISIBILITY 966 char32_t* 967 char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a) 968 { 969 char_type* __r = __s; 970 for (; __n; --__n, ++__s) 971 assign(*__s, __a); 972 return __r; 973 } 974 975 #endif // _LIBCPP_HAS_NO_UNICODE_CHARS 976 977 // basic_string 978 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); 983 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); 987 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); 991 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); 995 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); 999 1000 template <bool> 1001 class __basic_string_common 1002 { 1003 protected: 1004 void __throw_length_error() const; 1005 void __throw_out_of_range() const; 1006 }; 1007 1008 template <bool __b> 1009 void 1010 __basic_string_common<__b>::__throw_length_error() const 1011 { 1012 #ifndef _LIBCPP_NO_EXCEPTIONS 1013 throw length_error("basic_string"); 1014 #else 1015 assert(!"basic_string length_error"); 1016 #endif 1017 } 1018 1019 template <bool __b> 1020 void 1021 __basic_string_common<__b>::__throw_out_of_range() const 1022 { 1023 #ifndef _LIBCPP_NO_EXCEPTIONS 1024 throw out_of_range("basic_string"); 1025 #else 1026 assert(!"basic_string out_of_range"); 1027 #endif 1028 } 1029 1030 #ifdef _MSC_VER 1031 #pragma warning( push ) 1032 #pragma warning( disable: 4231 ) 1033 #endif // _MSC_VER 1034 _LIBCPP_EXTERN_TEMPLATE(class __basic_string_common<true>) 1035 #ifdef _MSC_VER 1036 #pragma warning( pop ) 1037 #endif // _MSC_VER 1038 1039 #ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT 1040 1041 template <class _CharT, size_t = sizeof(_CharT)> 1042 struct __padding 1043 { 1044 unsigned char __xx[sizeof(_CharT)-1]; 1045 }; 1046 1047 template <class _CharT> 1048 struct __padding<_CharT, 1> 1049 { 1050 }; 1051 1052 #endif // _LIBCPP_ALTERNATE_STRING_LAYOUT 1053 1054 template<class _CharT, class _Traits, class _Allocator> 1055 class _LIBCPP_TYPE_VIS basic_string 1056 : private __basic_string_common<true> 1057 { 1058 public: 1059 typedef basic_string __self; 1060 typedef _Traits traits_type; 1061 typedef typename traits_type::char_type value_type; 1062 typedef _Allocator allocator_type; 1063 typedef allocator_traits<allocator_type> __alloc_traits; 1064 typedef typename __alloc_traits::size_type size_type; 1065 typedef typename __alloc_traits::difference_type difference_type; 1066 typedef value_type& reference; 1067 typedef const value_type& const_reference; 1068 typedef typename __alloc_traits::pointer pointer; 1069 typedef typename __alloc_traits::const_pointer const_pointer; 1070 #ifdef _LIBCPP_DEBUG 1071 typedef __debug_iter<basic_string, pointer> iterator; 1072 typedef __debug_iter<basic_string, const_pointer> const_iterator; 1073 1074 friend class __debug_iter<basic_string, pointer>; 1075 friend class __debug_iter<basic_string, const_pointer>; 1076 #elif defined(_LIBCPP_RAW_ITERATORS) 1077 typedef pointer iterator; 1078 typedef const_pointer const_iterator; 1079 #else // defined(_LIBCPP_RAW_ITERATORS) 1080 typedef __wrap_iter<pointer> iterator; 1081 typedef __wrap_iter<const_pointer> const_iterator; 1082 #endif // defined(_LIBCPP_RAW_ITERATORS) 1083 typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1084 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 1085 1086 private: 1087 1088 #ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT 1089 1090 struct __long 1091 { 1092 pointer __data_; 1093 size_type __size_; 1094 size_type __cap_; 1095 }; 1096 1097 #if _LIBCPP_BIG_ENDIAN 1098 enum {__short_mask = 0x01}; 1099 enum {__long_mask = 0x1ul}; 1100 #else // _LIBCPP_BIG_ENDIAN 1101 enum {__short_mask = 0x80}; 1102 enum {__long_mask = ~(size_type(~0) >> 1)}; 1103 #endif // _LIBCPP_BIG_ENDIAN 1104 1105 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ? 1106 (sizeof(__long) - 1)/sizeof(value_type) : 2}; 1107 1108 struct __short 1109 { 1110 value_type __data_[__min_cap]; 1111 struct 1112 : __padding<value_type> 1113 { 1114 unsigned char __size_; 1115 }; 1116 }; 1117 1118 #else 1119 1120 struct __long 1121 { 1122 size_type __cap_; 1123 size_type __size_; 1124 pointer __data_; 1125 }; 1126 1127 #if _LIBCPP_BIG_ENDIAN 1128 enum {__short_mask = 0x80}; 1129 enum {__long_mask = ~(size_type(~0) >> 1)}; 1130 #else // _LIBCPP_BIG_ENDIAN 1131 enum {__short_mask = 0x01}; 1132 enum {__long_mask = 0x1ul}; 1133 #endif // _LIBCPP_BIG_ENDIAN 1134 1135 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ? 1136 (sizeof(__long) - 1)/sizeof(value_type) : 2}; 1137 1138 struct __short 1139 { 1140 union 1141 { 1142 unsigned char __size_; 1143 value_type __lx; 1144 }; 1145 value_type __data_[__min_cap]; 1146 }; 1147 1148 #endif // _LIBCPP_ALTERNATE_STRING_LAYOUT 1149 1150 union __lx{__long __lx; __short __lxx;}; 1151 1152 enum {__n_words = sizeof(__lx) / sizeof(size_type)}; 1153 1154 struct __raw 1155 { 1156 size_type __words[__n_words]; 1157 }; 1158 1159 struct __rep 1160 { 1161 union 1162 { 1163 __long __l; 1164 __short __s; 1165 __raw __r; 1166 }; 1167 }; 1168 1169 __compressed_pair<__rep, allocator_type> __r_; 1170 1171 #ifdef _LIBCPP_DEBUG 1172 1173 pair<iterator*, const_iterator*> __iterator_list_; 1174 1175 _LIBCPP_INLINE_VISIBILITY iterator*& __get_iterator_list(iterator*) {return __iterator_list_.first;} 1176 _LIBCPP_INLINE_VISIBILITY const_iterator*& __get_iterator_list(const_iterator*) {return __iterator_list_.second;} 1177 1178 #endif // _LIBCPP_DEBUG 1179 1180 public: 1181 static const size_type npos = -1; 1182 1183 _LIBCPP_INLINE_VISIBILITY basic_string() 1184 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); 1185 _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a); 1186 basic_string(const basic_string& __str); 1187 basic_string(const basic_string& __str, const allocator_type& __a); 1188 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1189 _LIBCPP_INLINE_VISIBILITY 1190 basic_string(basic_string&& __str) 1191 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 1192 _LIBCPP_INLINE_VISIBILITY 1193 basic_string(basic_string&& __str, const allocator_type& __a); 1194 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1195 _LIBCPP_INLINE_VISIBILITY basic_string(const value_type* __s); 1196 _LIBCPP_INLINE_VISIBILITY 1197 basic_string(const value_type* __s, const allocator_type& __a); 1198 _LIBCPP_INLINE_VISIBILITY 1199 basic_string(const value_type* __s, size_type __n); 1200 _LIBCPP_INLINE_VISIBILITY 1201 basic_string(const value_type* __s, size_type __n, const allocator_type& __a); 1202 _LIBCPP_INLINE_VISIBILITY 1203 basic_string(size_type __n, value_type __c); 1204 _LIBCPP_INLINE_VISIBILITY 1205 basic_string(size_type __n, value_type __c, const allocator_type& __a); 1206 basic_string(const basic_string& __str, size_type __pos, size_type __n = npos, 1207 const allocator_type& __a = allocator_type()); 1208 template<class _InputIterator> 1209 _LIBCPP_INLINE_VISIBILITY 1210 basic_string(_InputIterator __first, _InputIterator __last); 1211 template<class _InputIterator> 1212 _LIBCPP_INLINE_VISIBILITY 1213 basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a); 1214 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1215 _LIBCPP_INLINE_VISIBILITY 1216 basic_string(initializer_list<value_type> __il); 1217 _LIBCPP_INLINE_VISIBILITY 1218 basic_string(initializer_list<value_type> __il, const allocator_type& __a); 1219 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1220 1221 ~basic_string(); 1222 1223 basic_string& operator=(const basic_string& __str); 1224 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1225 _LIBCPP_INLINE_VISIBILITY 1226 basic_string& operator=(basic_string&& __str) 1227 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && 1228 is_nothrow_move_assignable<allocator_type>::value); 1229 #endif 1230 _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);} 1231 basic_string& operator=(value_type __c); 1232 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1233 _LIBCPP_INLINE_VISIBILITY 1234 basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());} 1235 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1236 1237 #ifndef _LIBCPP_DEBUG 1238 _LIBCPP_INLINE_VISIBILITY 1239 iterator begin() _NOEXCEPT 1240 {return iterator(__get_pointer());} 1241 _LIBCPP_INLINE_VISIBILITY 1242 const_iterator begin() const _NOEXCEPT 1243 {return const_iterator(__get_pointer());} 1244 _LIBCPP_INLINE_VISIBILITY 1245 iterator end() _NOEXCEPT 1246 {return iterator(__get_pointer() + size());} 1247 _LIBCPP_INLINE_VISIBILITY 1248 const_iterator end() const _NOEXCEPT 1249 {return const_iterator(__get_pointer() + size());} 1250 #else // _LIBCPP_DEBUG 1251 _LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(this, __get_pointer());} 1252 _LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return const_iterator(this, data());} 1253 _LIBCPP_INLINE_VISIBILITY iterator end() {return iterator(this, __get_pointer() + size());} 1254 _LIBCPP_INLINE_VISIBILITY const_iterator end() const {return const_iterator(this, data() + size());} 1255 #endif // _LIBCPP_DEBUG 1256 _LIBCPP_INLINE_VISIBILITY 1257 reverse_iterator rbegin() _NOEXCEPT 1258 {return reverse_iterator(end());} 1259 _LIBCPP_INLINE_VISIBILITY 1260 const_reverse_iterator rbegin() const _NOEXCEPT 1261 {return const_reverse_iterator(end());} 1262 _LIBCPP_INLINE_VISIBILITY 1263 reverse_iterator rend() _NOEXCEPT 1264 {return reverse_iterator(begin());} 1265 _LIBCPP_INLINE_VISIBILITY 1266 const_reverse_iterator rend() const _NOEXCEPT 1267 {return const_reverse_iterator(begin());} 1268 1269 _LIBCPP_INLINE_VISIBILITY 1270 const_iterator cbegin() const _NOEXCEPT 1271 {return begin();} 1272 _LIBCPP_INLINE_VISIBILITY 1273 const_iterator cend() const _NOEXCEPT 1274 {return end();} 1275 _LIBCPP_INLINE_VISIBILITY 1276 const_reverse_iterator crbegin() const _NOEXCEPT 1277 {return rbegin();} 1278 _LIBCPP_INLINE_VISIBILITY 1279 const_reverse_iterator crend() const _NOEXCEPT 1280 {return rend();} 1281 1282 _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT 1283 {return __is_long() ? __get_long_size() : __get_short_size();} 1284 _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();} 1285 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT; 1286 _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT 1287 {return (__is_long() ? __get_long_cap() : __min_cap) - 1;} 1288 1289 void resize(size_type __n, value_type __c); 1290 _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());} 1291 1292 void reserve(size_type res_arg = 0); 1293 _LIBCPP_INLINE_VISIBILITY 1294 void shrink_to_fit() _NOEXCEPT {reserve();} 1295 _LIBCPP_INLINE_VISIBILITY 1296 void clear() _NOEXCEPT; 1297 _LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;} 1298 1299 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const; 1300 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos); 1301 1302 const_reference at(size_type __n) const; 1303 reference at(size_type __n); 1304 1305 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);} 1306 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s) {return append(__s);} 1307 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;} 1308 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1309 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);} 1310 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1311 1312 _LIBCPP_INLINE_VISIBILITY 1313 basic_string& append(const basic_string& __str); 1314 basic_string& append(const basic_string& __str, size_type __pos, size_type __n); 1315 basic_string& append(const value_type* __s, size_type __n); 1316 basic_string& append(const value_type* __s); 1317 basic_string& append(size_type __n, value_type __c); 1318 template<class _InputIterator> 1319 typename enable_if 1320 < 1321 __is_input_iterator <_InputIterator>::value && 1322 !__is_forward_iterator<_InputIterator>::value, 1323 basic_string& 1324 >::type 1325 append(_InputIterator __first, _InputIterator __last); 1326 template<class _ForwardIterator> 1327 typename enable_if 1328 < 1329 __is_forward_iterator<_ForwardIterator>::value, 1330 basic_string& 1331 >::type 1332 append(_ForwardIterator __first, _ForwardIterator __last); 1333 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1334 _LIBCPP_INLINE_VISIBILITY 1335 basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());} 1336 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1337 1338 void push_back(value_type __c); 1339 _LIBCPP_INLINE_VISIBILITY 1340 void pop_back(); 1341 _LIBCPP_INLINE_VISIBILITY reference front(); 1342 _LIBCPP_INLINE_VISIBILITY const_reference front() const; 1343 _LIBCPP_INLINE_VISIBILITY reference back(); 1344 _LIBCPP_INLINE_VISIBILITY const_reference back() const; 1345 1346 _LIBCPP_INLINE_VISIBILITY 1347 basic_string& assign(const basic_string& __str); 1348 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1349 _LIBCPP_INLINE_VISIBILITY 1350 basic_string& assign(basic_string&& str) 1351 {*this = _VSTD::move(str); return *this;} 1352 #endif 1353 basic_string& assign(const basic_string& __str, size_type __pos, size_type __n); 1354 basic_string& assign(const value_type* __s, size_type __n); 1355 basic_string& assign(const value_type* __s); 1356 basic_string& assign(size_type __n, value_type __c); 1357 template<class _InputIterator> 1358 typename enable_if 1359 < 1360 __is_input_iterator <_InputIterator>::value && 1361 !__is_forward_iterator<_InputIterator>::value, 1362 basic_string& 1363 >::type 1364 assign(_InputIterator __first, _InputIterator __last); 1365 template<class _ForwardIterator> 1366 typename enable_if 1367 < 1368 __is_forward_iterator<_ForwardIterator>::value, 1369 basic_string& 1370 >::type 1371 assign(_ForwardIterator __first, _ForwardIterator __last); 1372 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1373 _LIBCPP_INLINE_VISIBILITY 1374 basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());} 1375 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1376 1377 _LIBCPP_INLINE_VISIBILITY 1378 basic_string& insert(size_type __pos1, const basic_string& __str); 1379 basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n); 1380 basic_string& insert(size_type __pos, const value_type* __s, size_type __n); 1381 basic_string& insert(size_type __pos, const value_type* __s); 1382 basic_string& insert(size_type __pos, size_type __n, value_type __c); 1383 iterator insert(const_iterator __pos, value_type __c); 1384 _LIBCPP_INLINE_VISIBILITY 1385 iterator insert(const_iterator __pos, size_type __n, value_type __c); 1386 template<class _InputIterator> 1387 typename enable_if 1388 < 1389 __is_input_iterator <_InputIterator>::value && 1390 !__is_forward_iterator<_InputIterator>::value, 1391 iterator 1392 >::type 1393 insert(const_iterator __pos, _InputIterator __first, _InputIterator __last); 1394 template<class _ForwardIterator> 1395 typename enable_if 1396 < 1397 __is_forward_iterator<_ForwardIterator>::value, 1398 iterator 1399 >::type 1400 insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last); 1401 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1402 _LIBCPP_INLINE_VISIBILITY 1403 iterator insert(const_iterator __pos, initializer_list<value_type> __il) 1404 {return insert(__pos, __il.begin(), __il.end());} 1405 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1406 1407 basic_string& erase(size_type __pos = 0, size_type __n = npos); 1408 _LIBCPP_INLINE_VISIBILITY 1409 iterator erase(const_iterator __pos); 1410 _LIBCPP_INLINE_VISIBILITY 1411 iterator erase(const_iterator __first, const_iterator __last); 1412 1413 _LIBCPP_INLINE_VISIBILITY 1414 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str); 1415 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2); 1416 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2); 1417 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s); 1418 basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c); 1419 _LIBCPP_INLINE_VISIBILITY 1420 basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str); 1421 _LIBCPP_INLINE_VISIBILITY 1422 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n); 1423 _LIBCPP_INLINE_VISIBILITY 1424 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s); 1425 _LIBCPP_INLINE_VISIBILITY 1426 basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c); 1427 template<class _InputIterator> 1428 typename enable_if 1429 < 1430 __is_input_iterator<_InputIterator>::value, 1431 basic_string& 1432 >::type 1433 replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2); 1434 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1435 _LIBCPP_INLINE_VISIBILITY 1436 basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il) 1437 {return replace(__i1, __i2, __il.begin(), __il.end());} 1438 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1439 1440 size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const; 1441 _LIBCPP_INLINE_VISIBILITY 1442 basic_string substr(size_type __pos = 0, size_type __n = npos) const; 1443 1444 _LIBCPP_INLINE_VISIBILITY 1445 void swap(basic_string& __str) 1446 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 1447 __is_nothrow_swappable<allocator_type>::value); 1448 1449 _LIBCPP_INLINE_VISIBILITY 1450 const value_type* c_str() const _NOEXCEPT {return data();} 1451 _LIBCPP_INLINE_VISIBILITY 1452 const value_type* data() const _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());} 1453 1454 _LIBCPP_INLINE_VISIBILITY 1455 allocator_type get_allocator() const _NOEXCEPT {return __alloc();} 1456 1457 _LIBCPP_INLINE_VISIBILITY 1458 size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT; 1459 size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 1460 _LIBCPP_INLINE_VISIBILITY 1461 size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT; 1462 size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT; 1463 1464 _LIBCPP_INLINE_VISIBILITY 1465 size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT; 1466 size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 1467 _LIBCPP_INLINE_VISIBILITY 1468 size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT; 1469 size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT; 1470 1471 _LIBCPP_INLINE_VISIBILITY 1472 size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT; 1473 size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 1474 _LIBCPP_INLINE_VISIBILITY 1475 size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT; 1476 _LIBCPP_INLINE_VISIBILITY 1477 size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT; 1478 1479 _LIBCPP_INLINE_VISIBILITY 1480 size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT; 1481 size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 1482 _LIBCPP_INLINE_VISIBILITY 1483 size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT; 1484 _LIBCPP_INLINE_VISIBILITY 1485 size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT; 1486 1487 _LIBCPP_INLINE_VISIBILITY 1488 size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT; 1489 size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 1490 _LIBCPP_INLINE_VISIBILITY 1491 size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT; 1492 _LIBCPP_INLINE_VISIBILITY 1493 size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT; 1494 1495 _LIBCPP_INLINE_VISIBILITY 1496 size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT; 1497 size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 1498 _LIBCPP_INLINE_VISIBILITY 1499 size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT; 1500 _LIBCPP_INLINE_VISIBILITY 1501 size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT; 1502 1503 _LIBCPP_INLINE_VISIBILITY 1504 int compare(const basic_string& __str) const _NOEXCEPT; 1505 _LIBCPP_INLINE_VISIBILITY 1506 int compare(size_type __pos1, size_type __n1, const basic_string& __str) const; 1507 int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2) const; 1508 int compare(const value_type* __s) const _NOEXCEPT; 1509 int compare(size_type __pos1, size_type __n1, const value_type* __s) const; 1510 int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const; 1511 1512 _LIBCPP_INLINE_VISIBILITY bool __invariants() const; 1513 1514 _LIBCPP_INLINE_VISIBILITY 1515 bool __is_long() const _NOEXCEPT 1516 {return bool(__r_.first().__s.__size_ & __short_mask);} 1517 1518 private: 1519 _LIBCPP_INLINE_VISIBILITY 1520 allocator_type& __alloc() _NOEXCEPT 1521 {return __r_.second();} 1522 _LIBCPP_INLINE_VISIBILITY 1523 const allocator_type& __alloc() const _NOEXCEPT 1524 {return __r_.second();} 1525 1526 #ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT 1527 1528 _LIBCPP_INLINE_VISIBILITY 1529 void __set_short_size(size_type __s) _NOEXCEPT 1530 # if _LIBCPP_BIG_ENDIAN 1531 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);} 1532 # else 1533 {__r_.first().__s.__size_ = (unsigned char)(__s);} 1534 # endif 1535 1536 _LIBCPP_INLINE_VISIBILITY 1537 size_type __get_short_size() const _NOEXCEPT 1538 # if _LIBCPP_BIG_ENDIAN 1539 {return __r_.first().__s.__size_ >> 1;} 1540 # else 1541 {return __r_.first().__s.__size_;} 1542 # endif 1543 1544 #else // _LIBCPP_ALTERNATE_STRING_LAYOUT 1545 1546 _LIBCPP_INLINE_VISIBILITY 1547 void __set_short_size(size_type __s) _NOEXCEPT 1548 # if _LIBCPP_BIG_ENDIAN 1549 {__r_.first().__s.__size_ = (unsigned char)(__s);} 1550 # else 1551 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);} 1552 # endif 1553 1554 _LIBCPP_INLINE_VISIBILITY 1555 size_type __get_short_size() const _NOEXCEPT 1556 # if _LIBCPP_BIG_ENDIAN 1557 {return __r_.first().__s.__size_;} 1558 # else 1559 {return __r_.first().__s.__size_ >> 1;} 1560 # endif 1561 1562 #endif // _LIBCPP_ALTERNATE_STRING_LAYOUT 1563 1564 _LIBCPP_INLINE_VISIBILITY 1565 void __set_long_size(size_type __s) _NOEXCEPT 1566 {__r_.first().__l.__size_ = __s;} 1567 _LIBCPP_INLINE_VISIBILITY 1568 size_type __get_long_size() const _NOEXCEPT 1569 {return __r_.first().__l.__size_;} 1570 _LIBCPP_INLINE_VISIBILITY 1571 void __set_size(size_type __s) _NOEXCEPT 1572 {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);} 1573 1574 _LIBCPP_INLINE_VISIBILITY 1575 void __set_long_cap(size_type __s) _NOEXCEPT 1576 {__r_.first().__l.__cap_ = __long_mask | __s;} 1577 _LIBCPP_INLINE_VISIBILITY 1578 size_type __get_long_cap() const _NOEXCEPT 1579 {return __r_.first().__l.__cap_ & size_type(~__long_mask);} 1580 1581 _LIBCPP_INLINE_VISIBILITY 1582 void __set_long_pointer(pointer __p) _NOEXCEPT 1583 {__r_.first().__l.__data_ = __p;} 1584 _LIBCPP_INLINE_VISIBILITY 1585 pointer __get_long_pointer() _NOEXCEPT 1586 {return __r_.first().__l.__data_;} 1587 _LIBCPP_INLINE_VISIBILITY 1588 const_pointer __get_long_pointer() const _NOEXCEPT 1589 {return __r_.first().__l.__data_;} 1590 _LIBCPP_INLINE_VISIBILITY 1591 pointer __get_short_pointer() _NOEXCEPT 1592 {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);} 1593 _LIBCPP_INLINE_VISIBILITY 1594 const_pointer __get_short_pointer() const _NOEXCEPT 1595 {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);} 1596 _LIBCPP_INLINE_VISIBILITY 1597 pointer __get_pointer() _NOEXCEPT 1598 {return __is_long() ? __get_long_pointer() : __get_short_pointer();} 1599 _LIBCPP_INLINE_VISIBILITY 1600 const_pointer __get_pointer() const _NOEXCEPT 1601 {return __is_long() ? __get_long_pointer() : __get_short_pointer();} 1602 1603 _LIBCPP_INLINE_VISIBILITY 1604 void __zero() _NOEXCEPT 1605 { 1606 size_type (&__a)[__n_words] = __r_.first().__r.__words; 1607 for (unsigned __i = 0; __i < __n_words; ++__i) 1608 __a[__i] = 0; 1609 } 1610 1611 template <size_type __a> static 1612 _LIBCPP_INLINE_VISIBILITY 1613 size_type __align(size_type __s) _NOEXCEPT 1614 {return __s + (__a-1) & ~(__a-1);} 1615 enum {__alignment = 16}; 1616 static _LIBCPP_INLINE_VISIBILITY 1617 size_type __recommend(size_type __s) _NOEXCEPT 1618 {return (__s < __min_cap ? __min_cap : 1619 __align<sizeof(value_type) < __alignment ? 1620 __alignment/sizeof(value_type) : 1 > (__s+1)) - 1;} 1621 1622 void __init(const value_type* __s, size_type __sz, size_type __reserve); 1623 void __init(const value_type* __s, size_type __sz); 1624 void __init(size_type __n, value_type __c); 1625 1626 template <class _InputIterator> 1627 typename enable_if 1628 < 1629 __is_input_iterator <_InputIterator>::value && 1630 !__is_forward_iterator<_InputIterator>::value, 1631 void 1632 >::type 1633 __init(_InputIterator __first, _InputIterator __last); 1634 1635 template <class _ForwardIterator> 1636 typename enable_if 1637 < 1638 __is_forward_iterator<_ForwardIterator>::value, 1639 void 1640 >::type 1641 __init(_ForwardIterator __first, _ForwardIterator __last); 1642 1643 void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz, 1644 size_type __n_copy, size_type __n_del, size_type __n_add = 0); 1645 void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz, 1646 size_type __n_copy, size_type __n_del, 1647 size_type __n_add, const value_type* __p_new_stuff); 1648 1649 _LIBCPP_INLINE_VISIBILITY 1650 void __erase_to_end(size_type __pos); 1651 1652 _LIBCPP_INLINE_VISIBILITY 1653 void __copy_assign_alloc(const basic_string& __str) 1654 {__copy_assign_alloc(__str, integral_constant<bool, 1655 __alloc_traits::propagate_on_container_copy_assignment::value>());} 1656 1657 _LIBCPP_INLINE_VISIBILITY 1658 void __copy_assign_alloc(const basic_string& __str, true_type) 1659 { 1660 if (__alloc() != __str.__alloc()) 1661 { 1662 clear(); 1663 shrink_to_fit(); 1664 } 1665 __alloc() = __str.__alloc(); 1666 } 1667 1668 _LIBCPP_INLINE_VISIBILITY 1669 void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT 1670 {} 1671 1672 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1673 _LIBCPP_INLINE_VISIBILITY 1674 void __move_assign(basic_string& __str, false_type); 1675 _LIBCPP_INLINE_VISIBILITY 1676 void __move_assign(basic_string& __str, true_type) 1677 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 1678 #endif 1679 1680 _LIBCPP_INLINE_VISIBILITY 1681 void 1682 __move_assign_alloc(basic_string& __str) 1683 _NOEXCEPT_( 1684 !__alloc_traits::propagate_on_container_move_assignment::value || 1685 is_nothrow_move_assignable<allocator_type>::value) 1686 {__move_assign_alloc(__str, integral_constant<bool, 1687 __alloc_traits::propagate_on_container_move_assignment::value>());} 1688 1689 _LIBCPP_INLINE_VISIBILITY 1690 void __move_assign_alloc(basic_string& __c, true_type) 1691 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 1692 { 1693 __alloc() = _VSTD::move(__c.__alloc()); 1694 } 1695 1696 _LIBCPP_INLINE_VISIBILITY 1697 void __move_assign_alloc(basic_string&, false_type) 1698 _NOEXCEPT 1699 {} 1700 1701 _LIBCPP_INLINE_VISIBILITY 1702 static void __swap_alloc(allocator_type& __x, allocator_type& __y) 1703 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 1704 __is_nothrow_swappable<allocator_type>::value) 1705 {__swap_alloc(__x, __y, integral_constant<bool, 1706 __alloc_traits::propagate_on_container_swap::value>());} 1707 1708 _LIBCPP_INLINE_VISIBILITY 1709 static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type) 1710 _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value) 1711 { 1712 using _VSTD::swap; 1713 swap(__x, __y); 1714 } 1715 _LIBCPP_INLINE_VISIBILITY 1716 static void __swap_alloc(allocator_type&, allocator_type&, false_type) _NOEXCEPT 1717 {} 1718 1719 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators(); 1720 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type); 1721 1722 friend basic_string operator+<>(const basic_string&, const basic_string&); 1723 friend basic_string operator+<>(const value_type*, const basic_string&); 1724 friend basic_string operator+<>(value_type, const basic_string&); 1725 friend basic_string operator+<>(const basic_string&, const value_type*); 1726 friend basic_string operator+<>(const basic_string&, value_type); 1727 }; 1728 1729 template <class _CharT, class _Traits, class _Allocator> 1730 #ifndef _LIBCPP_DEBUG 1731 _LIBCPP_INLINE_VISIBILITY inline 1732 #endif 1733 void 1734 basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators() 1735 { 1736 #ifdef _LIBCPP_DEBUG 1737 iterator::__remove_all(this); 1738 const_iterator::__remove_all(this); 1739 #endif // _LIBCPP_DEBUG 1740 } 1741 1742 template <class _CharT, class _Traits, class _Allocator> 1743 #ifndef _LIBCPP_DEBUG 1744 _LIBCPP_INLINE_VISIBILITY inline 1745 #endif 1746 void 1747 basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type 1748 #ifdef _LIBCPP_DEBUG 1749 __pos 1750 #endif 1751 ) 1752 { 1753 #ifdef _LIBCPP_DEBUG 1754 const_iterator __beg = begin(); 1755 if (__iterator_list_.first) 1756 { 1757 for (iterator* __p = __iterator_list_.first; __p;) 1758 { 1759 if (*__p - __beg > static_cast<difference_type>(__pos)) 1760 { 1761 iterator* __n = __p; 1762 __p = __p->__next; 1763 __n->__remove_owner(); 1764 } 1765 else 1766 __p = __p->__next; 1767 } 1768 } 1769 if (__iterator_list_.second) 1770 { 1771 for (const_iterator* __p = __iterator_list_.second; __p;) 1772 { 1773 if (*__p - __beg > static_cast<difference_type>(__pos)) 1774 { 1775 const_iterator* __n = __p; 1776 __p = __p->__next; 1777 __n->__remove_owner(); 1778 } 1779 else 1780 __p = __p->__next; 1781 } 1782 } 1783 #endif // _LIBCPP_DEBUG 1784 } 1785 1786 template <class _CharT, class _Traits, class _Allocator> 1787 _LIBCPP_INLINE_VISIBILITY inline 1788 basic_string<_CharT, _Traits, _Allocator>::basic_string() 1789 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 1790 { 1791 __zero(); 1792 } 1793 1794 template <class _CharT, class _Traits, class _Allocator> 1795 _LIBCPP_INLINE_VISIBILITY inline 1796 basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a) 1797 : __r_(__a) 1798 { 1799 __zero(); 1800 } 1801 1802 template <class _CharT, class _Traits, class _Allocator> 1803 void 1804 basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz, size_type __reserve) 1805 { 1806 if (__reserve > max_size()) 1807 this->__throw_length_error(); 1808 pointer __p; 1809 if (__reserve < __min_cap) 1810 { 1811 __set_short_size(__sz); 1812 __p = __get_short_pointer(); 1813 } 1814 else 1815 { 1816 size_type __cap = __recommend(__reserve); 1817 __p = __alloc_traits::allocate(__alloc(), __cap+1); 1818 __set_long_pointer(__p); 1819 __set_long_cap(__cap+1); 1820 __set_long_size(__sz); 1821 } 1822 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz); 1823 traits_type::assign(__p[__sz], value_type()); 1824 } 1825 1826 template <class _CharT, class _Traits, class _Allocator> 1827 void 1828 basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz) 1829 { 1830 if (__sz > max_size()) 1831 this->__throw_length_error(); 1832 pointer __p; 1833 if (__sz < __min_cap) 1834 { 1835 __set_short_size(__sz); 1836 __p = __get_short_pointer(); 1837 } 1838 else 1839 { 1840 size_type __cap = __recommend(__sz); 1841 __p = __alloc_traits::allocate(__alloc(), __cap+1); 1842 __set_long_pointer(__p); 1843 __set_long_cap(__cap+1); 1844 __set_long_size(__sz); 1845 } 1846 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz); 1847 traits_type::assign(__p[__sz], value_type()); 1848 } 1849 1850 template <class _CharT, class _Traits, class _Allocator> 1851 _LIBCPP_INLINE_VISIBILITY inline 1852 basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s) 1853 { 1854 #ifdef _LIBCPP_DEBUG 1855 assert(__s != 0); 1856 #endif 1857 __init(__s, traits_type::length(__s)); 1858 } 1859 1860 template <class _CharT, class _Traits, class _Allocator> 1861 _LIBCPP_INLINE_VISIBILITY inline 1862 basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, const allocator_type& __a) 1863 : __r_(__a) 1864 { 1865 #ifdef _LIBCPP_DEBUG 1866 assert(__s != 0); 1867 #endif 1868 __init(__s, traits_type::length(__s)); 1869 } 1870 1871 template <class _CharT, class _Traits, class _Allocator> 1872 _LIBCPP_INLINE_VISIBILITY inline 1873 basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n) 1874 { 1875 #ifdef _LIBCPP_DEBUG 1876 assert(__s != 0); 1877 #endif 1878 __init(__s, __n); 1879 } 1880 1881 template <class _CharT, class _Traits, class _Allocator> 1882 _LIBCPP_INLINE_VISIBILITY inline 1883 basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n, const allocator_type& __a) 1884 : __r_(__a) 1885 { 1886 #ifdef _LIBCPP_DEBUG 1887 assert(__s != 0); 1888 #endif 1889 __init(__s, __n); 1890 } 1891 1892 template <class _CharT, class _Traits, class _Allocator> 1893 basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str) 1894 : __r_(__alloc_traits::select_on_container_copy_construction(__str.__alloc())) 1895 { 1896 if (!__str.__is_long()) 1897 __r_.first().__r = __str.__r_.first().__r; 1898 else 1899 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size()); 1900 } 1901 1902 template <class _CharT, class _Traits, class _Allocator> 1903 basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, const allocator_type& __a) 1904 : __r_(__a) 1905 { 1906 if (!__str.__is_long()) 1907 __r_.first().__r = __str.__r_.first().__r; 1908 else 1909 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size()); 1910 } 1911 1912 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1913 1914 template <class _CharT, class _Traits, class _Allocator> 1915 _LIBCPP_INLINE_VISIBILITY inline 1916 basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str) 1917 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 1918 : __r_(_VSTD::move(__str.__r_)) 1919 { 1920 __str.__zero(); 1921 #ifdef _LIBCPP_DEBUG 1922 __str.__invalidate_all_iterators(); 1923 #endif 1924 } 1925 1926 template <class _CharT, class _Traits, class _Allocator> 1927 _LIBCPP_INLINE_VISIBILITY inline 1928 basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a) 1929 : __r_(__a) 1930 { 1931 if (__a == __str.__alloc() || !__str.__is_long()) 1932 __r_.first().__r = __str.__r_.first().__r; 1933 else 1934 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size()); 1935 __str.__zero(); 1936 #ifdef _LIBCPP_DEBUG 1937 __str.__invalidate_all_iterators(); 1938 #endif 1939 } 1940 1941 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1942 1943 template <class _CharT, class _Traits, class _Allocator> 1944 void 1945 basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c) 1946 { 1947 if (__n > max_size()) 1948 this->__throw_length_error(); 1949 pointer __p; 1950 if (__n < __min_cap) 1951 { 1952 __set_short_size(__n); 1953 __p = __get_short_pointer(); 1954 } 1955 else 1956 { 1957 size_type __cap = __recommend(__n); 1958 __p = __alloc_traits::allocate(__alloc(), __cap+1); 1959 __set_long_pointer(__p); 1960 __set_long_cap(__cap+1); 1961 __set_long_size(__n); 1962 } 1963 traits_type::assign(_VSTD::__to_raw_pointer(__p), __n, __c); 1964 traits_type::assign(__p[__n], value_type()); 1965 } 1966 1967 template <class _CharT, class _Traits, class _Allocator> 1968 _LIBCPP_INLINE_VISIBILITY inline 1969 basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c) 1970 { 1971 __init(__n, __c); 1972 } 1973 1974 template <class _CharT, class _Traits, class _Allocator> 1975 _LIBCPP_INLINE_VISIBILITY inline 1976 basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c, const allocator_type& __a) 1977 : __r_(__a) 1978 { 1979 __init(__n, __c); 1980 } 1981 1982 template <class _CharT, class _Traits, class _Allocator> 1983 basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, size_type __n, 1984 const allocator_type& __a) 1985 : __r_(__a) 1986 { 1987 size_type __str_sz = __str.size(); 1988 if (__pos > __str_sz) 1989 this->__throw_out_of_range(); 1990 __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos)); 1991 } 1992 1993 template <class _CharT, class _Traits, class _Allocator> 1994 template <class _InputIterator> 1995 typename enable_if 1996 < 1997 __is_input_iterator <_InputIterator>::value && 1998 !__is_forward_iterator<_InputIterator>::value, 1999 void 2000 >::type 2001 basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last) 2002 { 2003 __zero(); 2004 #ifndef _LIBCPP_NO_EXCEPTIONS 2005 try 2006 { 2007 #endif // _LIBCPP_NO_EXCEPTIONS 2008 for (; __first != __last; ++__first) 2009 push_back(*__first); 2010 #ifndef _LIBCPP_NO_EXCEPTIONS 2011 } 2012 catch (...) 2013 { 2014 if (__is_long()) 2015 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap()); 2016 throw; 2017 } 2018 #endif // _LIBCPP_NO_EXCEPTIONS 2019 } 2020 2021 template <class _CharT, class _Traits, class _Allocator> 2022 template <class _ForwardIterator> 2023 typename enable_if 2024 < 2025 __is_forward_iterator<_ForwardIterator>::value, 2026 void 2027 >::type 2028 basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last) 2029 { 2030 size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last)); 2031 if (__sz > max_size()) 2032 this->__throw_length_error(); 2033 pointer __p; 2034 if (__sz < __min_cap) 2035 { 2036 __set_short_size(__sz); 2037 __p = __get_short_pointer(); 2038 } 2039 else 2040 { 2041 size_type __cap = __recommend(__sz); 2042 __p = __alloc_traits::allocate(__alloc(), __cap+1); 2043 __set_long_pointer(__p); 2044 __set_long_cap(__cap+1); 2045 __set_long_size(__sz); 2046 } 2047 for (; __first != __last; ++__first, ++__p) 2048 traits_type::assign(*__p, *__first); 2049 traits_type::assign(*__p, value_type()); 2050 } 2051 2052 template <class _CharT, class _Traits, class _Allocator> 2053 template<class _InputIterator> 2054 _LIBCPP_INLINE_VISIBILITY inline 2055 basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last) 2056 { 2057 __init(__first, __last); 2058 } 2059 2060 template <class _CharT, class _Traits, class _Allocator> 2061 template<class _InputIterator> 2062 _LIBCPP_INLINE_VISIBILITY inline 2063 basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last, 2064 const allocator_type& __a) 2065 : __r_(__a) 2066 { 2067 __init(__first, __last); 2068 } 2069 2070 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2071 2072 template <class _CharT, class _Traits, class _Allocator> 2073 _LIBCPP_INLINE_VISIBILITY inline 2074 basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il) 2075 { 2076 __init(__il.begin(), __il.end()); 2077 } 2078 2079 template <class _CharT, class _Traits, class _Allocator> 2080 _LIBCPP_INLINE_VISIBILITY inline 2081 basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il, const allocator_type& __a) 2082 : __r_(__a) 2083 { 2084 __init(__il.begin(), __il.end()); 2085 } 2086 2087 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2088 2089 template <class _CharT, class _Traits, class _Allocator> 2090 basic_string<_CharT, _Traits, _Allocator>::~basic_string() 2091 { 2092 __invalidate_all_iterators(); 2093 if (__is_long()) 2094 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap()); 2095 } 2096 2097 template <class _CharT, class _Traits, class _Allocator> 2098 void 2099 basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace 2100 (size_type __old_cap, size_type __delta_cap, size_type __old_sz, 2101 size_type __n_copy, size_type __n_del, size_type __n_add, const value_type* __p_new_stuff) 2102 { 2103 size_type __ms = max_size(); 2104 if (__delta_cap > __ms - __old_cap - 1) 2105 this->__throw_length_error(); 2106 pointer __old_p = __get_pointer(); 2107 size_type __cap = __old_cap < __ms / 2 - __alignment ? 2108 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) : 2109 __ms - 1; 2110 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1); 2111 __invalidate_all_iterators(); 2112 if (__n_copy != 0) 2113 traits_type::copy(_VSTD::__to_raw_pointer(__p), 2114 _VSTD::__to_raw_pointer(__old_p), __n_copy); 2115 if (__n_add != 0) 2116 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy, __p_new_stuff, __n_add); 2117 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy; 2118 if (__sec_cp_sz != 0) 2119 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add, 2120 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del, __sec_cp_sz); 2121 if (__old_cap+1 != __min_cap) 2122 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1); 2123 __set_long_pointer(__p); 2124 __set_long_cap(__cap+1); 2125 __old_sz = __n_copy + __n_add + __sec_cp_sz; 2126 __set_long_size(__old_sz); 2127 traits_type::assign(__p[__old_sz], value_type()); 2128 } 2129 2130 template <class _CharT, class _Traits, class _Allocator> 2131 void 2132 basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz, 2133 size_type __n_copy, size_type __n_del, size_type __n_add) 2134 { 2135 size_type __ms = max_size(); 2136 if (__delta_cap > __ms - __old_cap - 1) 2137 this->__throw_length_error(); 2138 pointer __old_p = __get_pointer(); 2139 size_type __cap = __old_cap < __ms / 2 - __alignment ? 2140 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) : 2141 __ms - 1; 2142 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1); 2143 __invalidate_all_iterators(); 2144 if (__n_copy != 0) 2145 traits_type::copy(_VSTD::__to_raw_pointer(__p), 2146 _VSTD::__to_raw_pointer(__old_p), __n_copy); 2147 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy; 2148 if (__sec_cp_sz != 0) 2149 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add, 2150 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del, 2151 __sec_cp_sz); 2152 if (__old_cap+1 != __min_cap) 2153 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1); 2154 __set_long_pointer(__p); 2155 __set_long_cap(__cap+1); 2156 } 2157 2158 // assign 2159 2160 template <class _CharT, class _Traits, class _Allocator> 2161 basic_string<_CharT, _Traits, _Allocator>& 2162 basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n) 2163 { 2164 #ifdef _LIBCPP_DEBUG 2165 assert(__s != 0); 2166 #endif 2167 size_type __cap = capacity(); 2168 if (__cap >= __n) 2169 { 2170 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer()); 2171 traits_type::move(__p, __s, __n); 2172 traits_type::assign(__p[__n], value_type()); 2173 __set_size(__n); 2174 __invalidate_iterators_past(__n); 2175 } 2176 else 2177 { 2178 size_type __sz = size(); 2179 __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s); 2180 } 2181 return *this; 2182 } 2183 2184 template <class _CharT, class _Traits, class _Allocator> 2185 basic_string<_CharT, _Traits, _Allocator>& 2186 basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c) 2187 { 2188 size_type __cap = capacity(); 2189 if (__cap < __n) 2190 { 2191 size_type __sz = size(); 2192 __grow_by(__cap, __n - __cap, __sz, 0, __sz); 2193 } 2194 else 2195 __invalidate_iterators_past(__n); 2196 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer()); 2197 traits_type::assign(__p, __n, __c); 2198 traits_type::assign(__p[__n], value_type()); 2199 __set_size(__n); 2200 return *this; 2201 } 2202 2203 template <class _CharT, class _Traits, class _Allocator> 2204 basic_string<_CharT, _Traits, _Allocator>& 2205 basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c) 2206 { 2207 pointer __p; 2208 if (__is_long()) 2209 { 2210 __p = __get_long_pointer(); 2211 __set_long_size(1); 2212 } 2213 else 2214 { 2215 __p = __get_short_pointer(); 2216 __set_short_size(1); 2217 } 2218 traits_type::assign(*__p, __c); 2219 traits_type::assign(*++__p, value_type()); 2220 __invalidate_iterators_past(1); 2221 return *this; 2222 } 2223 2224 template <class _CharT, class _Traits, class _Allocator> 2225 basic_string<_CharT, _Traits, _Allocator>& 2226 basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str) 2227 { 2228 if (this != &__str) 2229 { 2230 __copy_assign_alloc(__str); 2231 assign(__str); 2232 } 2233 return *this; 2234 } 2235 2236 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2237 2238 template <class _CharT, class _Traits, class _Allocator> 2239 _LIBCPP_INLINE_VISIBILITY inline 2240 void 2241 basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type) 2242 { 2243 if (__alloc() != __str.__alloc()) 2244 assign(__str); 2245 else 2246 __move_assign(__str, true_type()); 2247 } 2248 2249 template <class _CharT, class _Traits, class _Allocator> 2250 _LIBCPP_INLINE_VISIBILITY inline 2251 void 2252 basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type) 2253 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 2254 { 2255 clear(); 2256 shrink_to_fit(); 2257 __r_.first() = __str.__r_.first(); 2258 __move_assign_alloc(__str); 2259 __str.__zero(); 2260 } 2261 2262 template <class _CharT, class _Traits, class _Allocator> 2263 _LIBCPP_INLINE_VISIBILITY inline 2264 basic_string<_CharT, _Traits, _Allocator>& 2265 basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str) 2266 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && 2267 is_nothrow_move_assignable<allocator_type>::value) 2268 { 2269 __move_assign(__str, integral_constant<bool, 2270 __alloc_traits::propagate_on_container_move_assignment::value>()); 2271 return *this; 2272 } 2273 2274 #endif 2275 2276 template <class _CharT, class _Traits, class _Allocator> 2277 template<class _InputIterator> 2278 typename enable_if 2279 < 2280 __is_input_iterator <_InputIterator>::value && 2281 !__is_forward_iterator<_InputIterator>::value, 2282 basic_string<_CharT, _Traits, _Allocator>& 2283 >::type 2284 basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last) 2285 { 2286 clear(); 2287 for (; __first != __last; ++__first) 2288 push_back(*__first); 2289 return *this; 2290 } 2291 2292 template <class _CharT, class _Traits, class _Allocator> 2293 template<class _ForwardIterator> 2294 typename enable_if 2295 < 2296 __is_forward_iterator<_ForwardIterator>::value, 2297 basic_string<_CharT, _Traits, _Allocator>& 2298 >::type 2299 basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) 2300 { 2301 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 2302 size_type __cap = capacity(); 2303 if (__cap < __n) 2304 { 2305 size_type __sz = size(); 2306 __grow_by(__cap, __n - __cap, __sz, 0, __sz); 2307 } 2308 else 2309 __invalidate_iterators_past(__n); 2310 pointer __p = __get_pointer(); 2311 for (; __first != __last; ++__first, ++__p) 2312 traits_type::assign(*__p, *__first); 2313 traits_type::assign(*__p, value_type()); 2314 __set_size(__n); 2315 return *this; 2316 } 2317 2318 template <class _CharT, class _Traits, class _Allocator> 2319 _LIBCPP_INLINE_VISIBILITY inline 2320 basic_string<_CharT, _Traits, _Allocator>& 2321 basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str) 2322 { 2323 return assign(__str.data(), __str.size()); 2324 } 2325 2326 template <class _CharT, class _Traits, class _Allocator> 2327 basic_string<_CharT, _Traits, _Allocator>& 2328 basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n) 2329 { 2330 size_type __sz = __str.size(); 2331 if (__pos > __sz) 2332 this->__throw_out_of_range(); 2333 return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos)); 2334 } 2335 2336 template <class _CharT, class _Traits, class _Allocator> 2337 basic_string<_CharT, _Traits, _Allocator>& 2338 basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s) 2339 { 2340 #ifdef _LIBCPP_DEBUG 2341 assert(__s != 0); 2342 #endif 2343 return assign(__s, traits_type::length(__s)); 2344 } 2345 2346 // append 2347 2348 template <class _CharT, class _Traits, class _Allocator> 2349 basic_string<_CharT, _Traits, _Allocator>& 2350 basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n) 2351 { 2352 #ifdef _LIBCPP_DEBUG 2353 assert(__s != 0); 2354 #endif 2355 size_type __cap = capacity(); 2356 size_type __sz = size(); 2357 if (__cap - __sz >= __n) 2358 { 2359 if (__n) 2360 { 2361 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer()); 2362 traits_type::copy(__p + __sz, __s, __n); 2363 __sz += __n; 2364 __set_size(__sz); 2365 traits_type::assign(__p[__sz], value_type()); 2366 } 2367 } 2368 else 2369 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s); 2370 return *this; 2371 } 2372 2373 template <class _CharT, class _Traits, class _Allocator> 2374 basic_string<_CharT, _Traits, _Allocator>& 2375 basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c) 2376 { 2377 if (__n) 2378 { 2379 size_type __cap = capacity(); 2380 size_type __sz = size(); 2381 if (__cap - __sz < __n) 2382 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0); 2383 pointer __p = __get_pointer(); 2384 traits_type::assign(_VSTD::__to_raw_pointer(__p) + __sz, __n, __c); 2385 __sz += __n; 2386 __set_size(__sz); 2387 traits_type::assign(__p[__sz], value_type()); 2388 } 2389 return *this; 2390 } 2391 2392 template <class _CharT, class _Traits, class _Allocator> 2393 void 2394 basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c) 2395 { 2396 bool __is_short = !__is_long(); 2397 size_type __cap; 2398 size_type __sz; 2399 if (__is_short) 2400 { 2401 __cap = __min_cap - 1; 2402 __sz = __get_short_size(); 2403 } 2404 else 2405 { 2406 __cap = __get_long_cap() - 1; 2407 __sz = __get_long_size(); 2408 } 2409 if (__sz == __cap) 2410 { 2411 __grow_by(__cap, 1, __sz, __sz, 0); 2412 __is_short = !__is_long(); 2413 } 2414 pointer __p; 2415 if (__is_short) 2416 { 2417 __p = __get_short_pointer() + __sz; 2418 __set_short_size(__sz+1); 2419 } 2420 else 2421 { 2422 __p = __get_long_pointer() + __sz; 2423 __set_long_size(__sz+1); 2424 } 2425 traits_type::assign(*__p, __c); 2426 traits_type::assign(*++__p, value_type()); 2427 } 2428 2429 template <class _CharT, class _Traits, class _Allocator> 2430 template<class _InputIterator> 2431 typename enable_if 2432 < 2433 __is_input_iterator <_InputIterator>::value && 2434 !__is_forward_iterator<_InputIterator>::value, 2435 basic_string<_CharT, _Traits, _Allocator>& 2436 >::type 2437 basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last) 2438 { 2439 for (; __first != __last; ++__first) 2440 push_back(*__first); 2441 return *this; 2442 } 2443 2444 template <class _CharT, class _Traits, class _Allocator> 2445 template<class _ForwardIterator> 2446 typename enable_if 2447 < 2448 __is_forward_iterator<_ForwardIterator>::value, 2449 basic_string<_CharT, _Traits, _Allocator>& 2450 >::type 2451 basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last) 2452 { 2453 size_type __sz = size(); 2454 size_type __cap = capacity(); 2455 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 2456 if (__n) 2457 { 2458 if (__cap - __sz < __n) 2459 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0); 2460 pointer __p = __get_pointer() + __sz; 2461 for (; __first != __last; ++__p, ++__first) 2462 traits_type::assign(*__p, *__first); 2463 traits_type::assign(*__p, value_type()); 2464 __set_size(__sz + __n); 2465 } 2466 return *this; 2467 } 2468 2469 template <class _CharT, class _Traits, class _Allocator> 2470 _LIBCPP_INLINE_VISIBILITY inline 2471 basic_string<_CharT, _Traits, _Allocator>& 2472 basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str) 2473 { 2474 return append(__str.data(), __str.size()); 2475 } 2476 2477 template <class _CharT, class _Traits, class _Allocator> 2478 basic_string<_CharT, _Traits, _Allocator>& 2479 basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n) 2480 { 2481 size_type __sz = __str.size(); 2482 if (__pos > __sz) 2483 this->__throw_out_of_range(); 2484 return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos)); 2485 } 2486 2487 template <class _CharT, class _Traits, class _Allocator> 2488 basic_string<_CharT, _Traits, _Allocator>& 2489 basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s) 2490 { 2491 #ifdef _LIBCPP_DEBUG 2492 assert(__s != 0); 2493 #endif 2494 return append(__s, traits_type::length(__s)); 2495 } 2496 2497 // insert 2498 2499 template <class _CharT, class _Traits, class _Allocator> 2500 basic_string<_CharT, _Traits, _Allocator>& 2501 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n) 2502 { 2503 #ifdef _LIBCPP_DEBUG 2504 assert(__s != 0); 2505 #endif 2506 size_type __sz = size(); 2507 if (__pos > __sz) 2508 this->__throw_out_of_range(); 2509 size_type __cap = capacity(); 2510 if (__cap - __sz >= __n) 2511 { 2512 if (__n) 2513 { 2514 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer()); 2515 size_type __n_move = __sz - __pos; 2516 if (__n_move != 0) 2517 { 2518 if (__p + __pos <= __s && __s < __p + __sz) 2519 __s += __n; 2520 traits_type::move(__p + __pos + __n, __p + __pos, __n_move); 2521 } 2522 traits_type::move(__p + __pos, __s, __n); 2523 __sz += __n; 2524 __set_size(__sz); 2525 traits_type::assign(__p[__sz], value_type()); 2526 } 2527 } 2528 else 2529 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s); 2530 return *this; 2531 } 2532 2533 template <class _CharT, class _Traits, class _Allocator> 2534 basic_string<_CharT, _Traits, _Allocator>& 2535 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c) 2536 { 2537 size_type __sz = size(); 2538 if (__pos > __sz) 2539 this->__throw_out_of_range(); 2540 if (__n) 2541 { 2542 size_type __cap = capacity(); 2543 value_type* __p; 2544 if (__cap - __sz >= __n) 2545 { 2546 __p = _VSTD::__to_raw_pointer(__get_pointer()); 2547 size_type __n_move = __sz - __pos; 2548 if (__n_move != 0) 2549 traits_type::move(__p + __pos + __n, __p + __pos, __n_move); 2550 } 2551 else 2552 { 2553 __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n); 2554 __p = _VSTD::__to_raw_pointer(__get_long_pointer()); 2555 } 2556 traits_type::assign(__p + __pos, __n, __c); 2557 __sz += __n; 2558 __set_size(__sz); 2559 traits_type::assign(__p[__sz], value_type()); 2560 } 2561 return *this; 2562 } 2563 2564 template <class _CharT, class _Traits, class _Allocator> 2565 template<class _InputIterator> 2566 typename enable_if 2567 < 2568 __is_input_iterator <_InputIterator>::value && 2569 !__is_forward_iterator<_InputIterator>::value, 2570 typename basic_string<_CharT, _Traits, _Allocator>::iterator 2571 >::type 2572 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last) 2573 { 2574 size_type __old_sz = size(); 2575 difference_type __ip = __pos - begin(); 2576 for (; __first != __last; ++__first) 2577 push_back(*__first); 2578 pointer __p = __get_pointer(); 2579 _VSTD::rotate(__p + __ip, __p + __old_sz, __p + size()); 2580 return iterator(__p + __ip); 2581 } 2582 2583 template <class _CharT, class _Traits, class _Allocator> 2584 template<class _ForwardIterator> 2585 typename enable_if 2586 < 2587 __is_forward_iterator<_ForwardIterator>::value, 2588 typename basic_string<_CharT, _Traits, _Allocator>::iterator 2589 >::type 2590 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last) 2591 { 2592 size_type __ip = static_cast<size_type>(__pos - begin()); 2593 size_type __sz = size(); 2594 size_type __cap = capacity(); 2595 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 2596 if (__n) 2597 { 2598 value_type* __p; 2599 if (__cap - __sz >= __n) 2600 { 2601 __p = _VSTD::__to_raw_pointer(__get_pointer()); 2602 size_type __n_move = __sz - __ip; 2603 if (__n_move != 0) 2604 traits_type::move(__p + __ip + __n, __p + __ip, __n_move); 2605 } 2606 else 2607 { 2608 __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n); 2609 __p = _VSTD::__to_raw_pointer(__get_long_pointer()); 2610 } 2611 __sz += __n; 2612 __set_size(__sz); 2613 traits_type::assign(__p[__sz], value_type()); 2614 for (__p += __ip; __first != __last; ++__p, ++__first) 2615 traits_type::assign(*__p, *__first); 2616 } 2617 return begin() + __ip; 2618 } 2619 2620 template <class _CharT, class _Traits, class _Allocator> 2621 _LIBCPP_INLINE_VISIBILITY inline 2622 basic_string<_CharT, _Traits, _Allocator>& 2623 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str) 2624 { 2625 return insert(__pos1, __str.data(), __str.size()); 2626 } 2627 2628 template <class _CharT, class _Traits, class _Allocator> 2629 basic_string<_CharT, _Traits, _Allocator>& 2630 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str, 2631 size_type __pos2, size_type __n) 2632 { 2633 size_type __str_sz = __str.size(); 2634 if (__pos2 > __str_sz) 2635 this->__throw_out_of_range(); 2636 return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2)); 2637 } 2638 2639 template <class _CharT, class _Traits, class _Allocator> 2640 basic_string<_CharT, _Traits, _Allocator>& 2641 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s) 2642 { 2643 #ifdef _LIBCPP_DEBUG 2644 assert(__s != 0); 2645 #endif 2646 return insert(__pos, __s, traits_type::length(__s)); 2647 } 2648 2649 template <class _CharT, class _Traits, class _Allocator> 2650 typename basic_string<_CharT, _Traits, _Allocator>::iterator 2651 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c) 2652 { 2653 size_type __ip = static_cast<size_type>(__pos - begin()); 2654 size_type __sz = size(); 2655 size_type __cap = capacity(); 2656 value_type* __p; 2657 if (__cap == __sz) 2658 { 2659 __grow_by(__cap, 1, __sz, __ip, 0, 1); 2660 __p = _VSTD::__to_raw_pointer(__get_long_pointer()); 2661 } 2662 else 2663 { 2664 __p = _VSTD::__to_raw_pointer(__get_pointer()); 2665 size_type __n_move = __sz - __ip; 2666 if (__n_move != 0) 2667 traits_type::move(__p + __ip + 1, __p + __ip, __n_move); 2668 } 2669 traits_type::assign(__p[__ip], __c); 2670 traits_type::assign(__p[++__sz], value_type()); 2671 __set_size(__sz); 2672 return begin() + static_cast<difference_type>(__ip); 2673 } 2674 2675 template <class _CharT, class _Traits, class _Allocator> 2676 _LIBCPP_INLINE_VISIBILITY inline 2677 typename basic_string<_CharT, _Traits, _Allocator>::iterator 2678 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c) 2679 { 2680 difference_type __p = __pos - begin(); 2681 insert(static_cast<size_type>(__p), __n, __c); 2682 return begin() + __p; 2683 } 2684 2685 // replace 2686 2687 template <class _CharT, class _Traits, class _Allocator> 2688 basic_string<_CharT, _Traits, _Allocator>& 2689 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2) 2690 { 2691 #ifdef _LIBCPP_DEBUG 2692 assert(__s != 0); 2693 #endif 2694 size_type __sz = size(); 2695 if (__pos > __sz) 2696 this->__throw_out_of_range(); 2697 __n1 = _VSTD::min(__n1, __sz - __pos); 2698 size_type __cap = capacity(); 2699 if (__cap - __sz + __n1 >= __n2) 2700 { 2701 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer()); 2702 if (__n1 != __n2) 2703 { 2704 size_type __n_move = __sz - __pos - __n1; 2705 if (__n_move != 0) 2706 { 2707 if (__n1 > __n2) 2708 { 2709 traits_type::move(__p + __pos, __s, __n2); 2710 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move); 2711 goto __finish; 2712 } 2713 if (__p + __pos < __s && __s < __p + __sz) 2714 { 2715 if (__p + __pos + __n1 <= __s) 2716 __s += __n2 - __n1; 2717 else // __p + __pos < __s < __p + __pos + __n1 2718 { 2719 traits_type::move(__p + __pos, __s, __n1); 2720 __pos += __n1; 2721 __s += __n2; 2722 __n2 -= __n1; 2723 __n1 = 0; 2724 } 2725 } 2726 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move); 2727 } 2728 } 2729 traits_type::move(__p + __pos, __s, __n2); 2730 __finish: 2731 __sz += __n2 - __n1; 2732 __set_size(__sz); 2733 __invalidate_iterators_past(__sz); 2734 traits_type::assign(__p[__sz], value_type()); 2735 } 2736 else 2737 __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s); 2738 return *this; 2739 } 2740 2741 template <class _CharT, class _Traits, class _Allocator> 2742 basic_string<_CharT, _Traits, _Allocator>& 2743 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c) 2744 { 2745 size_type __sz = size(); 2746 if (__pos > __sz) 2747 this->__throw_out_of_range(); 2748 __n1 = _VSTD::min(__n1, __sz - __pos); 2749 size_type __cap = capacity(); 2750 value_type* __p; 2751 if (__cap - __sz + __n1 >= __n2) 2752 { 2753 __p = _VSTD::__to_raw_pointer(__get_pointer()); 2754 if (__n1 != __n2) 2755 { 2756 size_type __n_move = __sz - __pos - __n1; 2757 if (__n_move != 0) 2758 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move); 2759 } 2760 } 2761 else 2762 { 2763 __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2); 2764 __p = _VSTD::__to_raw_pointer(__get_long_pointer()); 2765 } 2766 traits_type::assign(__p + __pos, __n2, __c); 2767 __sz += __n2 - __n1; 2768 __set_size(__sz); 2769 __invalidate_iterators_past(__sz); 2770 traits_type::assign(__p[__sz], value_type()); 2771 return *this; 2772 } 2773 2774 template <class _CharT, class _Traits, class _Allocator> 2775 template<class _InputIterator> 2776 typename enable_if 2777 < 2778 __is_input_iterator<_InputIterator>::value, 2779 basic_string<_CharT, _Traits, _Allocator>& 2780 >::type 2781 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, 2782 _InputIterator __j1, _InputIterator __j2) 2783 { 2784 for (; true; ++__i1, ++__j1) 2785 { 2786 if (__i1 == __i2) 2787 { 2788 if (__j1 != __j2) 2789 insert(__i1, __j1, __j2); 2790 break; 2791 } 2792 if (__j1 == __j2) 2793 { 2794 erase(__i1, __i2); 2795 break; 2796 } 2797 traits_type::assign(const_cast<value_type&>(*__i1), *__j1); 2798 } 2799 return *this; 2800 } 2801 2802 template <class _CharT, class _Traits, class _Allocator> 2803 _LIBCPP_INLINE_VISIBILITY inline 2804 basic_string<_CharT, _Traits, _Allocator>& 2805 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str) 2806 { 2807 return replace(__pos1, __n1, __str.data(), __str.size()); 2808 } 2809 2810 template <class _CharT, class _Traits, class _Allocator> 2811 basic_string<_CharT, _Traits, _Allocator>& 2812 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str, 2813 size_type __pos2, size_type __n2) 2814 { 2815 size_type __str_sz = __str.size(); 2816 if (__pos2 > __str_sz) 2817 this->__throw_out_of_range(); 2818 return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2)); 2819 } 2820 2821 template <class _CharT, class _Traits, class _Allocator> 2822 basic_string<_CharT, _Traits, _Allocator>& 2823 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s) 2824 { 2825 #ifdef _LIBCPP_DEBUG 2826 assert(__s != 0); 2827 #endif 2828 return replace(__pos, __n1, __s, traits_type::length(__s)); 2829 } 2830 2831 template <class _CharT, class _Traits, class _Allocator> 2832 _LIBCPP_INLINE_VISIBILITY inline 2833 basic_string<_CharT, _Traits, _Allocator>& 2834 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str) 2835 { 2836 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), 2837 __str.data(), __str.size()); 2838 } 2839 2840 template <class _CharT, class _Traits, class _Allocator> 2841 _LIBCPP_INLINE_VISIBILITY inline 2842 basic_string<_CharT, _Traits, _Allocator>& 2843 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n) 2844 { 2845 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n); 2846 } 2847 2848 template <class _CharT, class _Traits, class _Allocator> 2849 _LIBCPP_INLINE_VISIBILITY inline 2850 basic_string<_CharT, _Traits, _Allocator>& 2851 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s) 2852 { 2853 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s); 2854 } 2855 2856 template <class _CharT, class _Traits, class _Allocator> 2857 _LIBCPP_INLINE_VISIBILITY inline 2858 basic_string<_CharT, _Traits, _Allocator>& 2859 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c) 2860 { 2861 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c); 2862 } 2863 2864 // erase 2865 2866 template <class _CharT, class _Traits, class _Allocator> 2867 basic_string<_CharT, _Traits, _Allocator>& 2868 basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n) 2869 { 2870 size_type __sz = size(); 2871 if (__pos > __sz) 2872 this->__throw_out_of_range(); 2873 if (__n) 2874 { 2875 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer()); 2876 __n = _VSTD::min(__n, __sz - __pos); 2877 size_type __n_move = __sz - __pos - __n; 2878 if (__n_move != 0) 2879 traits_type::move(__p + __pos, __p + __pos + __n, __n_move); 2880 __sz -= __n; 2881 __set_size(__sz); 2882 __invalidate_iterators_past(__sz); 2883 traits_type::assign(__p[__sz], value_type()); 2884 } 2885 return *this; 2886 } 2887 2888 template <class _CharT, class _Traits, class _Allocator> 2889 _LIBCPP_INLINE_VISIBILITY inline 2890 typename basic_string<_CharT, _Traits, _Allocator>::iterator 2891 basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos) 2892 { 2893 iterator __b = begin(); 2894 size_type __r = static_cast<size_type>(__pos - __b); 2895 erase(__r, 1); 2896 return __b + static_cast<difference_type>(__r); 2897 } 2898 2899 template <class _CharT, class _Traits, class _Allocator> 2900 _LIBCPP_INLINE_VISIBILITY inline 2901 typename basic_string<_CharT, _Traits, _Allocator>::iterator 2902 basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last) 2903 { 2904 iterator __b = begin(); 2905 size_type __r = static_cast<size_type>(__first - __b); 2906 erase(__r, static_cast<size_type>(__last - __first)); 2907 return __b + static_cast<difference_type>(__r); 2908 } 2909 2910 template <class _CharT, class _Traits, class _Allocator> 2911 _LIBCPP_INLINE_VISIBILITY inline 2912 void 2913 basic_string<_CharT, _Traits, _Allocator>::pop_back() 2914 { 2915 #ifdef _LIBCPP_DEBUG 2916 assert(!empty()); 2917 #endif 2918 size_type __sz; 2919 if (__is_long()) 2920 { 2921 __sz = __get_long_size() - 1; 2922 __set_long_size(__sz); 2923 traits_type::assign(*(__get_long_pointer() + __sz), value_type()); 2924 } 2925 else 2926 { 2927 __sz = __get_short_size() - 1; 2928 __set_short_size(__sz); 2929 traits_type::assign(*(__get_short_pointer() + __sz), value_type()); 2930 } 2931 __invalidate_iterators_past(__sz); 2932 } 2933 2934 template <class _CharT, class _Traits, class _Allocator> 2935 _LIBCPP_INLINE_VISIBILITY inline 2936 void 2937 basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT 2938 { 2939 __invalidate_all_iterators(); 2940 if (__is_long()) 2941 { 2942 traits_type::assign(*__get_long_pointer(), value_type()); 2943 __set_long_size(0); 2944 } 2945 else 2946 { 2947 traits_type::assign(*__get_short_pointer(), value_type()); 2948 __set_short_size(0); 2949 } 2950 } 2951 2952 template <class _CharT, class _Traits, class _Allocator> 2953 _LIBCPP_INLINE_VISIBILITY inline 2954 void 2955 basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos) 2956 { 2957 if (__is_long()) 2958 { 2959 traits_type::assign(*(__get_long_pointer() + __pos), value_type()); 2960 __set_long_size(__pos); 2961 } 2962 else 2963 { 2964 traits_type::assign(*(__get_short_pointer() + __pos), value_type()); 2965 __set_short_size(__pos); 2966 } 2967 __invalidate_iterators_past(__pos); 2968 } 2969 2970 template <class _CharT, class _Traits, class _Allocator> 2971 void 2972 basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c) 2973 { 2974 size_type __sz = size(); 2975 if (__n > __sz) 2976 append(__n - __sz, __c); 2977 else 2978 __erase_to_end(__n); 2979 } 2980 2981 template <class _CharT, class _Traits, class _Allocator> 2982 _LIBCPP_INLINE_VISIBILITY inline 2983 typename basic_string<_CharT, _Traits, _Allocator>::size_type 2984 basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT 2985 { 2986 size_type __m = __alloc_traits::max_size(__alloc()); 2987 #if _LIBCPP_BIG_ENDIAN 2988 return (__m <= ~__long_mask ? __m : __m/2) - 1; 2989 #else 2990 return __m - 1; 2991 #endif 2992 } 2993 2994 template <class _CharT, class _Traits, class _Allocator> 2995 void 2996 basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg) 2997 { 2998 if (__res_arg > max_size()) 2999 this->__throw_length_error(); 3000 size_type __cap = capacity(); 3001 size_type __sz = size(); 3002 __res_arg = _VSTD::max(__res_arg, __sz); 3003 __res_arg = __recommend(__res_arg); 3004 if (__res_arg != __cap) 3005 { 3006 pointer __new_data, __p; 3007 bool __was_long, __now_long; 3008 if (__res_arg == __min_cap - 1) 3009 { 3010 __was_long = true; 3011 __now_long = false; 3012 __new_data = __get_short_pointer(); 3013 __p = __get_long_pointer(); 3014 } 3015 else 3016 { 3017 if (__res_arg > __cap) 3018 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1); 3019 else 3020 { 3021 #ifndef _LIBCPP_NO_EXCEPTIONS 3022 try 3023 { 3024 #endif // _LIBCPP_NO_EXCEPTIONS 3025 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1); 3026 #ifndef _LIBCPP_NO_EXCEPTIONS 3027 } 3028 catch (...) 3029 { 3030 return; 3031 } 3032 #else // _LIBCPP_NO_EXCEPTIONS 3033 if (__new_data == nullptr) 3034 return; 3035 #endif // _LIBCPP_NO_EXCEPTIONS 3036 } 3037 __now_long = true; 3038 __was_long = __is_long(); 3039 __p = __get_pointer(); 3040 } 3041 traits_type::copy(_VSTD::__to_raw_pointer(__new_data), 3042 _VSTD::__to_raw_pointer(__p), size()+1); 3043 if (__was_long) 3044 __alloc_traits::deallocate(__alloc(), __p, __cap+1); 3045 if (__now_long) 3046 { 3047 __set_long_cap(__res_arg+1); 3048 __set_long_size(__sz); 3049 __set_long_pointer(__new_data); 3050 } 3051 else 3052 __set_short_size(__sz); 3053 __invalidate_all_iterators(); 3054 } 3055 } 3056 3057 template <class _CharT, class _Traits, class _Allocator> 3058 _LIBCPP_INLINE_VISIBILITY inline 3059 typename basic_string<_CharT, _Traits, _Allocator>::const_reference 3060 basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const 3061 { 3062 #ifdef __LIBCPP_DEBUG 3063 assert(__pos <= size()); 3064 #endif 3065 return *(data() + __pos); 3066 } 3067 3068 template <class _CharT, class _Traits, class _Allocator> 3069 _LIBCPP_INLINE_VISIBILITY inline 3070 typename basic_string<_CharT, _Traits, _Allocator>::reference 3071 basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) 3072 { 3073 #ifdef __LIBCPP_DEBUG 3074 assert(__pos < size()); 3075 #endif 3076 return *(__get_pointer() + __pos); 3077 } 3078 3079 template <class _CharT, class _Traits, class _Allocator> 3080 typename basic_string<_CharT, _Traits, _Allocator>::const_reference 3081 basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const 3082 { 3083 if (__n >= size()) 3084 this->__throw_out_of_range(); 3085 return (*this)[__n]; 3086 } 3087 3088 template <class _CharT, class _Traits, class _Allocator> 3089 typename basic_string<_CharT, _Traits, _Allocator>::reference 3090 basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) 3091 { 3092 if (__n >= size()) 3093 this->__throw_out_of_range(); 3094 return (*this)[__n]; 3095 } 3096 3097 template <class _CharT, class _Traits, class _Allocator> 3098 _LIBCPP_INLINE_VISIBILITY inline 3099 typename basic_string<_CharT, _Traits, _Allocator>::reference 3100 basic_string<_CharT, _Traits, _Allocator>::front() 3101 { 3102 #ifdef _LIBCPP_DEBUG 3103 assert(!empty()); 3104 #endif 3105 return *__get_pointer(); 3106 } 3107 3108 template <class _CharT, class _Traits, class _Allocator> 3109 _LIBCPP_INLINE_VISIBILITY inline 3110 typename basic_string<_CharT, _Traits, _Allocator>::const_reference 3111 basic_string<_CharT, _Traits, _Allocator>::front() const 3112 { 3113 #ifdef _LIBCPP_DEBUG 3114 assert(!empty()); 3115 #endif 3116 return *data(); 3117 } 3118 3119 template <class _CharT, class _Traits, class _Allocator> 3120 _LIBCPP_INLINE_VISIBILITY inline 3121 typename basic_string<_CharT, _Traits, _Allocator>::reference 3122 basic_string<_CharT, _Traits, _Allocator>::back() 3123 { 3124 #ifdef _LIBCPP_DEBUG 3125 assert(!empty()); 3126 #endif 3127 return *(__get_pointer() + size() - 1); 3128 } 3129 3130 template <class _CharT, class _Traits, class _Allocator> 3131 _LIBCPP_INLINE_VISIBILITY inline 3132 typename basic_string<_CharT, _Traits, _Allocator>::const_reference 3133 basic_string<_CharT, _Traits, _Allocator>::back() const 3134 { 3135 #ifdef _LIBCPP_DEBUG 3136 assert(!empty()); 3137 #endif 3138 return *(data() + size() - 1); 3139 } 3140 3141 template <class _CharT, class _Traits, class _Allocator> 3142 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3143 basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const 3144 { 3145 size_type __sz = size(); 3146 if (__pos > __sz) 3147 this->__throw_out_of_range(); 3148 size_type __rlen = _VSTD::min(__n, __sz - __pos); 3149 traits_type::copy(__s, data() + __pos, __rlen); 3150 return __rlen; 3151 } 3152 3153 template <class _CharT, class _Traits, class _Allocator> 3154 _LIBCPP_INLINE_VISIBILITY inline 3155 basic_string<_CharT, _Traits, _Allocator> 3156 basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const 3157 { 3158 return basic_string(*this, __pos, __n, __alloc()); 3159 } 3160 3161 template <class _CharT, class _Traits, class _Allocator> 3162 _LIBCPP_INLINE_VISIBILITY inline 3163 void 3164 basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str) 3165 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 3166 __is_nothrow_swappable<allocator_type>::value) 3167 { 3168 _VSTD::swap(__r_.first(), __str.__r_.first()); 3169 __swap_alloc(__alloc(), __str.__alloc()); 3170 #ifdef _LIBCPP_DEBUG 3171 __invalidate_all_iterators(); 3172 __str.__invalidate_all_iterators(); 3173 #endif // _LIBCPP_DEBUG 3174 } 3175 3176 // find 3177 3178 template <class _Traits> 3179 struct _LIBCPP_HIDDEN __traits_eq 3180 { 3181 typedef typename _Traits::char_type char_type; 3182 _LIBCPP_INLINE_VISIBILITY 3183 bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT 3184 {return _Traits::eq(__x, __y);} 3185 }; 3186 3187 template<class _CharT, class _Traits, class _Allocator> 3188 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3189 basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s, 3190 size_type __pos, 3191 size_type __n) const _NOEXCEPT 3192 { 3193 #ifdef _LIBCPP_DEBUG 3194 assert(__s != 0); 3195 #endif 3196 size_type __sz = size(); 3197 if (__pos > __sz || __sz - __pos < __n) 3198 return npos; 3199 if (__n == 0) 3200 return __pos; 3201 const value_type* __p = data(); 3202 const value_type* __r = _VSTD::search(__p + __pos, __p + __sz, __s, __s + __n, 3203 __traits_eq<traits_type>()); 3204 if (__r == __p + __sz) 3205 return npos; 3206 return static_cast<size_type>(__r - __p); 3207 } 3208 3209 template<class _CharT, class _Traits, class _Allocator> 3210 _LIBCPP_INLINE_VISIBILITY inline 3211 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3212 basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str, 3213 size_type __pos) const _NOEXCEPT 3214 { 3215 return find(__str.data(), __pos, __str.size()); 3216 } 3217 3218 template<class _CharT, class _Traits, class _Allocator> 3219 _LIBCPP_INLINE_VISIBILITY inline 3220 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3221 basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s, 3222 size_type __pos) const _NOEXCEPT 3223 { 3224 #ifdef _LIBCPP_DEBUG 3225 assert(__s != 0); 3226 #endif 3227 return find(__s, __pos, traits_type::length(__s)); 3228 } 3229 3230 template<class _CharT, class _Traits, class _Allocator> 3231 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3232 basic_string<_CharT, _Traits, _Allocator>::find(value_type __c, 3233 size_type __pos) const _NOEXCEPT 3234 { 3235 size_type __sz = size(); 3236 if (__pos >= __sz) 3237 return npos; 3238 const value_type* __p = data(); 3239 const value_type* __r = traits_type::find(__p + __pos, __sz - __pos, __c); 3240 if (__r == 0) 3241 return npos; 3242 return static_cast<size_type>(__r - __p); 3243 } 3244 3245 // rfind 3246 3247 template<class _CharT, class _Traits, class _Allocator> 3248 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3249 basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s, 3250 size_type __pos, 3251 size_type __n) const _NOEXCEPT 3252 { 3253 #ifdef _LIBCPP_DEBUG 3254 assert(__s != 0); 3255 #endif 3256 size_type __sz = size(); 3257 __pos = _VSTD::min(__pos, __sz); 3258 if (__n < __sz - __pos) 3259 __pos += __n; 3260 else 3261 __pos = __sz; 3262 const value_type* __p = data(); 3263 const value_type* __r = _VSTD::find_end(__p, __p + __pos, __s, __s + __n, 3264 __traits_eq<traits_type>()); 3265 if (__n > 0 && __r == __p + __pos) 3266 return npos; 3267 return static_cast<size_type>(__r - __p); 3268 } 3269 3270 template<class _CharT, class _Traits, class _Allocator> 3271 _LIBCPP_INLINE_VISIBILITY inline 3272 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3273 basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str, 3274 size_type __pos) const _NOEXCEPT 3275 { 3276 return rfind(__str.data(), __pos, __str.size()); 3277 } 3278 3279 template<class _CharT, class _Traits, class _Allocator> 3280 _LIBCPP_INLINE_VISIBILITY inline 3281 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3282 basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s, 3283 size_type __pos) const _NOEXCEPT 3284 { 3285 #ifdef _LIBCPP_DEBUG 3286 assert(__s != 0); 3287 #endif 3288 return rfind(__s, __pos, traits_type::length(__s)); 3289 } 3290 3291 template<class _CharT, class _Traits, class _Allocator> 3292 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3293 basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c, 3294 size_type __pos) const _NOEXCEPT 3295 { 3296 size_type __sz = size(); 3297 if (__sz) 3298 { 3299 if (__pos < __sz) 3300 ++__pos; 3301 else 3302 __pos = __sz; 3303 const value_type* __p = data(); 3304 for (const value_type* __ps = __p + __pos; __ps != __p;) 3305 { 3306 if (traits_type::eq(*--__ps, __c)) 3307 return static_cast<size_type>(__ps - __p); 3308 } 3309 } 3310 return npos; 3311 } 3312 3313 // find_first_of 3314 3315 template<class _CharT, class _Traits, class _Allocator> 3316 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3317 basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s, 3318 size_type __pos, 3319 size_type __n) const _NOEXCEPT 3320 { 3321 #ifdef _LIBCPP_DEBUG 3322 assert(__s != 0); 3323 #endif 3324 size_type __sz = size(); 3325 if (__pos >= __sz || __n == 0) 3326 return npos; 3327 const value_type* __p = data(); 3328 const value_type* __r = _VSTD::find_first_of(__p + __pos, __p + __sz, __s, 3329 __s + __n, __traits_eq<traits_type>()); 3330 if (__r == __p + __sz) 3331 return npos; 3332 return static_cast<size_type>(__r - __p); 3333 } 3334 3335 template<class _CharT, class _Traits, class _Allocator> 3336 _LIBCPP_INLINE_VISIBILITY inline 3337 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3338 basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str, 3339 size_type __pos) const _NOEXCEPT 3340 { 3341 return find_first_of(__str.data(), __pos, __str.size()); 3342 } 3343 3344 template<class _CharT, class _Traits, class _Allocator> 3345 _LIBCPP_INLINE_VISIBILITY inline 3346 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3347 basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s, 3348 size_type __pos) const _NOEXCEPT 3349 { 3350 #ifdef _LIBCPP_DEBUG 3351 assert(__s != 0); 3352 #endif 3353 return find_first_of(__s, __pos, traits_type::length(__s)); 3354 } 3355 3356 template<class _CharT, class _Traits, class _Allocator> 3357 _LIBCPP_INLINE_VISIBILITY inline 3358 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3359 basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c, 3360 size_type __pos) const _NOEXCEPT 3361 { 3362 return find(__c, __pos); 3363 } 3364 3365 // find_last_of 3366 3367 template<class _CharT, class _Traits, class _Allocator> 3368 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3369 basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s, 3370 size_type __pos, 3371 size_type __n) const _NOEXCEPT 3372 { 3373 #ifdef _LIBCPP_DEBUG 3374 assert(__s != 0); 3375 #endif 3376 if (__n != 0) 3377 { 3378 size_type __sz = size(); 3379 if (__pos < __sz) 3380 ++__pos; 3381 else 3382 __pos = __sz; 3383 const value_type* __p = data(); 3384 for (const value_type* __ps = __p + __pos; __ps != __p;) 3385 { 3386 const value_type* __r = traits_type::find(__s, __n, *--__ps); 3387 if (__r) 3388 return static_cast<size_type>(__ps - __p); 3389 } 3390 } 3391 return npos; 3392 } 3393 3394 template<class _CharT, class _Traits, class _Allocator> 3395 _LIBCPP_INLINE_VISIBILITY inline 3396 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3397 basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str, 3398 size_type __pos) const _NOEXCEPT 3399 { 3400 return find_last_of(__str.data(), __pos, __str.size()); 3401 } 3402 3403 template<class _CharT, class _Traits, class _Allocator> 3404 _LIBCPP_INLINE_VISIBILITY inline 3405 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3406 basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s, 3407 size_type __pos) const _NOEXCEPT 3408 { 3409 #ifdef _LIBCPP_DEBUG 3410 assert(__s != 0); 3411 #endif 3412 return find_last_of(__s, __pos, traits_type::length(__s)); 3413 } 3414 3415 template<class _CharT, class _Traits, class _Allocator> 3416 _LIBCPP_INLINE_VISIBILITY inline 3417 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3418 basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c, 3419 size_type __pos) const _NOEXCEPT 3420 { 3421 return rfind(__c, __pos); 3422 } 3423 3424 // find_first_not_of 3425 3426 template<class _CharT, class _Traits, class _Allocator> 3427 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3428 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s, 3429 size_type __pos, 3430 size_type __n) const _NOEXCEPT 3431 { 3432 #ifdef _LIBCPP_DEBUG 3433 assert(__s != 0); 3434 #endif 3435 size_type __sz = size(); 3436 if (__pos < __sz) 3437 { 3438 const value_type* __p = data(); 3439 const value_type* __pe = __p + __sz; 3440 for (const value_type* __ps = __p + __pos; __ps != __pe; ++__ps) 3441 if (traits_type::find(__s, __n, *__ps) == 0) 3442 return static_cast<size_type>(__ps - __p); 3443 } 3444 return npos; 3445 } 3446 3447 template<class _CharT, class _Traits, class _Allocator> 3448 _LIBCPP_INLINE_VISIBILITY inline 3449 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3450 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str, 3451 size_type __pos) const _NOEXCEPT 3452 { 3453 return find_first_not_of(__str.data(), __pos, __str.size()); 3454 } 3455 3456 template<class _CharT, class _Traits, class _Allocator> 3457 _LIBCPP_INLINE_VISIBILITY inline 3458 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3459 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s, 3460 size_type __pos) const _NOEXCEPT 3461 { 3462 #ifdef _LIBCPP_DEBUG 3463 assert(__s != 0); 3464 #endif 3465 return find_first_not_of(__s, __pos, traits_type::length(__s)); 3466 } 3467 3468 template<class _CharT, class _Traits, class _Allocator> 3469 _LIBCPP_INLINE_VISIBILITY inline 3470 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3471 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c, 3472 size_type __pos) const _NOEXCEPT 3473 { 3474 size_type __sz = size(); 3475 if (__pos < __sz) 3476 { 3477 const value_type* __p = data(); 3478 const value_type* __pe = __p + __sz; 3479 for (const value_type* __ps = __p + __pos; __ps != __pe; ++__ps) 3480 if (!traits_type::eq(*__ps, __c)) 3481 return static_cast<size_type>(__ps - __p); 3482 } 3483 return npos; 3484 } 3485 3486 // find_last_not_of 3487 3488 template<class _CharT, class _Traits, class _Allocator> 3489 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3490 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s, 3491 size_type __pos, 3492 size_type __n) const _NOEXCEPT 3493 { 3494 #ifdef _LIBCPP_DEBUG 3495 assert(__s != 0); 3496 #endif 3497 size_type __sz = size(); 3498 if (__pos < __sz) 3499 ++__pos; 3500 else 3501 __pos = __sz; 3502 const value_type* __p = data(); 3503 for (const value_type* __ps = __p + __pos; __ps != __p;) 3504 if (traits_type::find(__s, __n, *--__ps) == 0) 3505 return static_cast<size_type>(__ps - __p); 3506 return npos; 3507 } 3508 3509 template<class _CharT, class _Traits, class _Allocator> 3510 _LIBCPP_INLINE_VISIBILITY inline 3511 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3512 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str, 3513 size_type __pos) const _NOEXCEPT 3514 { 3515 return find_last_not_of(__str.data(), __pos, __str.size()); 3516 } 3517 3518 template<class _CharT, class _Traits, class _Allocator> 3519 _LIBCPP_INLINE_VISIBILITY inline 3520 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3521 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s, 3522 size_type __pos) const _NOEXCEPT 3523 { 3524 #ifdef _LIBCPP_DEBUG 3525 assert(__s != 0); 3526 #endif 3527 return find_last_not_of(__s, __pos, traits_type::length(__s)); 3528 } 3529 3530 template<class _CharT, class _Traits, class _Allocator> 3531 _LIBCPP_INLINE_VISIBILITY inline 3532 typename basic_string<_CharT, _Traits, _Allocator>::size_type 3533 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c, 3534 size_type __pos) const _NOEXCEPT 3535 { 3536 size_type __sz = size(); 3537 if (__pos < __sz) 3538 ++__pos; 3539 else 3540 __pos = __sz; 3541 const value_type* __p = data(); 3542 for (const value_type* __ps = __p + __pos; __ps != __p;) 3543 if (!traits_type::eq(*--__ps, __c)) 3544 return static_cast<size_type>(__ps - __p); 3545 return npos; 3546 } 3547 3548 // compare 3549 3550 template <class _CharT, class _Traits, class _Allocator> 3551 _LIBCPP_INLINE_VISIBILITY inline 3552 int 3553 basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT 3554 { 3555 size_t __lhs_sz = size(); 3556 size_t __rhs_sz = __str.size(); 3557 int __result = traits_type::compare(data(), __str.data(), 3558 _VSTD::min(__lhs_sz, __rhs_sz)); 3559 if (__result != 0) 3560 return __result; 3561 if (__lhs_sz < __rhs_sz) 3562 return -1; 3563 if (__lhs_sz > __rhs_sz) 3564 return 1; 3565 return 0; 3566 } 3567 3568 template <class _CharT, class _Traits, class _Allocator> 3569 _LIBCPP_INLINE_VISIBILITY inline 3570 int 3571 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 3572 size_type __n1, 3573 const basic_string& __str) const 3574 { 3575 return compare(__pos1, __n1, __str.data(), __str.size()); 3576 } 3577 3578 template <class _CharT, class _Traits, class _Allocator> 3579 int 3580 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 3581 size_type __n1, 3582 const basic_string& __str, 3583 size_type __pos2, 3584 size_type __n2) const 3585 { 3586 size_type __sz = __str.size(); 3587 if (__pos2 > __sz) 3588 this->__throw_out_of_range(); 3589 return compare(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, 3590 __sz - __pos2)); 3591 } 3592 3593 template <class _CharT, class _Traits, class _Allocator> 3594 int 3595 basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT 3596 { 3597 #ifdef _LIBCPP_DEBUG 3598 assert(__s != 0); 3599 #endif 3600 return compare(0, npos, __s, traits_type::length(__s)); 3601 } 3602 3603 template <class _CharT, class _Traits, class _Allocator> 3604 int 3605 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 3606 size_type __n1, 3607 const value_type* __s) const 3608 { 3609 #ifdef _LIBCPP_DEBUG 3610 assert(__s != 0); 3611 #endif 3612 return compare(__pos1, __n1, __s, traits_type::length(__s)); 3613 } 3614 3615 template <class _CharT, class _Traits, class _Allocator> 3616 int 3617 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 3618 size_type __n1, 3619 const value_type* __s, 3620 size_type __n2) const 3621 { 3622 #ifdef _LIBCPP_DEBUG 3623 assert(__s != 0); 3624 #endif 3625 size_type __sz = size(); 3626 if (__pos1 > __sz || __n2 == npos) 3627 this->__throw_out_of_range(); 3628 size_type __rlen = _VSTD::min(__n1, __sz - __pos1); 3629 int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2)); 3630 if (__r == 0) 3631 { 3632 if (__rlen < __n2) 3633 __r = -1; 3634 else if (__rlen > __n2) 3635 __r = 1; 3636 } 3637 return __r; 3638 } 3639 3640 // __invariants 3641 3642 template<class _CharT, class _Traits, class _Allocator> 3643 _LIBCPP_INLINE_VISIBILITY inline 3644 bool 3645 basic_string<_CharT, _Traits, _Allocator>::__invariants() const 3646 { 3647 if (size() > capacity()) 3648 return false; 3649 if (capacity() < __min_cap - 1) 3650 return false; 3651 if (data() == 0) 3652 return false; 3653 if (data()[size()] != value_type(0)) 3654 return false; 3655 return true; 3656 } 3657 3658 // operator== 3659 3660 template<class _CharT, class _Traits, class _Allocator> 3661 _LIBCPP_INLINE_VISIBILITY inline 3662 bool 3663 operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3664 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3665 { 3666 size_t __lhs_sz = __lhs.size(); 3667 return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(), 3668 __rhs.data(), 3669 __lhs_sz) == 0; 3670 } 3671 3672 template<class _Allocator> 3673 _LIBCPP_INLINE_VISIBILITY inline 3674 bool 3675 operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs, 3676 const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT 3677 { 3678 size_t __lhs_sz = __lhs.size(); 3679 if (__lhs_sz != __rhs.size()) 3680 return false; 3681 const char* __lp = __lhs.data(); 3682 const char* __rp = __rhs.data(); 3683 if (__lhs.__is_long()) 3684 return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0; 3685 for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp) 3686 if (*__lp != *__rp) 3687 return false; 3688 return true; 3689 } 3690 3691 template<class _CharT, class _Traits, class _Allocator> 3692 _LIBCPP_INLINE_VISIBILITY inline 3693 bool 3694 operator==(const _CharT* __lhs, 3695 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3696 { 3697 return __rhs.compare(__lhs) == 0; 3698 } 3699 3700 template<class _CharT, class _Traits, class _Allocator> 3701 _LIBCPP_INLINE_VISIBILITY inline 3702 bool 3703 operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 3704 const _CharT* __rhs) _NOEXCEPT 3705 { 3706 return __lhs.compare(__rhs) == 0; 3707 } 3708 3709 // operator!= 3710 3711 template<class _CharT, class _Traits, class _Allocator> 3712 _LIBCPP_INLINE_VISIBILITY inline 3713 bool 3714 operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 3715 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3716 { 3717 return !(__lhs == __rhs); 3718 } 3719 3720 template<class _CharT, class _Traits, class _Allocator> 3721 _LIBCPP_INLINE_VISIBILITY inline 3722 bool 3723 operator!=(const _CharT* __lhs, 3724 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3725 { 3726 return !(__lhs == __rhs); 3727 } 3728 3729 template<class _CharT, class _Traits, class _Allocator> 3730 _LIBCPP_INLINE_VISIBILITY inline 3731 bool 3732 operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3733 const _CharT* __rhs) _NOEXCEPT 3734 { 3735 return !(__lhs == __rhs); 3736 } 3737 3738 // operator< 3739 3740 template<class _CharT, class _Traits, class _Allocator> 3741 _LIBCPP_INLINE_VISIBILITY inline 3742 bool 3743 operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3744 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3745 { 3746 return __lhs.compare(__rhs) < 0; 3747 } 3748 3749 template<class _CharT, class _Traits, class _Allocator> 3750 _LIBCPP_INLINE_VISIBILITY inline 3751 bool 3752 operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3753 const _CharT* __rhs) _NOEXCEPT 3754 { 3755 return __lhs.compare(__rhs) < 0; 3756 } 3757 3758 template<class _CharT, class _Traits, class _Allocator> 3759 _LIBCPP_INLINE_VISIBILITY inline 3760 bool 3761 operator< (const _CharT* __lhs, 3762 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3763 { 3764 return __rhs.compare(__lhs) > 0; 3765 } 3766 3767 // operator> 3768 3769 template<class _CharT, class _Traits, class _Allocator> 3770 _LIBCPP_INLINE_VISIBILITY inline 3771 bool 3772 operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3773 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3774 { 3775 return __rhs < __lhs; 3776 } 3777 3778 template<class _CharT, class _Traits, class _Allocator> 3779 _LIBCPP_INLINE_VISIBILITY inline 3780 bool 3781 operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3782 const _CharT* __rhs) _NOEXCEPT 3783 { 3784 return __rhs < __lhs; 3785 } 3786 3787 template<class _CharT, class _Traits, class _Allocator> 3788 _LIBCPP_INLINE_VISIBILITY inline 3789 bool 3790 operator> (const _CharT* __lhs, 3791 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3792 { 3793 return __rhs < __lhs; 3794 } 3795 3796 // operator<= 3797 3798 template<class _CharT, class _Traits, class _Allocator> 3799 _LIBCPP_INLINE_VISIBILITY inline 3800 bool 3801 operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3802 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3803 { 3804 return !(__rhs < __lhs); 3805 } 3806 3807 template<class _CharT, class _Traits, class _Allocator> 3808 _LIBCPP_INLINE_VISIBILITY inline 3809 bool 3810 operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3811 const _CharT* __rhs) _NOEXCEPT 3812 { 3813 return !(__rhs < __lhs); 3814 } 3815 3816 template<class _CharT, class _Traits, class _Allocator> 3817 _LIBCPP_INLINE_VISIBILITY inline 3818 bool 3819 operator<=(const _CharT* __lhs, 3820 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3821 { 3822 return !(__rhs < __lhs); 3823 } 3824 3825 // operator>= 3826 3827 template<class _CharT, class _Traits, class _Allocator> 3828 _LIBCPP_INLINE_VISIBILITY inline 3829 bool 3830 operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3831 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3832 { 3833 return !(__lhs < __rhs); 3834 } 3835 3836 template<class _CharT, class _Traits, class _Allocator> 3837 _LIBCPP_INLINE_VISIBILITY inline 3838 bool 3839 operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3840 const _CharT* __rhs) _NOEXCEPT 3841 { 3842 return !(__lhs < __rhs); 3843 } 3844 3845 template<class _CharT, class _Traits, class _Allocator> 3846 _LIBCPP_INLINE_VISIBILITY inline 3847 bool 3848 operator>=(const _CharT* __lhs, 3849 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 3850 { 3851 return !(__lhs < __rhs); 3852 } 3853 3854 // operator + 3855 3856 template<class _CharT, class _Traits, class _Allocator> 3857 basic_string<_CharT, _Traits, _Allocator> 3858 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 3859 const basic_string<_CharT, _Traits, _Allocator>& __rhs) 3860 { 3861 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator()); 3862 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size(); 3863 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size(); 3864 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz); 3865 __r.append(__rhs.data(), __rhs_sz); 3866 return __r; 3867 } 3868 3869 template<class _CharT, class _Traits, class _Allocator> 3870 basic_string<_CharT, _Traits, _Allocator> 3871 operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs) 3872 { 3873 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator()); 3874 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs); 3875 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size(); 3876 __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz); 3877 __r.append(__rhs.data(), __rhs_sz); 3878 return __r; 3879 } 3880 3881 template<class _CharT, class _Traits, class _Allocator> 3882 basic_string<_CharT, _Traits, _Allocator> 3883 operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs) 3884 { 3885 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator()); 3886 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size(); 3887 __r.__init(&__lhs, 1, 1 + __rhs_sz); 3888 __r.append(__rhs.data(), __rhs_sz); 3889 return __r; 3890 } 3891 3892 template<class _CharT, class _Traits, class _Allocator> 3893 basic_string<_CharT, _Traits, _Allocator> 3894 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs) 3895 { 3896 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator()); 3897 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size(); 3898 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs); 3899 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz); 3900 __r.append(__rhs, __rhs_sz); 3901 return __r; 3902 } 3903 3904 template<class _CharT, class _Traits, class _Allocator> 3905 basic_string<_CharT, _Traits, _Allocator> 3906 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs) 3907 { 3908 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator()); 3909 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size(); 3910 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1); 3911 __r.push_back(__rhs); 3912 return __r; 3913 } 3914 3915 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3916 3917 template<class _CharT, class _Traits, class _Allocator> 3918 _LIBCPP_INLINE_VISIBILITY inline 3919 basic_string<_CharT, _Traits, _Allocator> 3920 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs) 3921 { 3922 return _VSTD::move(__lhs.append(__rhs)); 3923 } 3924 3925 template<class _CharT, class _Traits, class _Allocator> 3926 _LIBCPP_INLINE_VISIBILITY inline 3927 basic_string<_CharT, _Traits, _Allocator> 3928 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs) 3929 { 3930 return _VSTD::move(__rhs.insert(0, __lhs)); 3931 } 3932 3933 template<class _CharT, class _Traits, class _Allocator> 3934 _LIBCPP_INLINE_VISIBILITY inline 3935 basic_string<_CharT, _Traits, _Allocator> 3936 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs) 3937 { 3938 return _VSTD::move(__lhs.append(__rhs)); 3939 } 3940 3941 template<class _CharT, class _Traits, class _Allocator> 3942 _LIBCPP_INLINE_VISIBILITY inline 3943 basic_string<_CharT, _Traits, _Allocator> 3944 operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs) 3945 { 3946 return _VSTD::move(__rhs.insert(0, __lhs)); 3947 } 3948 3949 template<class _CharT, class _Traits, class _Allocator> 3950 _LIBCPP_INLINE_VISIBILITY inline 3951 basic_string<_CharT, _Traits, _Allocator> 3952 operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs) 3953 { 3954 __rhs.insert(__rhs.begin(), __lhs); 3955 return _VSTD::move(__rhs); 3956 } 3957 3958 template<class _CharT, class _Traits, class _Allocator> 3959 _LIBCPP_INLINE_VISIBILITY inline 3960 basic_string<_CharT, _Traits, _Allocator> 3961 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs) 3962 { 3963 return _VSTD::move(__lhs.append(__rhs)); 3964 } 3965 3966 template<class _CharT, class _Traits, class _Allocator> 3967 _LIBCPP_INLINE_VISIBILITY inline 3968 basic_string<_CharT, _Traits, _Allocator> 3969 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs) 3970 { 3971 __lhs.push_back(__rhs); 3972 return _VSTD::move(__lhs); 3973 } 3974 3975 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3976 3977 // swap 3978 3979 template<class _CharT, class _Traits, class _Allocator> 3980 _LIBCPP_INLINE_VISIBILITY inline 3981 void 3982 swap(basic_string<_CharT, _Traits, _Allocator>& __lhs, 3983 basic_string<_CharT, _Traits, _Allocator>& __rhs) 3984 _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs))) 3985 { 3986 __lhs.swap(__rhs); 3987 } 3988 3989 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 3990 3991 typedef basic_string<char16_t> u16string; 3992 typedef basic_string<char32_t> u32string; 3993 3994 #endif // _LIBCPP_HAS_NO_UNICODE_CHARS 3995 3996 int stoi (const string& __str, size_t* __idx = 0, int __base = 10); 3997 long stol (const string& __str, size_t* __idx = 0, int __base = 10); 3998 unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10); 3999 long long stoll (const string& __str, size_t* __idx = 0, int __base = 10); 4000 unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10); 4001 4002 float stof (const string& __str, size_t* __idx = 0); 4003 double stod (const string& __str, size_t* __idx = 0); 4004 long double stold(const string& __str, size_t* __idx = 0); 4005 4006 string to_string(int __val); 4007 string to_string(unsigned __val); 4008 string to_string(long __val); 4009 string to_string(unsigned long __val); 4010 string to_string(long long __val); 4011 string to_string(unsigned long long __val); 4012 string to_string(float __val); 4013 string to_string(double __val); 4014 string to_string(long double __val); 4015 4016 int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10); 4017 long stol (const wstring& __str, size_t* __idx = 0, int __base = 10); 4018 unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10); 4019 long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10); 4020 unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10); 4021 4022 float stof (const wstring& __str, size_t* __idx = 0); 4023 double stod (const wstring& __str, size_t* __idx = 0); 4024 long double stold(const wstring& __str, size_t* __idx = 0); 4025 4026 wstring to_wstring(int __val); 4027 wstring to_wstring(unsigned __val); 4028 wstring to_wstring(long __val); 4029 wstring to_wstring(unsigned long __val); 4030 wstring to_wstring(long long __val); 4031 wstring to_wstring(unsigned long long __val); 4032 wstring to_wstring(float __val); 4033 wstring to_wstring(double __val); 4034 wstring to_wstring(long double __val); 4035 4036 template<class _CharT, class _Traits, class _Allocator> 4037 const typename basic_string<_CharT, _Traits, _Allocator>::size_type 4038 basic_string<_CharT, _Traits, _Allocator>::npos; 4039 4040 template<class _Ptr> 4041 size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e) 4042 { 4043 typedef typename iterator_traits<_Ptr>::value_type value_type; 4044 return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type)); 4045 } 4046 4047 template<class _CharT, class _Traits, class _Allocator> 4048 struct _LIBCPP_TYPE_VIS hash<basic_string<_CharT, _Traits, _Allocator> > 4049 : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t> 4050 { 4051 size_t 4052 operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT; 4053 }; 4054 4055 template<class _CharT, class _Traits, class _Allocator> 4056 size_t 4057 hash<basic_string<_CharT, _Traits, _Allocator> >::operator()( 4058 const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT 4059 { 4060 return __do_string_hash(__val.data(), __val.data() + __val.size()); 4061 } 4062 4063 template<class _CharT, class _Traits, class _Allocator> 4064 basic_ostream<_CharT, _Traits>& 4065 operator<<(basic_ostream<_CharT, _Traits>& __os, 4066 const basic_string<_CharT, _Traits, _Allocator>& __str); 4067 4068 template<class _CharT, class _Traits, class _Allocator> 4069 basic_istream<_CharT, _Traits>& 4070 operator>>(basic_istream<_CharT, _Traits>& __is, 4071 basic_string<_CharT, _Traits, _Allocator>& __str); 4072 4073 template<class _CharT, class _Traits, class _Allocator> 4074 basic_istream<_CharT, _Traits>& 4075 getline(basic_istream<_CharT, _Traits>& __is, 4076 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm); 4077 4078 template<class _CharT, class _Traits, class _Allocator> 4079 inline _LIBCPP_INLINE_VISIBILITY 4080 basic_istream<_CharT, _Traits>& 4081 getline(basic_istream<_CharT, _Traits>& __is, 4082 basic_string<_CharT, _Traits, _Allocator>& __str); 4083 4084 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4085 4086 template<class _CharT, class _Traits, class _Allocator> 4087 inline _LIBCPP_INLINE_VISIBILITY 4088 basic_istream<_CharT, _Traits>& 4089 getline(basic_istream<_CharT, _Traits>&& __is, 4090 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm); 4091 4092 template<class _CharT, class _Traits, class _Allocator> 4093 inline _LIBCPP_INLINE_VISIBILITY 4094 basic_istream<_CharT, _Traits>& 4095 getline(basic_istream<_CharT, _Traits>&& __is, 4096 basic_string<_CharT, _Traits, _Allocator>& __str); 4097 4098 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 4099 4100 _LIBCPP_EXTERN_TEMPLATE(class basic_string<char>) 4101 _LIBCPP_EXTERN_TEMPLATE(class basic_string<wchar_t>) 4102 4103 extern template 4104 string 4105 operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); 4106 4107 _LIBCPP_END_NAMESPACE_STD 4108 4109 #endif // _LIBCPP_STRING 4110