xref: /freebsd/contrib/llvm-project/libcxx/include/string (revision 69ade1e033e478ec426cafc0ec2104d672de294a)
10b57cec5SDimitry Andric// -*- C++ -*-
20b57cec5SDimitry Andric//===--------------------------- string -----------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_STRING
110b57cec5SDimitry Andric#define _LIBCPP_STRING
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    string synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std
170b57cec5SDimitry Andric{
180b57cec5SDimitry Andric
190b57cec5SDimitry Andrictemplate <class stateT>
200b57cec5SDimitry Andricclass fpos
210b57cec5SDimitry Andric{
220b57cec5SDimitry Andricprivate:
230b57cec5SDimitry Andric    stateT st;
240b57cec5SDimitry Andricpublic:
250b57cec5SDimitry Andric    fpos(streamoff = streamoff());
260b57cec5SDimitry Andric
270b57cec5SDimitry Andric    operator streamoff() const;
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric    stateT state() const;
300b57cec5SDimitry Andric    void state(stateT);
310b57cec5SDimitry Andric
320b57cec5SDimitry Andric    fpos& operator+=(streamoff);
330b57cec5SDimitry Andric    fpos  operator+ (streamoff) const;
340b57cec5SDimitry Andric    fpos& operator-=(streamoff);
350b57cec5SDimitry Andric    fpos  operator- (streamoff) const;
360b57cec5SDimitry Andric};
370b57cec5SDimitry Andric
380b57cec5SDimitry Andrictemplate <class stateT> streamoff operator-(const fpos<stateT>& x, const fpos<stateT>& y);
390b57cec5SDimitry Andric
400b57cec5SDimitry Andrictemplate <class stateT> bool operator==(const fpos<stateT>& x, const fpos<stateT>& y);
410b57cec5SDimitry Andrictemplate <class stateT> bool operator!=(const fpos<stateT>& x, const fpos<stateT>& y);
420b57cec5SDimitry Andric
430b57cec5SDimitry Andrictemplate <class charT>
440b57cec5SDimitry Andricstruct char_traits
450b57cec5SDimitry Andric{
460b57cec5SDimitry Andric    typedef charT     char_type;
470b57cec5SDimitry Andric    typedef ...       int_type;
480b57cec5SDimitry Andric    typedef streamoff off_type;
490b57cec5SDimitry Andric    typedef streampos pos_type;
500b57cec5SDimitry Andric    typedef mbstate_t state_type;
510b57cec5SDimitry Andric
520b57cec5SDimitry Andric    static void assign(char_type& c1, const char_type& c2) noexcept;
530b57cec5SDimitry Andric    static constexpr bool eq(char_type c1, char_type c2) noexcept;
540b57cec5SDimitry Andric    static constexpr bool lt(char_type c1, char_type c2) noexcept;
550b57cec5SDimitry Andric
560b57cec5SDimitry Andric    static int              compare(const char_type* s1, const char_type* s2, size_t n);
570b57cec5SDimitry Andric    static size_t           length(const char_type* s);
580b57cec5SDimitry Andric    static const char_type* find(const char_type* s, size_t n, const char_type& a);
590b57cec5SDimitry Andric    static char_type*       move(char_type* s1, const char_type* s2, size_t n);
600b57cec5SDimitry Andric    static char_type*       copy(char_type* s1, const char_type* s2, size_t n);
610b57cec5SDimitry Andric    static char_type*       assign(char_type* s, size_t n, char_type a);
620b57cec5SDimitry Andric
630b57cec5SDimitry Andric    static constexpr int_type  not_eof(int_type c) noexcept;
640b57cec5SDimitry Andric    static constexpr char_type to_char_type(int_type c) noexcept;
650b57cec5SDimitry Andric    static constexpr int_type  to_int_type(char_type c) noexcept;
660b57cec5SDimitry Andric    static constexpr bool      eq_int_type(int_type c1, int_type c2) noexcept;
670b57cec5SDimitry Andric    static constexpr int_type  eof() noexcept;
680b57cec5SDimitry Andric};
690b57cec5SDimitry Andric
700b57cec5SDimitry Andrictemplate <> struct char_traits<char>;
710b57cec5SDimitry Andrictemplate <> struct char_traits<wchar_t>;
72fe6060f1SDimitry Andrictemplate <> struct char_traits<char8_t>;  // C++20
73fe6060f1SDimitry Andrictemplate <> struct char_traits<char16_t>;
74fe6060f1SDimitry Andrictemplate <> struct char_traits<char32_t>;
750b57cec5SDimitry Andric
760b57cec5SDimitry Andrictemplate<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
770b57cec5SDimitry Andricclass basic_string
780b57cec5SDimitry Andric{
790b57cec5SDimitry Andricpublic:
800b57cec5SDimitry Andric// types:
810b57cec5SDimitry Andric    typedef traits traits_type;
820b57cec5SDimitry Andric    typedef typename traits_type::char_type value_type;
830b57cec5SDimitry Andric    typedef Allocator allocator_type;
840b57cec5SDimitry Andric    typedef typename allocator_type::size_type size_type;
850b57cec5SDimitry Andric    typedef typename allocator_type::difference_type difference_type;
860b57cec5SDimitry Andric    typedef typename allocator_type::reference reference;
870b57cec5SDimitry Andric    typedef typename allocator_type::const_reference const_reference;
880b57cec5SDimitry Andric    typedef typename allocator_type::pointer pointer;
890b57cec5SDimitry Andric    typedef typename allocator_type::const_pointer const_pointer;
900b57cec5SDimitry Andric    typedef implementation-defined iterator;
910b57cec5SDimitry Andric    typedef implementation-defined const_iterator;
920b57cec5SDimitry Andric    typedef std::reverse_iterator<iterator> reverse_iterator;
930b57cec5SDimitry Andric    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
940b57cec5SDimitry Andric
950b57cec5SDimitry Andric    static const size_type npos = -1;
960b57cec5SDimitry Andric
970b57cec5SDimitry Andric    basic_string()
980b57cec5SDimitry Andric        noexcept(is_nothrow_default_constructible<allocator_type>::value);
990b57cec5SDimitry Andric    explicit basic_string(const allocator_type& a);
1000b57cec5SDimitry Andric    basic_string(const basic_string& str);
1010b57cec5SDimitry Andric    basic_string(basic_string&& str)
1020b57cec5SDimitry Andric        noexcept(is_nothrow_move_constructible<allocator_type>::value);
1030b57cec5SDimitry Andric    basic_string(const basic_string& str, size_type pos,
1040b57cec5SDimitry Andric                 const allocator_type& a = allocator_type());
1050b57cec5SDimitry Andric    basic_string(const basic_string& str, size_type pos, size_type n,
1060b57cec5SDimitry Andric                 const Allocator& a = Allocator());
1070b57cec5SDimitry Andric    template<class T>
1080b57cec5SDimitry Andric        basic_string(const T& t, size_type pos, size_type n, const Allocator& a = Allocator()); // C++17
1090b57cec5SDimitry Andric    template <class T>
1100b57cec5SDimitry Andric        explicit basic_string(const T& t, const Allocator& a = Allocator()); // C++17
1110b57cec5SDimitry Andric    basic_string(const value_type* s, const allocator_type& a = allocator_type());
1120b57cec5SDimitry Andric    basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type());
113fe6060f1SDimitry Andric    basic_string(nullptr_t) = delete; // C++2b
1140b57cec5SDimitry Andric    basic_string(size_type n, value_type c, const allocator_type& a = allocator_type());
1150b57cec5SDimitry Andric    template<class InputIterator>
1160b57cec5SDimitry Andric        basic_string(InputIterator begin, InputIterator end,
1170b57cec5SDimitry Andric                     const allocator_type& a = allocator_type());
1180b57cec5SDimitry Andric    basic_string(initializer_list<value_type>, const Allocator& = Allocator());
1190b57cec5SDimitry Andric    basic_string(const basic_string&, const Allocator&);
1200b57cec5SDimitry Andric    basic_string(basic_string&&, const Allocator&);
1210b57cec5SDimitry Andric
1220b57cec5SDimitry Andric    ~basic_string();
1230b57cec5SDimitry Andric
1240b57cec5SDimitry Andric    operator basic_string_view<charT, traits>() const noexcept;
1250b57cec5SDimitry Andric
1260b57cec5SDimitry Andric    basic_string& operator=(const basic_string& str);
1270b57cec5SDimitry Andric    template <class T>
1280b57cec5SDimitry Andric        basic_string& operator=(const T& t); // C++17
1290b57cec5SDimitry Andric    basic_string& operator=(basic_string&& str)
1300b57cec5SDimitry Andric        noexcept(
1310b57cec5SDimitry Andric             allocator_type::propagate_on_container_move_assignment::value ||
1320b57cec5SDimitry Andric             allocator_type::is_always_equal::value ); // C++17
1330b57cec5SDimitry Andric    basic_string& operator=(const value_type* s);
134fe6060f1SDimitry Andric    basic_string& operator=(nullptr_t) = delete; // C++2b
1350b57cec5SDimitry Andric    basic_string& operator=(value_type c);
1360b57cec5SDimitry Andric    basic_string& operator=(initializer_list<value_type>);
1370b57cec5SDimitry Andric
1380b57cec5SDimitry Andric    iterator       begin() noexcept;
1390b57cec5SDimitry Andric    const_iterator begin() const noexcept;
1400b57cec5SDimitry Andric    iterator       end() noexcept;
1410b57cec5SDimitry Andric    const_iterator end() const noexcept;
1420b57cec5SDimitry Andric
1430b57cec5SDimitry Andric    reverse_iterator       rbegin() noexcept;
1440b57cec5SDimitry Andric    const_reverse_iterator rbegin() const noexcept;
1450b57cec5SDimitry Andric    reverse_iterator       rend() noexcept;
1460b57cec5SDimitry Andric    const_reverse_iterator rend() const noexcept;
1470b57cec5SDimitry Andric
1480b57cec5SDimitry Andric    const_iterator         cbegin() const noexcept;
1490b57cec5SDimitry Andric    const_iterator         cend() const noexcept;
1500b57cec5SDimitry Andric    const_reverse_iterator crbegin() const noexcept;
1510b57cec5SDimitry Andric    const_reverse_iterator crend() const noexcept;
1520b57cec5SDimitry Andric
1530b57cec5SDimitry Andric    size_type size() const noexcept;
1540b57cec5SDimitry Andric    size_type length() const noexcept;
1550b57cec5SDimitry Andric    size_type max_size() const noexcept;
1560b57cec5SDimitry Andric    size_type capacity() const noexcept;
1570b57cec5SDimitry Andric
1580b57cec5SDimitry Andric    void resize(size_type n, value_type c);
1590b57cec5SDimitry Andric    void resize(size_type n);
1600b57cec5SDimitry Andric
161e8d8bef9SDimitry Andric    void reserve(size_type res_arg);
162e8d8bef9SDimitry Andric    void reserve(); // deprecated in C++20
1630b57cec5SDimitry Andric    void shrink_to_fit();
1640b57cec5SDimitry Andric    void clear() noexcept;
1650b57cec5SDimitry Andric    bool empty() const noexcept;
1660b57cec5SDimitry Andric
1670b57cec5SDimitry Andric    const_reference operator[](size_type pos) const;
1680b57cec5SDimitry Andric    reference       operator[](size_type pos);
1690b57cec5SDimitry Andric
1700b57cec5SDimitry Andric    const_reference at(size_type n) const;
1710b57cec5SDimitry Andric    reference       at(size_type n);
1720b57cec5SDimitry Andric
1730b57cec5SDimitry Andric    basic_string& operator+=(const basic_string& str);
1740b57cec5SDimitry Andric    template <class T>
1750b57cec5SDimitry Andric        basic_string& operator+=(const T& t);              // C++17
1760b57cec5SDimitry Andric    basic_string& operator+=(const value_type* s);
1770b57cec5SDimitry Andric    basic_string& operator+=(value_type c);
1780b57cec5SDimitry Andric    basic_string& operator+=(initializer_list<value_type>);
1790b57cec5SDimitry Andric
1800b57cec5SDimitry Andric    basic_string& append(const basic_string& str);
1810b57cec5SDimitry Andric    template <class T>
1820b57cec5SDimitry Andric        basic_string& append(const T& t);                 // C++17
1830b57cec5SDimitry Andric    basic_string& append(const basic_string& str, size_type pos, size_type n=npos); //C++14
1840b57cec5SDimitry Andric    template <class T>
1850b57cec5SDimitry Andric        basic_string& append(const T& t, size_type pos, size_type n=npos); // C++17
1860b57cec5SDimitry Andric    basic_string& append(const value_type* s, size_type n);
1870b57cec5SDimitry Andric    basic_string& append(const value_type* s);
1880b57cec5SDimitry Andric    basic_string& append(size_type n, value_type c);
1890b57cec5SDimitry Andric    template<class InputIterator>
1900b57cec5SDimitry Andric        basic_string& append(InputIterator first, InputIterator last);
1910b57cec5SDimitry Andric    basic_string& append(initializer_list<value_type>);
1920b57cec5SDimitry Andric
1930b57cec5SDimitry Andric    void push_back(value_type c);
1940b57cec5SDimitry Andric    void pop_back();
1950b57cec5SDimitry Andric    reference       front();
1960b57cec5SDimitry Andric    const_reference front() const;
1970b57cec5SDimitry Andric    reference       back();
1980b57cec5SDimitry Andric    const_reference back() const;
1990b57cec5SDimitry Andric
2000b57cec5SDimitry Andric    basic_string& assign(const basic_string& str);
2010b57cec5SDimitry Andric    template <class T>
2020b57cec5SDimitry Andric        basic_string& assign(const T& t);  // C++17
2030b57cec5SDimitry Andric    basic_string& assign(basic_string&& str);
2040b57cec5SDimitry Andric    basic_string& assign(const basic_string& str, size_type pos, size_type n=npos); // C++14
2050b57cec5SDimitry Andric    template <class T>
2060b57cec5SDimitry Andric        basic_string& assign(const T& t, size_type pos, size_type n=npos); // C++17
2070b57cec5SDimitry Andric    basic_string& assign(const value_type* s, size_type n);
2080b57cec5SDimitry Andric    basic_string& assign(const value_type* s);
2090b57cec5SDimitry Andric    basic_string& assign(size_type n, value_type c);
2100b57cec5SDimitry Andric    template<class InputIterator>
2110b57cec5SDimitry Andric        basic_string& assign(InputIterator first, InputIterator last);
2120b57cec5SDimitry Andric    basic_string& assign(initializer_list<value_type>);
2130b57cec5SDimitry Andric
2140b57cec5SDimitry Andric    basic_string& insert(size_type pos1, const basic_string& str);
2150b57cec5SDimitry Andric    template <class T>
2160b57cec5SDimitry Andric        basic_string& insert(size_type pos1, const T& t);
2170b57cec5SDimitry Andric    basic_string& insert(size_type pos1, const basic_string& str,
2180b57cec5SDimitry Andric                         size_type pos2, size_type n);
2190b57cec5SDimitry Andric    template <class T>
2200b57cec5SDimitry Andric        basic_string& insert(size_type pos1, const T& t, size_type pos2, size_type n); // C++17
2210b57cec5SDimitry Andric    basic_string& insert(size_type pos, const value_type* s, size_type n=npos); //C++14
2220b57cec5SDimitry Andric    basic_string& insert(size_type pos, const value_type* s);
2230b57cec5SDimitry Andric    basic_string& insert(size_type pos, size_type n, value_type c);
2240b57cec5SDimitry Andric    iterator      insert(const_iterator p, value_type c);
2250b57cec5SDimitry Andric    iterator      insert(const_iterator p, size_type n, value_type c);
2260b57cec5SDimitry Andric    template<class InputIterator>
2270b57cec5SDimitry Andric        iterator insert(const_iterator p, InputIterator first, InputIterator last);
2280b57cec5SDimitry Andric    iterator      insert(const_iterator p, initializer_list<value_type>);
2290b57cec5SDimitry Andric
2300b57cec5SDimitry Andric    basic_string& erase(size_type pos = 0, size_type n = npos);
2310b57cec5SDimitry Andric    iterator      erase(const_iterator position);
2320b57cec5SDimitry Andric    iterator      erase(const_iterator first, const_iterator last);
2330b57cec5SDimitry Andric
2340b57cec5SDimitry Andric    basic_string& replace(size_type pos1, size_type n1, const basic_string& str);
2350b57cec5SDimitry Andric    template <class T>
2360b57cec5SDimitry Andric    basic_string& replace(size_type pos1, size_type n1, const T& t);  // C++17
2370b57cec5SDimitry Andric    basic_string& replace(size_type pos1, size_type n1, const basic_string& str,
2380b57cec5SDimitry Andric                          size_type pos2, size_type n2=npos); // C++14
2390b57cec5SDimitry Andric    template <class T>
2400b57cec5SDimitry Andric        basic_string& replace(size_type pos1, size_type n1, const T& t,
2410b57cec5SDimitry Andric                              size_type pos2, size_type n); // C++17
2420b57cec5SDimitry Andric    basic_string& replace(size_type pos, size_type n1, const value_type* s, size_type n2);
2430b57cec5SDimitry Andric    basic_string& replace(size_type pos, size_type n1, const value_type* s);
2440b57cec5SDimitry Andric    basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c);
2450b57cec5SDimitry Andric    basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str);
2460b57cec5SDimitry Andric    template <class T>
2470b57cec5SDimitry Andric        basic_string& replace(const_iterator i1, const_iterator i2, const T& t);  // C++17
2480b57cec5SDimitry Andric    basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n);
2490b57cec5SDimitry Andric    basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s);
2500b57cec5SDimitry Andric    basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c);
2510b57cec5SDimitry Andric    template<class InputIterator>
2520b57cec5SDimitry Andric        basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
2530b57cec5SDimitry Andric    basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>);
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andric    size_type copy(value_type* s, size_type n, size_type pos = 0) const;
2560b57cec5SDimitry Andric    basic_string substr(size_type pos = 0, size_type n = npos) const;
2570b57cec5SDimitry Andric
2580b57cec5SDimitry Andric    void swap(basic_string& str)
2590b57cec5SDimitry Andric        noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
2600b57cec5SDimitry Andric                 allocator_traits<allocator_type>::is_always_equal::value);  // C++17
2610b57cec5SDimitry Andric
2620b57cec5SDimitry Andric    const value_type* c_str() const noexcept;
2630b57cec5SDimitry Andric    const value_type* data() const noexcept;
2640b57cec5SDimitry Andric          value_type* data()       noexcept;   // C++17
2650b57cec5SDimitry Andric
2660b57cec5SDimitry Andric    allocator_type get_allocator() const noexcept;
2670b57cec5SDimitry Andric
2680b57cec5SDimitry Andric    size_type find(const basic_string& str, size_type pos = 0) const noexcept;
2690b57cec5SDimitry Andric    template <class T>
270fe6060f1SDimitry Andric        size_type find(const T& t, size_type pos = 0) const noexcept; // C++17, noexcept as an extension
2710b57cec5SDimitry Andric    size_type find(const value_type* s, size_type pos, size_type n) const noexcept;
2720b57cec5SDimitry Andric    size_type find(const value_type* s, size_type pos = 0) const noexcept;
2730b57cec5SDimitry Andric    size_type find(value_type c, size_type pos = 0) const noexcept;
2740b57cec5SDimitry Andric
2750b57cec5SDimitry Andric    size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
2760b57cec5SDimitry Andric    template <class T>
277fe6060f1SDimitry Andric        size_type rfind(const T& t, size_type pos = npos) const noexcept; // C++17, noexcept as an extension
2780b57cec5SDimitry Andric    size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept;
2790b57cec5SDimitry Andric    size_type rfind(const value_type* s, size_type pos = npos) const noexcept;
2800b57cec5SDimitry Andric    size_type rfind(value_type c, size_type pos = npos) const noexcept;
2810b57cec5SDimitry Andric
2820b57cec5SDimitry Andric    size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
2830b57cec5SDimitry Andric    template <class T>
284fe6060f1SDimitry Andric        size_type find_first_of(const T& t, size_type pos = 0) const noexcept; // C++17, noexcept as an extension
2850b57cec5SDimitry Andric    size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept;
2860b57cec5SDimitry Andric    size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept;
2870b57cec5SDimitry Andric    size_type find_first_of(value_type c, size_type pos = 0) const noexcept;
2880b57cec5SDimitry Andric
2890b57cec5SDimitry Andric    size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept;
2900b57cec5SDimitry Andric    template <class T>
291fe6060f1SDimitry Andric        size_type find_last_of(const T& t, size_type pos = npos) const noexcept noexcept; // C++17, noexcept as an extension
2920b57cec5SDimitry Andric    size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept;
2930b57cec5SDimitry Andric    size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept;
2940b57cec5SDimitry Andric    size_type find_last_of(value_type c, size_type pos = npos) const noexcept;
2950b57cec5SDimitry Andric
2960b57cec5SDimitry Andric    size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;
2970b57cec5SDimitry Andric    template <class T>
298fe6060f1SDimitry Andric        size_type find_first_not_of(const T& t, size_type pos = 0) const noexcept; // C++17, noexcept as an extension
2990b57cec5SDimitry Andric    size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
3000b57cec5SDimitry Andric    size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept;
3010b57cec5SDimitry Andric    size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept;
3020b57cec5SDimitry Andric
3030b57cec5SDimitry Andric    size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept;
3040b57cec5SDimitry Andric    template <class T>
305fe6060f1SDimitry Andric        size_type find_last_not_of(const T& t, size_type pos = npos) const noexcept; // C++17, noexcept as an extension
3060b57cec5SDimitry Andric    size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
3070b57cec5SDimitry Andric    size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept;
3080b57cec5SDimitry Andric    size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept;
3090b57cec5SDimitry Andric
3100b57cec5SDimitry Andric    int compare(const basic_string& str) const noexcept;
3110b57cec5SDimitry Andric    template <class T>
312fe6060f1SDimitry Andric        int compare(const T& t) const noexcept;  // C++17, noexcept as an extension
3130b57cec5SDimitry Andric    int compare(size_type pos1, size_type n1, const basic_string& str) const;
3140b57cec5SDimitry Andric    template <class T>
3150b57cec5SDimitry Andric        int compare(size_type pos1, size_type n1, const T& t) const;  // C++17
3160b57cec5SDimitry Andric    int compare(size_type pos1, size_type n1, const basic_string& str,
3170b57cec5SDimitry Andric                size_type pos2, size_type n2=npos) const; // C++14
3180b57cec5SDimitry Andric    template <class T>
3190b57cec5SDimitry Andric        int compare(size_type pos1, size_type n1, const T& t,
3200b57cec5SDimitry Andric                    size_type pos2, size_type n2=npos) const; // C++17
3210b57cec5SDimitry Andric    int compare(const value_type* s) const noexcept;
3220b57cec5SDimitry Andric    int compare(size_type pos1, size_type n1, const value_type* s) const;
3230b57cec5SDimitry Andric    int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const;
3240b57cec5SDimitry Andric
325e8d8bef9SDimitry Andric    bool starts_with(basic_string_view<charT, traits> sv) const noexcept; // C++20
326e8d8bef9SDimitry Andric    bool starts_with(charT c) const noexcept;                             // C++20
327e8d8bef9SDimitry Andric    bool starts_with(const charT* s) const;                               // C++20
328e8d8bef9SDimitry Andric    bool ends_with(basic_string_view<charT, traits> sv) const noexcept;   // C++20
329e8d8bef9SDimitry Andric    bool ends_with(charT c) const noexcept;                               // C++20
330e8d8bef9SDimitry Andric    bool ends_with(const charT* s) const;                                 // C++20
331e8d8bef9SDimitry Andric
332e8d8bef9SDimitry Andric    constexpr bool contains(basic_string_view<charT, traits> sv) const noexcept; // C++2b
333e8d8bef9SDimitry Andric    constexpr bool contains(charT c) const noexcept;                             // C++2b
334e8d8bef9SDimitry Andric    constexpr bool contains(const charT* s) const;                               // C++2b
3350b57cec5SDimitry Andric
3360b57cec5SDimitry Andric    bool __invariants() const;
3370b57cec5SDimitry Andric};
3380b57cec5SDimitry Andric
3390b57cec5SDimitry Andrictemplate<class InputIterator,
3400b57cec5SDimitry Andric         class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
3410b57cec5SDimitry Andricbasic_string(InputIterator, InputIterator, Allocator = Allocator())
3420b57cec5SDimitry Andric   -> basic_string<typename iterator_traits<InputIterator>::value_type,
3430b57cec5SDimitry Andric                  char_traits<typename iterator_traits<InputIterator>::value_type>,
3440b57cec5SDimitry Andric                  Allocator>;   // C++17
3450b57cec5SDimitry Andric
3460b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3470b57cec5SDimitry Andricbasic_string<charT, traits, Allocator>
3480b57cec5SDimitry Andricoperator+(const basic_string<charT, traits, Allocator>& lhs,
3490b57cec5SDimitry Andric          const basic_string<charT, traits, Allocator>& rhs);
3500b57cec5SDimitry Andric
3510b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3520b57cec5SDimitry Andricbasic_string<charT, traits, Allocator>
3530b57cec5SDimitry Andricoperator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs);
3540b57cec5SDimitry Andric
3550b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3560b57cec5SDimitry Andricbasic_string<charT, traits, Allocator>
3570b57cec5SDimitry Andricoperator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs);
3580b57cec5SDimitry Andric
3590b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3600b57cec5SDimitry Andricbasic_string<charT, traits, Allocator>
3610b57cec5SDimitry Andricoperator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
3620b57cec5SDimitry Andric
3630b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3640b57cec5SDimitry Andricbasic_string<charT, traits, Allocator>
3650b57cec5SDimitry Andricoperator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs);
3660b57cec5SDimitry Andric
3670b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3680b57cec5SDimitry Andricbool operator==(const basic_string<charT, traits, Allocator>& lhs,
3690b57cec5SDimitry Andric                const basic_string<charT, traits, Allocator>& rhs) noexcept;
3700b57cec5SDimitry Andric
3710b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3720b57cec5SDimitry Andricbool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3750b57cec5SDimitry Andricbool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept;
3760b57cec5SDimitry Andric
3770b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3780b57cec5SDimitry Andricbool operator!=(const basic_string<charT,traits,Allocator>& lhs,
3790b57cec5SDimitry Andric                const basic_string<charT, traits, Allocator>& rhs) noexcept;
3800b57cec5SDimitry Andric
3810b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3820b57cec5SDimitry Andricbool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
3830b57cec5SDimitry Andric
3840b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3850b57cec5SDimitry Andricbool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3880b57cec5SDimitry Andricbool operator< (const basic_string<charT, traits, Allocator>& lhs,
3890b57cec5SDimitry Andric                const basic_string<charT, traits, Allocator>& rhs) noexcept;
3900b57cec5SDimitry Andric
3910b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3920b57cec5SDimitry Andricbool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
3930b57cec5SDimitry Andric
3940b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3950b57cec5SDimitry Andricbool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
3960b57cec5SDimitry Andric
3970b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
3980b57cec5SDimitry Andricbool operator> (const basic_string<charT, traits, Allocator>& lhs,
3990b57cec5SDimitry Andric                const basic_string<charT, traits, Allocator>& rhs) noexcept;
4000b57cec5SDimitry Andric
4010b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4020b57cec5SDimitry Andricbool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
4030b57cec5SDimitry Andric
4040b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4050b57cec5SDimitry Andricbool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
4060b57cec5SDimitry Andric
4070b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4080b57cec5SDimitry Andricbool operator<=(const basic_string<charT, traits, Allocator>& lhs,
4090b57cec5SDimitry Andric                const basic_string<charT, traits, Allocator>& rhs) noexcept;
4100b57cec5SDimitry Andric
4110b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4120b57cec5SDimitry Andricbool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
4130b57cec5SDimitry Andric
4140b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4150b57cec5SDimitry Andricbool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
4160b57cec5SDimitry Andric
4170b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4180b57cec5SDimitry Andricbool operator>=(const basic_string<charT, traits, Allocator>& lhs,
4190b57cec5SDimitry Andric                const basic_string<charT, traits, Allocator>& rhs) noexcept;
4200b57cec5SDimitry Andric
4210b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4220b57cec5SDimitry Andricbool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
4230b57cec5SDimitry Andric
4240b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4250b57cec5SDimitry Andricbool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
4260b57cec5SDimitry Andric
4270b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4280b57cec5SDimitry Andricvoid swap(basic_string<charT, traits, Allocator>& lhs,
4290b57cec5SDimitry Andric          basic_string<charT, traits, Allocator>& rhs)
4300b57cec5SDimitry Andric            noexcept(noexcept(lhs.swap(rhs)));
4310b57cec5SDimitry Andric
4320b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4330b57cec5SDimitry Andricbasic_istream<charT, traits>&
4340b57cec5SDimitry Andricoperator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
4350b57cec5SDimitry Andric
4360b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4370b57cec5SDimitry Andricbasic_ostream<charT, traits>&
4380b57cec5SDimitry Andricoperator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
4390b57cec5SDimitry Andric
4400b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4410b57cec5SDimitry Andricbasic_istream<charT, traits>&
4420b57cec5SDimitry Andricgetline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str,
4430b57cec5SDimitry Andric        charT delim);
4440b57cec5SDimitry Andric
4450b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator>
4460b57cec5SDimitry Andricbasic_istream<charT, traits>&
4470b57cec5SDimitry Andricgetline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
4480b57cec5SDimitry Andric
4490b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator, class U>
4505ffd83dbSDimitry Andrictypename basic_string<charT, traits, Allocator>::size_type
4515ffd83dbSDimitry Andricerase(basic_string<charT, traits, Allocator>& c, const U& value);    // C++20
4520b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator, class Predicate>
4535ffd83dbSDimitry Andrictypename basic_string<charT, traits, Allocator>::size_type
4545ffd83dbSDimitry Andricerase_if(basic_string<charT, traits, Allocator>& c, Predicate pred); // C++20
4550b57cec5SDimitry Andric
4560b57cec5SDimitry Andrictypedef basic_string<char>    string;
4570b57cec5SDimitry Andrictypedef basic_string<wchar_t> wstring;
458fe6060f1SDimitry Andrictypedef basic_string<char8_t> u8string; // C++20
4590b57cec5SDimitry Andrictypedef basic_string<char16_t> u16string;
4600b57cec5SDimitry Andrictypedef basic_string<char32_t> u32string;
4610b57cec5SDimitry Andric
462e8d8bef9SDimitry Andricint                stoi  (const string& str, size_t* idx = nullptr, int base = 10);
463e8d8bef9SDimitry Andriclong               stol  (const string& str, size_t* idx = nullptr, int base = 10);
464e8d8bef9SDimitry Andricunsigned long      stoul (const string& str, size_t* idx = nullptr, int base = 10);
465e8d8bef9SDimitry Andriclong long          stoll (const string& str, size_t* idx = nullptr, int base = 10);
466e8d8bef9SDimitry Andricunsigned long long stoull(const string& str, size_t* idx = nullptr, int base = 10);
4670b57cec5SDimitry Andric
468e8d8bef9SDimitry Andricfloat       stof (const string& str, size_t* idx = nullptr);
469e8d8bef9SDimitry Andricdouble      stod (const string& str, size_t* idx = nullptr);
470e8d8bef9SDimitry Andriclong double stold(const string& str, size_t* idx = nullptr);
4710b57cec5SDimitry Andric
4720b57cec5SDimitry Andricstring to_string(int val);
4730b57cec5SDimitry Andricstring to_string(unsigned val);
4740b57cec5SDimitry Andricstring to_string(long val);
4750b57cec5SDimitry Andricstring to_string(unsigned long val);
4760b57cec5SDimitry Andricstring to_string(long long val);
4770b57cec5SDimitry Andricstring to_string(unsigned long long val);
4780b57cec5SDimitry Andricstring to_string(float val);
4790b57cec5SDimitry Andricstring to_string(double val);
4800b57cec5SDimitry Andricstring to_string(long double val);
4810b57cec5SDimitry Andric
482e8d8bef9SDimitry Andricint                stoi  (const wstring& str, size_t* idx = nullptr, int base = 10);
483e8d8bef9SDimitry Andriclong               stol  (const wstring& str, size_t* idx = nullptr, int base = 10);
484e8d8bef9SDimitry Andricunsigned long      stoul (const wstring& str, size_t* idx = nullptr, int base = 10);
485e8d8bef9SDimitry Andriclong long          stoll (const wstring& str, size_t* idx = nullptr, int base = 10);
486e8d8bef9SDimitry Andricunsigned long long stoull(const wstring& str, size_t* idx = nullptr, int base = 10);
4870b57cec5SDimitry Andric
488e8d8bef9SDimitry Andricfloat       stof (const wstring& str, size_t* idx = nullptr);
489e8d8bef9SDimitry Andricdouble      stod (const wstring& str, size_t* idx = nullptr);
490e8d8bef9SDimitry Andriclong double stold(const wstring& str, size_t* idx = nullptr);
4910b57cec5SDimitry Andric
4920b57cec5SDimitry Andricwstring to_wstring(int val);
4930b57cec5SDimitry Andricwstring to_wstring(unsigned val);
4940b57cec5SDimitry Andricwstring to_wstring(long val);
4950b57cec5SDimitry Andricwstring to_wstring(unsigned long val);
4960b57cec5SDimitry Andricwstring to_wstring(long long val);
4970b57cec5SDimitry Andricwstring to_wstring(unsigned long long val);
4980b57cec5SDimitry Andricwstring to_wstring(float val);
4990b57cec5SDimitry Andricwstring to_wstring(double val);
5000b57cec5SDimitry Andricwstring to_wstring(long double val);
5010b57cec5SDimitry Andric
5020b57cec5SDimitry Andrictemplate <> struct hash<string>;
503fe6060f1SDimitry Andrictemplate <> struct hash<u8string>; // C++20
5040b57cec5SDimitry Andrictemplate <> struct hash<u16string>;
5050b57cec5SDimitry Andrictemplate <> struct hash<u32string>;
5060b57cec5SDimitry Andrictemplate <> struct hash<wstring>;
5070b57cec5SDimitry Andric
5080b57cec5SDimitry Andricbasic_string<char>     operator "" s( const char *str,     size_t len ); // C++14
5090b57cec5SDimitry Andricbasic_string<wchar_t>  operator "" s( const wchar_t *str,  size_t len ); // C++14
510fe6060f1SDimitry Andricbasic_string<char8_t>  operator "" s( const char8_t *str,  size_t len ); // C++20
5110b57cec5SDimitry Andricbasic_string<char16_t> operator "" s( const char16_t *str, size_t len ); // C++14
5120b57cec5SDimitry Andricbasic_string<char32_t> operator "" s( const char32_t *str, size_t len ); // C++14
5130b57cec5SDimitry Andric
5140b57cec5SDimitry Andric}  // std
5150b57cec5SDimitry Andric
5160b57cec5SDimitry Andric*/
5170b57cec5SDimitry Andric
5180b57cec5SDimitry Andric#include <__config>
519fe6060f1SDimitry Andric#include <__debug>
520fe6060f1SDimitry Andric#include <__functional_base>
521fe6060f1SDimitry Andric#include <__iterator/wrap_iter.h>
5220b57cec5SDimitry Andric#include <algorithm>
523fe6060f1SDimitry Andric#include <compare>
524fe6060f1SDimitry Andric#include <cstdio>  // EOF
525*69ade1e0SDimitry Andric#include <cstdlib>
526fe6060f1SDimitry Andric#include <cstring>
527fe6060f1SDimitry Andric#include <cwchar>
528fe6060f1SDimitry Andric#include <initializer_list>
529fe6060f1SDimitry Andric#include <iosfwd>
5300b57cec5SDimitry Andric#include <iterator>
5310b57cec5SDimitry Andric#include <memory>
5320b57cec5SDimitry Andric#include <stdexcept>
533fe6060f1SDimitry Andric#include <string_view>
5340b57cec5SDimitry Andric#include <type_traits>
535fe6060f1SDimitry Andric#include <utility>
5360b57cec5SDimitry Andric#include <version>
537fe6060f1SDimitry Andric
5380b57cec5SDimitry Andric#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
5390b57cec5SDimitry Andric# include <cstdint>
5400b57cec5SDimitry Andric#endif
5410b57cec5SDimitry Andric
5420b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
5430b57cec5SDimitry Andric#pragma GCC system_header
5440b57cec5SDimitry Andric#endif
5450b57cec5SDimitry Andric
5460b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS
5470b57cec5SDimitry Andric#include <__undef_macros>
5480b57cec5SDimitry Andric
5490b57cec5SDimitry Andric
5500b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
5510b57cec5SDimitry Andric
5520b57cec5SDimitry Andric// fpos
5530b57cec5SDimitry Andric
5540b57cec5SDimitry Andrictemplate <class _StateT>
5550b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS fpos
5560b57cec5SDimitry Andric{
5570b57cec5SDimitry Andricprivate:
5580b57cec5SDimitry Andric    _StateT __st_;
5590b57cec5SDimitry Andric    streamoff __off_;
5600b57cec5SDimitry Andricpublic:
5610b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {}
5620b57cec5SDimitry Andric
5630b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;}
5640b57cec5SDimitry Andric
5650b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;}
5660b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;}
5670b57cec5SDimitry Andric
5680b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;}
5690b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY fpos  operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;}
5700b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY fpos& operator-=(streamoff __off) {__off_ -= __off; return *this;}
5710b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY fpos  operator- (streamoff __off) const {fpos __t(*this); __t -= __off; return __t;}
5720b57cec5SDimitry Andric};
5730b57cec5SDimitry Andric
5740b57cec5SDimitry Andrictemplate <class _StateT>
5750b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5760b57cec5SDimitry Andricstreamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
5770b57cec5SDimitry Andric    {return streamoff(__x) - streamoff(__y);}
5780b57cec5SDimitry Andric
5790b57cec5SDimitry Andrictemplate <class _StateT>
5800b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5810b57cec5SDimitry Andricbool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
5820b57cec5SDimitry Andric    {return streamoff(__x) == streamoff(__y);}
5830b57cec5SDimitry Andric
5840b57cec5SDimitry Andrictemplate <class _StateT>
5850b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
5860b57cec5SDimitry Andricbool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
5870b57cec5SDimitry Andric    {return streamoff(__x) != streamoff(__y);}
5880b57cec5SDimitry Andric
5890b57cec5SDimitry Andric// basic_string
5900b57cec5SDimitry Andric
5910b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
5920b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
5930b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
5940b57cec5SDimitry Andric          const basic_string<_CharT, _Traits, _Allocator>& __y);
5950b57cec5SDimitry Andric
5960b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
5970b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
5980b57cec5SDimitry Andricoperator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
5990b57cec5SDimitry Andric
6000b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
6010b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
6020b57cec5SDimitry Andricoperator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
6030b57cec5SDimitry Andric
6040b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
6050b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
6060b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
6070b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
6080b57cec5SDimitry Andric
6090b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
6100b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
6110b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
6120b57cec5SDimitry Andric
6130b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
6140b57cec5SDimitry Andric
6150b57cec5SDimitry Andrictemplate <bool>
6160b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS __basic_string_common
6170b57cec5SDimitry Andric{
6180b57cec5SDimitry Andricprotected:
6190b57cec5SDimitry Andric    _LIBCPP_NORETURN void __throw_length_error() const;
6200b57cec5SDimitry Andric    _LIBCPP_NORETURN void __throw_out_of_range() const;
6210b57cec5SDimitry Andric};
6220b57cec5SDimitry Andric
6230b57cec5SDimitry Andrictemplate <bool __b>
6240b57cec5SDimitry Andricvoid
6250b57cec5SDimitry Andric__basic_string_common<__b>::__throw_length_error() const
6260b57cec5SDimitry Andric{
6270b57cec5SDimitry Andric    _VSTD::__throw_length_error("basic_string");
6280b57cec5SDimitry Andric}
6290b57cec5SDimitry Andric
6300b57cec5SDimitry Andrictemplate <bool __b>
6310b57cec5SDimitry Andricvoid
6320b57cec5SDimitry Andric__basic_string_common<__b>::__throw_out_of_range() const
6330b57cec5SDimitry Andric{
6340b57cec5SDimitry Andric    _VSTD::__throw_out_of_range("basic_string");
6350b57cec5SDimitry Andric}
6360b57cec5SDimitry Andric
6370b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __basic_string_common<true>)
6380b57cec5SDimitry Andric
6390b57cec5SDimitry Andrictemplate <class _Iter>
640fe6060f1SDimitry Andricstruct __string_is_trivial_iterator : public false_type {};
641fe6060f1SDimitry Andric
642fe6060f1SDimitry Andrictemplate <class _Tp>
643fe6060f1SDimitry Andricstruct __string_is_trivial_iterator<_Tp*>
644fe6060f1SDimitry Andric    : public is_arithmetic<_Tp> {};
6450b57cec5SDimitry Andric
6460b57cec5SDimitry Andrictemplate <class _Iter>
647fe6060f1SDimitry Andricstruct __string_is_trivial_iterator<__wrap_iter<_Iter> >
648fe6060f1SDimitry Andric    : public __string_is_trivial_iterator<_Iter> {};
6490b57cec5SDimitry Andric
6500b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Tp>
6515ffd83dbSDimitry Andricstruct __can_be_converted_to_string_view : public _BoolConstant<
6525ffd83dbSDimitry Andric      is_convertible<const _Tp&, basic_string_view<_CharT, _Traits> >::value &&
6535ffd83dbSDimitry Andric     !is_convertible<const _Tp&, const _CharT*>::value
6545ffd83dbSDimitry Andric    > {};
6550b57cec5SDimitry Andric
6560b57cec5SDimitry Andric#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
6570b57cec5SDimitry Andric
6580b57cec5SDimitry Andrictemplate <class _CharT, size_t = sizeof(_CharT)>
6590b57cec5SDimitry Andricstruct __padding
6600b57cec5SDimitry Andric{
6610b57cec5SDimitry Andric    unsigned char __xx[sizeof(_CharT)-1];
6620b57cec5SDimitry Andric};
6630b57cec5SDimitry Andric
6640b57cec5SDimitry Andrictemplate <class _CharT>
6650b57cec5SDimitry Andricstruct __padding<_CharT, 1>
6660b57cec5SDimitry Andric{
6670b57cec5SDimitry Andric};
6680b57cec5SDimitry Andric
6690b57cec5SDimitry Andric#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
6700b57cec5SDimitry Andric
671fe6060f1SDimitry Andric#ifndef _LIBCPP_HAS_NO_CHAR8_T
672e8d8bef9SDimitry Andrictypedef basic_string<char8_t> u8string;
673e8d8bef9SDimitry Andric#endif
674e8d8bef9SDimitry Andric
675e8d8bef9SDimitry Andric#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
676e8d8bef9SDimitry Andrictypedef basic_string<char16_t> u16string;
677e8d8bef9SDimitry Andrictypedef basic_string<char32_t> u32string;
678e8d8bef9SDimitry Andric#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
679e8d8bef9SDimitry Andric
6800b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
681e8d8bef9SDimitry Andricclass
682e8d8bef9SDimitry Andric    _LIBCPP_TEMPLATE_VIS
683fe6060f1SDimitry Andric#ifndef _LIBCPP_HAS_NO_CHAR8_T
684e8d8bef9SDimitry Andric    _LIBCPP_PREFERRED_NAME(u8string)
685e8d8bef9SDimitry Andric#endif
686e8d8bef9SDimitry Andric#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
687e8d8bef9SDimitry Andric    _LIBCPP_PREFERRED_NAME(u16string)
688e8d8bef9SDimitry Andric    _LIBCPP_PREFERRED_NAME(u32string)
689e8d8bef9SDimitry Andric#endif
690e8d8bef9SDimitry Andric    basic_string
6910b57cec5SDimitry Andric    : private __basic_string_common<true>
6920b57cec5SDimitry Andric{
6930b57cec5SDimitry Andricpublic:
6940b57cec5SDimitry Andric    typedef basic_string                                 __self;
6950b57cec5SDimitry Andric    typedef basic_string_view<_CharT, _Traits>           __self_view;
6960b57cec5SDimitry Andric    typedef _Traits                                      traits_type;
6970b57cec5SDimitry Andric    typedef _CharT                                       value_type;
6980b57cec5SDimitry Andric    typedef _Allocator                                   allocator_type;
6990b57cec5SDimitry Andric    typedef allocator_traits<allocator_type>             __alloc_traits;
7000b57cec5SDimitry Andric    typedef typename __alloc_traits::size_type           size_type;
7010b57cec5SDimitry Andric    typedef typename __alloc_traits::difference_type     difference_type;
7020b57cec5SDimitry Andric    typedef value_type&                                  reference;
7030b57cec5SDimitry Andric    typedef const value_type&                            const_reference;
7040b57cec5SDimitry Andric    typedef typename __alloc_traits::pointer             pointer;
7050b57cec5SDimitry Andric    typedef typename __alloc_traits::const_pointer       const_pointer;
7060b57cec5SDimitry Andric
7070b57cec5SDimitry Andric    static_assert((!is_array<value_type>::value), "Character type of basic_string must not be an array");
7080b57cec5SDimitry Andric    static_assert(( is_standard_layout<value_type>::value), "Character type of basic_string must be standard-layout");
7090b57cec5SDimitry Andric    static_assert(( is_trivial<value_type>::value), "Character type of basic_string must be trivial");
7100b57cec5SDimitry Andric    static_assert(( is_same<_CharT, typename traits_type::char_type>::value),
7110b57cec5SDimitry Andric                  "traits_type::char_type must be the same type as CharT");
7120b57cec5SDimitry Andric    static_assert(( is_same<typename allocator_type::value_type, value_type>::value),
7130b57cec5SDimitry Andric                  "Allocator::value_type must be same type as value_type");
7140b57cec5SDimitry Andric
7150b57cec5SDimitry Andric    typedef __wrap_iter<pointer>                         iterator;
7160b57cec5SDimitry Andric    typedef __wrap_iter<const_pointer>                   const_iterator;
7170b57cec5SDimitry Andric    typedef _VSTD::reverse_iterator<iterator>             reverse_iterator;
7180b57cec5SDimitry Andric    typedef _VSTD::reverse_iterator<const_iterator>       const_reverse_iterator;
7190b57cec5SDimitry Andric
7200b57cec5SDimitry Andricprivate:
7210b57cec5SDimitry Andric
7220b57cec5SDimitry Andric#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
7230b57cec5SDimitry Andric
7240b57cec5SDimitry Andric    struct __long
7250b57cec5SDimitry Andric    {
7260b57cec5SDimitry Andric        pointer   __data_;
7270b57cec5SDimitry Andric        size_type __size_;
7280b57cec5SDimitry Andric        size_type __cap_;
7290b57cec5SDimitry Andric    };
7300b57cec5SDimitry Andric
7310b57cec5SDimitry Andric#ifdef _LIBCPP_BIG_ENDIAN
7320b57cec5SDimitry Andric    static const size_type __short_mask = 0x01;
7330b57cec5SDimitry Andric    static const size_type __long_mask  = 0x1ul;
7340b57cec5SDimitry Andric#else  // _LIBCPP_BIG_ENDIAN
7350b57cec5SDimitry Andric    static const size_type __short_mask = 0x80;
7360b57cec5SDimitry Andric    static const size_type __long_mask  = ~(size_type(~0) >> 1);
7370b57cec5SDimitry Andric#endif // _LIBCPP_BIG_ENDIAN
7380b57cec5SDimitry Andric
7390b57cec5SDimitry Andric    enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
7400b57cec5SDimitry Andric                      (sizeof(__long) - 1)/sizeof(value_type) : 2};
7410b57cec5SDimitry Andric
7420b57cec5SDimitry Andric    struct __short
7430b57cec5SDimitry Andric    {
7440b57cec5SDimitry Andric        value_type __data_[__min_cap];
7450b57cec5SDimitry Andric        struct
7460b57cec5SDimitry Andric            : __padding<value_type>
7470b57cec5SDimitry Andric        {
7480b57cec5SDimitry Andric            unsigned char __size_;
7490b57cec5SDimitry Andric        };
7500b57cec5SDimitry Andric    };
7510b57cec5SDimitry Andric
7520b57cec5SDimitry Andric#else
7530b57cec5SDimitry Andric
7540b57cec5SDimitry Andric    struct __long
7550b57cec5SDimitry Andric    {
7560b57cec5SDimitry Andric        size_type __cap_;
7570b57cec5SDimitry Andric        size_type __size_;
7580b57cec5SDimitry Andric        pointer   __data_;
7590b57cec5SDimitry Andric    };
7600b57cec5SDimitry Andric
7610b57cec5SDimitry Andric#ifdef _LIBCPP_BIG_ENDIAN
7620b57cec5SDimitry Andric    static const size_type __short_mask = 0x80;
7630b57cec5SDimitry Andric    static const size_type __long_mask  = ~(size_type(~0) >> 1);
7640b57cec5SDimitry Andric#else  // _LIBCPP_BIG_ENDIAN
7650b57cec5SDimitry Andric    static const size_type __short_mask = 0x01;
7660b57cec5SDimitry Andric    static const size_type __long_mask  = 0x1ul;
7670b57cec5SDimitry Andric#endif // _LIBCPP_BIG_ENDIAN
7680b57cec5SDimitry Andric
7690b57cec5SDimitry Andric    enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
7700b57cec5SDimitry Andric                      (sizeof(__long) - 1)/sizeof(value_type) : 2};
7710b57cec5SDimitry Andric
7720b57cec5SDimitry Andric    struct __short
7730b57cec5SDimitry Andric    {
7740b57cec5SDimitry Andric        union
7750b57cec5SDimitry Andric        {
7760b57cec5SDimitry Andric            unsigned char __size_;
7770b57cec5SDimitry Andric            value_type __lx;
7780b57cec5SDimitry Andric        };
7790b57cec5SDimitry Andric        value_type __data_[__min_cap];
7800b57cec5SDimitry Andric    };
7810b57cec5SDimitry Andric
7820b57cec5SDimitry Andric#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
7830b57cec5SDimitry Andric
7840b57cec5SDimitry Andric    union __ulx{__long __lx; __short __lxx;};
7850b57cec5SDimitry Andric
7860b57cec5SDimitry Andric    enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
7870b57cec5SDimitry Andric
7880b57cec5SDimitry Andric    struct __raw
7890b57cec5SDimitry Andric    {
7900b57cec5SDimitry Andric        size_type __words[__n_words];
7910b57cec5SDimitry Andric    };
7920b57cec5SDimitry Andric
7930b57cec5SDimitry Andric    struct __rep
7940b57cec5SDimitry Andric    {
7950b57cec5SDimitry Andric        union
7960b57cec5SDimitry Andric        {
7970b57cec5SDimitry Andric            __long  __l;
7980b57cec5SDimitry Andric            __short __s;
7990b57cec5SDimitry Andric            __raw   __r;
8000b57cec5SDimitry Andric        };
8010b57cec5SDimitry Andric    };
8020b57cec5SDimitry Andric
8030b57cec5SDimitry Andric    __compressed_pair<__rep, allocator_type> __r_;
8040b57cec5SDimitry Andric
8050b57cec5SDimitry Andricpublic:
806fe6060f1SDimitry Andric    _LIBCPP_TEMPLATE_DATA_VIS
8070b57cec5SDimitry Andric    static const size_type npos = -1;
8080b57cec5SDimitry Andric
8090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY basic_string()
8100b57cec5SDimitry Andric        _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
8110b57cec5SDimitry Andric
8120b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a)
8130b57cec5SDimitry Andric#if _LIBCPP_STD_VER <= 14
8140b57cec5SDimitry Andric        _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
8150b57cec5SDimitry Andric#else
8160b57cec5SDimitry Andric        _NOEXCEPT;
8170b57cec5SDimitry Andric#endif
8180b57cec5SDimitry Andric
8190b57cec5SDimitry Andric    basic_string(const basic_string& __str);
8200b57cec5SDimitry Andric    basic_string(const basic_string& __str, const allocator_type& __a);
8210b57cec5SDimitry Andric
8220b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8230b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8240b57cec5SDimitry Andric    basic_string(basic_string&& __str)
8250b57cec5SDimitry Andric#if _LIBCPP_STD_VER <= 14
8260b57cec5SDimitry Andric        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
8270b57cec5SDimitry Andric#else
8280b57cec5SDimitry Andric        _NOEXCEPT;
8290b57cec5SDimitry Andric#endif
8300b57cec5SDimitry Andric
8310b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8320b57cec5SDimitry Andric    basic_string(basic_string&& __str, const allocator_type& __a);
8330b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
8340b57cec5SDimitry Andric
8355ffd83dbSDimitry Andric    template <class = _EnableIf<__is_allocator<_Allocator>::value, nullptr_t> >
8360b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
837480093f4SDimitry Andric    basic_string(const _CharT* __s) : __r_(__default_init_tag(), __default_init_tag()) {
8380b57cec5SDimitry Andric      _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
8390b57cec5SDimitry Andric      __init(__s, traits_type::length(__s));
840e8d8bef9SDimitry Andric#   if _LIBCPP_DEBUG_LEVEL == 2
8410b57cec5SDimitry Andric      __get_db()->__insert_c(this);
8420b57cec5SDimitry Andric#   endif
8430b57cec5SDimitry Andric    }
8440b57cec5SDimitry Andric
8455ffd83dbSDimitry Andric    template <class = _EnableIf<__is_allocator<_Allocator>::value, nullptr_t> >
8460b57cec5SDimitry Andric        _LIBCPP_INLINE_VISIBILITY
8470b57cec5SDimitry Andric        basic_string(const _CharT* __s, const _Allocator& __a);
8480b57cec5SDimitry Andric
849fe6060f1SDimitry Andric#if _LIBCPP_STD_VER > 20
850fe6060f1SDimitry Andric    basic_string(nullptr_t) = delete;
851fe6060f1SDimitry Andric#endif
852fe6060f1SDimitry Andric
8530b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8540b57cec5SDimitry Andric    basic_string(const _CharT* __s, size_type __n);
8550b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8560b57cec5SDimitry Andric    basic_string(const _CharT* __s, size_type __n, const _Allocator& __a);
8570b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8580b57cec5SDimitry Andric    basic_string(size_type __n, _CharT __c);
8590b57cec5SDimitry Andric
8605ffd83dbSDimitry Andric    template <class = _EnableIf<__is_allocator<_Allocator>::value, nullptr_t> >
8610b57cec5SDimitry Andric        _LIBCPP_INLINE_VISIBILITY
8620b57cec5SDimitry Andric        basic_string(size_type __n, _CharT __c, const _Allocator& __a);
8630b57cec5SDimitry Andric
8640b57cec5SDimitry Andric    basic_string(const basic_string& __str, size_type __pos, size_type __n,
8650b57cec5SDimitry Andric                 const _Allocator& __a = _Allocator());
8660b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8670b57cec5SDimitry Andric    basic_string(const basic_string& __str, size_type __pos,
8680b57cec5SDimitry Andric                 const _Allocator& __a = _Allocator());
8690b57cec5SDimitry Andric
8705ffd83dbSDimitry Andric    template<class _Tp, class = _EnableIf<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string>::value> >
8710b57cec5SDimitry Andric        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
8720b57cec5SDimitry Andric        basic_string(const _Tp& __t, size_type __pos, size_type __n,
8730b57cec5SDimitry Andric                     const allocator_type& __a = allocator_type());
8740b57cec5SDimitry Andric
8755ffd83dbSDimitry Andric    template<class _Tp, class = _EnableIf<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value &&
8765ffd83dbSDimitry Andric                                          !__is_same_uncvref<_Tp, basic_string>::value> >
8770b57cec5SDimitry Andric        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
8780b57cec5SDimitry Andric        explicit basic_string(const _Tp& __t);
8790b57cec5SDimitry Andric
8805ffd83dbSDimitry Andric    template<class _Tp, class = _EnableIf<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string>::value> >
8810b57cec5SDimitry Andric        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
8820b57cec5SDimitry Andric        explicit basic_string(const _Tp& __t, const allocator_type& __a);
8830b57cec5SDimitry Andric
8845ffd83dbSDimitry Andric    template<class _InputIterator, class = _EnableIf<__is_cpp17_input_iterator<_InputIterator>::value> >
8850b57cec5SDimitry Andric        _LIBCPP_INLINE_VISIBILITY
8860b57cec5SDimitry Andric        basic_string(_InputIterator __first, _InputIterator __last);
8875ffd83dbSDimitry Andric    template<class _InputIterator, class = _EnableIf<__is_cpp17_input_iterator<_InputIterator>::value> >
8880b57cec5SDimitry Andric        _LIBCPP_INLINE_VISIBILITY
8890b57cec5SDimitry Andric        basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);
8900b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8910b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8920b57cec5SDimitry Andric    basic_string(initializer_list<_CharT> __il);
8930b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8940b57cec5SDimitry Andric    basic_string(initializer_list<_CharT> __il, const _Allocator& __a);
8950b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
8960b57cec5SDimitry Andric
8970b57cec5SDimitry Andric    inline ~basic_string();
8980b57cec5SDimitry Andric
8990b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9000b57cec5SDimitry Andric    operator __self_view() const _NOEXCEPT { return __self_view(data(), size()); }
9010b57cec5SDimitry Andric
9020b57cec5SDimitry Andric    basic_string& operator=(const basic_string& __str);
9030b57cec5SDimitry Andric
9045ffd83dbSDimitry Andric    template <class _Tp, class = _EnableIf<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string>::value> >
9050b57cec5SDimitry Andric    basic_string& operator=(const _Tp& __t)
9060b57cec5SDimitry Andric        {__self_view __sv = __t; return assign(__sv);}
9070b57cec5SDimitry Andric
9080b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
9090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9100b57cec5SDimitry Andric    basic_string& operator=(basic_string&& __str)
9110b57cec5SDimitry Andric        _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
9120b57cec5SDimitry Andric     _LIBCPP_INLINE_VISIBILITY
9130b57cec5SDimitry Andric    basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
9140b57cec5SDimitry Andric#endif
9150b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);}
916fe6060f1SDimitry Andric#if _LIBCPP_STD_VER > 20
917fe6060f1SDimitry Andric    basic_string& operator=(nullptr_t) = delete;
918fe6060f1SDimitry Andric#endif
9190b57cec5SDimitry Andric    basic_string& operator=(value_type __c);
9200b57cec5SDimitry Andric
921e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
9220b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9230b57cec5SDimitry Andric    iterator begin() _NOEXCEPT
9240b57cec5SDimitry Andric        {return iterator(this, __get_pointer());}
9250b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9260b57cec5SDimitry Andric    const_iterator begin() const _NOEXCEPT
9270b57cec5SDimitry Andric        {return const_iterator(this, __get_pointer());}
9280b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9290b57cec5SDimitry Andric    iterator end() _NOEXCEPT
9300b57cec5SDimitry Andric        {return iterator(this, __get_pointer() + size());}
9310b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9320b57cec5SDimitry Andric    const_iterator end() const _NOEXCEPT
9330b57cec5SDimitry Andric        {return const_iterator(this, __get_pointer() + size());}
9340b57cec5SDimitry Andric#else
9350b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9360b57cec5SDimitry Andric    iterator begin() _NOEXCEPT
9370b57cec5SDimitry Andric        {return iterator(__get_pointer());}
9380b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9390b57cec5SDimitry Andric    const_iterator begin() const _NOEXCEPT
9400b57cec5SDimitry Andric        {return const_iterator(__get_pointer());}
9410b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9420b57cec5SDimitry Andric    iterator end() _NOEXCEPT
9430b57cec5SDimitry Andric        {return iterator(__get_pointer() + size());}
9440b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9450b57cec5SDimitry Andric    const_iterator end() const _NOEXCEPT
9460b57cec5SDimitry Andric        {return const_iterator(__get_pointer() + size());}
947e8d8bef9SDimitry Andric#endif // _LIBCPP_DEBUG_LEVEL == 2
9480b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9490b57cec5SDimitry Andric    reverse_iterator rbegin() _NOEXCEPT
9500b57cec5SDimitry Andric        {return reverse_iterator(end());}
9510b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9520b57cec5SDimitry Andric    const_reverse_iterator rbegin() const _NOEXCEPT
9530b57cec5SDimitry Andric        {return const_reverse_iterator(end());}
9540b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9550b57cec5SDimitry Andric    reverse_iterator rend() _NOEXCEPT
9560b57cec5SDimitry Andric        {return reverse_iterator(begin());}
9570b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9580b57cec5SDimitry Andric    const_reverse_iterator rend() const _NOEXCEPT
9590b57cec5SDimitry Andric        {return const_reverse_iterator(begin());}
9600b57cec5SDimitry Andric
9610b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9620b57cec5SDimitry Andric    const_iterator cbegin() const _NOEXCEPT
9630b57cec5SDimitry Andric        {return begin();}
9640b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9650b57cec5SDimitry Andric    const_iterator cend() const _NOEXCEPT
9660b57cec5SDimitry Andric        {return end();}
9670b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9680b57cec5SDimitry Andric    const_reverse_iterator crbegin() const _NOEXCEPT
9690b57cec5SDimitry Andric        {return rbegin();}
9700b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9710b57cec5SDimitry Andric    const_reverse_iterator crend() const _NOEXCEPT
9720b57cec5SDimitry Andric        {return rend();}
9730b57cec5SDimitry Andric
9740b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
9750b57cec5SDimitry Andric        {return __is_long() ? __get_long_size() : __get_short_size();}
9760b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
9770b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
9780b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
9790b57cec5SDimitry Andric        {return (__is_long() ? __get_long_cap()
9800b57cec5SDimitry Andric                             : static_cast<size_type>(__min_cap)) - 1;}
9810b57cec5SDimitry Andric
9820b57cec5SDimitry Andric    void resize(size_type __n, value_type __c);
9830b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
9840b57cec5SDimitry Andric
985e8d8bef9SDimitry Andric    void reserve(size_type __requested_capacity);
9860b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void __resize_default_init(size_type __n);
9870b57cec5SDimitry Andric
988e8d8bef9SDimitry Andric    _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_INLINE_VISIBILITY
989e8d8bef9SDimitry Andric    void reserve() _NOEXCEPT {shrink_to_fit();}
9900b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
991e8d8bef9SDimitry Andric    void shrink_to_fit() _NOEXCEPT;
9920b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9930b57cec5SDimitry Andric    void clear() _NOEXCEPT;
9940b57cec5SDimitry Andric    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
9950b57cec5SDimitry Andric    bool empty() const _NOEXCEPT {return size() == 0;}
9960b57cec5SDimitry Andric
9970b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const _NOEXCEPT;
9980b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY reference       operator[](size_type __pos)       _NOEXCEPT;
9990b57cec5SDimitry Andric
10000b57cec5SDimitry Andric    const_reference at(size_type __n) const;
10010b57cec5SDimitry Andric    reference       at(size_type __n);
10020b57cec5SDimitry Andric
10030b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
10040b57cec5SDimitry Andric
10050b57cec5SDimitry Andric    template <class _Tp>
10060b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
10075ffd83dbSDimitry Andric    _EnableIf
10080b57cec5SDimitry Andric        <
10095ffd83dbSDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
10105ffd83dbSDimitry Andric            && !__is_same_uncvref<_Tp, basic_string >::value,
10110b57cec5SDimitry Andric            basic_string&
10125ffd83dbSDimitry Andric        >
10130b57cec5SDimitry Andric                                            operator+=(const _Tp& __t)            {__self_view __sv = __t; return append(__sv);}
10140b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s)     {return append(__s);}
10150b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c)            {push_back(__c); return *this;}
10160b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
10170b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
10180b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
10190b57cec5SDimitry Andric
10200b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10210b57cec5SDimitry Andric    basic_string& append(const basic_string& __str);
10220b57cec5SDimitry Andric
10230b57cec5SDimitry Andric    template <class _Tp>
10240b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
10255ffd83dbSDimitry Andric    _EnableIf<
10265ffd83dbSDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
10275ffd83dbSDimitry Andric            && !__is_same_uncvref<_Tp, basic_string>::value,
10280b57cec5SDimitry Andric            basic_string&
10295ffd83dbSDimitry Andric        >
10300b57cec5SDimitry Andric                  append(const _Tp& __t) { __self_view __sv = __t; return append(__sv.data(), __sv.size()); }
10310b57cec5SDimitry Andric    basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
10320b57cec5SDimitry Andric
10330b57cec5SDimitry Andric    template <class _Tp>
10340b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
10355ffd83dbSDimitry Andric    _EnableIf
10360b57cec5SDimitry Andric        <
10375ffd83dbSDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
10385ffd83dbSDimitry Andric            && !__is_same_uncvref<_Tp, basic_string>::value,
10390b57cec5SDimitry Andric            basic_string&
10405ffd83dbSDimitry Andric        >
10410b57cec5SDimitry Andric                  append(const _Tp& __t, size_type __pos, size_type __n=npos);
10420b57cec5SDimitry Andric    basic_string& append(const value_type* __s, size_type __n);
10430b57cec5SDimitry Andric    basic_string& append(const value_type* __s);
10440b57cec5SDimitry Andric    basic_string& append(size_type __n, value_type __c);
10450b57cec5SDimitry Andric
10460b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10470b57cec5SDimitry Andric    void __append_default_init(size_type __n);
10480b57cec5SDimitry Andric
10490b57cec5SDimitry Andric    template<class _InputIterator>
10500b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
10515ffd83dbSDimitry Andric    _EnableIf
10520b57cec5SDimitry Andric        <
1053fe6060f1SDimitry Andric            __is_exactly_cpp17_input_iterator<_InputIterator>::value,
10540b57cec5SDimitry Andric            basic_string&
10555ffd83dbSDimitry Andric        >
10560b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10570b57cec5SDimitry Andric    append(_InputIterator __first, _InputIterator __last) {
10580b57cec5SDimitry Andric      const basic_string __temp(__first, __last, __alloc());
10590b57cec5SDimitry Andric      append(__temp.data(), __temp.size());
10600b57cec5SDimitry Andric      return *this;
10610b57cec5SDimitry Andric    }
10620b57cec5SDimitry Andric    template<class _ForwardIterator>
10630b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
10645ffd83dbSDimitry Andric    _EnableIf
10650b57cec5SDimitry Andric        <
1066fe6060f1SDimitry Andric            __is_cpp17_forward_iterator<_ForwardIterator>::value,
10670b57cec5SDimitry Andric            basic_string&
10685ffd83dbSDimitry Andric        >
10690b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
1070fe6060f1SDimitry Andric    append(_ForwardIterator __first, _ForwardIterator __last);
10710b57cec5SDimitry Andric
10720b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
10730b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10740b57cec5SDimitry Andric    basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
10750b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
10760b57cec5SDimitry Andric
10770b57cec5SDimitry Andric    void push_back(value_type __c);
10780b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10790b57cec5SDimitry Andric    void pop_back();
10800b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY reference       front() _NOEXCEPT;
10810b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY const_reference front() const _NOEXCEPT;
10820b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY reference       back() _NOEXCEPT;
10830b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY const_reference back() const _NOEXCEPT;
10840b57cec5SDimitry Andric
10850b57cec5SDimitry Andric    template <class _Tp>
10860b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
10875ffd83dbSDimitry Andric    _EnableIf
10880b57cec5SDimitry Andric        <
10890b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
10900b57cec5SDimitry Andric            basic_string&
10915ffd83dbSDimitry Andric        >
10920b57cec5SDimitry Andric                 assign(const _Tp & __t) { __self_view __sv = __t; return assign(__sv.data(), __sv.size()); }
10930b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10940b57cec5SDimitry Andric    basic_string& assign(const basic_string& __str) { return *this = __str; }
10950b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
10960b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10970b57cec5SDimitry Andric    basic_string& assign(basic_string&& __str)
10980b57cec5SDimitry Andric        _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
10990b57cec5SDimitry Andric        {*this = _VSTD::move(__str); return *this;}
11000b57cec5SDimitry Andric#endif
11010b57cec5SDimitry Andric    basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos);
11020b57cec5SDimitry Andric    template <class _Tp>
11030b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
11045ffd83dbSDimitry Andric    _EnableIf
11050b57cec5SDimitry Andric        <
11065ffd83dbSDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
11075ffd83dbSDimitry Andric            && !__is_same_uncvref<_Tp, basic_string>::value,
11080b57cec5SDimitry Andric            basic_string&
11095ffd83dbSDimitry Andric        >
11100b57cec5SDimitry Andric                  assign(const _Tp & __t, size_type __pos, size_type __n=npos);
11110b57cec5SDimitry Andric    basic_string& assign(const value_type* __s, size_type __n);
11120b57cec5SDimitry Andric    basic_string& assign(const value_type* __s);
11130b57cec5SDimitry Andric    basic_string& assign(size_type __n, value_type __c);
11140b57cec5SDimitry Andric    template<class _InputIterator>
11150b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
11165ffd83dbSDimitry Andric    _EnableIf
11170b57cec5SDimitry Andric        <
1118fe6060f1SDimitry Andric            __is_exactly_cpp17_input_iterator<_InputIterator>::value,
11190b57cec5SDimitry Andric            basic_string&
11205ffd83dbSDimitry Andric        >
11210b57cec5SDimitry Andric        assign(_InputIterator __first, _InputIterator __last);
11220b57cec5SDimitry Andric    template<class _ForwardIterator>
11230b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
11245ffd83dbSDimitry Andric    _EnableIf
11250b57cec5SDimitry Andric        <
1126fe6060f1SDimitry Andric            __is_cpp17_forward_iterator<_ForwardIterator>::value,
11270b57cec5SDimitry Andric            basic_string&
11285ffd83dbSDimitry Andric        >
11290b57cec5SDimitry Andric        assign(_ForwardIterator __first, _ForwardIterator __last);
11300b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
11310b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11320b57cec5SDimitry Andric    basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
11330b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
11340b57cec5SDimitry Andric
11350b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11360b57cec5SDimitry Andric    basic_string& insert(size_type __pos1, const basic_string& __str);
11370b57cec5SDimitry Andric
11380b57cec5SDimitry Andric    template <class _Tp>
11390b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
11405ffd83dbSDimitry Andric    _EnableIf
11410b57cec5SDimitry Andric        <
11420b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
11430b57cec5SDimitry Andric            basic_string&
11445ffd83dbSDimitry Andric        >
11450b57cec5SDimitry Andric                 insert(size_type __pos1, const _Tp& __t)
11460b57cec5SDimitry Andric    { __self_view __sv = __t; return insert(__pos1, __sv.data(), __sv.size()); }
11470b57cec5SDimitry Andric
11480b57cec5SDimitry Andric    template <class _Tp>
11490b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
11505ffd83dbSDimitry Andric    _EnableIf
11510b57cec5SDimitry Andric        <
11525ffd83dbSDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string>::value,
11530b57cec5SDimitry Andric            basic_string&
11545ffd83dbSDimitry Andric        >
11550b57cec5SDimitry Andric                  insert(size_type __pos1, const _Tp& __t, size_type __pos2, size_type __n=npos);
11560b57cec5SDimitry Andric    basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos);
11570b57cec5SDimitry Andric    basic_string& insert(size_type __pos, const value_type* __s, size_type __n);
11580b57cec5SDimitry Andric    basic_string& insert(size_type __pos, const value_type* __s);
11590b57cec5SDimitry Andric    basic_string& insert(size_type __pos, size_type __n, value_type __c);
11600b57cec5SDimitry Andric    iterator      insert(const_iterator __pos, value_type __c);
11610b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11620b57cec5SDimitry Andric    iterator      insert(const_iterator __pos, size_type __n, value_type __c);
11630b57cec5SDimitry Andric    template<class _InputIterator>
11640b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
11655ffd83dbSDimitry Andric    _EnableIf
11660b57cec5SDimitry Andric        <
1167fe6060f1SDimitry Andric            __is_exactly_cpp17_input_iterator<_InputIterator>::value,
11680b57cec5SDimitry Andric            iterator
11695ffd83dbSDimitry Andric        >
11700b57cec5SDimitry Andric        insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
11710b57cec5SDimitry Andric    template<class _ForwardIterator>
11720b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
11735ffd83dbSDimitry Andric    _EnableIf
11740b57cec5SDimitry Andric        <
1175fe6060f1SDimitry Andric            __is_cpp17_forward_iterator<_ForwardIterator>::value,
11760b57cec5SDimitry Andric            iterator
11775ffd83dbSDimitry Andric        >
11780b57cec5SDimitry Andric        insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
11790b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
11800b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11810b57cec5SDimitry Andric    iterator insert(const_iterator __pos, initializer_list<value_type> __il)
11820b57cec5SDimitry Andric                    {return insert(__pos, __il.begin(), __il.end());}
11830b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
11840b57cec5SDimitry Andric
11850b57cec5SDimitry Andric    basic_string& erase(size_type __pos = 0, size_type __n = npos);
11860b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11870b57cec5SDimitry Andric    iterator      erase(const_iterator __pos);
11880b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11890b57cec5SDimitry Andric    iterator      erase(const_iterator __first, const_iterator __last);
11900b57cec5SDimitry Andric
11910b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11920b57cec5SDimitry Andric    basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
11930b57cec5SDimitry Andric
11940b57cec5SDimitry Andric    template <class _Tp>
11950b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
11965ffd83dbSDimitry Andric    _EnableIf
11970b57cec5SDimitry Andric        <
11980b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
11990b57cec5SDimitry Andric            basic_string&
12005ffd83dbSDimitry Andric        >
12010b57cec5SDimitry Andric                  replace(size_type __pos1, size_type __n1, const _Tp& __t) { __self_view __sv = __t; return replace(__pos1, __n1, __sv.data(), __sv.size()); }
12020b57cec5SDimitry Andric    basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos);
12030b57cec5SDimitry Andric    template <class _Tp>
12040b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
12055ffd83dbSDimitry Andric    _EnableIf
12060b57cec5SDimitry Andric        <
12075ffd83dbSDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value  && !__is_same_uncvref<_Tp, basic_string>::value,
12080b57cec5SDimitry Andric            basic_string&
12095ffd83dbSDimitry Andric        >
12100b57cec5SDimitry Andric                  replace(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos);
12110b57cec5SDimitry Andric    basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
12120b57cec5SDimitry Andric    basic_string& replace(size_type __pos, size_type __n1, const value_type* __s);
12130b57cec5SDimitry Andric    basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
12140b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12150b57cec5SDimitry Andric    basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
12160b57cec5SDimitry Andric
12170b57cec5SDimitry Andric    template <class _Tp>
12180b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
12195ffd83dbSDimitry Andric    _EnableIf
12200b57cec5SDimitry Andric        <
12210b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
12220b57cec5SDimitry Andric            basic_string&
12235ffd83dbSDimitry Andric        >
12240b57cec5SDimitry Andric                  replace(const_iterator __i1, const_iterator __i2, const _Tp& __t) { __self_view __sv = __t; return replace(__i1 - begin(), __i2 - __i1, __sv); }
12250b57cec5SDimitry Andric
12260b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12270b57cec5SDimitry Andric    basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n);
12280b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12290b57cec5SDimitry Andric    basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s);
12300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12310b57cec5SDimitry Andric    basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
12320b57cec5SDimitry Andric    template<class _InputIterator>
12330b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
12345ffd83dbSDimitry Andric    _EnableIf
12350b57cec5SDimitry Andric        <
1236480093f4SDimitry Andric            __is_cpp17_input_iterator<_InputIterator>::value,
12370b57cec5SDimitry Andric            basic_string&
12385ffd83dbSDimitry Andric        >
12390b57cec5SDimitry Andric        replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
12400b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
12410b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12420b57cec5SDimitry Andric    basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
12430b57cec5SDimitry Andric        {return replace(__i1, __i2, __il.begin(), __il.end());}
12440b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
12450b57cec5SDimitry Andric
12460b57cec5SDimitry Andric    size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
12470b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12480b57cec5SDimitry Andric    basic_string substr(size_type __pos = 0, size_type __n = npos) const;
12490b57cec5SDimitry Andric
12500b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12510b57cec5SDimitry Andric    void swap(basic_string& __str)
12520b57cec5SDimitry Andric#if _LIBCPP_STD_VER >= 14
12530b57cec5SDimitry Andric        _NOEXCEPT;
12540b57cec5SDimitry Andric#else
12550b57cec5SDimitry Andric        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
12560b57cec5SDimitry Andric                    __is_nothrow_swappable<allocator_type>::value);
12570b57cec5SDimitry Andric#endif
12580b57cec5SDimitry Andric
12590b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12600b57cec5SDimitry Andric    const value_type* c_str() const _NOEXCEPT {return data();}
12610b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
1262480093f4SDimitry Andric    const value_type* data() const _NOEXCEPT  {return _VSTD::__to_address(__get_pointer());}
12630b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 14 || defined(_LIBCPP_BUILDING_LIBRARY)
12640b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
1265480093f4SDimitry Andric    value_type* data()             _NOEXCEPT  {return _VSTD::__to_address(__get_pointer());}
12660b57cec5SDimitry Andric#endif
12670b57cec5SDimitry Andric
12680b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12690b57cec5SDimitry Andric    allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
12700b57cec5SDimitry Andric
12710b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12720b57cec5SDimitry Andric    size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
12730b57cec5SDimitry Andric
12740b57cec5SDimitry Andric    template <class _Tp>
12750b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
12765ffd83dbSDimitry Andric    _EnableIf
12770b57cec5SDimitry Andric        <
12780b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
12790b57cec5SDimitry Andric            size_type
12805ffd83dbSDimitry Andric        >
1281fe6060f1SDimitry Andric              find(const _Tp& __t, size_type __pos = 0) const _NOEXCEPT;
12820b57cec5SDimitry Andric    size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
12830b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12840b57cec5SDimitry Andric    size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
12850b57cec5SDimitry Andric    size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
12860b57cec5SDimitry Andric
12870b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12880b57cec5SDimitry Andric    size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
12890b57cec5SDimitry Andric
12900b57cec5SDimitry Andric    template <class _Tp>
12910b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
12925ffd83dbSDimitry Andric    _EnableIf
12930b57cec5SDimitry Andric        <
12940b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
12950b57cec5SDimitry Andric            size_type
12965ffd83dbSDimitry Andric        >
1297fe6060f1SDimitry Andric              rfind(const _Tp& __t, size_type __pos = npos) const _NOEXCEPT;
12980b57cec5SDimitry Andric    size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
12990b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13000b57cec5SDimitry Andric    size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
13010b57cec5SDimitry Andric    size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
13020b57cec5SDimitry Andric
13030b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13040b57cec5SDimitry Andric    size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
13050b57cec5SDimitry Andric
13060b57cec5SDimitry Andric    template <class _Tp>
13070b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
13085ffd83dbSDimitry Andric    _EnableIf
13090b57cec5SDimitry Andric        <
13100b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
13110b57cec5SDimitry Andric            size_type
13125ffd83dbSDimitry Andric        >
1313fe6060f1SDimitry Andric              find_first_of(const _Tp& __t, size_type __pos = 0) const _NOEXCEPT;
13140b57cec5SDimitry Andric    size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
13150b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13160b57cec5SDimitry Andric    size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
13170b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13180b57cec5SDimitry Andric    size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
13190b57cec5SDimitry Andric
13200b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13210b57cec5SDimitry Andric    size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
13220b57cec5SDimitry Andric
13230b57cec5SDimitry Andric    template <class _Tp>
13240b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
13255ffd83dbSDimitry Andric    _EnableIf
13260b57cec5SDimitry Andric        <
13270b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
13280b57cec5SDimitry Andric            size_type
13295ffd83dbSDimitry Andric        >
1330fe6060f1SDimitry Andric              find_last_of(const _Tp& __t, size_type __pos = npos) const _NOEXCEPT;
13310b57cec5SDimitry Andric    size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
13320b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13330b57cec5SDimitry Andric    size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
13340b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13350b57cec5SDimitry Andric    size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
13360b57cec5SDimitry Andric
13370b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13380b57cec5SDimitry Andric    size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
13390b57cec5SDimitry Andric
13400b57cec5SDimitry Andric    template <class _Tp>
13410b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
13425ffd83dbSDimitry Andric    _EnableIf
13430b57cec5SDimitry Andric        <
13440b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
13450b57cec5SDimitry Andric            size_type
13465ffd83dbSDimitry Andric        >
1347fe6060f1SDimitry Andric              find_first_not_of(const _Tp &__t, size_type __pos = 0) const _NOEXCEPT;
13480b57cec5SDimitry Andric    size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
13490b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13500b57cec5SDimitry Andric    size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
13510b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13520b57cec5SDimitry Andric    size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
13530b57cec5SDimitry Andric
13540b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13550b57cec5SDimitry Andric    size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
13560b57cec5SDimitry Andric
13570b57cec5SDimitry Andric    template <class _Tp>
13580b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
13595ffd83dbSDimitry Andric    _EnableIf
13600b57cec5SDimitry Andric        <
13610b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
13620b57cec5SDimitry Andric            size_type
13635ffd83dbSDimitry Andric        >
1364fe6060f1SDimitry Andric              find_last_not_of(const _Tp& __t, size_type __pos = npos) const _NOEXCEPT;
13650b57cec5SDimitry Andric    size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
13660b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13670b57cec5SDimitry Andric    size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
13680b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13690b57cec5SDimitry Andric    size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
13700b57cec5SDimitry Andric
13710b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13720b57cec5SDimitry Andric    int compare(const basic_string& __str) const _NOEXCEPT;
13730b57cec5SDimitry Andric
13740b57cec5SDimitry Andric    template <class _Tp>
13750b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
13765ffd83dbSDimitry Andric    _EnableIf
13770b57cec5SDimitry Andric        <
13780b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
13790b57cec5SDimitry Andric            int
13805ffd83dbSDimitry Andric        >
1381fe6060f1SDimitry Andric        compare(const _Tp &__t) const _NOEXCEPT;
13820b57cec5SDimitry Andric
13830b57cec5SDimitry Andric    template <class _Tp>
13840b57cec5SDimitry Andric    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
13855ffd83dbSDimitry Andric    _EnableIf
13860b57cec5SDimitry Andric        <
13870b57cec5SDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
13880b57cec5SDimitry Andric            int
13895ffd83dbSDimitry Andric        >
13900b57cec5SDimitry Andric         compare(size_type __pos1, size_type __n1, const _Tp& __t) const;
13910b57cec5SDimitry Andric
13920b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
13930b57cec5SDimitry Andric    int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
13940b57cec5SDimitry Andric    int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos) const;
13950b57cec5SDimitry Andric
13960b57cec5SDimitry Andric    template <class _Tp>
13970b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
13985ffd83dbSDimitry Andric        _EnableIf
13990b57cec5SDimitry Andric        <
14005ffd83dbSDimitry Andric            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value  && !__is_same_uncvref<_Tp, basic_string>::value,
14010b57cec5SDimitry Andric            int
14025ffd83dbSDimitry Andric        >
14030b57cec5SDimitry Andric        compare(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos) const;
14040b57cec5SDimitry Andric    int compare(const value_type* __s) const _NOEXCEPT;
14050b57cec5SDimitry Andric    int compare(size_type __pos1, size_type __n1, const value_type* __s) const;
14060b57cec5SDimitry Andric    int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
14070b57cec5SDimitry Andric
14080b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 17
14090b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
14100b57cec5SDimitry Andric    bool starts_with(__self_view __sv) const _NOEXCEPT
14110b57cec5SDimitry Andric    { return __self_view(data(), size()).starts_with(__sv); }
14120b57cec5SDimitry Andric
14130b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
14140b57cec5SDimitry Andric    bool starts_with(value_type __c) const _NOEXCEPT
14150b57cec5SDimitry Andric    { return !empty() && _Traits::eq(front(), __c); }
14160b57cec5SDimitry Andric
14170b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
14180b57cec5SDimitry Andric    bool starts_with(const value_type* __s) const _NOEXCEPT
14190b57cec5SDimitry Andric    { return starts_with(__self_view(__s)); }
14200b57cec5SDimitry Andric
14210b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
14220b57cec5SDimitry Andric    bool ends_with(__self_view __sv) const _NOEXCEPT
14230b57cec5SDimitry Andric    { return __self_view(data(), size()).ends_with( __sv); }
14240b57cec5SDimitry Andric
14250b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
14260b57cec5SDimitry Andric    bool ends_with(value_type __c) const _NOEXCEPT
14270b57cec5SDimitry Andric    { return !empty() && _Traits::eq(back(), __c); }
14280b57cec5SDimitry Andric
14290b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
14300b57cec5SDimitry Andric    bool ends_with(const value_type* __s) const _NOEXCEPT
14310b57cec5SDimitry Andric    { return ends_with(__self_view(__s)); }
14320b57cec5SDimitry Andric#endif
14330b57cec5SDimitry Andric
1434e8d8bef9SDimitry Andric#if _LIBCPP_STD_VER > 20
1435e8d8bef9SDimitry Andric    constexpr _LIBCPP_INLINE_VISIBILITY
1436e8d8bef9SDimitry Andric    bool contains(__self_view __sv) const noexcept
1437e8d8bef9SDimitry Andric    { return __self_view(data(), size()).contains(__sv); }
1438e8d8bef9SDimitry Andric
1439e8d8bef9SDimitry Andric    constexpr _LIBCPP_INLINE_VISIBILITY
1440e8d8bef9SDimitry Andric    bool contains(value_type __c) const noexcept
1441e8d8bef9SDimitry Andric    { return __self_view(data(), size()).contains(__c); }
1442e8d8bef9SDimitry Andric
1443e8d8bef9SDimitry Andric    constexpr _LIBCPP_INLINE_VISIBILITY
1444e8d8bef9SDimitry Andric    bool contains(const value_type* __s) const
1445e8d8bef9SDimitry Andric    { return __self_view(data(), size()).contains(__s); }
1446e8d8bef9SDimitry Andric#endif
1447e8d8bef9SDimitry Andric
14480b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY bool __invariants() const;
14490b57cec5SDimitry Andric
14500b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void __clear_and_shrink() _NOEXCEPT;
14510b57cec5SDimitry Andric
1452e8d8bef9SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void __shrink_or_extend(size_type __target_capacity);
1453e8d8bef9SDimitry Andric
14540b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14550b57cec5SDimitry Andric    bool __is_long() const _NOEXCEPT
14560b57cec5SDimitry Andric        {return bool(__r_.first().__s.__size_ & __short_mask);}
14570b57cec5SDimitry Andric
1458e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
14590b57cec5SDimitry Andric
14600b57cec5SDimitry Andric    bool __dereferenceable(const const_iterator* __i) const;
14610b57cec5SDimitry Andric    bool __decrementable(const const_iterator* __i) const;
14620b57cec5SDimitry Andric    bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
14630b57cec5SDimitry Andric    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
14640b57cec5SDimitry Andric
1465e8d8bef9SDimitry Andric#endif // _LIBCPP_DEBUG_LEVEL == 2
14660b57cec5SDimitry Andric
14670b57cec5SDimitry Andricprivate:
14680b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14690b57cec5SDimitry Andric    allocator_type& __alloc() _NOEXCEPT
14700b57cec5SDimitry Andric        {return __r_.second();}
14710b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14720b57cec5SDimitry Andric    const allocator_type& __alloc() const _NOEXCEPT
14730b57cec5SDimitry Andric        {return __r_.second();}
14740b57cec5SDimitry Andric
14750b57cec5SDimitry Andric#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
14760b57cec5SDimitry Andric
14770b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14780b57cec5SDimitry Andric    void __set_short_size(size_type __s) _NOEXCEPT
14790b57cec5SDimitry Andric#   ifdef _LIBCPP_BIG_ENDIAN
14800b57cec5SDimitry Andric        {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
14810b57cec5SDimitry Andric#   else
14820b57cec5SDimitry Andric        {__r_.first().__s.__size_ = (unsigned char)(__s);}
14830b57cec5SDimitry Andric#   endif
14840b57cec5SDimitry Andric
14850b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14860b57cec5SDimitry Andric    size_type __get_short_size() const _NOEXCEPT
14870b57cec5SDimitry Andric#   ifdef _LIBCPP_BIG_ENDIAN
14880b57cec5SDimitry Andric        {return __r_.first().__s.__size_ >> 1;}
14890b57cec5SDimitry Andric#   else
14900b57cec5SDimitry Andric        {return __r_.first().__s.__size_;}
14910b57cec5SDimitry Andric#   endif
14920b57cec5SDimitry Andric
14930b57cec5SDimitry Andric#else  // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
14940b57cec5SDimitry Andric
14950b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14960b57cec5SDimitry Andric    void __set_short_size(size_type __s) _NOEXCEPT
14970b57cec5SDimitry Andric#   ifdef _LIBCPP_BIG_ENDIAN
14980b57cec5SDimitry Andric        {__r_.first().__s.__size_ = (unsigned char)(__s);}
14990b57cec5SDimitry Andric#   else
15000b57cec5SDimitry Andric        {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
15010b57cec5SDimitry Andric#   endif
15020b57cec5SDimitry Andric
15030b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15040b57cec5SDimitry Andric    size_type __get_short_size() const _NOEXCEPT
15050b57cec5SDimitry Andric#   ifdef _LIBCPP_BIG_ENDIAN
15060b57cec5SDimitry Andric        {return __r_.first().__s.__size_;}
15070b57cec5SDimitry Andric#   else
15080b57cec5SDimitry Andric        {return __r_.first().__s.__size_ >> 1;}
15090b57cec5SDimitry Andric#   endif
15100b57cec5SDimitry Andric
15110b57cec5SDimitry Andric#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
15120b57cec5SDimitry Andric
15130b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15140b57cec5SDimitry Andric    void __set_long_size(size_type __s) _NOEXCEPT
15150b57cec5SDimitry Andric        {__r_.first().__l.__size_ = __s;}
15160b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15170b57cec5SDimitry Andric    size_type __get_long_size() const _NOEXCEPT
15180b57cec5SDimitry Andric        {return __r_.first().__l.__size_;}
15190b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15200b57cec5SDimitry Andric    void __set_size(size_type __s) _NOEXCEPT
15210b57cec5SDimitry Andric        {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
15220b57cec5SDimitry Andric
15230b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15240b57cec5SDimitry Andric    void __set_long_cap(size_type __s) _NOEXCEPT
15250b57cec5SDimitry Andric        {__r_.first().__l.__cap_  = __long_mask | __s;}
15260b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15270b57cec5SDimitry Andric    size_type __get_long_cap() const _NOEXCEPT
15280b57cec5SDimitry Andric        {return __r_.first().__l.__cap_ & size_type(~__long_mask);}
15290b57cec5SDimitry Andric
15300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15310b57cec5SDimitry Andric    void __set_long_pointer(pointer __p) _NOEXCEPT
15320b57cec5SDimitry Andric        {__r_.first().__l.__data_ = __p;}
15330b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15340b57cec5SDimitry Andric    pointer __get_long_pointer() _NOEXCEPT
15350b57cec5SDimitry Andric        {return __r_.first().__l.__data_;}
15360b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15370b57cec5SDimitry Andric    const_pointer __get_long_pointer() const _NOEXCEPT
15380b57cec5SDimitry Andric        {return __r_.first().__l.__data_;}
15390b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15400b57cec5SDimitry Andric    pointer __get_short_pointer() _NOEXCEPT
15410b57cec5SDimitry Andric        {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
15420b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15430b57cec5SDimitry Andric    const_pointer __get_short_pointer() const _NOEXCEPT
15440b57cec5SDimitry Andric        {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
15450b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15460b57cec5SDimitry Andric    pointer __get_pointer() _NOEXCEPT
15470b57cec5SDimitry Andric        {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
15480b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15490b57cec5SDimitry Andric    const_pointer __get_pointer() const _NOEXCEPT
15500b57cec5SDimitry Andric        {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
15510b57cec5SDimitry Andric
15520b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15530b57cec5SDimitry Andric    void __zero() _NOEXCEPT
15540b57cec5SDimitry Andric        {
15550b57cec5SDimitry Andric            size_type (&__a)[__n_words] = __r_.first().__r.__words;
15560b57cec5SDimitry Andric            for (unsigned __i = 0; __i < __n_words; ++__i)
15570b57cec5SDimitry Andric                __a[__i] = 0;
15580b57cec5SDimitry Andric        }
15590b57cec5SDimitry Andric
15600b57cec5SDimitry Andric    template <size_type __a> static
15610b57cec5SDimitry Andric        _LIBCPP_INLINE_VISIBILITY
15620b57cec5SDimitry Andric        size_type __align_it(size_type __s) _NOEXCEPT
15630b57cec5SDimitry Andric            {return (__s + (__a-1)) & ~(__a-1);}
15640b57cec5SDimitry Andric    enum {__alignment = 16};
15650b57cec5SDimitry Andric    static _LIBCPP_INLINE_VISIBILITY
15660b57cec5SDimitry Andric    size_type __recommend(size_type __s) _NOEXCEPT
15670b57cec5SDimitry Andric        {
15680b57cec5SDimitry Andric        if (__s < __min_cap) return static_cast<size_type>(__min_cap) - 1;
15690b57cec5SDimitry Andric        size_type __guess = __align_it<sizeof(value_type) < __alignment ?
15700b57cec5SDimitry Andric                     __alignment/sizeof(value_type) : 1 > (__s+1) - 1;
15710b57cec5SDimitry Andric        if (__guess == __min_cap) ++__guess;
15720b57cec5SDimitry Andric        return __guess;
15730b57cec5SDimitry Andric        }
15740b57cec5SDimitry Andric
15750b57cec5SDimitry Andric    inline
15760b57cec5SDimitry Andric    void __init(const value_type* __s, size_type __sz, size_type __reserve);
15770b57cec5SDimitry Andric    inline
15780b57cec5SDimitry Andric    void __init(const value_type* __s, size_type __sz);
15790b57cec5SDimitry Andric    inline
15800b57cec5SDimitry Andric    void __init(size_type __n, value_type __c);
15810b57cec5SDimitry Andric
15825ffd83dbSDimitry Andric    // Slow path for the (inlined) copy constructor for 'long' strings.
15835ffd83dbSDimitry Andric    // Always externally instantiated and not inlined.
15845ffd83dbSDimitry Andric    // Requires that __s is zero terminated.
15855ffd83dbSDimitry Andric    // The main reason for this function to exist is because for unstable, we
15865ffd83dbSDimitry Andric    // want to allow inlining of the copy constructor. However, we don't want
15875ffd83dbSDimitry Andric    // to call the __init() functions as those are marked as inline which may
15885ffd83dbSDimitry Andric    // result in over-aggressive inlining by the compiler, where our aim is
15895ffd83dbSDimitry Andric    // to only inline the fast path code directly in the ctor.
15905ffd83dbSDimitry Andric    void __init_copy_ctor_external(const value_type* __s, size_type __sz);
15915ffd83dbSDimitry Andric
15920b57cec5SDimitry Andric    template <class _InputIterator>
15930b57cec5SDimitry Andric    inline
15945ffd83dbSDimitry Andric    _EnableIf
15950b57cec5SDimitry Andric    <
15965ffd83dbSDimitry Andric        __is_exactly_cpp17_input_iterator<_InputIterator>::value
15975ffd83dbSDimitry Andric    >
15980b57cec5SDimitry Andric    __init(_InputIterator __first, _InputIterator __last);
15990b57cec5SDimitry Andric
16000b57cec5SDimitry Andric    template <class _ForwardIterator>
16010b57cec5SDimitry Andric    inline
16025ffd83dbSDimitry Andric    _EnableIf
16030b57cec5SDimitry Andric    <
16045ffd83dbSDimitry Andric        __is_cpp17_forward_iterator<_ForwardIterator>::value
16055ffd83dbSDimitry Andric    >
16060b57cec5SDimitry Andric    __init(_ForwardIterator __first, _ForwardIterator __last);
16070b57cec5SDimitry Andric
16080b57cec5SDimitry Andric    void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
16090b57cec5SDimitry Andric                   size_type __n_copy,  size_type __n_del,     size_type __n_add = 0);
16100b57cec5SDimitry Andric    void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
16110b57cec5SDimitry Andric                               size_type __n_copy,  size_type __n_del,
16120b57cec5SDimitry Andric                               size_type __n_add, const value_type* __p_new_stuff);
16130b57cec5SDimitry Andric
16145ffd83dbSDimitry Andric    // __assign_no_alias is invoked for assignment operations where we
16155ffd83dbSDimitry Andric    // have proof that the input does not alias the current instance.
16165ffd83dbSDimitry Andric    // For example, operator=(basic_string) performs a 'self' check.
16175ffd83dbSDimitry Andric    template <bool __is_short>
16185ffd83dbSDimitry Andric    basic_string& __assign_no_alias(const value_type* __s, size_type __n);
16195ffd83dbSDimitry Andric
16200b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16210b57cec5SDimitry Andric    void __erase_to_end(size_type __pos);
16220b57cec5SDimitry Andric
16235ffd83dbSDimitry Andric    // __erase_external_with_move is invoked for erase() invocations where
16245ffd83dbSDimitry Andric    // `n ~= npos`, likely requiring memory moves on the string data.
16255ffd83dbSDimitry Andric    void __erase_external_with_move(size_type __pos, size_type __n);
16265ffd83dbSDimitry Andric
16270b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16280b57cec5SDimitry Andric    void __copy_assign_alloc(const basic_string& __str)
16290b57cec5SDimitry Andric        {__copy_assign_alloc(__str, integral_constant<bool,
16300b57cec5SDimitry Andric                      __alloc_traits::propagate_on_container_copy_assignment::value>());}
16310b57cec5SDimitry Andric
16320b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16330b57cec5SDimitry Andric    void __copy_assign_alloc(const basic_string& __str, true_type)
16340b57cec5SDimitry Andric        {
16350b57cec5SDimitry Andric            if (__alloc() == __str.__alloc())
16360b57cec5SDimitry Andric                __alloc() = __str.__alloc();
16370b57cec5SDimitry Andric            else
16380b57cec5SDimitry Andric            {
16390b57cec5SDimitry Andric                if (!__str.__is_long())
16400b57cec5SDimitry Andric                {
16410b57cec5SDimitry Andric                    __clear_and_shrink();
16420b57cec5SDimitry Andric                    __alloc() = __str.__alloc();
16430b57cec5SDimitry Andric                }
16440b57cec5SDimitry Andric                else
16450b57cec5SDimitry Andric                {
16460b57cec5SDimitry Andric                    allocator_type __a = __str.__alloc();
16470b57cec5SDimitry Andric                    pointer __p = __alloc_traits::allocate(__a, __str.__get_long_cap());
16480b57cec5SDimitry Andric                    __clear_and_shrink();
16490b57cec5SDimitry Andric                    __alloc() = _VSTD::move(__a);
16500b57cec5SDimitry Andric                    __set_long_pointer(__p);
16510b57cec5SDimitry Andric                    __set_long_cap(__str.__get_long_cap());
16520b57cec5SDimitry Andric                    __set_long_size(__str.size());
16530b57cec5SDimitry Andric                }
16540b57cec5SDimitry Andric            }
16550b57cec5SDimitry Andric        }
16560b57cec5SDimitry Andric
16570b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16580b57cec5SDimitry Andric    void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
16590b57cec5SDimitry Andric        {}
16600b57cec5SDimitry Andric
16610b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
16620b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16630b57cec5SDimitry Andric    void __move_assign(basic_string& __str, false_type)
16640b57cec5SDimitry Andric        _NOEXCEPT_(__alloc_traits::is_always_equal::value);
16650b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16660b57cec5SDimitry Andric    void __move_assign(basic_string& __str, true_type)
16670b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 14
16680b57cec5SDimitry Andric        _NOEXCEPT;
16690b57cec5SDimitry Andric#else
16700b57cec5SDimitry Andric        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
16710b57cec5SDimitry Andric#endif
16720b57cec5SDimitry Andric#endif
16730b57cec5SDimitry Andric
16740b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16750b57cec5SDimitry Andric    void
16760b57cec5SDimitry Andric    __move_assign_alloc(basic_string& __str)
16770b57cec5SDimitry Andric        _NOEXCEPT_(
16780b57cec5SDimitry Andric            !__alloc_traits::propagate_on_container_move_assignment::value ||
16790b57cec5SDimitry Andric            is_nothrow_move_assignable<allocator_type>::value)
16800b57cec5SDimitry Andric    {__move_assign_alloc(__str, integral_constant<bool,
16810b57cec5SDimitry Andric                      __alloc_traits::propagate_on_container_move_assignment::value>());}
16820b57cec5SDimitry Andric
16830b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16840b57cec5SDimitry Andric    void __move_assign_alloc(basic_string& __c, true_type)
16850b57cec5SDimitry Andric        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
16860b57cec5SDimitry Andric        {
16870b57cec5SDimitry Andric            __alloc() = _VSTD::move(__c.__alloc());
16880b57cec5SDimitry Andric        }
16890b57cec5SDimitry Andric
16900b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16910b57cec5SDimitry Andric    void __move_assign_alloc(basic_string&, false_type)
16920b57cec5SDimitry Andric        _NOEXCEPT
16930b57cec5SDimitry Andric        {}
16940b57cec5SDimitry Andric
16955ffd83dbSDimitry Andric    basic_string& __assign_external(const value_type* __s);
16965ffd83dbSDimitry Andric    basic_string& __assign_external(const value_type* __s, size_type __n);
16975ffd83dbSDimitry Andric
16985ffd83dbSDimitry Andric    // Assigns the value in __s, guaranteed to be __n < __min_cap in length.
16995ffd83dbSDimitry Andric    inline basic_string& __assign_short(const value_type* __s, size_type __n) {
17005ffd83dbSDimitry Andric      pointer __p = __is_long()
17015ffd83dbSDimitry Andric                        ? (__set_long_size(__n), __get_long_pointer())
17025ffd83dbSDimitry Andric                        : (__set_short_size(__n), __get_short_pointer());
17035ffd83dbSDimitry Andric      traits_type::move(_VSTD::__to_address(__p), __s, __n);
17045ffd83dbSDimitry Andric      traits_type::assign(__p[__n], value_type());
17055ffd83dbSDimitry Andric      return *this;
17065ffd83dbSDimitry Andric    }
17075ffd83dbSDimitry Andric
17080b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
17090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type);
17100b57cec5SDimitry Andric
1711fe6060f1SDimitry Andric    template<class _Tp>
1712fe6060f1SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
1713fe6060f1SDimitry Andric    bool __addr_in_range(_Tp&& __t) const {
1714fe6060f1SDimitry Andric        const volatile void *__p = _VSTD::addressof(__t);
1715fe6060f1SDimitry Andric        return data() <= __p && __p <= data() + size();
1716fe6060f1SDimitry Andric    }
1717fe6060f1SDimitry Andric
1718*69ade1e0SDimitry Andric    _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI
1719*69ade1e0SDimitry Andric    void __throw_length_error() const {
1720*69ade1e0SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
1721*69ade1e0SDimitry Andric        __basic_string_common<true>::__throw_length_error();
1722*69ade1e0SDimitry Andric#else
1723*69ade1e0SDimitry Andric        _VSTD::abort();
1724*69ade1e0SDimitry Andric#endif
1725*69ade1e0SDimitry Andric    }
1726*69ade1e0SDimitry Andric
1727*69ade1e0SDimitry Andric    _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI
1728*69ade1e0SDimitry Andric    void __throw_out_of_range() const {
1729*69ade1e0SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
1730*69ade1e0SDimitry Andric        __basic_string_common<true>::__throw_out_of_range();
1731*69ade1e0SDimitry Andric#else
1732*69ade1e0SDimitry Andric        _VSTD::abort();
1733*69ade1e0SDimitry Andric#endif
1734*69ade1e0SDimitry Andric    }
1735*69ade1e0SDimitry Andric
17360b57cec5SDimitry Andric    friend basic_string operator+<>(const basic_string&, const basic_string&);
17370b57cec5SDimitry Andric    friend basic_string operator+<>(const value_type*, const basic_string&);
17380b57cec5SDimitry Andric    friend basic_string operator+<>(value_type, const basic_string&);
17390b57cec5SDimitry Andric    friend basic_string operator+<>(const basic_string&, const value_type*);
17400b57cec5SDimitry Andric    friend basic_string operator+<>(const basic_string&, value_type);
17410b57cec5SDimitry Andric};
17420b57cec5SDimitry Andric
17435ffd83dbSDimitry Andric// These declarations must appear before any functions are implicitly used
17445ffd83dbSDimitry Andric// so that they have the correct visibility specifier.
17455ffd83dbSDimitry Andric#ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
17465ffd83dbSDimitry Andric_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, char)
17475ffd83dbSDimitry Andric_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, wchar_t)
17485ffd83dbSDimitry Andric#else
17495ffd83dbSDimitry Andric_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, char)
17505ffd83dbSDimitry Andric_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, wchar_t)
17515ffd83dbSDimitry Andric#endif
17525ffd83dbSDimitry Andric
17535ffd83dbSDimitry Andric
17540b57cec5SDimitry Andric#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
17550b57cec5SDimitry Andrictemplate<class _InputIterator,
1756fe6060f1SDimitry Andric         class _CharT = __iter_value_type<_InputIterator>,
17570b57cec5SDimitry Andric         class _Allocator = allocator<_CharT>,
17585ffd83dbSDimitry Andric         class = _EnableIf<__is_cpp17_input_iterator<_InputIterator>::value>,
17595ffd83dbSDimitry Andric         class = _EnableIf<__is_allocator<_Allocator>::value>
17600b57cec5SDimitry Andric         >
17610b57cec5SDimitry Andricbasic_string(_InputIterator, _InputIterator, _Allocator = _Allocator())
17620b57cec5SDimitry Andric  -> basic_string<_CharT, char_traits<_CharT>, _Allocator>;
17630b57cec5SDimitry Andric
17640b57cec5SDimitry Andrictemplate<class _CharT,
17650b57cec5SDimitry Andric         class _Traits,
17660b57cec5SDimitry Andric         class _Allocator = allocator<_CharT>,
17675ffd83dbSDimitry Andric         class = _EnableIf<__is_allocator<_Allocator>::value>
17680b57cec5SDimitry Andric         >
17690b57cec5SDimitry Andricexplicit basic_string(basic_string_view<_CharT, _Traits>, const _Allocator& = _Allocator())
17700b57cec5SDimitry Andric  -> basic_string<_CharT, _Traits, _Allocator>;
17710b57cec5SDimitry Andric
17720b57cec5SDimitry Andrictemplate<class _CharT,
17730b57cec5SDimitry Andric         class _Traits,
17740b57cec5SDimitry Andric         class _Allocator = allocator<_CharT>,
17755ffd83dbSDimitry Andric         class = _EnableIf<__is_allocator<_Allocator>::value>,
17760b57cec5SDimitry Andric         class _Sz = typename allocator_traits<_Allocator>::size_type
17770b57cec5SDimitry Andric         >
17780b57cec5SDimitry Andricbasic_string(basic_string_view<_CharT, _Traits>, _Sz, _Sz, const _Allocator& = _Allocator())
17790b57cec5SDimitry Andric  -> basic_string<_CharT, _Traits, _Allocator>;
17800b57cec5SDimitry Andric#endif
17810b57cec5SDimitry Andric
17820b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
17830b57cec5SDimitry Andricinline
17840b57cec5SDimitry Andricvoid
17850b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators()
17860b57cec5SDimitry Andric{
1787e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
17880b57cec5SDimitry Andric    __get_db()->__invalidate_all(this);
1789e8d8bef9SDimitry Andric#endif
17900b57cec5SDimitry Andric}
17910b57cec5SDimitry Andric
17920b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
17930b57cec5SDimitry Andricinline
17940b57cec5SDimitry Andricvoid
1795fe6060f1SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type __pos)
17960b57cec5SDimitry Andric{
1797e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
17980b57cec5SDimitry Andric    __c_node* __c = __get_db()->__find_c_and_lock(this);
17990b57cec5SDimitry Andric    if (__c)
18000b57cec5SDimitry Andric    {
18010b57cec5SDimitry Andric        const_pointer __new_last = __get_pointer() + __pos;
18020b57cec5SDimitry Andric        for (__i_node** __p = __c->end_; __p != __c->beg_; )
18030b57cec5SDimitry Andric        {
18040b57cec5SDimitry Andric            --__p;
18050b57cec5SDimitry Andric            const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
18060b57cec5SDimitry Andric            if (__i->base() > __new_last)
18070b57cec5SDimitry Andric            {
18080b57cec5SDimitry Andric                (*__p)->__c_ = nullptr;
18090b57cec5SDimitry Andric                if (--__c->end_ != __p)
1810e8d8bef9SDimitry Andric                    _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
18110b57cec5SDimitry Andric            }
18120b57cec5SDimitry Andric        }
18130b57cec5SDimitry Andric        __get_db()->unlock();
18140b57cec5SDimitry Andric    }
1815fe6060f1SDimitry Andric#else
1816fe6060f1SDimitry Andric    (void)__pos;
1817e8d8bef9SDimitry Andric#endif // _LIBCPP_DEBUG_LEVEL == 2
18180b57cec5SDimitry Andric}
18190b57cec5SDimitry Andric
18200b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
18210b57cec5SDimitry Andricinline
18220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string()
18230b57cec5SDimitry Andric    _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
1824480093f4SDimitry Andric     : __r_(__default_init_tag(), __default_init_tag())
18250b57cec5SDimitry Andric{
1826e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
18270b57cec5SDimitry Andric    __get_db()->__insert_c(this);
18280b57cec5SDimitry Andric#endif
18290b57cec5SDimitry Andric    __zero();
18300b57cec5SDimitry Andric}
18310b57cec5SDimitry Andric
18320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
18330b57cec5SDimitry Andricinline
18340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
18350b57cec5SDimitry Andric#if _LIBCPP_STD_VER <= 14
18360b57cec5SDimitry Andric        _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
18370b57cec5SDimitry Andric#else
18380b57cec5SDimitry Andric        _NOEXCEPT
18390b57cec5SDimitry Andric#endif
1840480093f4SDimitry Andric: __r_(__default_init_tag(), __a)
18410b57cec5SDimitry Andric{
1842e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
18430b57cec5SDimitry Andric    __get_db()->__insert_c(this);
18440b57cec5SDimitry Andric#endif
18450b57cec5SDimitry Andric    __zero();
18460b57cec5SDimitry Andric}
18470b57cec5SDimitry Andric
18480b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
18490b57cec5SDimitry Andricvoid basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s,
18500b57cec5SDimitry Andric                                                       size_type __sz,
18510b57cec5SDimitry Andric                                                       size_type __reserve)
18520b57cec5SDimitry Andric{
18530b57cec5SDimitry Andric    if (__reserve > max_size())
18540b57cec5SDimitry Andric        this->__throw_length_error();
18550b57cec5SDimitry Andric    pointer __p;
18560b57cec5SDimitry Andric    if (__reserve < __min_cap)
18570b57cec5SDimitry Andric    {
18580b57cec5SDimitry Andric        __set_short_size(__sz);
18590b57cec5SDimitry Andric        __p = __get_short_pointer();
18600b57cec5SDimitry Andric    }
18610b57cec5SDimitry Andric    else
18620b57cec5SDimitry Andric    {
18630b57cec5SDimitry Andric        size_type __cap = __recommend(__reserve);
18640b57cec5SDimitry Andric        __p = __alloc_traits::allocate(__alloc(), __cap+1);
18650b57cec5SDimitry Andric        __set_long_pointer(__p);
18660b57cec5SDimitry Andric        __set_long_cap(__cap+1);
18670b57cec5SDimitry Andric        __set_long_size(__sz);
18680b57cec5SDimitry Andric    }
1869480093f4SDimitry Andric    traits_type::copy(_VSTD::__to_address(__p), __s, __sz);
18700b57cec5SDimitry Andric    traits_type::assign(__p[__sz], value_type());
18710b57cec5SDimitry Andric}
18720b57cec5SDimitry Andric
18730b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
18740b57cec5SDimitry Andricvoid
18750b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
18760b57cec5SDimitry Andric{
18770b57cec5SDimitry Andric    if (__sz > max_size())
18780b57cec5SDimitry Andric        this->__throw_length_error();
18790b57cec5SDimitry Andric    pointer __p;
18800b57cec5SDimitry Andric    if (__sz < __min_cap)
18810b57cec5SDimitry Andric    {
18820b57cec5SDimitry Andric        __set_short_size(__sz);
18830b57cec5SDimitry Andric        __p = __get_short_pointer();
18840b57cec5SDimitry Andric    }
18850b57cec5SDimitry Andric    else
18860b57cec5SDimitry Andric    {
18870b57cec5SDimitry Andric        size_type __cap = __recommend(__sz);
18880b57cec5SDimitry Andric        __p = __alloc_traits::allocate(__alloc(), __cap+1);
18890b57cec5SDimitry Andric        __set_long_pointer(__p);
18900b57cec5SDimitry Andric        __set_long_cap(__cap+1);
18910b57cec5SDimitry Andric        __set_long_size(__sz);
18920b57cec5SDimitry Andric    }
1893480093f4SDimitry Andric    traits_type::copy(_VSTD::__to_address(__p), __s, __sz);
18940b57cec5SDimitry Andric    traits_type::assign(__p[__sz], value_type());
18950b57cec5SDimitry Andric}
18960b57cec5SDimitry Andric
18970b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
18980b57cec5SDimitry Andrictemplate <class>
18990b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, const _Allocator& __a)
1900480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
19010b57cec5SDimitry Andric{
19020b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
19030b57cec5SDimitry Andric    __init(__s, traits_type::length(__s));
1904e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
19050b57cec5SDimitry Andric    __get_db()->__insert_c(this);
19060b57cec5SDimitry Andric#endif
19070b57cec5SDimitry Andric}
19080b57cec5SDimitry Andric
19090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
19100b57cec5SDimitry Andricinline
19110b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, size_type __n)
1912480093f4SDimitry Andric     : __r_(__default_init_tag(), __default_init_tag())
19130b57cec5SDimitry Andric{
19140b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
19150b57cec5SDimitry Andric    __init(__s, __n);
1916e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
19170b57cec5SDimitry Andric    __get_db()->__insert_c(this);
19180b57cec5SDimitry Andric#endif
19190b57cec5SDimitry Andric}
19200b57cec5SDimitry Andric
19210b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
19220b57cec5SDimitry Andricinline
19230b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, size_type __n, const _Allocator& __a)
1924480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
19250b57cec5SDimitry Andric{
19260b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
19270b57cec5SDimitry Andric    __init(__s, __n);
1928e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
19290b57cec5SDimitry Andric    __get_db()->__insert_c(this);
19300b57cec5SDimitry Andric#endif
19310b57cec5SDimitry Andric}
19320b57cec5SDimitry Andric
19330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
19340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
1935480093f4SDimitry Andric    : __r_(__default_init_tag(), __alloc_traits::select_on_container_copy_construction(__str.__alloc()))
19360b57cec5SDimitry Andric{
19370b57cec5SDimitry Andric    if (!__str.__is_long())
19380b57cec5SDimitry Andric        __r_.first().__r = __str.__r_.first().__r;
19390b57cec5SDimitry Andric    else
19405ffd83dbSDimitry Andric        __init_copy_ctor_external(_VSTD::__to_address(__str.__get_long_pointer()),
19415ffd83dbSDimitry Andric                                  __str.__get_long_size());
19425ffd83dbSDimitry Andric
1943e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
19440b57cec5SDimitry Andric    __get_db()->__insert_c(this);
19450b57cec5SDimitry Andric#endif
19460b57cec5SDimitry Andric}
19470b57cec5SDimitry Andric
19480b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
19490b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(
19500b57cec5SDimitry Andric    const basic_string& __str, const allocator_type& __a)
1951480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
19520b57cec5SDimitry Andric{
19530b57cec5SDimitry Andric    if (!__str.__is_long())
19540b57cec5SDimitry Andric        __r_.first().__r = __str.__r_.first().__r;
19550b57cec5SDimitry Andric    else
19565ffd83dbSDimitry Andric        __init_copy_ctor_external(_VSTD::__to_address(__str.__get_long_pointer()),
19575ffd83dbSDimitry Andric                                  __str.__get_long_size());
1958e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
19590b57cec5SDimitry Andric    __get_db()->__insert_c(this);
19600b57cec5SDimitry Andric#endif
19610b57cec5SDimitry Andric}
19620b57cec5SDimitry Andric
19635ffd83dbSDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
19645ffd83dbSDimitry Andricvoid basic_string<_CharT, _Traits, _Allocator>::__init_copy_ctor_external(
19655ffd83dbSDimitry Andric    const value_type* __s, size_type __sz) {
19665ffd83dbSDimitry Andric  pointer __p;
19675ffd83dbSDimitry Andric  if (__sz < __min_cap) {
19685ffd83dbSDimitry Andric    __p = __get_short_pointer();
19695ffd83dbSDimitry Andric    __set_short_size(__sz);
19705ffd83dbSDimitry Andric  } else {
19715ffd83dbSDimitry Andric    if (__sz > max_size())
19725ffd83dbSDimitry Andric      this->__throw_length_error();
19735ffd83dbSDimitry Andric    size_t __cap = __recommend(__sz);
19745ffd83dbSDimitry Andric    __p = __alloc_traits::allocate(__alloc(), __cap + 1);
19755ffd83dbSDimitry Andric    __set_long_pointer(__p);
19765ffd83dbSDimitry Andric    __set_long_cap(__cap + 1);
19775ffd83dbSDimitry Andric    __set_long_size(__sz);
19785ffd83dbSDimitry Andric  }
19795ffd83dbSDimitry Andric  traits_type::copy(_VSTD::__to_address(__p), __s, __sz + 1);
19805ffd83dbSDimitry Andric}
19815ffd83dbSDimitry Andric
19820b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
19830b57cec5SDimitry Andric
19840b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
19850b57cec5SDimitry Andricinline
19860b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str)
19870b57cec5SDimitry Andric#if _LIBCPP_STD_VER <= 14
19880b57cec5SDimitry Andric        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
19890b57cec5SDimitry Andric#else
19900b57cec5SDimitry Andric        _NOEXCEPT
19910b57cec5SDimitry Andric#endif
19920b57cec5SDimitry Andric    : __r_(_VSTD::move(__str.__r_))
19930b57cec5SDimitry Andric{
19940b57cec5SDimitry Andric    __str.__zero();
1995e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
19960b57cec5SDimitry Andric    __get_db()->__insert_c(this);
19970b57cec5SDimitry Andric    if (__is_long())
19980b57cec5SDimitry Andric        __get_db()->swap(this, &__str);
19990b57cec5SDimitry Andric#endif
20000b57cec5SDimitry Andric}
20010b57cec5SDimitry Andric
20020b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
20030b57cec5SDimitry Andricinline
20040b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)
2005480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
20060b57cec5SDimitry Andric{
20070b57cec5SDimitry Andric    if (__str.__is_long() && __a != __str.__alloc()) // copy, not move
2008480093f4SDimitry Andric        __init(_VSTD::__to_address(__str.__get_long_pointer()), __str.__get_long_size());
20090b57cec5SDimitry Andric    else
20100b57cec5SDimitry Andric    {
20110b57cec5SDimitry Andric        __r_.first().__r = __str.__r_.first().__r;
20120b57cec5SDimitry Andric        __str.__zero();
20130b57cec5SDimitry Andric    }
2014e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
20150b57cec5SDimitry Andric    __get_db()->__insert_c(this);
20160b57cec5SDimitry Andric    if (__is_long())
20170b57cec5SDimitry Andric        __get_db()->swap(this, &__str);
20180b57cec5SDimitry Andric#endif
20190b57cec5SDimitry Andric}
20200b57cec5SDimitry Andric
20210b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
20220b57cec5SDimitry Andric
20230b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
20240b57cec5SDimitry Andricvoid
20250b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
20260b57cec5SDimitry Andric{
20270b57cec5SDimitry Andric    if (__n > max_size())
20280b57cec5SDimitry Andric        this->__throw_length_error();
20290b57cec5SDimitry Andric    pointer __p;
20300b57cec5SDimitry Andric    if (__n < __min_cap)
20310b57cec5SDimitry Andric    {
20320b57cec5SDimitry Andric        __set_short_size(__n);
20330b57cec5SDimitry Andric        __p = __get_short_pointer();
20340b57cec5SDimitry Andric    }
20350b57cec5SDimitry Andric    else
20360b57cec5SDimitry Andric    {
20370b57cec5SDimitry Andric        size_type __cap = __recommend(__n);
20380b57cec5SDimitry Andric        __p = __alloc_traits::allocate(__alloc(), __cap+1);
20390b57cec5SDimitry Andric        __set_long_pointer(__p);
20400b57cec5SDimitry Andric        __set_long_cap(__cap+1);
20410b57cec5SDimitry Andric        __set_long_size(__n);
20420b57cec5SDimitry Andric    }
2043480093f4SDimitry Andric    traits_type::assign(_VSTD::__to_address(__p), __n, __c);
20440b57cec5SDimitry Andric    traits_type::assign(__p[__n], value_type());
20450b57cec5SDimitry Andric}
20460b57cec5SDimitry Andric
20470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
20480b57cec5SDimitry Andricinline
20490b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, _CharT __c)
2050480093f4SDimitry Andric     : __r_(__default_init_tag(), __default_init_tag())
20510b57cec5SDimitry Andric{
20520b57cec5SDimitry Andric    __init(__n, __c);
2053e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
20540b57cec5SDimitry Andric    __get_db()->__insert_c(this);
20550b57cec5SDimitry Andric#endif
20560b57cec5SDimitry Andric}
20570b57cec5SDimitry Andric
20580b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
20590b57cec5SDimitry Andrictemplate <class>
20600b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, _CharT __c, const _Allocator& __a)
2061480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
20620b57cec5SDimitry Andric{
20630b57cec5SDimitry Andric    __init(__n, __c);
2064e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
20650b57cec5SDimitry Andric    __get_db()->__insert_c(this);
20660b57cec5SDimitry Andric#endif
20670b57cec5SDimitry Andric}
20680b57cec5SDimitry Andric
20690b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
20700b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str,
20710b57cec5SDimitry Andric                                                        size_type __pos, size_type __n,
20720b57cec5SDimitry Andric                                                        const _Allocator& __a)
2073480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
20740b57cec5SDimitry Andric{
20750b57cec5SDimitry Andric    size_type __str_sz = __str.size();
20760b57cec5SDimitry Andric    if (__pos > __str_sz)
20770b57cec5SDimitry Andric        this->__throw_out_of_range();
20780b57cec5SDimitry Andric    __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos));
2079e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
20800b57cec5SDimitry Andric    __get_db()->__insert_c(this);
20810b57cec5SDimitry Andric#endif
20820b57cec5SDimitry Andric}
20830b57cec5SDimitry Andric
20840b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
20850b57cec5SDimitry Andricinline
20860b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos,
20870b57cec5SDimitry Andric                                                        const _Allocator& __a)
2088480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
20890b57cec5SDimitry Andric{
20900b57cec5SDimitry Andric    size_type __str_sz = __str.size();
20910b57cec5SDimitry Andric    if (__pos > __str_sz)
20920b57cec5SDimitry Andric        this->__throw_out_of_range();
20930b57cec5SDimitry Andric    __init(__str.data() + __pos, __str_sz - __pos);
2094e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
20950b57cec5SDimitry Andric    __get_db()->__insert_c(this);
20960b57cec5SDimitry Andric#endif
20970b57cec5SDimitry Andric}
20980b57cec5SDimitry Andric
20990b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
21000b57cec5SDimitry Andrictemplate <class _Tp, class>
21010b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(
21020b57cec5SDimitry Andric             const _Tp& __t, size_type __pos, size_type __n, const allocator_type& __a)
2103480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
21040b57cec5SDimitry Andric{
21050b57cec5SDimitry Andric    __self_view __sv0 = __t;
21060b57cec5SDimitry Andric    __self_view __sv = __sv0.substr(__pos, __n);
21070b57cec5SDimitry Andric    __init(__sv.data(), __sv.size());
2108e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
21090b57cec5SDimitry Andric    __get_db()->__insert_c(this);
21100b57cec5SDimitry Andric#endif
21110b57cec5SDimitry Andric}
21120b57cec5SDimitry Andric
21130b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
21140b57cec5SDimitry Andrictemplate <class _Tp, class>
21150b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t)
2116480093f4SDimitry Andric     : __r_(__default_init_tag(), __default_init_tag())
21170b57cec5SDimitry Andric{
21180b57cec5SDimitry Andric    __self_view __sv = __t;
21190b57cec5SDimitry Andric    __init(__sv.data(), __sv.size());
2120e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
21210b57cec5SDimitry Andric    __get_db()->__insert_c(this);
21220b57cec5SDimitry Andric#endif
21230b57cec5SDimitry Andric}
21240b57cec5SDimitry Andric
21250b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
21260b57cec5SDimitry Andrictemplate <class _Tp, class>
21270b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t, const _Allocator& __a)
2128480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
21290b57cec5SDimitry Andric{
21300b57cec5SDimitry Andric    __self_view __sv = __t;
21310b57cec5SDimitry Andric    __init(__sv.data(), __sv.size());
2132e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
21330b57cec5SDimitry Andric    __get_db()->__insert_c(this);
21340b57cec5SDimitry Andric#endif
21350b57cec5SDimitry Andric}
21360b57cec5SDimitry Andric
21370b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
21380b57cec5SDimitry Andrictemplate <class _InputIterator>
21395ffd83dbSDimitry Andric_EnableIf
21400b57cec5SDimitry Andric<
21415ffd83dbSDimitry Andric    __is_exactly_cpp17_input_iterator<_InputIterator>::value
21425ffd83dbSDimitry Andric>
21430b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
21440b57cec5SDimitry Andric{
21450b57cec5SDimitry Andric    __zero();
21460b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
21470b57cec5SDimitry Andric    try
21480b57cec5SDimitry Andric    {
21490b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
21500b57cec5SDimitry Andric    for (; __first != __last; ++__first)
21510b57cec5SDimitry Andric        push_back(*__first);
21520b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
21530b57cec5SDimitry Andric    }
21540b57cec5SDimitry Andric    catch (...)
21550b57cec5SDimitry Andric    {
21560b57cec5SDimitry Andric        if (__is_long())
21570b57cec5SDimitry Andric            __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
21580b57cec5SDimitry Andric        throw;
21590b57cec5SDimitry Andric    }
21600b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS
21610b57cec5SDimitry Andric}
21620b57cec5SDimitry Andric
21630b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
21640b57cec5SDimitry Andrictemplate <class _ForwardIterator>
21655ffd83dbSDimitry Andric_EnableIf
21660b57cec5SDimitry Andric<
21675ffd83dbSDimitry Andric    __is_cpp17_forward_iterator<_ForwardIterator>::value
21685ffd83dbSDimitry Andric>
21690b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
21700b57cec5SDimitry Andric{
21710b57cec5SDimitry Andric    size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last));
21720b57cec5SDimitry Andric    if (__sz > max_size())
21730b57cec5SDimitry Andric        this->__throw_length_error();
21740b57cec5SDimitry Andric    pointer __p;
21750b57cec5SDimitry Andric    if (__sz < __min_cap)
21760b57cec5SDimitry Andric    {
21770b57cec5SDimitry Andric        __set_short_size(__sz);
21780b57cec5SDimitry Andric        __p = __get_short_pointer();
21790b57cec5SDimitry Andric    }
21800b57cec5SDimitry Andric    else
21810b57cec5SDimitry Andric    {
21820b57cec5SDimitry Andric        size_type __cap = __recommend(__sz);
21830b57cec5SDimitry Andric        __p = __alloc_traits::allocate(__alloc(), __cap+1);
21840b57cec5SDimitry Andric        __set_long_pointer(__p);
21850b57cec5SDimitry Andric        __set_long_cap(__cap+1);
21860b57cec5SDimitry Andric        __set_long_size(__sz);
21870b57cec5SDimitry Andric    }
2188fe6060f1SDimitry Andric
2189fe6060f1SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
2190fe6060f1SDimitry Andric    try
2191fe6060f1SDimitry Andric    {
2192fe6060f1SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
21930b57cec5SDimitry Andric    for (; __first != __last; ++__first, (void) ++__p)
21940b57cec5SDimitry Andric        traits_type::assign(*__p, *__first);
21950b57cec5SDimitry Andric    traits_type::assign(*__p, value_type());
2196fe6060f1SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
2197fe6060f1SDimitry Andric    }
2198fe6060f1SDimitry Andric    catch (...)
2199fe6060f1SDimitry Andric    {
2200fe6060f1SDimitry Andric        if (__is_long())
2201fe6060f1SDimitry Andric            __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2202fe6060f1SDimitry Andric        throw;
2203fe6060f1SDimitry Andric    }
2204fe6060f1SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
22050b57cec5SDimitry Andric}
22060b57cec5SDimitry Andric
22070b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
22080b57cec5SDimitry Andrictemplate<class _InputIterator, class>
22090b57cec5SDimitry Andricinline
22100b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last)
2211480093f4SDimitry Andric     : __r_(__default_init_tag(), __default_init_tag())
22120b57cec5SDimitry Andric{
22130b57cec5SDimitry Andric    __init(__first, __last);
2214e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
22150b57cec5SDimitry Andric    __get_db()->__insert_c(this);
22160b57cec5SDimitry Andric#endif
22170b57cec5SDimitry Andric}
22180b57cec5SDimitry Andric
22190b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
22200b57cec5SDimitry Andrictemplate<class _InputIterator, class>
22210b57cec5SDimitry Andricinline
22220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last,
22230b57cec5SDimitry Andric                                                        const allocator_type& __a)
2224480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
22250b57cec5SDimitry Andric{
22260b57cec5SDimitry Andric    __init(__first, __last);
2227e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
22280b57cec5SDimitry Andric    __get_db()->__insert_c(this);
22290b57cec5SDimitry Andric#endif
22300b57cec5SDimitry Andric}
22310b57cec5SDimitry Andric
22320b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
22330b57cec5SDimitry Andric
22340b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
22350b57cec5SDimitry Andricinline
22360b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(
22370b57cec5SDimitry Andric    initializer_list<_CharT> __il)
2238480093f4SDimitry Andric     : __r_(__default_init_tag(), __default_init_tag())
22390b57cec5SDimitry Andric{
22400b57cec5SDimitry Andric    __init(__il.begin(), __il.end());
2241e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
22420b57cec5SDimitry Andric    __get_db()->__insert_c(this);
22430b57cec5SDimitry Andric#endif
22440b57cec5SDimitry Andric}
22450b57cec5SDimitry Andric
22460b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
22470b57cec5SDimitry Andricinline
22480b57cec5SDimitry Andric
22490b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(
22500b57cec5SDimitry Andric    initializer_list<_CharT> __il, const _Allocator& __a)
2251480093f4SDimitry Andric    : __r_(__default_init_tag(), __a)
22520b57cec5SDimitry Andric{
22530b57cec5SDimitry Andric    __init(__il.begin(), __il.end());
2254e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
22550b57cec5SDimitry Andric    __get_db()->__insert_c(this);
22560b57cec5SDimitry Andric#endif
22570b57cec5SDimitry Andric}
22580b57cec5SDimitry Andric
22590b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
22600b57cec5SDimitry Andric
22610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
22620b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::~basic_string()
22630b57cec5SDimitry Andric{
2264e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
22650b57cec5SDimitry Andric    __get_db()->__erase_c(this);
22660b57cec5SDimitry Andric#endif
22670b57cec5SDimitry Andric    if (__is_long())
22680b57cec5SDimitry Andric        __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
22690b57cec5SDimitry Andric}
22700b57cec5SDimitry Andric
22710b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
22720b57cec5SDimitry Andricvoid
22730b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
22740b57cec5SDimitry Andric    (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
22750b57cec5SDimitry Andric     size_type __n_copy,  size_type __n_del,     size_type __n_add, const value_type* __p_new_stuff)
22760b57cec5SDimitry Andric{
22770b57cec5SDimitry Andric    size_type __ms = max_size();
22780b57cec5SDimitry Andric    if (__delta_cap > __ms - __old_cap - 1)
22790b57cec5SDimitry Andric        this->__throw_length_error();
22800b57cec5SDimitry Andric    pointer __old_p = __get_pointer();
22810b57cec5SDimitry Andric    size_type __cap = __old_cap < __ms / 2 - __alignment ?
22820b57cec5SDimitry Andric                          __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
22830b57cec5SDimitry Andric                          __ms - 1;
22840b57cec5SDimitry Andric    pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
22850b57cec5SDimitry Andric    __invalidate_all_iterators();
22860b57cec5SDimitry Andric    if (__n_copy != 0)
2287480093f4SDimitry Andric        traits_type::copy(_VSTD::__to_address(__p),
2288480093f4SDimitry Andric                          _VSTD::__to_address(__old_p), __n_copy);
22890b57cec5SDimitry Andric    if (__n_add != 0)
2290480093f4SDimitry Andric        traits_type::copy(_VSTD::__to_address(__p) + __n_copy, __p_new_stuff, __n_add);
22910b57cec5SDimitry Andric    size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
22920b57cec5SDimitry Andric    if (__sec_cp_sz != 0)
2293480093f4SDimitry Andric        traits_type::copy(_VSTD::__to_address(__p) + __n_copy + __n_add,
2294480093f4SDimitry Andric                          _VSTD::__to_address(__old_p) + __n_copy + __n_del, __sec_cp_sz);
22950b57cec5SDimitry Andric    if (__old_cap+1 != __min_cap)
22960b57cec5SDimitry Andric        __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
22970b57cec5SDimitry Andric    __set_long_pointer(__p);
22980b57cec5SDimitry Andric    __set_long_cap(__cap+1);
22990b57cec5SDimitry Andric    __old_sz = __n_copy + __n_add + __sec_cp_sz;
23000b57cec5SDimitry Andric    __set_long_size(__old_sz);
23010b57cec5SDimitry Andric    traits_type::assign(__p[__old_sz], value_type());
23020b57cec5SDimitry Andric}
23030b57cec5SDimitry Andric
23040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
23050b57cec5SDimitry Andricvoid
23060b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
23070b57cec5SDimitry Andric                                                     size_type __n_copy,  size_type __n_del,     size_type __n_add)
23080b57cec5SDimitry Andric{
23090b57cec5SDimitry Andric    size_type __ms = max_size();
23100b57cec5SDimitry Andric    if (__delta_cap > __ms - __old_cap)
23110b57cec5SDimitry Andric        this->__throw_length_error();
23120b57cec5SDimitry Andric    pointer __old_p = __get_pointer();
23130b57cec5SDimitry Andric    size_type __cap = __old_cap < __ms / 2 - __alignment ?
23140b57cec5SDimitry Andric                          __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
23150b57cec5SDimitry Andric                          __ms - 1;
23160b57cec5SDimitry Andric    pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
23170b57cec5SDimitry Andric    __invalidate_all_iterators();
23180b57cec5SDimitry Andric    if (__n_copy != 0)
2319480093f4SDimitry Andric        traits_type::copy(_VSTD::__to_address(__p),
2320480093f4SDimitry Andric                          _VSTD::__to_address(__old_p), __n_copy);
23210b57cec5SDimitry Andric    size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
23220b57cec5SDimitry Andric    if (__sec_cp_sz != 0)
2323480093f4SDimitry Andric        traits_type::copy(_VSTD::__to_address(__p) + __n_copy + __n_add,
2324480093f4SDimitry Andric                          _VSTD::__to_address(__old_p) + __n_copy + __n_del,
23250b57cec5SDimitry Andric                          __sec_cp_sz);
23260b57cec5SDimitry Andric    if (__old_cap+1 != __min_cap)
23270b57cec5SDimitry Andric        __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
23280b57cec5SDimitry Andric    __set_long_pointer(__p);
23290b57cec5SDimitry Andric    __set_long_cap(__cap+1);
23300b57cec5SDimitry Andric}
23310b57cec5SDimitry Andric
23320b57cec5SDimitry Andric// assign
23330b57cec5SDimitry Andric
23340b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
23355ffd83dbSDimitry Andrictemplate <bool __is_short>
23360b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
23375ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__assign_no_alias(
23385ffd83dbSDimitry Andric    const value_type* __s, size_type __n) {
23395ffd83dbSDimitry Andric  size_type __cap = __is_short ? __min_cap : __get_long_cap();
23405ffd83dbSDimitry Andric  if (__n < __cap) {
23415ffd83dbSDimitry Andric    pointer __p = __is_short ? __get_short_pointer() : __get_long_pointer();
23425ffd83dbSDimitry Andric    __is_short ? __set_short_size(__n) : __set_long_size(__n);
23435ffd83dbSDimitry Andric    traits_type::copy(_VSTD::__to_address(__p), __s, __n);
23445ffd83dbSDimitry Andric    traits_type::assign(__p[__n], value_type());
23455ffd83dbSDimitry Andric    __invalidate_iterators_past(__n);
23465ffd83dbSDimitry Andric  } else {
23475ffd83dbSDimitry Andric    size_type __sz = __is_short ? __get_short_size() : __get_long_size();
23485ffd83dbSDimitry Andric    __grow_by_and_replace(__cap - 1, __n - __cap + 1, __sz, 0, __sz, __n, __s);
23495ffd83dbSDimitry Andric  }
23505ffd83dbSDimitry Andric  return *this;
23515ffd83dbSDimitry Andric}
23525ffd83dbSDimitry Andric
23535ffd83dbSDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
23545ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
23555ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__assign_external(
23565ffd83dbSDimitry Andric    const value_type* __s, size_type __n) {
23570b57cec5SDimitry Andric  size_type __cap = capacity();
23585ffd83dbSDimitry Andric  if (__cap >= __n) {
2359480093f4SDimitry Andric    value_type* __p = _VSTD::__to_address(__get_pointer());
23600b57cec5SDimitry Andric    traits_type::move(__p, __s, __n);
23610b57cec5SDimitry Andric    traits_type::assign(__p[__n], value_type());
23620b57cec5SDimitry Andric    __set_size(__n);
23630b57cec5SDimitry Andric    __invalidate_iterators_past(__n);
23645ffd83dbSDimitry Andric  } else {
23650b57cec5SDimitry Andric    size_type __sz = size();
23660b57cec5SDimitry Andric    __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
23670b57cec5SDimitry Andric  }
23680b57cec5SDimitry Andric  return *this;
23690b57cec5SDimitry Andric}
23700b57cec5SDimitry Andric
23710b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
23720b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
23735ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
23745ffd83dbSDimitry Andric{
23755ffd83dbSDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr");
23765ffd83dbSDimitry Andric    return (_LIBCPP_BUILTIN_CONSTANT_P(__n) && __n < __min_cap)
23775ffd83dbSDimitry Andric               ? __assign_short(__s, __n)
23785ffd83dbSDimitry Andric               : __assign_external(__s, __n);
23795ffd83dbSDimitry Andric}
23805ffd83dbSDimitry Andric
23815ffd83dbSDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
23825ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
23830b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
23840b57cec5SDimitry Andric{
23850b57cec5SDimitry Andric    size_type __cap = capacity();
23860b57cec5SDimitry Andric    if (__cap < __n)
23870b57cec5SDimitry Andric    {
23880b57cec5SDimitry Andric        size_type __sz = size();
23890b57cec5SDimitry Andric        __grow_by(__cap, __n - __cap, __sz, 0, __sz);
23900b57cec5SDimitry Andric    }
2391480093f4SDimitry Andric    value_type* __p = _VSTD::__to_address(__get_pointer());
23920b57cec5SDimitry Andric    traits_type::assign(__p, __n, __c);
23930b57cec5SDimitry Andric    traits_type::assign(__p[__n], value_type());
23940b57cec5SDimitry Andric    __set_size(__n);
2395fe6060f1SDimitry Andric    __invalidate_iterators_past(__n);
23960b57cec5SDimitry Andric    return *this;
23970b57cec5SDimitry Andric}
23980b57cec5SDimitry Andric
23990b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
24000b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
24010b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
24020b57cec5SDimitry Andric{
24030b57cec5SDimitry Andric    pointer __p;
24040b57cec5SDimitry Andric    if (__is_long())
24050b57cec5SDimitry Andric    {
24060b57cec5SDimitry Andric        __p = __get_long_pointer();
24070b57cec5SDimitry Andric        __set_long_size(1);
24080b57cec5SDimitry Andric    }
24090b57cec5SDimitry Andric    else
24100b57cec5SDimitry Andric    {
24110b57cec5SDimitry Andric        __p = __get_short_pointer();
24120b57cec5SDimitry Andric        __set_short_size(1);
24130b57cec5SDimitry Andric    }
24140b57cec5SDimitry Andric    traits_type::assign(*__p, __c);
24150b57cec5SDimitry Andric    traits_type::assign(*++__p, value_type());
24160b57cec5SDimitry Andric    __invalidate_iterators_past(1);
24170b57cec5SDimitry Andric    return *this;
24180b57cec5SDimitry Andric}
24190b57cec5SDimitry Andric
24200b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
24210b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
24220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
24230b57cec5SDimitry Andric{
24245ffd83dbSDimitry Andric  if (this != &__str) {
24250b57cec5SDimitry Andric    __copy_assign_alloc(__str);
24265ffd83dbSDimitry Andric    if (!__is_long()) {
24275ffd83dbSDimitry Andric      if (!__str.__is_long()) {
24285ffd83dbSDimitry Andric        __r_.first().__r = __str.__r_.first().__r;
24295ffd83dbSDimitry Andric      } else {
24305ffd83dbSDimitry Andric        return __assign_no_alias<true>(__str.data(), __str.size());
24315ffd83dbSDimitry Andric      }
24325ffd83dbSDimitry Andric    } else {
24335ffd83dbSDimitry Andric      return __assign_no_alias<false>(__str.data(), __str.size());
24345ffd83dbSDimitry Andric    }
24350b57cec5SDimitry Andric  }
24360b57cec5SDimitry Andric  return *this;
24370b57cec5SDimitry Andric}
24380b57cec5SDimitry Andric
24390b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
24400b57cec5SDimitry Andric
24410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
24420b57cec5SDimitry Andricinline
24430b57cec5SDimitry Andricvoid
24440b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
24450b57cec5SDimitry Andric    _NOEXCEPT_(__alloc_traits::is_always_equal::value)
24460b57cec5SDimitry Andric{
24470b57cec5SDimitry Andric    if (__alloc() != __str.__alloc())
24480b57cec5SDimitry Andric        assign(__str);
24490b57cec5SDimitry Andric    else
24500b57cec5SDimitry Andric        __move_assign(__str, true_type());
24510b57cec5SDimitry Andric}
24520b57cec5SDimitry Andric
24530b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
24540b57cec5SDimitry Andricinline
24550b57cec5SDimitry Andricvoid
24560b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
24570b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 14
24580b57cec5SDimitry Andric    _NOEXCEPT
24590b57cec5SDimitry Andric#else
24600b57cec5SDimitry Andric    _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
24610b57cec5SDimitry Andric#endif
24620b57cec5SDimitry Andric{
2463480093f4SDimitry Andric  if (__is_long()) {
2464480093f4SDimitry Andric    __alloc_traits::deallocate(__alloc(), __get_long_pointer(),
2465480093f4SDimitry Andric                               __get_long_cap());
2466480093f4SDimitry Andric#if _LIBCPP_STD_VER <= 14
2467480093f4SDimitry Andric    if (!is_nothrow_move_assignable<allocator_type>::value) {
2468480093f4SDimitry Andric      __set_short_size(0);
2469480093f4SDimitry Andric      traits_type::assign(__get_short_pointer()[0], value_type());
2470480093f4SDimitry Andric    }
2471480093f4SDimitry Andric#endif
2472480093f4SDimitry Andric  }
24730b57cec5SDimitry Andric  __move_assign_alloc(__str);
2474480093f4SDimitry Andric  __r_.first() = __str.__r_.first();
2475480093f4SDimitry Andric  __str.__set_short_size(0);
2476480093f4SDimitry Andric  traits_type::assign(__str.__get_short_pointer()[0], value_type());
24770b57cec5SDimitry Andric}
24780b57cec5SDimitry Andric
24790b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
24800b57cec5SDimitry Andricinline
24810b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
24820b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str)
24830b57cec5SDimitry Andric    _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
24840b57cec5SDimitry Andric{
24850b57cec5SDimitry Andric    __move_assign(__str, integral_constant<bool,
24860b57cec5SDimitry Andric          __alloc_traits::propagate_on_container_move_assignment::value>());
24870b57cec5SDimitry Andric    return *this;
24880b57cec5SDimitry Andric}
24890b57cec5SDimitry Andric
24900b57cec5SDimitry Andric#endif
24910b57cec5SDimitry Andric
24920b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
24930b57cec5SDimitry Andrictemplate<class _InputIterator>
24945ffd83dbSDimitry Andric_EnableIf
24950b57cec5SDimitry Andric<
2496fe6060f1SDimitry Andric     __is_exactly_cpp17_input_iterator<_InputIterator>::value,
24970b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator>&
24985ffd83dbSDimitry Andric>
24990b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
25000b57cec5SDimitry Andric{
25010b57cec5SDimitry Andric    const basic_string __temp(__first, __last, __alloc());
25020b57cec5SDimitry Andric    assign(__temp.data(), __temp.size());
25030b57cec5SDimitry Andric    return *this;
25040b57cec5SDimitry Andric}
25050b57cec5SDimitry Andric
25060b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
25070b57cec5SDimitry Andrictemplate<class _ForwardIterator>
25085ffd83dbSDimitry Andric_EnableIf
25090b57cec5SDimitry Andric<
2510fe6060f1SDimitry Andric    __is_cpp17_forward_iterator<_ForwardIterator>::value,
25110b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator>&
25125ffd83dbSDimitry Andric>
25130b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
25140b57cec5SDimitry Andric{
25150b57cec5SDimitry Andric    size_type __cap = capacity();
2516fe6060f1SDimitry Andric    size_type __n = __string_is_trivial_iterator<_ForwardIterator>::value ?
2517fe6060f1SDimitry Andric        static_cast<size_type>(_VSTD::distance(__first, __last)) : 0;
2518fe6060f1SDimitry Andric
2519fe6060f1SDimitry Andric    if (__string_is_trivial_iterator<_ForwardIterator>::value &&
2520fe6060f1SDimitry Andric        (__cap >= __n || !__addr_in_range(*__first)))
2521fe6060f1SDimitry Andric    {
25220b57cec5SDimitry Andric        if (__cap < __n)
25230b57cec5SDimitry Andric        {
25240b57cec5SDimitry Andric            size_type __sz = size();
25250b57cec5SDimitry Andric            __grow_by(__cap, __n - __cap, __sz, 0, __sz);
25260b57cec5SDimitry Andric        }
25270b57cec5SDimitry Andric        pointer __p = __get_pointer();
25280b57cec5SDimitry Andric        for (; __first != __last; ++__first, ++__p)
25290b57cec5SDimitry Andric            traits_type::assign(*__p, *__first);
25300b57cec5SDimitry Andric        traits_type::assign(*__p, value_type());
25310b57cec5SDimitry Andric        __set_size(__n);
2532fe6060f1SDimitry Andric        __invalidate_iterators_past(__n);
2533fe6060f1SDimitry Andric    }
2534fe6060f1SDimitry Andric    else
2535fe6060f1SDimitry Andric    {
2536fe6060f1SDimitry Andric        const basic_string __temp(__first, __last, __alloc());
2537fe6060f1SDimitry Andric        assign(__temp.data(), __temp.size());
2538fe6060f1SDimitry Andric    }
25390b57cec5SDimitry Andric    return *this;
25400b57cec5SDimitry Andric}
25410b57cec5SDimitry Andric
25420b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
25430b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
25440b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
25450b57cec5SDimitry Andric{
25460b57cec5SDimitry Andric    size_type __sz = __str.size();
25470b57cec5SDimitry Andric    if (__pos > __sz)
25480b57cec5SDimitry Andric        this->__throw_out_of_range();
25490b57cec5SDimitry Andric    return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
25500b57cec5SDimitry Andric}
25510b57cec5SDimitry Andric
25520b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
25530b57cec5SDimitry Andrictemplate <class _Tp>
25545ffd83dbSDimitry Andric_EnableIf
25550b57cec5SDimitry Andric<
25565ffd83dbSDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
25575ffd83dbSDimitry Andric    && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
25580b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator>&
25595ffd83dbSDimitry Andric>
25600b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(const _Tp & __t, size_type __pos, size_type __n)
25610b57cec5SDimitry Andric{
25620b57cec5SDimitry Andric    __self_view __sv = __t;
25630b57cec5SDimitry Andric    size_type __sz = __sv.size();
25640b57cec5SDimitry Andric    if (__pos > __sz)
25650b57cec5SDimitry Andric        this->__throw_out_of_range();
25660b57cec5SDimitry Andric    return assign(__sv.data() + __pos, _VSTD::min(__n, __sz - __pos));
25670b57cec5SDimitry Andric}
25680b57cec5SDimitry Andric
25690b57cec5SDimitry Andric
25700b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
25710b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
25725ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__assign_external(const value_type* __s) {
25735ffd83dbSDimitry Andric  return __assign_external(__s, traits_type::length(__s));
25745ffd83dbSDimitry Andric}
25755ffd83dbSDimitry Andric
25765ffd83dbSDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
25775ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
25780b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
25790b57cec5SDimitry Andric{
25800b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
25815ffd83dbSDimitry Andric    return _LIBCPP_BUILTIN_CONSTANT_P(*__s)
25825ffd83dbSDimitry Andric               ? (traits_type::length(__s) < __min_cap
25835ffd83dbSDimitry Andric                      ? __assign_short(__s, traits_type::length(__s))
25845ffd83dbSDimitry Andric                      : __assign_external(__s, traits_type::length(__s)))
25855ffd83dbSDimitry Andric               : __assign_external(__s);
25860b57cec5SDimitry Andric}
25870b57cec5SDimitry Andric// append
25880b57cec5SDimitry Andric
25890b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
25900b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
25910b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
25920b57cec5SDimitry Andric{
25930b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
25940b57cec5SDimitry Andric    size_type __cap = capacity();
25950b57cec5SDimitry Andric    size_type __sz = size();
25960b57cec5SDimitry Andric    if (__cap - __sz >= __n)
25970b57cec5SDimitry Andric    {
25980b57cec5SDimitry Andric        if (__n)
25990b57cec5SDimitry Andric        {
2600480093f4SDimitry Andric            value_type* __p = _VSTD::__to_address(__get_pointer());
26010b57cec5SDimitry Andric            traits_type::copy(__p + __sz, __s, __n);
26020b57cec5SDimitry Andric            __sz += __n;
26030b57cec5SDimitry Andric            __set_size(__sz);
26040b57cec5SDimitry Andric            traits_type::assign(__p[__sz], value_type());
26050b57cec5SDimitry Andric        }
26060b57cec5SDimitry Andric    }
26070b57cec5SDimitry Andric    else
26080b57cec5SDimitry Andric        __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
26090b57cec5SDimitry Andric    return *this;
26100b57cec5SDimitry Andric}
26110b57cec5SDimitry Andric
26120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
26130b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
26140b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
26150b57cec5SDimitry Andric{
26160b57cec5SDimitry Andric    if (__n)
26170b57cec5SDimitry Andric    {
26180b57cec5SDimitry Andric        size_type __cap = capacity();
26190b57cec5SDimitry Andric        size_type __sz = size();
26200b57cec5SDimitry Andric        if (__cap - __sz < __n)
26210b57cec5SDimitry Andric            __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
26220b57cec5SDimitry Andric        pointer __p = __get_pointer();
2623480093f4SDimitry Andric        traits_type::assign(_VSTD::__to_address(__p) + __sz, __n, __c);
26240b57cec5SDimitry Andric        __sz += __n;
26250b57cec5SDimitry Andric        __set_size(__sz);
26260b57cec5SDimitry Andric        traits_type::assign(__p[__sz], value_type());
26270b57cec5SDimitry Andric    }
26280b57cec5SDimitry Andric    return *this;
26290b57cec5SDimitry Andric}
26300b57cec5SDimitry Andric
26310b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
26320b57cec5SDimitry Andricinline void
26330b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__append_default_init(size_type __n)
26340b57cec5SDimitry Andric{
26350b57cec5SDimitry Andric    if (__n)
26360b57cec5SDimitry Andric    {
26370b57cec5SDimitry Andric        size_type __cap = capacity();
26380b57cec5SDimitry Andric        size_type __sz = size();
26390b57cec5SDimitry Andric        if (__cap - __sz < __n)
26400b57cec5SDimitry Andric            __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
26410b57cec5SDimitry Andric        pointer __p = __get_pointer();
26420b57cec5SDimitry Andric        __sz += __n;
26430b57cec5SDimitry Andric        __set_size(__sz);
26440b57cec5SDimitry Andric        traits_type::assign(__p[__sz], value_type());
26450b57cec5SDimitry Andric    }
26460b57cec5SDimitry Andric}
26470b57cec5SDimitry Andric
26480b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
26490b57cec5SDimitry Andricvoid
26500b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
26510b57cec5SDimitry Andric{
26520b57cec5SDimitry Andric    bool __is_short = !__is_long();
26530b57cec5SDimitry Andric    size_type __cap;
26540b57cec5SDimitry Andric    size_type __sz;
26550b57cec5SDimitry Andric    if (__is_short)
26560b57cec5SDimitry Andric    {
26570b57cec5SDimitry Andric        __cap = __min_cap - 1;
26580b57cec5SDimitry Andric        __sz = __get_short_size();
26590b57cec5SDimitry Andric    }
26600b57cec5SDimitry Andric    else
26610b57cec5SDimitry Andric    {
26620b57cec5SDimitry Andric        __cap = __get_long_cap() - 1;
26630b57cec5SDimitry Andric        __sz = __get_long_size();
26640b57cec5SDimitry Andric    }
26650b57cec5SDimitry Andric    if (__sz == __cap)
26660b57cec5SDimitry Andric    {
26670b57cec5SDimitry Andric        __grow_by(__cap, 1, __sz, __sz, 0);
26680b57cec5SDimitry Andric        __is_short = !__is_long();
26690b57cec5SDimitry Andric    }
26700b57cec5SDimitry Andric    pointer __p;
26710b57cec5SDimitry Andric    if (__is_short)
26720b57cec5SDimitry Andric    {
26730b57cec5SDimitry Andric        __p = __get_short_pointer() + __sz;
26740b57cec5SDimitry Andric        __set_short_size(__sz+1);
26750b57cec5SDimitry Andric    }
26760b57cec5SDimitry Andric    else
26770b57cec5SDimitry Andric    {
26780b57cec5SDimitry Andric        __p = __get_long_pointer() + __sz;
26790b57cec5SDimitry Andric        __set_long_size(__sz+1);
26800b57cec5SDimitry Andric    }
26810b57cec5SDimitry Andric    traits_type::assign(*__p, __c);
26820b57cec5SDimitry Andric    traits_type::assign(*++__p, value_type());
26830b57cec5SDimitry Andric}
26840b57cec5SDimitry Andric
26850b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
26860b57cec5SDimitry Andrictemplate<class _ForwardIterator>
2687fe6060f1SDimitry Andric_EnableIf
2688fe6060f1SDimitry Andric<
2689fe6060f1SDimitry Andric    __is_cpp17_forward_iterator<_ForwardIterator>::value,
26900b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator>&
2691fe6060f1SDimitry Andric>
2692fe6060f1SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(
26930b57cec5SDimitry Andric    _ForwardIterator __first, _ForwardIterator __last)
26940b57cec5SDimitry Andric{
26950b57cec5SDimitry Andric    size_type __sz = size();
26960b57cec5SDimitry Andric    size_type __cap = capacity();
26970b57cec5SDimitry Andric    size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
26980b57cec5SDimitry Andric    if (__n)
26990b57cec5SDimitry Andric    {
2700fe6060f1SDimitry Andric        if (__string_is_trivial_iterator<_ForwardIterator>::value &&
2701fe6060f1SDimitry Andric            !__addr_in_range(*__first))
27020b57cec5SDimitry Andric        {
27030b57cec5SDimitry Andric            if (__cap - __sz < __n)
27040b57cec5SDimitry Andric                __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
27050b57cec5SDimitry Andric            pointer __p = __get_pointer() + __sz;
27060b57cec5SDimitry Andric            for (; __first != __last; ++__p, ++__first)
27070b57cec5SDimitry Andric                traits_type::assign(*__p, *__first);
27080b57cec5SDimitry Andric            traits_type::assign(*__p, value_type());
27090b57cec5SDimitry Andric            __set_size(__sz + __n);
27100b57cec5SDimitry Andric        }
2711fe6060f1SDimitry Andric        else
2712fe6060f1SDimitry Andric        {
2713fe6060f1SDimitry Andric            const basic_string __temp(__first, __last, __alloc());
2714fe6060f1SDimitry Andric            append(__temp.data(), __temp.size());
2715fe6060f1SDimitry Andric        }
27160b57cec5SDimitry Andric    }
27170b57cec5SDimitry Andric    return *this;
27180b57cec5SDimitry Andric}
27190b57cec5SDimitry Andric
27200b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
27210b57cec5SDimitry Andricinline
27220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
27230b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
27240b57cec5SDimitry Andric{
27250b57cec5SDimitry Andric    return append(__str.data(), __str.size());
27260b57cec5SDimitry Andric}
27270b57cec5SDimitry Andric
27280b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
27290b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
27300b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
27310b57cec5SDimitry Andric{
27320b57cec5SDimitry Andric    size_type __sz = __str.size();
27330b57cec5SDimitry Andric    if (__pos > __sz)
27340b57cec5SDimitry Andric        this->__throw_out_of_range();
27350b57cec5SDimitry Andric    return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
27360b57cec5SDimitry Andric}
27370b57cec5SDimitry Andric
27380b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
27390b57cec5SDimitry Andrictemplate <class _Tp>
27405ffd83dbSDimitry Andric    _EnableIf
27410b57cec5SDimitry Andric    <
27425ffd83dbSDimitry Andric        __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value  && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
27430b57cec5SDimitry Andric        basic_string<_CharT, _Traits, _Allocator>&
27445ffd83dbSDimitry Andric    >
27450b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const _Tp & __t, size_type __pos, size_type __n)
27460b57cec5SDimitry Andric{
27470b57cec5SDimitry Andric    __self_view __sv = __t;
27480b57cec5SDimitry Andric    size_type __sz = __sv.size();
27490b57cec5SDimitry Andric    if (__pos > __sz)
27500b57cec5SDimitry Andric        this->__throw_out_of_range();
27510b57cec5SDimitry Andric    return append(__sv.data() + __pos, _VSTD::min(__n, __sz - __pos));
27520b57cec5SDimitry Andric}
27530b57cec5SDimitry Andric
27540b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
27550b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
27560b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
27570b57cec5SDimitry Andric{
27580b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
27590b57cec5SDimitry Andric    return append(__s, traits_type::length(__s));
27600b57cec5SDimitry Andric}
27610b57cec5SDimitry Andric
27620b57cec5SDimitry Andric// insert
27630b57cec5SDimitry Andric
27640b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
27650b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
27660b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
27670b57cec5SDimitry Andric{
27680b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
27690b57cec5SDimitry Andric    size_type __sz = size();
27700b57cec5SDimitry Andric    if (__pos > __sz)
27710b57cec5SDimitry Andric        this->__throw_out_of_range();
27720b57cec5SDimitry Andric    size_type __cap = capacity();
27730b57cec5SDimitry Andric    if (__cap - __sz >= __n)
27740b57cec5SDimitry Andric    {
27750b57cec5SDimitry Andric        if (__n)
27760b57cec5SDimitry Andric        {
2777480093f4SDimitry Andric            value_type* __p = _VSTD::__to_address(__get_pointer());
27780b57cec5SDimitry Andric            size_type __n_move = __sz - __pos;
27790b57cec5SDimitry Andric            if (__n_move != 0)
27800b57cec5SDimitry Andric            {
27810b57cec5SDimitry Andric                if (__p + __pos <= __s && __s < __p + __sz)
27820b57cec5SDimitry Andric                    __s += __n;
27830b57cec5SDimitry Andric                traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
27840b57cec5SDimitry Andric            }
27850b57cec5SDimitry Andric            traits_type::move(__p + __pos, __s, __n);
27860b57cec5SDimitry Andric            __sz += __n;
27870b57cec5SDimitry Andric            __set_size(__sz);
27880b57cec5SDimitry Andric            traits_type::assign(__p[__sz], value_type());
27890b57cec5SDimitry Andric        }
27900b57cec5SDimitry Andric    }
27910b57cec5SDimitry Andric    else
27920b57cec5SDimitry Andric        __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
27930b57cec5SDimitry Andric    return *this;
27940b57cec5SDimitry Andric}
27950b57cec5SDimitry Andric
27960b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
27970b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
27980b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
27990b57cec5SDimitry Andric{
28000b57cec5SDimitry Andric    size_type __sz = size();
28010b57cec5SDimitry Andric    if (__pos > __sz)
28020b57cec5SDimitry Andric        this->__throw_out_of_range();
28030b57cec5SDimitry Andric    if (__n)
28040b57cec5SDimitry Andric    {
28050b57cec5SDimitry Andric        size_type __cap = capacity();
28060b57cec5SDimitry Andric        value_type* __p;
28070b57cec5SDimitry Andric        if (__cap - __sz >= __n)
28080b57cec5SDimitry Andric        {
2809480093f4SDimitry Andric            __p = _VSTD::__to_address(__get_pointer());
28100b57cec5SDimitry Andric            size_type __n_move = __sz - __pos;
28110b57cec5SDimitry Andric            if (__n_move != 0)
28120b57cec5SDimitry Andric                traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
28130b57cec5SDimitry Andric        }
28140b57cec5SDimitry Andric        else
28150b57cec5SDimitry Andric        {
28160b57cec5SDimitry Andric            __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
2817480093f4SDimitry Andric            __p = _VSTD::__to_address(__get_long_pointer());
28180b57cec5SDimitry Andric        }
28190b57cec5SDimitry Andric        traits_type::assign(__p + __pos, __n, __c);
28200b57cec5SDimitry Andric        __sz += __n;
28210b57cec5SDimitry Andric        __set_size(__sz);
28220b57cec5SDimitry Andric        traits_type::assign(__p[__sz], value_type());
28230b57cec5SDimitry Andric    }
28240b57cec5SDimitry Andric    return *this;
28250b57cec5SDimitry Andric}
28260b57cec5SDimitry Andric
28270b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
28280b57cec5SDimitry Andrictemplate<class _InputIterator>
28295ffd83dbSDimitry Andric_EnableIf
28300b57cec5SDimitry Andric<
2831fe6060f1SDimitry Andric   __is_exactly_cpp17_input_iterator<_InputIterator>::value,
28320b57cec5SDimitry Andric   typename basic_string<_CharT, _Traits, _Allocator>::iterator
28335ffd83dbSDimitry Andric>
28340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
28350b57cec5SDimitry Andric{
2836e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
28370b57cec5SDimitry Andric    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
28380b57cec5SDimitry Andric        "string::insert(iterator, range) called with an iterator not"
28390b57cec5SDimitry Andric        " referring to this string");
28400b57cec5SDimitry Andric#endif
28410b57cec5SDimitry Andric    const basic_string __temp(__first, __last, __alloc());
28420b57cec5SDimitry Andric    return insert(__pos, __temp.data(), __temp.data() + __temp.size());
28430b57cec5SDimitry Andric}
28440b57cec5SDimitry Andric
28450b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
28460b57cec5SDimitry Andrictemplate<class _ForwardIterator>
28475ffd83dbSDimitry Andric_EnableIf
28480b57cec5SDimitry Andric<
2849fe6060f1SDimitry Andric    __is_cpp17_forward_iterator<_ForwardIterator>::value,
28500b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::iterator
28515ffd83dbSDimitry Andric>
28520b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
28530b57cec5SDimitry Andric{
2854e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
28550b57cec5SDimitry Andric    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
28560b57cec5SDimitry Andric        "string::insert(iterator, range) called with an iterator not"
28570b57cec5SDimitry Andric        " referring to this string");
28580b57cec5SDimitry Andric#endif
28590b57cec5SDimitry Andric    size_type __ip = static_cast<size_type>(__pos - begin());
28600b57cec5SDimitry Andric    size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
28610b57cec5SDimitry Andric    if (__n)
28620b57cec5SDimitry Andric    {
2863fe6060f1SDimitry Andric        if (__string_is_trivial_iterator<_ForwardIterator>::value &&
2864fe6060f1SDimitry Andric            !__addr_in_range(*__first))
28650b57cec5SDimitry Andric        {
28660b57cec5SDimitry Andric            size_type __sz = size();
28670b57cec5SDimitry Andric            size_type __cap = capacity();
28680b57cec5SDimitry Andric            value_type* __p;
28690b57cec5SDimitry Andric            if (__cap - __sz >= __n)
28700b57cec5SDimitry Andric            {
2871480093f4SDimitry Andric                __p = _VSTD::__to_address(__get_pointer());
28720b57cec5SDimitry Andric                size_type __n_move = __sz - __ip;
28730b57cec5SDimitry Andric                if (__n_move != 0)
28740b57cec5SDimitry Andric                    traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
28750b57cec5SDimitry Andric            }
28760b57cec5SDimitry Andric            else
28770b57cec5SDimitry Andric            {
28780b57cec5SDimitry Andric                __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
2879480093f4SDimitry Andric                __p = _VSTD::__to_address(__get_long_pointer());
28800b57cec5SDimitry Andric            }
28810b57cec5SDimitry Andric            __sz += __n;
28820b57cec5SDimitry Andric            __set_size(__sz);
28830b57cec5SDimitry Andric            traits_type::assign(__p[__sz], value_type());
28840b57cec5SDimitry Andric            for (__p += __ip; __first != __last; ++__p, ++__first)
28850b57cec5SDimitry Andric                traits_type::assign(*__p, *__first);
28860b57cec5SDimitry Andric        }
2887fe6060f1SDimitry Andric        else
2888fe6060f1SDimitry Andric        {
2889fe6060f1SDimitry Andric            const basic_string __temp(__first, __last, __alloc());
2890fe6060f1SDimitry Andric            return insert(__pos, __temp.data(), __temp.data() + __temp.size());
2891fe6060f1SDimitry Andric        }
2892fe6060f1SDimitry Andric    }
28930b57cec5SDimitry Andric    return begin() + __ip;
28940b57cec5SDimitry Andric}
28950b57cec5SDimitry Andric
28960b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
28970b57cec5SDimitry Andricinline
28980b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
28990b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str)
29000b57cec5SDimitry Andric{
29010b57cec5SDimitry Andric    return insert(__pos1, __str.data(), __str.size());
29020b57cec5SDimitry Andric}
29030b57cec5SDimitry Andric
29040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
29050b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
29060b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
29070b57cec5SDimitry Andric                                                  size_type __pos2, size_type __n)
29080b57cec5SDimitry Andric{
29090b57cec5SDimitry Andric    size_type __str_sz = __str.size();
29100b57cec5SDimitry Andric    if (__pos2 > __str_sz)
29110b57cec5SDimitry Andric        this->__throw_out_of_range();
29120b57cec5SDimitry Andric    return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
29130b57cec5SDimitry Andric}
29140b57cec5SDimitry Andric
29150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
29160b57cec5SDimitry Andrictemplate <class _Tp>
29175ffd83dbSDimitry Andric_EnableIf
29180b57cec5SDimitry Andric<
29195ffd83dbSDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value  && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
29200b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator>&
29215ffd83dbSDimitry Andric>
29220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const _Tp& __t,
29230b57cec5SDimitry Andric                                                  size_type __pos2, size_type __n)
29240b57cec5SDimitry Andric{
29250b57cec5SDimitry Andric    __self_view __sv = __t;
29260b57cec5SDimitry Andric    size_type __str_sz = __sv.size();
29270b57cec5SDimitry Andric    if (__pos2 > __str_sz)
29280b57cec5SDimitry Andric        this->__throw_out_of_range();
29290b57cec5SDimitry Andric    return insert(__pos1, __sv.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
29300b57cec5SDimitry Andric}
29310b57cec5SDimitry Andric
29320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
29330b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
29340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
29350b57cec5SDimitry Andric{
29360b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
29370b57cec5SDimitry Andric    return insert(__pos, __s, traits_type::length(__s));
29380b57cec5SDimitry Andric}
29390b57cec5SDimitry Andric
29400b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
29410b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::iterator
29420b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
29430b57cec5SDimitry Andric{
29440b57cec5SDimitry Andric    size_type __ip = static_cast<size_type>(__pos - begin());
29450b57cec5SDimitry Andric    size_type __sz = size();
29460b57cec5SDimitry Andric    size_type __cap = capacity();
29470b57cec5SDimitry Andric    value_type* __p;
29480b57cec5SDimitry Andric    if (__cap == __sz)
29490b57cec5SDimitry Andric    {
29500b57cec5SDimitry Andric        __grow_by(__cap, 1, __sz, __ip, 0, 1);
2951480093f4SDimitry Andric        __p = _VSTD::__to_address(__get_long_pointer());
29520b57cec5SDimitry Andric    }
29530b57cec5SDimitry Andric    else
29540b57cec5SDimitry Andric    {
2955480093f4SDimitry Andric        __p = _VSTD::__to_address(__get_pointer());
29560b57cec5SDimitry Andric        size_type __n_move = __sz - __ip;
29570b57cec5SDimitry Andric        if (__n_move != 0)
29580b57cec5SDimitry Andric            traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
29590b57cec5SDimitry Andric    }
29600b57cec5SDimitry Andric    traits_type::assign(__p[__ip], __c);
29610b57cec5SDimitry Andric    traits_type::assign(__p[++__sz], value_type());
29620b57cec5SDimitry Andric    __set_size(__sz);
29630b57cec5SDimitry Andric    return begin() + static_cast<difference_type>(__ip);
29640b57cec5SDimitry Andric}
29650b57cec5SDimitry Andric
29660b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
29670b57cec5SDimitry Andricinline
29680b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::iterator
29690b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c)
29700b57cec5SDimitry Andric{
2971e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
29720b57cec5SDimitry Andric    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
29730b57cec5SDimitry Andric        "string::insert(iterator, n, value) called with an iterator not"
29740b57cec5SDimitry Andric        " referring to this string");
29750b57cec5SDimitry Andric#endif
29760b57cec5SDimitry Andric    difference_type __p = __pos - begin();
29770b57cec5SDimitry Andric    insert(static_cast<size_type>(__p), __n, __c);
29780b57cec5SDimitry Andric    return begin() + __p;
29790b57cec5SDimitry Andric}
29800b57cec5SDimitry Andric
29810b57cec5SDimitry Andric// replace
29820b57cec5SDimitry Andric
29830b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
29840b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
29850b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2)
29860b57cec5SDimitry Andric    _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
29870b57cec5SDimitry Andric{
29880b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
29890b57cec5SDimitry Andric    size_type __sz = size();
29900b57cec5SDimitry Andric    if (__pos > __sz)
29910b57cec5SDimitry Andric        this->__throw_out_of_range();
29920b57cec5SDimitry Andric    __n1 = _VSTD::min(__n1, __sz - __pos);
29930b57cec5SDimitry Andric    size_type __cap = capacity();
29940b57cec5SDimitry Andric    if (__cap - __sz + __n1 >= __n2)
29950b57cec5SDimitry Andric    {
2996480093f4SDimitry Andric        value_type* __p = _VSTD::__to_address(__get_pointer());
29970b57cec5SDimitry Andric        if (__n1 != __n2)
29980b57cec5SDimitry Andric        {
29990b57cec5SDimitry Andric            size_type __n_move = __sz - __pos - __n1;
30000b57cec5SDimitry Andric            if (__n_move != 0)
30010b57cec5SDimitry Andric            {
30020b57cec5SDimitry Andric                if (__n1 > __n2)
30030b57cec5SDimitry Andric                {
30040b57cec5SDimitry Andric                    traits_type::move(__p + __pos, __s, __n2);
30050b57cec5SDimitry Andric                    traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
30060b57cec5SDimitry Andric                    goto __finish;
30070b57cec5SDimitry Andric                }
30080b57cec5SDimitry Andric                if (__p + __pos < __s && __s < __p + __sz)
30090b57cec5SDimitry Andric                {
30100b57cec5SDimitry Andric                    if (__p + __pos + __n1 <= __s)
30110b57cec5SDimitry Andric                        __s += __n2 - __n1;
30120b57cec5SDimitry Andric                    else // __p + __pos < __s < __p + __pos + __n1
30130b57cec5SDimitry Andric                    {
30140b57cec5SDimitry Andric                        traits_type::move(__p + __pos, __s, __n1);
30150b57cec5SDimitry Andric                        __pos += __n1;
30160b57cec5SDimitry Andric                        __s += __n2;
30170b57cec5SDimitry Andric                        __n2 -= __n1;
30180b57cec5SDimitry Andric                        __n1 = 0;
30190b57cec5SDimitry Andric                    }
30200b57cec5SDimitry Andric                }
30210b57cec5SDimitry Andric                traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
30220b57cec5SDimitry Andric            }
30230b57cec5SDimitry Andric        }
30240b57cec5SDimitry Andric        traits_type::move(__p + __pos, __s, __n2);
30250b57cec5SDimitry Andric__finish:
30265ffd83dbSDimitry Andric// __sz += __n2 - __n1; in this and the below function below can cause unsigned
30275ffd83dbSDimitry Andric// integer overflow, but this is a safe operation, so we disable the check.
30280b57cec5SDimitry Andric        __sz += __n2 - __n1;
30290b57cec5SDimitry Andric        __set_size(__sz);
30300b57cec5SDimitry Andric        __invalidate_iterators_past(__sz);
30310b57cec5SDimitry Andric        traits_type::assign(__p[__sz], value_type());
30320b57cec5SDimitry Andric    }
30330b57cec5SDimitry Andric    else
30340b57cec5SDimitry Andric        __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
30350b57cec5SDimitry Andric    return *this;
30360b57cec5SDimitry Andric}
30370b57cec5SDimitry Andric
30380b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
30390b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
30400b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
30410b57cec5SDimitry Andric    _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
30420b57cec5SDimitry Andric{
30430b57cec5SDimitry Andric    size_type __sz = size();
30440b57cec5SDimitry Andric    if (__pos > __sz)
30450b57cec5SDimitry Andric        this->__throw_out_of_range();
30460b57cec5SDimitry Andric    __n1 = _VSTD::min(__n1, __sz - __pos);
30470b57cec5SDimitry Andric    size_type __cap = capacity();
30480b57cec5SDimitry Andric    value_type* __p;
30490b57cec5SDimitry Andric    if (__cap - __sz + __n1 >= __n2)
30500b57cec5SDimitry Andric    {
3051480093f4SDimitry Andric        __p = _VSTD::__to_address(__get_pointer());
30520b57cec5SDimitry Andric        if (__n1 != __n2)
30530b57cec5SDimitry Andric        {
30540b57cec5SDimitry Andric            size_type __n_move = __sz - __pos - __n1;
30550b57cec5SDimitry Andric            if (__n_move != 0)
30560b57cec5SDimitry Andric                traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
30570b57cec5SDimitry Andric        }
30580b57cec5SDimitry Andric    }
30590b57cec5SDimitry Andric    else
30600b57cec5SDimitry Andric    {
30610b57cec5SDimitry Andric        __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
3062480093f4SDimitry Andric        __p = _VSTD::__to_address(__get_long_pointer());
30630b57cec5SDimitry Andric    }
30640b57cec5SDimitry Andric    traits_type::assign(__p + __pos, __n2, __c);
30650b57cec5SDimitry Andric    __sz += __n2 - __n1;
30660b57cec5SDimitry Andric    __set_size(__sz);
30670b57cec5SDimitry Andric    __invalidate_iterators_past(__sz);
30680b57cec5SDimitry Andric    traits_type::assign(__p[__sz], value_type());
30690b57cec5SDimitry Andric    return *this;
30700b57cec5SDimitry Andric}
30710b57cec5SDimitry Andric
30720b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
30730b57cec5SDimitry Andrictemplate<class _InputIterator>
30745ffd83dbSDimitry Andric_EnableIf
30750b57cec5SDimitry Andric<
3076480093f4SDimitry Andric    __is_cpp17_input_iterator<_InputIterator>::value,
30770b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator>&
30785ffd83dbSDimitry Andric>
30790b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
30800b57cec5SDimitry Andric                                                   _InputIterator __j1, _InputIterator __j2)
30810b57cec5SDimitry Andric{
30820b57cec5SDimitry Andric    const basic_string __temp(__j1, __j2, __alloc());
30830b57cec5SDimitry Andric    return this->replace(__i1, __i2, __temp);
30840b57cec5SDimitry Andric}
30850b57cec5SDimitry Andric
30860b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
30870b57cec5SDimitry Andricinline
30880b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
30890b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str)
30900b57cec5SDimitry Andric{
30910b57cec5SDimitry Andric    return replace(__pos1, __n1, __str.data(), __str.size());
30920b57cec5SDimitry Andric}
30930b57cec5SDimitry Andric
30940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
30950b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
30960b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
30970b57cec5SDimitry Andric                                                   size_type __pos2, size_type __n2)
30980b57cec5SDimitry Andric{
30990b57cec5SDimitry Andric    size_type __str_sz = __str.size();
31000b57cec5SDimitry Andric    if (__pos2 > __str_sz)
31010b57cec5SDimitry Andric        this->__throw_out_of_range();
31020b57cec5SDimitry Andric    return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
31030b57cec5SDimitry Andric}
31040b57cec5SDimitry Andric
31050b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
31060b57cec5SDimitry Andrictemplate <class _Tp>
31075ffd83dbSDimitry Andric_EnableIf
31080b57cec5SDimitry Andric<
31095ffd83dbSDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
31100b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator>&
31115ffd83dbSDimitry Andric>
31120b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const _Tp& __t,
31130b57cec5SDimitry Andric                                                   size_type __pos2, size_type __n2)
31140b57cec5SDimitry Andric{
31150b57cec5SDimitry Andric    __self_view __sv = __t;
31160b57cec5SDimitry Andric    size_type __str_sz = __sv.size();
31170b57cec5SDimitry Andric    if (__pos2 > __str_sz)
31180b57cec5SDimitry Andric        this->__throw_out_of_range();
31190b57cec5SDimitry Andric    return replace(__pos1, __n1, __sv.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
31200b57cec5SDimitry Andric}
31210b57cec5SDimitry Andric
31220b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
31230b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
31240b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
31250b57cec5SDimitry Andric{
31260b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr");
31270b57cec5SDimitry Andric    return replace(__pos, __n1, __s, traits_type::length(__s));
31280b57cec5SDimitry Andric}
31290b57cec5SDimitry Andric
31300b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
31310b57cec5SDimitry Andricinline
31320b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
31330b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str)
31340b57cec5SDimitry Andric{
31350b57cec5SDimitry Andric    return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1),
31360b57cec5SDimitry Andric                   __str.data(), __str.size());
31370b57cec5SDimitry Andric}
31380b57cec5SDimitry Andric
31390b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
31400b57cec5SDimitry Andricinline
31410b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
31420b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n)
31430b57cec5SDimitry Andric{
31440b57cec5SDimitry Andric    return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
31450b57cec5SDimitry Andric}
31460b57cec5SDimitry Andric
31470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
31480b57cec5SDimitry Andricinline
31490b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
31500b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s)
31510b57cec5SDimitry Andric{
31520b57cec5SDimitry Andric    return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
31530b57cec5SDimitry Andric}
31540b57cec5SDimitry Andric
31550b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
31560b57cec5SDimitry Andricinline
31570b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
31580b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c)
31590b57cec5SDimitry Andric{
31600b57cec5SDimitry Andric    return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
31610b57cec5SDimitry Andric}
31620b57cec5SDimitry Andric
31630b57cec5SDimitry Andric// erase
31640b57cec5SDimitry Andric
31655ffd83dbSDimitry Andric// 'externally instantiated' erase() implementation, called when __n != npos.
31665ffd83dbSDimitry Andric// Does not check __pos against size()
31670b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
31685ffd83dbSDimitry Andricvoid
31695ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__erase_external_with_move(
31705ffd83dbSDimitry Andric    size_type __pos, size_type __n)
31710b57cec5SDimitry Andric{
31720b57cec5SDimitry Andric    if (__n)
31730b57cec5SDimitry Andric    {
31745ffd83dbSDimitry Andric        size_type __sz = size();
3175480093f4SDimitry Andric        value_type* __p = _VSTD::__to_address(__get_pointer());
31760b57cec5SDimitry Andric        __n = _VSTD::min(__n, __sz - __pos);
31770b57cec5SDimitry Andric        size_type __n_move = __sz - __pos - __n;
31780b57cec5SDimitry Andric        if (__n_move != 0)
31790b57cec5SDimitry Andric            traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
31800b57cec5SDimitry Andric        __sz -= __n;
31810b57cec5SDimitry Andric        __set_size(__sz);
31820b57cec5SDimitry Andric        __invalidate_iterators_past(__sz);
31830b57cec5SDimitry Andric        traits_type::assign(__p[__sz], value_type());
31840b57cec5SDimitry Andric    }
31855ffd83dbSDimitry Andric}
31865ffd83dbSDimitry Andric
31875ffd83dbSDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
31885ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>&
31895ffd83dbSDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos,
31905ffd83dbSDimitry Andric                                                 size_type __n) {
31915ffd83dbSDimitry Andric  if (__pos > size()) this->__throw_out_of_range();
31925ffd83dbSDimitry Andric  if (__n == npos) {
31935ffd83dbSDimitry Andric    __erase_to_end(__pos);
31945ffd83dbSDimitry Andric  } else {
31955ffd83dbSDimitry Andric    __erase_external_with_move(__pos, __n);
31965ffd83dbSDimitry Andric  }
31970b57cec5SDimitry Andric  return *this;
31980b57cec5SDimitry Andric}
31990b57cec5SDimitry Andric
32000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
32010b57cec5SDimitry Andricinline
32020b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::iterator
32030b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
32040b57cec5SDimitry Andric{
3205e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
32060b57cec5SDimitry Andric    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
32070b57cec5SDimitry Andric        "string::erase(iterator) called with an iterator not"
32080b57cec5SDimitry Andric        " referring to this string");
32090b57cec5SDimitry Andric#endif
32100b57cec5SDimitry Andric    _LIBCPP_ASSERT(__pos != end(),
32110b57cec5SDimitry Andric        "string::erase(iterator) called with a non-dereferenceable iterator");
32120b57cec5SDimitry Andric    iterator __b = begin();
32130b57cec5SDimitry Andric    size_type __r = static_cast<size_type>(__pos - __b);
32140b57cec5SDimitry Andric    erase(__r, 1);
32150b57cec5SDimitry Andric    return __b + static_cast<difference_type>(__r);
32160b57cec5SDimitry Andric}
32170b57cec5SDimitry Andric
32180b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
32190b57cec5SDimitry Andricinline
32200b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::iterator
32210b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
32220b57cec5SDimitry Andric{
3223e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
32240b57cec5SDimitry Andric    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
32250b57cec5SDimitry Andric        "string::erase(iterator,  iterator) called with an iterator not"
32260b57cec5SDimitry Andric        " referring to this string");
32270b57cec5SDimitry Andric#endif
32280b57cec5SDimitry Andric    _LIBCPP_ASSERT(__first <= __last, "string::erase(first, last) called with invalid range");
32290b57cec5SDimitry Andric    iterator __b = begin();
32300b57cec5SDimitry Andric    size_type __r = static_cast<size_type>(__first - __b);
32310b57cec5SDimitry Andric    erase(__r, static_cast<size_type>(__last - __first));
32320b57cec5SDimitry Andric    return __b + static_cast<difference_type>(__r);
32330b57cec5SDimitry Andric}
32340b57cec5SDimitry Andric
32350b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
32360b57cec5SDimitry Andricinline
32370b57cec5SDimitry Andricvoid
32380b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::pop_back()
32390b57cec5SDimitry Andric{
32400b57cec5SDimitry Andric    _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty");
32410b57cec5SDimitry Andric    size_type __sz;
32420b57cec5SDimitry Andric    if (__is_long())
32430b57cec5SDimitry Andric    {
32440b57cec5SDimitry Andric        __sz = __get_long_size() - 1;
32450b57cec5SDimitry Andric        __set_long_size(__sz);
32460b57cec5SDimitry Andric        traits_type::assign(*(__get_long_pointer() + __sz), value_type());
32470b57cec5SDimitry Andric    }
32480b57cec5SDimitry Andric    else
32490b57cec5SDimitry Andric    {
32500b57cec5SDimitry Andric        __sz = __get_short_size() - 1;
32510b57cec5SDimitry Andric        __set_short_size(__sz);
32520b57cec5SDimitry Andric        traits_type::assign(*(__get_short_pointer() + __sz), value_type());
32530b57cec5SDimitry Andric    }
32540b57cec5SDimitry Andric    __invalidate_iterators_past(__sz);
32550b57cec5SDimitry Andric}
32560b57cec5SDimitry Andric
32570b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
32580b57cec5SDimitry Andricinline
32590b57cec5SDimitry Andricvoid
32600b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
32610b57cec5SDimitry Andric{
32620b57cec5SDimitry Andric    __invalidate_all_iterators();
32630b57cec5SDimitry Andric    if (__is_long())
32640b57cec5SDimitry Andric    {
32650b57cec5SDimitry Andric        traits_type::assign(*__get_long_pointer(), value_type());
32660b57cec5SDimitry Andric        __set_long_size(0);
32670b57cec5SDimitry Andric    }
32680b57cec5SDimitry Andric    else
32690b57cec5SDimitry Andric    {
32700b57cec5SDimitry Andric        traits_type::assign(*__get_short_pointer(), value_type());
32710b57cec5SDimitry Andric        __set_short_size(0);
32720b57cec5SDimitry Andric    }
32730b57cec5SDimitry Andric}
32740b57cec5SDimitry Andric
32750b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
32760b57cec5SDimitry Andricinline
32770b57cec5SDimitry Andricvoid
32780b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
32790b57cec5SDimitry Andric{
32800b57cec5SDimitry Andric    if (__is_long())
32810b57cec5SDimitry Andric    {
32820b57cec5SDimitry Andric        traits_type::assign(*(__get_long_pointer() + __pos), value_type());
32830b57cec5SDimitry Andric        __set_long_size(__pos);
32840b57cec5SDimitry Andric    }
32850b57cec5SDimitry Andric    else
32860b57cec5SDimitry Andric    {
32870b57cec5SDimitry Andric        traits_type::assign(*(__get_short_pointer() + __pos), value_type());
32880b57cec5SDimitry Andric        __set_short_size(__pos);
32890b57cec5SDimitry Andric    }
32900b57cec5SDimitry Andric    __invalidate_iterators_past(__pos);
32910b57cec5SDimitry Andric}
32920b57cec5SDimitry Andric
32930b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
32940b57cec5SDimitry Andricvoid
32950b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
32960b57cec5SDimitry Andric{
32970b57cec5SDimitry Andric    size_type __sz = size();
32980b57cec5SDimitry Andric    if (__n > __sz)
32990b57cec5SDimitry Andric        append(__n - __sz, __c);
33000b57cec5SDimitry Andric    else
33010b57cec5SDimitry Andric        __erase_to_end(__n);
33020b57cec5SDimitry Andric}
33030b57cec5SDimitry Andric
33040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
33050b57cec5SDimitry Andricinline void
33060b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__resize_default_init(size_type __n)
33070b57cec5SDimitry Andric{
33080b57cec5SDimitry Andric    size_type __sz = size();
33090b57cec5SDimitry Andric    if (__n > __sz) {
33100b57cec5SDimitry Andric       __append_default_init(__n - __sz);
33110b57cec5SDimitry Andric    } else
33120b57cec5SDimitry Andric        __erase_to_end(__n);
33130b57cec5SDimitry Andric}
33140b57cec5SDimitry Andric
33150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
33160b57cec5SDimitry Andricinline
33170b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
33180b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT
33190b57cec5SDimitry Andric{
33200b57cec5SDimitry Andric    size_type __m = __alloc_traits::max_size(__alloc());
33210b57cec5SDimitry Andric#ifdef _LIBCPP_BIG_ENDIAN
33220b57cec5SDimitry Andric    return (__m <= ~__long_mask ? __m : __m/2) - __alignment;
33230b57cec5SDimitry Andric#else
33240b57cec5SDimitry Andric    return __m - __alignment;
33250b57cec5SDimitry Andric#endif
33260b57cec5SDimitry Andric}
33270b57cec5SDimitry Andric
33280b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
33290b57cec5SDimitry Andricvoid
3330e8d8bef9SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::reserve(size_type __requested_capacity)
33310b57cec5SDimitry Andric{
3332e8d8bef9SDimitry Andric    if (__requested_capacity > max_size())
33330b57cec5SDimitry Andric        this->__throw_length_error();
3334e8d8bef9SDimitry Andric
3335e8d8bef9SDimitry Andric#if _LIBCPP_STD_VER > 17
3336e8d8bef9SDimitry Andric    // Reserve never shrinks as of C++20.
3337e8d8bef9SDimitry Andric    if (__requested_capacity <= capacity()) return;
3338e8d8bef9SDimitry Andric#endif
3339e8d8bef9SDimitry Andric
3340e8d8bef9SDimitry Andric    size_type __target_capacity = _VSTD::max(__requested_capacity, size());
3341e8d8bef9SDimitry Andric    __target_capacity = __recommend(__target_capacity);
3342e8d8bef9SDimitry Andric    if (__target_capacity == capacity()) return;
3343e8d8bef9SDimitry Andric
3344e8d8bef9SDimitry Andric    __shrink_or_extend(__target_capacity);
3345e8d8bef9SDimitry Andric}
3346e8d8bef9SDimitry Andric
3347e8d8bef9SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
3348e8d8bef9SDimitry Andricvoid
3349e8d8bef9SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::shrink_to_fit() _NOEXCEPT
3350e8d8bef9SDimitry Andric{
3351e8d8bef9SDimitry Andric    size_type __target_capacity = __recommend(size());
3352e8d8bef9SDimitry Andric    if (__target_capacity == capacity()) return;
3353e8d8bef9SDimitry Andric
3354e8d8bef9SDimitry Andric    __shrink_or_extend(__target_capacity);
3355e8d8bef9SDimitry Andric}
3356e8d8bef9SDimitry Andric
3357e8d8bef9SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
3358e8d8bef9SDimitry Andricvoid
3359e8d8bef9SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__shrink_or_extend(size_type __target_capacity)
3360e8d8bef9SDimitry Andric{
33610b57cec5SDimitry Andric    size_type __cap = capacity();
33620b57cec5SDimitry Andric    size_type __sz = size();
3363e8d8bef9SDimitry Andric
33640b57cec5SDimitry Andric    pointer __new_data, __p;
33650b57cec5SDimitry Andric    bool __was_long, __now_long;
3366e8d8bef9SDimitry Andric    if (__target_capacity == __min_cap - 1)
33670b57cec5SDimitry Andric    {
33680b57cec5SDimitry Andric        __was_long = true;
33690b57cec5SDimitry Andric        __now_long = false;
33700b57cec5SDimitry Andric        __new_data = __get_short_pointer();
33710b57cec5SDimitry Andric        __p = __get_long_pointer();
33720b57cec5SDimitry Andric    }
33730b57cec5SDimitry Andric    else
33740b57cec5SDimitry Andric    {
3375e8d8bef9SDimitry Andric        if (__target_capacity > __cap)
3376e8d8bef9SDimitry Andric            __new_data = __alloc_traits::allocate(__alloc(), __target_capacity+1);
33770b57cec5SDimitry Andric        else
33780b57cec5SDimitry Andric        {
33790b57cec5SDimitry Andric        #ifndef _LIBCPP_NO_EXCEPTIONS
33800b57cec5SDimitry Andric            try
33810b57cec5SDimitry Andric            {
33820b57cec5SDimitry Andric        #endif // _LIBCPP_NO_EXCEPTIONS
3383e8d8bef9SDimitry Andric                __new_data = __alloc_traits::allocate(__alloc(), __target_capacity+1);
33840b57cec5SDimitry Andric        #ifndef _LIBCPP_NO_EXCEPTIONS
33850b57cec5SDimitry Andric            }
33860b57cec5SDimitry Andric            catch (...)
33870b57cec5SDimitry Andric            {
33880b57cec5SDimitry Andric                return;
33890b57cec5SDimitry Andric            }
33900b57cec5SDimitry Andric        #else  // _LIBCPP_NO_EXCEPTIONS
33910b57cec5SDimitry Andric            if (__new_data == nullptr)
33920b57cec5SDimitry Andric                return;
33930b57cec5SDimitry Andric        #endif // _LIBCPP_NO_EXCEPTIONS
33940b57cec5SDimitry Andric        }
33950b57cec5SDimitry Andric        __now_long = true;
33960b57cec5SDimitry Andric        __was_long = __is_long();
33970b57cec5SDimitry Andric        __p = __get_pointer();
33980b57cec5SDimitry Andric    }
3399480093f4SDimitry Andric    traits_type::copy(_VSTD::__to_address(__new_data),
3400480093f4SDimitry Andric                        _VSTD::__to_address(__p), size()+1);
34010b57cec5SDimitry Andric    if (__was_long)
34020b57cec5SDimitry Andric        __alloc_traits::deallocate(__alloc(), __p, __cap+1);
34030b57cec5SDimitry Andric    if (__now_long)
34040b57cec5SDimitry Andric    {
3405e8d8bef9SDimitry Andric        __set_long_cap(__target_capacity+1);
34060b57cec5SDimitry Andric        __set_long_size(__sz);
34070b57cec5SDimitry Andric        __set_long_pointer(__new_data);
34080b57cec5SDimitry Andric    }
34090b57cec5SDimitry Andric    else
34100b57cec5SDimitry Andric        __set_short_size(__sz);
34110b57cec5SDimitry Andric    __invalidate_all_iterators();
34120b57cec5SDimitry Andric}
34130b57cec5SDimitry Andric
34140b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34150b57cec5SDimitry Andricinline
34160b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::const_reference
34170b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const _NOEXCEPT
34180b57cec5SDimitry Andric{
34190b57cec5SDimitry Andric    _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
34200b57cec5SDimitry Andric    return *(data() + __pos);
34210b57cec5SDimitry Andric}
34220b57cec5SDimitry Andric
34230b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34240b57cec5SDimitry Andricinline
34250b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::reference
34260b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) _NOEXCEPT
34270b57cec5SDimitry Andric{
34280b57cec5SDimitry Andric    _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
34290b57cec5SDimitry Andric    return *(__get_pointer() + __pos);
34300b57cec5SDimitry Andric}
34310b57cec5SDimitry Andric
34320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34330b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::const_reference
34340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
34350b57cec5SDimitry Andric{
34360b57cec5SDimitry Andric    if (__n >= size())
34370b57cec5SDimitry Andric        this->__throw_out_of_range();
34380b57cec5SDimitry Andric    return (*this)[__n];
34390b57cec5SDimitry Andric}
34400b57cec5SDimitry Andric
34410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34420b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::reference
34430b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
34440b57cec5SDimitry Andric{
34450b57cec5SDimitry Andric    if (__n >= size())
34460b57cec5SDimitry Andric        this->__throw_out_of_range();
34470b57cec5SDimitry Andric    return (*this)[__n];
34480b57cec5SDimitry Andric}
34490b57cec5SDimitry Andric
34500b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34510b57cec5SDimitry Andricinline
34520b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::reference
34530b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::front() _NOEXCEPT
34540b57cec5SDimitry Andric{
34550b57cec5SDimitry Andric    _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
34560b57cec5SDimitry Andric    return *__get_pointer();
34570b57cec5SDimitry Andric}
34580b57cec5SDimitry Andric
34590b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34600b57cec5SDimitry Andricinline
34610b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::const_reference
34620b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::front() const _NOEXCEPT
34630b57cec5SDimitry Andric{
34640b57cec5SDimitry Andric    _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
34650b57cec5SDimitry Andric    return *data();
34660b57cec5SDimitry Andric}
34670b57cec5SDimitry Andric
34680b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34690b57cec5SDimitry Andricinline
34700b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::reference
34710b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::back() _NOEXCEPT
34720b57cec5SDimitry Andric{
34730b57cec5SDimitry Andric    _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
34740b57cec5SDimitry Andric    return *(__get_pointer() + size() - 1);
34750b57cec5SDimitry Andric}
34760b57cec5SDimitry Andric
34770b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34780b57cec5SDimitry Andricinline
34790b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::const_reference
34800b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::back() const _NOEXCEPT
34810b57cec5SDimitry Andric{
34820b57cec5SDimitry Andric    _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
34830b57cec5SDimitry Andric    return *(data() + size() - 1);
34840b57cec5SDimitry Andric}
34850b57cec5SDimitry Andric
34860b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34870b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
34880b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
34890b57cec5SDimitry Andric{
34900b57cec5SDimitry Andric    size_type __sz = size();
34910b57cec5SDimitry Andric    if (__pos > __sz)
34920b57cec5SDimitry Andric        this->__throw_out_of_range();
34930b57cec5SDimitry Andric    size_type __rlen = _VSTD::min(__n, __sz - __pos);
34940b57cec5SDimitry Andric    traits_type::copy(__s, data() + __pos, __rlen);
34950b57cec5SDimitry Andric    return __rlen;
34960b57cec5SDimitry Andric}
34970b57cec5SDimitry Andric
34980b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
34990b57cec5SDimitry Andricinline
35000b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
35010b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const
35020b57cec5SDimitry Andric{
35030b57cec5SDimitry Andric    return basic_string(*this, __pos, __n, __alloc());
35040b57cec5SDimitry Andric}
35050b57cec5SDimitry Andric
35060b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
35070b57cec5SDimitry Andricinline
35080b57cec5SDimitry Andricvoid
35090b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
35100b57cec5SDimitry Andric#if _LIBCPP_STD_VER >= 14
35110b57cec5SDimitry Andric        _NOEXCEPT
35120b57cec5SDimitry Andric#else
35130b57cec5SDimitry Andric        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
35140b57cec5SDimitry Andric                    __is_nothrow_swappable<allocator_type>::value)
35150b57cec5SDimitry Andric#endif
35160b57cec5SDimitry Andric{
3517e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
35180b57cec5SDimitry Andric    if (!__is_long())
35190b57cec5SDimitry Andric        __get_db()->__invalidate_all(this);
35200b57cec5SDimitry Andric    if (!__str.__is_long())
35210b57cec5SDimitry Andric        __get_db()->__invalidate_all(&__str);
35220b57cec5SDimitry Andric    __get_db()->swap(this, &__str);
35230b57cec5SDimitry Andric#endif
35240b57cec5SDimitry Andric    _LIBCPP_ASSERT(
35250b57cec5SDimitry Andric        __alloc_traits::propagate_on_container_swap::value ||
35260b57cec5SDimitry Andric        __alloc_traits::is_always_equal::value ||
35270b57cec5SDimitry Andric        __alloc() == __str.__alloc(), "swapping non-equal allocators");
35280b57cec5SDimitry Andric    _VSTD::swap(__r_.first(), __str.__r_.first());
3529e8d8bef9SDimitry Andric    _VSTD::__swap_allocator(__alloc(), __str.__alloc());
35300b57cec5SDimitry Andric}
35310b57cec5SDimitry Andric
35320b57cec5SDimitry Andric// find
35330b57cec5SDimitry Andric
35340b57cec5SDimitry Andrictemplate <class _Traits>
35350b57cec5SDimitry Andricstruct _LIBCPP_HIDDEN __traits_eq
35360b57cec5SDimitry Andric{
35370b57cec5SDimitry Andric    typedef typename _Traits::char_type char_type;
35380b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
35390b57cec5SDimitry Andric    bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
35400b57cec5SDimitry Andric        {return _Traits::eq(__x, __y);}
35410b57cec5SDimitry Andric};
35420b57cec5SDimitry Andric
35430b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
35440b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
35450b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
35460b57cec5SDimitry Andric                                                size_type __pos,
35470b57cec5SDimitry Andric                                                size_type __n) const _NOEXCEPT
35480b57cec5SDimitry Andric{
35490b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr");
35500b57cec5SDimitry Andric    return __str_find<value_type, size_type, traits_type, npos>
35510b57cec5SDimitry Andric        (data(), size(), __s, __pos, __n);
35520b57cec5SDimitry Andric}
35530b57cec5SDimitry Andric
35540b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
35550b57cec5SDimitry Andricinline
35560b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
35570b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
35580b57cec5SDimitry Andric                                                size_type __pos) const _NOEXCEPT
35590b57cec5SDimitry Andric{
35600b57cec5SDimitry Andric    return __str_find<value_type, size_type, traits_type, npos>
35610b57cec5SDimitry Andric        (data(), size(), __str.data(), __pos, __str.size());
35620b57cec5SDimitry Andric}
35630b57cec5SDimitry Andric
35640b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
35650b57cec5SDimitry Andrictemplate <class _Tp>
35665ffd83dbSDimitry Andric_EnableIf
35670b57cec5SDimitry Andric<
35680b57cec5SDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
35690b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type
35705ffd83dbSDimitry Andric>
35710b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(const _Tp &__t,
3572fe6060f1SDimitry Andric                                                size_type __pos) const _NOEXCEPT
35730b57cec5SDimitry Andric{
35740b57cec5SDimitry Andric    __self_view __sv = __t;
35750b57cec5SDimitry Andric    return __str_find<value_type, size_type, traits_type, npos>
35760b57cec5SDimitry Andric        (data(), size(), __sv.data(), __pos, __sv.size());
35770b57cec5SDimitry Andric}
35780b57cec5SDimitry Andric
35790b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
35800b57cec5SDimitry Andricinline
35810b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
35820b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
35830b57cec5SDimitry Andric                                                size_type __pos) const _NOEXCEPT
35840b57cec5SDimitry Andric{
35850b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr");
35860b57cec5SDimitry Andric    return __str_find<value_type, size_type, traits_type, npos>
35870b57cec5SDimitry Andric        (data(), size(), __s, __pos, traits_type::length(__s));
35880b57cec5SDimitry Andric}
35890b57cec5SDimitry Andric
35900b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
35910b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
35920b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
35930b57cec5SDimitry Andric                                                size_type __pos) const _NOEXCEPT
35940b57cec5SDimitry Andric{
35950b57cec5SDimitry Andric    return __str_find<value_type, size_type, traits_type, npos>
35960b57cec5SDimitry Andric        (data(), size(), __c, __pos);
35970b57cec5SDimitry Andric}
35980b57cec5SDimitry Andric
35990b57cec5SDimitry Andric// rfind
36000b57cec5SDimitry Andric
36010b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
36020b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
36030b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
36040b57cec5SDimitry Andric                                                 size_type __pos,
36050b57cec5SDimitry Andric                                                 size_type __n) const _NOEXCEPT
36060b57cec5SDimitry Andric{
36070b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr");
36080b57cec5SDimitry Andric    return __str_rfind<value_type, size_type, traits_type, npos>
36090b57cec5SDimitry Andric        (data(), size(), __s, __pos, __n);
36100b57cec5SDimitry Andric}
36110b57cec5SDimitry Andric
36120b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
36130b57cec5SDimitry Andricinline
36140b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
36150b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
36160b57cec5SDimitry Andric                                                 size_type __pos) const _NOEXCEPT
36170b57cec5SDimitry Andric{
36180b57cec5SDimitry Andric    return __str_rfind<value_type, size_type, traits_type, npos>
36190b57cec5SDimitry Andric        (data(), size(), __str.data(), __pos, __str.size());
36200b57cec5SDimitry Andric}
36210b57cec5SDimitry Andric
36220b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
36230b57cec5SDimitry Andrictemplate <class _Tp>
36245ffd83dbSDimitry Andric_EnableIf
36250b57cec5SDimitry Andric<
36260b57cec5SDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
36270b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type
36285ffd83dbSDimitry Andric>
36290b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(const _Tp& __t,
3630fe6060f1SDimitry Andric                                                size_type __pos) const _NOEXCEPT
36310b57cec5SDimitry Andric{
36320b57cec5SDimitry Andric    __self_view __sv = __t;
36330b57cec5SDimitry Andric    return __str_rfind<value_type, size_type, traits_type, npos>
36340b57cec5SDimitry Andric        (data(), size(), __sv.data(), __pos, __sv.size());
36350b57cec5SDimitry Andric}
36360b57cec5SDimitry Andric
36370b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
36380b57cec5SDimitry Andricinline
36390b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
36400b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
36410b57cec5SDimitry Andric                                                 size_type __pos) const _NOEXCEPT
36420b57cec5SDimitry Andric{
36430b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr");
36440b57cec5SDimitry Andric    return __str_rfind<value_type, size_type, traits_type, npos>
36450b57cec5SDimitry Andric        (data(), size(), __s, __pos, traits_type::length(__s));
36460b57cec5SDimitry Andric}
36470b57cec5SDimitry Andric
36480b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
36490b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
36500b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
36510b57cec5SDimitry Andric                                                 size_type __pos) const _NOEXCEPT
36520b57cec5SDimitry Andric{
36530b57cec5SDimitry Andric    return __str_rfind<value_type, size_type, traits_type, npos>
36540b57cec5SDimitry Andric        (data(), size(), __c, __pos);
36550b57cec5SDimitry Andric}
36560b57cec5SDimitry Andric
36570b57cec5SDimitry Andric// find_first_of
36580b57cec5SDimitry Andric
36590b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
36600b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
36610b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
36620b57cec5SDimitry Andric                                                         size_type __pos,
36630b57cec5SDimitry Andric                                                         size_type __n) const _NOEXCEPT
36640b57cec5SDimitry Andric{
36650b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr");
36660b57cec5SDimitry Andric    return __str_find_first_of<value_type, size_type, traits_type, npos>
36670b57cec5SDimitry Andric        (data(), size(), __s, __pos, __n);
36680b57cec5SDimitry Andric}
36690b57cec5SDimitry Andric
36700b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
36710b57cec5SDimitry Andricinline
36720b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
36730b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
36740b57cec5SDimitry Andric                                                         size_type __pos) const _NOEXCEPT
36750b57cec5SDimitry Andric{
36760b57cec5SDimitry Andric    return __str_find_first_of<value_type, size_type, traits_type, npos>
36770b57cec5SDimitry Andric        (data(), size(), __str.data(), __pos, __str.size());
36780b57cec5SDimitry Andric}
36790b57cec5SDimitry Andric
36800b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
36810b57cec5SDimitry Andrictemplate <class _Tp>
36825ffd83dbSDimitry Andric_EnableIf
36830b57cec5SDimitry Andric<
36840b57cec5SDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
36850b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type
36865ffd83dbSDimitry Andric>
36870b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(const _Tp& __t,
3688fe6060f1SDimitry Andric                                                size_type __pos) const _NOEXCEPT
36890b57cec5SDimitry Andric{
36900b57cec5SDimitry Andric    __self_view __sv = __t;
36910b57cec5SDimitry Andric    return __str_find_first_of<value_type, size_type, traits_type, npos>
36920b57cec5SDimitry Andric        (data(), size(), __sv.data(), __pos, __sv.size());
36930b57cec5SDimitry Andric}
36940b57cec5SDimitry Andric
36950b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
36960b57cec5SDimitry Andricinline
36970b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
36980b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
36990b57cec5SDimitry Andric                                                         size_type __pos) const _NOEXCEPT
37000b57cec5SDimitry Andric{
37010b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr");
37020b57cec5SDimitry Andric    return __str_find_first_of<value_type, size_type, traits_type, npos>
37030b57cec5SDimitry Andric        (data(), size(), __s, __pos, traits_type::length(__s));
37040b57cec5SDimitry Andric}
37050b57cec5SDimitry Andric
37060b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
37070b57cec5SDimitry Andricinline
37080b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
37090b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
37100b57cec5SDimitry Andric                                                         size_type __pos) const _NOEXCEPT
37110b57cec5SDimitry Andric{
37120b57cec5SDimitry Andric    return find(__c, __pos);
37130b57cec5SDimitry Andric}
37140b57cec5SDimitry Andric
37150b57cec5SDimitry Andric// find_last_of
37160b57cec5SDimitry Andric
37170b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
37180b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
37190b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
37200b57cec5SDimitry Andric                                                        size_type __pos,
37210b57cec5SDimitry Andric                                                        size_type __n) const _NOEXCEPT
37220b57cec5SDimitry Andric{
37230b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr");
37240b57cec5SDimitry Andric    return __str_find_last_of<value_type, size_type, traits_type, npos>
37250b57cec5SDimitry Andric        (data(), size(), __s, __pos, __n);
37260b57cec5SDimitry Andric}
37270b57cec5SDimitry Andric
37280b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
37290b57cec5SDimitry Andricinline
37300b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
37310b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
37320b57cec5SDimitry Andric                                                        size_type __pos) const _NOEXCEPT
37330b57cec5SDimitry Andric{
37340b57cec5SDimitry Andric    return __str_find_last_of<value_type, size_type, traits_type, npos>
37350b57cec5SDimitry Andric        (data(), size(), __str.data(), __pos, __str.size());
37360b57cec5SDimitry Andric}
37370b57cec5SDimitry Andric
37380b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
37390b57cec5SDimitry Andrictemplate <class _Tp>
37405ffd83dbSDimitry Andric_EnableIf
37410b57cec5SDimitry Andric<
37420b57cec5SDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
37430b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type
37445ffd83dbSDimitry Andric>
37450b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(const _Tp& __t,
3746fe6060f1SDimitry Andric                                                size_type __pos) const _NOEXCEPT
37470b57cec5SDimitry Andric{
37480b57cec5SDimitry Andric    __self_view __sv = __t;
37490b57cec5SDimitry Andric    return __str_find_last_of<value_type, size_type, traits_type, npos>
37500b57cec5SDimitry Andric        (data(), size(), __sv.data(), __pos, __sv.size());
37510b57cec5SDimitry Andric}
37520b57cec5SDimitry Andric
37530b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
37540b57cec5SDimitry Andricinline
37550b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
37560b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
37570b57cec5SDimitry Andric                                                        size_type __pos) const _NOEXCEPT
37580b57cec5SDimitry Andric{
37590b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr");
37600b57cec5SDimitry Andric    return __str_find_last_of<value_type, size_type, traits_type, npos>
37610b57cec5SDimitry Andric        (data(), size(), __s, __pos, traits_type::length(__s));
37620b57cec5SDimitry Andric}
37630b57cec5SDimitry Andric
37640b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
37650b57cec5SDimitry Andricinline
37660b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
37670b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
37680b57cec5SDimitry Andric                                                        size_type __pos) const _NOEXCEPT
37690b57cec5SDimitry Andric{
37700b57cec5SDimitry Andric    return rfind(__c, __pos);
37710b57cec5SDimitry Andric}
37720b57cec5SDimitry Andric
37730b57cec5SDimitry Andric// find_first_not_of
37740b57cec5SDimitry Andric
37750b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
37760b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
37770b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
37780b57cec5SDimitry Andric                                                             size_type __pos,
37790b57cec5SDimitry Andric                                                             size_type __n) const _NOEXCEPT
37800b57cec5SDimitry Andric{
37810b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr");
37820b57cec5SDimitry Andric    return __str_find_first_not_of<value_type, size_type, traits_type, npos>
37830b57cec5SDimitry Andric        (data(), size(), __s, __pos, __n);
37840b57cec5SDimitry Andric}
37850b57cec5SDimitry Andric
37860b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
37870b57cec5SDimitry Andricinline
37880b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
37890b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
37900b57cec5SDimitry Andric                                                             size_type __pos) const _NOEXCEPT
37910b57cec5SDimitry Andric{
37920b57cec5SDimitry Andric    return __str_find_first_not_of<value_type, size_type, traits_type, npos>
37930b57cec5SDimitry Andric        (data(), size(), __str.data(), __pos, __str.size());
37940b57cec5SDimitry Andric}
37950b57cec5SDimitry Andric
37960b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
37970b57cec5SDimitry Andrictemplate <class _Tp>
37985ffd83dbSDimitry Andric_EnableIf
37990b57cec5SDimitry Andric<
38000b57cec5SDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
38010b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type
38025ffd83dbSDimitry Andric>
38030b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const _Tp& __t,
3804fe6060f1SDimitry Andric                                                size_type __pos) const _NOEXCEPT
38050b57cec5SDimitry Andric{
38060b57cec5SDimitry Andric    __self_view __sv = __t;
38070b57cec5SDimitry Andric    return __str_find_first_not_of<value_type, size_type, traits_type, npos>
38080b57cec5SDimitry Andric        (data(), size(), __sv.data(), __pos, __sv.size());
38090b57cec5SDimitry Andric}
38100b57cec5SDimitry Andric
38110b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
38120b57cec5SDimitry Andricinline
38130b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
38140b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
38150b57cec5SDimitry Andric                                                             size_type __pos) const _NOEXCEPT
38160b57cec5SDimitry Andric{
38170b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr");
38180b57cec5SDimitry Andric    return __str_find_first_not_of<value_type, size_type, traits_type, npos>
38190b57cec5SDimitry Andric        (data(), size(), __s, __pos, traits_type::length(__s));
38200b57cec5SDimitry Andric}
38210b57cec5SDimitry Andric
38220b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
38230b57cec5SDimitry Andricinline
38240b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
38250b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
38260b57cec5SDimitry Andric                                                             size_type __pos) const _NOEXCEPT
38270b57cec5SDimitry Andric{
38280b57cec5SDimitry Andric    return __str_find_first_not_of<value_type, size_type, traits_type, npos>
38290b57cec5SDimitry Andric        (data(), size(), __c, __pos);
38300b57cec5SDimitry Andric}
38310b57cec5SDimitry Andric
38320b57cec5SDimitry Andric// find_last_not_of
38330b57cec5SDimitry Andric
38340b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
38350b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
38360b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
38370b57cec5SDimitry Andric                                                            size_type __pos,
38380b57cec5SDimitry Andric                                                            size_type __n) const _NOEXCEPT
38390b57cec5SDimitry Andric{
38400b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr");
38410b57cec5SDimitry Andric    return __str_find_last_not_of<value_type, size_type, traits_type, npos>
38420b57cec5SDimitry Andric        (data(), size(), __s, __pos, __n);
38430b57cec5SDimitry Andric}
38440b57cec5SDimitry Andric
38450b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
38460b57cec5SDimitry Andricinline
38470b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
38480b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
38490b57cec5SDimitry Andric                                                            size_type __pos) const _NOEXCEPT
38500b57cec5SDimitry Andric{
38510b57cec5SDimitry Andric    return __str_find_last_not_of<value_type, size_type, traits_type, npos>
38520b57cec5SDimitry Andric        (data(), size(), __str.data(), __pos, __str.size());
38530b57cec5SDimitry Andric}
38540b57cec5SDimitry Andric
38550b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
38560b57cec5SDimitry Andrictemplate <class _Tp>
38575ffd83dbSDimitry Andric_EnableIf
38580b57cec5SDimitry Andric<
38590b57cec5SDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
38600b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type
38615ffd83dbSDimitry Andric>
38620b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const _Tp& __t,
3863fe6060f1SDimitry Andric                                                size_type __pos) const _NOEXCEPT
38640b57cec5SDimitry Andric{
38650b57cec5SDimitry Andric    __self_view __sv = __t;
38660b57cec5SDimitry Andric    return __str_find_last_not_of<value_type, size_type, traits_type, npos>
38670b57cec5SDimitry Andric        (data(), size(), __sv.data(), __pos, __sv.size());
38680b57cec5SDimitry Andric}
38690b57cec5SDimitry Andric
38700b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
38710b57cec5SDimitry Andricinline
38720b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
38730b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
38740b57cec5SDimitry Andric                                                            size_type __pos) const _NOEXCEPT
38750b57cec5SDimitry Andric{
38760b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr");
38770b57cec5SDimitry Andric    return __str_find_last_not_of<value_type, size_type, traits_type, npos>
38780b57cec5SDimitry Andric        (data(), size(), __s, __pos, traits_type::length(__s));
38790b57cec5SDimitry Andric}
38800b57cec5SDimitry Andric
38810b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
38820b57cec5SDimitry Andricinline
38830b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type
38840b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
38850b57cec5SDimitry Andric                                                            size_type __pos) const _NOEXCEPT
38860b57cec5SDimitry Andric{
38870b57cec5SDimitry Andric    return __str_find_last_not_of<value_type, size_type, traits_type, npos>
38880b57cec5SDimitry Andric        (data(), size(), __c, __pos);
38890b57cec5SDimitry Andric}
38900b57cec5SDimitry Andric
38910b57cec5SDimitry Andric// compare
38920b57cec5SDimitry Andric
38930b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
38940b57cec5SDimitry Andrictemplate <class _Tp>
38955ffd83dbSDimitry Andric_EnableIf
38960b57cec5SDimitry Andric<
38970b57cec5SDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
38980b57cec5SDimitry Andric    int
38995ffd83dbSDimitry Andric>
3900fe6060f1SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(const _Tp& __t) const _NOEXCEPT
39010b57cec5SDimitry Andric{
39020b57cec5SDimitry Andric    __self_view __sv = __t;
39030b57cec5SDimitry Andric    size_t __lhs_sz = size();
39040b57cec5SDimitry Andric    size_t __rhs_sz = __sv.size();
39050b57cec5SDimitry Andric    int __result = traits_type::compare(data(), __sv.data(),
39060b57cec5SDimitry Andric                                        _VSTD::min(__lhs_sz, __rhs_sz));
39070b57cec5SDimitry Andric    if (__result != 0)
39080b57cec5SDimitry Andric        return __result;
39090b57cec5SDimitry Andric    if (__lhs_sz < __rhs_sz)
39100b57cec5SDimitry Andric        return -1;
39110b57cec5SDimitry Andric    if (__lhs_sz > __rhs_sz)
39120b57cec5SDimitry Andric        return 1;
39130b57cec5SDimitry Andric    return 0;
39140b57cec5SDimitry Andric}
39150b57cec5SDimitry Andric
39160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
39170b57cec5SDimitry Andricinline
39180b57cec5SDimitry Andricint
39190b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
39200b57cec5SDimitry Andric{
39210b57cec5SDimitry Andric    return compare(__self_view(__str));
39220b57cec5SDimitry Andric}
39230b57cec5SDimitry Andric
39240b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
39250b57cec5SDimitry Andricint
39260b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
39270b57cec5SDimitry Andric                                                   size_type __n1,
39280b57cec5SDimitry Andric                                                   const value_type* __s,
39290b57cec5SDimitry Andric                                                   size_type __n2) const
39300b57cec5SDimitry Andric{
39310b57cec5SDimitry Andric    _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr");
39320b57cec5SDimitry Andric    size_type __sz = size();
39330b57cec5SDimitry Andric    if (__pos1 > __sz || __n2 == npos)
39340b57cec5SDimitry Andric        this->__throw_out_of_range();
39350b57cec5SDimitry Andric    size_type __rlen = _VSTD::min(__n1, __sz - __pos1);
39360b57cec5SDimitry Andric    int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2));
39370b57cec5SDimitry Andric    if (__r == 0)
39380b57cec5SDimitry Andric    {
39390b57cec5SDimitry Andric        if (__rlen < __n2)
39400b57cec5SDimitry Andric            __r = -1;
39410b57cec5SDimitry Andric        else if (__rlen > __n2)
39420b57cec5SDimitry Andric            __r = 1;
39430b57cec5SDimitry Andric    }
39440b57cec5SDimitry Andric    return __r;
39450b57cec5SDimitry Andric}
39460b57cec5SDimitry Andric
39470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
39480b57cec5SDimitry Andrictemplate <class _Tp>
39495ffd83dbSDimitry Andric_EnableIf
39500b57cec5SDimitry Andric<
39510b57cec5SDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
39520b57cec5SDimitry Andric    int
39535ffd83dbSDimitry Andric>
39540b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
39550b57cec5SDimitry Andric                                                   size_type __n1,
39560b57cec5SDimitry Andric                                                   const _Tp& __t) const
39570b57cec5SDimitry Andric{
39580b57cec5SDimitry Andric    __self_view __sv = __t;
39590b57cec5SDimitry Andric    return compare(__pos1, __n1, __sv.data(), __sv.size());
39600b57cec5SDimitry Andric}
39610b57cec5SDimitry Andric
39620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
39630b57cec5SDimitry Andricinline
39640b57cec5SDimitry Andricint
39650b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
39660b57cec5SDimitry Andric                                                   size_type __n1,
39670b57cec5SDimitry Andric                                                   const basic_string& __str) const
39680b57cec5SDimitry Andric{
39690b57cec5SDimitry Andric    return compare(__pos1, __n1, __str.data(), __str.size());
39700b57cec5SDimitry Andric}
39710b57cec5SDimitry Andric
39720b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
39730b57cec5SDimitry Andrictemplate <class _Tp>
39745ffd83dbSDimitry Andric_EnableIf
39750b57cec5SDimitry Andric<
39765ffd83dbSDimitry Andric    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
39775ffd83dbSDimitry Andric    && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
39780b57cec5SDimitry Andric    int
39795ffd83dbSDimitry Andric>
39800b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
39810b57cec5SDimitry Andric                                                   size_type __n1,
39820b57cec5SDimitry Andric                                                   const _Tp& __t,
39830b57cec5SDimitry Andric                                                   size_type __pos2,
39840b57cec5SDimitry Andric                                                   size_type __n2) const
39850b57cec5SDimitry Andric{
39860b57cec5SDimitry Andric    __self_view __sv = __t;
39870b57cec5SDimitry Andric    return __self_view(*this).substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
39880b57cec5SDimitry Andric}
39890b57cec5SDimitry Andric
39900b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
39910b57cec5SDimitry Andricint
39920b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
39930b57cec5SDimitry Andric                                                   size_type __n1,
39940b57cec5SDimitry Andric                                                   const basic_string& __str,
39950b57cec5SDimitry Andric                                                   size_type __pos2,
39960b57cec5SDimitry Andric                                                   size_type __n2) const
39970b57cec5SDimitry Andric{
39980b57cec5SDimitry Andric        return compare(__pos1, __n1, __self_view(__str), __pos2, __n2);
39990b57cec5SDimitry Andric}
40000b57cec5SDimitry Andric
40010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
40020b57cec5SDimitry Andricint
40030b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
40040b57cec5SDimitry Andric{
40050b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
40060b57cec5SDimitry Andric    return compare(0, npos, __s, traits_type::length(__s));
40070b57cec5SDimitry Andric}
40080b57cec5SDimitry Andric
40090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator>
40100b57cec5SDimitry Andricint
40110b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
40120b57cec5SDimitry Andric                                                   size_type __n1,
40130b57cec5SDimitry Andric                                                   const value_type* __s) const
40140b57cec5SDimitry Andric{
40150b57cec5SDimitry Andric    _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
40160b57cec5SDimitry Andric    return compare(__pos1, __n1, __s, traits_type::length(__s));
40170b57cec5SDimitry Andric}
40180b57cec5SDimitry Andric
40190b57cec5SDimitry Andric// __invariants
40200b57cec5SDimitry Andric
40210b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
40220b57cec5SDimitry Andricinline
40230b57cec5SDimitry Andricbool
40240b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__invariants() const
40250b57cec5SDimitry Andric{
40260b57cec5SDimitry Andric    if (size() > capacity())
40270b57cec5SDimitry Andric        return false;
40280b57cec5SDimitry Andric    if (capacity() < __min_cap - 1)
40290b57cec5SDimitry Andric        return false;
4030e8d8bef9SDimitry Andric    if (data() == nullptr)
40310b57cec5SDimitry Andric        return false;
4032e8d8bef9SDimitry Andric    if (data()[size()] != value_type())
40330b57cec5SDimitry Andric        return false;
40340b57cec5SDimitry Andric    return true;
40350b57cec5SDimitry Andric}
40360b57cec5SDimitry Andric
40370b57cec5SDimitry Andric// __clear_and_shrink
40380b57cec5SDimitry Andric
40390b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
40400b57cec5SDimitry Andricinline
40410b57cec5SDimitry Andricvoid
40420b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__clear_and_shrink() _NOEXCEPT
40430b57cec5SDimitry Andric{
40440b57cec5SDimitry Andric    clear();
40450b57cec5SDimitry Andric    if(__is_long())
40460b57cec5SDimitry Andric    {
40470b57cec5SDimitry Andric        __alloc_traits::deallocate(__alloc(), __get_long_pointer(), capacity() + 1);
40480b57cec5SDimitry Andric        __set_long_cap(0);
40490b57cec5SDimitry Andric        __set_short_size(0);
4050e8d8bef9SDimitry Andric        traits_type::assign(*__get_short_pointer(), value_type());
40510b57cec5SDimitry Andric    }
40520b57cec5SDimitry Andric}
40530b57cec5SDimitry Andric
40540b57cec5SDimitry Andric// operator==
40550b57cec5SDimitry Andric
40560b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
40570b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40580b57cec5SDimitry Andricbool
40590b57cec5SDimitry Andricoperator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
40600b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
40610b57cec5SDimitry Andric{
40620b57cec5SDimitry Andric    size_t __lhs_sz = __lhs.size();
40630b57cec5SDimitry Andric    return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(),
40640b57cec5SDimitry Andric                                                        __rhs.data(),
40650b57cec5SDimitry Andric                                                        __lhs_sz) == 0;
40660b57cec5SDimitry Andric}
40670b57cec5SDimitry Andric
40680b57cec5SDimitry Andrictemplate<class _Allocator>
40690b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40700b57cec5SDimitry Andricbool
40710b57cec5SDimitry Andricoperator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
40720b57cec5SDimitry Andric           const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT
40730b57cec5SDimitry Andric{
40740b57cec5SDimitry Andric    size_t __lhs_sz = __lhs.size();
40750b57cec5SDimitry Andric    if (__lhs_sz != __rhs.size())
40760b57cec5SDimitry Andric        return false;
40770b57cec5SDimitry Andric    const char* __lp = __lhs.data();
40780b57cec5SDimitry Andric    const char* __rp = __rhs.data();
40790b57cec5SDimitry Andric    if (__lhs.__is_long())
40800b57cec5SDimitry Andric        return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
40810b57cec5SDimitry Andric    for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
40820b57cec5SDimitry Andric        if (*__lp != *__rp)
40830b57cec5SDimitry Andric            return false;
40840b57cec5SDimitry Andric    return true;
40850b57cec5SDimitry Andric}
40860b57cec5SDimitry Andric
40870b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
40880b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40890b57cec5SDimitry Andricbool
40900b57cec5SDimitry Andricoperator==(const _CharT* __lhs,
40910b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
40920b57cec5SDimitry Andric{
40930b57cec5SDimitry Andric    typedef basic_string<_CharT, _Traits, _Allocator> _String;
40940b57cec5SDimitry Andric    _LIBCPP_ASSERT(__lhs != nullptr, "operator==(char*, basic_string): received nullptr");
40950b57cec5SDimitry Andric    size_t __lhs_len = _Traits::length(__lhs);
40960b57cec5SDimitry Andric    if (__lhs_len != __rhs.size()) return false;
40970b57cec5SDimitry Andric    return __rhs.compare(0, _String::npos, __lhs, __lhs_len) == 0;
40980b57cec5SDimitry Andric}
40990b57cec5SDimitry Andric
41000b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41010b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41020b57cec5SDimitry Andricbool
41030b57cec5SDimitry Andricoperator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
41040b57cec5SDimitry Andric           const _CharT* __rhs) _NOEXCEPT
41050b57cec5SDimitry Andric{
41060b57cec5SDimitry Andric    typedef basic_string<_CharT, _Traits, _Allocator> _String;
41070b57cec5SDimitry Andric    _LIBCPP_ASSERT(__rhs != nullptr, "operator==(basic_string, char*): received nullptr");
41080b57cec5SDimitry Andric    size_t __rhs_len = _Traits::length(__rhs);
41090b57cec5SDimitry Andric    if (__rhs_len != __lhs.size()) return false;
41100b57cec5SDimitry Andric    return __lhs.compare(0, _String::npos, __rhs, __rhs_len) == 0;
41110b57cec5SDimitry Andric}
41120b57cec5SDimitry Andric
41130b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41140b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41150b57cec5SDimitry Andricbool
41160b57cec5SDimitry Andricoperator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
41170b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
41180b57cec5SDimitry Andric{
41190b57cec5SDimitry Andric    return !(__lhs == __rhs);
41200b57cec5SDimitry Andric}
41210b57cec5SDimitry Andric
41220b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41230b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41240b57cec5SDimitry Andricbool
41250b57cec5SDimitry Andricoperator!=(const _CharT* __lhs,
41260b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
41270b57cec5SDimitry Andric{
41280b57cec5SDimitry Andric    return !(__lhs == __rhs);
41290b57cec5SDimitry Andric}
41300b57cec5SDimitry Andric
41310b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41320b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41330b57cec5SDimitry Andricbool
41340b57cec5SDimitry Andricoperator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
41350b57cec5SDimitry Andric           const _CharT* __rhs) _NOEXCEPT
41360b57cec5SDimitry Andric{
41370b57cec5SDimitry Andric    return !(__lhs == __rhs);
41380b57cec5SDimitry Andric}
41390b57cec5SDimitry Andric
41400b57cec5SDimitry Andric// operator<
41410b57cec5SDimitry Andric
41420b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41430b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41440b57cec5SDimitry Andricbool
41450b57cec5SDimitry Andricoperator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
41460b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
41470b57cec5SDimitry Andric{
41480b57cec5SDimitry Andric    return __lhs.compare(__rhs) < 0;
41490b57cec5SDimitry Andric}
41500b57cec5SDimitry Andric
41510b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41520b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41530b57cec5SDimitry Andricbool
41540b57cec5SDimitry Andricoperator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
41550b57cec5SDimitry Andric           const _CharT* __rhs) _NOEXCEPT
41560b57cec5SDimitry Andric{
41570b57cec5SDimitry Andric    return __lhs.compare(__rhs) < 0;
41580b57cec5SDimitry Andric}
41590b57cec5SDimitry Andric
41600b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41610b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41620b57cec5SDimitry Andricbool
41630b57cec5SDimitry Andricoperator< (const _CharT* __lhs,
41640b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
41650b57cec5SDimitry Andric{
41660b57cec5SDimitry Andric    return __rhs.compare(__lhs) > 0;
41670b57cec5SDimitry Andric}
41680b57cec5SDimitry Andric
41690b57cec5SDimitry Andric// operator>
41700b57cec5SDimitry Andric
41710b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41720b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41730b57cec5SDimitry Andricbool
41740b57cec5SDimitry Andricoperator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
41750b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
41760b57cec5SDimitry Andric{
41770b57cec5SDimitry Andric    return __rhs < __lhs;
41780b57cec5SDimitry Andric}
41790b57cec5SDimitry Andric
41800b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41810b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41820b57cec5SDimitry Andricbool
41830b57cec5SDimitry Andricoperator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
41840b57cec5SDimitry Andric           const _CharT* __rhs) _NOEXCEPT
41850b57cec5SDimitry Andric{
41860b57cec5SDimitry Andric    return __rhs < __lhs;
41870b57cec5SDimitry Andric}
41880b57cec5SDimitry Andric
41890b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
41900b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41910b57cec5SDimitry Andricbool
41920b57cec5SDimitry Andricoperator> (const _CharT* __lhs,
41930b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
41940b57cec5SDimitry Andric{
41950b57cec5SDimitry Andric    return __rhs < __lhs;
41960b57cec5SDimitry Andric}
41970b57cec5SDimitry Andric
41980b57cec5SDimitry Andric// operator<=
41990b57cec5SDimitry Andric
42000b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42010b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42020b57cec5SDimitry Andricbool
42030b57cec5SDimitry Andricoperator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
42040b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
42050b57cec5SDimitry Andric{
42060b57cec5SDimitry Andric    return !(__rhs < __lhs);
42070b57cec5SDimitry Andric}
42080b57cec5SDimitry Andric
42090b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42100b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42110b57cec5SDimitry Andricbool
42120b57cec5SDimitry Andricoperator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
42130b57cec5SDimitry Andric           const _CharT* __rhs) _NOEXCEPT
42140b57cec5SDimitry Andric{
42150b57cec5SDimitry Andric    return !(__rhs < __lhs);
42160b57cec5SDimitry Andric}
42170b57cec5SDimitry Andric
42180b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42190b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42200b57cec5SDimitry Andricbool
42210b57cec5SDimitry Andricoperator<=(const _CharT* __lhs,
42220b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
42230b57cec5SDimitry Andric{
42240b57cec5SDimitry Andric    return !(__rhs < __lhs);
42250b57cec5SDimitry Andric}
42260b57cec5SDimitry Andric
42270b57cec5SDimitry Andric// operator>=
42280b57cec5SDimitry Andric
42290b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42300b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42310b57cec5SDimitry Andricbool
42320b57cec5SDimitry Andricoperator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
42330b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
42340b57cec5SDimitry Andric{
42350b57cec5SDimitry Andric    return !(__lhs < __rhs);
42360b57cec5SDimitry Andric}
42370b57cec5SDimitry Andric
42380b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42390b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42400b57cec5SDimitry Andricbool
42410b57cec5SDimitry Andricoperator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
42420b57cec5SDimitry Andric           const _CharT* __rhs) _NOEXCEPT
42430b57cec5SDimitry Andric{
42440b57cec5SDimitry Andric    return !(__lhs < __rhs);
42450b57cec5SDimitry Andric}
42460b57cec5SDimitry Andric
42470b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42480b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42490b57cec5SDimitry Andricbool
42500b57cec5SDimitry Andricoperator>=(const _CharT* __lhs,
42510b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
42520b57cec5SDimitry Andric{
42530b57cec5SDimitry Andric    return !(__lhs < __rhs);
42540b57cec5SDimitry Andric}
42550b57cec5SDimitry Andric
42560b57cec5SDimitry Andric// operator +
42570b57cec5SDimitry Andric
42580b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42590b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
42600b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
42610b57cec5SDimitry Andric          const basic_string<_CharT, _Traits, _Allocator>& __rhs)
42620b57cec5SDimitry Andric{
42630b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
42640b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
42650b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
42660b57cec5SDimitry Andric    __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
42670b57cec5SDimitry Andric    __r.append(__rhs.data(), __rhs_sz);
42680b57cec5SDimitry Andric    return __r;
42690b57cec5SDimitry Andric}
42700b57cec5SDimitry Andric
42710b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42720b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
42730b57cec5SDimitry Andricoperator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
42740b57cec5SDimitry Andric{
42750b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
42760b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs);
42770b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
42780b57cec5SDimitry Andric    __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
42790b57cec5SDimitry Andric    __r.append(__rhs.data(), __rhs_sz);
42800b57cec5SDimitry Andric    return __r;
42810b57cec5SDimitry Andric}
42820b57cec5SDimitry Andric
42830b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42840b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
42850b57cec5SDimitry Andricoperator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
42860b57cec5SDimitry Andric{
42870b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
42880b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
42890b57cec5SDimitry Andric    __r.__init(&__lhs, 1, 1 + __rhs_sz);
42900b57cec5SDimitry Andric    __r.append(__rhs.data(), __rhs_sz);
42910b57cec5SDimitry Andric    return __r;
42920b57cec5SDimitry Andric}
42930b57cec5SDimitry Andric
42940b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
42950b57cec5SDimitry Andricinline
42960b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
42970b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
42980b57cec5SDimitry Andric{
42990b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
43000b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
43010b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs);
43020b57cec5SDimitry Andric    __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
43030b57cec5SDimitry Andric    __r.append(__rhs, __rhs_sz);
43040b57cec5SDimitry Andric    return __r;
43050b57cec5SDimitry Andric}
43060b57cec5SDimitry Andric
43070b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
43080b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
43090b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
43100b57cec5SDimitry Andric{
43110b57cec5SDimitry Andric    basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
43120b57cec5SDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
43130b57cec5SDimitry Andric    __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
43140b57cec5SDimitry Andric    __r.push_back(__rhs);
43150b57cec5SDimitry Andric    return __r;
43160b57cec5SDimitry Andric}
43170b57cec5SDimitry Andric
43180b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
43190b57cec5SDimitry Andric
43200b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
43210b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
43230b57cec5SDimitry Andricoperator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
43240b57cec5SDimitry Andric{
43250b57cec5SDimitry Andric    return _VSTD::move(__lhs.append(__rhs));
43260b57cec5SDimitry Andric}
43270b57cec5SDimitry Andric
43280b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
43290b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43300b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
43310b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
43320b57cec5SDimitry Andric{
43330b57cec5SDimitry Andric    return _VSTD::move(__rhs.insert(0, __lhs));
43340b57cec5SDimitry Andric}
43350b57cec5SDimitry Andric
43360b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
43370b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43380b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
43390b57cec5SDimitry Andricoperator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
43400b57cec5SDimitry Andric{
43410b57cec5SDimitry Andric    return _VSTD::move(__lhs.append(__rhs));
43420b57cec5SDimitry Andric}
43430b57cec5SDimitry Andric
43440b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
43450b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43460b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
43470b57cec5SDimitry Andricoperator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
43480b57cec5SDimitry Andric{
43490b57cec5SDimitry Andric    return _VSTD::move(__rhs.insert(0, __lhs));
43500b57cec5SDimitry Andric}
43510b57cec5SDimitry Andric
43520b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
43530b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43540b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
43550b57cec5SDimitry Andricoperator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
43560b57cec5SDimitry Andric{
43570b57cec5SDimitry Andric    __rhs.insert(__rhs.begin(), __lhs);
43580b57cec5SDimitry Andric    return _VSTD::move(__rhs);
43590b57cec5SDimitry Andric}
43600b57cec5SDimitry Andric
43610b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
43620b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43630b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
43640b57cec5SDimitry Andricoperator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
43650b57cec5SDimitry Andric{
43660b57cec5SDimitry Andric    return _VSTD::move(__lhs.append(__rhs));
43670b57cec5SDimitry Andric}
43680b57cec5SDimitry Andric
43690b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
43700b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43710b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>
43720b57cec5SDimitry Andricoperator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
43730b57cec5SDimitry Andric{
43740b57cec5SDimitry Andric    __lhs.push_back(__rhs);
43750b57cec5SDimitry Andric    return _VSTD::move(__lhs);
43760b57cec5SDimitry Andric}
43770b57cec5SDimitry Andric
43780b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
43790b57cec5SDimitry Andric
43800b57cec5SDimitry Andric// swap
43810b57cec5SDimitry Andric
43820b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
43830b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43840b57cec5SDimitry Andricvoid
43850b57cec5SDimitry Andricswap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
43860b57cec5SDimitry Andric     basic_string<_CharT, _Traits, _Allocator>& __rhs)
43870b57cec5SDimitry Andric     _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
43880b57cec5SDimitry Andric{
43890b57cec5SDimitry Andric    __lhs.swap(__rhs);
43900b57cec5SDimitry Andric}
43910b57cec5SDimitry Andric
4392e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS int                stoi  (const string& __str, size_t* __idx = nullptr, int __base = 10);
4393e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS long               stol  (const string& __str, size_t* __idx = nullptr, int __base = 10);
4394e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS unsigned long      stoul (const string& __str, size_t* __idx = nullptr, int __base = 10);
4395e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS long long          stoll (const string& __str, size_t* __idx = nullptr, int __base = 10);
4396e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS unsigned long long stoull(const string& __str, size_t* __idx = nullptr, int __base = 10);
43970b57cec5SDimitry Andric
4398e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS float       stof (const string& __str, size_t* __idx = nullptr);
4399e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS double      stod (const string& __str, size_t* __idx = nullptr);
4400e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS long double stold(const string& __str, size_t* __idx = nullptr);
44010b57cec5SDimitry Andric
44020b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(int __val);
44030b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(unsigned __val);
44040b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(long __val);
44050b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(unsigned long __val);
44060b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(long long __val);
44070b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(unsigned long long __val);
44080b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(float __val);
44090b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(double __val);
44100b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(long double __val);
44110b57cec5SDimitry Andric
4412e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS int                stoi  (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
4413e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS long               stol  (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
4414e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS unsigned long      stoul (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
4415e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS long long          stoll (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
4416e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS unsigned long long stoull(const wstring& __str, size_t* __idx = nullptr, int __base = 10);
44170b57cec5SDimitry Andric
4418e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS float       stof (const wstring& __str, size_t* __idx = nullptr);
4419e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS double      stod (const wstring& __str, size_t* __idx = nullptr);
4420e8d8bef9SDimitry Andric_LIBCPP_FUNC_VIS long double stold(const wstring& __str, size_t* __idx = nullptr);
44210b57cec5SDimitry Andric
44220b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(int __val);
44230b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(unsigned __val);
44240b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(long __val);
44250b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long __val);
44260b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(long long __val);
44270b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long long __val);
44280b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(float __val);
44290b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(double __val);
44300b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(long double __val);
44310b57cec5SDimitry Andric
44320b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
4433fe6060f1SDimitry Andric_LIBCPP_TEMPLATE_DATA_VIS
44340b57cec5SDimitry Andricconst typename basic_string<_CharT, _Traits, _Allocator>::size_type
44350b57cec5SDimitry Andric               basic_string<_CharT, _Traits, _Allocator>::npos;
44360b57cec5SDimitry Andric
44370b57cec5SDimitry Andrictemplate <class _CharT, class _Allocator>
44380b57cec5SDimitry Andricstruct _LIBCPP_TEMPLATE_VIS
44390b57cec5SDimitry Andric    hash<basic_string<_CharT, char_traits<_CharT>, _Allocator> >
44400b57cec5SDimitry Andric    : public unary_function<
44410b57cec5SDimitry Andric          basic_string<_CharT, char_traits<_CharT>, _Allocator>, size_t>
44420b57cec5SDimitry Andric{
44430b57cec5SDimitry Andric    size_t
44440b57cec5SDimitry Andric    operator()(const basic_string<_CharT, char_traits<_CharT>, _Allocator>& __val) const _NOEXCEPT
44450b57cec5SDimitry Andric    { return __do_string_hash(__val.data(), __val.data() + __val.size()); }
44460b57cec5SDimitry Andric};
44470b57cec5SDimitry Andric
44480b57cec5SDimitry Andric
44490b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
44500b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>&
44510b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os,
44520b57cec5SDimitry Andric           const basic_string<_CharT, _Traits, _Allocator>& __str);
44530b57cec5SDimitry Andric
44540b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
44550b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
44560b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is,
44570b57cec5SDimitry Andric           basic_string<_CharT, _Traits, _Allocator>& __str);
44580b57cec5SDimitry Andric
44590b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
44600b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
44610b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is,
44620b57cec5SDimitry Andric        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
44630b57cec5SDimitry Andric
44640b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
44650b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44660b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
44670b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is,
44680b57cec5SDimitry Andric        basic_string<_CharT, _Traits, _Allocator>& __str);
44690b57cec5SDimitry Andric
44700b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
44710b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44720b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
44730b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is,
44740b57cec5SDimitry Andric        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
44750b57cec5SDimitry Andric
44760b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
44770b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44780b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>&
44790b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is,
44800b57cec5SDimitry Andric        basic_string<_CharT, _Traits, _Allocator>& __str);
44810b57cec5SDimitry Andric
44820b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 17
44830b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator, class _Up>
44840b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44855ffd83dbSDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type
44865ffd83dbSDimitry Andric    erase(basic_string<_CharT, _Traits, _Allocator>& __str, const _Up& __v) {
44875ffd83dbSDimitry Andric  auto __old_size = __str.size();
44885ffd83dbSDimitry Andric  __str.erase(_VSTD::remove(__str.begin(), __str.end(), __v), __str.end());
44895ffd83dbSDimitry Andric  return __old_size - __str.size();
44905ffd83dbSDimitry Andric}
44910b57cec5SDimitry Andric
44920b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator, class _Predicate>
44930b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44945ffd83dbSDimitry Andric    typename basic_string<_CharT, _Traits, _Allocator>::size_type
44955ffd83dbSDimitry Andric    erase_if(basic_string<_CharT, _Traits, _Allocator>& __str,
44965ffd83dbSDimitry Andric             _Predicate __pred) {
44975ffd83dbSDimitry Andric  auto __old_size = __str.size();
44985ffd83dbSDimitry Andric  __str.erase(_VSTD::remove_if(__str.begin(), __str.end(), __pred),
44995ffd83dbSDimitry Andric              __str.end());
45005ffd83dbSDimitry Andric  return __old_size - __str.size();
45015ffd83dbSDimitry Andric}
45020b57cec5SDimitry Andric#endif
45030b57cec5SDimitry Andric
4504e8d8bef9SDimitry Andric#if _LIBCPP_DEBUG_LEVEL == 2
45050b57cec5SDimitry Andric
45060b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
45070b57cec5SDimitry Andricbool
45080b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const
45090b57cec5SDimitry Andric{
4510480093f4SDimitry Andric    return this->data() <= _VSTD::__to_address(__i->base()) &&
4511480093f4SDimitry Andric           _VSTD::__to_address(__i->base()) < this->data() + this->size();
45120b57cec5SDimitry Andric}
45130b57cec5SDimitry Andric
45140b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
45150b57cec5SDimitry Andricbool
45160b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const
45170b57cec5SDimitry Andric{
4518480093f4SDimitry Andric    return this->data() < _VSTD::__to_address(__i->base()) &&
4519480093f4SDimitry Andric           _VSTD::__to_address(__i->base()) <= this->data() + this->size();
45200b57cec5SDimitry Andric}
45210b57cec5SDimitry Andric
45220b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
45230b57cec5SDimitry Andricbool
45240b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
45250b57cec5SDimitry Andric{
4526480093f4SDimitry Andric    const value_type* __p = _VSTD::__to_address(__i->base()) + __n;
45270b57cec5SDimitry Andric    return this->data() <= __p && __p <= this->data() + this->size();
45280b57cec5SDimitry Andric}
45290b57cec5SDimitry Andric
45300b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator>
45310b57cec5SDimitry Andricbool
45320b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
45330b57cec5SDimitry Andric{
4534480093f4SDimitry Andric    const value_type* __p = _VSTD::__to_address(__i->base()) + __n;
45350b57cec5SDimitry Andric    return this->data() <= __p && __p < this->data() + this->size();
45360b57cec5SDimitry Andric}
45370b57cec5SDimitry Andric
4538e8d8bef9SDimitry Andric#endif // _LIBCPP_DEBUG_LEVEL == 2
45390b57cec5SDimitry Andric
45400b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 11
45410b57cec5SDimitry Andric// Literal suffixes for basic_string [basic.string.literals]
45420b57cec5SDimitry Andricinline namespace literals
45430b57cec5SDimitry Andric{
45440b57cec5SDimitry Andric  inline namespace string_literals
45450b57cec5SDimitry Andric  {
45460b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
45470b57cec5SDimitry Andric    basic_string<char> operator "" s( const char *__str, size_t __len )
45480b57cec5SDimitry Andric    {
45490b57cec5SDimitry Andric        return basic_string<char> (__str, __len);
45500b57cec5SDimitry Andric    }
45510b57cec5SDimitry Andric
45520b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
45530b57cec5SDimitry Andric    basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
45540b57cec5SDimitry Andric    {
45550b57cec5SDimitry Andric        return basic_string<wchar_t> (__str, __len);
45560b57cec5SDimitry Andric    }
45570b57cec5SDimitry Andric
4558fe6060f1SDimitry Andric#ifndef _LIBCPP_HAS_NO_CHAR8_T
45590b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
45600b57cec5SDimitry Andric    basic_string<char8_t> operator "" s(const char8_t *__str, size_t __len) _NOEXCEPT
45610b57cec5SDimitry Andric    {
45620b57cec5SDimitry Andric        return basic_string<char8_t> (__str, __len);
45630b57cec5SDimitry Andric    }
45640b57cec5SDimitry Andric#endif
45650b57cec5SDimitry Andric
45660b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
45670b57cec5SDimitry Andric    basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len )
45680b57cec5SDimitry Andric    {
45690b57cec5SDimitry Andric        return basic_string<char16_t> (__str, __len);
45700b57cec5SDimitry Andric    }
45710b57cec5SDimitry Andric
45720b57cec5SDimitry Andric    inline _LIBCPP_INLINE_VISIBILITY
45730b57cec5SDimitry Andric    basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len )
45740b57cec5SDimitry Andric    {
45750b57cec5SDimitry Andric        return basic_string<char32_t> (__str, __len);
45760b57cec5SDimitry Andric    }
45770b57cec5SDimitry Andric  }
45780b57cec5SDimitry Andric}
45790b57cec5SDimitry Andric#endif
45800b57cec5SDimitry Andric
45810b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
45820b57cec5SDimitry Andric
45830b57cec5SDimitry Andric_LIBCPP_POP_MACROS
45840b57cec5SDimitry Andric
45850b57cec5SDimitry Andric#endif // _LIBCPP_STRING
4586