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>; 720b57cec5SDimitry Andric 730b57cec5SDimitry Andrictemplate<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 740b57cec5SDimitry Andricclass basic_string 750b57cec5SDimitry Andric{ 760b57cec5SDimitry Andricpublic: 770b57cec5SDimitry Andric// types: 780b57cec5SDimitry Andric typedef traits traits_type; 790b57cec5SDimitry Andric typedef typename traits_type::char_type value_type; 800b57cec5SDimitry Andric typedef Allocator allocator_type; 810b57cec5SDimitry Andric typedef typename allocator_type::size_type size_type; 820b57cec5SDimitry Andric typedef typename allocator_type::difference_type difference_type; 830b57cec5SDimitry Andric typedef typename allocator_type::reference reference; 840b57cec5SDimitry Andric typedef typename allocator_type::const_reference const_reference; 850b57cec5SDimitry Andric typedef typename allocator_type::pointer pointer; 860b57cec5SDimitry Andric typedef typename allocator_type::const_pointer const_pointer; 870b57cec5SDimitry Andric typedef implementation-defined iterator; 880b57cec5SDimitry Andric typedef implementation-defined const_iterator; 890b57cec5SDimitry Andric typedef std::reverse_iterator<iterator> reverse_iterator; 900b57cec5SDimitry Andric typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric static const size_type npos = -1; 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric basic_string() 950b57cec5SDimitry Andric noexcept(is_nothrow_default_constructible<allocator_type>::value); 960b57cec5SDimitry Andric explicit basic_string(const allocator_type& a); 970b57cec5SDimitry Andric basic_string(const basic_string& str); 980b57cec5SDimitry Andric basic_string(basic_string&& str) 990b57cec5SDimitry Andric noexcept(is_nothrow_move_constructible<allocator_type>::value); 1000b57cec5SDimitry Andric basic_string(const basic_string& str, size_type pos, 1010b57cec5SDimitry Andric const allocator_type& a = allocator_type()); 1020b57cec5SDimitry Andric basic_string(const basic_string& str, size_type pos, size_type n, 1030b57cec5SDimitry Andric const Allocator& a = Allocator()); 1040b57cec5SDimitry Andric template<class T> 1050b57cec5SDimitry Andric basic_string(const T& t, size_type pos, size_type n, const Allocator& a = Allocator()); // C++17 1060b57cec5SDimitry Andric template <class T> 1070b57cec5SDimitry Andric explicit basic_string(const T& t, const Allocator& a = Allocator()); // C++17 1080b57cec5SDimitry Andric basic_string(const value_type* s, const allocator_type& a = allocator_type()); 1090b57cec5SDimitry Andric basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type()); 1100b57cec5SDimitry Andric basic_string(size_type n, value_type c, const allocator_type& a = allocator_type()); 1110b57cec5SDimitry Andric template<class InputIterator> 1120b57cec5SDimitry Andric basic_string(InputIterator begin, InputIterator end, 1130b57cec5SDimitry Andric const allocator_type& a = allocator_type()); 1140b57cec5SDimitry Andric basic_string(initializer_list<value_type>, const Allocator& = Allocator()); 1150b57cec5SDimitry Andric basic_string(const basic_string&, const Allocator&); 1160b57cec5SDimitry Andric basic_string(basic_string&&, const Allocator&); 1170b57cec5SDimitry Andric 1180b57cec5SDimitry Andric ~basic_string(); 1190b57cec5SDimitry Andric 1200b57cec5SDimitry Andric operator basic_string_view<charT, traits>() const noexcept; 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric basic_string& operator=(const basic_string& str); 1230b57cec5SDimitry Andric template <class T> 1240b57cec5SDimitry Andric basic_string& operator=(const T& t); // C++17 1250b57cec5SDimitry Andric basic_string& operator=(basic_string&& str) 1260b57cec5SDimitry Andric noexcept( 1270b57cec5SDimitry Andric allocator_type::propagate_on_container_move_assignment::value || 1280b57cec5SDimitry Andric allocator_type::is_always_equal::value ); // C++17 1290b57cec5SDimitry Andric basic_string& operator=(const value_type* s); 1300b57cec5SDimitry Andric basic_string& operator=(value_type c); 1310b57cec5SDimitry Andric basic_string& operator=(initializer_list<value_type>); 1320b57cec5SDimitry Andric 1330b57cec5SDimitry Andric iterator begin() noexcept; 1340b57cec5SDimitry Andric const_iterator begin() const noexcept; 1350b57cec5SDimitry Andric iterator end() noexcept; 1360b57cec5SDimitry Andric const_iterator end() const noexcept; 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric reverse_iterator rbegin() noexcept; 1390b57cec5SDimitry Andric const_reverse_iterator rbegin() const noexcept; 1400b57cec5SDimitry Andric reverse_iterator rend() noexcept; 1410b57cec5SDimitry Andric const_reverse_iterator rend() const noexcept; 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andric const_iterator cbegin() const noexcept; 1440b57cec5SDimitry Andric const_iterator cend() const noexcept; 1450b57cec5SDimitry Andric const_reverse_iterator crbegin() const noexcept; 1460b57cec5SDimitry Andric const_reverse_iterator crend() const noexcept; 1470b57cec5SDimitry Andric 1480b57cec5SDimitry Andric size_type size() const noexcept; 1490b57cec5SDimitry Andric size_type length() const noexcept; 1500b57cec5SDimitry Andric size_type max_size() const noexcept; 1510b57cec5SDimitry Andric size_type capacity() const noexcept; 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andric void resize(size_type n, value_type c); 1540b57cec5SDimitry Andric void resize(size_type n); 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric void reserve(size_type res_arg = 0); 1570b57cec5SDimitry Andric void shrink_to_fit(); 1580b57cec5SDimitry Andric void clear() noexcept; 1590b57cec5SDimitry Andric bool empty() const noexcept; 1600b57cec5SDimitry Andric 1610b57cec5SDimitry Andric const_reference operator[](size_type pos) const; 1620b57cec5SDimitry Andric reference operator[](size_type pos); 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric const_reference at(size_type n) const; 1650b57cec5SDimitry Andric reference at(size_type n); 1660b57cec5SDimitry Andric 1670b57cec5SDimitry Andric basic_string& operator+=(const basic_string& str); 1680b57cec5SDimitry Andric template <class T> 1690b57cec5SDimitry Andric basic_string& operator+=(const T& t); // C++17 1700b57cec5SDimitry Andric basic_string& operator+=(const value_type* s); 1710b57cec5SDimitry Andric basic_string& operator+=(value_type c); 1720b57cec5SDimitry Andric basic_string& operator+=(initializer_list<value_type>); 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric basic_string& append(const basic_string& str); 1750b57cec5SDimitry Andric template <class T> 1760b57cec5SDimitry Andric basic_string& append(const T& t); // C++17 1770b57cec5SDimitry Andric basic_string& append(const basic_string& str, size_type pos, size_type n=npos); //C++14 1780b57cec5SDimitry Andric template <class T> 1790b57cec5SDimitry Andric basic_string& append(const T& t, size_type pos, size_type n=npos); // C++17 1800b57cec5SDimitry Andric basic_string& append(const value_type* s, size_type n); 1810b57cec5SDimitry Andric basic_string& append(const value_type* s); 1820b57cec5SDimitry Andric basic_string& append(size_type n, value_type c); 1830b57cec5SDimitry Andric template<class InputIterator> 1840b57cec5SDimitry Andric basic_string& append(InputIterator first, InputIterator last); 1850b57cec5SDimitry Andric basic_string& append(initializer_list<value_type>); 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric void push_back(value_type c); 1880b57cec5SDimitry Andric void pop_back(); 1890b57cec5SDimitry Andric reference front(); 1900b57cec5SDimitry Andric const_reference front() const; 1910b57cec5SDimitry Andric reference back(); 1920b57cec5SDimitry Andric const_reference back() const; 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric basic_string& assign(const basic_string& str); 1950b57cec5SDimitry Andric template <class T> 1960b57cec5SDimitry Andric basic_string& assign(const T& t); // C++17 1970b57cec5SDimitry Andric basic_string& assign(basic_string&& str); 1980b57cec5SDimitry Andric basic_string& assign(const basic_string& str, size_type pos, size_type n=npos); // C++14 1990b57cec5SDimitry Andric template <class T> 2000b57cec5SDimitry Andric basic_string& assign(const T& t, size_type pos, size_type n=npos); // C++17 2010b57cec5SDimitry Andric basic_string& assign(const value_type* s, size_type n); 2020b57cec5SDimitry Andric basic_string& assign(const value_type* s); 2030b57cec5SDimitry Andric basic_string& assign(size_type n, value_type c); 2040b57cec5SDimitry Andric template<class InputIterator> 2050b57cec5SDimitry Andric basic_string& assign(InputIterator first, InputIterator last); 2060b57cec5SDimitry Andric basic_string& assign(initializer_list<value_type>); 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric basic_string& insert(size_type pos1, const basic_string& str); 2090b57cec5SDimitry Andric template <class T> 2100b57cec5SDimitry Andric basic_string& insert(size_type pos1, const T& t); 2110b57cec5SDimitry Andric basic_string& insert(size_type pos1, const basic_string& str, 2120b57cec5SDimitry Andric size_type pos2, size_type n); 2130b57cec5SDimitry Andric template <class T> 2140b57cec5SDimitry Andric basic_string& insert(size_type pos1, const T& t, size_type pos2, size_type n); // C++17 2150b57cec5SDimitry Andric basic_string& insert(size_type pos, const value_type* s, size_type n=npos); //C++14 2160b57cec5SDimitry Andric basic_string& insert(size_type pos, const value_type* s); 2170b57cec5SDimitry Andric basic_string& insert(size_type pos, size_type n, value_type c); 2180b57cec5SDimitry Andric iterator insert(const_iterator p, value_type c); 2190b57cec5SDimitry Andric iterator insert(const_iterator p, size_type n, value_type c); 2200b57cec5SDimitry Andric template<class InputIterator> 2210b57cec5SDimitry Andric iterator insert(const_iterator p, InputIterator first, InputIterator last); 2220b57cec5SDimitry Andric iterator insert(const_iterator p, initializer_list<value_type>); 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric basic_string& erase(size_type pos = 0, size_type n = npos); 2250b57cec5SDimitry Andric iterator erase(const_iterator position); 2260b57cec5SDimitry Andric iterator erase(const_iterator first, const_iterator last); 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric basic_string& replace(size_type pos1, size_type n1, const basic_string& str); 2290b57cec5SDimitry Andric template <class T> 2300b57cec5SDimitry Andric basic_string& replace(size_type pos1, size_type n1, const T& t); // C++17 2310b57cec5SDimitry Andric basic_string& replace(size_type pos1, size_type n1, const basic_string& str, 2320b57cec5SDimitry Andric size_type pos2, size_type n2=npos); // C++14 2330b57cec5SDimitry Andric template <class T> 2340b57cec5SDimitry Andric basic_string& replace(size_type pos1, size_type n1, const T& t, 2350b57cec5SDimitry Andric size_type pos2, size_type n); // C++17 2360b57cec5SDimitry Andric basic_string& replace(size_type pos, size_type n1, const value_type* s, size_type n2); 2370b57cec5SDimitry Andric basic_string& replace(size_type pos, size_type n1, const value_type* s); 2380b57cec5SDimitry Andric basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c); 2390b57cec5SDimitry Andric basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str); 2400b57cec5SDimitry Andric template <class T> 2410b57cec5SDimitry Andric basic_string& replace(const_iterator i1, const_iterator i2, const T& t); // C++17 2420b57cec5SDimitry Andric basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n); 2430b57cec5SDimitry Andric basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s); 2440b57cec5SDimitry Andric basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c); 2450b57cec5SDimitry Andric template<class InputIterator> 2460b57cec5SDimitry Andric basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2); 2470b57cec5SDimitry Andric basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>); 2480b57cec5SDimitry Andric 2490b57cec5SDimitry Andric size_type copy(value_type* s, size_type n, size_type pos = 0) const; 2500b57cec5SDimitry Andric basic_string substr(size_type pos = 0, size_type n = npos) const; 2510b57cec5SDimitry Andric 2520b57cec5SDimitry Andric void swap(basic_string& str) 2530b57cec5SDimitry Andric noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value || 2540b57cec5SDimitry Andric allocator_traits<allocator_type>::is_always_equal::value); // C++17 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric const value_type* c_str() const noexcept; 2570b57cec5SDimitry Andric const value_type* data() const noexcept; 2580b57cec5SDimitry Andric value_type* data() noexcept; // C++17 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andric allocator_type get_allocator() const noexcept; 2610b57cec5SDimitry Andric 2620b57cec5SDimitry Andric size_type find(const basic_string& str, size_type pos = 0) const noexcept; 2630b57cec5SDimitry Andric template <class T> 2640b57cec5SDimitry Andric size_type find(const T& t, size_type pos = 0) const; // C++17 2650b57cec5SDimitry Andric size_type find(const value_type* s, size_type pos, size_type n) const noexcept; 2660b57cec5SDimitry Andric size_type find(const value_type* s, size_type pos = 0) const noexcept; 2670b57cec5SDimitry Andric size_type find(value_type c, size_type pos = 0) const noexcept; 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andric size_type rfind(const basic_string& str, size_type pos = npos) const noexcept; 2700b57cec5SDimitry Andric template <class T> 2710b57cec5SDimitry Andric size_type rfind(const T& t, size_type pos = npos) const; // C++17 2720b57cec5SDimitry Andric size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept; 2730b57cec5SDimitry Andric size_type rfind(const value_type* s, size_type pos = npos) const noexcept; 2740b57cec5SDimitry Andric size_type rfind(value_type c, size_type pos = npos) const noexcept; 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept; 2770b57cec5SDimitry Andric template <class T> 2780b57cec5SDimitry Andric size_type find_first_of(const T& t, size_type pos = 0) const; // C++17 2790b57cec5SDimitry Andric size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept; 2800b57cec5SDimitry Andric size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept; 2810b57cec5SDimitry Andric size_type find_first_of(value_type c, size_type pos = 0) const noexcept; 2820b57cec5SDimitry Andric 2830b57cec5SDimitry Andric size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept; 2840b57cec5SDimitry Andric template <class T> 2850b57cec5SDimitry Andric size_type find_last_of(const T& t, size_type pos = npos) const noexcept; // C++17 2860b57cec5SDimitry Andric size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept; 2870b57cec5SDimitry Andric size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept; 2880b57cec5SDimitry Andric size_type find_last_of(value_type c, size_type pos = npos) const noexcept; 2890b57cec5SDimitry Andric 2900b57cec5SDimitry Andric size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept; 2910b57cec5SDimitry Andric template <class T> 2920b57cec5SDimitry Andric size_type find_first_not_of(const T& t, size_type pos = 0) const; // C++17 2930b57cec5SDimitry Andric size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept; 2940b57cec5SDimitry Andric size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept; 2950b57cec5SDimitry Andric size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept; 2960b57cec5SDimitry Andric 2970b57cec5SDimitry Andric size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept; 2980b57cec5SDimitry Andric template <class T> 2990b57cec5SDimitry Andric size_type find_last_not_of(const T& t, size_type pos = npos) const; // C++17 3000b57cec5SDimitry Andric size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept; 3010b57cec5SDimitry Andric size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept; 3020b57cec5SDimitry Andric size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept; 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric int compare(const basic_string& str) const noexcept; 3050b57cec5SDimitry Andric template <class T> 3060b57cec5SDimitry Andric int compare(const T& t) const noexcept; // C++17 3070b57cec5SDimitry Andric int compare(size_type pos1, size_type n1, const basic_string& str) const; 3080b57cec5SDimitry Andric template <class T> 3090b57cec5SDimitry Andric int compare(size_type pos1, size_type n1, const T& t) const; // C++17 3100b57cec5SDimitry Andric int compare(size_type pos1, size_type n1, const basic_string& str, 3110b57cec5SDimitry Andric size_type pos2, size_type n2=npos) const; // C++14 3120b57cec5SDimitry Andric template <class T> 3130b57cec5SDimitry Andric int compare(size_type pos1, size_type n1, const T& t, 3140b57cec5SDimitry Andric size_type pos2, size_type n2=npos) const; // C++17 3150b57cec5SDimitry Andric int compare(const value_type* s) const noexcept; 3160b57cec5SDimitry Andric int compare(size_type pos1, size_type n1, const value_type* s) const; 3170b57cec5SDimitry Andric int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const; 3180b57cec5SDimitry Andric 3190b57cec5SDimitry Andric bool starts_with(basic_string_view<charT, traits> sv) const noexcept; // C++2a 3200b57cec5SDimitry Andric bool starts_with(charT c) const noexcept; // C++2a 3210b57cec5SDimitry Andric bool starts_with(const charT* s) const; // C++2a 3220b57cec5SDimitry Andric bool ends_with(basic_string_view<charT, traits> sv) const noexcept; // C++2a 3230b57cec5SDimitry Andric bool ends_with(charT c) const noexcept; // C++2a 3240b57cec5SDimitry Andric bool ends_with(const charT* s) const; // C++2a 3250b57cec5SDimitry Andric 3260b57cec5SDimitry Andric bool __invariants() const; 3270b57cec5SDimitry Andric}; 3280b57cec5SDimitry Andric 3290b57cec5SDimitry Andrictemplate<class InputIterator, 3300b57cec5SDimitry Andric class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> 3310b57cec5SDimitry Andricbasic_string(InputIterator, InputIterator, Allocator = Allocator()) 3320b57cec5SDimitry Andric -> basic_string<typename iterator_traits<InputIterator>::value_type, 3330b57cec5SDimitry Andric char_traits<typename iterator_traits<InputIterator>::value_type>, 3340b57cec5SDimitry Andric Allocator>; // C++17 3350b57cec5SDimitry Andric 3360b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 3370b57cec5SDimitry Andricbasic_string<charT, traits, Allocator> 3380b57cec5SDimitry Andricoperator+(const basic_string<charT, traits, Allocator>& lhs, 3390b57cec5SDimitry Andric const basic_string<charT, traits, Allocator>& rhs); 3400b57cec5SDimitry Andric 3410b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 3420b57cec5SDimitry Andricbasic_string<charT, traits, Allocator> 3430b57cec5SDimitry Andricoperator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs); 3440b57cec5SDimitry Andric 3450b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 3460b57cec5SDimitry Andricbasic_string<charT, traits, Allocator> 3470b57cec5SDimitry Andricoperator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs); 3480b57cec5SDimitry Andric 3490b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 3500b57cec5SDimitry Andricbasic_string<charT, traits, Allocator> 3510b57cec5SDimitry Andricoperator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs); 3520b57cec5SDimitry Andric 3530b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 3540b57cec5SDimitry Andricbasic_string<charT, traits, Allocator> 3550b57cec5SDimitry Andricoperator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs); 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 3580b57cec5SDimitry Andricbool operator==(const basic_string<charT, traits, Allocator>& lhs, 3590b57cec5SDimitry Andric const basic_string<charT, traits, Allocator>& rhs) noexcept; 3600b57cec5SDimitry Andric 3610b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 3620b57cec5SDimitry Andricbool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; 3630b57cec5SDimitry Andric 3640b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 3650b57cec5SDimitry Andricbool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept; 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 basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 3850b57cec5SDimitry Andricbool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& 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 Andricvoid swap(basic_string<charT, traits, Allocator>& lhs, 4190b57cec5SDimitry Andric basic_string<charT, traits, Allocator>& rhs) 4200b57cec5SDimitry Andric noexcept(noexcept(lhs.swap(rhs))); 4210b57cec5SDimitry Andric 4220b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 4230b57cec5SDimitry Andricbasic_istream<charT, traits>& 4240b57cec5SDimitry Andricoperator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str); 4250b57cec5SDimitry Andric 4260b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 4270b57cec5SDimitry Andricbasic_ostream<charT, traits>& 4280b57cec5SDimitry Andricoperator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str); 4290b57cec5SDimitry Andric 4300b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 4310b57cec5SDimitry Andricbasic_istream<charT, traits>& 4320b57cec5SDimitry Andricgetline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str, 4330b57cec5SDimitry Andric charT delim); 4340b57cec5SDimitry Andric 4350b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator> 4360b57cec5SDimitry Andricbasic_istream<charT, traits>& 4370b57cec5SDimitry Andricgetline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str); 4380b57cec5SDimitry Andric 4390b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator, class U> 4400b57cec5SDimitry Andricvoid erase(basic_string<charT, traits, Allocator>& c, const U& value); // C++20 4410b57cec5SDimitry Andrictemplate<class charT, class traits, class Allocator, class Predicate> 4420b57cec5SDimitry Andricvoid erase_if(basic_string<charT, traits, Allocator>& c, Predicate pred); // C++20 4430b57cec5SDimitry Andric 4440b57cec5SDimitry Andrictypedef basic_string<char> string; 4450b57cec5SDimitry Andrictypedef basic_string<wchar_t> wstring; 4460b57cec5SDimitry Andrictypedef basic_string<char16_t> u16string; 4470b57cec5SDimitry Andrictypedef basic_string<char32_t> u32string; 4480b57cec5SDimitry Andric 4490b57cec5SDimitry Andricint stoi (const string& str, size_t* idx = 0, int base = 10); 4500b57cec5SDimitry Andriclong stol (const string& str, size_t* idx = 0, int base = 10); 4510b57cec5SDimitry Andricunsigned long stoul (const string& str, size_t* idx = 0, int base = 10); 4520b57cec5SDimitry Andriclong long stoll (const string& str, size_t* idx = 0, int base = 10); 4530b57cec5SDimitry Andricunsigned long long stoull(const string& str, size_t* idx = 0, int base = 10); 4540b57cec5SDimitry Andric 4550b57cec5SDimitry Andricfloat stof (const string& str, size_t* idx = 0); 4560b57cec5SDimitry Andricdouble stod (const string& str, size_t* idx = 0); 4570b57cec5SDimitry Andriclong double stold(const string& str, size_t* idx = 0); 4580b57cec5SDimitry Andric 4590b57cec5SDimitry Andricstring to_string(int val); 4600b57cec5SDimitry Andricstring to_string(unsigned val); 4610b57cec5SDimitry Andricstring to_string(long val); 4620b57cec5SDimitry Andricstring to_string(unsigned long val); 4630b57cec5SDimitry Andricstring to_string(long long val); 4640b57cec5SDimitry Andricstring to_string(unsigned long long val); 4650b57cec5SDimitry Andricstring to_string(float val); 4660b57cec5SDimitry Andricstring to_string(double val); 4670b57cec5SDimitry Andricstring to_string(long double val); 4680b57cec5SDimitry Andric 4690b57cec5SDimitry Andricint stoi (const wstring& str, size_t* idx = 0, int base = 10); 4700b57cec5SDimitry Andriclong stol (const wstring& str, size_t* idx = 0, int base = 10); 4710b57cec5SDimitry Andricunsigned long stoul (const wstring& str, size_t* idx = 0, int base = 10); 4720b57cec5SDimitry Andriclong long stoll (const wstring& str, size_t* idx = 0, int base = 10); 4730b57cec5SDimitry Andricunsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10); 4740b57cec5SDimitry Andric 4750b57cec5SDimitry Andricfloat stof (const wstring& str, size_t* idx = 0); 4760b57cec5SDimitry Andricdouble stod (const wstring& str, size_t* idx = 0); 4770b57cec5SDimitry Andriclong double stold(const wstring& str, size_t* idx = 0); 4780b57cec5SDimitry Andric 4790b57cec5SDimitry Andricwstring to_wstring(int val); 4800b57cec5SDimitry Andricwstring to_wstring(unsigned val); 4810b57cec5SDimitry Andricwstring to_wstring(long val); 4820b57cec5SDimitry Andricwstring to_wstring(unsigned long val); 4830b57cec5SDimitry Andricwstring to_wstring(long long val); 4840b57cec5SDimitry Andricwstring to_wstring(unsigned long long val); 4850b57cec5SDimitry Andricwstring to_wstring(float val); 4860b57cec5SDimitry Andricwstring to_wstring(double val); 4870b57cec5SDimitry Andricwstring to_wstring(long double val); 4880b57cec5SDimitry Andric 4890b57cec5SDimitry Andrictemplate <> struct hash<string>; 4900b57cec5SDimitry Andrictemplate <> struct hash<u16string>; 4910b57cec5SDimitry Andrictemplate <> struct hash<u32string>; 4920b57cec5SDimitry Andrictemplate <> struct hash<wstring>; 4930b57cec5SDimitry Andric 4940b57cec5SDimitry Andricbasic_string<char> operator "" s( const char *str, size_t len ); // C++14 4950b57cec5SDimitry Andricbasic_string<wchar_t> operator "" s( const wchar_t *str, size_t len ); // C++14 4960b57cec5SDimitry Andricbasic_string<char16_t> operator "" s( const char16_t *str, size_t len ); // C++14 4970b57cec5SDimitry Andricbasic_string<char32_t> operator "" s( const char32_t *str, size_t len ); // C++14 4980b57cec5SDimitry Andric 4990b57cec5SDimitry Andric} // std 5000b57cec5SDimitry Andric 5010b57cec5SDimitry Andric*/ 5020b57cec5SDimitry Andric 5030b57cec5SDimitry Andric#include <__config> 5040b57cec5SDimitry Andric#include <string_view> 5050b57cec5SDimitry Andric#include <iosfwd> 5060b57cec5SDimitry Andric#include <cstring> 5070b57cec5SDimitry Andric#include <cstdio> // For EOF. 5080b57cec5SDimitry Andric#include <cwchar> 5090b57cec5SDimitry Andric#include <algorithm> 5100b57cec5SDimitry Andric#include <iterator> 5110b57cec5SDimitry Andric#include <utility> 5120b57cec5SDimitry Andric#include <memory> 5130b57cec5SDimitry Andric#include <stdexcept> 5140b57cec5SDimitry Andric#include <type_traits> 5150b57cec5SDimitry Andric#include <initializer_list> 5160b57cec5SDimitry Andric#include <__functional_base> 5170b57cec5SDimitry Andric#include <version> 5180b57cec5SDimitry Andric#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 5190b57cec5SDimitry Andric#include <cstdint> 5200b57cec5SDimitry Andric#endif 5210b57cec5SDimitry Andric 5220b57cec5SDimitry Andric#include <__debug> 5230b57cec5SDimitry Andric 5240b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 5250b57cec5SDimitry Andric#pragma GCC system_header 5260b57cec5SDimitry Andric#endif 5270b57cec5SDimitry Andric 5280b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 5290b57cec5SDimitry Andric#include <__undef_macros> 5300b57cec5SDimitry Andric 5310b57cec5SDimitry Andric 5320b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 5330b57cec5SDimitry Andric 5340b57cec5SDimitry Andric// fpos 5350b57cec5SDimitry Andric 5360b57cec5SDimitry Andrictemplate <class _StateT> 5370b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS fpos 5380b57cec5SDimitry Andric{ 5390b57cec5SDimitry Andricprivate: 5400b57cec5SDimitry Andric _StateT __st_; 5410b57cec5SDimitry Andric streamoff __off_; 5420b57cec5SDimitry Andricpublic: 5430b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {} 5440b57cec5SDimitry Andric 5450b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;} 5460b57cec5SDimitry Andric 5470b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;} 5480b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;} 5490b57cec5SDimitry Andric 5500b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;} 5510b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY fpos operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;} 5520b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY fpos& operator-=(streamoff __off) {__off_ -= __off; return *this;} 5530b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY fpos operator- (streamoff __off) const {fpos __t(*this); __t -= __off; return __t;} 5540b57cec5SDimitry Andric}; 5550b57cec5SDimitry Andric 5560b57cec5SDimitry Andrictemplate <class _StateT> 5570b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 5580b57cec5SDimitry Andricstreamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y) 5590b57cec5SDimitry Andric {return streamoff(__x) - streamoff(__y);} 5600b57cec5SDimitry Andric 5610b57cec5SDimitry Andrictemplate <class _StateT> 5620b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 5630b57cec5SDimitry Andricbool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y) 5640b57cec5SDimitry Andric {return streamoff(__x) == streamoff(__y);} 5650b57cec5SDimitry Andric 5660b57cec5SDimitry Andrictemplate <class _StateT> 5670b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 5680b57cec5SDimitry Andricbool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y) 5690b57cec5SDimitry Andric {return streamoff(__x) != streamoff(__y);} 5700b57cec5SDimitry Andric 5710b57cec5SDimitry Andric// basic_string 5720b57cec5SDimitry Andric 5730b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 5740b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 5750b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __x, 5760b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __y); 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 5790b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 5800b57cec5SDimitry Andricoperator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y); 5810b57cec5SDimitry Andric 5820b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 5830b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 5840b57cec5SDimitry Andricoperator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y); 5850b57cec5SDimitry Andric 5860b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 5870b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 5880b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 5890b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y); 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, _CharT __y); 5940b57cec5SDimitry Andric 5950b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&)) 5960b57cec5SDimitry Andric 5970b57cec5SDimitry Andrictemplate <bool> 5980b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS __basic_string_common 5990b57cec5SDimitry Andric{ 6000b57cec5SDimitry Andricprotected: 6010b57cec5SDimitry Andric _LIBCPP_NORETURN void __throw_length_error() const; 6020b57cec5SDimitry Andric _LIBCPP_NORETURN void __throw_out_of_range() const; 6030b57cec5SDimitry Andric}; 6040b57cec5SDimitry Andric 6050b57cec5SDimitry Andrictemplate <bool __b> 6060b57cec5SDimitry Andricvoid 6070b57cec5SDimitry Andric__basic_string_common<__b>::__throw_length_error() const 6080b57cec5SDimitry Andric{ 6090b57cec5SDimitry Andric _VSTD::__throw_length_error("basic_string"); 6100b57cec5SDimitry Andric} 6110b57cec5SDimitry Andric 6120b57cec5SDimitry Andrictemplate <bool __b> 6130b57cec5SDimitry Andricvoid 6140b57cec5SDimitry Andric__basic_string_common<__b>::__throw_out_of_range() const 6150b57cec5SDimitry Andric{ 6160b57cec5SDimitry Andric _VSTD::__throw_out_of_range("basic_string"); 6170b57cec5SDimitry Andric} 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __basic_string_common<true>) 6200b57cec5SDimitry Andric 6210b57cec5SDimitry Andric#ifdef _LIBCPP_NO_EXCEPTIONS 6220b57cec5SDimitry Andrictemplate <class _Iter> 6230b57cec5SDimitry Andricstruct __libcpp_string_gets_noexcept_iterator_impl : public true_type {}; 6240b57cec5SDimitry Andric#elif defined(_LIBCPP_HAS_NO_NOEXCEPT) 6250b57cec5SDimitry Andrictemplate <class _Iter> 6260b57cec5SDimitry Andricstruct __libcpp_string_gets_noexcept_iterator_impl : public false_type {}; 6270b57cec5SDimitry Andric#else 628*480093f4SDimitry Andrictemplate <class _Iter, bool = __is_cpp17_forward_iterator<_Iter>::value> 6290b57cec5SDimitry Andricstruct __libcpp_string_gets_noexcept_iterator_impl : public _LIBCPP_BOOL_CONSTANT(( 6300b57cec5SDimitry Andric noexcept(++(declval<_Iter&>())) && 6310b57cec5SDimitry Andric is_nothrow_assignable<_Iter&, _Iter>::value && 6320b57cec5SDimitry Andric noexcept(declval<_Iter>() == declval<_Iter>()) && 6330b57cec5SDimitry Andric noexcept(*declval<_Iter>()) 6340b57cec5SDimitry Andric)) {}; 6350b57cec5SDimitry Andric 6360b57cec5SDimitry Andrictemplate <class _Iter> 6370b57cec5SDimitry Andricstruct __libcpp_string_gets_noexcept_iterator_impl<_Iter, false> : public false_type {}; 6380b57cec5SDimitry Andric#endif 6390b57cec5SDimitry Andric 6400b57cec5SDimitry Andric 6410b57cec5SDimitry Andrictemplate <class _Iter> 6420b57cec5SDimitry Andricstruct __libcpp_string_gets_noexcept_iterator 6430b57cec5SDimitry Andric : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value || __libcpp_string_gets_noexcept_iterator_impl<_Iter>::value) {}; 6440b57cec5SDimitry Andric 6450b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Tp> 6460b57cec5SDimitry Andricstruct __can_be_converted_to_string_view : public _LIBCPP_BOOL_CONSTANT( 6470b57cec5SDimitry Andric ( is_convertible<const _Tp&, basic_string_view<_CharT, _Traits> >::value && 6480b57cec5SDimitry Andric !is_convertible<const _Tp&, const _CharT*>::value)) {}; 6490b57cec5SDimitry Andric 6500b57cec5SDimitry Andric#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT 6510b57cec5SDimitry Andric 6520b57cec5SDimitry Andrictemplate <class _CharT, size_t = sizeof(_CharT)> 6530b57cec5SDimitry Andricstruct __padding 6540b57cec5SDimitry Andric{ 6550b57cec5SDimitry Andric unsigned char __xx[sizeof(_CharT)-1]; 6560b57cec5SDimitry Andric}; 6570b57cec5SDimitry Andric 6580b57cec5SDimitry Andrictemplate <class _CharT> 6590b57cec5SDimitry Andricstruct __padding<_CharT, 1> 6600b57cec5SDimitry Andric{ 6610b57cec5SDimitry Andric}; 6620b57cec5SDimitry Andric 6630b57cec5SDimitry Andric#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT 6640b57cec5SDimitry Andric 6650b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 6660b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_string 6670b57cec5SDimitry Andric : private __basic_string_common<true> 6680b57cec5SDimitry Andric{ 6690b57cec5SDimitry Andricpublic: 6700b57cec5SDimitry Andric typedef basic_string __self; 6710b57cec5SDimitry Andric typedef basic_string_view<_CharT, _Traits> __self_view; 6720b57cec5SDimitry Andric typedef _Traits traits_type; 6730b57cec5SDimitry Andric typedef _CharT value_type; 6740b57cec5SDimitry Andric typedef _Allocator allocator_type; 6750b57cec5SDimitry Andric typedef allocator_traits<allocator_type> __alloc_traits; 6760b57cec5SDimitry Andric typedef typename __alloc_traits::size_type size_type; 6770b57cec5SDimitry Andric typedef typename __alloc_traits::difference_type difference_type; 6780b57cec5SDimitry Andric typedef value_type& reference; 6790b57cec5SDimitry Andric typedef const value_type& const_reference; 6800b57cec5SDimitry Andric typedef typename __alloc_traits::pointer pointer; 6810b57cec5SDimitry Andric typedef typename __alloc_traits::const_pointer const_pointer; 6820b57cec5SDimitry Andric 6830b57cec5SDimitry Andric static_assert((!is_array<value_type>::value), "Character type of basic_string must not be an array"); 6840b57cec5SDimitry Andric static_assert(( is_standard_layout<value_type>::value), "Character type of basic_string must be standard-layout"); 6850b57cec5SDimitry Andric static_assert(( is_trivial<value_type>::value), "Character type of basic_string must be trivial"); 6860b57cec5SDimitry Andric static_assert(( is_same<_CharT, typename traits_type::char_type>::value), 6870b57cec5SDimitry Andric "traits_type::char_type must be the same type as CharT"); 6880b57cec5SDimitry Andric static_assert(( is_same<typename allocator_type::value_type, value_type>::value), 6890b57cec5SDimitry Andric "Allocator::value_type must be same type as value_type"); 6900b57cec5SDimitry Andric 6910b57cec5SDimitry Andric#if defined(_LIBCPP_RAW_ITERATORS) 6920b57cec5SDimitry Andric typedef pointer iterator; 6930b57cec5SDimitry Andric typedef const_pointer const_iterator; 6940b57cec5SDimitry Andric#else // defined(_LIBCPP_RAW_ITERATORS) 6950b57cec5SDimitry Andric typedef __wrap_iter<pointer> iterator; 6960b57cec5SDimitry Andric typedef __wrap_iter<const_pointer> const_iterator; 6970b57cec5SDimitry Andric#endif // defined(_LIBCPP_RAW_ITERATORS) 6980b57cec5SDimitry Andric typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 6990b57cec5SDimitry Andric typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 7000b57cec5SDimitry Andric 7010b57cec5SDimitry Andricprivate: 7020b57cec5SDimitry Andric 7030b57cec5SDimitry Andric#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT 7040b57cec5SDimitry Andric 7050b57cec5SDimitry Andric struct __long 7060b57cec5SDimitry Andric { 7070b57cec5SDimitry Andric pointer __data_; 7080b57cec5SDimitry Andric size_type __size_; 7090b57cec5SDimitry Andric size_type __cap_; 7100b57cec5SDimitry Andric }; 7110b57cec5SDimitry Andric 7120b57cec5SDimitry Andric#ifdef _LIBCPP_BIG_ENDIAN 7130b57cec5SDimitry Andric static const size_type __short_mask = 0x01; 7140b57cec5SDimitry Andric static const size_type __long_mask = 0x1ul; 7150b57cec5SDimitry Andric#else // _LIBCPP_BIG_ENDIAN 7160b57cec5SDimitry Andric static const size_type __short_mask = 0x80; 7170b57cec5SDimitry Andric static const size_type __long_mask = ~(size_type(~0) >> 1); 7180b57cec5SDimitry Andric#endif // _LIBCPP_BIG_ENDIAN 7190b57cec5SDimitry Andric 7200b57cec5SDimitry Andric enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ? 7210b57cec5SDimitry Andric (sizeof(__long) - 1)/sizeof(value_type) : 2}; 7220b57cec5SDimitry Andric 7230b57cec5SDimitry Andric struct __short 7240b57cec5SDimitry Andric { 7250b57cec5SDimitry Andric value_type __data_[__min_cap]; 7260b57cec5SDimitry Andric struct 7270b57cec5SDimitry Andric : __padding<value_type> 7280b57cec5SDimitry Andric { 7290b57cec5SDimitry Andric unsigned char __size_; 7300b57cec5SDimitry Andric }; 7310b57cec5SDimitry Andric }; 7320b57cec5SDimitry Andric 7330b57cec5SDimitry Andric#else 7340b57cec5SDimitry Andric 7350b57cec5SDimitry Andric struct __long 7360b57cec5SDimitry Andric { 7370b57cec5SDimitry Andric size_type __cap_; 7380b57cec5SDimitry Andric size_type __size_; 7390b57cec5SDimitry Andric pointer __data_; 7400b57cec5SDimitry Andric }; 7410b57cec5SDimitry Andric 7420b57cec5SDimitry Andric#ifdef _LIBCPP_BIG_ENDIAN 7430b57cec5SDimitry Andric static const size_type __short_mask = 0x80; 7440b57cec5SDimitry Andric static const size_type __long_mask = ~(size_type(~0) >> 1); 7450b57cec5SDimitry Andric#else // _LIBCPP_BIG_ENDIAN 7460b57cec5SDimitry Andric static const size_type __short_mask = 0x01; 7470b57cec5SDimitry Andric static const size_type __long_mask = 0x1ul; 7480b57cec5SDimitry Andric#endif // _LIBCPP_BIG_ENDIAN 7490b57cec5SDimitry Andric 7500b57cec5SDimitry Andric enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ? 7510b57cec5SDimitry Andric (sizeof(__long) - 1)/sizeof(value_type) : 2}; 7520b57cec5SDimitry Andric 7530b57cec5SDimitry Andric struct __short 7540b57cec5SDimitry Andric { 7550b57cec5SDimitry Andric union 7560b57cec5SDimitry Andric { 7570b57cec5SDimitry Andric unsigned char __size_; 7580b57cec5SDimitry Andric value_type __lx; 7590b57cec5SDimitry Andric }; 7600b57cec5SDimitry Andric value_type __data_[__min_cap]; 7610b57cec5SDimitry Andric }; 7620b57cec5SDimitry Andric 7630b57cec5SDimitry Andric#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT 7640b57cec5SDimitry Andric 7650b57cec5SDimitry Andric union __ulx{__long __lx; __short __lxx;}; 7660b57cec5SDimitry Andric 7670b57cec5SDimitry Andric enum {__n_words = sizeof(__ulx) / sizeof(size_type)}; 7680b57cec5SDimitry Andric 7690b57cec5SDimitry Andric struct __raw 7700b57cec5SDimitry Andric { 7710b57cec5SDimitry Andric size_type __words[__n_words]; 7720b57cec5SDimitry Andric }; 7730b57cec5SDimitry Andric 7740b57cec5SDimitry Andric struct __rep 7750b57cec5SDimitry Andric { 7760b57cec5SDimitry Andric union 7770b57cec5SDimitry Andric { 7780b57cec5SDimitry Andric __long __l; 7790b57cec5SDimitry Andric __short __s; 7800b57cec5SDimitry Andric __raw __r; 7810b57cec5SDimitry Andric }; 7820b57cec5SDimitry Andric }; 7830b57cec5SDimitry Andric 7840b57cec5SDimitry Andric __compressed_pair<__rep, allocator_type> __r_; 7850b57cec5SDimitry Andric 7860b57cec5SDimitry Andricpublic: 7870b57cec5SDimitry Andric static const size_type npos = -1; 7880b57cec5SDimitry Andric 7890b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY basic_string() 7900b57cec5SDimitry Andric _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); 7910b57cec5SDimitry Andric 7920b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a) 7930b57cec5SDimitry Andric#if _LIBCPP_STD_VER <= 14 7940b57cec5SDimitry Andric _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value); 7950b57cec5SDimitry Andric#else 7960b57cec5SDimitry Andric _NOEXCEPT; 7970b57cec5SDimitry Andric#endif 7980b57cec5SDimitry Andric 7990b57cec5SDimitry Andric basic_string(const basic_string& __str); 8000b57cec5SDimitry Andric basic_string(const basic_string& __str, const allocator_type& __a); 8010b57cec5SDimitry Andric 8020b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 8030b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8040b57cec5SDimitry Andric basic_string(basic_string&& __str) 8050b57cec5SDimitry Andric#if _LIBCPP_STD_VER <= 14 8060b57cec5SDimitry Andric _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 8070b57cec5SDimitry Andric#else 8080b57cec5SDimitry Andric _NOEXCEPT; 8090b57cec5SDimitry Andric#endif 8100b57cec5SDimitry Andric 8110b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8120b57cec5SDimitry Andric basic_string(basic_string&& __str, const allocator_type& __a); 8130b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 8140b57cec5SDimitry Andric 8150b57cec5SDimitry Andric template <class = typename enable_if<__is_allocator<_Allocator>::value, nullptr_t>::type> 8160b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 817*480093f4SDimitry Andric basic_string(const _CharT* __s) : __r_(__default_init_tag(), __default_init_tag()) { 8180b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr"); 8190b57cec5SDimitry Andric __init(__s, traits_type::length(__s)); 8200b57cec5SDimitry Andric# if _LIBCPP_DEBUG_LEVEL >= 2 8210b57cec5SDimitry Andric __get_db()->__insert_c(this); 8220b57cec5SDimitry Andric# endif 8230b57cec5SDimitry Andric } 8240b57cec5SDimitry Andric 8250b57cec5SDimitry Andric template <class = typename enable_if<__is_allocator<_Allocator>::value, nullptr_t>::type> 8260b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8270b57cec5SDimitry Andric basic_string(const _CharT* __s, const _Allocator& __a); 8280b57cec5SDimitry Andric 8290b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8300b57cec5SDimitry Andric basic_string(const _CharT* __s, size_type __n); 8310b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8320b57cec5SDimitry Andric basic_string(const _CharT* __s, size_type __n, const _Allocator& __a); 8330b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8340b57cec5SDimitry Andric basic_string(size_type __n, _CharT __c); 8350b57cec5SDimitry Andric 8360b57cec5SDimitry Andric template <class = typename enable_if<__is_allocator<_Allocator>::value, nullptr_t>::type> 8370b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8380b57cec5SDimitry Andric basic_string(size_type __n, _CharT __c, const _Allocator& __a); 8390b57cec5SDimitry Andric 8400b57cec5SDimitry Andric basic_string(const basic_string& __str, size_type __pos, size_type __n, 8410b57cec5SDimitry Andric const _Allocator& __a = _Allocator()); 8420b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8430b57cec5SDimitry Andric basic_string(const basic_string& __str, size_type __pos, 8440b57cec5SDimitry Andric const _Allocator& __a = _Allocator()); 8450b57cec5SDimitry Andric 8460b57cec5SDimitry Andric template<class _Tp, class = typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type> 8470b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 8480b57cec5SDimitry Andric basic_string(const _Tp& __t, size_type __pos, size_type __n, 8490b57cec5SDimitry Andric const allocator_type& __a = allocator_type()); 8500b57cec5SDimitry Andric 8510b57cec5SDimitry Andric template<class _Tp, class = typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type> 8520b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 8530b57cec5SDimitry Andric explicit basic_string(const _Tp& __t); 8540b57cec5SDimitry Andric 8550b57cec5SDimitry Andric template<class _Tp, class = typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type> 8560b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 8570b57cec5SDimitry Andric explicit basic_string(const _Tp& __t, const allocator_type& __a); 8580b57cec5SDimitry Andric 859*480093f4SDimitry Andric template<class _InputIterator, class = typename enable_if<__is_cpp17_input_iterator<_InputIterator>::value>::type> 8600b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8610b57cec5SDimitry Andric basic_string(_InputIterator __first, _InputIterator __last); 862*480093f4SDimitry Andric template<class _InputIterator, class = typename enable_if<__is_cpp17_input_iterator<_InputIterator>::value>::type> 8630b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8640b57cec5SDimitry Andric basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a); 8650b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 8660b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8670b57cec5SDimitry Andric basic_string(initializer_list<_CharT> __il); 8680b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8690b57cec5SDimitry Andric basic_string(initializer_list<_CharT> __il, const _Allocator& __a); 8700b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 8710b57cec5SDimitry Andric 8720b57cec5SDimitry Andric inline ~basic_string(); 8730b57cec5SDimitry Andric 8740b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8750b57cec5SDimitry Andric operator __self_view() const _NOEXCEPT { return __self_view(data(), size()); } 8760b57cec5SDimitry Andric 8770b57cec5SDimitry Andric basic_string& operator=(const basic_string& __str); 8780b57cec5SDimitry Andric 8790b57cec5SDimitry Andric template <class _Tp, class = typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type> 8800b57cec5SDimitry Andric basic_string& operator=(const _Tp& __t) 8810b57cec5SDimitry Andric {__self_view __sv = __t; return assign(__sv);} 8820b57cec5SDimitry Andric 8830b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 8840b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8850b57cec5SDimitry Andric basic_string& operator=(basic_string&& __str) 8860b57cec5SDimitry Andric _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)); 8870b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8880b57cec5SDimitry Andric basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());} 8890b57cec5SDimitry Andric#endif 8900b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);} 8910b57cec5SDimitry Andric basic_string& operator=(value_type __c); 8920b57cec5SDimitry Andric 8930b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 8940b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8950b57cec5SDimitry Andric iterator begin() _NOEXCEPT 8960b57cec5SDimitry Andric {return iterator(this, __get_pointer());} 8970b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 8980b57cec5SDimitry Andric const_iterator begin() const _NOEXCEPT 8990b57cec5SDimitry Andric {return const_iterator(this, __get_pointer());} 9000b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9010b57cec5SDimitry Andric iterator end() _NOEXCEPT 9020b57cec5SDimitry Andric {return iterator(this, __get_pointer() + size());} 9030b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9040b57cec5SDimitry Andric const_iterator end() const _NOEXCEPT 9050b57cec5SDimitry Andric {return const_iterator(this, __get_pointer() + size());} 9060b57cec5SDimitry Andric#else 9070b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9080b57cec5SDimitry Andric iterator begin() _NOEXCEPT 9090b57cec5SDimitry Andric {return iterator(__get_pointer());} 9100b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9110b57cec5SDimitry Andric const_iterator begin() const _NOEXCEPT 9120b57cec5SDimitry Andric {return const_iterator(__get_pointer());} 9130b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9140b57cec5SDimitry Andric iterator end() _NOEXCEPT 9150b57cec5SDimitry Andric {return iterator(__get_pointer() + size());} 9160b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9170b57cec5SDimitry Andric const_iterator end() const _NOEXCEPT 9180b57cec5SDimitry Andric {return const_iterator(__get_pointer() + size());} 9190b57cec5SDimitry Andric#endif // _LIBCPP_DEBUG_LEVEL >= 2 9200b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9210b57cec5SDimitry Andric reverse_iterator rbegin() _NOEXCEPT 9220b57cec5SDimitry Andric {return reverse_iterator(end());} 9230b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9240b57cec5SDimitry Andric const_reverse_iterator rbegin() const _NOEXCEPT 9250b57cec5SDimitry Andric {return const_reverse_iterator(end());} 9260b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9270b57cec5SDimitry Andric reverse_iterator rend() _NOEXCEPT 9280b57cec5SDimitry Andric {return reverse_iterator(begin());} 9290b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9300b57cec5SDimitry Andric const_reverse_iterator rend() const _NOEXCEPT 9310b57cec5SDimitry Andric {return const_reverse_iterator(begin());} 9320b57cec5SDimitry Andric 9330b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9340b57cec5SDimitry Andric const_iterator cbegin() const _NOEXCEPT 9350b57cec5SDimitry Andric {return begin();} 9360b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9370b57cec5SDimitry Andric const_iterator cend() const _NOEXCEPT 9380b57cec5SDimitry Andric {return end();} 9390b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9400b57cec5SDimitry Andric const_reverse_iterator crbegin() const _NOEXCEPT 9410b57cec5SDimitry Andric {return rbegin();} 9420b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9430b57cec5SDimitry Andric const_reverse_iterator crend() const _NOEXCEPT 9440b57cec5SDimitry Andric {return rend();} 9450b57cec5SDimitry Andric 9460b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT 9470b57cec5SDimitry Andric {return __is_long() ? __get_long_size() : __get_short_size();} 9480b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();} 9490b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT; 9500b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT 9510b57cec5SDimitry Andric {return (__is_long() ? __get_long_cap() 9520b57cec5SDimitry Andric : static_cast<size_type>(__min_cap)) - 1;} 9530b57cec5SDimitry Andric 9540b57cec5SDimitry Andric void resize(size_type __n, value_type __c); 9550b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());} 9560b57cec5SDimitry Andric 9570b57cec5SDimitry Andric void reserve(size_type __res_arg); 9580b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY void __resize_default_init(size_type __n); 9590b57cec5SDimitry Andric 9600b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9610b57cec5SDimitry Andric void reserve() _NOEXCEPT {reserve(0);} 9620b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9630b57cec5SDimitry Andric void shrink_to_fit() _NOEXCEPT {reserve();} 9640b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9650b57cec5SDimitry Andric void clear() _NOEXCEPT; 9660b57cec5SDimitry Andric _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 9670b57cec5SDimitry Andric bool empty() const _NOEXCEPT {return size() == 0;} 9680b57cec5SDimitry Andric 9690b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const _NOEXCEPT; 9700b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos) _NOEXCEPT; 9710b57cec5SDimitry Andric 9720b57cec5SDimitry Andric const_reference at(size_type __n) const; 9730b57cec5SDimitry Andric reference at(size_type __n); 9740b57cec5SDimitry Andric 9750b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);} 9760b57cec5SDimitry Andric 9770b57cec5SDimitry Andric template <class _Tp> 9780b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 9790b57cec5SDimitry Andric typename enable_if 9800b57cec5SDimitry Andric < 9810b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 9820b57cec5SDimitry Andric basic_string& 9830b57cec5SDimitry Andric >::type 9840b57cec5SDimitry Andric operator+=(const _Tp& __t) {__self_view __sv = __t; return append(__sv);} 9850b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s) {return append(__s);} 9860b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;} 9870b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 9880b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);} 9890b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 9900b57cec5SDimitry Andric 9910b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 9920b57cec5SDimitry Andric basic_string& append(const basic_string& __str); 9930b57cec5SDimitry Andric 9940b57cec5SDimitry Andric template <class _Tp> 9950b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 9960b57cec5SDimitry Andric typename enable_if 9970b57cec5SDimitry Andric < 9980b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 9990b57cec5SDimitry Andric basic_string& 10000b57cec5SDimitry Andric >::type 10010b57cec5SDimitry Andric append(const _Tp& __t) { __self_view __sv = __t; return append(__sv.data(), __sv.size()); } 10020b57cec5SDimitry Andric basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos); 10030b57cec5SDimitry Andric 10040b57cec5SDimitry Andric template <class _Tp> 10050b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 10060b57cec5SDimitry Andric typename enable_if 10070b57cec5SDimitry Andric < 10080b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 10090b57cec5SDimitry Andric basic_string& 10100b57cec5SDimitry Andric >::type 10110b57cec5SDimitry Andric append(const _Tp& __t, size_type __pos, size_type __n=npos); 10120b57cec5SDimitry Andric basic_string& append(const value_type* __s, size_type __n); 10130b57cec5SDimitry Andric basic_string& append(const value_type* __s); 10140b57cec5SDimitry Andric basic_string& append(size_type __n, value_type __c); 10150b57cec5SDimitry Andric 10160b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 10170b57cec5SDimitry Andric void __append_default_init(size_type __n); 10180b57cec5SDimitry Andric 10190b57cec5SDimitry Andric template <class _ForwardIterator> 10200b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 10210b57cec5SDimitry Andric basic_string& __append_forward_unsafe(_ForwardIterator, _ForwardIterator); 10220b57cec5SDimitry Andric template<class _InputIterator> 10230b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 10240b57cec5SDimitry Andric typename enable_if 10250b57cec5SDimitry Andric < 1026*480093f4SDimitry Andric __is_exactly_cpp17_input_iterator<_InputIterator>::value 10270b57cec5SDimitry Andric || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, 10280b57cec5SDimitry Andric basic_string& 10290b57cec5SDimitry Andric >::type 10300b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 10310b57cec5SDimitry Andric append(_InputIterator __first, _InputIterator __last) { 10320b57cec5SDimitry Andric const basic_string __temp (__first, __last, __alloc()); 10330b57cec5SDimitry Andric append(__temp.data(), __temp.size()); 10340b57cec5SDimitry Andric return *this; 10350b57cec5SDimitry Andric } 10360b57cec5SDimitry Andric template<class _ForwardIterator> 10370b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 10380b57cec5SDimitry Andric typename enable_if 10390b57cec5SDimitry Andric < 1040*480093f4SDimitry Andric __is_cpp17_forward_iterator<_ForwardIterator>::value 10410b57cec5SDimitry Andric && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, 10420b57cec5SDimitry Andric basic_string& 10430b57cec5SDimitry Andric >::type 10440b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 10450b57cec5SDimitry Andric append(_ForwardIterator __first, _ForwardIterator __last) { 10460b57cec5SDimitry Andric return __append_forward_unsafe(__first, __last); 10470b57cec5SDimitry Andric } 10480b57cec5SDimitry Andric 10490b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 10500b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 10510b57cec5SDimitry Andric basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());} 10520b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 10530b57cec5SDimitry Andric 10540b57cec5SDimitry Andric void push_back(value_type __c); 10550b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 10560b57cec5SDimitry Andric void pop_back(); 10570b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY reference front() _NOEXCEPT; 10580b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY const_reference front() const _NOEXCEPT; 10590b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY reference back() _NOEXCEPT; 10600b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY const_reference back() const _NOEXCEPT; 10610b57cec5SDimitry Andric 10620b57cec5SDimitry Andric template <class _Tp> 10630b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 10640b57cec5SDimitry Andric typename enable_if 10650b57cec5SDimitry Andric < 10660b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 10670b57cec5SDimitry Andric basic_string& 10680b57cec5SDimitry Andric >::type 10690b57cec5SDimitry Andric assign(const _Tp & __t) { __self_view __sv = __t; return assign(__sv.data(), __sv.size()); } 10700b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 10710b57cec5SDimitry Andric basic_string& assign(const basic_string& __str) { return *this = __str; } 10720b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 10730b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 10740b57cec5SDimitry Andric basic_string& assign(basic_string&& __str) 10750b57cec5SDimitry Andric _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)) 10760b57cec5SDimitry Andric {*this = _VSTD::move(__str); return *this;} 10770b57cec5SDimitry Andric#endif 10780b57cec5SDimitry Andric basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos); 10790b57cec5SDimitry Andric template <class _Tp> 10800b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 10810b57cec5SDimitry Andric typename enable_if 10820b57cec5SDimitry Andric < 10830b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 10840b57cec5SDimitry Andric basic_string& 10850b57cec5SDimitry Andric >::type 10860b57cec5SDimitry Andric assign(const _Tp & __t, size_type __pos, size_type __n=npos); 10870b57cec5SDimitry Andric basic_string& assign(const value_type* __s, size_type __n); 10880b57cec5SDimitry Andric basic_string& assign(const value_type* __s); 10890b57cec5SDimitry Andric basic_string& assign(size_type __n, value_type __c); 10900b57cec5SDimitry Andric template<class _InputIterator> 10910b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 10920b57cec5SDimitry Andric typename enable_if 10930b57cec5SDimitry Andric < 1094*480093f4SDimitry Andric __is_exactly_cpp17_input_iterator<_InputIterator>::value 10950b57cec5SDimitry Andric || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, 10960b57cec5SDimitry Andric basic_string& 10970b57cec5SDimitry Andric >::type 10980b57cec5SDimitry Andric assign(_InputIterator __first, _InputIterator __last); 10990b57cec5SDimitry Andric template<class _ForwardIterator> 11000b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 11010b57cec5SDimitry Andric typename enable_if 11020b57cec5SDimitry Andric < 1103*480093f4SDimitry Andric __is_cpp17_forward_iterator<_ForwardIterator>::value 11040b57cec5SDimitry Andric && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, 11050b57cec5SDimitry Andric basic_string& 11060b57cec5SDimitry Andric >::type 11070b57cec5SDimitry Andric assign(_ForwardIterator __first, _ForwardIterator __last); 11080b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 11090b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 11100b57cec5SDimitry Andric basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());} 11110b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 11120b57cec5SDimitry Andric 11130b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 11140b57cec5SDimitry Andric basic_string& insert(size_type __pos1, const basic_string& __str); 11150b57cec5SDimitry Andric 11160b57cec5SDimitry Andric template <class _Tp> 11170b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 11180b57cec5SDimitry Andric typename enable_if 11190b57cec5SDimitry Andric < 11200b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 11210b57cec5SDimitry Andric basic_string& 11220b57cec5SDimitry Andric >::type 11230b57cec5SDimitry Andric insert(size_type __pos1, const _Tp& __t) 11240b57cec5SDimitry Andric { __self_view __sv = __t; return insert(__pos1, __sv.data(), __sv.size()); } 11250b57cec5SDimitry Andric 11260b57cec5SDimitry Andric template <class _Tp> 11270b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 11280b57cec5SDimitry Andric typename enable_if 11290b57cec5SDimitry Andric < 11300b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 11310b57cec5SDimitry Andric basic_string& 11320b57cec5SDimitry Andric >::type 11330b57cec5SDimitry Andric insert(size_type __pos1, const _Tp& __t, size_type __pos2, size_type __n=npos); 11340b57cec5SDimitry Andric basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos); 11350b57cec5SDimitry Andric basic_string& insert(size_type __pos, const value_type* __s, size_type __n); 11360b57cec5SDimitry Andric basic_string& insert(size_type __pos, const value_type* __s); 11370b57cec5SDimitry Andric basic_string& insert(size_type __pos, size_type __n, value_type __c); 11380b57cec5SDimitry Andric iterator insert(const_iterator __pos, value_type __c); 11390b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 11400b57cec5SDimitry Andric iterator insert(const_iterator __pos, size_type __n, value_type __c); 11410b57cec5SDimitry Andric template<class _InputIterator> 11420b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 11430b57cec5SDimitry Andric typename enable_if 11440b57cec5SDimitry Andric < 1145*480093f4SDimitry Andric __is_exactly_cpp17_input_iterator<_InputIterator>::value 11460b57cec5SDimitry Andric || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, 11470b57cec5SDimitry Andric iterator 11480b57cec5SDimitry Andric >::type 11490b57cec5SDimitry Andric insert(const_iterator __pos, _InputIterator __first, _InputIterator __last); 11500b57cec5SDimitry Andric template<class _ForwardIterator> 11510b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 11520b57cec5SDimitry Andric typename enable_if 11530b57cec5SDimitry Andric < 1154*480093f4SDimitry Andric __is_cpp17_forward_iterator<_ForwardIterator>::value 11550b57cec5SDimitry Andric && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, 11560b57cec5SDimitry Andric iterator 11570b57cec5SDimitry Andric >::type 11580b57cec5SDimitry Andric insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last); 11590b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 11600b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 11610b57cec5SDimitry Andric iterator insert(const_iterator __pos, initializer_list<value_type> __il) 11620b57cec5SDimitry Andric {return insert(__pos, __il.begin(), __il.end());} 11630b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 11640b57cec5SDimitry Andric 11650b57cec5SDimitry Andric basic_string& erase(size_type __pos = 0, size_type __n = npos); 11660b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 11670b57cec5SDimitry Andric iterator erase(const_iterator __pos); 11680b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 11690b57cec5SDimitry Andric iterator erase(const_iterator __first, const_iterator __last); 11700b57cec5SDimitry Andric 11710b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 11720b57cec5SDimitry Andric basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str); 11730b57cec5SDimitry Andric 11740b57cec5SDimitry Andric template <class _Tp> 11750b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 11760b57cec5SDimitry Andric typename enable_if 11770b57cec5SDimitry Andric < 11780b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 11790b57cec5SDimitry Andric basic_string& 11800b57cec5SDimitry Andric >::type 11810b57cec5SDimitry Andric replace(size_type __pos1, size_type __n1, const _Tp& __t) { __self_view __sv = __t; return replace(__pos1, __n1, __sv.data(), __sv.size()); } 11820b57cec5SDimitry Andric basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos); 11830b57cec5SDimitry Andric template <class _Tp> 11840b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 11850b57cec5SDimitry Andric typename enable_if 11860b57cec5SDimitry Andric < 11870b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 11880b57cec5SDimitry Andric basic_string& 11890b57cec5SDimitry Andric >::type 11900b57cec5SDimitry Andric replace(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos); 11910b57cec5SDimitry Andric basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2); 11920b57cec5SDimitry Andric basic_string& replace(size_type __pos, size_type __n1, const value_type* __s); 11930b57cec5SDimitry Andric basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c); 11940b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 11950b57cec5SDimitry Andric basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str); 11960b57cec5SDimitry Andric 11970b57cec5SDimitry Andric template <class _Tp> 11980b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 11990b57cec5SDimitry Andric typename enable_if 12000b57cec5SDimitry Andric < 12010b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 12020b57cec5SDimitry Andric basic_string& 12030b57cec5SDimitry Andric >::type 12040b57cec5SDimitry Andric replace(const_iterator __i1, const_iterator __i2, const _Tp& __t) { __self_view __sv = __t; return replace(__i1 - begin(), __i2 - __i1, __sv); } 12050b57cec5SDimitry Andric 12060b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12070b57cec5SDimitry Andric basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n); 12080b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12090b57cec5SDimitry Andric basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s); 12100b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12110b57cec5SDimitry Andric basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c); 12120b57cec5SDimitry Andric template<class _InputIterator> 12130b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 12140b57cec5SDimitry Andric typename enable_if 12150b57cec5SDimitry Andric < 1216*480093f4SDimitry Andric __is_cpp17_input_iterator<_InputIterator>::value, 12170b57cec5SDimitry Andric basic_string& 12180b57cec5SDimitry Andric >::type 12190b57cec5SDimitry Andric replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2); 12200b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 12210b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12220b57cec5SDimitry Andric basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il) 12230b57cec5SDimitry Andric {return replace(__i1, __i2, __il.begin(), __il.end());} 12240b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 12250b57cec5SDimitry Andric 12260b57cec5SDimitry Andric size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const; 12270b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12280b57cec5SDimitry Andric basic_string substr(size_type __pos = 0, size_type __n = npos) const; 12290b57cec5SDimitry Andric 12300b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12310b57cec5SDimitry Andric void swap(basic_string& __str) 12320b57cec5SDimitry Andric#if _LIBCPP_STD_VER >= 14 12330b57cec5SDimitry Andric _NOEXCEPT; 12340b57cec5SDimitry Andric#else 12350b57cec5SDimitry Andric _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 12360b57cec5SDimitry Andric __is_nothrow_swappable<allocator_type>::value); 12370b57cec5SDimitry Andric#endif 12380b57cec5SDimitry Andric 12390b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12400b57cec5SDimitry Andric const value_type* c_str() const _NOEXCEPT {return data();} 12410b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1242*480093f4SDimitry Andric const value_type* data() const _NOEXCEPT {return _VSTD::__to_address(__get_pointer());} 12430b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 14 || defined(_LIBCPP_BUILDING_LIBRARY) 12440b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 1245*480093f4SDimitry Andric value_type* data() _NOEXCEPT {return _VSTD::__to_address(__get_pointer());} 12460b57cec5SDimitry Andric#endif 12470b57cec5SDimitry Andric 12480b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12490b57cec5SDimitry Andric allocator_type get_allocator() const _NOEXCEPT {return __alloc();} 12500b57cec5SDimitry Andric 12510b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12520b57cec5SDimitry Andric size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT; 12530b57cec5SDimitry Andric 12540b57cec5SDimitry Andric template <class _Tp> 12550b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 12560b57cec5SDimitry Andric typename enable_if 12570b57cec5SDimitry Andric < 12580b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 12590b57cec5SDimitry Andric size_type 12600b57cec5SDimitry Andric >::type 12610b57cec5SDimitry Andric find(const _Tp& __t, size_type __pos = 0) const; 12620b57cec5SDimitry Andric size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 12630b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12640b57cec5SDimitry Andric size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT; 12650b57cec5SDimitry Andric size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT; 12660b57cec5SDimitry Andric 12670b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12680b57cec5SDimitry Andric size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT; 12690b57cec5SDimitry Andric 12700b57cec5SDimitry Andric template <class _Tp> 12710b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 12720b57cec5SDimitry Andric typename enable_if 12730b57cec5SDimitry Andric < 12740b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 12750b57cec5SDimitry Andric size_type 12760b57cec5SDimitry Andric >::type 12770b57cec5SDimitry Andric rfind(const _Tp& __t, size_type __pos = npos) const; 12780b57cec5SDimitry Andric size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 12790b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12800b57cec5SDimitry Andric size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT; 12810b57cec5SDimitry Andric size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT; 12820b57cec5SDimitry Andric 12830b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12840b57cec5SDimitry Andric size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT; 12850b57cec5SDimitry Andric 12860b57cec5SDimitry Andric template <class _Tp> 12870b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 12880b57cec5SDimitry Andric typename enable_if 12890b57cec5SDimitry Andric < 12900b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 12910b57cec5SDimitry Andric size_type 12920b57cec5SDimitry Andric >::type 12930b57cec5SDimitry Andric find_first_of(const _Tp& __t, size_type __pos = 0) const; 12940b57cec5SDimitry Andric size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 12950b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12960b57cec5SDimitry Andric size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT; 12970b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 12980b57cec5SDimitry Andric size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT; 12990b57cec5SDimitry Andric 13000b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13010b57cec5SDimitry Andric size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT; 13020b57cec5SDimitry Andric 13030b57cec5SDimitry Andric template <class _Tp> 13040b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 13050b57cec5SDimitry Andric typename enable_if 13060b57cec5SDimitry Andric < 13070b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 13080b57cec5SDimitry Andric size_type 13090b57cec5SDimitry Andric >::type 13100b57cec5SDimitry Andric find_last_of(const _Tp& __t, size_type __pos = npos) const; 13110b57cec5SDimitry Andric size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 13120b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13130b57cec5SDimitry Andric size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT; 13140b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13150b57cec5SDimitry Andric size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT; 13160b57cec5SDimitry Andric 13170b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13180b57cec5SDimitry Andric size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT; 13190b57cec5SDimitry Andric 13200b57cec5SDimitry Andric template <class _Tp> 13210b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 13220b57cec5SDimitry Andric typename enable_if 13230b57cec5SDimitry Andric < 13240b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 13250b57cec5SDimitry Andric size_type 13260b57cec5SDimitry Andric >::type 13270b57cec5SDimitry Andric find_first_not_of(const _Tp &__t, size_type __pos = 0) const; 13280b57cec5SDimitry Andric size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 13290b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13300b57cec5SDimitry Andric size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT; 13310b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13320b57cec5SDimitry Andric size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT; 13330b57cec5SDimitry Andric 13340b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13350b57cec5SDimitry Andric size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT; 13360b57cec5SDimitry Andric 13370b57cec5SDimitry Andric template <class _Tp> 13380b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 13390b57cec5SDimitry Andric typename enable_if 13400b57cec5SDimitry Andric < 13410b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 13420b57cec5SDimitry Andric size_type 13430b57cec5SDimitry Andric >::type 13440b57cec5SDimitry Andric find_last_not_of(const _Tp& __t, size_type __pos = npos) const; 13450b57cec5SDimitry Andric size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT; 13460b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13470b57cec5SDimitry Andric size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT; 13480b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13490b57cec5SDimitry Andric size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT; 13500b57cec5SDimitry Andric 13510b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13520b57cec5SDimitry Andric int compare(const basic_string& __str) const _NOEXCEPT; 13530b57cec5SDimitry Andric 13540b57cec5SDimitry Andric template <class _Tp> 13550b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 13560b57cec5SDimitry Andric typename enable_if 13570b57cec5SDimitry Andric < 13580b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 13590b57cec5SDimitry Andric int 13600b57cec5SDimitry Andric >::type 13610b57cec5SDimitry Andric compare(const _Tp &__t) const; 13620b57cec5SDimitry Andric 13630b57cec5SDimitry Andric template <class _Tp> 13640b57cec5SDimitry Andric _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 13650b57cec5SDimitry Andric typename enable_if 13660b57cec5SDimitry Andric < 13670b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 13680b57cec5SDimitry Andric int 13690b57cec5SDimitry Andric >::type 13700b57cec5SDimitry Andric compare(size_type __pos1, size_type __n1, const _Tp& __t) const; 13710b57cec5SDimitry Andric 13720b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 13730b57cec5SDimitry Andric int compare(size_type __pos1, size_type __n1, const basic_string& __str) const; 13740b57cec5SDimitry Andric int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos) const; 13750b57cec5SDimitry Andric 13760b57cec5SDimitry Andric template <class _Tp> 13770b57cec5SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 13780b57cec5SDimitry Andric typename enable_if 13790b57cec5SDimitry Andric < 13800b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 13810b57cec5SDimitry Andric int 13820b57cec5SDimitry Andric >::type 13830b57cec5SDimitry Andric compare(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos) const; 13840b57cec5SDimitry Andric int compare(const value_type* __s) const _NOEXCEPT; 13850b57cec5SDimitry Andric int compare(size_type __pos1, size_type __n1, const value_type* __s) const; 13860b57cec5SDimitry Andric int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const; 13870b57cec5SDimitry Andric 13880b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 17 13890b57cec5SDimitry Andric _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 13900b57cec5SDimitry Andric bool starts_with(__self_view __sv) const _NOEXCEPT 13910b57cec5SDimitry Andric { return __self_view(data(), size()).starts_with(__sv); } 13920b57cec5SDimitry Andric 13930b57cec5SDimitry Andric _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 13940b57cec5SDimitry Andric bool starts_with(value_type __c) const _NOEXCEPT 13950b57cec5SDimitry Andric { return !empty() && _Traits::eq(front(), __c); } 13960b57cec5SDimitry Andric 13970b57cec5SDimitry Andric _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 13980b57cec5SDimitry Andric bool starts_with(const value_type* __s) const _NOEXCEPT 13990b57cec5SDimitry Andric { return starts_with(__self_view(__s)); } 14000b57cec5SDimitry Andric 14010b57cec5SDimitry Andric _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 14020b57cec5SDimitry Andric bool ends_with(__self_view __sv) const _NOEXCEPT 14030b57cec5SDimitry Andric { return __self_view(data(), size()).ends_with( __sv); } 14040b57cec5SDimitry Andric 14050b57cec5SDimitry Andric _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 14060b57cec5SDimitry Andric bool ends_with(value_type __c) const _NOEXCEPT 14070b57cec5SDimitry Andric { return !empty() && _Traits::eq(back(), __c); } 14080b57cec5SDimitry Andric 14090b57cec5SDimitry Andric _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 14100b57cec5SDimitry Andric bool ends_with(const value_type* __s) const _NOEXCEPT 14110b57cec5SDimitry Andric { return ends_with(__self_view(__s)); } 14120b57cec5SDimitry Andric#endif 14130b57cec5SDimitry Andric 14140b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY bool __invariants() const; 14150b57cec5SDimitry Andric 14160b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY void __clear_and_shrink() _NOEXCEPT; 14170b57cec5SDimitry Andric 14180b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14190b57cec5SDimitry Andric bool __is_long() const _NOEXCEPT 14200b57cec5SDimitry Andric {return bool(__r_.first().__s.__size_ & __short_mask);} 14210b57cec5SDimitry Andric 14220b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 14230b57cec5SDimitry Andric 14240b57cec5SDimitry Andric bool __dereferenceable(const const_iterator* __i) const; 14250b57cec5SDimitry Andric bool __decrementable(const const_iterator* __i) const; 14260b57cec5SDimitry Andric bool __addable(const const_iterator* __i, ptrdiff_t __n) const; 14270b57cec5SDimitry Andric bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const; 14280b57cec5SDimitry Andric 14290b57cec5SDimitry Andric#endif // _LIBCPP_DEBUG_LEVEL >= 2 14300b57cec5SDimitry Andric 14310b57cec5SDimitry Andricprivate: 14320b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14330b57cec5SDimitry Andric allocator_type& __alloc() _NOEXCEPT 14340b57cec5SDimitry Andric {return __r_.second();} 14350b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14360b57cec5SDimitry Andric const allocator_type& __alloc() const _NOEXCEPT 14370b57cec5SDimitry Andric {return __r_.second();} 14380b57cec5SDimitry Andric 14390b57cec5SDimitry Andric#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT 14400b57cec5SDimitry Andric 14410b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14420b57cec5SDimitry Andric void __set_short_size(size_type __s) _NOEXCEPT 14430b57cec5SDimitry Andric# ifdef _LIBCPP_BIG_ENDIAN 14440b57cec5SDimitry Andric {__r_.first().__s.__size_ = (unsigned char)(__s << 1);} 14450b57cec5SDimitry Andric# else 14460b57cec5SDimitry Andric {__r_.first().__s.__size_ = (unsigned char)(__s);} 14470b57cec5SDimitry Andric# endif 14480b57cec5SDimitry Andric 14490b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14500b57cec5SDimitry Andric size_type __get_short_size() const _NOEXCEPT 14510b57cec5SDimitry Andric# ifdef _LIBCPP_BIG_ENDIAN 14520b57cec5SDimitry Andric {return __r_.first().__s.__size_ >> 1;} 14530b57cec5SDimitry Andric# else 14540b57cec5SDimitry Andric {return __r_.first().__s.__size_;} 14550b57cec5SDimitry Andric# endif 14560b57cec5SDimitry Andric 14570b57cec5SDimitry Andric#else // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT 14580b57cec5SDimitry Andric 14590b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14600b57cec5SDimitry Andric void __set_short_size(size_type __s) _NOEXCEPT 14610b57cec5SDimitry Andric# ifdef _LIBCPP_BIG_ENDIAN 14620b57cec5SDimitry Andric {__r_.first().__s.__size_ = (unsigned char)(__s);} 14630b57cec5SDimitry Andric# else 14640b57cec5SDimitry Andric {__r_.first().__s.__size_ = (unsigned char)(__s << 1);} 14650b57cec5SDimitry Andric# endif 14660b57cec5SDimitry Andric 14670b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14680b57cec5SDimitry Andric size_type __get_short_size() const _NOEXCEPT 14690b57cec5SDimitry Andric# ifdef _LIBCPP_BIG_ENDIAN 14700b57cec5SDimitry Andric {return __r_.first().__s.__size_;} 14710b57cec5SDimitry Andric# else 14720b57cec5SDimitry Andric {return __r_.first().__s.__size_ >> 1;} 14730b57cec5SDimitry Andric# endif 14740b57cec5SDimitry Andric 14750b57cec5SDimitry Andric#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT 14760b57cec5SDimitry Andric 14770b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14780b57cec5SDimitry Andric void __set_long_size(size_type __s) _NOEXCEPT 14790b57cec5SDimitry Andric {__r_.first().__l.__size_ = __s;} 14800b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14810b57cec5SDimitry Andric size_type __get_long_size() const _NOEXCEPT 14820b57cec5SDimitry Andric {return __r_.first().__l.__size_;} 14830b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14840b57cec5SDimitry Andric void __set_size(size_type __s) _NOEXCEPT 14850b57cec5SDimitry Andric {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);} 14860b57cec5SDimitry Andric 14870b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14880b57cec5SDimitry Andric void __set_long_cap(size_type __s) _NOEXCEPT 14890b57cec5SDimitry Andric {__r_.first().__l.__cap_ = __long_mask | __s;} 14900b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14910b57cec5SDimitry Andric size_type __get_long_cap() const _NOEXCEPT 14920b57cec5SDimitry Andric {return __r_.first().__l.__cap_ & size_type(~__long_mask);} 14930b57cec5SDimitry Andric 14940b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14950b57cec5SDimitry Andric void __set_long_pointer(pointer __p) _NOEXCEPT 14960b57cec5SDimitry Andric {__r_.first().__l.__data_ = __p;} 14970b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 14980b57cec5SDimitry Andric pointer __get_long_pointer() _NOEXCEPT 14990b57cec5SDimitry Andric {return __r_.first().__l.__data_;} 15000b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15010b57cec5SDimitry Andric const_pointer __get_long_pointer() const _NOEXCEPT 15020b57cec5SDimitry Andric {return __r_.first().__l.__data_;} 15030b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15040b57cec5SDimitry Andric pointer __get_short_pointer() _NOEXCEPT 15050b57cec5SDimitry Andric {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);} 15060b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15070b57cec5SDimitry Andric const_pointer __get_short_pointer() const _NOEXCEPT 15080b57cec5SDimitry Andric {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);} 15090b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15100b57cec5SDimitry Andric pointer __get_pointer() _NOEXCEPT 15110b57cec5SDimitry Andric {return __is_long() ? __get_long_pointer() : __get_short_pointer();} 15120b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15130b57cec5SDimitry Andric const_pointer __get_pointer() const _NOEXCEPT 15140b57cec5SDimitry Andric {return __is_long() ? __get_long_pointer() : __get_short_pointer();} 15150b57cec5SDimitry Andric 15160b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15170b57cec5SDimitry Andric void __zero() _NOEXCEPT 15180b57cec5SDimitry Andric { 15190b57cec5SDimitry Andric size_type (&__a)[__n_words] = __r_.first().__r.__words; 15200b57cec5SDimitry Andric for (unsigned __i = 0; __i < __n_words; ++__i) 15210b57cec5SDimitry Andric __a[__i] = 0; 15220b57cec5SDimitry Andric } 15230b57cec5SDimitry Andric 15240b57cec5SDimitry Andric template <size_type __a> static 15250b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15260b57cec5SDimitry Andric size_type __align_it(size_type __s) _NOEXCEPT 15270b57cec5SDimitry Andric {return (__s + (__a-1)) & ~(__a-1);} 15280b57cec5SDimitry Andric enum {__alignment = 16}; 15290b57cec5SDimitry Andric static _LIBCPP_INLINE_VISIBILITY 15300b57cec5SDimitry Andric size_type __recommend(size_type __s) _NOEXCEPT 15310b57cec5SDimitry Andric { 15320b57cec5SDimitry Andric if (__s < __min_cap) return static_cast<size_type>(__min_cap) - 1; 15330b57cec5SDimitry Andric size_type __guess = __align_it<sizeof(value_type) < __alignment ? 15340b57cec5SDimitry Andric __alignment/sizeof(value_type) : 1 > (__s+1) - 1; 15350b57cec5SDimitry Andric if (__guess == __min_cap) ++__guess; 15360b57cec5SDimitry Andric return __guess; 15370b57cec5SDimitry Andric } 15380b57cec5SDimitry Andric 15390b57cec5SDimitry Andric inline 15400b57cec5SDimitry Andric void __init(const value_type* __s, size_type __sz, size_type __reserve); 15410b57cec5SDimitry Andric inline 15420b57cec5SDimitry Andric void __init(const value_type* __s, size_type __sz); 15430b57cec5SDimitry Andric inline 15440b57cec5SDimitry Andric void __init(size_type __n, value_type __c); 15450b57cec5SDimitry Andric 15460b57cec5SDimitry Andric template <class _InputIterator> 15470b57cec5SDimitry Andric inline 15480b57cec5SDimitry Andric typename enable_if 15490b57cec5SDimitry Andric < 1550*480093f4SDimitry Andric __is_exactly_cpp17_input_iterator<_InputIterator>::value, 15510b57cec5SDimitry Andric void 15520b57cec5SDimitry Andric >::type 15530b57cec5SDimitry Andric __init(_InputIterator __first, _InputIterator __last); 15540b57cec5SDimitry Andric 15550b57cec5SDimitry Andric template <class _ForwardIterator> 15560b57cec5SDimitry Andric inline 15570b57cec5SDimitry Andric typename enable_if 15580b57cec5SDimitry Andric < 1559*480093f4SDimitry Andric __is_cpp17_forward_iterator<_ForwardIterator>::value, 15600b57cec5SDimitry Andric void 15610b57cec5SDimitry Andric >::type 15620b57cec5SDimitry Andric __init(_ForwardIterator __first, _ForwardIterator __last); 15630b57cec5SDimitry Andric 15640b57cec5SDimitry Andric void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz, 15650b57cec5SDimitry Andric size_type __n_copy, size_type __n_del, size_type __n_add = 0); 15660b57cec5SDimitry Andric void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz, 15670b57cec5SDimitry Andric size_type __n_copy, size_type __n_del, 15680b57cec5SDimitry Andric size_type __n_add, const value_type* __p_new_stuff); 15690b57cec5SDimitry Andric 15700b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15710b57cec5SDimitry Andric void __erase_to_end(size_type __pos); 15720b57cec5SDimitry Andric 15730b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15740b57cec5SDimitry Andric void __copy_assign_alloc(const basic_string& __str) 15750b57cec5SDimitry Andric {__copy_assign_alloc(__str, integral_constant<bool, 15760b57cec5SDimitry Andric __alloc_traits::propagate_on_container_copy_assignment::value>());} 15770b57cec5SDimitry Andric 15780b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 15790b57cec5SDimitry Andric void __copy_assign_alloc(const basic_string& __str, true_type) 15800b57cec5SDimitry Andric { 15810b57cec5SDimitry Andric if (__alloc() == __str.__alloc()) 15820b57cec5SDimitry Andric __alloc() = __str.__alloc(); 15830b57cec5SDimitry Andric else 15840b57cec5SDimitry Andric { 15850b57cec5SDimitry Andric if (!__str.__is_long()) 15860b57cec5SDimitry Andric { 15870b57cec5SDimitry Andric __clear_and_shrink(); 15880b57cec5SDimitry Andric __alloc() = __str.__alloc(); 15890b57cec5SDimitry Andric } 15900b57cec5SDimitry Andric else 15910b57cec5SDimitry Andric { 15920b57cec5SDimitry Andric allocator_type __a = __str.__alloc(); 15930b57cec5SDimitry Andric pointer __p = __alloc_traits::allocate(__a, __str.__get_long_cap()); 15940b57cec5SDimitry Andric __clear_and_shrink(); 15950b57cec5SDimitry Andric __alloc() = _VSTD::move(__a); 15960b57cec5SDimitry Andric __set_long_pointer(__p); 15970b57cec5SDimitry Andric __set_long_cap(__str.__get_long_cap()); 15980b57cec5SDimitry Andric __set_long_size(__str.size()); 15990b57cec5SDimitry Andric } 16000b57cec5SDimitry Andric } 16010b57cec5SDimitry Andric } 16020b57cec5SDimitry Andric 16030b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 16040b57cec5SDimitry Andric void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT 16050b57cec5SDimitry Andric {} 16060b57cec5SDimitry Andric 16070b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 16080b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 16090b57cec5SDimitry Andric void __move_assign(basic_string& __str, false_type) 16100b57cec5SDimitry Andric _NOEXCEPT_(__alloc_traits::is_always_equal::value); 16110b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 16120b57cec5SDimitry Andric void __move_assign(basic_string& __str, true_type) 16130b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 14 16140b57cec5SDimitry Andric _NOEXCEPT; 16150b57cec5SDimitry Andric#else 16160b57cec5SDimitry Andric _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 16170b57cec5SDimitry Andric#endif 16180b57cec5SDimitry Andric#endif 16190b57cec5SDimitry Andric 16200b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 16210b57cec5SDimitry Andric void 16220b57cec5SDimitry Andric __move_assign_alloc(basic_string& __str) 16230b57cec5SDimitry Andric _NOEXCEPT_( 16240b57cec5SDimitry Andric !__alloc_traits::propagate_on_container_move_assignment::value || 16250b57cec5SDimitry Andric is_nothrow_move_assignable<allocator_type>::value) 16260b57cec5SDimitry Andric {__move_assign_alloc(__str, integral_constant<bool, 16270b57cec5SDimitry Andric __alloc_traits::propagate_on_container_move_assignment::value>());} 16280b57cec5SDimitry Andric 16290b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 16300b57cec5SDimitry Andric void __move_assign_alloc(basic_string& __c, true_type) 16310b57cec5SDimitry Andric _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 16320b57cec5SDimitry Andric { 16330b57cec5SDimitry Andric __alloc() = _VSTD::move(__c.__alloc()); 16340b57cec5SDimitry Andric } 16350b57cec5SDimitry Andric 16360b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 16370b57cec5SDimitry Andric void __move_assign_alloc(basic_string&, false_type) 16380b57cec5SDimitry Andric _NOEXCEPT 16390b57cec5SDimitry Andric {} 16400b57cec5SDimitry Andric 16410b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators(); 16420b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type); 16430b57cec5SDimitry Andric 16440b57cec5SDimitry Andric friend basic_string operator+<>(const basic_string&, const basic_string&); 16450b57cec5SDimitry Andric friend basic_string operator+<>(const value_type*, const basic_string&); 16460b57cec5SDimitry Andric friend basic_string operator+<>(value_type, const basic_string&); 16470b57cec5SDimitry Andric friend basic_string operator+<>(const basic_string&, const value_type*); 16480b57cec5SDimitry Andric friend basic_string operator+<>(const basic_string&, value_type); 16490b57cec5SDimitry Andric}; 16500b57cec5SDimitry Andric 16510b57cec5SDimitry Andric#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 16520b57cec5SDimitry Andrictemplate<class _InputIterator, 16530b57cec5SDimitry Andric class _CharT = typename iterator_traits<_InputIterator>::value_type, 16540b57cec5SDimitry Andric class _Allocator = allocator<_CharT>, 1655*480093f4SDimitry Andric class = typename enable_if<__is_cpp17_input_iterator<_InputIterator>::value, void>::type, 16560b57cec5SDimitry Andric class = typename enable_if<__is_allocator<_Allocator>::value, void>::type 16570b57cec5SDimitry Andric > 16580b57cec5SDimitry Andricbasic_string(_InputIterator, _InputIterator, _Allocator = _Allocator()) 16590b57cec5SDimitry Andric -> basic_string<_CharT, char_traits<_CharT>, _Allocator>; 16600b57cec5SDimitry Andric 16610b57cec5SDimitry Andrictemplate<class _CharT, 16620b57cec5SDimitry Andric class _Traits, 16630b57cec5SDimitry Andric class _Allocator = allocator<_CharT>, 16640b57cec5SDimitry Andric class = typename enable_if<__is_allocator<_Allocator>::value, void>::type 16650b57cec5SDimitry Andric > 16660b57cec5SDimitry Andricexplicit basic_string(basic_string_view<_CharT, _Traits>, const _Allocator& = _Allocator()) 16670b57cec5SDimitry Andric -> basic_string<_CharT, _Traits, _Allocator>; 16680b57cec5SDimitry Andric 16690b57cec5SDimitry Andrictemplate<class _CharT, 16700b57cec5SDimitry Andric class _Traits, 16710b57cec5SDimitry Andric class _Allocator = allocator<_CharT>, 16720b57cec5SDimitry Andric class = typename enable_if<__is_allocator<_Allocator>::value, void>::type, 16730b57cec5SDimitry Andric class _Sz = typename allocator_traits<_Allocator>::size_type 16740b57cec5SDimitry Andric > 16750b57cec5SDimitry Andricbasic_string(basic_string_view<_CharT, _Traits>, _Sz, _Sz, const _Allocator& = _Allocator()) 16760b57cec5SDimitry Andric -> basic_string<_CharT, _Traits, _Allocator>; 16770b57cec5SDimitry Andric#endif 16780b57cec5SDimitry Andric 16790b57cec5SDimitry Andric 16800b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 16810b57cec5SDimitry Andricinline 16820b57cec5SDimitry Andricvoid 16830b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators() 16840b57cec5SDimitry Andric{ 16850b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 16860b57cec5SDimitry Andric __get_db()->__invalidate_all(this); 16870b57cec5SDimitry Andric#endif // _LIBCPP_DEBUG_LEVEL >= 2 16880b57cec5SDimitry Andric} 16890b57cec5SDimitry Andric 16900b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 16910b57cec5SDimitry Andricinline 16920b57cec5SDimitry Andricvoid 16930b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type 16940b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 16950b57cec5SDimitry Andric __pos 16960b57cec5SDimitry Andric#endif 16970b57cec5SDimitry Andric ) 16980b57cec5SDimitry Andric{ 16990b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 17000b57cec5SDimitry Andric __c_node* __c = __get_db()->__find_c_and_lock(this); 17010b57cec5SDimitry Andric if (__c) 17020b57cec5SDimitry Andric { 17030b57cec5SDimitry Andric const_pointer __new_last = __get_pointer() + __pos; 17040b57cec5SDimitry Andric for (__i_node** __p = __c->end_; __p != __c->beg_; ) 17050b57cec5SDimitry Andric { 17060b57cec5SDimitry Andric --__p; 17070b57cec5SDimitry Andric const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_); 17080b57cec5SDimitry Andric if (__i->base() > __new_last) 17090b57cec5SDimitry Andric { 17100b57cec5SDimitry Andric (*__p)->__c_ = nullptr; 17110b57cec5SDimitry Andric if (--__c->end_ != __p) 17120b57cec5SDimitry Andric memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); 17130b57cec5SDimitry Andric } 17140b57cec5SDimitry Andric } 17150b57cec5SDimitry Andric __get_db()->unlock(); 17160b57cec5SDimitry Andric } 17170b57cec5SDimitry Andric#endif // _LIBCPP_DEBUG_LEVEL >= 2 17180b57cec5SDimitry Andric} 17190b57cec5SDimitry Andric 17200b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 17210b57cec5SDimitry Andricinline 17220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string() 17230b57cec5SDimitry Andric _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 1724*480093f4SDimitry Andric : __r_(__default_init_tag(), __default_init_tag()) 17250b57cec5SDimitry Andric{ 17260b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 17270b57cec5SDimitry Andric __get_db()->__insert_c(this); 17280b57cec5SDimitry Andric#endif 17290b57cec5SDimitry Andric __zero(); 17300b57cec5SDimitry Andric} 17310b57cec5SDimitry Andric 17320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 17330b57cec5SDimitry Andricinline 17340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a) 17350b57cec5SDimitry Andric#if _LIBCPP_STD_VER <= 14 17360b57cec5SDimitry Andric _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 17370b57cec5SDimitry Andric#else 17380b57cec5SDimitry Andric _NOEXCEPT 17390b57cec5SDimitry Andric#endif 1740*480093f4SDimitry Andric: __r_(__default_init_tag(), __a) 17410b57cec5SDimitry Andric{ 17420b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 17430b57cec5SDimitry Andric __get_db()->__insert_c(this); 17440b57cec5SDimitry Andric#endif 17450b57cec5SDimitry Andric __zero(); 17460b57cec5SDimitry Andric} 17470b57cec5SDimitry Andric 17480b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 17490b57cec5SDimitry Andricvoid basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, 17500b57cec5SDimitry Andric size_type __sz, 17510b57cec5SDimitry Andric size_type __reserve) 17520b57cec5SDimitry Andric{ 17530b57cec5SDimitry Andric if (__reserve > max_size()) 17540b57cec5SDimitry Andric this->__throw_length_error(); 17550b57cec5SDimitry Andric pointer __p; 17560b57cec5SDimitry Andric if (__reserve < __min_cap) 17570b57cec5SDimitry Andric { 17580b57cec5SDimitry Andric __set_short_size(__sz); 17590b57cec5SDimitry Andric __p = __get_short_pointer(); 17600b57cec5SDimitry Andric } 17610b57cec5SDimitry Andric else 17620b57cec5SDimitry Andric { 17630b57cec5SDimitry Andric size_type __cap = __recommend(__reserve); 17640b57cec5SDimitry Andric __p = __alloc_traits::allocate(__alloc(), __cap+1); 17650b57cec5SDimitry Andric __set_long_pointer(__p); 17660b57cec5SDimitry Andric __set_long_cap(__cap+1); 17670b57cec5SDimitry Andric __set_long_size(__sz); 17680b57cec5SDimitry Andric } 1769*480093f4SDimitry Andric traits_type::copy(_VSTD::__to_address(__p), __s, __sz); 17700b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 17710b57cec5SDimitry Andric} 17720b57cec5SDimitry Andric 17730b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 17740b57cec5SDimitry Andricvoid 17750b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz) 17760b57cec5SDimitry Andric{ 17770b57cec5SDimitry Andric if (__sz > max_size()) 17780b57cec5SDimitry Andric this->__throw_length_error(); 17790b57cec5SDimitry Andric pointer __p; 17800b57cec5SDimitry Andric if (__sz < __min_cap) 17810b57cec5SDimitry Andric { 17820b57cec5SDimitry Andric __set_short_size(__sz); 17830b57cec5SDimitry Andric __p = __get_short_pointer(); 17840b57cec5SDimitry Andric } 17850b57cec5SDimitry Andric else 17860b57cec5SDimitry Andric { 17870b57cec5SDimitry Andric size_type __cap = __recommend(__sz); 17880b57cec5SDimitry Andric __p = __alloc_traits::allocate(__alloc(), __cap+1); 17890b57cec5SDimitry Andric __set_long_pointer(__p); 17900b57cec5SDimitry Andric __set_long_cap(__cap+1); 17910b57cec5SDimitry Andric __set_long_size(__sz); 17920b57cec5SDimitry Andric } 1793*480093f4SDimitry Andric traits_type::copy(_VSTD::__to_address(__p), __s, __sz); 17940b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 17950b57cec5SDimitry Andric} 17960b57cec5SDimitry Andric 17970b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 17980b57cec5SDimitry Andrictemplate <class> 17990b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, const _Allocator& __a) 1800*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 18010b57cec5SDimitry Andric{ 18020b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr"); 18030b57cec5SDimitry Andric __init(__s, traits_type::length(__s)); 18040b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 18050b57cec5SDimitry Andric __get_db()->__insert_c(this); 18060b57cec5SDimitry Andric#endif 18070b57cec5SDimitry Andric} 18080b57cec5SDimitry Andric 18090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 18100b57cec5SDimitry Andricinline 18110b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, size_type __n) 1812*480093f4SDimitry Andric : __r_(__default_init_tag(), __default_init_tag()) 18130b57cec5SDimitry Andric{ 18140b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr"); 18150b57cec5SDimitry Andric __init(__s, __n); 18160b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 18170b57cec5SDimitry Andric __get_db()->__insert_c(this); 18180b57cec5SDimitry Andric#endif 18190b57cec5SDimitry Andric} 18200b57cec5SDimitry Andric 18210b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 18220b57cec5SDimitry Andricinline 18230b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, size_type __n, const _Allocator& __a) 1824*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 18250b57cec5SDimitry Andric{ 18260b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr"); 18270b57cec5SDimitry Andric __init(__s, __n); 18280b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 18290b57cec5SDimitry Andric __get_db()->__insert_c(this); 18300b57cec5SDimitry Andric#endif 18310b57cec5SDimitry Andric} 18320b57cec5SDimitry Andric 18330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 18340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str) 1835*480093f4SDimitry Andric : __r_(__default_init_tag(), __alloc_traits::select_on_container_copy_construction(__str.__alloc())) 18360b57cec5SDimitry Andric{ 18370b57cec5SDimitry Andric if (!__str.__is_long()) 18380b57cec5SDimitry Andric __r_.first().__r = __str.__r_.first().__r; 18390b57cec5SDimitry Andric else 1840*480093f4SDimitry Andric __init(_VSTD::__to_address(__str.__get_long_pointer()), __str.__get_long_size()); 18410b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 18420b57cec5SDimitry Andric __get_db()->__insert_c(this); 18430b57cec5SDimitry Andric#endif 18440b57cec5SDimitry Andric} 18450b57cec5SDimitry Andric 18460b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 18470b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string( 18480b57cec5SDimitry Andric const basic_string& __str, const allocator_type& __a) 1849*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 18500b57cec5SDimitry Andric{ 18510b57cec5SDimitry Andric if (!__str.__is_long()) 18520b57cec5SDimitry Andric __r_.first().__r = __str.__r_.first().__r; 18530b57cec5SDimitry Andric else 1854*480093f4SDimitry Andric __init(_VSTD::__to_address(__str.__get_long_pointer()), __str.__get_long_size()); 18550b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 18560b57cec5SDimitry Andric __get_db()->__insert_c(this); 18570b57cec5SDimitry Andric#endif 18580b57cec5SDimitry Andric} 18590b57cec5SDimitry Andric 18600b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 18610b57cec5SDimitry Andric 18620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 18630b57cec5SDimitry Andricinline 18640b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str) 18650b57cec5SDimitry Andric#if _LIBCPP_STD_VER <= 14 18660b57cec5SDimitry Andric _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 18670b57cec5SDimitry Andric#else 18680b57cec5SDimitry Andric _NOEXCEPT 18690b57cec5SDimitry Andric#endif 18700b57cec5SDimitry Andric : __r_(_VSTD::move(__str.__r_)) 18710b57cec5SDimitry Andric{ 18720b57cec5SDimitry Andric __str.__zero(); 18730b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 18740b57cec5SDimitry Andric __get_db()->__insert_c(this); 18750b57cec5SDimitry Andric if (__is_long()) 18760b57cec5SDimitry Andric __get_db()->swap(this, &__str); 18770b57cec5SDimitry Andric#endif 18780b57cec5SDimitry Andric} 18790b57cec5SDimitry Andric 18800b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 18810b57cec5SDimitry Andricinline 18820b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a) 1883*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 18840b57cec5SDimitry Andric{ 18850b57cec5SDimitry Andric if (__str.__is_long() && __a != __str.__alloc()) // copy, not move 1886*480093f4SDimitry Andric __init(_VSTD::__to_address(__str.__get_long_pointer()), __str.__get_long_size()); 18870b57cec5SDimitry Andric else 18880b57cec5SDimitry Andric { 18890b57cec5SDimitry Andric __r_.first().__r = __str.__r_.first().__r; 18900b57cec5SDimitry Andric __str.__zero(); 18910b57cec5SDimitry Andric } 18920b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 18930b57cec5SDimitry Andric __get_db()->__insert_c(this); 18940b57cec5SDimitry Andric if (__is_long()) 18950b57cec5SDimitry Andric __get_db()->swap(this, &__str); 18960b57cec5SDimitry Andric#endif 18970b57cec5SDimitry Andric} 18980b57cec5SDimitry Andric 18990b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 19000b57cec5SDimitry Andric 19010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 19020b57cec5SDimitry Andricvoid 19030b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c) 19040b57cec5SDimitry Andric{ 19050b57cec5SDimitry Andric if (__n > max_size()) 19060b57cec5SDimitry Andric this->__throw_length_error(); 19070b57cec5SDimitry Andric pointer __p; 19080b57cec5SDimitry Andric if (__n < __min_cap) 19090b57cec5SDimitry Andric { 19100b57cec5SDimitry Andric __set_short_size(__n); 19110b57cec5SDimitry Andric __p = __get_short_pointer(); 19120b57cec5SDimitry Andric } 19130b57cec5SDimitry Andric else 19140b57cec5SDimitry Andric { 19150b57cec5SDimitry Andric size_type __cap = __recommend(__n); 19160b57cec5SDimitry Andric __p = __alloc_traits::allocate(__alloc(), __cap+1); 19170b57cec5SDimitry Andric __set_long_pointer(__p); 19180b57cec5SDimitry Andric __set_long_cap(__cap+1); 19190b57cec5SDimitry Andric __set_long_size(__n); 19200b57cec5SDimitry Andric } 1921*480093f4SDimitry Andric traits_type::assign(_VSTD::__to_address(__p), __n, __c); 19220b57cec5SDimitry Andric traits_type::assign(__p[__n], value_type()); 19230b57cec5SDimitry Andric} 19240b57cec5SDimitry Andric 19250b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 19260b57cec5SDimitry Andricinline 19270b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, _CharT __c) 1928*480093f4SDimitry Andric : __r_(__default_init_tag(), __default_init_tag()) 19290b57cec5SDimitry Andric{ 19300b57cec5SDimitry Andric __init(__n, __c); 19310b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 19320b57cec5SDimitry Andric __get_db()->__insert_c(this); 19330b57cec5SDimitry Andric#endif 19340b57cec5SDimitry Andric} 19350b57cec5SDimitry Andric 19360b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 19370b57cec5SDimitry Andrictemplate <class> 19380b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, _CharT __c, const _Allocator& __a) 1939*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 19400b57cec5SDimitry Andric{ 19410b57cec5SDimitry Andric __init(__n, __c); 19420b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 19430b57cec5SDimitry Andric __get_db()->__insert_c(this); 19440b57cec5SDimitry Andric#endif 19450b57cec5SDimitry Andric} 19460b57cec5SDimitry Andric 19470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 19480b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, 19490b57cec5SDimitry Andric size_type __pos, size_type __n, 19500b57cec5SDimitry Andric const _Allocator& __a) 1951*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 19520b57cec5SDimitry Andric{ 19530b57cec5SDimitry Andric size_type __str_sz = __str.size(); 19540b57cec5SDimitry Andric if (__pos > __str_sz) 19550b57cec5SDimitry Andric this->__throw_out_of_range(); 19560b57cec5SDimitry Andric __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos)); 19570b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 19580b57cec5SDimitry Andric __get_db()->__insert_c(this); 19590b57cec5SDimitry Andric#endif 19600b57cec5SDimitry Andric} 19610b57cec5SDimitry Andric 19620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 19630b57cec5SDimitry Andricinline 19640b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, 19650b57cec5SDimitry Andric const _Allocator& __a) 1966*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 19670b57cec5SDimitry Andric{ 19680b57cec5SDimitry Andric size_type __str_sz = __str.size(); 19690b57cec5SDimitry Andric if (__pos > __str_sz) 19700b57cec5SDimitry Andric this->__throw_out_of_range(); 19710b57cec5SDimitry Andric __init(__str.data() + __pos, __str_sz - __pos); 19720b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 19730b57cec5SDimitry Andric __get_db()->__insert_c(this); 19740b57cec5SDimitry Andric#endif 19750b57cec5SDimitry Andric} 19760b57cec5SDimitry Andric 19770b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 19780b57cec5SDimitry Andrictemplate <class _Tp, class> 19790b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string( 19800b57cec5SDimitry Andric const _Tp& __t, size_type __pos, size_type __n, const allocator_type& __a) 1981*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 19820b57cec5SDimitry Andric{ 19830b57cec5SDimitry Andric __self_view __sv0 = __t; 19840b57cec5SDimitry Andric __self_view __sv = __sv0.substr(__pos, __n); 19850b57cec5SDimitry Andric __init(__sv.data(), __sv.size()); 19860b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 19870b57cec5SDimitry Andric __get_db()->__insert_c(this); 19880b57cec5SDimitry Andric#endif 19890b57cec5SDimitry Andric} 19900b57cec5SDimitry Andric 19910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 19920b57cec5SDimitry Andrictemplate <class _Tp, class> 19930b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t) 1994*480093f4SDimitry Andric : __r_(__default_init_tag(), __default_init_tag()) 19950b57cec5SDimitry Andric{ 19960b57cec5SDimitry Andric __self_view __sv = __t; 19970b57cec5SDimitry Andric __init(__sv.data(), __sv.size()); 19980b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 19990b57cec5SDimitry Andric __get_db()->__insert_c(this); 20000b57cec5SDimitry Andric#endif 20010b57cec5SDimitry Andric} 20020b57cec5SDimitry Andric 20030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 20040b57cec5SDimitry Andrictemplate <class _Tp, class> 20050b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t, const _Allocator& __a) 2006*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 20070b57cec5SDimitry Andric{ 20080b57cec5SDimitry Andric __self_view __sv = __t; 20090b57cec5SDimitry Andric __init(__sv.data(), __sv.size()); 20100b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 20110b57cec5SDimitry Andric __get_db()->__insert_c(this); 20120b57cec5SDimitry Andric#endif 20130b57cec5SDimitry Andric} 20140b57cec5SDimitry Andric 20150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 20160b57cec5SDimitry Andrictemplate <class _InputIterator> 20170b57cec5SDimitry Andrictypename enable_if 20180b57cec5SDimitry Andric< 2019*480093f4SDimitry Andric __is_exactly_cpp17_input_iterator<_InputIterator>::value, 20200b57cec5SDimitry Andric void 20210b57cec5SDimitry Andric>::type 20220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last) 20230b57cec5SDimitry Andric{ 20240b57cec5SDimitry Andric __zero(); 20250b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 20260b57cec5SDimitry Andric try 20270b57cec5SDimitry Andric { 20280b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 20290b57cec5SDimitry Andric for (; __first != __last; ++__first) 20300b57cec5SDimitry Andric push_back(*__first); 20310b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS 20320b57cec5SDimitry Andric } 20330b57cec5SDimitry Andric catch (...) 20340b57cec5SDimitry Andric { 20350b57cec5SDimitry Andric if (__is_long()) 20360b57cec5SDimitry Andric __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap()); 20370b57cec5SDimitry Andric throw; 20380b57cec5SDimitry Andric } 20390b57cec5SDimitry Andric#endif // _LIBCPP_NO_EXCEPTIONS 20400b57cec5SDimitry Andric} 20410b57cec5SDimitry Andric 20420b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 20430b57cec5SDimitry Andrictemplate <class _ForwardIterator> 20440b57cec5SDimitry Andrictypename enable_if 20450b57cec5SDimitry Andric< 2046*480093f4SDimitry Andric __is_cpp17_forward_iterator<_ForwardIterator>::value, 20470b57cec5SDimitry Andric void 20480b57cec5SDimitry Andric>::type 20490b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last) 20500b57cec5SDimitry Andric{ 20510b57cec5SDimitry Andric size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last)); 20520b57cec5SDimitry Andric if (__sz > max_size()) 20530b57cec5SDimitry Andric this->__throw_length_error(); 20540b57cec5SDimitry Andric pointer __p; 20550b57cec5SDimitry Andric if (__sz < __min_cap) 20560b57cec5SDimitry Andric { 20570b57cec5SDimitry Andric __set_short_size(__sz); 20580b57cec5SDimitry Andric __p = __get_short_pointer(); 20590b57cec5SDimitry Andric } 20600b57cec5SDimitry Andric else 20610b57cec5SDimitry Andric { 20620b57cec5SDimitry Andric size_type __cap = __recommend(__sz); 20630b57cec5SDimitry Andric __p = __alloc_traits::allocate(__alloc(), __cap+1); 20640b57cec5SDimitry Andric __set_long_pointer(__p); 20650b57cec5SDimitry Andric __set_long_cap(__cap+1); 20660b57cec5SDimitry Andric __set_long_size(__sz); 20670b57cec5SDimitry Andric } 20680b57cec5SDimitry Andric for (; __first != __last; ++__first, (void) ++__p) 20690b57cec5SDimitry Andric traits_type::assign(*__p, *__first); 20700b57cec5SDimitry Andric traits_type::assign(*__p, value_type()); 20710b57cec5SDimitry Andric} 20720b57cec5SDimitry Andric 20730b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 20740b57cec5SDimitry Andrictemplate<class _InputIterator, class> 20750b57cec5SDimitry Andricinline 20760b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last) 2077*480093f4SDimitry Andric : __r_(__default_init_tag(), __default_init_tag()) 20780b57cec5SDimitry Andric{ 20790b57cec5SDimitry Andric __init(__first, __last); 20800b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 20810b57cec5SDimitry Andric __get_db()->__insert_c(this); 20820b57cec5SDimitry Andric#endif 20830b57cec5SDimitry Andric} 20840b57cec5SDimitry Andric 20850b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 20860b57cec5SDimitry Andrictemplate<class _InputIterator, class> 20870b57cec5SDimitry Andricinline 20880b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last, 20890b57cec5SDimitry Andric const allocator_type& __a) 2090*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 20910b57cec5SDimitry Andric{ 20920b57cec5SDimitry Andric __init(__first, __last); 20930b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 20940b57cec5SDimitry Andric __get_db()->__insert_c(this); 20950b57cec5SDimitry Andric#endif 20960b57cec5SDimitry Andric} 20970b57cec5SDimitry Andric 20980b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 20990b57cec5SDimitry Andric 21000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 21010b57cec5SDimitry Andricinline 21020b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string( 21030b57cec5SDimitry Andric initializer_list<_CharT> __il) 2104*480093f4SDimitry Andric : __r_(__default_init_tag(), __default_init_tag()) 21050b57cec5SDimitry Andric{ 21060b57cec5SDimitry Andric __init(__il.begin(), __il.end()); 21070b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 21080b57cec5SDimitry Andric __get_db()->__insert_c(this); 21090b57cec5SDimitry Andric#endif 21100b57cec5SDimitry Andric} 21110b57cec5SDimitry Andric 21120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 21130b57cec5SDimitry Andricinline 21140b57cec5SDimitry Andric 21150b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::basic_string( 21160b57cec5SDimitry Andric initializer_list<_CharT> __il, const _Allocator& __a) 2117*480093f4SDimitry Andric : __r_(__default_init_tag(), __a) 21180b57cec5SDimitry Andric{ 21190b57cec5SDimitry Andric __init(__il.begin(), __il.end()); 21200b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 21210b57cec5SDimitry Andric __get_db()->__insert_c(this); 21220b57cec5SDimitry Andric#endif 21230b57cec5SDimitry Andric} 21240b57cec5SDimitry Andric 21250b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 21260b57cec5SDimitry Andric 21270b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 21280b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::~basic_string() 21290b57cec5SDimitry Andric{ 21300b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 21310b57cec5SDimitry Andric __get_db()->__erase_c(this); 21320b57cec5SDimitry Andric#endif 21330b57cec5SDimitry Andric if (__is_long()) 21340b57cec5SDimitry Andric __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap()); 21350b57cec5SDimitry Andric} 21360b57cec5SDimitry Andric 21370b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 21380b57cec5SDimitry Andricvoid 21390b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace 21400b57cec5SDimitry Andric (size_type __old_cap, size_type __delta_cap, size_type __old_sz, 21410b57cec5SDimitry Andric size_type __n_copy, size_type __n_del, size_type __n_add, const value_type* __p_new_stuff) 21420b57cec5SDimitry Andric{ 21430b57cec5SDimitry Andric size_type __ms = max_size(); 21440b57cec5SDimitry Andric if (__delta_cap > __ms - __old_cap - 1) 21450b57cec5SDimitry Andric this->__throw_length_error(); 21460b57cec5SDimitry Andric pointer __old_p = __get_pointer(); 21470b57cec5SDimitry Andric size_type __cap = __old_cap < __ms / 2 - __alignment ? 21480b57cec5SDimitry Andric __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) : 21490b57cec5SDimitry Andric __ms - 1; 21500b57cec5SDimitry Andric pointer __p = __alloc_traits::allocate(__alloc(), __cap+1); 21510b57cec5SDimitry Andric __invalidate_all_iterators(); 21520b57cec5SDimitry Andric if (__n_copy != 0) 2153*480093f4SDimitry Andric traits_type::copy(_VSTD::__to_address(__p), 2154*480093f4SDimitry Andric _VSTD::__to_address(__old_p), __n_copy); 21550b57cec5SDimitry Andric if (__n_add != 0) 2156*480093f4SDimitry Andric traits_type::copy(_VSTD::__to_address(__p) + __n_copy, __p_new_stuff, __n_add); 21570b57cec5SDimitry Andric size_type __sec_cp_sz = __old_sz - __n_del - __n_copy; 21580b57cec5SDimitry Andric if (__sec_cp_sz != 0) 2159*480093f4SDimitry Andric traits_type::copy(_VSTD::__to_address(__p) + __n_copy + __n_add, 2160*480093f4SDimitry Andric _VSTD::__to_address(__old_p) + __n_copy + __n_del, __sec_cp_sz); 21610b57cec5SDimitry Andric if (__old_cap+1 != __min_cap) 21620b57cec5SDimitry Andric __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1); 21630b57cec5SDimitry Andric __set_long_pointer(__p); 21640b57cec5SDimitry Andric __set_long_cap(__cap+1); 21650b57cec5SDimitry Andric __old_sz = __n_copy + __n_add + __sec_cp_sz; 21660b57cec5SDimitry Andric __set_long_size(__old_sz); 21670b57cec5SDimitry Andric traits_type::assign(__p[__old_sz], value_type()); 21680b57cec5SDimitry Andric} 21690b57cec5SDimitry Andric 21700b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 21710b57cec5SDimitry Andricvoid 21720b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz, 21730b57cec5SDimitry Andric size_type __n_copy, size_type __n_del, size_type __n_add) 21740b57cec5SDimitry Andric{ 21750b57cec5SDimitry Andric size_type __ms = max_size(); 21760b57cec5SDimitry Andric if (__delta_cap > __ms - __old_cap) 21770b57cec5SDimitry Andric this->__throw_length_error(); 21780b57cec5SDimitry Andric pointer __old_p = __get_pointer(); 21790b57cec5SDimitry Andric size_type __cap = __old_cap < __ms / 2 - __alignment ? 21800b57cec5SDimitry Andric __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) : 21810b57cec5SDimitry Andric __ms - 1; 21820b57cec5SDimitry Andric pointer __p = __alloc_traits::allocate(__alloc(), __cap+1); 21830b57cec5SDimitry Andric __invalidate_all_iterators(); 21840b57cec5SDimitry Andric if (__n_copy != 0) 2185*480093f4SDimitry Andric traits_type::copy(_VSTD::__to_address(__p), 2186*480093f4SDimitry Andric _VSTD::__to_address(__old_p), __n_copy); 21870b57cec5SDimitry Andric size_type __sec_cp_sz = __old_sz - __n_del - __n_copy; 21880b57cec5SDimitry Andric if (__sec_cp_sz != 0) 2189*480093f4SDimitry Andric traits_type::copy(_VSTD::__to_address(__p) + __n_copy + __n_add, 2190*480093f4SDimitry Andric _VSTD::__to_address(__old_p) + __n_copy + __n_del, 21910b57cec5SDimitry Andric __sec_cp_sz); 21920b57cec5SDimitry Andric if (__old_cap+1 != __min_cap) 21930b57cec5SDimitry Andric __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1); 21940b57cec5SDimitry Andric __set_long_pointer(__p); 21950b57cec5SDimitry Andric __set_long_cap(__cap+1); 21960b57cec5SDimitry Andric} 21970b57cec5SDimitry Andric 21980b57cec5SDimitry Andric// assign 21990b57cec5SDimitry Andric 22000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 22010b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 22020b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n) 22030b57cec5SDimitry Andric{ 22040b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr"); 22050b57cec5SDimitry Andric size_type __cap = capacity(); 22060b57cec5SDimitry Andric if (__cap >= __n) 22070b57cec5SDimitry Andric { 2208*480093f4SDimitry Andric value_type* __p = _VSTD::__to_address(__get_pointer()); 22090b57cec5SDimitry Andric traits_type::move(__p, __s, __n); 22100b57cec5SDimitry Andric traits_type::assign(__p[__n], value_type()); 22110b57cec5SDimitry Andric __set_size(__n); 22120b57cec5SDimitry Andric __invalidate_iterators_past(__n); 22130b57cec5SDimitry Andric } 22140b57cec5SDimitry Andric else 22150b57cec5SDimitry Andric { 22160b57cec5SDimitry Andric size_type __sz = size(); 22170b57cec5SDimitry Andric __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s); 22180b57cec5SDimitry Andric } 22190b57cec5SDimitry Andric return *this; 22200b57cec5SDimitry Andric} 22210b57cec5SDimitry Andric 22220b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 22230b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 22240b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c) 22250b57cec5SDimitry Andric{ 22260b57cec5SDimitry Andric size_type __cap = capacity(); 22270b57cec5SDimitry Andric if (__cap < __n) 22280b57cec5SDimitry Andric { 22290b57cec5SDimitry Andric size_type __sz = size(); 22300b57cec5SDimitry Andric __grow_by(__cap, __n - __cap, __sz, 0, __sz); 22310b57cec5SDimitry Andric } 22320b57cec5SDimitry Andric else 22330b57cec5SDimitry Andric __invalidate_iterators_past(__n); 2234*480093f4SDimitry Andric value_type* __p = _VSTD::__to_address(__get_pointer()); 22350b57cec5SDimitry Andric traits_type::assign(__p, __n, __c); 22360b57cec5SDimitry Andric traits_type::assign(__p[__n], value_type()); 22370b57cec5SDimitry Andric __set_size(__n); 22380b57cec5SDimitry Andric return *this; 22390b57cec5SDimitry Andric} 22400b57cec5SDimitry Andric 22410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 22420b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 22430b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c) 22440b57cec5SDimitry Andric{ 22450b57cec5SDimitry Andric pointer __p; 22460b57cec5SDimitry Andric if (__is_long()) 22470b57cec5SDimitry Andric { 22480b57cec5SDimitry Andric __p = __get_long_pointer(); 22490b57cec5SDimitry Andric __set_long_size(1); 22500b57cec5SDimitry Andric } 22510b57cec5SDimitry Andric else 22520b57cec5SDimitry Andric { 22530b57cec5SDimitry Andric __p = __get_short_pointer(); 22540b57cec5SDimitry Andric __set_short_size(1); 22550b57cec5SDimitry Andric } 22560b57cec5SDimitry Andric traits_type::assign(*__p, __c); 22570b57cec5SDimitry Andric traits_type::assign(*++__p, value_type()); 22580b57cec5SDimitry Andric __invalidate_iterators_past(1); 22590b57cec5SDimitry Andric return *this; 22600b57cec5SDimitry Andric} 22610b57cec5SDimitry Andric 22620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 22630b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 22640b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str) 22650b57cec5SDimitry Andric{ 22660b57cec5SDimitry Andric if (this != &__str) 22670b57cec5SDimitry Andric { 22680b57cec5SDimitry Andric __copy_assign_alloc(__str); 2269e40139ffSDimitry Andric return assign(__str.data(), __str.size()); 22700b57cec5SDimitry Andric } 22710b57cec5SDimitry Andric return *this; 22720b57cec5SDimitry Andric} 22730b57cec5SDimitry Andric 22740b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 22750b57cec5SDimitry Andric 22760b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 22770b57cec5SDimitry Andricinline 22780b57cec5SDimitry Andricvoid 22790b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type) 22800b57cec5SDimitry Andric _NOEXCEPT_(__alloc_traits::is_always_equal::value) 22810b57cec5SDimitry Andric{ 22820b57cec5SDimitry Andric if (__alloc() != __str.__alloc()) 22830b57cec5SDimitry Andric assign(__str); 22840b57cec5SDimitry Andric else 22850b57cec5SDimitry Andric __move_assign(__str, true_type()); 22860b57cec5SDimitry Andric} 22870b57cec5SDimitry Andric 22880b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 22890b57cec5SDimitry Andricinline 22900b57cec5SDimitry Andricvoid 22910b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type) 22920b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 14 22930b57cec5SDimitry Andric _NOEXCEPT 22940b57cec5SDimitry Andric#else 22950b57cec5SDimitry Andric _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 22960b57cec5SDimitry Andric#endif 22970b57cec5SDimitry Andric{ 2298*480093f4SDimitry Andric if (__is_long()) { 2299*480093f4SDimitry Andric __alloc_traits::deallocate(__alloc(), __get_long_pointer(), 2300*480093f4SDimitry Andric __get_long_cap()); 2301*480093f4SDimitry Andric#if _LIBCPP_STD_VER <= 14 2302*480093f4SDimitry Andric if (!is_nothrow_move_assignable<allocator_type>::value) { 2303*480093f4SDimitry Andric __set_short_size(0); 2304*480093f4SDimitry Andric traits_type::assign(__get_short_pointer()[0], value_type()); 2305*480093f4SDimitry Andric } 2306*480093f4SDimitry Andric#endif 2307*480093f4SDimitry Andric } 23080b57cec5SDimitry Andric __move_assign_alloc(__str); 2309*480093f4SDimitry Andric __r_.first() = __str.__r_.first(); 2310*480093f4SDimitry Andric __str.__set_short_size(0); 2311*480093f4SDimitry Andric traits_type::assign(__str.__get_short_pointer()[0], value_type()); 23120b57cec5SDimitry Andric} 23130b57cec5SDimitry Andric 23140b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 23150b57cec5SDimitry Andricinline 23160b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 23170b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str) 23180b57cec5SDimitry Andric _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)) 23190b57cec5SDimitry Andric{ 23200b57cec5SDimitry Andric __move_assign(__str, integral_constant<bool, 23210b57cec5SDimitry Andric __alloc_traits::propagate_on_container_move_assignment::value>()); 23220b57cec5SDimitry Andric return *this; 23230b57cec5SDimitry Andric} 23240b57cec5SDimitry Andric 23250b57cec5SDimitry Andric#endif 23260b57cec5SDimitry Andric 23270b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 23280b57cec5SDimitry Andrictemplate<class _InputIterator> 23290b57cec5SDimitry Andrictypename enable_if 23300b57cec5SDimitry Andric< 2331*480093f4SDimitry Andric __is_exactly_cpp17_input_iterator <_InputIterator>::value 23320b57cec5SDimitry Andric || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, 23330b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& 23340b57cec5SDimitry Andric>::type 23350b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last) 23360b57cec5SDimitry Andric{ 23370b57cec5SDimitry Andric const basic_string __temp(__first, __last, __alloc()); 23380b57cec5SDimitry Andric assign(__temp.data(), __temp.size()); 23390b57cec5SDimitry Andric return *this; 23400b57cec5SDimitry Andric} 23410b57cec5SDimitry Andric 23420b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 23430b57cec5SDimitry Andrictemplate<class _ForwardIterator> 23440b57cec5SDimitry Andrictypename enable_if 23450b57cec5SDimitry Andric< 2346*480093f4SDimitry Andric __is_cpp17_forward_iterator<_ForwardIterator>::value 23470b57cec5SDimitry Andric && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, 23480b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& 23490b57cec5SDimitry Andric>::type 23500b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) 23510b57cec5SDimitry Andric{ 23520b57cec5SDimitry Andric size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 23530b57cec5SDimitry Andric size_type __cap = capacity(); 23540b57cec5SDimitry Andric if (__cap < __n) 23550b57cec5SDimitry Andric { 23560b57cec5SDimitry Andric size_type __sz = size(); 23570b57cec5SDimitry Andric __grow_by(__cap, __n - __cap, __sz, 0, __sz); 23580b57cec5SDimitry Andric } 23590b57cec5SDimitry Andric else 23600b57cec5SDimitry Andric __invalidate_iterators_past(__n); 23610b57cec5SDimitry Andric pointer __p = __get_pointer(); 23620b57cec5SDimitry Andric for (; __first != __last; ++__first, ++__p) 23630b57cec5SDimitry Andric traits_type::assign(*__p, *__first); 23640b57cec5SDimitry Andric traits_type::assign(*__p, value_type()); 23650b57cec5SDimitry Andric __set_size(__n); 23660b57cec5SDimitry Andric return *this; 23670b57cec5SDimitry Andric} 23680b57cec5SDimitry Andric 23690b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 23700b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 23710b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n) 23720b57cec5SDimitry Andric{ 23730b57cec5SDimitry Andric size_type __sz = __str.size(); 23740b57cec5SDimitry Andric if (__pos > __sz) 23750b57cec5SDimitry Andric this->__throw_out_of_range(); 23760b57cec5SDimitry Andric return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos)); 23770b57cec5SDimitry Andric} 23780b57cec5SDimitry Andric 23790b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 23800b57cec5SDimitry Andrictemplate <class _Tp> 23810b57cec5SDimitry Andrictypename enable_if 23820b57cec5SDimitry Andric< 23830b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 23840b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& 23850b57cec5SDimitry Andric>::type 23860b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(const _Tp & __t, size_type __pos, size_type __n) 23870b57cec5SDimitry Andric{ 23880b57cec5SDimitry Andric __self_view __sv = __t; 23890b57cec5SDimitry Andric size_type __sz = __sv.size(); 23900b57cec5SDimitry Andric if (__pos > __sz) 23910b57cec5SDimitry Andric this->__throw_out_of_range(); 23920b57cec5SDimitry Andric return assign(__sv.data() + __pos, _VSTD::min(__n, __sz - __pos)); 23930b57cec5SDimitry Andric} 23940b57cec5SDimitry Andric 23950b57cec5SDimitry Andric 23960b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 23970b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 23980b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s) 23990b57cec5SDimitry Andric{ 24000b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr"); 24010b57cec5SDimitry Andric return assign(__s, traits_type::length(__s)); 24020b57cec5SDimitry Andric} 24030b57cec5SDimitry Andric 24040b57cec5SDimitry Andric// append 24050b57cec5SDimitry Andric 24060b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 24070b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 24080b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n) 24090b57cec5SDimitry Andric{ 24100b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr"); 24110b57cec5SDimitry Andric size_type __cap = capacity(); 24120b57cec5SDimitry Andric size_type __sz = size(); 24130b57cec5SDimitry Andric if (__cap - __sz >= __n) 24140b57cec5SDimitry Andric { 24150b57cec5SDimitry Andric if (__n) 24160b57cec5SDimitry Andric { 2417*480093f4SDimitry Andric value_type* __p = _VSTD::__to_address(__get_pointer()); 24180b57cec5SDimitry Andric traits_type::copy(__p + __sz, __s, __n); 24190b57cec5SDimitry Andric __sz += __n; 24200b57cec5SDimitry Andric __set_size(__sz); 24210b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 24220b57cec5SDimitry Andric } 24230b57cec5SDimitry Andric } 24240b57cec5SDimitry Andric else 24250b57cec5SDimitry Andric __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s); 24260b57cec5SDimitry Andric return *this; 24270b57cec5SDimitry Andric} 24280b57cec5SDimitry Andric 24290b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 24300b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 24310b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c) 24320b57cec5SDimitry Andric{ 24330b57cec5SDimitry Andric if (__n) 24340b57cec5SDimitry Andric { 24350b57cec5SDimitry Andric size_type __cap = capacity(); 24360b57cec5SDimitry Andric size_type __sz = size(); 24370b57cec5SDimitry Andric if (__cap - __sz < __n) 24380b57cec5SDimitry Andric __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0); 24390b57cec5SDimitry Andric pointer __p = __get_pointer(); 2440*480093f4SDimitry Andric traits_type::assign(_VSTD::__to_address(__p) + __sz, __n, __c); 24410b57cec5SDimitry Andric __sz += __n; 24420b57cec5SDimitry Andric __set_size(__sz); 24430b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 24440b57cec5SDimitry Andric } 24450b57cec5SDimitry Andric return *this; 24460b57cec5SDimitry Andric} 24470b57cec5SDimitry Andric 24480b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 24490b57cec5SDimitry Andricinline void 24500b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__append_default_init(size_type __n) 24510b57cec5SDimitry Andric{ 24520b57cec5SDimitry Andric if (__n) 24530b57cec5SDimitry Andric { 24540b57cec5SDimitry Andric size_type __cap = capacity(); 24550b57cec5SDimitry Andric size_type __sz = size(); 24560b57cec5SDimitry Andric if (__cap - __sz < __n) 24570b57cec5SDimitry Andric __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0); 24580b57cec5SDimitry Andric pointer __p = __get_pointer(); 24590b57cec5SDimitry Andric __sz += __n; 24600b57cec5SDimitry Andric __set_size(__sz); 24610b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 24620b57cec5SDimitry Andric } 24630b57cec5SDimitry Andric} 24640b57cec5SDimitry Andric 24650b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 24660b57cec5SDimitry Andricvoid 24670b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c) 24680b57cec5SDimitry Andric{ 24690b57cec5SDimitry Andric bool __is_short = !__is_long(); 24700b57cec5SDimitry Andric size_type __cap; 24710b57cec5SDimitry Andric size_type __sz; 24720b57cec5SDimitry Andric if (__is_short) 24730b57cec5SDimitry Andric { 24740b57cec5SDimitry Andric __cap = __min_cap - 1; 24750b57cec5SDimitry Andric __sz = __get_short_size(); 24760b57cec5SDimitry Andric } 24770b57cec5SDimitry Andric else 24780b57cec5SDimitry Andric { 24790b57cec5SDimitry Andric __cap = __get_long_cap() - 1; 24800b57cec5SDimitry Andric __sz = __get_long_size(); 24810b57cec5SDimitry Andric } 24820b57cec5SDimitry Andric if (__sz == __cap) 24830b57cec5SDimitry Andric { 24840b57cec5SDimitry Andric __grow_by(__cap, 1, __sz, __sz, 0); 24850b57cec5SDimitry Andric __is_short = !__is_long(); 24860b57cec5SDimitry Andric } 24870b57cec5SDimitry Andric pointer __p; 24880b57cec5SDimitry Andric if (__is_short) 24890b57cec5SDimitry Andric { 24900b57cec5SDimitry Andric __p = __get_short_pointer() + __sz; 24910b57cec5SDimitry Andric __set_short_size(__sz+1); 24920b57cec5SDimitry Andric } 24930b57cec5SDimitry Andric else 24940b57cec5SDimitry Andric { 24950b57cec5SDimitry Andric __p = __get_long_pointer() + __sz; 24960b57cec5SDimitry Andric __set_long_size(__sz+1); 24970b57cec5SDimitry Andric } 24980b57cec5SDimitry Andric traits_type::assign(*__p, __c); 24990b57cec5SDimitry Andric traits_type::assign(*++__p, value_type()); 25000b57cec5SDimitry Andric} 25010b57cec5SDimitry Andric 25020b57cec5SDimitry Andrictemplate <class _Tp> 25030b57cec5SDimitry Andricbool __ptr_in_range (const _Tp* __p, const _Tp* __first, const _Tp* __last) 25040b57cec5SDimitry Andric{ 25050b57cec5SDimitry Andric return __first <= __p && __p < __last; 25060b57cec5SDimitry Andric} 25070b57cec5SDimitry Andric 25080b57cec5SDimitry Andrictemplate <class _Tp1, class _Tp2> 25090b57cec5SDimitry Andricbool __ptr_in_range (const _Tp1*, const _Tp2*, const _Tp2*) 25100b57cec5SDimitry Andric{ 25110b57cec5SDimitry Andric return false; 25120b57cec5SDimitry Andric} 25130b57cec5SDimitry Andric 25140b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 25150b57cec5SDimitry Andrictemplate<class _ForwardIterator> 25160b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 25170b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__append_forward_unsafe( 25180b57cec5SDimitry Andric _ForwardIterator __first, _ForwardIterator __last) 25190b57cec5SDimitry Andric{ 2520*480093f4SDimitry Andric static_assert(__is_cpp17_forward_iterator<_ForwardIterator>::value, 25210b57cec5SDimitry Andric "function requires a ForwardIterator"); 25220b57cec5SDimitry Andric size_type __sz = size(); 25230b57cec5SDimitry Andric size_type __cap = capacity(); 25240b57cec5SDimitry Andric size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 25250b57cec5SDimitry Andric if (__n) 25260b57cec5SDimitry Andric { 25270b57cec5SDimitry Andric typedef typename iterator_traits<_ForwardIterator>::reference _CharRef; 25280b57cec5SDimitry Andric _CharRef __tmp_ref = *__first; 25290b57cec5SDimitry Andric if (__ptr_in_range(_VSTD::addressof(__tmp_ref), data(), data() + size())) 25300b57cec5SDimitry Andric { 25310b57cec5SDimitry Andric const basic_string __temp (__first, __last, __alloc()); 25320b57cec5SDimitry Andric append(__temp.data(), __temp.size()); 25330b57cec5SDimitry Andric } 25340b57cec5SDimitry Andric else 25350b57cec5SDimitry Andric { 25360b57cec5SDimitry Andric if (__cap - __sz < __n) 25370b57cec5SDimitry Andric __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0); 25380b57cec5SDimitry Andric pointer __p = __get_pointer() + __sz; 25390b57cec5SDimitry Andric for (; __first != __last; ++__p, ++__first) 25400b57cec5SDimitry Andric traits_type::assign(*__p, *__first); 25410b57cec5SDimitry Andric traits_type::assign(*__p, value_type()); 25420b57cec5SDimitry Andric __set_size(__sz + __n); 25430b57cec5SDimitry Andric } 25440b57cec5SDimitry Andric } 25450b57cec5SDimitry Andric return *this; 25460b57cec5SDimitry Andric} 25470b57cec5SDimitry Andric 25480b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 25490b57cec5SDimitry Andricinline 25500b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 25510b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str) 25520b57cec5SDimitry Andric{ 25530b57cec5SDimitry Andric return append(__str.data(), __str.size()); 25540b57cec5SDimitry Andric} 25550b57cec5SDimitry Andric 25560b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 25570b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 25580b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n) 25590b57cec5SDimitry Andric{ 25600b57cec5SDimitry Andric size_type __sz = __str.size(); 25610b57cec5SDimitry Andric if (__pos > __sz) 25620b57cec5SDimitry Andric this->__throw_out_of_range(); 25630b57cec5SDimitry Andric return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos)); 25640b57cec5SDimitry Andric} 25650b57cec5SDimitry Andric 25660b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 25670b57cec5SDimitry Andrictemplate <class _Tp> 25680b57cec5SDimitry Andric typename enable_if 25690b57cec5SDimitry Andric < 25700b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 25710b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& 25720b57cec5SDimitry Andric >::type 25730b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const _Tp & __t, size_type __pos, size_type __n) 25740b57cec5SDimitry Andric{ 25750b57cec5SDimitry Andric __self_view __sv = __t; 25760b57cec5SDimitry Andric size_type __sz = __sv.size(); 25770b57cec5SDimitry Andric if (__pos > __sz) 25780b57cec5SDimitry Andric this->__throw_out_of_range(); 25790b57cec5SDimitry Andric return append(__sv.data() + __pos, _VSTD::min(__n, __sz - __pos)); 25800b57cec5SDimitry Andric} 25810b57cec5SDimitry Andric 25820b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 25830b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 25840b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s) 25850b57cec5SDimitry Andric{ 25860b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr"); 25870b57cec5SDimitry Andric return append(__s, traits_type::length(__s)); 25880b57cec5SDimitry Andric} 25890b57cec5SDimitry Andric 25900b57cec5SDimitry Andric// insert 25910b57cec5SDimitry Andric 25920b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 25930b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 25940b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n) 25950b57cec5SDimitry Andric{ 25960b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr"); 25970b57cec5SDimitry Andric size_type __sz = size(); 25980b57cec5SDimitry Andric if (__pos > __sz) 25990b57cec5SDimitry Andric this->__throw_out_of_range(); 26000b57cec5SDimitry Andric size_type __cap = capacity(); 26010b57cec5SDimitry Andric if (__cap - __sz >= __n) 26020b57cec5SDimitry Andric { 26030b57cec5SDimitry Andric if (__n) 26040b57cec5SDimitry Andric { 2605*480093f4SDimitry Andric value_type* __p = _VSTD::__to_address(__get_pointer()); 26060b57cec5SDimitry Andric size_type __n_move = __sz - __pos; 26070b57cec5SDimitry Andric if (__n_move != 0) 26080b57cec5SDimitry Andric { 26090b57cec5SDimitry Andric if (__p + __pos <= __s && __s < __p + __sz) 26100b57cec5SDimitry Andric __s += __n; 26110b57cec5SDimitry Andric traits_type::move(__p + __pos + __n, __p + __pos, __n_move); 26120b57cec5SDimitry Andric } 26130b57cec5SDimitry Andric traits_type::move(__p + __pos, __s, __n); 26140b57cec5SDimitry Andric __sz += __n; 26150b57cec5SDimitry Andric __set_size(__sz); 26160b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 26170b57cec5SDimitry Andric } 26180b57cec5SDimitry Andric } 26190b57cec5SDimitry Andric else 26200b57cec5SDimitry Andric __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s); 26210b57cec5SDimitry Andric return *this; 26220b57cec5SDimitry Andric} 26230b57cec5SDimitry Andric 26240b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 26250b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 26260b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c) 26270b57cec5SDimitry Andric{ 26280b57cec5SDimitry Andric size_type __sz = size(); 26290b57cec5SDimitry Andric if (__pos > __sz) 26300b57cec5SDimitry Andric this->__throw_out_of_range(); 26310b57cec5SDimitry Andric if (__n) 26320b57cec5SDimitry Andric { 26330b57cec5SDimitry Andric size_type __cap = capacity(); 26340b57cec5SDimitry Andric value_type* __p; 26350b57cec5SDimitry Andric if (__cap - __sz >= __n) 26360b57cec5SDimitry Andric { 2637*480093f4SDimitry Andric __p = _VSTD::__to_address(__get_pointer()); 26380b57cec5SDimitry Andric size_type __n_move = __sz - __pos; 26390b57cec5SDimitry Andric if (__n_move != 0) 26400b57cec5SDimitry Andric traits_type::move(__p + __pos + __n, __p + __pos, __n_move); 26410b57cec5SDimitry Andric } 26420b57cec5SDimitry Andric else 26430b57cec5SDimitry Andric { 26440b57cec5SDimitry Andric __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n); 2645*480093f4SDimitry Andric __p = _VSTD::__to_address(__get_long_pointer()); 26460b57cec5SDimitry Andric } 26470b57cec5SDimitry Andric traits_type::assign(__p + __pos, __n, __c); 26480b57cec5SDimitry Andric __sz += __n; 26490b57cec5SDimitry Andric __set_size(__sz); 26500b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 26510b57cec5SDimitry Andric } 26520b57cec5SDimitry Andric return *this; 26530b57cec5SDimitry Andric} 26540b57cec5SDimitry Andric 26550b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 26560b57cec5SDimitry Andrictemplate<class _InputIterator> 26570b57cec5SDimitry Andrictypename enable_if 26580b57cec5SDimitry Andric< 2659*480093f4SDimitry Andric __is_exactly_cpp17_input_iterator<_InputIterator>::value 26600b57cec5SDimitry Andric || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, 26610b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::iterator 26620b57cec5SDimitry Andric>::type 26630b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last) 26640b57cec5SDimitry Andric{ 26650b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 26660b57cec5SDimitry Andric _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this, 26670b57cec5SDimitry Andric "string::insert(iterator, range) called with an iterator not" 26680b57cec5SDimitry Andric " referring to this string"); 26690b57cec5SDimitry Andric#endif 26700b57cec5SDimitry Andric const basic_string __temp(__first, __last, __alloc()); 26710b57cec5SDimitry Andric return insert(__pos, __temp.data(), __temp.data() + __temp.size()); 26720b57cec5SDimitry Andric} 26730b57cec5SDimitry Andric 26740b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 26750b57cec5SDimitry Andrictemplate<class _ForwardIterator> 26760b57cec5SDimitry Andrictypename enable_if 26770b57cec5SDimitry Andric< 2678*480093f4SDimitry Andric __is_cpp17_forward_iterator<_ForwardIterator>::value 26790b57cec5SDimitry Andric && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, 26800b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::iterator 26810b57cec5SDimitry Andric>::type 26820b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last) 26830b57cec5SDimitry Andric{ 26840b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 26850b57cec5SDimitry Andric _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this, 26860b57cec5SDimitry Andric "string::insert(iterator, range) called with an iterator not" 26870b57cec5SDimitry Andric " referring to this string"); 26880b57cec5SDimitry Andric#endif 26890b57cec5SDimitry Andric size_type __ip = static_cast<size_type>(__pos - begin()); 26900b57cec5SDimitry Andric size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 26910b57cec5SDimitry Andric if (__n) 26920b57cec5SDimitry Andric { 26930b57cec5SDimitry Andric typedef typename iterator_traits<_ForwardIterator>::reference _CharRef; 26940b57cec5SDimitry Andric _CharRef __tmp_char = *__first; 26950b57cec5SDimitry Andric if (__ptr_in_range(_VSTD::addressof(__tmp_char), data(), data() + size())) 26960b57cec5SDimitry Andric { 26970b57cec5SDimitry Andric const basic_string __temp(__first, __last, __alloc()); 26980b57cec5SDimitry Andric return insert(__pos, __temp.data(), __temp.data() + __temp.size()); 26990b57cec5SDimitry Andric } 27000b57cec5SDimitry Andric 27010b57cec5SDimitry Andric size_type __sz = size(); 27020b57cec5SDimitry Andric size_type __cap = capacity(); 27030b57cec5SDimitry Andric value_type* __p; 27040b57cec5SDimitry Andric if (__cap - __sz >= __n) 27050b57cec5SDimitry Andric { 2706*480093f4SDimitry Andric __p = _VSTD::__to_address(__get_pointer()); 27070b57cec5SDimitry Andric size_type __n_move = __sz - __ip; 27080b57cec5SDimitry Andric if (__n_move != 0) 27090b57cec5SDimitry Andric traits_type::move(__p + __ip + __n, __p + __ip, __n_move); 27100b57cec5SDimitry Andric } 27110b57cec5SDimitry Andric else 27120b57cec5SDimitry Andric { 27130b57cec5SDimitry Andric __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n); 2714*480093f4SDimitry Andric __p = _VSTD::__to_address(__get_long_pointer()); 27150b57cec5SDimitry Andric } 27160b57cec5SDimitry Andric __sz += __n; 27170b57cec5SDimitry Andric __set_size(__sz); 27180b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 27190b57cec5SDimitry Andric for (__p += __ip; __first != __last; ++__p, ++__first) 27200b57cec5SDimitry Andric traits_type::assign(*__p, *__first); 27210b57cec5SDimitry Andric } 27220b57cec5SDimitry Andric return begin() + __ip; 27230b57cec5SDimitry Andric} 27240b57cec5SDimitry Andric 27250b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 27260b57cec5SDimitry Andricinline 27270b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 27280b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str) 27290b57cec5SDimitry Andric{ 27300b57cec5SDimitry Andric return insert(__pos1, __str.data(), __str.size()); 27310b57cec5SDimitry Andric} 27320b57cec5SDimitry Andric 27330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 27340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 27350b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str, 27360b57cec5SDimitry Andric size_type __pos2, size_type __n) 27370b57cec5SDimitry Andric{ 27380b57cec5SDimitry Andric size_type __str_sz = __str.size(); 27390b57cec5SDimitry Andric if (__pos2 > __str_sz) 27400b57cec5SDimitry Andric this->__throw_out_of_range(); 27410b57cec5SDimitry Andric return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2)); 27420b57cec5SDimitry Andric} 27430b57cec5SDimitry Andric 27440b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 27450b57cec5SDimitry Andrictemplate <class _Tp> 27460b57cec5SDimitry Andrictypename enable_if 27470b57cec5SDimitry Andric< 27480b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 27490b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& 27500b57cec5SDimitry Andric>::type 27510b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const _Tp& __t, 27520b57cec5SDimitry Andric size_type __pos2, size_type __n) 27530b57cec5SDimitry Andric{ 27540b57cec5SDimitry Andric __self_view __sv = __t; 27550b57cec5SDimitry Andric size_type __str_sz = __sv.size(); 27560b57cec5SDimitry Andric if (__pos2 > __str_sz) 27570b57cec5SDimitry Andric this->__throw_out_of_range(); 27580b57cec5SDimitry Andric return insert(__pos1, __sv.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2)); 27590b57cec5SDimitry Andric} 27600b57cec5SDimitry Andric 27610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 27620b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 27630b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s) 27640b57cec5SDimitry Andric{ 27650b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr"); 27660b57cec5SDimitry Andric return insert(__pos, __s, traits_type::length(__s)); 27670b57cec5SDimitry Andric} 27680b57cec5SDimitry Andric 27690b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 27700b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::iterator 27710b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c) 27720b57cec5SDimitry Andric{ 27730b57cec5SDimitry Andric size_type __ip = static_cast<size_type>(__pos - begin()); 27740b57cec5SDimitry Andric size_type __sz = size(); 27750b57cec5SDimitry Andric size_type __cap = capacity(); 27760b57cec5SDimitry Andric value_type* __p; 27770b57cec5SDimitry Andric if (__cap == __sz) 27780b57cec5SDimitry Andric { 27790b57cec5SDimitry Andric __grow_by(__cap, 1, __sz, __ip, 0, 1); 2780*480093f4SDimitry Andric __p = _VSTD::__to_address(__get_long_pointer()); 27810b57cec5SDimitry Andric } 27820b57cec5SDimitry Andric else 27830b57cec5SDimitry Andric { 2784*480093f4SDimitry Andric __p = _VSTD::__to_address(__get_pointer()); 27850b57cec5SDimitry Andric size_type __n_move = __sz - __ip; 27860b57cec5SDimitry Andric if (__n_move != 0) 27870b57cec5SDimitry Andric traits_type::move(__p + __ip + 1, __p + __ip, __n_move); 27880b57cec5SDimitry Andric } 27890b57cec5SDimitry Andric traits_type::assign(__p[__ip], __c); 27900b57cec5SDimitry Andric traits_type::assign(__p[++__sz], value_type()); 27910b57cec5SDimitry Andric __set_size(__sz); 27920b57cec5SDimitry Andric return begin() + static_cast<difference_type>(__ip); 27930b57cec5SDimitry Andric} 27940b57cec5SDimitry Andric 27950b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 27960b57cec5SDimitry Andricinline 27970b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::iterator 27980b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c) 27990b57cec5SDimitry Andric{ 28000b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 28010b57cec5SDimitry Andric _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this, 28020b57cec5SDimitry Andric "string::insert(iterator, n, value) called with an iterator not" 28030b57cec5SDimitry Andric " referring to this string"); 28040b57cec5SDimitry Andric#endif 28050b57cec5SDimitry Andric difference_type __p = __pos - begin(); 28060b57cec5SDimitry Andric insert(static_cast<size_type>(__p), __n, __c); 28070b57cec5SDimitry Andric return begin() + __p; 28080b57cec5SDimitry Andric} 28090b57cec5SDimitry Andric 28100b57cec5SDimitry Andric// replace 28110b57cec5SDimitry Andric 28120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 28130b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 28140b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2) 28150b57cec5SDimitry Andric _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 28160b57cec5SDimitry Andric{ 28170b57cec5SDimitry Andric _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr"); 28180b57cec5SDimitry Andric size_type __sz = size(); 28190b57cec5SDimitry Andric if (__pos > __sz) 28200b57cec5SDimitry Andric this->__throw_out_of_range(); 28210b57cec5SDimitry Andric __n1 = _VSTD::min(__n1, __sz - __pos); 28220b57cec5SDimitry Andric size_type __cap = capacity(); 28230b57cec5SDimitry Andric if (__cap - __sz + __n1 >= __n2) 28240b57cec5SDimitry Andric { 2825*480093f4SDimitry Andric value_type* __p = _VSTD::__to_address(__get_pointer()); 28260b57cec5SDimitry Andric if (__n1 != __n2) 28270b57cec5SDimitry Andric { 28280b57cec5SDimitry Andric size_type __n_move = __sz - __pos - __n1; 28290b57cec5SDimitry Andric if (__n_move != 0) 28300b57cec5SDimitry Andric { 28310b57cec5SDimitry Andric if (__n1 > __n2) 28320b57cec5SDimitry Andric { 28330b57cec5SDimitry Andric traits_type::move(__p + __pos, __s, __n2); 28340b57cec5SDimitry Andric traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move); 28350b57cec5SDimitry Andric goto __finish; 28360b57cec5SDimitry Andric } 28370b57cec5SDimitry Andric if (__p + __pos < __s && __s < __p + __sz) 28380b57cec5SDimitry Andric { 28390b57cec5SDimitry Andric if (__p + __pos + __n1 <= __s) 28400b57cec5SDimitry Andric __s += __n2 - __n1; 28410b57cec5SDimitry Andric else // __p + __pos < __s < __p + __pos + __n1 28420b57cec5SDimitry Andric { 28430b57cec5SDimitry Andric traits_type::move(__p + __pos, __s, __n1); 28440b57cec5SDimitry Andric __pos += __n1; 28450b57cec5SDimitry Andric __s += __n2; 28460b57cec5SDimitry Andric __n2 -= __n1; 28470b57cec5SDimitry Andric __n1 = 0; 28480b57cec5SDimitry Andric } 28490b57cec5SDimitry Andric } 28500b57cec5SDimitry Andric traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move); 28510b57cec5SDimitry Andric } 28520b57cec5SDimitry Andric } 28530b57cec5SDimitry Andric traits_type::move(__p + __pos, __s, __n2); 28540b57cec5SDimitry Andric__finish: 28550b57cec5SDimitry Andric// __sz += __n2 - __n1; in this and the below function below can cause unsigned integer overflow, 28560b57cec5SDimitry Andric// but this is a safe operation, so we disable the check. 28570b57cec5SDimitry Andric __sz += __n2 - __n1; 28580b57cec5SDimitry Andric __set_size(__sz); 28590b57cec5SDimitry Andric __invalidate_iterators_past(__sz); 28600b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 28610b57cec5SDimitry Andric } 28620b57cec5SDimitry Andric else 28630b57cec5SDimitry Andric __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s); 28640b57cec5SDimitry Andric return *this; 28650b57cec5SDimitry Andric} 28660b57cec5SDimitry Andric 28670b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 28680b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 28690b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c) 28700b57cec5SDimitry Andric _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 28710b57cec5SDimitry Andric{ 28720b57cec5SDimitry Andric size_type __sz = size(); 28730b57cec5SDimitry Andric if (__pos > __sz) 28740b57cec5SDimitry Andric this->__throw_out_of_range(); 28750b57cec5SDimitry Andric __n1 = _VSTD::min(__n1, __sz - __pos); 28760b57cec5SDimitry Andric size_type __cap = capacity(); 28770b57cec5SDimitry Andric value_type* __p; 28780b57cec5SDimitry Andric if (__cap - __sz + __n1 >= __n2) 28790b57cec5SDimitry Andric { 2880*480093f4SDimitry Andric __p = _VSTD::__to_address(__get_pointer()); 28810b57cec5SDimitry Andric if (__n1 != __n2) 28820b57cec5SDimitry Andric { 28830b57cec5SDimitry Andric size_type __n_move = __sz - __pos - __n1; 28840b57cec5SDimitry Andric if (__n_move != 0) 28850b57cec5SDimitry Andric traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move); 28860b57cec5SDimitry Andric } 28870b57cec5SDimitry Andric } 28880b57cec5SDimitry Andric else 28890b57cec5SDimitry Andric { 28900b57cec5SDimitry Andric __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2); 2891*480093f4SDimitry Andric __p = _VSTD::__to_address(__get_long_pointer()); 28920b57cec5SDimitry Andric } 28930b57cec5SDimitry Andric traits_type::assign(__p + __pos, __n2, __c); 28940b57cec5SDimitry Andric __sz += __n2 - __n1; 28950b57cec5SDimitry Andric __set_size(__sz); 28960b57cec5SDimitry Andric __invalidate_iterators_past(__sz); 28970b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 28980b57cec5SDimitry Andric return *this; 28990b57cec5SDimitry Andric} 29000b57cec5SDimitry Andric 29010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29020b57cec5SDimitry Andrictemplate<class _InputIterator> 29030b57cec5SDimitry Andrictypename enable_if 29040b57cec5SDimitry Andric< 2905*480093f4SDimitry Andric __is_cpp17_input_iterator<_InputIterator>::value, 29060b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& 29070b57cec5SDimitry Andric>::type 29080b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, 29090b57cec5SDimitry Andric _InputIterator __j1, _InputIterator __j2) 29100b57cec5SDimitry Andric{ 29110b57cec5SDimitry Andric const basic_string __temp(__j1, __j2, __alloc()); 29120b57cec5SDimitry Andric return this->replace(__i1, __i2, __temp); 29130b57cec5SDimitry Andric} 29140b57cec5SDimitry Andric 29150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29160b57cec5SDimitry Andricinline 29170b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 29180b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str) 29190b57cec5SDimitry Andric{ 29200b57cec5SDimitry Andric return replace(__pos1, __n1, __str.data(), __str.size()); 29210b57cec5SDimitry Andric} 29220b57cec5SDimitry Andric 29230b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29240b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 29250b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str, 29260b57cec5SDimitry Andric size_type __pos2, size_type __n2) 29270b57cec5SDimitry Andric{ 29280b57cec5SDimitry Andric size_type __str_sz = __str.size(); 29290b57cec5SDimitry Andric if (__pos2 > __str_sz) 29300b57cec5SDimitry Andric this->__throw_out_of_range(); 29310b57cec5SDimitry Andric return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2)); 29320b57cec5SDimitry Andric} 29330b57cec5SDimitry Andric 29340b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29350b57cec5SDimitry Andrictemplate <class _Tp> 29360b57cec5SDimitry Andrictypename enable_if 29370b57cec5SDimitry Andric< 29380b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 29390b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& 29400b57cec5SDimitry Andric>::type 29410b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const _Tp& __t, 29420b57cec5SDimitry Andric size_type __pos2, size_type __n2) 29430b57cec5SDimitry Andric{ 29440b57cec5SDimitry Andric __self_view __sv = __t; 29450b57cec5SDimitry Andric size_type __str_sz = __sv.size(); 29460b57cec5SDimitry Andric if (__pos2 > __str_sz) 29470b57cec5SDimitry Andric this->__throw_out_of_range(); 29480b57cec5SDimitry Andric return replace(__pos1, __n1, __sv.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2)); 29490b57cec5SDimitry Andric} 29500b57cec5SDimitry Andric 29510b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29520b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 29530b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s) 29540b57cec5SDimitry Andric{ 29550b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr"); 29560b57cec5SDimitry Andric return replace(__pos, __n1, __s, traits_type::length(__s)); 29570b57cec5SDimitry Andric} 29580b57cec5SDimitry Andric 29590b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29600b57cec5SDimitry Andricinline 29610b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 29620b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str) 29630b57cec5SDimitry Andric{ 29640b57cec5SDimitry Andric return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), 29650b57cec5SDimitry Andric __str.data(), __str.size()); 29660b57cec5SDimitry Andric} 29670b57cec5SDimitry Andric 29680b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29690b57cec5SDimitry Andricinline 29700b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 29710b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n) 29720b57cec5SDimitry Andric{ 29730b57cec5SDimitry Andric return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n); 29740b57cec5SDimitry Andric} 29750b57cec5SDimitry Andric 29760b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29770b57cec5SDimitry Andricinline 29780b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 29790b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s) 29800b57cec5SDimitry Andric{ 29810b57cec5SDimitry Andric return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s); 29820b57cec5SDimitry Andric} 29830b57cec5SDimitry Andric 29840b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29850b57cec5SDimitry Andricinline 29860b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 29870b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c) 29880b57cec5SDimitry Andric{ 29890b57cec5SDimitry Andric return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c); 29900b57cec5SDimitry Andric} 29910b57cec5SDimitry Andric 29920b57cec5SDimitry Andric// erase 29930b57cec5SDimitry Andric 29940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 29950b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>& 29960b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n) 29970b57cec5SDimitry Andric{ 29980b57cec5SDimitry Andric size_type __sz = size(); 29990b57cec5SDimitry Andric if (__pos > __sz) 30000b57cec5SDimitry Andric this->__throw_out_of_range(); 30010b57cec5SDimitry Andric if (__n) 30020b57cec5SDimitry Andric { 3003*480093f4SDimitry Andric value_type* __p = _VSTD::__to_address(__get_pointer()); 30040b57cec5SDimitry Andric __n = _VSTD::min(__n, __sz - __pos); 30050b57cec5SDimitry Andric size_type __n_move = __sz - __pos - __n; 30060b57cec5SDimitry Andric if (__n_move != 0) 30070b57cec5SDimitry Andric traits_type::move(__p + __pos, __p + __pos + __n, __n_move); 30080b57cec5SDimitry Andric __sz -= __n; 30090b57cec5SDimitry Andric __set_size(__sz); 30100b57cec5SDimitry Andric __invalidate_iterators_past(__sz); 30110b57cec5SDimitry Andric traits_type::assign(__p[__sz], value_type()); 30120b57cec5SDimitry Andric } 30130b57cec5SDimitry Andric return *this; 30140b57cec5SDimitry Andric} 30150b57cec5SDimitry Andric 30160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 30170b57cec5SDimitry Andricinline 30180b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::iterator 30190b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos) 30200b57cec5SDimitry Andric{ 30210b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 30220b57cec5SDimitry Andric _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this, 30230b57cec5SDimitry Andric "string::erase(iterator) called with an iterator not" 30240b57cec5SDimitry Andric " referring to this string"); 30250b57cec5SDimitry Andric#endif 30260b57cec5SDimitry Andric _LIBCPP_ASSERT(__pos != end(), 30270b57cec5SDimitry Andric "string::erase(iterator) called with a non-dereferenceable iterator"); 30280b57cec5SDimitry Andric iterator __b = begin(); 30290b57cec5SDimitry Andric size_type __r = static_cast<size_type>(__pos - __b); 30300b57cec5SDimitry Andric erase(__r, 1); 30310b57cec5SDimitry Andric return __b + static_cast<difference_type>(__r); 30320b57cec5SDimitry Andric} 30330b57cec5SDimitry Andric 30340b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 30350b57cec5SDimitry Andricinline 30360b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::iterator 30370b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last) 30380b57cec5SDimitry Andric{ 30390b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 30400b57cec5SDimitry Andric _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this, 30410b57cec5SDimitry Andric "string::erase(iterator, iterator) called with an iterator not" 30420b57cec5SDimitry Andric " referring to this string"); 30430b57cec5SDimitry Andric#endif 30440b57cec5SDimitry Andric _LIBCPP_ASSERT(__first <= __last, "string::erase(first, last) called with invalid range"); 30450b57cec5SDimitry Andric iterator __b = begin(); 30460b57cec5SDimitry Andric size_type __r = static_cast<size_type>(__first - __b); 30470b57cec5SDimitry Andric erase(__r, static_cast<size_type>(__last - __first)); 30480b57cec5SDimitry Andric return __b + static_cast<difference_type>(__r); 30490b57cec5SDimitry Andric} 30500b57cec5SDimitry Andric 30510b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 30520b57cec5SDimitry Andricinline 30530b57cec5SDimitry Andricvoid 30540b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::pop_back() 30550b57cec5SDimitry Andric{ 30560b57cec5SDimitry Andric _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty"); 30570b57cec5SDimitry Andric size_type __sz; 30580b57cec5SDimitry Andric if (__is_long()) 30590b57cec5SDimitry Andric { 30600b57cec5SDimitry Andric __sz = __get_long_size() - 1; 30610b57cec5SDimitry Andric __set_long_size(__sz); 30620b57cec5SDimitry Andric traits_type::assign(*(__get_long_pointer() + __sz), value_type()); 30630b57cec5SDimitry Andric } 30640b57cec5SDimitry Andric else 30650b57cec5SDimitry Andric { 30660b57cec5SDimitry Andric __sz = __get_short_size() - 1; 30670b57cec5SDimitry Andric __set_short_size(__sz); 30680b57cec5SDimitry Andric traits_type::assign(*(__get_short_pointer() + __sz), value_type()); 30690b57cec5SDimitry Andric } 30700b57cec5SDimitry Andric __invalidate_iterators_past(__sz); 30710b57cec5SDimitry Andric} 30720b57cec5SDimitry Andric 30730b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 30740b57cec5SDimitry Andricinline 30750b57cec5SDimitry Andricvoid 30760b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT 30770b57cec5SDimitry Andric{ 30780b57cec5SDimitry Andric __invalidate_all_iterators(); 30790b57cec5SDimitry Andric if (__is_long()) 30800b57cec5SDimitry Andric { 30810b57cec5SDimitry Andric traits_type::assign(*__get_long_pointer(), value_type()); 30820b57cec5SDimitry Andric __set_long_size(0); 30830b57cec5SDimitry Andric } 30840b57cec5SDimitry Andric else 30850b57cec5SDimitry Andric { 30860b57cec5SDimitry Andric traits_type::assign(*__get_short_pointer(), value_type()); 30870b57cec5SDimitry Andric __set_short_size(0); 30880b57cec5SDimitry Andric } 30890b57cec5SDimitry Andric} 30900b57cec5SDimitry Andric 30910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 30920b57cec5SDimitry Andricinline 30930b57cec5SDimitry Andricvoid 30940b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos) 30950b57cec5SDimitry Andric{ 30960b57cec5SDimitry Andric if (__is_long()) 30970b57cec5SDimitry Andric { 30980b57cec5SDimitry Andric traits_type::assign(*(__get_long_pointer() + __pos), value_type()); 30990b57cec5SDimitry Andric __set_long_size(__pos); 31000b57cec5SDimitry Andric } 31010b57cec5SDimitry Andric else 31020b57cec5SDimitry Andric { 31030b57cec5SDimitry Andric traits_type::assign(*(__get_short_pointer() + __pos), value_type()); 31040b57cec5SDimitry Andric __set_short_size(__pos); 31050b57cec5SDimitry Andric } 31060b57cec5SDimitry Andric __invalidate_iterators_past(__pos); 31070b57cec5SDimitry Andric} 31080b57cec5SDimitry Andric 31090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 31100b57cec5SDimitry Andricvoid 31110b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c) 31120b57cec5SDimitry Andric{ 31130b57cec5SDimitry Andric size_type __sz = size(); 31140b57cec5SDimitry Andric if (__n > __sz) 31150b57cec5SDimitry Andric append(__n - __sz, __c); 31160b57cec5SDimitry Andric else 31170b57cec5SDimitry Andric __erase_to_end(__n); 31180b57cec5SDimitry Andric} 31190b57cec5SDimitry Andric 31200b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 31210b57cec5SDimitry Andricinline void 31220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__resize_default_init(size_type __n) 31230b57cec5SDimitry Andric{ 31240b57cec5SDimitry Andric size_type __sz = size(); 31250b57cec5SDimitry Andric if (__n > __sz) { 31260b57cec5SDimitry Andric __append_default_init(__n - __sz); 31270b57cec5SDimitry Andric } else 31280b57cec5SDimitry Andric __erase_to_end(__n); 31290b57cec5SDimitry Andric} 31300b57cec5SDimitry Andric 31310b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 31320b57cec5SDimitry Andricinline 31330b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 31340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT 31350b57cec5SDimitry Andric{ 31360b57cec5SDimitry Andric size_type __m = __alloc_traits::max_size(__alloc()); 31370b57cec5SDimitry Andric#ifdef _LIBCPP_BIG_ENDIAN 31380b57cec5SDimitry Andric return (__m <= ~__long_mask ? __m : __m/2) - __alignment; 31390b57cec5SDimitry Andric#else 31400b57cec5SDimitry Andric return __m - __alignment; 31410b57cec5SDimitry Andric#endif 31420b57cec5SDimitry Andric} 31430b57cec5SDimitry Andric 31440b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 31450b57cec5SDimitry Andricvoid 31460b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg) 31470b57cec5SDimitry Andric{ 31480b57cec5SDimitry Andric if (__res_arg > max_size()) 31490b57cec5SDimitry Andric this->__throw_length_error(); 31500b57cec5SDimitry Andric size_type __cap = capacity(); 31510b57cec5SDimitry Andric size_type __sz = size(); 31520b57cec5SDimitry Andric __res_arg = _VSTD::max(__res_arg, __sz); 31530b57cec5SDimitry Andric __res_arg = __recommend(__res_arg); 31540b57cec5SDimitry Andric if (__res_arg != __cap) 31550b57cec5SDimitry Andric { 31560b57cec5SDimitry Andric pointer __new_data, __p; 31570b57cec5SDimitry Andric bool __was_long, __now_long; 31580b57cec5SDimitry Andric if (__res_arg == __min_cap - 1) 31590b57cec5SDimitry Andric { 31600b57cec5SDimitry Andric __was_long = true; 31610b57cec5SDimitry Andric __now_long = false; 31620b57cec5SDimitry Andric __new_data = __get_short_pointer(); 31630b57cec5SDimitry Andric __p = __get_long_pointer(); 31640b57cec5SDimitry Andric } 31650b57cec5SDimitry Andric else 31660b57cec5SDimitry Andric { 31670b57cec5SDimitry Andric if (__res_arg > __cap) 31680b57cec5SDimitry Andric __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1); 31690b57cec5SDimitry Andric else 31700b57cec5SDimitry Andric { 31710b57cec5SDimitry Andric #ifndef _LIBCPP_NO_EXCEPTIONS 31720b57cec5SDimitry Andric try 31730b57cec5SDimitry Andric { 31740b57cec5SDimitry Andric #endif // _LIBCPP_NO_EXCEPTIONS 31750b57cec5SDimitry Andric __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1); 31760b57cec5SDimitry Andric #ifndef _LIBCPP_NO_EXCEPTIONS 31770b57cec5SDimitry Andric } 31780b57cec5SDimitry Andric catch (...) 31790b57cec5SDimitry Andric { 31800b57cec5SDimitry Andric return; 31810b57cec5SDimitry Andric } 31820b57cec5SDimitry Andric #else // _LIBCPP_NO_EXCEPTIONS 31830b57cec5SDimitry Andric if (__new_data == nullptr) 31840b57cec5SDimitry Andric return; 31850b57cec5SDimitry Andric #endif // _LIBCPP_NO_EXCEPTIONS 31860b57cec5SDimitry Andric } 31870b57cec5SDimitry Andric __now_long = true; 31880b57cec5SDimitry Andric __was_long = __is_long(); 31890b57cec5SDimitry Andric __p = __get_pointer(); 31900b57cec5SDimitry Andric } 3191*480093f4SDimitry Andric traits_type::copy(_VSTD::__to_address(__new_data), 3192*480093f4SDimitry Andric _VSTD::__to_address(__p), size()+1); 31930b57cec5SDimitry Andric if (__was_long) 31940b57cec5SDimitry Andric __alloc_traits::deallocate(__alloc(), __p, __cap+1); 31950b57cec5SDimitry Andric if (__now_long) 31960b57cec5SDimitry Andric { 31970b57cec5SDimitry Andric __set_long_cap(__res_arg+1); 31980b57cec5SDimitry Andric __set_long_size(__sz); 31990b57cec5SDimitry Andric __set_long_pointer(__new_data); 32000b57cec5SDimitry Andric } 32010b57cec5SDimitry Andric else 32020b57cec5SDimitry Andric __set_short_size(__sz); 32030b57cec5SDimitry Andric __invalidate_all_iterators(); 32040b57cec5SDimitry Andric } 32050b57cec5SDimitry Andric} 32060b57cec5SDimitry Andric 32070b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32080b57cec5SDimitry Andricinline 32090b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::const_reference 32100b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const _NOEXCEPT 32110b57cec5SDimitry Andric{ 32120b57cec5SDimitry Andric _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds"); 32130b57cec5SDimitry Andric return *(data() + __pos); 32140b57cec5SDimitry Andric} 32150b57cec5SDimitry Andric 32160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32170b57cec5SDimitry Andricinline 32180b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::reference 32190b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) _NOEXCEPT 32200b57cec5SDimitry Andric{ 32210b57cec5SDimitry Andric _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds"); 32220b57cec5SDimitry Andric return *(__get_pointer() + __pos); 32230b57cec5SDimitry Andric} 32240b57cec5SDimitry Andric 32250b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32260b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::const_reference 32270b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const 32280b57cec5SDimitry Andric{ 32290b57cec5SDimitry Andric if (__n >= size()) 32300b57cec5SDimitry Andric this->__throw_out_of_range(); 32310b57cec5SDimitry Andric return (*this)[__n]; 32320b57cec5SDimitry Andric} 32330b57cec5SDimitry Andric 32340b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32350b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::reference 32360b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::at(size_type __n) 32370b57cec5SDimitry Andric{ 32380b57cec5SDimitry Andric if (__n >= size()) 32390b57cec5SDimitry Andric this->__throw_out_of_range(); 32400b57cec5SDimitry Andric return (*this)[__n]; 32410b57cec5SDimitry Andric} 32420b57cec5SDimitry Andric 32430b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32440b57cec5SDimitry Andricinline 32450b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::reference 32460b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::front() _NOEXCEPT 32470b57cec5SDimitry Andric{ 32480b57cec5SDimitry Andric _LIBCPP_ASSERT(!empty(), "string::front(): string is empty"); 32490b57cec5SDimitry Andric return *__get_pointer(); 32500b57cec5SDimitry Andric} 32510b57cec5SDimitry Andric 32520b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32530b57cec5SDimitry Andricinline 32540b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::const_reference 32550b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::front() const _NOEXCEPT 32560b57cec5SDimitry Andric{ 32570b57cec5SDimitry Andric _LIBCPP_ASSERT(!empty(), "string::front(): string is empty"); 32580b57cec5SDimitry Andric return *data(); 32590b57cec5SDimitry Andric} 32600b57cec5SDimitry Andric 32610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32620b57cec5SDimitry Andricinline 32630b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::reference 32640b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::back() _NOEXCEPT 32650b57cec5SDimitry Andric{ 32660b57cec5SDimitry Andric _LIBCPP_ASSERT(!empty(), "string::back(): string is empty"); 32670b57cec5SDimitry Andric return *(__get_pointer() + size() - 1); 32680b57cec5SDimitry Andric} 32690b57cec5SDimitry Andric 32700b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32710b57cec5SDimitry Andricinline 32720b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::const_reference 32730b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::back() const _NOEXCEPT 32740b57cec5SDimitry Andric{ 32750b57cec5SDimitry Andric _LIBCPP_ASSERT(!empty(), "string::back(): string is empty"); 32760b57cec5SDimitry Andric return *(data() + size() - 1); 32770b57cec5SDimitry Andric} 32780b57cec5SDimitry Andric 32790b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32800b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 32810b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const 32820b57cec5SDimitry Andric{ 32830b57cec5SDimitry Andric size_type __sz = size(); 32840b57cec5SDimitry Andric if (__pos > __sz) 32850b57cec5SDimitry Andric this->__throw_out_of_range(); 32860b57cec5SDimitry Andric size_type __rlen = _VSTD::min(__n, __sz - __pos); 32870b57cec5SDimitry Andric traits_type::copy(__s, data() + __pos, __rlen); 32880b57cec5SDimitry Andric return __rlen; 32890b57cec5SDimitry Andric} 32900b57cec5SDimitry Andric 32910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 32920b57cec5SDimitry Andricinline 32930b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 32940b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const 32950b57cec5SDimitry Andric{ 32960b57cec5SDimitry Andric return basic_string(*this, __pos, __n, __alloc()); 32970b57cec5SDimitry Andric} 32980b57cec5SDimitry Andric 32990b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 33000b57cec5SDimitry Andricinline 33010b57cec5SDimitry Andricvoid 33020b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str) 33030b57cec5SDimitry Andric#if _LIBCPP_STD_VER >= 14 33040b57cec5SDimitry Andric _NOEXCEPT 33050b57cec5SDimitry Andric#else 33060b57cec5SDimitry Andric _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 33070b57cec5SDimitry Andric __is_nothrow_swappable<allocator_type>::value) 33080b57cec5SDimitry Andric#endif 33090b57cec5SDimitry Andric{ 33100b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 33110b57cec5SDimitry Andric if (!__is_long()) 33120b57cec5SDimitry Andric __get_db()->__invalidate_all(this); 33130b57cec5SDimitry Andric if (!__str.__is_long()) 33140b57cec5SDimitry Andric __get_db()->__invalidate_all(&__str); 33150b57cec5SDimitry Andric __get_db()->swap(this, &__str); 33160b57cec5SDimitry Andric#endif 33170b57cec5SDimitry Andric _LIBCPP_ASSERT( 33180b57cec5SDimitry Andric __alloc_traits::propagate_on_container_swap::value || 33190b57cec5SDimitry Andric __alloc_traits::is_always_equal::value || 33200b57cec5SDimitry Andric __alloc() == __str.__alloc(), "swapping non-equal allocators"); 33210b57cec5SDimitry Andric _VSTD::swap(__r_.first(), __str.__r_.first()); 33220b57cec5SDimitry Andric __swap_allocator(__alloc(), __str.__alloc()); 33230b57cec5SDimitry Andric} 33240b57cec5SDimitry Andric 33250b57cec5SDimitry Andric// find 33260b57cec5SDimitry Andric 33270b57cec5SDimitry Andrictemplate <class _Traits> 33280b57cec5SDimitry Andricstruct _LIBCPP_HIDDEN __traits_eq 33290b57cec5SDimitry Andric{ 33300b57cec5SDimitry Andric typedef typename _Traits::char_type char_type; 33310b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 33320b57cec5SDimitry Andric bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT 33330b57cec5SDimitry Andric {return _Traits::eq(__x, __y);} 33340b57cec5SDimitry Andric}; 33350b57cec5SDimitry Andric 33360b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 33370b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 33380b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s, 33390b57cec5SDimitry Andric size_type __pos, 33400b57cec5SDimitry Andric size_type __n) const _NOEXCEPT 33410b57cec5SDimitry Andric{ 33420b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr"); 33430b57cec5SDimitry Andric return __str_find<value_type, size_type, traits_type, npos> 33440b57cec5SDimitry Andric (data(), size(), __s, __pos, __n); 33450b57cec5SDimitry Andric} 33460b57cec5SDimitry Andric 33470b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 33480b57cec5SDimitry Andricinline 33490b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 33500b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str, 33510b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 33520b57cec5SDimitry Andric{ 33530b57cec5SDimitry Andric return __str_find<value_type, size_type, traits_type, npos> 33540b57cec5SDimitry Andric (data(), size(), __str.data(), __pos, __str.size()); 33550b57cec5SDimitry Andric} 33560b57cec5SDimitry Andric 33570b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 33580b57cec5SDimitry Andrictemplate <class _Tp> 33590b57cec5SDimitry Andrictypename enable_if 33600b57cec5SDimitry Andric< 33610b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 33620b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type 33630b57cec5SDimitry Andric>::type 33640b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(const _Tp &__t, 33650b57cec5SDimitry Andric size_type __pos) const 33660b57cec5SDimitry Andric{ 33670b57cec5SDimitry Andric __self_view __sv = __t; 33680b57cec5SDimitry Andric return __str_find<value_type, size_type, traits_type, npos> 33690b57cec5SDimitry Andric (data(), size(), __sv.data(), __pos, __sv.size()); 33700b57cec5SDimitry Andric} 33710b57cec5SDimitry Andric 33720b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 33730b57cec5SDimitry Andricinline 33740b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 33750b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s, 33760b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 33770b57cec5SDimitry Andric{ 33780b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr"); 33790b57cec5SDimitry Andric return __str_find<value_type, size_type, traits_type, npos> 33800b57cec5SDimitry Andric (data(), size(), __s, __pos, traits_type::length(__s)); 33810b57cec5SDimitry Andric} 33820b57cec5SDimitry Andric 33830b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 33840b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 33850b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find(value_type __c, 33860b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 33870b57cec5SDimitry Andric{ 33880b57cec5SDimitry Andric return __str_find<value_type, size_type, traits_type, npos> 33890b57cec5SDimitry Andric (data(), size(), __c, __pos); 33900b57cec5SDimitry Andric} 33910b57cec5SDimitry Andric 33920b57cec5SDimitry Andric// rfind 33930b57cec5SDimitry Andric 33940b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 33950b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 33960b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s, 33970b57cec5SDimitry Andric size_type __pos, 33980b57cec5SDimitry Andric size_type __n) const _NOEXCEPT 33990b57cec5SDimitry Andric{ 34000b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr"); 34010b57cec5SDimitry Andric return __str_rfind<value_type, size_type, traits_type, npos> 34020b57cec5SDimitry Andric (data(), size(), __s, __pos, __n); 34030b57cec5SDimitry Andric} 34040b57cec5SDimitry Andric 34050b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 34060b57cec5SDimitry Andricinline 34070b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 34080b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str, 34090b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 34100b57cec5SDimitry Andric{ 34110b57cec5SDimitry Andric return __str_rfind<value_type, size_type, traits_type, npos> 34120b57cec5SDimitry Andric (data(), size(), __str.data(), __pos, __str.size()); 34130b57cec5SDimitry Andric} 34140b57cec5SDimitry Andric 34150b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 34160b57cec5SDimitry Andrictemplate <class _Tp> 34170b57cec5SDimitry Andrictypename enable_if 34180b57cec5SDimitry Andric< 34190b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 34200b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type 34210b57cec5SDimitry Andric>::type 34220b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(const _Tp& __t, 34230b57cec5SDimitry Andric size_type __pos) const 34240b57cec5SDimitry Andric{ 34250b57cec5SDimitry Andric __self_view __sv = __t; 34260b57cec5SDimitry Andric return __str_rfind<value_type, size_type, traits_type, npos> 34270b57cec5SDimitry Andric (data(), size(), __sv.data(), __pos, __sv.size()); 34280b57cec5SDimitry Andric} 34290b57cec5SDimitry Andric 34300b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 34310b57cec5SDimitry Andricinline 34320b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 34330b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s, 34340b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 34350b57cec5SDimitry Andric{ 34360b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr"); 34370b57cec5SDimitry Andric return __str_rfind<value_type, size_type, traits_type, npos> 34380b57cec5SDimitry Andric (data(), size(), __s, __pos, traits_type::length(__s)); 34390b57cec5SDimitry Andric} 34400b57cec5SDimitry Andric 34410b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 34420b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 34430b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c, 34440b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 34450b57cec5SDimitry Andric{ 34460b57cec5SDimitry Andric return __str_rfind<value_type, size_type, traits_type, npos> 34470b57cec5SDimitry Andric (data(), size(), __c, __pos); 34480b57cec5SDimitry Andric} 34490b57cec5SDimitry Andric 34500b57cec5SDimitry Andric// find_first_of 34510b57cec5SDimitry Andric 34520b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 34530b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 34540b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s, 34550b57cec5SDimitry Andric size_type __pos, 34560b57cec5SDimitry Andric size_type __n) const _NOEXCEPT 34570b57cec5SDimitry Andric{ 34580b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr"); 34590b57cec5SDimitry Andric return __str_find_first_of<value_type, size_type, traits_type, npos> 34600b57cec5SDimitry Andric (data(), size(), __s, __pos, __n); 34610b57cec5SDimitry Andric} 34620b57cec5SDimitry Andric 34630b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 34640b57cec5SDimitry Andricinline 34650b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 34660b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str, 34670b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 34680b57cec5SDimitry Andric{ 34690b57cec5SDimitry Andric return __str_find_first_of<value_type, size_type, traits_type, npos> 34700b57cec5SDimitry Andric (data(), size(), __str.data(), __pos, __str.size()); 34710b57cec5SDimitry Andric} 34720b57cec5SDimitry Andric 34730b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 34740b57cec5SDimitry Andrictemplate <class _Tp> 34750b57cec5SDimitry Andrictypename enable_if 34760b57cec5SDimitry Andric< 34770b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 34780b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type 34790b57cec5SDimitry Andric>::type 34800b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(const _Tp& __t, 34810b57cec5SDimitry Andric size_type __pos) const 34820b57cec5SDimitry Andric{ 34830b57cec5SDimitry Andric __self_view __sv = __t; 34840b57cec5SDimitry Andric return __str_find_first_of<value_type, size_type, traits_type, npos> 34850b57cec5SDimitry Andric (data(), size(), __sv.data(), __pos, __sv.size()); 34860b57cec5SDimitry Andric} 34870b57cec5SDimitry Andric 34880b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 34890b57cec5SDimitry Andricinline 34900b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 34910b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s, 34920b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 34930b57cec5SDimitry Andric{ 34940b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr"); 34950b57cec5SDimitry Andric return __str_find_first_of<value_type, size_type, traits_type, npos> 34960b57cec5SDimitry Andric (data(), size(), __s, __pos, traits_type::length(__s)); 34970b57cec5SDimitry Andric} 34980b57cec5SDimitry Andric 34990b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 35000b57cec5SDimitry Andricinline 35010b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 35020b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c, 35030b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 35040b57cec5SDimitry Andric{ 35050b57cec5SDimitry Andric return find(__c, __pos); 35060b57cec5SDimitry Andric} 35070b57cec5SDimitry Andric 35080b57cec5SDimitry Andric// find_last_of 35090b57cec5SDimitry Andric 35100b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 35110b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 35120b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s, 35130b57cec5SDimitry Andric size_type __pos, 35140b57cec5SDimitry Andric size_type __n) const _NOEXCEPT 35150b57cec5SDimitry Andric{ 35160b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr"); 35170b57cec5SDimitry Andric return __str_find_last_of<value_type, size_type, traits_type, npos> 35180b57cec5SDimitry Andric (data(), size(), __s, __pos, __n); 35190b57cec5SDimitry Andric} 35200b57cec5SDimitry Andric 35210b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 35220b57cec5SDimitry Andricinline 35230b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 35240b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str, 35250b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 35260b57cec5SDimitry Andric{ 35270b57cec5SDimitry Andric return __str_find_last_of<value_type, size_type, traits_type, npos> 35280b57cec5SDimitry Andric (data(), size(), __str.data(), __pos, __str.size()); 35290b57cec5SDimitry Andric} 35300b57cec5SDimitry Andric 35310b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 35320b57cec5SDimitry Andrictemplate <class _Tp> 35330b57cec5SDimitry Andrictypename enable_if 35340b57cec5SDimitry Andric< 35350b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 35360b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type 35370b57cec5SDimitry Andric>::type 35380b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(const _Tp& __t, 35390b57cec5SDimitry Andric size_type __pos) const 35400b57cec5SDimitry Andric{ 35410b57cec5SDimitry Andric __self_view __sv = __t; 35420b57cec5SDimitry Andric return __str_find_last_of<value_type, size_type, traits_type, npos> 35430b57cec5SDimitry Andric (data(), size(), __sv.data(), __pos, __sv.size()); 35440b57cec5SDimitry Andric} 35450b57cec5SDimitry Andric 35460b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 35470b57cec5SDimitry Andricinline 35480b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 35490b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s, 35500b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 35510b57cec5SDimitry Andric{ 35520b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr"); 35530b57cec5SDimitry Andric return __str_find_last_of<value_type, size_type, traits_type, npos> 35540b57cec5SDimitry Andric (data(), size(), __s, __pos, traits_type::length(__s)); 35550b57cec5SDimitry Andric} 35560b57cec5SDimitry Andric 35570b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 35580b57cec5SDimitry Andricinline 35590b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 35600b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c, 35610b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 35620b57cec5SDimitry Andric{ 35630b57cec5SDimitry Andric return rfind(__c, __pos); 35640b57cec5SDimitry Andric} 35650b57cec5SDimitry Andric 35660b57cec5SDimitry Andric// find_first_not_of 35670b57cec5SDimitry Andric 35680b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 35690b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 35700b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s, 35710b57cec5SDimitry Andric size_type __pos, 35720b57cec5SDimitry Andric size_type __n) const _NOEXCEPT 35730b57cec5SDimitry Andric{ 35740b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr"); 35750b57cec5SDimitry Andric return __str_find_first_not_of<value_type, size_type, traits_type, npos> 35760b57cec5SDimitry Andric (data(), size(), __s, __pos, __n); 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_first_not_of(const basic_string& __str, 35830b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 35840b57cec5SDimitry Andric{ 35850b57cec5SDimitry Andric return __str_find_first_not_of<value_type, size_type, traits_type, npos> 35860b57cec5SDimitry Andric (data(), size(), __str.data(), __pos, __str.size()); 35870b57cec5SDimitry Andric} 35880b57cec5SDimitry Andric 35890b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 35900b57cec5SDimitry Andrictemplate <class _Tp> 35910b57cec5SDimitry Andrictypename enable_if 35920b57cec5SDimitry Andric< 35930b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 35940b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type 35950b57cec5SDimitry Andric>::type 35960b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const _Tp& __t, 35970b57cec5SDimitry Andric size_type __pos) const 35980b57cec5SDimitry Andric{ 35990b57cec5SDimitry Andric __self_view __sv = __t; 36000b57cec5SDimitry Andric return __str_find_first_not_of<value_type, size_type, traits_type, npos> 36010b57cec5SDimitry Andric (data(), size(), __sv.data(), __pos, __sv.size()); 36020b57cec5SDimitry Andric} 36030b57cec5SDimitry Andric 36040b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 36050b57cec5SDimitry Andricinline 36060b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 36070b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s, 36080b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 36090b57cec5SDimitry Andric{ 36100b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr"); 36110b57cec5SDimitry Andric return __str_find_first_not_of<value_type, size_type, traits_type, npos> 36120b57cec5SDimitry Andric (data(), size(), __s, __pos, traits_type::length(__s)); 36130b57cec5SDimitry Andric} 36140b57cec5SDimitry Andric 36150b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 36160b57cec5SDimitry Andricinline 36170b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 36180b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c, 36190b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 36200b57cec5SDimitry Andric{ 36210b57cec5SDimitry Andric return __str_find_first_not_of<value_type, size_type, traits_type, npos> 36220b57cec5SDimitry Andric (data(), size(), __c, __pos); 36230b57cec5SDimitry Andric} 36240b57cec5SDimitry Andric 36250b57cec5SDimitry Andric// find_last_not_of 36260b57cec5SDimitry Andric 36270b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 36280b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 36290b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s, 36300b57cec5SDimitry Andric size_type __pos, 36310b57cec5SDimitry Andric size_type __n) const _NOEXCEPT 36320b57cec5SDimitry Andric{ 36330b57cec5SDimitry Andric _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr"); 36340b57cec5SDimitry Andric return __str_find_last_not_of<value_type, size_type, traits_type, npos> 36350b57cec5SDimitry Andric (data(), size(), __s, __pos, __n); 36360b57cec5SDimitry Andric} 36370b57cec5SDimitry Andric 36380b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 36390b57cec5SDimitry Andricinline 36400b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 36410b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str, 36420b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 36430b57cec5SDimitry Andric{ 36440b57cec5SDimitry Andric return __str_find_last_not_of<value_type, size_type, traits_type, npos> 36450b57cec5SDimitry Andric (data(), size(), __str.data(), __pos, __str.size()); 36460b57cec5SDimitry Andric} 36470b57cec5SDimitry Andric 36480b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 36490b57cec5SDimitry Andrictemplate <class _Tp> 36500b57cec5SDimitry Andrictypename enable_if 36510b57cec5SDimitry Andric< 36520b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 36530b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type 36540b57cec5SDimitry Andric>::type 36550b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const _Tp& __t, 36560b57cec5SDimitry Andric size_type __pos) const 36570b57cec5SDimitry Andric{ 36580b57cec5SDimitry Andric __self_view __sv = __t; 36590b57cec5SDimitry Andric return __str_find_last_not_of<value_type, size_type, traits_type, npos> 36600b57cec5SDimitry Andric (data(), size(), __sv.data(), __pos, __sv.size()); 36610b57cec5SDimitry Andric} 36620b57cec5SDimitry Andric 36630b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 36640b57cec5SDimitry Andricinline 36650b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 36660b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s, 36670b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 36680b57cec5SDimitry Andric{ 36690b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr"); 36700b57cec5SDimitry Andric return __str_find_last_not_of<value_type, size_type, traits_type, npos> 36710b57cec5SDimitry Andric (data(), size(), __s, __pos, traits_type::length(__s)); 36720b57cec5SDimitry Andric} 36730b57cec5SDimitry Andric 36740b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 36750b57cec5SDimitry Andricinline 36760b57cec5SDimitry Andrictypename basic_string<_CharT, _Traits, _Allocator>::size_type 36770b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c, 36780b57cec5SDimitry Andric size_type __pos) const _NOEXCEPT 36790b57cec5SDimitry Andric{ 36800b57cec5SDimitry Andric return __str_find_last_not_of<value_type, size_type, traits_type, npos> 36810b57cec5SDimitry Andric (data(), size(), __c, __pos); 36820b57cec5SDimitry Andric} 36830b57cec5SDimitry Andric 36840b57cec5SDimitry Andric// compare 36850b57cec5SDimitry Andric 36860b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 36870b57cec5SDimitry Andrictemplate <class _Tp> 36880b57cec5SDimitry Andrictypename enable_if 36890b57cec5SDimitry Andric< 36900b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 36910b57cec5SDimitry Andric int 36920b57cec5SDimitry Andric>::type 36930b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(const _Tp& __t) const 36940b57cec5SDimitry Andric{ 36950b57cec5SDimitry Andric __self_view __sv = __t; 36960b57cec5SDimitry Andric size_t __lhs_sz = size(); 36970b57cec5SDimitry Andric size_t __rhs_sz = __sv.size(); 36980b57cec5SDimitry Andric int __result = traits_type::compare(data(), __sv.data(), 36990b57cec5SDimitry Andric _VSTD::min(__lhs_sz, __rhs_sz)); 37000b57cec5SDimitry Andric if (__result != 0) 37010b57cec5SDimitry Andric return __result; 37020b57cec5SDimitry Andric if (__lhs_sz < __rhs_sz) 37030b57cec5SDimitry Andric return -1; 37040b57cec5SDimitry Andric if (__lhs_sz > __rhs_sz) 37050b57cec5SDimitry Andric return 1; 37060b57cec5SDimitry Andric return 0; 37070b57cec5SDimitry Andric} 37080b57cec5SDimitry Andric 37090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 37100b57cec5SDimitry Andricinline 37110b57cec5SDimitry Andricint 37120b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT 37130b57cec5SDimitry Andric{ 37140b57cec5SDimitry Andric return compare(__self_view(__str)); 37150b57cec5SDimitry Andric} 37160b57cec5SDimitry Andric 37170b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 37180b57cec5SDimitry Andricint 37190b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 37200b57cec5SDimitry Andric size_type __n1, 37210b57cec5SDimitry Andric const value_type* __s, 37220b57cec5SDimitry Andric size_type __n2) const 37230b57cec5SDimitry Andric{ 37240b57cec5SDimitry Andric _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr"); 37250b57cec5SDimitry Andric size_type __sz = size(); 37260b57cec5SDimitry Andric if (__pos1 > __sz || __n2 == npos) 37270b57cec5SDimitry Andric this->__throw_out_of_range(); 37280b57cec5SDimitry Andric size_type __rlen = _VSTD::min(__n1, __sz - __pos1); 37290b57cec5SDimitry Andric int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2)); 37300b57cec5SDimitry Andric if (__r == 0) 37310b57cec5SDimitry Andric { 37320b57cec5SDimitry Andric if (__rlen < __n2) 37330b57cec5SDimitry Andric __r = -1; 37340b57cec5SDimitry Andric else if (__rlen > __n2) 37350b57cec5SDimitry Andric __r = 1; 37360b57cec5SDimitry Andric } 37370b57cec5SDimitry Andric return __r; 37380b57cec5SDimitry Andric} 37390b57cec5SDimitry Andric 37400b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 37410b57cec5SDimitry Andrictemplate <class _Tp> 37420b57cec5SDimitry Andrictypename enable_if 37430b57cec5SDimitry Andric< 37440b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 37450b57cec5SDimitry Andric int 37460b57cec5SDimitry Andric>::type 37470b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 37480b57cec5SDimitry Andric size_type __n1, 37490b57cec5SDimitry Andric const _Tp& __t) const 37500b57cec5SDimitry Andric{ 37510b57cec5SDimitry Andric __self_view __sv = __t; 37520b57cec5SDimitry Andric return compare(__pos1, __n1, __sv.data(), __sv.size()); 37530b57cec5SDimitry Andric} 37540b57cec5SDimitry Andric 37550b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 37560b57cec5SDimitry Andricinline 37570b57cec5SDimitry Andricint 37580b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 37590b57cec5SDimitry Andric size_type __n1, 37600b57cec5SDimitry Andric const basic_string& __str) const 37610b57cec5SDimitry Andric{ 37620b57cec5SDimitry Andric return compare(__pos1, __n1, __str.data(), __str.size()); 37630b57cec5SDimitry Andric} 37640b57cec5SDimitry Andric 37650b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 37660b57cec5SDimitry Andrictemplate <class _Tp> 37670b57cec5SDimitry Andrictypename enable_if 37680b57cec5SDimitry Andric< 37690b57cec5SDimitry Andric __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, 37700b57cec5SDimitry Andric int 37710b57cec5SDimitry Andric>::type 37720b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 37730b57cec5SDimitry Andric size_type __n1, 37740b57cec5SDimitry Andric const _Tp& __t, 37750b57cec5SDimitry Andric size_type __pos2, 37760b57cec5SDimitry Andric size_type __n2) const 37770b57cec5SDimitry Andric{ 37780b57cec5SDimitry Andric __self_view __sv = __t; 37790b57cec5SDimitry Andric return __self_view(*this).substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2)); 37800b57cec5SDimitry Andric} 37810b57cec5SDimitry Andric 37820b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 37830b57cec5SDimitry Andricint 37840b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 37850b57cec5SDimitry Andric size_type __n1, 37860b57cec5SDimitry Andric const basic_string& __str, 37870b57cec5SDimitry Andric size_type __pos2, 37880b57cec5SDimitry Andric size_type __n2) const 37890b57cec5SDimitry Andric{ 37900b57cec5SDimitry Andric return compare(__pos1, __n1, __self_view(__str), __pos2, __n2); 37910b57cec5SDimitry Andric} 37920b57cec5SDimitry Andric 37930b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 37940b57cec5SDimitry Andricint 37950b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT 37960b57cec5SDimitry Andric{ 37970b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr"); 37980b57cec5SDimitry Andric return compare(0, npos, __s, traits_type::length(__s)); 37990b57cec5SDimitry Andric} 38000b57cec5SDimitry Andric 38010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 38020b57cec5SDimitry Andricint 38030b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, 38040b57cec5SDimitry Andric size_type __n1, 38050b57cec5SDimitry Andric const value_type* __s) const 38060b57cec5SDimitry Andric{ 38070b57cec5SDimitry Andric _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr"); 38080b57cec5SDimitry Andric return compare(__pos1, __n1, __s, traits_type::length(__s)); 38090b57cec5SDimitry Andric} 38100b57cec5SDimitry Andric 38110b57cec5SDimitry Andric// __invariants 38120b57cec5SDimitry Andric 38130b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 38140b57cec5SDimitry Andricinline 38150b57cec5SDimitry Andricbool 38160b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__invariants() const 38170b57cec5SDimitry Andric{ 38180b57cec5SDimitry Andric if (size() > capacity()) 38190b57cec5SDimitry Andric return false; 38200b57cec5SDimitry Andric if (capacity() < __min_cap - 1) 38210b57cec5SDimitry Andric return false; 38220b57cec5SDimitry Andric if (data() == 0) 38230b57cec5SDimitry Andric return false; 38240b57cec5SDimitry Andric if (data()[size()] != value_type(0)) 38250b57cec5SDimitry Andric return false; 38260b57cec5SDimitry Andric return true; 38270b57cec5SDimitry Andric} 38280b57cec5SDimitry Andric 38290b57cec5SDimitry Andric// __clear_and_shrink 38300b57cec5SDimitry Andric 38310b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 38320b57cec5SDimitry Andricinline 38330b57cec5SDimitry Andricvoid 38340b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__clear_and_shrink() _NOEXCEPT 38350b57cec5SDimitry Andric{ 38360b57cec5SDimitry Andric clear(); 38370b57cec5SDimitry Andric if(__is_long()) 38380b57cec5SDimitry Andric { 38390b57cec5SDimitry Andric __alloc_traits::deallocate(__alloc(), __get_long_pointer(), capacity() + 1); 38400b57cec5SDimitry Andric __set_long_cap(0); 38410b57cec5SDimitry Andric __set_short_size(0); 38420b57cec5SDimitry Andric } 38430b57cec5SDimitry Andric} 38440b57cec5SDimitry Andric 38450b57cec5SDimitry Andric// operator== 38460b57cec5SDimitry Andric 38470b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 38480b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 38490b57cec5SDimitry Andricbool 38500b57cec5SDimitry Andricoperator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 38510b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 38520b57cec5SDimitry Andric{ 38530b57cec5SDimitry Andric size_t __lhs_sz = __lhs.size(); 38540b57cec5SDimitry Andric return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(), 38550b57cec5SDimitry Andric __rhs.data(), 38560b57cec5SDimitry Andric __lhs_sz) == 0; 38570b57cec5SDimitry Andric} 38580b57cec5SDimitry Andric 38590b57cec5SDimitry Andrictemplate<class _Allocator> 38600b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 38610b57cec5SDimitry Andricbool 38620b57cec5SDimitry Andricoperator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs, 38630b57cec5SDimitry Andric const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT 38640b57cec5SDimitry Andric{ 38650b57cec5SDimitry Andric size_t __lhs_sz = __lhs.size(); 38660b57cec5SDimitry Andric if (__lhs_sz != __rhs.size()) 38670b57cec5SDimitry Andric return false; 38680b57cec5SDimitry Andric const char* __lp = __lhs.data(); 38690b57cec5SDimitry Andric const char* __rp = __rhs.data(); 38700b57cec5SDimitry Andric if (__lhs.__is_long()) 38710b57cec5SDimitry Andric return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0; 38720b57cec5SDimitry Andric for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp) 38730b57cec5SDimitry Andric if (*__lp != *__rp) 38740b57cec5SDimitry Andric return false; 38750b57cec5SDimitry Andric return true; 38760b57cec5SDimitry Andric} 38770b57cec5SDimitry Andric 38780b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 38790b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 38800b57cec5SDimitry Andricbool 38810b57cec5SDimitry Andricoperator==(const _CharT* __lhs, 38820b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 38830b57cec5SDimitry Andric{ 38840b57cec5SDimitry Andric typedef basic_string<_CharT, _Traits, _Allocator> _String; 38850b57cec5SDimitry Andric _LIBCPP_ASSERT(__lhs != nullptr, "operator==(char*, basic_string): received nullptr"); 38860b57cec5SDimitry Andric size_t __lhs_len = _Traits::length(__lhs); 38870b57cec5SDimitry Andric if (__lhs_len != __rhs.size()) return false; 38880b57cec5SDimitry Andric return __rhs.compare(0, _String::npos, __lhs, __lhs_len) == 0; 38890b57cec5SDimitry Andric} 38900b57cec5SDimitry Andric 38910b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 38920b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 38930b57cec5SDimitry Andricbool 38940b57cec5SDimitry Andricoperator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 38950b57cec5SDimitry Andric const _CharT* __rhs) _NOEXCEPT 38960b57cec5SDimitry Andric{ 38970b57cec5SDimitry Andric typedef basic_string<_CharT, _Traits, _Allocator> _String; 38980b57cec5SDimitry Andric _LIBCPP_ASSERT(__rhs != nullptr, "operator==(basic_string, char*): received nullptr"); 38990b57cec5SDimitry Andric size_t __rhs_len = _Traits::length(__rhs); 39000b57cec5SDimitry Andric if (__rhs_len != __lhs.size()) return false; 39010b57cec5SDimitry Andric return __lhs.compare(0, _String::npos, __rhs, __rhs_len) == 0; 39020b57cec5SDimitry Andric} 39030b57cec5SDimitry Andric 39040b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39050b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39060b57cec5SDimitry Andricbool 39070b57cec5SDimitry Andricoperator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 39080b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 39090b57cec5SDimitry Andric{ 39100b57cec5SDimitry Andric return !(__lhs == __rhs); 39110b57cec5SDimitry Andric} 39120b57cec5SDimitry Andric 39130b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39140b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39150b57cec5SDimitry Andricbool 39160b57cec5SDimitry Andricoperator!=(const _CharT* __lhs, 39170b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 39180b57cec5SDimitry Andric{ 39190b57cec5SDimitry Andric return !(__lhs == __rhs); 39200b57cec5SDimitry Andric} 39210b57cec5SDimitry Andric 39220b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39230b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39240b57cec5SDimitry Andricbool 39250b57cec5SDimitry Andricoperator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 39260b57cec5SDimitry Andric const _CharT* __rhs) _NOEXCEPT 39270b57cec5SDimitry Andric{ 39280b57cec5SDimitry Andric return !(__lhs == __rhs); 39290b57cec5SDimitry Andric} 39300b57cec5SDimitry Andric 39310b57cec5SDimitry Andric// operator< 39320b57cec5SDimitry Andric 39330b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39340b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39350b57cec5SDimitry Andricbool 39360b57cec5SDimitry Andricoperator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs, 39370b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 39380b57cec5SDimitry Andric{ 39390b57cec5SDimitry Andric return __lhs.compare(__rhs) < 0; 39400b57cec5SDimitry Andric} 39410b57cec5SDimitry Andric 39420b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39430b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39440b57cec5SDimitry Andricbool 39450b57cec5SDimitry Andricoperator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs, 39460b57cec5SDimitry Andric const _CharT* __rhs) _NOEXCEPT 39470b57cec5SDimitry Andric{ 39480b57cec5SDimitry Andric return __lhs.compare(__rhs) < 0; 39490b57cec5SDimitry Andric} 39500b57cec5SDimitry Andric 39510b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39520b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39530b57cec5SDimitry Andricbool 39540b57cec5SDimitry Andricoperator< (const _CharT* __lhs, 39550b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 39560b57cec5SDimitry Andric{ 39570b57cec5SDimitry Andric return __rhs.compare(__lhs) > 0; 39580b57cec5SDimitry Andric} 39590b57cec5SDimitry Andric 39600b57cec5SDimitry Andric// operator> 39610b57cec5SDimitry Andric 39620b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39630b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39640b57cec5SDimitry Andricbool 39650b57cec5SDimitry Andricoperator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs, 39660b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 39670b57cec5SDimitry Andric{ 39680b57cec5SDimitry Andric return __rhs < __lhs; 39690b57cec5SDimitry Andric} 39700b57cec5SDimitry Andric 39710b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39720b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39730b57cec5SDimitry Andricbool 39740b57cec5SDimitry Andricoperator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs, 39750b57cec5SDimitry Andric const _CharT* __rhs) _NOEXCEPT 39760b57cec5SDimitry Andric{ 39770b57cec5SDimitry Andric return __rhs < __lhs; 39780b57cec5SDimitry Andric} 39790b57cec5SDimitry Andric 39800b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39810b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39820b57cec5SDimitry Andricbool 39830b57cec5SDimitry Andricoperator> (const _CharT* __lhs, 39840b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 39850b57cec5SDimitry Andric{ 39860b57cec5SDimitry Andric return __rhs < __lhs; 39870b57cec5SDimitry Andric} 39880b57cec5SDimitry Andric 39890b57cec5SDimitry Andric// operator<= 39900b57cec5SDimitry Andric 39910b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 39920b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 39930b57cec5SDimitry Andricbool 39940b57cec5SDimitry Andricoperator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 39950b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 39960b57cec5SDimitry Andric{ 39970b57cec5SDimitry Andric return !(__rhs < __lhs); 39980b57cec5SDimitry Andric} 39990b57cec5SDimitry Andric 40000b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40010b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 40020b57cec5SDimitry Andricbool 40030b57cec5SDimitry Andricoperator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 40040b57cec5SDimitry Andric const _CharT* __rhs) _NOEXCEPT 40050b57cec5SDimitry Andric{ 40060b57cec5SDimitry Andric return !(__rhs < __lhs); 40070b57cec5SDimitry Andric} 40080b57cec5SDimitry Andric 40090b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40100b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 40110b57cec5SDimitry Andricbool 40120b57cec5SDimitry Andricoperator<=(const _CharT* __lhs, 40130b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 40140b57cec5SDimitry Andric{ 40150b57cec5SDimitry Andric return !(__rhs < __lhs); 40160b57cec5SDimitry Andric} 40170b57cec5SDimitry Andric 40180b57cec5SDimitry Andric// operator>= 40190b57cec5SDimitry Andric 40200b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40210b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 40220b57cec5SDimitry Andricbool 40230b57cec5SDimitry Andricoperator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 40240b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 40250b57cec5SDimitry Andric{ 40260b57cec5SDimitry Andric return !(__lhs < __rhs); 40270b57cec5SDimitry Andric} 40280b57cec5SDimitry Andric 40290b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40300b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 40310b57cec5SDimitry Andricbool 40320b57cec5SDimitry Andricoperator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 40330b57cec5SDimitry Andric const _CharT* __rhs) _NOEXCEPT 40340b57cec5SDimitry Andric{ 40350b57cec5SDimitry Andric return !(__lhs < __rhs); 40360b57cec5SDimitry Andric} 40370b57cec5SDimitry Andric 40380b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40390b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 40400b57cec5SDimitry Andricbool 40410b57cec5SDimitry Andricoperator>=(const _CharT* __lhs, 40420b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT 40430b57cec5SDimitry Andric{ 40440b57cec5SDimitry Andric return !(__lhs < __rhs); 40450b57cec5SDimitry Andric} 40460b57cec5SDimitry Andric 40470b57cec5SDimitry Andric// operator + 40480b57cec5SDimitry Andric 40490b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40500b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 40510b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, 40520b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __rhs) 40530b57cec5SDimitry Andric{ 40540b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator()); 40550b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size(); 40560b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size(); 40570b57cec5SDimitry Andric __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz); 40580b57cec5SDimitry Andric __r.append(__rhs.data(), __rhs_sz); 40590b57cec5SDimitry Andric return __r; 40600b57cec5SDimitry Andric} 40610b57cec5SDimitry Andric 40620b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40630b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 40640b57cec5SDimitry Andricoperator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs) 40650b57cec5SDimitry Andric{ 40660b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator()); 40670b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs); 40680b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size(); 40690b57cec5SDimitry Andric __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz); 40700b57cec5SDimitry Andric __r.append(__rhs.data(), __rhs_sz); 40710b57cec5SDimitry Andric return __r; 40720b57cec5SDimitry Andric} 40730b57cec5SDimitry Andric 40740b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40750b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 40760b57cec5SDimitry Andricoperator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs) 40770b57cec5SDimitry Andric{ 40780b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator()); 40790b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size(); 40800b57cec5SDimitry Andric __r.__init(&__lhs, 1, 1 + __rhs_sz); 40810b57cec5SDimitry Andric __r.append(__rhs.data(), __rhs_sz); 40820b57cec5SDimitry Andric return __r; 40830b57cec5SDimitry Andric} 40840b57cec5SDimitry Andric 40850b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40860b57cec5SDimitry Andricinline 40870b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 40880b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs) 40890b57cec5SDimitry Andric{ 40900b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator()); 40910b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size(); 40920b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs); 40930b57cec5SDimitry Andric __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz); 40940b57cec5SDimitry Andric __r.append(__rhs, __rhs_sz); 40950b57cec5SDimitry Andric return __r; 40960b57cec5SDimitry Andric} 40970b57cec5SDimitry Andric 40980b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 40990b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 41000b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs) 41010b57cec5SDimitry Andric{ 41020b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator()); 41030b57cec5SDimitry Andric typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size(); 41040b57cec5SDimitry Andric __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1); 41050b57cec5SDimitry Andric __r.push_back(__rhs); 41060b57cec5SDimitry Andric return __r; 41070b57cec5SDimitry Andric} 41080b57cec5SDimitry Andric 41090b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 41100b57cec5SDimitry Andric 41110b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 41120b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 41130b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 41140b57cec5SDimitry Andricoperator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs) 41150b57cec5SDimitry Andric{ 41160b57cec5SDimitry Andric return _VSTD::move(__lhs.append(__rhs)); 41170b57cec5SDimitry Andric} 41180b57cec5SDimitry Andric 41190b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 41200b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 41210b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 41220b57cec5SDimitry Andricoperator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs) 41230b57cec5SDimitry Andric{ 41240b57cec5SDimitry Andric return _VSTD::move(__rhs.insert(0, __lhs)); 41250b57cec5SDimitry Andric} 41260b57cec5SDimitry Andric 41270b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 41280b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 41290b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 41300b57cec5SDimitry Andricoperator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs) 41310b57cec5SDimitry Andric{ 41320b57cec5SDimitry Andric return _VSTD::move(__lhs.append(__rhs)); 41330b57cec5SDimitry Andric} 41340b57cec5SDimitry Andric 41350b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 41360b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 41370b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 41380b57cec5SDimitry Andricoperator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs) 41390b57cec5SDimitry Andric{ 41400b57cec5SDimitry Andric return _VSTD::move(__rhs.insert(0, __lhs)); 41410b57cec5SDimitry Andric} 41420b57cec5SDimitry Andric 41430b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 41440b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 41450b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 41460b57cec5SDimitry Andricoperator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs) 41470b57cec5SDimitry Andric{ 41480b57cec5SDimitry Andric __rhs.insert(__rhs.begin(), __lhs); 41490b57cec5SDimitry Andric return _VSTD::move(__rhs); 41500b57cec5SDimitry Andric} 41510b57cec5SDimitry Andric 41520b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 41530b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 41540b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 41550b57cec5SDimitry Andricoperator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs) 41560b57cec5SDimitry Andric{ 41570b57cec5SDimitry Andric return _VSTD::move(__lhs.append(__rhs)); 41580b57cec5SDimitry Andric} 41590b57cec5SDimitry Andric 41600b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 41610b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 41620b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator> 41630b57cec5SDimitry Andricoperator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs) 41640b57cec5SDimitry Andric{ 41650b57cec5SDimitry Andric __lhs.push_back(__rhs); 41660b57cec5SDimitry Andric return _VSTD::move(__lhs); 41670b57cec5SDimitry Andric} 41680b57cec5SDimitry Andric 41690b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 41700b57cec5SDimitry Andric 41710b57cec5SDimitry Andric// swap 41720b57cec5SDimitry Andric 41730b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 41740b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 41750b57cec5SDimitry Andricvoid 41760b57cec5SDimitry Andricswap(basic_string<_CharT, _Traits, _Allocator>& __lhs, 41770b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __rhs) 41780b57cec5SDimitry Andric _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs))) 41790b57cec5SDimitry Andric{ 41800b57cec5SDimitry Andric __lhs.swap(__rhs); 41810b57cec5SDimitry Andric} 41820b57cec5SDimitry Andric 41830b57cec5SDimitry Andric#ifndef _LIBCPP_NO_HAS_CHAR8_T 41840b57cec5SDimitry Andrictypedef basic_string<char8_t> u8string; 41850b57cec5SDimitry Andric#endif 41860b57cec5SDimitry Andric 41870b57cec5SDimitry Andric#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 41880b57cec5SDimitry Andrictypedef basic_string<char16_t> u16string; 41890b57cec5SDimitry Andrictypedef basic_string<char32_t> u32string; 41900b57cec5SDimitry Andric#endif // _LIBCPP_HAS_NO_UNICODE_CHARS 41910b57cec5SDimitry Andric 41920b57cec5SDimitry Andric_LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* __idx = 0, int __base = 10); 41930b57cec5SDimitry Andric_LIBCPP_FUNC_VIS long stol (const string& __str, size_t* __idx = 0, int __base = 10); 41940b57cec5SDimitry Andric_LIBCPP_FUNC_VIS unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10); 41950b57cec5SDimitry Andric_LIBCPP_FUNC_VIS long long stoll (const string& __str, size_t* __idx = 0, int __base = 10); 41960b57cec5SDimitry Andric_LIBCPP_FUNC_VIS unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10); 41970b57cec5SDimitry Andric 41980b57cec5SDimitry Andric_LIBCPP_FUNC_VIS float stof (const string& __str, size_t* __idx = 0); 41990b57cec5SDimitry Andric_LIBCPP_FUNC_VIS double stod (const string& __str, size_t* __idx = 0); 42000b57cec5SDimitry Andric_LIBCPP_FUNC_VIS long double stold(const string& __str, size_t* __idx = 0); 42010b57cec5SDimitry Andric 42020b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(int __val); 42030b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(unsigned __val); 42040b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(long __val); 42050b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(unsigned long __val); 42060b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(long long __val); 42070b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(unsigned long long __val); 42080b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(float __val); 42090b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(double __val); 42100b57cec5SDimitry Andric_LIBCPP_FUNC_VIS string to_string(long double __val); 42110b57cec5SDimitry Andric 42120b57cec5SDimitry Andric_LIBCPP_FUNC_VIS int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10); 42130b57cec5SDimitry Andric_LIBCPP_FUNC_VIS long stol (const wstring& __str, size_t* __idx = 0, int __base = 10); 42140b57cec5SDimitry Andric_LIBCPP_FUNC_VIS unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10); 42150b57cec5SDimitry Andric_LIBCPP_FUNC_VIS long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10); 42160b57cec5SDimitry Andric_LIBCPP_FUNC_VIS unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10); 42170b57cec5SDimitry Andric 42180b57cec5SDimitry Andric_LIBCPP_FUNC_VIS float stof (const wstring& __str, size_t* __idx = 0); 42190b57cec5SDimitry Andric_LIBCPP_FUNC_VIS double stod (const wstring& __str, size_t* __idx = 0); 42200b57cec5SDimitry Andric_LIBCPP_FUNC_VIS long double stold(const wstring& __str, size_t* __idx = 0); 42210b57cec5SDimitry Andric 42220b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(int __val); 42230b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(unsigned __val); 42240b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(long __val); 42250b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long __val); 42260b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(long long __val); 42270b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long long __val); 42280b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(float __val); 42290b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(double __val); 42300b57cec5SDimitry Andric_LIBCPP_FUNC_VIS wstring to_wstring(long double __val); 42310b57cec5SDimitry Andric 42320b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 42330b57cec5SDimitry Andric const typename basic_string<_CharT, _Traits, _Allocator>::size_type 42340b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>::npos; 42350b57cec5SDimitry Andric 42360b57cec5SDimitry Andrictemplate <class _CharT, class _Allocator> 42370b57cec5SDimitry Andricstruct _LIBCPP_TEMPLATE_VIS 42380b57cec5SDimitry Andric hash<basic_string<_CharT, char_traits<_CharT>, _Allocator> > 42390b57cec5SDimitry Andric : public unary_function< 42400b57cec5SDimitry Andric basic_string<_CharT, char_traits<_CharT>, _Allocator>, size_t> 42410b57cec5SDimitry Andric{ 42420b57cec5SDimitry Andric size_t 42430b57cec5SDimitry Andric operator()(const basic_string<_CharT, char_traits<_CharT>, _Allocator>& __val) const _NOEXCEPT 42440b57cec5SDimitry Andric { return __do_string_hash(__val.data(), __val.data() + __val.size()); } 42450b57cec5SDimitry Andric}; 42460b57cec5SDimitry Andric 42470b57cec5SDimitry Andric 42480b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 42490b57cec5SDimitry Andricbasic_ostream<_CharT, _Traits>& 42500b57cec5SDimitry Andricoperator<<(basic_ostream<_CharT, _Traits>& __os, 42510b57cec5SDimitry Andric const basic_string<_CharT, _Traits, _Allocator>& __str); 42520b57cec5SDimitry Andric 42530b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 42540b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 42550b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, 42560b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str); 42570b57cec5SDimitry Andric 42580b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 42590b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 42600b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, 42610b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm); 42620b57cec5SDimitry Andric 42630b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 42640b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 42650b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 42660b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, 42670b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str); 42680b57cec5SDimitry Andric 42690b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG 42700b57cec5SDimitry Andric 42710b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 42720b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 42730b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 42740b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, 42750b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm); 42760b57cec5SDimitry Andric 42770b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 42780b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 42790b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 42800b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, 42810b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str); 42820b57cec5SDimitry Andric 42830b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG 42840b57cec5SDimitry Andric 42850b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 17 42860b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator, class _Up> 42870b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 42880b57cec5SDimitry Andricvoid erase(basic_string<_CharT, _Traits, _Allocator>& __str, const _Up& __v) 42890b57cec5SDimitry Andric{ __str.erase(_VSTD::remove(__str.begin(), __str.end(), __v), __str.end()); } 42900b57cec5SDimitry Andric 42910b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator, class _Predicate> 42920b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 42930b57cec5SDimitry Andricvoid erase_if(basic_string<_CharT, _Traits, _Allocator>& __str, _Predicate __pred) 42940b57cec5SDimitry Andric{ __str.erase(_VSTD::remove_if(__str.begin(), __str.end(), __pred), __str.end()); } 42950b57cec5SDimitry Andric#endif 42960b57cec5SDimitry Andric 42970b57cec5SDimitry Andric#if _LIBCPP_DEBUG_LEVEL >= 2 42980b57cec5SDimitry Andric 42990b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 43000b57cec5SDimitry Andricbool 43010b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const 43020b57cec5SDimitry Andric{ 4303*480093f4SDimitry Andric return this->data() <= _VSTD::__to_address(__i->base()) && 4304*480093f4SDimitry Andric _VSTD::__to_address(__i->base()) < this->data() + this->size(); 43050b57cec5SDimitry Andric} 43060b57cec5SDimitry Andric 43070b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 43080b57cec5SDimitry Andricbool 43090b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const 43100b57cec5SDimitry Andric{ 4311*480093f4SDimitry Andric return this->data() < _VSTD::__to_address(__i->base()) && 4312*480093f4SDimitry Andric _VSTD::__to_address(__i->base()) <= this->data() + this->size(); 43130b57cec5SDimitry Andric} 43140b57cec5SDimitry Andric 43150b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 43160b57cec5SDimitry Andricbool 43170b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const 43180b57cec5SDimitry Andric{ 4319*480093f4SDimitry Andric const value_type* __p = _VSTD::__to_address(__i->base()) + __n; 43200b57cec5SDimitry Andric return this->data() <= __p && __p <= this->data() + this->size(); 43210b57cec5SDimitry Andric} 43220b57cec5SDimitry Andric 43230b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 43240b57cec5SDimitry Andricbool 43250b57cec5SDimitry Andricbasic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const 43260b57cec5SDimitry Andric{ 4327*480093f4SDimitry Andric const value_type* __p = _VSTD::__to_address(__i->base()) + __n; 43280b57cec5SDimitry Andric return this->data() <= __p && __p < this->data() + this->size(); 43290b57cec5SDimitry Andric} 43300b57cec5SDimitry Andric 43310b57cec5SDimitry Andric#endif // _LIBCPP_DEBUG_LEVEL >= 2 43320b57cec5SDimitry Andric 43330b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<char>) 43340b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<wchar_t>) 43350b57cec5SDimitry Andric 43360b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 11 43370b57cec5SDimitry Andric// Literal suffixes for basic_string [basic.string.literals] 43380b57cec5SDimitry Andricinline namespace literals 43390b57cec5SDimitry Andric{ 43400b57cec5SDimitry Andric inline namespace string_literals 43410b57cec5SDimitry Andric { 43420b57cec5SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 43430b57cec5SDimitry Andric basic_string<char> operator "" s( const char *__str, size_t __len ) 43440b57cec5SDimitry Andric { 43450b57cec5SDimitry Andric return basic_string<char> (__str, __len); 43460b57cec5SDimitry Andric } 43470b57cec5SDimitry Andric 43480b57cec5SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 43490b57cec5SDimitry Andric basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len ) 43500b57cec5SDimitry Andric { 43510b57cec5SDimitry Andric return basic_string<wchar_t> (__str, __len); 43520b57cec5SDimitry Andric } 43530b57cec5SDimitry Andric 43540b57cec5SDimitry Andric#ifndef _LIBCPP_NO_HAS_CHAR8_T 43550b57cec5SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 43560b57cec5SDimitry Andric basic_string<char8_t> operator "" s(const char8_t *__str, size_t __len) _NOEXCEPT 43570b57cec5SDimitry Andric { 43580b57cec5SDimitry Andric return basic_string<char8_t> (__str, __len); 43590b57cec5SDimitry Andric } 43600b57cec5SDimitry Andric#endif 43610b57cec5SDimitry Andric 43620b57cec5SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 43630b57cec5SDimitry Andric basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len ) 43640b57cec5SDimitry Andric { 43650b57cec5SDimitry Andric return basic_string<char16_t> (__str, __len); 43660b57cec5SDimitry Andric } 43670b57cec5SDimitry Andric 43680b57cec5SDimitry Andric inline _LIBCPP_INLINE_VISIBILITY 43690b57cec5SDimitry Andric basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len ) 43700b57cec5SDimitry Andric { 43710b57cec5SDimitry Andric return basic_string<char32_t> (__str, __len); 43720b57cec5SDimitry Andric } 43730b57cec5SDimitry Andric } 43740b57cec5SDimitry Andric} 43750b57cec5SDimitry Andric#endif 43760b57cec5SDimitry Andric 43770b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 43780b57cec5SDimitry Andric 43790b57cec5SDimitry Andric_LIBCPP_POP_MACROS 43800b57cec5SDimitry Andric 43810b57cec5SDimitry Andric#endif // _LIBCPP_STRING 4382