Home | History | Annotate | Download | only in include
      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_pointer s, const allocator_type& a = allocator_type());
    104     basic_string(const_pointer s, size_type n, const allocator_type& a = allocator_type());
    105     basic_string(size_type n, value_type c, const allocator_type& a = allocator_type());
    106     template<class InputIterator>
    107         basic_string(InputIterator begin, InputIterator end,
    108                      const allocator_type& a = allocator_type());
    109     basic_string(initializer_list<value_type>, const Allocator& = Allocator());
    110     basic_string(const basic_string&, const Allocator&);
    111     basic_string(basic_string&&, const Allocator&);
    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_pointer 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_pointer 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_pointer s, size_type n);
    166     basic_string& append(const_pointer s);
    167     basic_string& append(size_type n, value_type c);
    168     template<class InputIterator>
    169         basic_string& append(InputIterator first, InputIterator last);
    170     basic_string& append(initializer_list<value_type>);
    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_pointer s, size_type n);
    183     basic_string& assign(const_pointer s);
    184     basic_string& assign(size_type n, value_type c);
    185     template<class InputIterator>
    186         basic_string& assign(InputIterator first, InputIterator last);
    187     basic_string& assign(initializer_list<value_type>);
    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_pointer s, size_type n);
    193     basic_string& insert(size_type pos, const_pointer s);
    194     basic_string& insert(size_type pos, size_type n, value_type c);
    195     iterator      insert(const_iterator p, value_type c);
    196     iterator      insert(const_iterator p, size_type n, value_type c);
    197     template<class InputIterator>
    198         iterator insert(const_iterator p, InputIterator first, InputIterator last);
    199     iterator      insert(const_iterator p, initializer_list<value_type>);
    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_pointer s, size_type n2);
    209     basic_string& replace(size_type pos, size_type n1, const_pointer s);
    210     basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c);
    211     basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str);
    212     basic_string& replace(const_iterator i1, const_iterator i2, const_pointer s, size_type n);
    213     basic_string& replace(const_iterator i1, const_iterator i2, const_pointer s);
    214     basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c);
    215     template<class InputIterator>
    216         basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
    217     basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>);
    218 
    219     size_type copy(pointer s, size_type n, size_type pos = 0) const;
    220     basic_string substr(size_type pos = 0, size_type n = npos) const;
    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_pointer c_str() const noexcept;
    227     const_pointer 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_pointer s, size_type pos, size_type n) const noexcept;
    233     size_type find(const_pointer s, size_type pos = 0) const noexcept;
    234     size_type find(value_type c, size_type pos = 0) const noexcept;
    235 
    236     size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
    237     size_type rfind(const_pointer s, size_type pos, size_type n) const noexcept;
    238     size_type rfind(const_pointer s, size_type pos = npos) const noexcept;
    239     size_type rfind(value_type c, size_type pos = npos) const noexcept;
    240 
    241     size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
    242     size_type find_first_of(const_pointer s, size_type pos, size_type n) const noexcept;
    243     size_type find_first_of(const_pointer s, size_type pos = 0) const noexcept;
    244     size_type find_first_of(value_type c, size_type pos = 0) const noexcept;
    245 
    246     size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept;
    247     size_type find_last_of(const_pointer s, size_type pos, size_type n) const noexcept;
    248     size_type find_last_of(const_pointer s, size_type pos = npos) const noexcept;
    249     size_type find_last_of(value_type c, size_type pos = npos) const noexcept;
    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_pointer s, size_type pos, size_type n) const noexcept;
    253     size_type find_first_not_of(const_pointer s, size_type pos = 0) const noexcept;
    254     size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept;
    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_pointer s, size_type pos, size_type n) const noexcept;
    258     size_type find_last_not_of(const_pointer s, size_type pos = npos) const noexcept;
    259     size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept;
    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_pointer s) const noexcept;
    266     int compare(size_type pos1, size_type n1, const_pointer s) const;
    267     int compare(size_type pos1, size_type n1, const_pointer s, size_type n2) const;
    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_VISIBLE 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_VISIBLE 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_VISIBLE 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_VISIBLE 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_VISIBLE 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_VISIBLE 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 template<class _CharT, class _Traits, class _Allocator>
   1040 class _LIBCPP_VISIBLE basic_string
   1041     : private __basic_string_common<true>
   1042 {
   1043 public:
   1044     typedef basic_string                                 __self;
   1045     typedef _Traits                                      traits_type;
   1046     typedef typename traits_type::char_type              value_type;
   1047     typedef _Allocator                                   allocator_type;
   1048     typedef allocator_traits<allocator_type>             __alloc_traits;
   1049     typedef typename __alloc_traits::size_type           size_type;
   1050     typedef typename __alloc_traits::difference_type     difference_type;
   1051     typedef value_type&                                  reference;
   1052     typedef const value_type&                            const_reference;
   1053     typedef typename __alloc_traits::pointer             pointer;
   1054     typedef typename __alloc_traits::const_pointer       const_pointer;
   1055 #ifdef _LIBCPP_DEBUG
   1056     typedef __debug_iter<basic_string, pointer>          iterator;
   1057     typedef __debug_iter<basic_string, const_pointer>    const_iterator;
   1058 
   1059     friend class __debug_iter<basic_string, pointer>;
   1060     friend class __debug_iter<basic_string, const_pointer>;
   1061 #elif defined(_LIBCPP_RAW_ITERATORS)
   1062     typedef pointer                                      iterator;
   1063     typedef const_pointer                                const_iterator;
   1064 #else  // defined(_LIBCPP_RAW_ITERATORS)
   1065     typedef __wrap_iter<pointer>                         iterator;
   1066     typedef __wrap_iter<const_pointer>                   const_iterator;
   1067 #endif  // defined(_LIBCPP_RAW_ITERATORS)
   1068     typedef _VSTD::reverse_iterator<iterator>             reverse_iterator;
   1069     typedef _VSTD::reverse_iterator<const_iterator>       const_reverse_iterator;
   1070 
   1071 private:
   1072     struct __long
   1073     {
   1074         size_type __cap_;
   1075         size_type __size_;
   1076         pointer   __data_;
   1077     };
   1078 
   1079 #if _LIBCPP_BIG_ENDIAN
   1080     enum {__short_mask = 0x80};
   1081     enum {__long_mask  = ~(size_type(~0) >> 1)};
   1082 #else  // _LIBCPP_BIG_ENDIAN
   1083     enum {__short_mask = 0x01};
   1084     enum {__long_mask  = 0x1ul};
   1085 #endif  // _LIBCPP_BIG_ENDIAN
   1086 
   1087     enum {__mask = size_type(~0) >> 1};
   1088 
   1089     enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
   1090                       (sizeof(__long) - 1)/sizeof(value_type) : 2};
   1091 
   1092     struct __short
   1093     {
   1094         union
   1095         {
   1096             unsigned char __size_;
   1097             value_type __lx;
   1098         };
   1099         value_type __data_[__min_cap];
   1100     };
   1101 
   1102     union __lx{__long __lx; __short __lxx;};
   1103 
   1104     enum {__n_words = sizeof(__lx) / sizeof(size_type)};
   1105 
   1106     struct __raw
   1107     {
   1108         size_type __words[__n_words];
   1109     };
   1110 
   1111     struct __rep
   1112     {
   1113         union
   1114         {
   1115             __long  __l;
   1116             __short __s;
   1117             __raw   __r;
   1118         };
   1119     };
   1120 
   1121     __compressed_pair<__rep, allocator_type> __r_;
   1122 
   1123 #ifdef _LIBCPP_DEBUG
   1124 
   1125     pair<iterator*, const_iterator*> __iterator_list_;
   1126 
   1127     _LIBCPP_INLINE_VISIBILITY iterator*&       __get_iterator_list(iterator*)       {return __iterator_list_.first;}
   1128     _LIBCPP_INLINE_VISIBILITY const_iterator*& __get_iterator_list(const_iterator*) {return __iterator_list_.second;}
   1129 
   1130 #endif  // _LIBCPP_DEBUG
   1131 
   1132 public:
   1133     static const size_type npos = -1;
   1134 
   1135     _LIBCPP_INLINE_VISIBILITY basic_string()
   1136         _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
   1137     _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a);
   1138     basic_string(const basic_string& __str);
   1139     basic_string(const basic_string& __str, const allocator_type& __a);
   1140 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1141     _LIBCPP_INLINE_VISIBILITY
   1142     basic_string(basic_string&& __str)
   1143         _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
   1144     _LIBCPP_INLINE_VISIBILITY
   1145     basic_string(basic_string&& __str, const allocator_type& __a);
   1146 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1147     _LIBCPP_INLINE_VISIBILITY basic_string(const_pointer __s);
   1148     _LIBCPP_INLINE_VISIBILITY
   1149     basic_string(const_pointer __s, const allocator_type& __a);
   1150     _LIBCPP_INLINE_VISIBILITY
   1151     basic_string(const_pointer __s, size_type __n);
   1152     _LIBCPP_INLINE_VISIBILITY
   1153     basic_string(const_pointer __s, size_type __n, const allocator_type& __a);
   1154     _LIBCPP_INLINE_VISIBILITY
   1155     basic_string(size_type __n, value_type __c);
   1156     _LIBCPP_INLINE_VISIBILITY
   1157     basic_string(size_type __n, value_type __c, const allocator_type& __a);
   1158     basic_string(const basic_string& __str, size_type __pos, size_type __n = npos,
   1159                  const allocator_type& __a = allocator_type());
   1160     template<class _InputIterator>
   1161         _LIBCPP_INLINE_VISIBILITY
   1162         basic_string(_InputIterator __first, _InputIterator __last);
   1163     template<class _InputIterator>
   1164         _LIBCPP_INLINE_VISIBILITY
   1165         basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);
   1166 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1167     _LIBCPP_INLINE_VISIBILITY
   1168     basic_string(initializer_list<value_type> __il);
   1169     _LIBCPP_INLINE_VISIBILITY
   1170     basic_string(initializer_list<value_type> __il, const allocator_type& __a);
   1171 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1172 
   1173     ~basic_string();
   1174 
   1175     basic_string& operator=(const basic_string& __str);
   1176 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1177     _LIBCPP_INLINE_VISIBILITY
   1178     basic_string& operator=(basic_string&& __str)
   1179         _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
   1180                    is_nothrow_move_assignable<allocator_type>::value);
   1181 #endif
   1182     _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const_pointer __s) {return assign(__s);}
   1183     basic_string& operator=(value_type __c);
   1184 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1185     _LIBCPP_INLINE_VISIBILITY
   1186     basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
   1187 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1188 
   1189 #ifndef _LIBCPP_DEBUG
   1190     _LIBCPP_INLINE_VISIBILITY
   1191     iterator begin() _NOEXCEPT
   1192         {return iterator(__get_pointer());}
   1193     _LIBCPP_INLINE_VISIBILITY
   1194     const_iterator begin() const _NOEXCEPT
   1195         {return const_iterator(data());}
   1196     _LIBCPP_INLINE_VISIBILITY
   1197     iterator end() _NOEXCEPT
   1198         {return iterator(__get_pointer() + size());}
   1199     _LIBCPP_INLINE_VISIBILITY
   1200     const_iterator end() const _NOEXCEPT
   1201         {return const_iterator(data() + size());}
   1202 #else  // _LIBCPP_DEBUG
   1203     _LIBCPP_INLINE_VISIBILITY iterator       begin()       {return iterator(this, __get_pointer());}
   1204     _LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return const_iterator(this, data());}
   1205     _LIBCPP_INLINE_VISIBILITY iterator       end()         {return iterator(this, __get_pointer() + size());}
   1206     _LIBCPP_INLINE_VISIBILITY const_iterator end() const   {return const_iterator(this, data() + size());}
   1207 #endif  // _LIBCPP_DEBUG
   1208     _LIBCPP_INLINE_VISIBILITY
   1209     reverse_iterator rbegin() _NOEXCEPT
   1210         {return reverse_iterator(end());}
   1211     _LIBCPP_INLINE_VISIBILITY
   1212     const_reverse_iterator rbegin() const _NOEXCEPT
   1213         {return const_reverse_iterator(end());}
   1214     _LIBCPP_INLINE_VISIBILITY
   1215     reverse_iterator rend() _NOEXCEPT
   1216         {return reverse_iterator(begin());}
   1217     _LIBCPP_INLINE_VISIBILITY
   1218     const_reverse_iterator rend() const _NOEXCEPT
   1219         {return const_reverse_iterator(begin());}
   1220 
   1221     _LIBCPP_INLINE_VISIBILITY
   1222     const_iterator cbegin() const _NOEXCEPT
   1223         {return begin();}
   1224     _LIBCPP_INLINE_VISIBILITY
   1225     const_iterator cend() const _NOEXCEPT
   1226         {return end();}
   1227     _LIBCPP_INLINE_VISIBILITY
   1228     const_reverse_iterator crbegin() const _NOEXCEPT
   1229         {return rbegin();}
   1230     _LIBCPP_INLINE_VISIBILITY
   1231     const_reverse_iterator crend() const _NOEXCEPT
   1232         {return rend();}
   1233 
   1234     _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
   1235         {return __is_long() ? __get_long_size() : __get_short_size();}
   1236     _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
   1237     _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
   1238     _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
   1239         {return (__is_long() ? __get_long_cap() : __min_cap) - 1;}
   1240 
   1241     void resize(size_type __n, value_type __c);
   1242     _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
   1243 
   1244     void reserve(size_type res_arg = 0);
   1245     _LIBCPP_INLINE_VISIBILITY
   1246     void shrink_to_fit() _NOEXCEPT {reserve();}
   1247     _LIBCPP_INLINE_VISIBILITY
   1248     void clear() _NOEXCEPT;
   1249     _LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;}
   1250 
   1251     _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const;
   1252     _LIBCPP_INLINE_VISIBILITY reference       operator[](size_type __pos);
   1253 
   1254     const_reference at(size_type __n) const;
   1255     reference       at(size_type __n);
   1256 
   1257     _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
   1258     _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const_pointer __s)         {return append(__s);}
   1259     _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c)            {push_back(__c); return *this;}
   1260 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1261     _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
   1262 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1263 
   1264     _LIBCPP_INLINE_VISIBILITY
   1265     basic_string& append(const basic_string& __str);
   1266     basic_string& append(const basic_string& __str, size_type __pos, size_type __n);
   1267     basic_string& append(const_pointer __s, size_type __n);
   1268     basic_string& append(const_pointer __s);
   1269     basic_string& append(size_type __n, value_type __c);
   1270     template<class _InputIterator>
   1271         typename enable_if
   1272         <
   1273              __is_input_iterator  <_InputIterator>::value &&
   1274             !__is_forward_iterator<_InputIterator>::value,
   1275             basic_string&
   1276         >::type
   1277         append(_InputIterator __first, _InputIterator __last);
   1278     template<class _ForwardIterator>
   1279         typename enable_if
   1280         <
   1281             __is_forward_iterator<_ForwardIterator>::value,
   1282             basic_string&
   1283         >::type
   1284         append(_ForwardIterator __first, _ForwardIterator __last);
   1285 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1286     _LIBCPP_INLINE_VISIBILITY
   1287     basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
   1288 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1289 
   1290     void push_back(value_type __c);
   1291     _LIBCPP_INLINE_VISIBILITY
   1292     void pop_back();
   1293     _LIBCPP_INLINE_VISIBILITY reference       front();
   1294     _LIBCPP_INLINE_VISIBILITY const_reference front() const;
   1295     _LIBCPP_INLINE_VISIBILITY reference       back();
   1296     _LIBCPP_INLINE_VISIBILITY const_reference back() const;
   1297 
   1298     _LIBCPP_INLINE_VISIBILITY
   1299     basic_string& assign(const basic_string& __str);
   1300 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1301     _LIBCPP_INLINE_VISIBILITY
   1302     basic_string& assign(basic_string&& str)
   1303         {*this = _VSTD::move(str); return *this;}
   1304 #endif
   1305     basic_string& assign(const basic_string& __str, size_type __pos, size_type __n);
   1306     basic_string& assign(const_pointer __s, size_type __n);
   1307     basic_string& assign(const_pointer __s);
   1308     basic_string& assign(size_type __n, value_type __c);
   1309     template<class _InputIterator>
   1310         typename enable_if
   1311         <
   1312              __is_input_iterator  <_InputIterator>::value &&
   1313             !__is_forward_iterator<_InputIterator>::value,
   1314             basic_string&
   1315         >::type
   1316         assign(_InputIterator __first, _InputIterator __last);
   1317     template<class _ForwardIterator>
   1318         typename enable_if
   1319         <
   1320             __is_forward_iterator<_ForwardIterator>::value,
   1321             basic_string&
   1322         >::type
   1323         assign(_ForwardIterator __first, _ForwardIterator __last);
   1324 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1325     _LIBCPP_INLINE_VISIBILITY
   1326     basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
   1327 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1328 
   1329     _LIBCPP_INLINE_VISIBILITY
   1330     basic_string& insert(size_type __pos1, const basic_string& __str);
   1331     basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n);
   1332     basic_string& insert(size_type __pos, const_pointer __s, size_type __n);
   1333     basic_string& insert(size_type __pos, const_pointer __s);
   1334     basic_string& insert(size_type __pos, size_type __n, value_type __c);
   1335     iterator      insert(const_iterator __pos, value_type __c);
   1336     _LIBCPP_INLINE_VISIBILITY
   1337     iterator      insert(const_iterator __pos, size_type __n, value_type __c);
   1338     template<class _InputIterator>
   1339         typename enable_if
   1340         <
   1341              __is_input_iterator  <_InputIterator>::value &&
   1342             !__is_forward_iterator<_InputIterator>::value,
   1343             iterator
   1344         >::type
   1345         insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
   1346     template<class _ForwardIterator>
   1347         typename enable_if
   1348         <
   1349             __is_forward_iterator<_ForwardIterator>::value,
   1350             iterator
   1351         >::type
   1352         insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
   1353 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1354     _LIBCPP_INLINE_VISIBILITY
   1355     iterator insert(const_iterator __pos, initializer_list<value_type> __il)
   1356                     {return insert(__pos, __il.begin(), __il.end());}
   1357 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1358 
   1359     basic_string& erase(size_type __pos = 0, size_type __n = npos);
   1360     _LIBCPP_INLINE_VISIBILITY
   1361     iterator      erase(const_iterator __pos);
   1362     _LIBCPP_INLINE_VISIBILITY
   1363     iterator      erase(const_iterator __first, const_iterator __last);
   1364 
   1365     _LIBCPP_INLINE_VISIBILITY
   1366     basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
   1367     basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2);
   1368     basic_string& replace(size_type __pos, size_type __n1, const_pointer __s, size_type __n2);
   1369     basic_string& replace(size_type __pos, size_type __n1, const_pointer __s);
   1370     basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
   1371     _LIBCPP_INLINE_VISIBILITY
   1372     basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
   1373     _LIBCPP_INLINE_VISIBILITY
   1374     basic_string& replace(const_iterator __i1, const_iterator __i2, const_pointer __s, size_type __n);
   1375     _LIBCPP_INLINE_VISIBILITY
   1376     basic_string& replace(const_iterator __i1, const_iterator __i2, const_pointer __s);
   1377     _LIBCPP_INLINE_VISIBILITY
   1378     basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
   1379     template<class _InputIterator>
   1380         typename enable_if
   1381         <
   1382             __is_input_iterator<_InputIterator>::value,
   1383             basic_string&
   1384         >::type
   1385         replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
   1386 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1387     _LIBCPP_INLINE_VISIBILITY
   1388     basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
   1389         {return replace(__i1, __i2, __il.begin(), __il.end());}
   1390 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1391 
   1392     size_type copy(pointer __s, size_type __n, size_type __pos = 0) const;
   1393     _LIBCPP_INLINE_VISIBILITY
   1394     basic_string substr(size_type __pos = 0, size_type __n = npos) const;
   1395 
   1396     _LIBCPP_INLINE_VISIBILITY
   1397     void swap(basic_string& __str)
   1398         _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
   1399                    __is_nothrow_swappable<allocator_type>::value);
   1400 
   1401     _LIBCPP_INLINE_VISIBILITY
   1402     const_pointer c_str() const _NOEXCEPT {return data();}
   1403     _LIBCPP_INLINE_VISIBILITY
   1404     const_pointer data() const _NOEXCEPT  {return __get_pointer();}
   1405 
   1406     _LIBCPP_INLINE_VISIBILITY
   1407     allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
   1408 
   1409     _LIBCPP_INLINE_VISIBILITY
   1410     size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
   1411     size_type find(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
   1412     _LIBCPP_INLINE_VISIBILITY
   1413     size_type find(const_pointer __s, size_type __pos = 0) const _NOEXCEPT;
   1414     size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
   1415 
   1416     _LIBCPP_INLINE_VISIBILITY
   1417     size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
   1418     size_type rfind(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
   1419     _LIBCPP_INLINE_VISIBILITY
   1420     size_type rfind(const_pointer __s, size_type __pos = npos) const _NOEXCEPT;
   1421     size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
   1422 
   1423     _LIBCPP_INLINE_VISIBILITY
   1424     size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
   1425     size_type find_first_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
   1426     _LIBCPP_INLINE_VISIBILITY
   1427     size_type find_first_of(const_pointer __s, size_type __pos = 0) const _NOEXCEPT;
   1428     _LIBCPP_INLINE_VISIBILITY
   1429     size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
   1430 
   1431     _LIBCPP_INLINE_VISIBILITY
   1432     size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
   1433     size_type find_last_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
   1434     _LIBCPP_INLINE_VISIBILITY
   1435     size_type find_last_of(const_pointer __s, size_type __pos = npos) const _NOEXCEPT;
   1436     _LIBCPP_INLINE_VISIBILITY
   1437     size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
   1438 
   1439     _LIBCPP_INLINE_VISIBILITY
   1440     size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
   1441     size_type find_first_not_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
   1442     _LIBCPP_INLINE_VISIBILITY
   1443     size_type find_first_not_of(const_pointer __s, size_type __pos = 0) const _NOEXCEPT;
   1444     _LIBCPP_INLINE_VISIBILITY
   1445     size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
   1446 
   1447     _LIBCPP_INLINE_VISIBILITY
   1448     size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
   1449     size_type find_last_not_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT;
   1450     _LIBCPP_INLINE_VISIBILITY
   1451     size_type find_last_not_of(const_pointer __s, size_type __pos = npos) const _NOEXCEPT;
   1452     _LIBCPP_INLINE_VISIBILITY
   1453     size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
   1454 
   1455     _LIBCPP_INLINE_VISIBILITY
   1456     int compare(const basic_string& __str) const _NOEXCEPT;
   1457     _LIBCPP_INLINE_VISIBILITY
   1458     int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
   1459     int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2) const;
   1460     int compare(const_pointer __s) const _NOEXCEPT;
   1461     int compare(size_type __pos1, size_type __n1, const_pointer __s) const;
   1462     int compare(size_type __pos1, size_type __n1, const_pointer __s, size_type __n2) const;
   1463 
   1464     _LIBCPP_INLINE_VISIBILITY bool __invariants() const;
   1465 private:
   1466     _LIBCPP_INLINE_VISIBILITY
   1467     allocator_type& __alloc() _NOEXCEPT
   1468         {return __r_.second();}
   1469     _LIBCPP_INLINE_VISIBILITY
   1470     const allocator_type& __alloc() const _NOEXCEPT
   1471         {return __r_.second();}
   1472 
   1473     _LIBCPP_INLINE_VISIBILITY
   1474     bool __is_long() const _NOEXCEPT
   1475         {return bool(__r_.first().__s.__size_ & __short_mask);}
   1476 
   1477     _LIBCPP_INLINE_VISIBILITY
   1478     void __set_short_size(size_type __s) _NOEXCEPT
   1479 #if _LIBCPP_BIG_ENDIAN
   1480         {__r_.first().__s.__size_ = (unsigned char)(__s);}
   1481 #else
   1482         {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
   1483 #endif
   1484     _LIBCPP_INLINE_VISIBILITY
   1485     size_type __get_short_size() const _NOEXCEPT
   1486 #if _LIBCPP_BIG_ENDIAN
   1487         {return __r_.first().__s.__size_;}
   1488 #else
   1489         {return __r_.first().__s.__size_ >> 1;}
   1490 #endif
   1491     _LIBCPP_INLINE_VISIBILITY
   1492     void __set_long_size(size_type __s) _NOEXCEPT
   1493         {__r_.first().__l.__size_ = __s;}
   1494     _LIBCPP_INLINE_VISIBILITY
   1495     size_type __get_long_size() const _NOEXCEPT
   1496         {return __r_.first().__l.__size_;}
   1497     _LIBCPP_INLINE_VISIBILITY
   1498     void __set_size(size_type __s) _NOEXCEPT
   1499         {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
   1500 
   1501     _LIBCPP_INLINE_VISIBILITY
   1502     void __set_long_cap(size_type __s) _NOEXCEPT
   1503         {__r_.first().__l.__cap_  = __long_mask | __s;}
   1504     _LIBCPP_INLINE_VISIBILITY
   1505     size_type __get_long_cap() const _NOEXCEPT
   1506         {return __r_.first().__l.__cap_ & size_type(~__long_mask);}
   1507 
   1508     _LIBCPP_INLINE_VISIBILITY
   1509     void __set_long_pointer(pointer __p) _NOEXCEPT
   1510         {__r_.first().__l.__data_ = __p;}
   1511     _LIBCPP_INLINE_VISIBILITY
   1512     pointer __get_long_pointer() _NOEXCEPT
   1513         {return __r_.first().__l.__data_;}
   1514     _LIBCPP_INLINE_VISIBILITY
   1515     const_pointer __get_long_pointer() const _NOEXCEPT
   1516         {return __r_.first().__l.__data_;}
   1517     _LIBCPP_INLINE_VISIBILITY
   1518     pointer __get_short_pointer() _NOEXCEPT
   1519         {return __r_.first().__s.__data_;}
   1520     _LIBCPP_INLINE_VISIBILITY
   1521     const_pointer __get_short_pointer() const _NOEXCEPT
   1522         {return __r_.first().__s.__data_;}
   1523     _LIBCPP_INLINE_VISIBILITY
   1524     pointer __get_pointer() _NOEXCEPT
   1525         {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
   1526     _LIBCPP_INLINE_VISIBILITY
   1527     const_pointer __get_pointer() const _NOEXCEPT
   1528         {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
   1529 
   1530     _LIBCPP_INLINE_VISIBILITY
   1531     void __zero() _NOEXCEPT
   1532         {
   1533             size_type (&__a)[__n_words] = __r_.first().__r.__words;
   1534             for (unsigned __i = 0; __i < __n_words; ++__i)
   1535                 __a[__i] = 0;
   1536         }
   1537 
   1538     template <size_type __a> static
   1539         _LIBCPP_INLINE_VISIBILITY
   1540         size_type __align(size_type __s) _NOEXCEPT
   1541             {return __s + (__a-1) & ~(__a-1);}
   1542     enum {__alignment = 16};
   1543     static _LIBCPP_INLINE_VISIBILITY
   1544     size_type __recommend(size_type __s) _NOEXCEPT
   1545         {return (__s < __min_cap ? __min_cap :
   1546                  __align<sizeof(value_type) < __alignment ?
   1547                             __alignment/sizeof(value_type) : 1 > (__s+1)) - 1;}
   1548 
   1549     void __init(const_pointer __s, size_type __sz, size_type __reserve);
   1550     void __init(const_pointer __s, size_type __sz);
   1551     void __init(size_type __n, value_type __c);
   1552 
   1553     template <class _InputIterator>
   1554     typename enable_if
   1555     <
   1556          __is_input_iterator  <_InputIterator>::value &&
   1557         !__is_forward_iterator<_InputIterator>::value,
   1558         void
   1559     >::type
   1560     __init(_InputIterator __first, _InputIterator __last);
   1561 
   1562     template <class _ForwardIterator>
   1563     typename enable_if
   1564     <
   1565         __is_forward_iterator<_ForwardIterator>::value,
   1566         void
   1567     >::type
   1568     __init(_ForwardIterator __first, _ForwardIterator __last);
   1569 
   1570     void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
   1571                    size_type __n_copy,  size_type __n_del,     size_type __n_add = 0);
   1572     void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
   1573                                size_type __n_copy,  size_type __n_del,
   1574                                size_type __n_add, const_pointer __p_new_stuff);
   1575 
   1576     _LIBCPP_INLINE_VISIBILITY
   1577     void __erase_to_end(size_type __pos);
   1578 
   1579     _LIBCPP_INLINE_VISIBILITY
   1580     void __copy_assign_alloc(const basic_string& __str)
   1581         {__copy_assign_alloc(__str, integral_constant<bool,
   1582                       __alloc_traits::propagate_on_container_copy_assignment::value>());}
   1583 
   1584     _LIBCPP_INLINE_VISIBILITY
   1585     void __copy_assign_alloc(const basic_string& __str, true_type)
   1586         {
   1587             if (__alloc() != __str.__alloc())
   1588             {
   1589                 clear();
   1590                 shrink_to_fit();
   1591             }
   1592             __alloc() = __str.__alloc();
   1593         }
   1594 
   1595     _LIBCPP_INLINE_VISIBILITY
   1596     void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
   1597         {}
   1598 
   1599 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1600     _LIBCPP_INLINE_VISIBILITY
   1601     void __move_assign(basic_string& __str, false_type);
   1602     _LIBCPP_INLINE_VISIBILITY
   1603     void __move_assign(basic_string& __str, true_type)
   1604         _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
   1605 #endif
   1606 
   1607     _LIBCPP_INLINE_VISIBILITY
   1608     void
   1609     __move_assign_alloc(basic_string& __str)
   1610         _NOEXCEPT_(
   1611             !__alloc_traits::propagate_on_container_move_assignment::value ||
   1612             is_nothrow_move_assignable<allocator_type>::value)
   1613     {__move_assign_alloc(__str, integral_constant<bool,
   1614                       __alloc_traits::propagate_on_container_move_assignment::value>());}
   1615 
   1616     _LIBCPP_INLINE_VISIBILITY
   1617     void __move_assign_alloc(basic_string& __c, true_type)
   1618         _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
   1619         {
   1620             __alloc() = _VSTD::move(__c.__alloc());
   1621         }
   1622 
   1623     _LIBCPP_INLINE_VISIBILITY
   1624     void __move_assign_alloc(basic_string&, false_type)
   1625         _NOEXCEPT
   1626         {}
   1627 
   1628     _LIBCPP_INLINE_VISIBILITY
   1629     static void __swap_alloc(allocator_type& __x, allocator_type& __y)
   1630         _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
   1631                    __is_nothrow_swappable<allocator_type>::value)
   1632         {__swap_alloc(__x, __y, integral_constant<bool,
   1633                       __alloc_traits::propagate_on_container_swap::value>());}
   1634 
   1635     _LIBCPP_INLINE_VISIBILITY
   1636     static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type)
   1637         _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value)
   1638         {
   1639             using _VSTD::swap;
   1640             swap(__x, __y);
   1641         }
   1642     _LIBCPP_INLINE_VISIBILITY
   1643     static void __swap_alloc(allocator_type&, allocator_type&, false_type) _NOEXCEPT
   1644         {}
   1645 
   1646     _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
   1647     _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type);
   1648 
   1649     friend basic_string operator+<>(const basic_string&, const basic_string&);
   1650     friend basic_string operator+<>(const value_type*, const basic_string&);
   1651     friend basic_string operator+<>(value_type, const basic_string&);
   1652     friend basic_string operator+<>(const basic_string&, const value_type*);
   1653     friend basic_string operator+<>(const basic_string&, value_type);
   1654 };
   1655 
   1656 template <class _CharT, class _Traits, class _Allocator>
   1657 #ifndef _LIBCPP_DEBUG
   1658 _LIBCPP_INLINE_VISIBILITY inline
   1659 #endif
   1660 void
   1661 basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators()
   1662 {
   1663 #ifdef _LIBCPP_DEBUG
   1664     iterator::__remove_all(this);
   1665     const_iterator::__remove_all(this);
   1666 #endif  // _LIBCPP_DEBUG
   1667 }
   1668 
   1669 template <class _CharT, class _Traits, class _Allocator>
   1670 #ifndef _LIBCPP_DEBUG
   1671 _LIBCPP_INLINE_VISIBILITY inline
   1672 #endif
   1673 void
   1674 basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type
   1675 #ifdef _LIBCPP_DEBUG
   1676                                                                         __pos
   1677 #endif
   1678                                                                       )
   1679 {
   1680 #ifdef _LIBCPP_DEBUG
   1681     const_iterator __beg = begin();
   1682     if (__iterator_list_.first)
   1683     {
   1684         for (iterator* __p = __iterator_list_.first; __p;)
   1685         {
   1686             if (*__p - __beg > static_cast<difference_type>(__pos))
   1687             {
   1688                 iterator* __n = __p;
   1689                 __p = __p->__next;
   1690                 __n->__remove_owner();
   1691             }
   1692             else
   1693                 __p = __p->__next;
   1694         }
   1695     }
   1696     if (__iterator_list_.second)
   1697     {
   1698         for (const_iterator* __p = __iterator_list_.second; __p;)
   1699         {
   1700             if (*__p - __beg > static_cast<difference_type>(__pos))
   1701             {
   1702                 const_iterator* __n = __p;
   1703                 __p = __p->__next;
   1704                 __n->__remove_owner();
   1705             }
   1706             else
   1707                 __p = __p->__next;
   1708         }
   1709     }
   1710 #endif  // _LIBCPP_DEBUG
   1711 }
   1712 
   1713 template <class _CharT, class _Traits, class _Allocator>
   1714 _LIBCPP_INLINE_VISIBILITY inline
   1715 basic_string<_CharT, _Traits, _Allocator>::basic_string()
   1716     _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
   1717 {
   1718     __zero();
   1719 }
   1720 
   1721 template <class _CharT, class _Traits, class _Allocator>
   1722 _LIBCPP_INLINE_VISIBILITY inline
   1723 basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
   1724     : __r_(__a)
   1725 {
   1726     __zero();
   1727 }
   1728 
   1729 template <class _CharT, class _Traits, class _Allocator>
   1730 void
   1731 basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type __sz, size_type __reserve)
   1732 {
   1733     if (__reserve > max_size())
   1734         this->__throw_length_error();
   1735     pointer __p;
   1736     if (__reserve < __min_cap)
   1737     {
   1738         __set_short_size(__sz);
   1739         __p = __get_short_pointer();
   1740     }
   1741     else
   1742     {
   1743         size_type __cap = __recommend(__reserve);
   1744         __p = __alloc_traits::allocate(__alloc(), __cap+1);
   1745         __set_long_pointer(__p);
   1746         __set_long_cap(__cap+1);
   1747         __set_long_size(__sz);
   1748     }
   1749     traits_type::copy(__p, __s, __sz);
   1750     traits_type::assign(__p[__sz], value_type());
   1751 }
   1752 
   1753 template <class _CharT, class _Traits, class _Allocator>
   1754 void
   1755 basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type __sz)
   1756 {
   1757     if (__sz > max_size())
   1758         this->__throw_length_error();
   1759     pointer __p;
   1760     if (__sz < __min_cap)
   1761     {
   1762         __set_short_size(__sz);
   1763         __p = __get_short_pointer();
   1764     }
   1765     else
   1766     {
   1767         size_type __cap = __recommend(__sz);
   1768         __p = __alloc_traits::allocate(__alloc(), __cap+1);
   1769         __set_long_pointer(__p);
   1770         __set_long_cap(__cap+1);
   1771         __set_long_size(__sz);
   1772     }
   1773     traits_type::copy(__p, __s, __sz);
   1774     traits_type::assign(__p[__sz], value_type());
   1775 }
   1776 
   1777 template <class _CharT, class _Traits, class _Allocator>
   1778 _LIBCPP_INLINE_VISIBILITY inline
   1779 basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s)
   1780 {
   1781 #ifdef _LIBCPP_DEBUG
   1782     assert(__s != 0);
   1783 #endif
   1784     __init(__s, traits_type::length(__s));
   1785 }
   1786 
   1787 template <class _CharT, class _Traits, class _Allocator>
   1788 _LIBCPP_INLINE_VISIBILITY inline
   1789 basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, const allocator_type& __a)
   1790     : __r_(__a)
   1791 {
   1792 #ifdef _LIBCPP_DEBUG
   1793     assert(__s != 0);
   1794 #endif
   1795     __init(__s, traits_type::length(__s));
   1796 }
   1797 
   1798 template <class _CharT, class _Traits, class _Allocator>
   1799 _LIBCPP_INLINE_VISIBILITY inline
   1800 basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, size_type __n)
   1801 {
   1802 #ifdef _LIBCPP_DEBUG
   1803     assert(__s != 0);
   1804 #endif
   1805     __init(__s, __n);
   1806 }
   1807 
   1808 template <class _CharT, class _Traits, class _Allocator>
   1809 _LIBCPP_INLINE_VISIBILITY inline
   1810 basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, size_type __n, const allocator_type& __a)
   1811     : __r_(__a)
   1812 {
   1813 #ifdef _LIBCPP_DEBUG
   1814     assert(__s != 0);
   1815 #endif
   1816     __init(__s, __n);
   1817 }
   1818 
   1819 template <class _CharT, class _Traits, class _Allocator>
   1820 basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
   1821     : __r_(__alloc_traits::select_on_container_copy_construction(__str.__alloc()))
   1822 {
   1823     if (!__str.__is_long())
   1824         __r_.first().__r = __str.__r_.first().__r;
   1825     else
   1826         __init(__str.__get_long_pointer(), __str.__get_long_size());
   1827 }
   1828 
   1829 template <class _CharT, class _Traits, class _Allocator>
   1830 basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, const allocator_type& __a)
   1831     : __r_(__a)
   1832 {
   1833     if (!__str.__is_long())
   1834         __r_.first().__r = __str.__r_.first().__r;
   1835     else
   1836         __init(__str.__get_long_pointer(), __str.__get_long_size());
   1837 }
   1838 
   1839 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1840 
   1841 template <class _CharT, class _Traits, class _Allocator>
   1842 _LIBCPP_INLINE_VISIBILITY inline
   1843 basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str)
   1844         _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
   1845     : __r_(_VSTD::move(__str.__r_))
   1846 {
   1847     __str.__zero();
   1848 #ifdef _LIBCPP_DEBUG
   1849     __str.__invalidate_all_iterators();
   1850 #endif
   1851 }
   1852 
   1853 template <class _CharT, class _Traits, class _Allocator>
   1854 _LIBCPP_INLINE_VISIBILITY inline
   1855 basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)
   1856     : __r_(__a)
   1857 {
   1858     if (__a == __str.__alloc() || !__str.__is_long())
   1859         __r_.first().__r = __str.__r_.first().__r;
   1860     else
   1861         __init(__str.__get_long_pointer(), __str.__get_long_size());
   1862     __str.__zero();
   1863 #ifdef _LIBCPP_DEBUG
   1864     __str.__invalidate_all_iterators();
   1865 #endif
   1866 }
   1867 
   1868 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1869 
   1870 template <class _CharT, class _Traits, class _Allocator>
   1871 void
   1872 basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
   1873 {
   1874     if (__n > max_size())
   1875         this->__throw_length_error();
   1876     pointer __p;
   1877     if (__n < __min_cap)
   1878     {
   1879         __set_short_size(__n);
   1880         __p = __get_short_pointer();
   1881     }
   1882     else
   1883     {
   1884         size_type __cap = __recommend(__n);
   1885         __p = __alloc_traits::allocate(__alloc(), __cap+1);
   1886         __set_long_pointer(__p);
   1887         __set_long_cap(__cap+1);
   1888         __set_long_size(__n);
   1889     }
   1890     traits_type::assign(__p, __n, __c);
   1891     traits_type::assign(__p[__n], value_type());
   1892 }
   1893 
   1894 template <class _CharT, class _Traits, class _Allocator>
   1895 _LIBCPP_INLINE_VISIBILITY inline
   1896 basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c)
   1897 {
   1898     __init(__n, __c);
   1899 }
   1900 
   1901 template <class _CharT, class _Traits, class _Allocator>
   1902 _LIBCPP_INLINE_VISIBILITY inline
   1903 basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c, const allocator_type& __a)
   1904     : __r_(__a)
   1905 {
   1906     __init(__n, __c);
   1907 }
   1908 
   1909 template <class _CharT, class _Traits, class _Allocator>
   1910 basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, size_type __n,
   1911                                                         const allocator_type& __a)
   1912     : __r_(__a)
   1913 {
   1914     size_type __str_sz = __str.size();
   1915     if (__pos > __str_sz)
   1916         this->__throw_out_of_range();
   1917     __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos));
   1918 }
   1919 
   1920 template <class _CharT, class _Traits, class _Allocator>
   1921 template <class _InputIterator>
   1922 typename enable_if
   1923 <
   1924      __is_input_iterator  <_InputIterator>::value &&
   1925     !__is_forward_iterator<_InputIterator>::value,
   1926     void
   1927 >::type
   1928 basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
   1929 {
   1930     __zero();
   1931 #ifndef _LIBCPP_NO_EXCEPTIONS
   1932     try
   1933     {
   1934 #endif  // _LIBCPP_NO_EXCEPTIONS
   1935     for (; __first != __last; ++__first)
   1936         push_back(*__first);
   1937 #ifndef _LIBCPP_NO_EXCEPTIONS
   1938     }
   1939     catch (...)
   1940     {
   1941         if (__is_long())
   1942             __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
   1943         throw;
   1944     }
   1945 #endif  // _LIBCPP_NO_EXCEPTIONS
   1946 }
   1947 
   1948 template <class _CharT, class _Traits, class _Allocator>
   1949 template <class _ForwardIterator>
   1950 typename enable_if
   1951 <
   1952     __is_forward_iterator<_ForwardIterator>::value,
   1953     void
   1954 >::type
   1955 basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
   1956 {
   1957     size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last));
   1958     if (__sz > max_size())
   1959         this->__throw_length_error();
   1960     pointer __p;
   1961     if (__sz < __min_cap)
   1962     {
   1963         __set_short_size(__sz);
   1964         __p = __get_short_pointer();
   1965     }
   1966     else
   1967     {
   1968         size_type __cap = __recommend(__sz);
   1969         __p = __alloc_traits::allocate(__alloc(), __cap+1);
   1970         __set_long_pointer(__p);
   1971         __set_long_cap(__cap+1);
   1972         __set_long_size(__sz);
   1973     }
   1974     for (; __first != __last; ++__first, ++__p)
   1975         traits_type::assign(*__p, *__first);
   1976     traits_type::assign(*__p, value_type());
   1977 }
   1978 
   1979 template <class _CharT, class _Traits, class _Allocator>
   1980 template<class _InputIterator>
   1981 _LIBCPP_INLINE_VISIBILITY inline
   1982 basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last)
   1983 {
   1984     __init(__first, __last);
   1985 }
   1986 
   1987 template <class _CharT, class _Traits, class _Allocator>
   1988 template<class _InputIterator>
   1989 _LIBCPP_INLINE_VISIBILITY inline
   1990 basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last,
   1991                                                         const allocator_type& __a)
   1992     : __r_(__a)
   1993 {
   1994     __init(__first, __last);
   1995 }
   1996 
   1997 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1998 
   1999 template <class _CharT, class _Traits, class _Allocator>
   2000 _LIBCPP_INLINE_VISIBILITY inline
   2001 basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il)
   2002 {
   2003     __init(__il.begin(), __il.end());
   2004 }
   2005 
   2006 template <class _CharT, class _Traits, class _Allocator>
   2007 _LIBCPP_INLINE_VISIBILITY inline
   2008 basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il, const allocator_type& __a)
   2009     : __r_(__a)
   2010 {
   2011     __init(__il.begin(), __il.end());
   2012 }
   2013 
   2014 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   2015 
   2016 template <class _CharT, class _Traits, class _Allocator>
   2017 basic_string<_CharT, _Traits, _Allocator>::~basic_string()
   2018 {
   2019     __invalidate_all_iterators();
   2020     if (__is_long())
   2021         __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
   2022 }
   2023 
   2024 template <class _CharT, class _Traits, class _Allocator>
   2025 void
   2026 basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
   2027     (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
   2028      size_type __n_copy,  size_type __n_del,     size_type __n_add, const_pointer __p_new_stuff)
   2029 {
   2030     size_type __ms = max_size();
   2031     if (__delta_cap > __ms - __old_cap - 1)
   2032         this->__throw_length_error();
   2033     pointer __old_p = __get_pointer();
   2034     size_type __cap = __old_cap < __ms / 2 - __alignment ?
   2035                           __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
   2036                           __ms - 1;
   2037     pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
   2038     __invalidate_all_iterators();
   2039     if (__n_copy != 0)
   2040         traits_type::copy(__p, __old_p, __n_copy);
   2041     if (__n_add != 0)
   2042         traits_type::copy(__p + __n_copy, __p_new_stuff, __n_add);
   2043     size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
   2044     if (__sec_cp_sz != 0)
   2045         traits_type::copy(__p + __n_copy + __n_add, __old_p + __n_copy + __n_del, __sec_cp_sz);
   2046     if (__old_cap+1 != __min_cap)
   2047         __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
   2048     __set_long_pointer(__p);
   2049     __set_long_cap(__cap+1);
   2050     __old_sz = __n_copy + __n_add + __sec_cp_sz;
   2051     __set_long_size(__old_sz);
   2052     traits_type::assign(__p[__old_sz], value_type());
   2053 }
   2054 
   2055 template <class _CharT, class _Traits, class _Allocator>
   2056 void
   2057 basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
   2058                                                      size_type __n_copy,  size_type __n_del,     size_type __n_add)
   2059 {
   2060     size_type __ms = max_size();
   2061     if (__delta_cap > __ms - __old_cap - 1)
   2062         this->__throw_length_error();
   2063     pointer __old_p = __get_pointer();
   2064     size_type __cap = __old_cap < __ms / 2 - __alignment ?
   2065                           __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
   2066                           __ms - 1;
   2067     pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
   2068     __invalidate_all_iterators();
   2069     if (__n_copy != 0)
   2070         traits_type::copy(__p, __old_p, __n_copy);
   2071     size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
   2072     if (__sec_cp_sz != 0)
   2073         traits_type::copy(__p + __n_copy + __n_add, __old_p + __n_copy + __n_del, __sec_cp_sz);
   2074     if (__old_cap+1 != __min_cap)
   2075         __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
   2076     __set_long_pointer(__p);
   2077     __set_long_cap(__cap+1);
   2078 }
   2079 
   2080 // assign
   2081 
   2082 template <class _CharT, class _Traits, class _Allocator>
   2083 basic_string<_CharT, _Traits, _Allocator>&
   2084 basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s, size_type __n)
   2085 {
   2086 #ifdef _LIBCPP_DEBUG
   2087     assert(__s != 0);
   2088 #endif
   2089     size_type __cap = capacity();
   2090     if (__cap >= __n)
   2091     {
   2092         pointer __p = __get_pointer();
   2093         traits_type::move(__p, __s, __n);
   2094         traits_type::assign(__p[__n], value_type());
   2095         __set_size(__n);
   2096         __invalidate_iterators_past(__n);
   2097     }
   2098     else
   2099     {
   2100         size_type __sz = size();
   2101         __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
   2102     }
   2103     return *this;
   2104 }
   2105 
   2106 template <class _CharT, class _Traits, class _Allocator>
   2107 basic_string<_CharT, _Traits, _Allocator>&
   2108 basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
   2109 {
   2110     size_type __cap = capacity();
   2111     if (__cap < __n)
   2112     {
   2113         size_type __sz = size();
   2114         __grow_by(__cap, __n - __cap, __sz, 0, __sz);
   2115     }
   2116     else
   2117         __invalidate_iterators_past(__n);
   2118     pointer __p = __get_pointer();
   2119     traits_type::assign(__p, __n, __c);
   2120     traits_type::assign(__p[__n], value_type());
   2121     __set_size(__n);
   2122     return *this;
   2123 }
   2124 
   2125 template <class _CharT, class _Traits, class _Allocator>
   2126 basic_string<_CharT, _Traits, _Allocator>&
   2127 basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
   2128 {
   2129     pointer __p;
   2130     if (__is_long())
   2131     {
   2132         __p = __get_long_pointer();
   2133         __set_long_size(1);
   2134     }
   2135     else
   2136     {
   2137         __p = __get_short_pointer();
   2138         __set_short_size(1);
   2139     }
   2140     traits_type::assign(*__p, __c);
   2141     traits_type::assign(*++__p, value_type());
   2142     __invalidate_iterators_past(1);
   2143     return *this;
   2144 }
   2145 
   2146 template <class _CharT, class _Traits, class _Allocator>
   2147 basic_string<_CharT, _Traits, _Allocator>&
   2148 basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
   2149 {
   2150     if (this != &__str)
   2151     {
   2152         __copy_assign_alloc(__str);
   2153         assign(__str);
   2154     }
   2155     return *this;
   2156 }
   2157 
   2158 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   2159 
   2160 template <class _CharT, class _Traits, class _Allocator>
   2161 _LIBCPP_INLINE_VISIBILITY inline
   2162 void
   2163 basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
   2164 {
   2165     if (__alloc() != __str.__alloc())
   2166         assign(__str);
   2167     else
   2168         __move_assign(__str, true_type());
   2169 }
   2170 
   2171 template <class _CharT, class _Traits, class _Allocator>
   2172 _LIBCPP_INLINE_VISIBILITY inline
   2173 void
   2174 basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
   2175     _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
   2176 {
   2177     clear();
   2178     shrink_to_fit();
   2179     __r_.first() = __str.__r_.first();
   2180     __move_assign_alloc(__str);
   2181     __str.__zero();
   2182 }
   2183 
   2184 template <class _CharT, class _Traits, class _Allocator>
   2185 _LIBCPP_INLINE_VISIBILITY inline
   2186 basic_string<_CharT, _Traits, _Allocator>&
   2187 basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str)
   2188     _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
   2189                is_nothrow_move_assignable<allocator_type>::value)
   2190 {
   2191     __move_assign(__str, integral_constant<bool,
   2192           __alloc_traits::propagate_on_container_move_assignment::value>());
   2193     return *this;
   2194 }
   2195 
   2196 #endif
   2197 
   2198 template <class _CharT, class _Traits, class _Allocator>
   2199 template<class _InputIterator>
   2200 typename enable_if
   2201 <
   2202      __is_input_iterator  <_InputIterator>::value &&
   2203     !__is_forward_iterator<_InputIterator>::value,
   2204     basic_string<_CharT, _Traits, _Allocator>&
   2205 >::type
   2206 basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
   2207 {
   2208     clear();
   2209     for (; __first != __last; ++__first)
   2210         push_back(*__first);
   2211     return *this;
   2212 }
   2213 
   2214 template <class _CharT, class _Traits, class _Allocator>
   2215 template<class _ForwardIterator>
   2216 typename enable_if
   2217 <
   2218     __is_forward_iterator<_ForwardIterator>::value,
   2219     basic_string<_CharT, _Traits, _Allocator>&
   2220 >::type
   2221 basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
   2222 {
   2223     size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
   2224     size_type __cap = capacity();
   2225     if (__cap < __n)
   2226     {
   2227         size_type __sz = size();
   2228         __grow_by(__cap, __n - __cap, __sz, 0, __sz);
   2229     }
   2230     else
   2231         __invalidate_iterators_past(__n);
   2232     pointer __p = __get_pointer();
   2233     for (; __first != __last; ++__first, ++__p)
   2234         traits_type::assign(*__p, *__first);
   2235     traits_type::assign(*__p, value_type());
   2236     __set_size(__n);
   2237     return *this;
   2238 }
   2239 
   2240 template <class _CharT, class _Traits, class _Allocator>
   2241 _LIBCPP_INLINE_VISIBILITY inline
   2242 basic_string<_CharT, _Traits, _Allocator>&
   2243 basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str)
   2244 {
   2245     return assign(__str.data(), __str.size());
   2246 }
   2247 
   2248 template <class _CharT, class _Traits, class _Allocator>
   2249 basic_string<_CharT, _Traits, _Allocator>&
   2250 basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
   2251 {
   2252     size_type __sz = __str.size();
   2253     if (__pos > __sz)
   2254         this->__throw_out_of_range();
   2255     return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
   2256 }
   2257 
   2258 template <class _CharT, class _Traits, class _Allocator>
   2259 basic_string<_CharT, _Traits, _Allocator>&
   2260 basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s)
   2261 {
   2262 #ifdef _LIBCPP_DEBUG
   2263     assert(__s != 0);
   2264 #endif
   2265     return assign(__s, traits_type::length(__s));
   2266 }
   2267 
   2268 // append
   2269 
   2270 template <class _CharT, class _Traits, class _Allocator>
   2271 basic_string<_CharT, _Traits, _Allocator>&
   2272 basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s, size_type __n)
   2273 {
   2274 #ifdef _LIBCPP_DEBUG
   2275     assert(__s != 0);
   2276 #endif
   2277     size_type __cap = capacity();
   2278     size_type __sz = size();
   2279     if (__cap - __sz >= __n)
   2280     {
   2281         if (__n)
   2282         {
   2283             pointer __p = __get_pointer();
   2284             traits_type::copy(__p + __sz, __s, __n);
   2285             __sz += __n;
   2286             __set_size(__sz);
   2287             traits_type::assign(__p[__sz], value_type());
   2288         }
   2289     }
   2290     else
   2291         __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
   2292     return *this;
   2293 }
   2294 
   2295 template <class _CharT, class _Traits, class _Allocator>
   2296 basic_string<_CharT, _Traits, _Allocator>&
   2297 basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
   2298 {
   2299     if (__n)
   2300     {
   2301         size_type __cap = capacity();
   2302         size_type __sz = size();
   2303         if (__cap - __sz < __n)
   2304             __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
   2305         pointer __p = __get_pointer();
   2306         traits_type::assign(__p + __sz, __n, __c);
   2307         __sz += __n;
   2308         __set_size(__sz);
   2309         traits_type::assign(__p[__sz], value_type());
   2310     }
   2311     return *this;
   2312 }
   2313 
   2314 template <class _CharT, class _Traits, class _Allocator>
   2315 void
   2316 basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
   2317 {
   2318     size_type __cap = capacity();
   2319     size_type __sz = size();
   2320     if (__sz == __cap)
   2321         __grow_by(__cap, 1, __sz, __sz, 0);
   2322     pointer __p = __get_pointer() + __sz;
   2323     traits_type::assign(*__p, __c);
   2324     traits_type::assign(*++__p, value_type());
   2325     __set_size(__sz+1);
   2326 }
   2327 
   2328 template <class _CharT, class _Traits, class _Allocator>
   2329 template<class _InputIterator>
   2330 typename enable_if
   2331 <
   2332      __is_input_iterator  <_InputIterator>::value &&
   2333     !__is_forward_iterator<_InputIterator>::value,
   2334     basic_string<_CharT, _Traits, _Allocator>&
   2335 >::type
   2336 basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last)
   2337 {
   2338     for (; __first != __last; ++__first)
   2339         push_back(*__first);
   2340     return *this;
   2341 }
   2342 
   2343 template <class _CharT, class _Traits, class _Allocator>
   2344 template<class _ForwardIterator>
   2345 typename enable_if
   2346 <
   2347     __is_forward_iterator<_ForwardIterator>::value,
   2348     basic_string<_CharT, _Traits, _Allocator>&
   2349 >::type
   2350 basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last)
   2351 {
   2352     size_type __sz = size();
   2353     size_type __cap = capacity();
   2354     size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
   2355     if (__n)
   2356     {
   2357         if (__cap - __sz < __n)
   2358             __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
   2359         pointer __p = __get_pointer() + __sz;
   2360         for (; __first != __last; ++__p, ++__first)
   2361             traits_type::assign(*__p, *__first);
   2362         traits_type::assign(*__p, value_type());
   2363         __set_size(__sz + __n);
   2364     }
   2365     return *this;
   2366 }
   2367 
   2368 template <class _CharT, class _Traits, class _Allocator>
   2369 _LIBCPP_INLINE_VISIBILITY inline
   2370 basic_string<_CharT, _Traits, _Allocator>&
   2371 basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
   2372 {
   2373     return append(__str.data(), __str.size());
   2374 }
   2375 
   2376 template <class _CharT, class _Traits, class _Allocator>
   2377 basic_string<_CharT, _Traits, _Allocator>&
   2378 basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
   2379 {
   2380     size_type __sz = __str.size();
   2381     if (__pos > __sz)
   2382         this->__throw_out_of_range();
   2383     return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
   2384 }
   2385 
   2386 template <class _CharT, class _Traits, class _Allocator>
   2387 basic_string<_CharT, _Traits, _Allocator>&
   2388 basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s)
   2389 {
   2390 #ifdef _LIBCPP_DEBUG
   2391     assert(__s != 0);
   2392 #endif
   2393     return append(__s, traits_type::length(__s));
   2394 }
   2395 
   2396 // insert
   2397 
   2398 template <class _CharT, class _Traits, class _Allocator>
   2399 basic_string<_CharT, _Traits, _Allocator>&
   2400 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const_pointer __s, size_type __n)
   2401 {
   2402 #ifdef _LIBCPP_DEBUG
   2403     assert(__s != 0);
   2404 #endif
   2405     size_type __sz = size();
   2406     if (__pos > __sz)
   2407         this->__throw_out_of_range();
   2408     size_type __cap = capacity();
   2409     if (__cap - __sz >= __n)
   2410     {
   2411         if (__n)
   2412         {
   2413             pointer __p = __get_pointer();
   2414             size_type __n_move = __sz - __pos;
   2415             if (__n_move != 0)
   2416             {
   2417                 if (__p + __pos <= __s && __s < __p + __sz)
   2418                     __s += __n;
   2419                 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
   2420             }
   2421             traits_type::move(__p + __pos, __s, __n);
   2422             __sz += __n;
   2423             __set_size(__sz);
   2424             traits_type::assign(__p[__sz], value_type());
   2425         }
   2426     }
   2427     else
   2428         __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
   2429     return *this;
   2430 }
   2431 
   2432 template <class _CharT, class _Traits, class _Allocator>
   2433 basic_string<_CharT, _Traits, _Allocator>&
   2434 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
   2435 {
   2436     size_type __sz = size();
   2437     if (__pos > __sz)
   2438         this->__throw_out_of_range();
   2439     if (__n)
   2440     {
   2441         size_type __cap = capacity();
   2442         pointer __p;
   2443         if (__cap - __sz >= __n)
   2444         {
   2445             __p = __get_pointer();
   2446             size_type __n_move = __sz - __pos;
   2447             if (__n_move != 0)
   2448                 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
   2449         }
   2450         else
   2451         {
   2452             __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
   2453             __p = __get_long_pointer();
   2454         }
   2455         traits_type::assign(__p + __pos, __n, __c);
   2456         __sz += __n;
   2457         __set_size(__sz);
   2458         traits_type::assign(__p[__sz], value_type());
   2459     }
   2460     return *this;
   2461 }
   2462 
   2463 template <class _CharT, class _Traits, class _Allocator>
   2464 template<class _InputIterator>
   2465 typename enable_if
   2466 <
   2467      __is_input_iterator  <_InputIterator>::value &&
   2468     !__is_forward_iterator<_InputIterator>::value,
   2469     typename basic_string<_CharT, _Traits, _Allocator>::iterator
   2470 >::type
   2471 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
   2472 {
   2473     size_type __old_sz = size();
   2474     difference_type __ip = __pos - begin();
   2475     for (; __first != __last; ++__first)
   2476         push_back(*__first);
   2477     pointer __p = __get_pointer();
   2478     _VSTD::rotate(__p + __ip, __p + __old_sz, __p + size());
   2479     return iterator(__p + __ip);
   2480 }
   2481 
   2482 template <class _CharT, class _Traits, class _Allocator>
   2483 template<class _ForwardIterator>
   2484 typename enable_if
   2485 <
   2486     __is_forward_iterator<_ForwardIterator>::value,
   2487     typename basic_string<_CharT, _Traits, _Allocator>::iterator
   2488 >::type
   2489 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
   2490 {
   2491     size_type __ip = static_cast<size_type>(__pos - begin());
   2492     size_type __sz = size();
   2493     size_type __cap = capacity();
   2494     size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
   2495     if (__n)
   2496     {
   2497         pointer __p;
   2498         if (__cap - __sz >= __n)
   2499         {
   2500             __p = __get_pointer();
   2501             size_type __n_move = __sz - __ip;
   2502             if (__n_move != 0)
   2503                 traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
   2504         }
   2505         else
   2506         {
   2507             __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
   2508             __p = __get_long_pointer();
   2509         }
   2510         __sz += __n;
   2511         __set_size(__sz);
   2512         traits_type::assign(__p[__sz], value_type());
   2513         for (__p += __ip; __first != __last; ++__p, ++__first)
   2514             traits_type::assign(*__p, *__first);
   2515     }
   2516     return begin() + __ip;
   2517 }
   2518 
   2519 template <class _CharT, class _Traits, class _Allocator>
   2520 _LIBCPP_INLINE_VISIBILITY inline
   2521 basic_string<_CharT, _Traits, _Allocator>&
   2522 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str)
   2523 {
   2524     return insert(__pos1, __str.data(), __str.size());
   2525 }
   2526 
   2527 template <class _CharT, class _Traits, class _Allocator>
   2528 basic_string<_CharT, _Traits, _Allocator>&
   2529 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
   2530                                                   size_type __pos2, size_type __n)
   2531 {
   2532     size_type __str_sz = __str.size();
   2533     if (__pos2 > __str_sz)
   2534         this->__throw_out_of_range();
   2535     return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
   2536 }
   2537 
   2538 template <class _CharT, class _Traits, class _Allocator>
   2539 basic_string<_CharT, _Traits, _Allocator>&
   2540 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const_pointer __s)
   2541 {
   2542 #ifdef _LIBCPP_DEBUG
   2543     assert(__s != 0);
   2544 #endif
   2545     return insert(__pos, __s, traits_type::length(__s));
   2546 }
   2547 
   2548 template <class _CharT, class _Traits, class _Allocator>
   2549 typename basic_string<_CharT, _Traits, _Allocator>::iterator
   2550 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
   2551 {
   2552     size_type __ip = static_cast<size_type>(__pos - begin());
   2553     size_type __sz = size();
   2554     size_type __cap = capacity();
   2555     pointer __p;
   2556     if (__cap == __sz)
   2557     {
   2558         __grow_by(__cap, 1, __sz, __ip, 0, 1);
   2559         __p = __get_long_pointer();
   2560     }
   2561     else
   2562     {
   2563         __p = __get_pointer();
   2564         size_type __n_move = __sz - __ip;
   2565         if (__n_move != 0)
   2566             traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
   2567     }
   2568     traits_type::assign(__p[__ip], __c);
   2569     traits_type::assign(__p[++__sz], value_type());
   2570     __set_size(__sz);
   2571     return begin() + static_cast<difference_type>(__ip);
   2572 }
   2573 
   2574 template <class _CharT, class _Traits, class _Allocator>
   2575 _LIBCPP_INLINE_VISIBILITY inline
   2576 typename basic_string<_CharT, _Traits, _Allocator>::iterator
   2577 basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c)
   2578 {
   2579     difference_type __p = __pos - begin();
   2580     insert(static_cast<size_type>(__p), __n, __c);
   2581     return begin() + __p;
   2582 }
   2583 
   2584 // replace
   2585 
   2586 template <class _CharT, class _Traits, class _Allocator>
   2587 basic_string<_CharT, _Traits, _Allocator>&
   2588 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const_pointer __s, size_type __n2)
   2589 {
   2590 #ifdef _LIBCPP_DEBUG
   2591     assert(__s != 0);
   2592 #endif
   2593     size_type __sz = size();
   2594     if (__pos > __sz)
   2595         this->__throw_out_of_range();
   2596     __n1 = _VSTD::min(__n1, __sz - __pos);
   2597     size_type __cap = capacity();
   2598     if (__cap - __sz + __n1 >= __n2)
   2599     {
   2600         pointer __p = __get_pointer();
   2601         if (__n1 != __n2)
   2602         {
   2603             size_type __n_move = __sz - __pos - __n1;
   2604             if (__n_move != 0)
   2605             {
   2606                 if (__n1 > __n2)
   2607                 {
   2608                     traits_type::move(__p + __pos, __s, __n2);
   2609                     traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
   2610                     goto __finish;
   2611                 }
   2612                 if (__p + __pos < __s && __s < __p + __sz)
   2613                 {
   2614                     if (__p + __pos + __n1 <= __s)
   2615                         __s += __n2 - __n1;
   2616                     else // __p + __pos < __s < __p + __pos + __n1
   2617                     {
   2618                         traits_type::move(__p + __pos, __s, __n1);
   2619                         __pos += __n1;
   2620                         __s += __n2;
   2621                         __n2 -= __n1;
   2622                         __n1 = 0;
   2623                     }
   2624                 }
   2625                 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
   2626             }
   2627         }
   2628         traits_type::move(__p + __pos, __s, __n2);
   2629 __finish:
   2630         __sz += __n2 - __n1;
   2631         __set_size(__sz);
   2632         __invalidate_iterators_past(__sz);
   2633         traits_type::assign(__p[__sz], value_type());
   2634     }
   2635     else
   2636         __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
   2637     return *this;
   2638 }
   2639 
   2640 template <class _CharT, class _Traits, class _Allocator>
   2641 basic_string<_CharT, _Traits, _Allocator>&
   2642 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
   2643 {
   2644     size_type __sz = size();
   2645     if (__pos > __sz)
   2646         this->__throw_out_of_range();
   2647     __n1 = _VSTD::min(__n1, __sz - __pos);
   2648     size_type __cap = capacity();
   2649     pointer __p;
   2650     if (__cap - __sz + __n1 >= __n2)
   2651     {
   2652         __p = __get_pointer();
   2653         if (__n1 != __n2)
   2654         {
   2655             size_type __n_move = __sz - __pos - __n1;
   2656             if (__n_move != 0)
   2657                 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
   2658         }
   2659     }
   2660     else
   2661     {
   2662         __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
   2663         __p = __get_long_pointer();
   2664     }
   2665     traits_type::assign(__p + __pos, __n2, __c);
   2666     __sz += __n2 - __n1;
   2667     __set_size(__sz);
   2668     __invalidate_iterators_past(__sz);
   2669     traits_type::assign(__p[__sz], value_type());
   2670     return *this;
   2671 }
   2672 
   2673 template <class _CharT, class _Traits, class _Allocator>
   2674 template<class _InputIterator>
   2675 typename enable_if
   2676 <
   2677     __is_input_iterator<_InputIterator>::value,
   2678     basic_string<_CharT, _Traits, _Allocator>&
   2679 >::type
   2680 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
   2681                                                    _InputIterator __j1, _InputIterator __j2)
   2682 {
   2683     for (; true; ++__i1, ++__j1)
   2684     {
   2685         if (__i1 == __i2)
   2686         {
   2687             if (__j1 != __j2)
   2688                 insert(__i1, __j1, __j2);
   2689             break;
   2690         }
   2691         if (__j1 == __j2)
   2692         {
   2693             erase(__i1, __i2);
   2694             break;
   2695         }
   2696         traits_type::assign(const_cast<value_type&>(*__i1), *__j1);
   2697     }
   2698     return *this;
   2699 }
   2700 
   2701 template <class _CharT, class _Traits, class _Allocator>
   2702 _LIBCPP_INLINE_VISIBILITY inline
   2703 basic_string<_CharT, _Traits, _Allocator>&
   2704 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str)
   2705 {
   2706     return replace(__pos1, __n1, __str.data(), __str.size());
   2707 }
   2708 
   2709 template <class _CharT, class _Traits, class _Allocator>
   2710 basic_string<_CharT, _Traits, _Allocator>&
   2711 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
   2712                                                    size_type __pos2, size_type __n2)
   2713 {
   2714     size_type __str_sz = __str.size();
   2715     if (__pos2 > __str_sz)
   2716         this->__throw_out_of_range();
   2717     return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
   2718 }
   2719 
   2720 template <class _CharT, class _Traits, class _Allocator>
   2721 basic_string<_CharT, _Traits, _Allocator>&
   2722 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const_pointer __s)
   2723 {
   2724 #ifdef _LIBCPP_DEBUG
   2725     assert(__s != 0);
   2726 #endif
   2727     return replace(__pos, __n1, __s, traits_type::length(__s));
   2728 }
   2729 
   2730 template <class _CharT, class _Traits, class _Allocator>
   2731 _LIBCPP_INLINE_VISIBILITY inline
   2732 basic_string<_CharT, _Traits, _Allocator>&
   2733 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str)
   2734 {
   2735     return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1),
   2736                    __str.data(), __str.size());
   2737 }
   2738 
   2739 template <class _CharT, class _Traits, class _Allocator>
   2740 _LIBCPP_INLINE_VISIBILITY inline
   2741 basic_string<_CharT, _Traits, _Allocator>&
   2742 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const_pointer __s, size_type __n)
   2743 {
   2744     return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
   2745 }
   2746 
   2747 template <class _CharT, class _Traits, class _Allocator>
   2748 _LIBCPP_INLINE_VISIBILITY inline
   2749 basic_string<_CharT, _Traits, _Allocator>&
   2750 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const_pointer __s)
   2751 {
   2752     return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
   2753 }
   2754 
   2755 template <class _CharT, class _Traits, class _Allocator>
   2756 _LIBCPP_INLINE_VISIBILITY inline
   2757 basic_string<_CharT, _Traits, _Allocator>&
   2758 basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c)
   2759 {
   2760     return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
   2761 }
   2762 
   2763 // erase
   2764 
   2765 template <class _CharT, class _Traits, class _Allocator>
   2766 basic_string<_CharT, _Traits, _Allocator>&
   2767 basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n)
   2768 {
   2769     size_type __sz = size();
   2770     if (__pos > __sz)
   2771         this->__throw_out_of_range();
   2772     if (__n)
   2773     {
   2774         pointer __p = __get_pointer();
   2775         __n = _VSTD::min(__n, __sz - __pos);
   2776         size_type __n_move = __sz - __pos - __n;
   2777         if (__n_move != 0)
   2778             traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
   2779         __sz -= __n;
   2780         __set_size(__sz);
   2781         __invalidate_iterators_past(__sz);
   2782         traits_type::assign(__p[__sz], value_type());
   2783     }
   2784     return *this;
   2785 }
   2786 
   2787 template <class _CharT, class _Traits, class _Allocator>
   2788 _LIBCPP_INLINE_VISIBILITY inline
   2789 typename basic_string<_CharT, _Traits, _Allocator>::iterator
   2790 basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
   2791 {
   2792     iterator __b = begin();
   2793     size_type __r = static_cast<size_type>(__pos - __b);
   2794     erase(__r, 1);
   2795     return __b + static_cast<difference_type>(__r);
   2796 }
   2797 
   2798 template <class _CharT, class _Traits, class _Allocator>
   2799 _LIBCPP_INLINE_VISIBILITY inline
   2800 typename basic_string<_CharT, _Traits, _Allocator>::iterator
   2801 basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
   2802 {
   2803     iterator __b = begin();
   2804     size_type __r = static_cast<size_type>(__first - __b);
   2805     erase(__r, static_cast<size_type>(__last - __first));
   2806     return __b + static_cast<difference_type>(__r);
   2807 }
   2808 
   2809 template <class _CharT, class _Traits, class _Allocator>
   2810 _LIBCPP_INLINE_VISIBILITY inline
   2811 void
   2812 basic_string<_CharT, _Traits, _Allocator>::pop_back()
   2813 {
   2814 #ifdef _LIBCPP_DEBUG
   2815     assert(!empty());
   2816 #endif
   2817     size_type __sz;
   2818     if (__is_long())
   2819     {
   2820         __sz = __get_long_size() - 1;
   2821         __set_long_size(__sz);
   2822         traits_type::assign(*(__get_long_pointer() + __sz), value_type());
   2823     }
   2824     else
   2825     {
   2826         __sz = __get_short_size() - 1;
   2827         __set_short_size(__sz);
   2828         traits_type::assign(*(__get_short_pointer() + __sz), value_type());
   2829     }
   2830     __invalidate_iterators_past(__sz);
   2831 }
   2832 
   2833 template <class _CharT, class _Traits, class _Allocator>
   2834 _LIBCPP_INLINE_VISIBILITY inline
   2835 void
   2836 basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
   2837 {
   2838     __invalidate_all_iterators();
   2839     if (__is_long())
   2840     {
   2841         traits_type::assign(*__get_long_pointer(), value_type());
   2842         __set_long_size(0);
   2843     }
   2844     else
   2845     {
   2846         traits_type::assign(*__get_short_pointer(), value_type());
   2847         __set_short_size(0);
   2848     }
   2849 }
   2850 
   2851 template <class _CharT, class _Traits, class _Allocator>
   2852 _LIBCPP_INLINE_VISIBILITY inline
   2853 void
   2854 basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
   2855 {
   2856     if (__is_long())
   2857     {
   2858         traits_type::assign(*(__get_long_pointer() + __pos), value_type());
   2859         __set_long_size(__pos);
   2860     }
   2861     else
   2862     {
   2863         traits_type::assign(*(__get_short_pointer() + __pos), value_type());
   2864         __set_short_size(__pos);
   2865     }
   2866     __invalidate_iterators_past(__pos);
   2867 }
   2868 
   2869 template <class _CharT, class _Traits, class _Allocator>
   2870 void
   2871 basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
   2872 {
   2873     size_type __sz = size();
   2874     if (__n > __sz)
   2875         append(__n - __sz, __c);
   2876     else
   2877         __erase_to_end(__n);
   2878 }
   2879 
   2880 template <class _CharT, class _Traits, class _Allocator>
   2881 _LIBCPP_INLINE_VISIBILITY inline
   2882 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   2883 basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT
   2884 {
   2885     size_type __m = __alloc_traits::max_size(__alloc());
   2886 #if _LIBCPP_BIG_ENDIAN
   2887     return (__m <= ~__long_mask ? __m : __m/2) - 1;
   2888 #else
   2889     return __m - 1;
   2890 #endif
   2891 }
   2892 
   2893 template <class _CharT, class _Traits, class _Allocator>
   2894 void
   2895 basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
   2896 {
   2897     if (__res_arg > max_size())
   2898         this->__throw_length_error();
   2899     size_type __cap = capacity();
   2900     size_type __sz = size();
   2901     __res_arg = _VSTD::max(__res_arg, __sz);
   2902     __res_arg = __recommend(__res_arg);
   2903     if (__res_arg != __cap)
   2904     {
   2905         pointer __new_data, __p;
   2906         bool __was_long, __now_long;
   2907         if (__res_arg == __min_cap - 1)
   2908         {
   2909             __was_long = true;
   2910             __now_long = false;
   2911             __new_data = __get_short_pointer();
   2912             __p = __get_long_pointer();
   2913         }
   2914         else
   2915         {
   2916             if (__res_arg > __cap)
   2917                 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
   2918             else
   2919             {
   2920             #ifndef _LIBCPP_NO_EXCEPTIONS
   2921                 try
   2922                 {
   2923             #endif  // _LIBCPP_NO_EXCEPTIONS
   2924                     __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
   2925             #ifndef _LIBCPP_NO_EXCEPTIONS
   2926                 }
   2927                 catch (...)
   2928                 {
   2929                     return;
   2930                 }
   2931             #else  // _LIBCPP_NO_EXCEPTIONS
   2932                 if (__new_data == 0)
   2933                     return;
   2934             #endif  // _LIBCPP_NO_EXCEPTIONS
   2935             }
   2936             __now_long = true;
   2937             __was_long = __is_long();
   2938             __p = __get_pointer();
   2939         }
   2940         traits_type::copy(__new_data, __p, size()+1);
   2941         if (__was_long)
   2942             __alloc_traits::deallocate(__alloc(), __p, __cap+1);
   2943         if (__now_long)
   2944         {
   2945             __set_long_cap(__res_arg+1);
   2946             __set_long_size(__sz);
   2947             __set_long_pointer(__new_data);
   2948         }
   2949         else
   2950             __set_short_size(__sz);
   2951         __invalidate_all_iterators();
   2952     }
   2953 }
   2954 
   2955 template <class _CharT, class _Traits, class _Allocator>
   2956 _LIBCPP_INLINE_VISIBILITY inline
   2957 typename basic_string<_CharT, _Traits, _Allocator>::const_reference
   2958 basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const
   2959 {
   2960 #ifdef __LIBCPP_DEBUG
   2961     assert(__pos <= size());
   2962 #endif
   2963     return *(data() + __pos);
   2964 }
   2965 
   2966 template <class _CharT, class _Traits, class _Allocator>
   2967 _LIBCPP_INLINE_VISIBILITY inline
   2968 typename basic_string<_CharT, _Traits, _Allocator>::reference
   2969 basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos)
   2970 {
   2971 #ifdef __LIBCPP_DEBUG
   2972     assert(__pos < size());
   2973 #endif
   2974     return *(__get_pointer() + __pos);
   2975 }
   2976 
   2977 template <class _CharT, class _Traits, class _Allocator>
   2978 typename basic_string<_CharT, _Traits, _Allocator>::const_reference
   2979 basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
   2980 {
   2981     if (__n >= size())
   2982         this->__throw_out_of_range();
   2983     return (*this)[__n];
   2984 }
   2985 
   2986 template <class _CharT, class _Traits, class _Allocator>
   2987 typename basic_string<_CharT, _Traits, _Allocator>::reference
   2988 basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
   2989 {
   2990     if (__n >= size())
   2991         this->__throw_out_of_range();
   2992     return (*this)[__n];
   2993 }
   2994 
   2995 template <class _CharT, class _Traits, class _Allocator>
   2996 _LIBCPP_INLINE_VISIBILITY inline
   2997 typename basic_string<_CharT, _Traits, _Allocator>::reference
   2998 basic_string<_CharT, _Traits, _Allocator>::front()
   2999 {
   3000 #ifdef _LIBCPP_DEBUG
   3001     assert(!empty());
   3002 #endif
   3003     return *__get_pointer();
   3004 }
   3005 
   3006 template <class _CharT, class _Traits, class _Allocator>
   3007 _LIBCPP_INLINE_VISIBILITY inline
   3008 typename basic_string<_CharT, _Traits, _Allocator>::const_reference
   3009 basic_string<_CharT, _Traits, _Allocator>::front() const
   3010 {
   3011 #ifdef _LIBCPP_DEBUG
   3012     assert(!empty());
   3013 #endif
   3014     return *data();
   3015 }
   3016 
   3017 template <class _CharT, class _Traits, class _Allocator>
   3018 _LIBCPP_INLINE_VISIBILITY inline
   3019 typename basic_string<_CharT, _Traits, _Allocator>::reference
   3020 basic_string<_CharT, _Traits, _Allocator>::back()
   3021 {
   3022 #ifdef _LIBCPP_DEBUG
   3023     assert(!empty());
   3024 #endif
   3025     return *(__get_pointer() + size() - 1);
   3026 }
   3027 
   3028 template <class _CharT, class _Traits, class _Allocator>
   3029 _LIBCPP_INLINE_VISIBILITY inline
   3030 typename basic_string<_CharT, _Traits, _Allocator>::const_reference
   3031 basic_string<_CharT, _Traits, _Allocator>::back() const
   3032 {
   3033 #ifdef _LIBCPP_DEBUG
   3034     assert(!empty());
   3035 #endif
   3036     return *(data() + size() - 1);
   3037 }
   3038 
   3039 template <class _CharT, class _Traits, class _Allocator>
   3040 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3041 basic_string<_CharT, _Traits, _Allocator>::copy(pointer __s, size_type __n, size_type __pos) const
   3042 {
   3043     size_type __sz = size();
   3044     if (__pos > __sz)
   3045         this->__throw_out_of_range();
   3046     size_type __rlen = _VSTD::min(__n, __sz - __pos);
   3047     traits_type::copy(__s, data() + __pos, __rlen);
   3048     return __rlen;
   3049 }
   3050 
   3051 template <class _CharT, class _Traits, class _Allocator>
   3052 _LIBCPP_INLINE_VISIBILITY inline
   3053 basic_string<_CharT, _Traits, _Allocator>
   3054 basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const
   3055 {
   3056     return basic_string(*this, __pos, __n, __alloc());
   3057 }
   3058 
   3059 template <class _CharT, class _Traits, class _Allocator>
   3060 _LIBCPP_INLINE_VISIBILITY inline
   3061 void
   3062 basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
   3063         _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
   3064                    __is_nothrow_swappable<allocator_type>::value)
   3065 {
   3066     _VSTD::swap(__r_.first(), __str.__r_.first());
   3067     __swap_alloc(__alloc(), __str.__alloc());
   3068 #ifdef _LIBCPP_DEBUG
   3069     __invalidate_all_iterators();
   3070     __str.__invalidate_all_iterators();
   3071 #endif  // _LIBCPP_DEBUG
   3072 }
   3073 
   3074 // find
   3075 
   3076 template <class _Traits>
   3077 struct _LIBCPP_HIDDEN __traits_eq
   3078 {
   3079     typedef typename _Traits::char_type char_type;
   3080     _LIBCPP_INLINE_VISIBILITY
   3081     bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
   3082         {return _Traits::eq(__x, __y);}
   3083 };
   3084 
   3085 template<class _CharT, class _Traits, class _Allocator>
   3086 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3087 basic_string<_CharT, _Traits, _Allocator>::find(const_pointer __s,
   3088                                                 size_type __pos,
   3089                                                 size_type __n) const _NOEXCEPT
   3090 {
   3091 #ifdef _LIBCPP_DEBUG
   3092     assert(__s != 0);
   3093 #endif
   3094     size_type __sz = size();
   3095     if (__pos > __sz || __sz - __pos < __n)
   3096         return npos;
   3097     if (__n == 0)
   3098         return __pos;
   3099     const_pointer __p = data();
   3100     const_pointer __r = _VSTD::search(__p + __pos, __p + __sz, __s, __s + __n,
   3101                                      __traits_eq<traits_type>());
   3102     if (__r == __p + __sz)
   3103         return npos;
   3104     return static_cast<size_type>(__r - __p);
   3105 }
   3106 
   3107 template<class _CharT, class _Traits, class _Allocator>
   3108 _LIBCPP_INLINE_VISIBILITY inline
   3109 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3110 basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
   3111                                                 size_type __pos) const _NOEXCEPT
   3112 {
   3113     return find(__str.data(), __pos, __str.size());
   3114 }
   3115 
   3116 template<class _CharT, class _Traits, class _Allocator>
   3117 _LIBCPP_INLINE_VISIBILITY inline
   3118 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3119 basic_string<_CharT, _Traits, _Allocator>::find(const_pointer __s,
   3120                                                 size_type __pos) const _NOEXCEPT
   3121 {
   3122 #ifdef _LIBCPP_DEBUG
   3123     assert(__s != 0);
   3124 #endif
   3125     return find(__s, __pos, traits_type::length(__s));
   3126 }
   3127 
   3128 template<class _CharT, class _Traits, class _Allocator>
   3129 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3130 basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
   3131                                                 size_type __pos) const _NOEXCEPT
   3132 {
   3133     size_type __sz = size();
   3134     if (__pos >= __sz)
   3135         return npos;
   3136     const_pointer __p = data();
   3137     const_pointer __r = traits_type::find(__p + __pos, __sz - __pos, __c);
   3138     if (__r == 0)
   3139         return npos;
   3140     return static_cast<size_type>(__r - __p);
   3141 }
   3142 
   3143 // rfind
   3144 
   3145 template<class _CharT, class _Traits, class _Allocator>
   3146 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3147 basic_string<_CharT, _Traits, _Allocator>::rfind(const_pointer __s,
   3148                                                  size_type __pos,
   3149                                                  size_type __n) const _NOEXCEPT
   3150 {
   3151 #ifdef _LIBCPP_DEBUG
   3152     assert(__s != 0);
   3153 #endif
   3154     size_type __sz = size();
   3155     __pos = _VSTD::min(__pos, __sz);
   3156     if (__n < __sz - __pos)
   3157         __pos += __n;
   3158     else
   3159         __pos = __sz;
   3160     const_pointer __p = data();
   3161     const_pointer __r = _VSTD::find_end(__p, __p + __pos, __s, __s + __n,
   3162                                        __traits_eq<traits_type>());
   3163     if (__n > 0 && __r == __p + __pos)
   3164         return npos;
   3165     return static_cast<size_type>(__r - __p);
   3166 }
   3167 
   3168 template<class _CharT, class _Traits, class _Allocator>
   3169 _LIBCPP_INLINE_VISIBILITY inline
   3170 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3171 basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
   3172                                                  size_type __pos) const _NOEXCEPT
   3173 {
   3174     return rfind(__str.data(), __pos, __str.size());
   3175 }
   3176 
   3177 template<class _CharT, class _Traits, class _Allocator>
   3178 _LIBCPP_INLINE_VISIBILITY inline
   3179 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3180 basic_string<_CharT, _Traits, _Allocator>::rfind(const_pointer __s,
   3181                                                  size_type __pos) const _NOEXCEPT
   3182 {
   3183 #ifdef _LIBCPP_DEBUG
   3184     assert(__s != 0);
   3185 #endif
   3186     return rfind(__s, __pos, traits_type::length(__s));
   3187 }
   3188 
   3189 template<class _CharT, class _Traits, class _Allocator>
   3190 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3191 basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
   3192                                                  size_type __pos) const _NOEXCEPT
   3193 {
   3194     size_type __sz = size();
   3195     if (__sz)
   3196     {
   3197         if (__pos < __sz)
   3198             ++__pos;
   3199         else
   3200             __pos = __sz;
   3201         const_pointer __p = data();
   3202         for (const_pointer __ps = __p + __pos; __ps != __p;)
   3203         {
   3204             if (traits_type::eq(*--__ps, __c))
   3205                 return static_cast<size_type>(__ps - __p);
   3206         }
   3207     }
   3208     return npos;
   3209 }
   3210 
   3211 // find_first_of
   3212 
   3213 template<class _CharT, class _Traits, class _Allocator>
   3214 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3215 basic_string<_CharT, _Traits, _Allocator>::find_first_of(const_pointer __s,
   3216                                                          size_type __pos,
   3217                                                          size_type __n) const _NOEXCEPT
   3218 {
   3219 #ifdef _LIBCPP_DEBUG
   3220     assert(__s != 0);
   3221 #endif
   3222     size_type __sz = size();
   3223     if (__pos >= __sz || __n == 0)
   3224         return npos;
   3225     const_pointer __p = data();
   3226     const_pointer __r = _VSTD::find_first_of(__p + __pos, __p + __sz, __s,
   3227                                             __s + __n, __traits_eq<traits_type>());
   3228     if (__r == __p + __sz)
   3229         return npos;
   3230     return static_cast<size_type>(__r - __p);
   3231 }
   3232 
   3233 template<class _CharT, class _Traits, class _Allocator>
   3234 _LIBCPP_INLINE_VISIBILITY inline
   3235 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3236 basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
   3237                                                          size_type __pos) const _NOEXCEPT
   3238 {
   3239     return find_first_of(__str.data(), __pos, __str.size());
   3240 }
   3241 
   3242 template<class _CharT, class _Traits, class _Allocator>
   3243 _LIBCPP_INLINE_VISIBILITY inline
   3244 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3245 basic_string<_CharT, _Traits, _Allocator>::find_first_of(const_pointer __s,
   3246                                                          size_type __pos) const _NOEXCEPT
   3247 {
   3248 #ifdef _LIBCPP_DEBUG
   3249     assert(__s != 0);
   3250 #endif
   3251     return find_first_of(__s, __pos, traits_type::length(__s));
   3252 }
   3253 
   3254 template<class _CharT, class _Traits, class _Allocator>
   3255 _LIBCPP_INLINE_VISIBILITY inline
   3256 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3257 basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
   3258                                                          size_type __pos) const _NOEXCEPT
   3259 {
   3260     return find(__c, __pos);
   3261 }
   3262 
   3263 // find_last_of
   3264 
   3265 template<class _CharT, class _Traits, class _Allocator>
   3266 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3267 basic_string<_CharT, _Traits, _Allocator>::find_last_of(const_pointer __s,
   3268                                                         size_type __pos,
   3269                                                         size_type __n) const _NOEXCEPT
   3270 {
   3271 #ifdef _LIBCPP_DEBUG
   3272     assert(__s != 0);
   3273 #endif
   3274     if (__n != 0)
   3275     {
   3276         size_type __sz = size();
   3277         if (__pos < __sz)
   3278             ++__pos;
   3279         else
   3280             __pos = __sz;
   3281         const_pointer __p = data();
   3282         for (const_pointer __ps = __p + __pos; __ps != __p;)
   3283         {
   3284             const_pointer __r = traits_type::find(__s, __n, *--__ps);
   3285             if (__r)
   3286                 return static_cast<size_type>(__ps - __p);
   3287         }
   3288     }
   3289     return npos;
   3290 }
   3291 
   3292 template<class _CharT, class _Traits, class _Allocator>
   3293 _LIBCPP_INLINE_VISIBILITY inline
   3294 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3295 basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
   3296                                                         size_type __pos) const _NOEXCEPT
   3297 {
   3298     return find_last_of(__str.data(), __pos, __str.size());
   3299 }
   3300 
   3301 template<class _CharT, class _Traits, class _Allocator>
   3302 _LIBCPP_INLINE_VISIBILITY inline
   3303 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3304 basic_string<_CharT, _Traits, _Allocator>::find_last_of(const_pointer __s,
   3305                                                         size_type __pos) const _NOEXCEPT
   3306 {
   3307 #ifdef _LIBCPP_DEBUG
   3308     assert(__s != 0);
   3309 #endif
   3310     return find_last_of(__s, __pos, traits_type::length(__s));
   3311 }
   3312 
   3313 template<class _CharT, class _Traits, class _Allocator>
   3314 _LIBCPP_INLINE_VISIBILITY inline
   3315 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3316 basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
   3317                                                         size_type __pos) const _NOEXCEPT
   3318 {
   3319     return rfind(__c, __pos);
   3320 }
   3321 
   3322 // find_first_not_of
   3323 
   3324 template<class _CharT, class _Traits, class _Allocator>
   3325 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3326 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const_pointer __s,
   3327                                                              size_type __pos,
   3328                                                              size_type __n) const _NOEXCEPT
   3329 {
   3330 #ifdef _LIBCPP_DEBUG
   3331     assert(__s != 0);
   3332 #endif
   3333     size_type __sz = size();
   3334     if (__pos < __sz)
   3335     {
   3336         const_pointer __p = data();
   3337         const_pointer __pe = __p + __sz;
   3338         for (const_pointer __ps = __p + __pos; __ps != __pe; ++__ps)
   3339             if (traits_type::find(__s, __n, *__ps) == 0)
   3340                 return static_cast<size_type>(__ps - __p);
   3341     }
   3342     return npos;
   3343 }
   3344 
   3345 template<class _CharT, class _Traits, class _Allocator>
   3346 _LIBCPP_INLINE_VISIBILITY inline
   3347 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3348 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
   3349                                                              size_type __pos) const _NOEXCEPT
   3350 {
   3351     return find_first_not_of(__str.data(), __pos, __str.size());
   3352 }
   3353 
   3354 template<class _CharT, class _Traits, class _Allocator>
   3355 _LIBCPP_INLINE_VISIBILITY inline
   3356 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3357 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const_pointer __s,
   3358                                                              size_type __pos) const _NOEXCEPT
   3359 {
   3360 #ifdef _LIBCPP_DEBUG
   3361     assert(__s != 0);
   3362 #endif
   3363     return find_first_not_of(__s, __pos, traits_type::length(__s));
   3364 }
   3365 
   3366 template<class _CharT, class _Traits, class _Allocator>
   3367 _LIBCPP_INLINE_VISIBILITY inline
   3368 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3369 basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
   3370                                                              size_type __pos) const _NOEXCEPT
   3371 {
   3372     size_type __sz = size();
   3373     if (__pos < __sz)
   3374     {
   3375         const_pointer __p = data();
   3376         const_pointer __pe = __p + __sz;
   3377         for (const_pointer __ps = __p + __pos; __ps != __pe; ++__ps)
   3378             if (!traits_type::eq(*__ps, __c))
   3379                 return static_cast<size_type>(__ps - __p);
   3380     }
   3381     return npos;
   3382 }
   3383 
   3384 // find_last_not_of
   3385 
   3386 template<class _CharT, class _Traits, class _Allocator>
   3387 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3388 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const_pointer __s,
   3389                                                             size_type __pos,
   3390                                                             size_type __n) const _NOEXCEPT
   3391 {
   3392 #ifdef _LIBCPP_DEBUG
   3393     assert(__s != 0);
   3394 #endif
   3395     size_type __sz = size();
   3396     if (__pos < __sz)
   3397         ++__pos;
   3398     else
   3399         __pos = __sz;
   3400     const_pointer __p = data();
   3401     for (const_pointer __ps = __p + __pos; __ps != __p;)
   3402         if (traits_type::find(__s, __n, *--__ps) == 0)
   3403             return static_cast<size_type>(__ps - __p);
   3404     return npos;
   3405 }
   3406 
   3407 template<class _CharT, class _Traits, class _Allocator>
   3408 _LIBCPP_INLINE_VISIBILITY inline
   3409 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3410 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
   3411                                                             size_type __pos) const _NOEXCEPT
   3412 {
   3413     return find_last_not_of(__str.data(), __pos, __str.size());
   3414 }
   3415 
   3416 template<class _CharT, class _Traits, class _Allocator>
   3417 _LIBCPP_INLINE_VISIBILITY inline
   3418 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3419 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const_pointer __s,
   3420                                                             size_type __pos) const _NOEXCEPT
   3421 {
   3422 #ifdef _LIBCPP_DEBUG
   3423     assert(__s != 0);
   3424 #endif
   3425     return find_last_not_of(__s, __pos, traits_type::length(__s));
   3426 }
   3427 
   3428 template<class _CharT, class _Traits, class _Allocator>
   3429 _LIBCPP_INLINE_VISIBILITY inline
   3430 typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3431 basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
   3432                                                             size_type __pos) const _NOEXCEPT
   3433 {
   3434     size_type __sz = size();
   3435     if (__pos < __sz)
   3436         ++__pos;
   3437     else
   3438         __pos = __sz;
   3439     const_pointer __p = data();
   3440     for (const_pointer __ps = __p + __pos; __ps != __p;)
   3441         if (!traits_type::eq(*--__ps, __c))
   3442             return static_cast<size_type>(__ps - __p);
   3443     return npos;
   3444 }
   3445 
   3446 // compare
   3447 
   3448 template <class _CharT, class _Traits, class _Allocator>
   3449 _LIBCPP_INLINE_VISIBILITY inline
   3450 int
   3451 basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
   3452 {
   3453     size_t __lhs_sz = size();
   3454     size_t __rhs_sz = __str.size();
   3455     int __result = traits_type::compare(data(), __str.data(),
   3456                                         _VSTD::min(__lhs_sz, __rhs_sz));
   3457     if (__result != 0)
   3458         return __result;
   3459     if (__lhs_sz < __rhs_sz)
   3460         return -1;
   3461     if (__lhs_sz > __rhs_sz)
   3462         return 1;
   3463     return 0;
   3464 }
   3465 
   3466 template <class _CharT, class _Traits, class _Allocator>
   3467 _LIBCPP_INLINE_VISIBILITY inline
   3468 int
   3469 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
   3470                                                    size_type __n1,
   3471                                                    const basic_string& __str) const
   3472 {
   3473     return compare(__pos1, __n1, __str.data(), __str.size());
   3474 }
   3475 
   3476 template <class _CharT, class _Traits, class _Allocator>
   3477 int
   3478 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
   3479                                                    size_type __n1,
   3480                                                    const basic_string& __str,
   3481                                                    size_type __pos2,
   3482                                                    size_type __n2) const
   3483 {
   3484     size_type __sz = __str.size();
   3485     if (__pos2 > __sz)
   3486         this->__throw_out_of_range();
   3487     return compare(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2,
   3488                                                                   __sz - __pos2));
   3489 }
   3490 
   3491 template <class _CharT, class _Traits, class _Allocator>
   3492 int
   3493 basic_string<_CharT, _Traits, _Allocator>::compare(const_pointer __s) const _NOEXCEPT
   3494 {
   3495 #ifdef _LIBCPP_DEBUG
   3496     assert(__s != 0);
   3497 #endif
   3498     return compare(0, npos, __s, traits_type::length(__s));
   3499 }
   3500 
   3501 template <class _CharT, class _Traits, class _Allocator>
   3502 int
   3503 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
   3504                                                    size_type __n1,
   3505                                                    const_pointer __s) const
   3506 {
   3507 #ifdef _LIBCPP_DEBUG
   3508     assert(__s != 0);
   3509 #endif
   3510     return compare(__pos1, __n1, __s, traits_type::length(__s));
   3511 }
   3512 
   3513 template <class _CharT, class _Traits, class _Allocator>
   3514 int
   3515 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
   3516                                                    size_type __n1,
   3517                                                    const_pointer __s,
   3518                                                    size_type __n2) const
   3519 {
   3520 #ifdef _LIBCPP_DEBUG
   3521     assert(__s != 0);
   3522 #endif
   3523     size_type __sz = size();
   3524     if (__pos1 > __sz || __n2 == npos)
   3525         this->__throw_out_of_range();
   3526     size_type __rlen = _VSTD::min(__n1, __sz - __pos1);
   3527     int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2));
   3528     if (__r == 0)
   3529     {
   3530         if (__rlen < __n2)
   3531             __r = -1;
   3532         else if (__rlen > __n2)
   3533             __r = 1;
   3534     }
   3535     return __r;
   3536 }
   3537 
   3538 // __invariants
   3539 
   3540 template<class _CharT, class _Traits, class _Allocator>
   3541 _LIBCPP_INLINE_VISIBILITY inline
   3542 bool
   3543 basic_string<_CharT, _Traits, _Allocator>::__invariants() const
   3544 {
   3545     if (size() > capacity())
   3546         return false;
   3547     if (capacity() < __min_cap - 1)
   3548         return false;
   3549     if (data() == 0)
   3550         return false;
   3551     if (data()[size()] != value_type(0))
   3552         return false;
   3553     return true;
   3554 }
   3555 
   3556 // operator==
   3557 
   3558 template<class _CharT, class _Traits, class _Allocator>
   3559 _LIBCPP_INLINE_VISIBILITY inline
   3560 bool
   3561 operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3562            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3563 {
   3564     return __lhs.size() == __rhs.size() && _Traits::compare(__lhs.data(),
   3565                                                             __rhs.data(),
   3566                                                             __lhs.size()) == 0;
   3567 }
   3568 
   3569 template<class _CharT, class _Traits, class _Allocator>
   3570 _LIBCPP_INLINE_VISIBILITY inline
   3571 bool
   3572 operator==(const _CharT* __lhs,
   3573            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3574 {
   3575     return __rhs.compare(__lhs) == 0;
   3576 }
   3577 
   3578 template<class _CharT, class _Traits, class _Allocator>
   3579 _LIBCPP_INLINE_VISIBILITY inline
   3580 bool
   3581 operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
   3582            const _CharT* __rhs) _NOEXCEPT
   3583 {
   3584     return __lhs.compare(__rhs) == 0;
   3585 }
   3586 
   3587 // operator!=
   3588 
   3589 template<class _CharT, class _Traits, class _Allocator>
   3590 _LIBCPP_INLINE_VISIBILITY inline
   3591 bool
   3592 operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
   3593            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3594 {
   3595     return !(__lhs == __rhs);
   3596 }
   3597 
   3598 template<class _CharT, class _Traits, class _Allocator>
   3599 _LIBCPP_INLINE_VISIBILITY inline
   3600 bool
   3601 operator!=(const _CharT* __lhs,
   3602            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3603 {
   3604     return !(__lhs == __rhs);
   3605 }
   3606 
   3607 template<class _CharT, class _Traits, class _Allocator>
   3608 _LIBCPP_INLINE_VISIBILITY inline
   3609 bool
   3610 operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3611            const _CharT* __rhs) _NOEXCEPT
   3612 {
   3613     return !(__lhs == __rhs);
   3614 }
   3615 
   3616 // operator<
   3617 
   3618 template<class _CharT, class _Traits, class _Allocator>
   3619 _LIBCPP_INLINE_VISIBILITY inline
   3620 bool
   3621 operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3622            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3623 {
   3624     return __lhs.compare(__rhs) < 0;
   3625 }
   3626 
   3627 template<class _CharT, class _Traits, class _Allocator>
   3628 _LIBCPP_INLINE_VISIBILITY inline
   3629 bool
   3630 operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3631            const _CharT* __rhs) _NOEXCEPT
   3632 {
   3633     return __lhs.compare(__rhs) < 0;
   3634 }
   3635 
   3636 template<class _CharT, class _Traits, class _Allocator>
   3637 _LIBCPP_INLINE_VISIBILITY inline
   3638 bool
   3639 operator< (const _CharT* __lhs,
   3640            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3641 {
   3642     return __rhs.compare(__lhs) > 0;
   3643 }
   3644 
   3645 // operator>
   3646 
   3647 template<class _CharT, class _Traits, class _Allocator>
   3648 _LIBCPP_INLINE_VISIBILITY inline
   3649 bool
   3650 operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3651            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3652 {
   3653     return __rhs < __lhs;
   3654 }
   3655 
   3656 template<class _CharT, class _Traits, class _Allocator>
   3657 _LIBCPP_INLINE_VISIBILITY inline
   3658 bool
   3659 operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3660            const _CharT* __rhs) _NOEXCEPT
   3661 {
   3662     return __rhs < __lhs;
   3663 }
   3664 
   3665 template<class _CharT, class _Traits, class _Allocator>
   3666 _LIBCPP_INLINE_VISIBILITY inline
   3667 bool
   3668 operator> (const _CharT* __lhs,
   3669            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3670 {
   3671     return __rhs < __lhs;
   3672 }
   3673 
   3674 // operator<=
   3675 
   3676 template<class _CharT, class _Traits, class _Allocator>
   3677 _LIBCPP_INLINE_VISIBILITY inline
   3678 bool
   3679 operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3680            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3681 {
   3682     return !(__rhs < __lhs);
   3683 }
   3684 
   3685 template<class _CharT, class _Traits, class _Allocator>
   3686 _LIBCPP_INLINE_VISIBILITY inline
   3687 bool
   3688 operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3689            const _CharT* __rhs) _NOEXCEPT
   3690 {
   3691     return !(__rhs < __lhs);
   3692 }
   3693 
   3694 template<class _CharT, class _Traits, class _Allocator>
   3695 _LIBCPP_INLINE_VISIBILITY inline
   3696 bool
   3697 operator<=(const _CharT* __lhs,
   3698            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3699 {
   3700     return !(__rhs < __lhs);
   3701 }
   3702 
   3703 // operator>=
   3704 
   3705 template<class _CharT, class _Traits, class _Allocator>
   3706 _LIBCPP_INLINE_VISIBILITY inline
   3707 bool
   3708 operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3709            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3710 {
   3711     return !(__lhs < __rhs);
   3712 }
   3713 
   3714 template<class _CharT, class _Traits, class _Allocator>
   3715 _LIBCPP_INLINE_VISIBILITY inline
   3716 bool
   3717 operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3718            const _CharT* __rhs) _NOEXCEPT
   3719 {
   3720     return !(__lhs < __rhs);
   3721 }
   3722 
   3723 template<class _CharT, class _Traits, class _Allocator>
   3724 _LIBCPP_INLINE_VISIBILITY inline
   3725 bool
   3726 operator>=(const _CharT* __lhs,
   3727            const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
   3728 {
   3729     return !(__lhs < __rhs);
   3730 }
   3731 
   3732 // operator +
   3733 
   3734 template<class _CharT, class _Traits, class _Allocator>
   3735 basic_string<_CharT, _Traits, _Allocator>
   3736 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3737           const basic_string<_CharT, _Traits, _Allocator>& __rhs)
   3738 {
   3739     basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
   3740     typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
   3741     typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
   3742     __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
   3743     __r.append(__rhs.data(), __rhs_sz);
   3744     return __r;
   3745 }
   3746 
   3747 template<class _CharT, class _Traits, class _Allocator>
   3748 basic_string<_CharT, _Traits, _Allocator>
   3749 operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
   3750 {
   3751     basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
   3752     typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs);
   3753     typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
   3754     __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
   3755     __r.append(__rhs.data(), __rhs_sz);
   3756     return __r;
   3757 }
   3758 
   3759 template<class _CharT, class _Traits, class _Allocator>
   3760 basic_string<_CharT, _Traits, _Allocator>
   3761 operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
   3762 {
   3763     basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
   3764     typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
   3765     __r.__init(&__lhs, 1, 1 + __rhs_sz);
   3766     __r.append(__rhs.data(), __rhs_sz);
   3767     return __r;
   3768 }
   3769 
   3770 template<class _CharT, class _Traits, class _Allocator>
   3771 basic_string<_CharT, _Traits, _Allocator>
   3772 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
   3773 {
   3774     basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
   3775     typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
   3776     typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs);
   3777     __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
   3778     __r.append(__rhs, __rhs_sz);
   3779     return __r;
   3780 }
   3781 
   3782 template<class _CharT, class _Traits, class _Allocator>
   3783 basic_string<_CharT, _Traits, _Allocator>
   3784 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
   3785 {
   3786     basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
   3787     typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
   3788     __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
   3789     __r.push_back(__rhs);
   3790     return __r;
   3791 }
   3792 
   3793 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   3794 
   3795 template<class _CharT, class _Traits, class _Allocator>
   3796 _LIBCPP_INLINE_VISIBILITY inline
   3797 basic_string<_CharT, _Traits, _Allocator>
   3798 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
   3799 {
   3800     return _VSTD::move(__lhs.append(__rhs));
   3801 }
   3802 
   3803 template<class _CharT, class _Traits, class _Allocator>
   3804 _LIBCPP_INLINE_VISIBILITY inline
   3805 basic_string<_CharT, _Traits, _Allocator>
   3806 operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
   3807 {
   3808     return _VSTD::move(__rhs.insert(0, __lhs));
   3809 }
   3810 
   3811 template<class _CharT, class _Traits, class _Allocator>
   3812 _LIBCPP_INLINE_VISIBILITY inline
   3813 basic_string<_CharT, _Traits, _Allocator>
   3814 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
   3815 {
   3816     return _VSTD::move(__lhs.append(__rhs));
   3817 }
   3818 
   3819 template<class _CharT, class _Traits, class _Allocator>
   3820 _LIBCPP_INLINE_VISIBILITY inline
   3821 basic_string<_CharT, _Traits, _Allocator>
   3822 operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
   3823 {
   3824     return _VSTD::move(__rhs.insert(0, __lhs));
   3825 }
   3826 
   3827 template<class _CharT, class _Traits, class _Allocator>
   3828 _LIBCPP_INLINE_VISIBILITY inline
   3829 basic_string<_CharT, _Traits, _Allocator>
   3830 operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
   3831 {
   3832     __rhs.insert(__rhs.begin(), __lhs);
   3833     return _VSTD::move(__rhs);
   3834 }
   3835 
   3836 template<class _CharT, class _Traits, class _Allocator>
   3837 _LIBCPP_INLINE_VISIBILITY inline
   3838 basic_string<_CharT, _Traits, _Allocator>
   3839 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
   3840 {
   3841     return _VSTD::move(__lhs.append(__rhs));
   3842 }
   3843 
   3844 template<class _CharT, class _Traits, class _Allocator>
   3845 _LIBCPP_INLINE_VISIBILITY inline
   3846 basic_string<_CharT, _Traits, _Allocator>
   3847 operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
   3848 {
   3849     __lhs.push_back(__rhs);
   3850     return _VSTD::move(__lhs);
   3851 }
   3852 
   3853 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   3854 
   3855 // swap
   3856 
   3857 template<class _CharT, class _Traits, class _Allocator>
   3858 _LIBCPP_INLINE_VISIBILITY inline
   3859 void
   3860 swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
   3861      basic_string<_CharT, _Traits, _Allocator>& __rhs)
   3862      _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
   3863 {
   3864     __lhs.swap(__rhs);
   3865 }
   3866 
   3867 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
   3868 
   3869 typedef basic_string<char16_t> u16string;
   3870 typedef basic_string<char32_t> u32string;
   3871 
   3872 #endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
   3873 
   3874 int                stoi  (const string& __str, size_t* __idx = 0, int __base = 10);
   3875 long               stol  (const string& __str, size_t* __idx = 0, int __base = 10);
   3876 unsigned long      stoul (const string& __str, size_t* __idx = 0, int __base = 10);
   3877 long long          stoll (const string& __str, size_t* __idx = 0, int __base = 10);
   3878 unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10);
   3879 
   3880 float       stof (const string& __str, size_t* __idx = 0);
   3881 double      stod (const string& __str, size_t* __idx = 0);
   3882 long double stold(const string& __str, size_t* __idx = 0);
   3883 
   3884 string to_string(int __val);
   3885 string to_string(unsigned __val);
   3886 string to_string(long __val);
   3887 string to_string(unsigned long __val);
   3888 string to_string(long long __val);
   3889 string to_string(unsigned long long __val);
   3890 string to_string(float __val);
   3891 string to_string(double __val);
   3892 string to_string(long double __val);
   3893 
   3894 int                stoi  (const wstring& __str, size_t* __idx = 0, int __base = 10);
   3895 long               stol  (const wstring& __str, size_t* __idx = 0, int __base = 10);
   3896 unsigned long      stoul (const wstring& __str, size_t* __idx = 0, int __base = 10);
   3897 long long          stoll (const wstring& __str, size_t* __idx = 0, int __base = 10);
   3898 unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10);
   3899 
   3900 float       stof (const wstring& __str, size_t* __idx = 0);
   3901 double      stod (const wstring& __str, size_t* __idx = 0);
   3902 long double stold(const wstring& __str, size_t* __idx = 0);
   3903 
   3904 wstring to_wstring(int __val);
   3905 wstring to_wstring(unsigned __val);
   3906 wstring to_wstring(long __val);
   3907 wstring to_wstring(unsigned long __val);
   3908 wstring to_wstring(long long __val);
   3909 wstring to_wstring(unsigned long long __val);
   3910 wstring to_wstring(float __val);
   3911 wstring to_wstring(double __val);
   3912 wstring to_wstring(long double __val);
   3913 
   3914 template<class _CharT, class _Traits, class _Allocator>
   3915     const typename basic_string<_CharT, _Traits, _Allocator>::size_type
   3916                    basic_string<_CharT, _Traits, _Allocator>::npos;
   3917 
   3918 template<class _Ptr>
   3919 size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e)
   3920 {
   3921     typedef typename iterator_traits<_Ptr>::value_type value_type;
   3922     return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type));
   3923 }
   3924 
   3925 template<class _CharT, class _Traits, class _Allocator>
   3926 struct _LIBCPP_VISIBLE hash<basic_string<_CharT, _Traits, _Allocator> >
   3927     : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t>
   3928 {
   3929     size_t
   3930         operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT;
   3931 };
   3932 
   3933 template<class _CharT, class _Traits, class _Allocator>
   3934 size_t
   3935 hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(
   3936         const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT
   3937 {
   3938     return __do_string_hash(__val.data(), __val.data() + __val.size());
   3939 }
   3940 
   3941 template<class _CharT, class _Traits, class _Allocator>
   3942 basic_ostream<_CharT, _Traits>&
   3943 operator<<(basic_ostream<_CharT, _Traits>& __os,
   3944            const basic_string<_CharT, _Traits, _Allocator>& __str);
   3945 
   3946 template<class _CharT, class _Traits, class _Allocator>
   3947 basic_istream<_CharT, _Traits>&
   3948 operator>>(basic_istream<_CharT, _Traits>& __is,
   3949            basic_string<_CharT, _Traits, _Allocator>& __str);
   3950 
   3951 template<class _CharT, class _Traits, class _Allocator>
   3952 basic_istream<_CharT, _Traits>&
   3953 getline(basic_istream<_CharT, _Traits>& __is,
   3954         basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
   3955 
   3956 template<class _CharT, class _Traits, class _Allocator>
   3957 inline _LIBCPP_INLINE_VISIBILITY
   3958 basic_istream<_CharT, _Traits>&
   3959 getline(basic_istream<_CharT, _Traits>& __is,
   3960         basic_string<_CharT, _Traits, _Allocator>& __str);
   3961 
   3962 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   3963 
   3964 template<class _CharT, class _Traits, class _Allocator>
   3965 inline _LIBCPP_INLINE_VISIBILITY
   3966 basic_istream<_CharT, _Traits>&
   3967 getline(basic_istream<_CharT, _Traits>&& __is,
   3968         basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
   3969 
   3970 template<class _CharT, class _Traits, class _Allocator>
   3971 inline _LIBCPP_INLINE_VISIBILITY
   3972 basic_istream<_CharT, _Traits>&
   3973 getline(basic_istream<_CharT, _Traits>&& __is,
   3974         basic_string<_CharT, _Traits, _Allocator>& __str);
   3975 
   3976 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   3977 
   3978 _LIBCPP_EXTERN_TEMPLATE(class basic_string<char>)
   3979 _LIBCPP_EXTERN_TEMPLATE(class basic_string<wchar_t>)
   3980 
   3981 extern template
   3982     string
   3983     operator+<char, char_traits<char>, allocator<char> >(char const*, string const&);
   3984 
   3985 _LIBCPP_END_NAMESPACE_STD
   3986 
   3987 #endif  // _LIBCPP_STRING
   3988