blob: 9f5838d425838d9c40e0e83c960fa35fe0d11246 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
Louis Dionne9bd93882021-11-17 16:25:01 -05002//===----------------------------------------------------------------------===//
Howard Hinnantc51e1022010-05-11 19:42:16 +00003//
Chandler Carruth7642bb12019-01-19 08:50:56 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_STRING
11#define _LIBCPP_STRING
12
13/*
14 string synopsis
15
Mark de Weverb4830e62022-07-19 07:56:23 +020016#include <compare>
17#include <initializer_list>
18
Howard Hinnantc51e1022010-05-11 19:42:16 +000019namespace std
20{
21
22template <class stateT>
23class fpos
24{
25private:
26 stateT st;
27public:
28 fpos(streamoff = streamoff());
29
30 operator streamoff() const;
31
32 stateT state() const;
33 void state(stateT);
34
35 fpos& operator+=(streamoff);
36 fpos operator+ (streamoff) const;
37 fpos& operator-=(streamoff);
38 fpos operator- (streamoff) const;
39};
40
41template <class stateT> streamoff operator-(const fpos<stateT>& x, const fpos<stateT>& y);
42
43template <class stateT> bool operator==(const fpos<stateT>& x, const fpos<stateT>& y);
44template <class stateT> bool operator!=(const fpos<stateT>& x, const fpos<stateT>& y);
45
46template <class charT>
47struct char_traits
48{
Mark de Weverb4830e62022-07-19 07:56:23 +020049 using char_type = charT;
50 using int_type = ...;
51 using off_type = streamoff;
52 using pos_type = streampos;
53 using state_type = mbstate_t;
54 using comparison_category = strong_ordering; // Since C++20 only for the specializations
55 // char, wchar_t, char8_t, char16_t, and char32_t.
Howard Hinnantc51e1022010-05-11 19:42:16 +000056
Howard Hinnantaeb17d82011-05-29 19:57:12 +000057 static void assign(char_type& c1, const char_type& c2) noexcept;
Howard Hinnant270c00e2012-07-20 19:09:12 +000058 static constexpr bool eq(char_type c1, char_type c2) noexcept;
59 static constexpr bool lt(char_type c1, char_type c2) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000060
61 static int compare(const char_type* s1, const char_type* s2, size_t n);
62 static size_t length(const char_type* s);
63 static const char_type* find(const char_type* s, size_t n, const char_type& a);
64 static char_type* move(char_type* s1, const char_type* s2, size_t n);
65 static char_type* copy(char_type* s1, const char_type* s2, size_t n);
66 static char_type* assign(char_type* s, size_t n, char_type a);
67
Howard Hinnant270c00e2012-07-20 19:09:12 +000068 static constexpr int_type not_eof(int_type c) noexcept;
69 static constexpr char_type to_char_type(int_type c) noexcept;
70 static constexpr int_type to_int_type(char_type c) noexcept;
71 static constexpr bool eq_int_type(int_type c1, int_type c2) noexcept;
72 static constexpr int_type eof() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000073};
74
75template <> struct char_traits<char>;
76template <> struct char_traits<wchar_t>;
Marek Kurdeje3ac4e22021-03-23 17:15:07 +010077template <> struct char_traits<char8_t>; // C++20
78template <> struct char_traits<char16_t>;
79template <> struct char_traits<char32_t>;
Howard Hinnantc51e1022010-05-11 19:42:16 +000080
Howard Hinnant3b6579a2010-08-22 00:02:43 +000081template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
Howard Hinnantc51e1022010-05-11 19:42:16 +000082class basic_string
83{
Howard Hinnant3b6579a2010-08-22 00:02:43 +000084public:
85// types:
Howard Hinnantc51e1022010-05-11 19:42:16 +000086 typedef traits traits_type;
87 typedef typename traits_type::char_type value_type;
88 typedef Allocator allocator_type;
89 typedef typename allocator_type::size_type size_type;
90 typedef typename allocator_type::difference_type difference_type;
91 typedef typename allocator_type::reference reference;
92 typedef typename allocator_type::const_reference const_reference;
93 typedef typename allocator_type::pointer pointer;
94 typedef typename allocator_type::const_pointer const_pointer;
95 typedef implementation-defined iterator;
96 typedef implementation-defined const_iterator;
97 typedef std::reverse_iterator<iterator> reverse_iterator;
98 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
99
100 static const size_type npos = -1;
101
Howard Hinnant3e276872011-06-03 18:40:47 +0000102 basic_string()
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200103 noexcept(is_nothrow_default_constructible<allocator_type>::value); // constexpr since C++20
104 explicit basic_string(const allocator_type& a); // constexpr since C++20
105 basic_string(const basic_string& str); // constexpr since C++20
Howard Hinnant3e276872011-06-03 18:40:47 +0000106 basic_string(basic_string&& str)
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200107 noexcept(is_nothrow_move_constructible<allocator_type>::value); // constexpr since C++20
Marshall Clow83445802016-04-07 18:13:41 +0000108 basic_string(const basic_string& str, size_type pos,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200109 const allocator_type& a = allocator_type()); // constexpr since C++20
Marshall Clow83445802016-04-07 18:13:41 +0000110 basic_string(const basic_string& str, size_type pos, size_type n,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200111 const Allocator& a = Allocator()); // constexpr since C++20
Nikolas Klauser1b531cf2022-08-09 13:17:30 +0200112 constexpr basic_string(
113 basic_string&& str, size_type pos, const Allocator& a = Allocator()); // since C++23
114 constexpr basic_string(
115 basic_string&& str, size_type pos, size_type n, const Allocator& a = Allocator()); // since C++23
Marshall Clow78dbe462016-11-14 18:22:19 +0000116 template<class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200117 basic_string(const T& t, size_type pos, size_type n, const Allocator& a = Allocator()); // C++17, constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000118 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200119 explicit basic_string(const T& t, const Allocator& a = Allocator()); // C++17, constexpr since C++20
120 basic_string(const value_type* s, const allocator_type& a = allocator_type()); // constexpr since C++20
121 basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type()); // constexpr since C++20
Marek Kurdej90d79712021-07-27 16:16:21 +0200122 basic_string(nullptr_t) = delete; // C++2b
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200123 basic_string(size_type n, value_type c, const allocator_type& a = allocator_type()); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000124 template<class InputIterator>
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000125 basic_string(InputIterator begin, InputIterator end,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200126 const allocator_type& a = allocator_type()); // constexpr since C++20
127 basic_string(initializer_list<value_type>, const Allocator& = Allocator()); // constexpr since C++20
128 basic_string(const basic_string&, const Allocator&); // constexpr since C++20
129 basic_string(basic_string&&, const Allocator&); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000130
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200131 ~basic_string(); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000132
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200133 operator basic_string_view<charT, traits>() const noexcept; // constexpr since C++20
Marshall Clowdf63a6d2016-07-21 05:31:24 +0000134
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200135 basic_string& operator=(const basic_string& str); // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000136 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200137 basic_string& operator=(const T& t); // C++17, constexpr since C++20
Howard Hinnant3e276872011-06-03 18:40:47 +0000138 basic_string& operator=(basic_string&& str)
139 noexcept(
Marshall Clow2fe8a8d2015-08-18 18:57:00 +0000140 allocator_type::propagate_on_container_move_assignment::value ||
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200141 allocator_type::is_always_equal::value ); // C++17, constexpr since C++20
142 basic_string& operator=(const value_type* s); // constexpr since C++20
Marek Kurdej90d79712021-07-27 16:16:21 +0200143 basic_string& operator=(nullptr_t) = delete; // C++2b
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200144 basic_string& operator=(value_type c); // constexpr since C++20
145 basic_string& operator=(initializer_list<value_type>); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000146
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200147 iterator begin() noexcept; // constexpr since C++20
148 const_iterator begin() const noexcept; // constexpr since C++20
149 iterator end() noexcept; // constexpr since C++20
150 const_iterator end() const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000151
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200152 reverse_iterator rbegin() noexcept; // constexpr since C++20
153 const_reverse_iterator rbegin() const noexcept; // constexpr since C++20
154 reverse_iterator rend() noexcept; // constexpr since C++20
155 const_reverse_iterator rend() const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000156
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200157 const_iterator cbegin() const noexcept; // constexpr since C++20
158 const_iterator cend() const noexcept; // constexpr since C++20
159 const_reverse_iterator crbegin() const noexcept; // constexpr since C++20
160 const_reverse_iterator crend() const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000161
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200162 size_type size() const noexcept; // constexpr since C++20
163 size_type length() const noexcept; // constexpr since C++20
164 size_type max_size() const noexcept; // constexpr since C++20
165 size_type capacity() const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000166
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200167 void resize(size_type n, value_type c); // constexpr since C++20
168 void resize(size_type n); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000169
Nikolas Klauser9e6040c2022-01-06 21:43:26 +0100170 template<class Operation>
171 constexpr void resize_and_overwrite(size_type n, Operation op); // since C++23
172
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200173 void reserve(size_type res_arg); // constexpr since C++20
Marek Kurdejc9848142020-11-26 10:07:16 +0100174 void reserve(); // deprecated in C++20
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200175 void shrink_to_fit(); // constexpr since C++20
176 void clear() noexcept; // constexpr since C++20
177 bool empty() const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000178
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200179 const_reference operator[](size_type pos) const; // constexpr since C++20
180 reference operator[](size_type pos); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000181
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200182 const_reference at(size_type n) const; // constexpr since C++20
183 reference at(size_type n); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000184
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200185 basic_string& operator+=(const basic_string& str); // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000186 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200187 basic_string& operator+=(const T& t); // C++17, constexpr since C++20
188 basic_string& operator+=(const value_type* s); // constexpr since C++20
189 basic_string& operator+=(value_type c); // constexpr since C++20
190 basic_string& operator+=(initializer_list<value_type>); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000191
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200192 basic_string& append(const basic_string& str); // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000193 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200194 basic_string& append(const T& t); // C++17, constexpr since C++20
195 basic_string& append(const basic_string& str, size_type pos, size_type n=npos); // C++14, constexpr since C++20
Marshall Clow82513342016-09-24 22:45:42 +0000196 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200197 basic_string& append(const T& t, size_type pos, size_type n=npos); // C++17, constexpr since C++20
198 basic_string& append(const value_type* s, size_type n); // constexpr since C++20
199 basic_string& append(const value_type* s); // constexpr since C++20
200 basic_string& append(size_type n, value_type c); // constexpr since C++20
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000201 template<class InputIterator>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200202 basic_string& append(InputIterator first, InputIterator last); // constexpr since C++20
203 basic_string& append(initializer_list<value_type>); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000204
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200205 void push_back(value_type c); // constexpr since C++20
206 void pop_back(); // constexpr since C++20
207 reference front(); // constexpr since C++20
208 const_reference front() const; // constexpr since C++20
209 reference back(); // constexpr since C++20
210 const_reference back() const; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000211
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200212 basic_string& assign(const basic_string& str); // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000213 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200214 basic_string& assign(const T& t); // C++17, constexpr since C++20
215 basic_string& assign(basic_string&& str); // constexpr since C++20
216 basic_string& assign(const basic_string& str, size_type pos, size_type n=npos); // C++14, constexpr since C++20
Marshall Clow82513342016-09-24 22:45:42 +0000217 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200218 basic_string& assign(const T& t, size_type pos, size_type n=npos); // C++17, constexpr since C++20
219 basic_string& assign(const value_type* s, size_type n); // constexpr since C++20
220 basic_string& assign(const value_type* s); // constexpr since C++20
221 basic_string& assign(size_type n, value_type c); // constexpr since C++20
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000222 template<class InputIterator>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200223 basic_string& assign(InputIterator first, InputIterator last); // constexpr since C++20
224 basic_string& assign(initializer_list<value_type>); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000225
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200226 basic_string& insert(size_type pos1, const basic_string& str); // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000227 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200228 basic_string& insert(size_type pos1, const T& t); // constexpr since C++20
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000229 basic_string& insert(size_type pos1, const basic_string& str,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200230 size_type pos2, size_type n); // constexpr since C++20
Marshall Clow82513342016-09-24 22:45:42 +0000231 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200232 basic_string& insert(size_type pos1, const T& t, size_type pos2, size_type n); // C++17, constexpr since C++20
233 basic_string& insert(size_type pos, const value_type* s, size_type n=npos); // C++14, constexpr since C++20
234 basic_string& insert(size_type pos, const value_type* s); // constexpr since C++20
235 basic_string& insert(size_type pos, size_type n, value_type c); // constexpr since C++20
236 iterator insert(const_iterator p, value_type c); // constexpr since C++20
237 iterator insert(const_iterator p, size_type n, value_type c); // constexpr since C++20
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000238 template<class InputIterator>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200239 iterator insert(const_iterator p, InputIterator first, InputIterator last); // constexpr since C++20
240 iterator insert(const_iterator p, initializer_list<value_type>); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000241
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200242 basic_string& erase(size_type pos = 0, size_type n = npos); // constexpr since C++20
243 iterator erase(const_iterator position); // constexpr since C++20
244 iterator erase(const_iterator first, const_iterator last); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000245
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200246 basic_string& replace(size_type pos1, size_type n1, const basic_string& str); // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000247 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200248 basic_string& replace(size_type pos1, size_type n1, const T& t); // C++17, constexpr since C++20
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000249 basic_string& replace(size_type pos1, size_type n1, const basic_string& str,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200250 size_type pos2, size_type n2=npos); // C++14, constexpr since C++20
Marshall Clow82513342016-09-24 22:45:42 +0000251 template <class T>
252 basic_string& replace(size_type pos1, size_type n1, const T& t,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200253 size_type pos2, size_type n); // C++17, constexpr since C++20
254 basic_string& replace(size_type pos, size_type n1, const value_type* s, size_type n2); // constexpr since C++20
255 basic_string& replace(size_type pos, size_type n1, const value_type* s); // constexpr since C++20
256 basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c); // constexpr since C++20
257 basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str); // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000258 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200259 basic_string& replace(const_iterator i1, const_iterator i2, const T& t); // C++17, constexpr since C++20
260 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n); // constexpr since C++20
261 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s); // constexpr since C++20
262 basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c); // constexpr since C++20
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000263 template<class InputIterator>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200264 basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2); // constexpr since C++20
265 basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000266
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200267 size_type copy(value_type* s, size_type n, size_type pos = 0) const; // constexpr since C++20
Nikolas Klauser1b531cf2022-08-09 13:17:30 +0200268 basic_string substr(size_type pos = 0, size_type n = npos) const; // constexpr in C++20, removed in C++23
269 basic_string substr(size_type pos = 0, size_type n = npos) const&; // since C++23
270 constexpr basic_string substr(size_type pos = 0, size_type n = npos) &&; // since C++23
Howard Hinnant3e276872011-06-03 18:40:47 +0000271 void swap(basic_string& str)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000272 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200273 allocator_traits<allocator_type>::is_always_equal::value); // C++17, constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000274
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200275 const value_type* c_str() const noexcept; // constexpr since C++20
276 const value_type* data() const noexcept; // constexpr since C++20
277 value_type* data() noexcept; // C++17, constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000278
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200279 allocator_type get_allocator() const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000280
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200281 size_type find(const basic_string& str, size_type pos = 0) const noexcept; // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000282 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200283 size_type find(const T& t, size_type pos = 0) const noexcept; // C++17, noexcept as an extension, constexpr since C++20
284 size_type find(const value_type* s, size_type pos, size_type n) const noexcept; // constexpr since C++20
285 size_type find(const value_type* s, size_type pos = 0) const noexcept; // constexpr since C++20
286 size_type find(value_type c, size_type pos = 0) const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000287
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200288 size_type rfind(const basic_string& str, size_type pos = npos) const noexcept; // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000289 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200290 size_type rfind(const T& t, size_type pos = npos) const noexcept; // C++17, noexcept as an extension, constexpr since C++20
291 size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept; // constexpr since C++20
292 size_type rfind(const value_type* s, size_type pos = npos) const noexcept; // constexpr since C++20
293 size_type rfind(value_type c, size_type pos = npos) const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000294
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200295 size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept; // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000296 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200297 size_type find_first_of(const T& t, size_type pos = 0) const noexcept; // C++17, noexcept as an extension, constexpr since C++20
298 size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept; // constexpr since C++20
299 size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept; // constexpr since C++20
300 size_type find_first_of(value_type c, size_type pos = 0) const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000301
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200302 size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept; // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000303 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200304 size_type find_last_of(const T& t, size_type pos = npos) const noexcept noexcept; // C++17, noexcept as an extension, constexpr since C++20
305 size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept; // constexpr since C++20
306 size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept; // constexpr since C++20
307 size_type find_last_of(value_type c, size_type pos = npos) const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000308
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200309 size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept; // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000310 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200311 size_type find_first_not_of(const T& t, size_type pos = 0) const noexcept; // C++17, noexcept as an extension, constexpr since C++20
312 size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept; // constexpr since C++20
313 size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept; // constexpr since C++20
314 size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000315
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200316 size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept; // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000317 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200318 size_type find_last_not_of(const T& t, size_type pos = npos) const noexcept; // C++17, noexcept as an extension, constexpr since C++20
319 size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept; // constexpr since C++20
320 size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept; // constexpr since C++20
321 size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000322
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200323 int compare(const basic_string& str) const noexcept; // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000324 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200325 int compare(const T& t) const noexcept; // C++17, noexcept as an extension, constexpr since C++20
326 int compare(size_type pos1, size_type n1, const basic_string& str) const; // constexpr since C++20
Marshall Clowe46031a2018-07-02 18:41:15 +0000327 template <class T>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200328 int compare(size_type pos1, size_type n1, const T& t) const; // C++17, constexpr since C++20
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000329 int compare(size_type pos1, size_type n1, const basic_string& str,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200330 size_type pos2, size_type n2=npos) const; // C++14, constexpr since C++20
Marshall Clow82513342016-09-24 22:45:42 +0000331 template <class T>
332 int compare(size_type pos1, size_type n1, const T& t,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200333 size_type pos2, size_type n2=npos) const; // C++17, constexpr since C++20
334 int compare(const value_type* s) const noexcept; // constexpr since C++20
335 int compare(size_type pos1, size_type n1, const value_type* s) const; // constexpr since C++20
336 int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200338 constexpr bool starts_with(basic_string_view<charT, traits> sv) const noexcept; // C++20
339 constexpr bool starts_with(charT c) const noexcept; // C++20
340 constexpr bool starts_with(const charT* s) const; // C++20
341 constexpr bool ends_with(basic_string_view<charT, traits> sv) const noexcept; // C++20
342 constexpr bool ends_with(charT c) const noexcept; // C++20
343 constexpr bool ends_with(const charT* s) const; // C++20
Marshall Clow18c293b2017-12-04 20:11:38 +0000344
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200345 constexpr bool contains(basic_string_view<charT, traits> sv) const noexcept; // C++2b
346 constexpr bool contains(charT c) const noexcept; // C++2b
347 constexpr bool contains(const charT* s) const; // C++2b
Howard Hinnantc51e1022010-05-11 19:42:16 +0000348};
349
Marshall Clowa0563332018-02-08 06:34:03 +0000350template<class InputIterator,
351 class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
352basic_string(InputIterator, InputIterator, Allocator = Allocator())
353 -> basic_string<typename iterator_traits<InputIterator>::value_type,
354 char_traits<typename iterator_traits<InputIterator>::value_type>,
355 Allocator>; // C++17
356
Howard Hinnantc51e1022010-05-11 19:42:16 +0000357template<class charT, class traits, class Allocator>
358basic_string<charT, traits, Allocator>
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000359operator+(const basic_string<charT, traits, Allocator>& lhs,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200360 const basic_string<charT, traits, Allocator>& rhs); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000361
362template<class charT, class traits, class Allocator>
363basic_string<charT, traits, Allocator>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200364operator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000365
366template<class charT, class traits, class Allocator>
367basic_string<charT, traits, Allocator>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200368operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000369
370template<class charT, class traits, class Allocator>
371basic_string<charT, traits, Allocator>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200372operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373
374template<class charT, class traits, class Allocator>
375basic_string<charT, traits, Allocator>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200376operator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377
378template<class charT, class traits, class Allocator>
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000379bool operator==(const basic_string<charT, traits, Allocator>& lhs,
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200380 const basic_string<charT, traits, Allocator>& rhs) noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000381
382template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200383bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384
385template<class charT, class traits, class Allocator>
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200386bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept; // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000387
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000388template<class charT, class traits, class Allocator>
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000389bool operator!=(const basic_string<charT,traits,Allocator>& lhs,
Mark de Weveraf1968a2022-08-14 14:14:09 +0200390 const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391
392template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200393bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000394
395template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200396bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000397
398template<class charT, class traits, class Allocator>
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000399bool operator< (const basic_string<charT, traits, Allocator>& lhs,
Mark de Weveraf1968a2022-08-14 14:14:09 +0200400 const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000401
402template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200403bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404
405template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200406bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407
408template<class charT, class traits, class Allocator>
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000409bool operator> (const basic_string<charT, traits, Allocator>& lhs,
Mark de Weveraf1968a2022-08-14 14:14:09 +0200410 const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411
412template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200413bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000414
415template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200416bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000417
418template<class charT, class traits, class Allocator>
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000419bool operator<=(const basic_string<charT, traits, Allocator>& lhs,
Mark de Weveraf1968a2022-08-14 14:14:09 +0200420 const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000421
422template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200423bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000424
425template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200426bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000427
428template<class charT, class traits, class Allocator>
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000429bool operator>=(const basic_string<charT, traits, Allocator>& lhs,
Mark de Weveraf1968a2022-08-14 14:14:09 +0200430 const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000431
432template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200433bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; // removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000434
435template<class charT, class traits, class Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +0200436bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; // removed in C++20
Mark de Weverb4830e62022-07-19 07:56:23 +0200437
438template<class charT, class traits, class Allocator> // since C++20
439constexpr see below operator<=>(const basic_string<charT, traits, Allocator>& lhs,
440 const basic_string<charT, traits, Allocator>& rhs) noexcept;
441
442template<class charT, class traits, class Allocator> // since C++20
443constexpr see below operator<=>(const basic_string<charT, traits, Allocator>& lhs,
444 const charT* rhs) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000445
446template<class charT, class traits, class Allocator>
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000447void swap(basic_string<charT, traits, Allocator>& lhs,
Howard Hinnant3e276872011-06-03 18:40:47 +0000448 basic_string<charT, traits, Allocator>& rhs)
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200449 noexcept(noexcept(lhs.swap(rhs))); // constexpr since C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000450
451template<class charT, class traits, class Allocator>
452basic_istream<charT, traits>&
453operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
454
455template<class charT, class traits, class Allocator>
456basic_ostream<charT, traits>&
457operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
458
459template<class charT, class traits, class Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000460basic_istream<charT, traits>&
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000461getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str,
462 charT delim);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000463
464template<class charT, class traits, class Allocator>
465basic_istream<charT, traits>&
466getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
467
Marshall Clow29b53f22018-12-14 18:49:35 +0000468template<class charT, class traits, class Allocator, class U>
Marek Kurdeja98b1412020-05-02 13:58:03 +0200469typename basic_string<charT, traits, Allocator>::size_type
470erase(basic_string<charT, traits, Allocator>& c, const U& value); // C++20
Marshall Clow29b53f22018-12-14 18:49:35 +0000471template<class charT, class traits, class Allocator, class Predicate>
Marek Kurdeja98b1412020-05-02 13:58:03 +0200472typename basic_string<charT, traits, Allocator>::size_type
473erase_if(basic_string<charT, traits, Allocator>& c, Predicate pred); // C++20
Marshall Clow29b53f22018-12-14 18:49:35 +0000474
Howard Hinnantc51e1022010-05-11 19:42:16 +0000475typedef basic_string<char> string;
476typedef basic_string<wchar_t> wstring;
Marek Kurdeje3ac4e22021-03-23 17:15:07 +0100477typedef basic_string<char8_t> u8string; // C++20
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000478typedef basic_string<char16_t> u16string;
479typedef basic_string<char32_t> u32string;
480
Bruce Mitchener170d8972020-11-24 12:53:53 -0500481int stoi (const string& str, size_t* idx = nullptr, int base = 10);
482long stol (const string& str, size_t* idx = nullptr, int base = 10);
483unsigned long stoul (const string& str, size_t* idx = nullptr, int base = 10);
484long long stoll (const string& str, size_t* idx = nullptr, int base = 10);
485unsigned long long stoull(const string& str, size_t* idx = nullptr, int base = 10);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000486
Bruce Mitchener170d8972020-11-24 12:53:53 -0500487float stof (const string& str, size_t* idx = nullptr);
488double stod (const string& str, size_t* idx = nullptr);
489long double stold(const string& str, size_t* idx = nullptr);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000490
491string to_string(int val);
492string to_string(unsigned val);
493string to_string(long val);
494string to_string(unsigned long val);
495string to_string(long long val);
496string to_string(unsigned long long val);
497string to_string(float val);
498string to_string(double val);
499string to_string(long double val);
500
Bruce Mitchener170d8972020-11-24 12:53:53 -0500501int stoi (const wstring& str, size_t* idx = nullptr, int base = 10);
502long stol (const wstring& str, size_t* idx = nullptr, int base = 10);
503unsigned long stoul (const wstring& str, size_t* idx = nullptr, int base = 10);
504long long stoll (const wstring& str, size_t* idx = nullptr, int base = 10);
505unsigned long long stoull(const wstring& str, size_t* idx = nullptr, int base = 10);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000506
Bruce Mitchener170d8972020-11-24 12:53:53 -0500507float stof (const wstring& str, size_t* idx = nullptr);
508double stod (const wstring& str, size_t* idx = nullptr);
509long double stold(const wstring& str, size_t* idx = nullptr);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000510
511wstring to_wstring(int val);
512wstring to_wstring(unsigned val);
513wstring to_wstring(long val);
514wstring to_wstring(unsigned long val);
515wstring to_wstring(long long val);
516wstring to_wstring(unsigned long long val);
517wstring to_wstring(float val);
518wstring to_wstring(double val);
519wstring to_wstring(long double val);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000520
521template <> struct hash<string>;
Marek Kurdeje3ac4e22021-03-23 17:15:07 +0100522template <> struct hash<u8string>; // C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000523template <> struct hash<u16string>;
524template <> struct hash<u32string>;
525template <> struct hash<wstring>;
526
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200527basic_string<char> operator "" s( const char *str, size_t len ); // C++14, constexpr since C++20
528basic_string<wchar_t> operator "" s( const wchar_t *str, size_t len ); // C++14, constexpr since C++20
529constexpr basic_string<char8_t> operator "" s( const char8_t *str, size_t len ); // C++20
530basic_string<char16_t> operator "" s( const char16_t *str, size_t len ); // C++14, constexpr since C++20
531basic_string<char32_t> operator "" s( const char32_t *str, size_t len ); // C++14, constexpr since C++20
Marshall Clowcba751f2013-07-23 17:05:24 +0000532
Howard Hinnantc51e1022010-05-11 19:42:16 +0000533} // std
534
535*/
536
Nikolas Klauserf210d8a2022-02-15 18:18:08 +0100537#include <__algorithm/max.h>
538#include <__algorithm/min.h>
539#include <__algorithm/remove.h>
540#include <__algorithm/remove_if.h>
Louis Dionneb4fce352022-03-25 12:55:36 -0400541#include <__assert> // all public C++ headers provide the assertion handler
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542#include <__config>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400543#include <__debug>
Mark de Weverdf3e0d42021-09-26 15:47:42 +0200544#include <__format/enable_insertable.h>
Nikolas Klauser11a0ff32022-06-06 23:35:24 +0200545#include <__functional/hash.h>
Nikolas Klauser24540d32022-05-21 00:45:51 +0200546#include <__functional/unary_function.h>
Nikolas Klauser713bfda2022-10-13 01:03:58 +0200547#include <__fwd/string.h>
Nikolas Klauser80840272022-02-04 13:04:33 +0100548#include <__ios/fpos.h>
Nikolas Klauserfb1b0672022-06-10 19:53:10 +0200549#include <__iterator/distance.h>
550#include <__iterator/iterator_traits.h>
551#include <__iterator/reverse_iterator.h>
Louis Dionne77249522021-06-11 09:55:11 -0400552#include <__iterator/wrap_iter.h>
Nikolas Klauserc513eba2022-04-09 09:41:19 +0200553#include <__memory/allocate_at_least.h>
Nikolas Klauser0b5df932022-09-05 00:01:15 +0200554#include <__memory/allocator.h>
555#include <__memory/allocator_traits.h>
556#include <__memory/compressed_pair.h>
557#include <__memory/construct_at.h>
558#include <__memory/pointer_traits.h>
Nikolas Klauser35080b42022-07-26 16:13:56 +0200559#include <__memory/swap_allocator.h>
Arthur O'Dwyerebf2d342022-10-06 16:53:30 -0400560#include <__memory_resource/polymorphic_allocator.h>
Nikolas Klauser11a0ff32022-06-06 23:35:24 +0200561#include <__string/char_traits.h>
562#include <__string/extern_template_lists.h>
Nikolas Klauser0b5df932022-09-05 00:01:15 +0200563#include <__type_traits/is_allocator.h>
564#include <__type_traits/noexcept_move_assign_container.h>
Nikolas Klauser8fccd622022-03-05 19:17:07 +0100565#include <__utility/auto_cast.h>
566#include <__utility/move.h>
567#include <__utility/swap.h>
Nikolas Klauser62060be2022-04-20 10:52:04 +0200568#include <__utility/unreachable.h>
569#include <climits>
Louis Dionne44962c32022-06-13 11:21:16 -0400570#include <cstdint>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400571#include <cstdio> // EOF
Louis Dionned24191c2021-08-19 12:39:16 -0400572#include <cstdlib>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400573#include <cstring>
Nikolas Klauser62060be2022-04-20 10:52:04 +0200574#include <limits>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000575#include <stdexcept>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400576#include <string_view>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000577#include <type_traits>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000578#include <version>
Marshall Clowdf63a6d2016-07-21 05:31:24 +0000579
Louis Dionne89258142021-08-23 15:32:36 -0400580#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Nikolas Klauser80840272022-02-04 13:04:33 +0100581# include <cwchar>
Louis Dionne89258142021-08-23 15:32:36 -0400582#endif
583
Nikolas Klausera0e0edb2022-06-16 22:43:46 +0200584// standard-mandated includes
585
586// [iterator.range]
587#include <__iterator/access.h>
588#include <__iterator/data.h>
589#include <__iterator/empty.h>
590#include <__iterator/reverse_access.h>
591#include <__iterator/size.h>
592
593// [string.syn]
594#include <compare>
595#include <initializer_list>
596
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000597#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500598# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000599#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000600
Eric Fiselierf4433a32017-05-31 22:07:49 +0000601_LIBCPP_PUSH_MACROS
602#include <__undef_macros>
603
604
Howard Hinnantc51e1022010-05-11 19:42:16 +0000605_LIBCPP_BEGIN_NAMESPACE_STD
606
Howard Hinnantc51e1022010-05-11 19:42:16 +0000607// basic_string
608
609template<class _CharT, class _Traits, class _Allocator>
610basic_string<_CharT, _Traits, _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200611_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant944510a2011-06-14 19:58:17 +0000612operator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
613 const basic_string<_CharT, _Traits, _Allocator>& __y);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000614
615template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200616_LIBCPP_HIDDEN _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000617basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant944510a2011-06-14 19:58:17 +0000618operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000619
620template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200621_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant944510a2011-06-14 19:58:17 +0000623operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000624
625template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200626inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000627basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant944510a2011-06-14 19:58:17 +0000628operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000629
630template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200631_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000632basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant944510a2011-06-14 19:58:17 +0000633operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000634
Louis Dionnedc496ec2021-06-08 17:25:08 -0400635extern template _LIBCPP_FUNC_VIS string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&);
Shoaib Meenaiea363712017-07-29 02:54:41 +0000636
Marshall Clow039b2f02016-01-13 21:54:34 +0000637template <class _Iter>
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -0400638struct __string_is_trivial_iterator : public false_type {};
639
640template <class _Tp>
641struct __string_is_trivial_iterator<_Tp*>
642 : public is_arithmetic<_Tp> {};
Marshall Clow039b2f02016-01-13 21:54:34 +0000643
Louis Dionne173f29e2019-05-29 16:01:36 +0000644template <class _Iter>
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -0400645struct __string_is_trivial_iterator<__wrap_iter<_Iter> >
646 : public __string_is_trivial_iterator<_Iter> {};
Marshall Clow039b2f02016-01-13 21:54:34 +0000647
Marshall Clow82513342016-09-24 22:45:42 +0000648template <class _CharT, class _Traits, class _Tp>
Eric Fiselierc522ceb2020-01-15 16:57:08 -0500649struct __can_be_converted_to_string_view : public _BoolConstant<
650 is_convertible<const _Tp&, basic_string_view<_CharT, _Traits> >::value &&
651 !is_convertible<const _Tp&, const _CharT*>::value
652 > {};
Marshall Clow82513342016-09-24 22:45:42 +0000653
Nikolas Klauser55dc8082022-04-09 16:19:45 +0200654struct __uninitialized_size_tag {};
655
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000656template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser713bfda2022-10-13 01:03:58 +0200657class basic_string
Howard Hinnantc51e1022010-05-11 19:42:16 +0000658{
659public:
660 typedef basic_string __self;
Marshall Clowdf63a6d2016-07-21 05:31:24 +0000661 typedef basic_string_view<_CharT, _Traits> __self_view;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000662 typedef _Traits traits_type;
Marshall Clowa3a74e02017-03-15 18:41:11 +0000663 typedef _CharT value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000664 typedef _Allocator allocator_type;
Howard Hinnantea8f7e12010-11-17 17:55:08 +0000665 typedef allocator_traits<allocator_type> __alloc_traits;
666 typedef typename __alloc_traits::size_type size_type;
667 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant3e276872011-06-03 18:40:47 +0000668 typedef value_type& reference;
669 typedef const value_type& const_reference;
Howard Hinnantea8f7e12010-11-17 17:55:08 +0000670 typedef typename __alloc_traits::pointer pointer;
671 typedef typename __alloc_traits::const_pointer const_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000672
Marshall Clow79f33542018-03-21 00:36:05 +0000673 static_assert((!is_array<value_type>::value), "Character type of basic_string must not be an array");
674 static_assert(( is_standard_layout<value_type>::value), "Character type of basic_string must be standard-layout");
675 static_assert(( is_trivial<value_type>::value), "Character type of basic_string must be trivial");
676 static_assert(( is_same<_CharT, typename traits_type::char_type>::value),
Howard Hinnant8ea98242013-08-23 17:37:05 +0000677 "traits_type::char_type must be the same type as CharT");
Marshall Clow79f33542018-03-21 00:36:05 +0000678 static_assert(( is_same<typename allocator_type::value_type, value_type>::value),
Howard Hinnant8ea98242013-08-23 17:37:05 +0000679 "Allocator::value_type must be same type as value_type");
Marshall Clowe46031a2018-07-02 18:41:15 +0000680
Nikolas Klausereb116e22022-10-08 22:17:32 +0200681 static_assert(is_same<allocator_type, __rebind_alloc<__alloc_traits, value_type> >::value,
682 "[allocator.requirements] states that rebinding an allocator to the same type should result in the "
683 "original allocator");
684
Louis Dionnedd059fa2022-11-14 10:33:03 -1000685 // TODO: Implement iterator bounds checking without requiring the global database.
Howard Hinnantc51e1022010-05-11 19:42:16 +0000686 typedef __wrap_iter<pointer> iterator;
687 typedef __wrap_iter<const_pointer> const_iterator;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200688 typedef std::reverse_iterator<iterator> reverse_iterator;
689 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000690
691private:
Nikolas Klauser1aa21112022-05-14 12:38:00 +0200692 static_assert(CHAR_BIT == 8, "This implementation assumes that one byte contains 8 bits");
Howard Hinnant68bf1812013-04-30 21:44:48 +0000693
Evgeniy Stepanovda2ff7e2015-10-13 23:48:28 +0000694#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant68bf1812013-04-30 21:44:48 +0000695
696 struct __long
697 {
698 pointer __data_;
699 size_type __size_;
Nikolas Klauser62060be2022-04-20 10:52:04 +0200700 size_type __cap_ : sizeof(size_type) * CHAR_BIT - 1;
701 size_type __is_long_ : 1;
Howard Hinnant68bf1812013-04-30 21:44:48 +0000702 };
703
Howard Hinnant68bf1812013-04-30 21:44:48 +0000704 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
705 (sizeof(__long) - 1)/sizeof(value_type) : 2};
706
707 struct __short
708 {
709 value_type __data_[__min_cap];
Nikolas Klauser1aa21112022-05-14 12:38:00 +0200710 unsigned char __padding_[sizeof(value_type) - 1];
Nikolas Klauser95cfe622022-06-11 23:43:00 +0200711 unsigned char __size_ : 7;
712 unsigned char __is_long_ : 1;
Howard Hinnant68bf1812013-04-30 21:44:48 +0000713 };
714
Nikolas Klauser62060be2022-04-20 10:52:04 +0200715// The __endian_factor is required because the field we use to store the size
Nikolas Klauser1aa21112022-05-14 12:38:00 +0200716// has one fewer bit than it would if it were not a bitfield.
Nikolas Klauser62060be2022-04-20 10:52:04 +0200717//
718// If the LSB is used to store the short-flag in the short string representation,
719// we have to multiply the size by two when it is stored and divide it by two when
720// it is loaded to make sure that we always store an even number. In the long string
721// representation, we can ignore this because we can assume that we always allocate
722// an even amount of value_types.
723//
724// If the MSB is used for the short-flag, the max_size() is numeric_limits<size_type>::max() / 2.
725// This does not impact the short string representation, since we never need the MSB
726// for representing the size of a short string anyway.
727
728#ifdef _LIBCPP_BIG_ENDIAN
729 static const size_type __endian_factor = 2;
Howard Hinnant68bf1812013-04-30 21:44:48 +0000730#else
Nikolas Klauser62060be2022-04-20 10:52:04 +0200731 static const size_type __endian_factor = 1;
732#endif
733
734#else // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
735
736#ifdef _LIBCPP_BIG_ENDIAN
737 static const size_type __endian_factor = 1;
738#else
739 static const size_type __endian_factor = 2;
740#endif
Howard Hinnant68bf1812013-04-30 21:44:48 +0000741
Xing Xue38b9fc42022-06-24 17:25:15 -0400742 // Attribute 'packed' is used to keep the layout compatible with the
743 // previous definition that did not use bit fields. This is because on
744 // some platforms bit fields have a default size rather than the actual
745 // size used, e.g., it is 4 bytes on AIX. See D128285 for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +0000746 struct __long
747 {
Xing Xue38b9fc42022-06-24 17:25:15 -0400748 struct _LIBCPP_PACKED {
749 size_type __is_long_ : 1;
750 size_type __cap_ : sizeof(size_type) * CHAR_BIT - 1;
751 };
Howard Hinnantc51e1022010-05-11 19:42:16 +0000752 size_type __size_;
753 pointer __data_;
754 };
755
Howard Hinnantc51e1022010-05-11 19:42:16 +0000756 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
757 (sizeof(__long) - 1)/sizeof(value_type) : 2};
758
759 struct __short
760 {
Xing Xue38b9fc42022-06-24 17:25:15 -0400761 struct _LIBCPP_PACKED {
762 unsigned char __is_long_ : 1;
763 unsigned char __size_ : 7;
764 };
Nikolas Klauser1aa21112022-05-14 12:38:00 +0200765 char __padding_[sizeof(value_type) - 1];
Howard Hinnantc51e1022010-05-11 19:42:16 +0000766 value_type __data_[__min_cap];
767 };
768
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400769#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant68bf1812013-04-30 21:44:48 +0000770
Nikolas Klauser95cfe622022-06-11 23:43:00 +0200771 static_assert(sizeof(__short) == (sizeof(value_type) * (__min_cap + 1)), "__short has an unexpected size.");
772
Howard Hinnant8ea98242013-08-23 17:37:05 +0000773 union __ulx{__long __lx; __short __lxx;};
Howard Hinnantc51e1022010-05-11 19:42:16 +0000774
Howard Hinnant8ea98242013-08-23 17:37:05 +0000775 enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
Howard Hinnantc51e1022010-05-11 19:42:16 +0000776
777 struct __raw
778 {
779 size_type __words[__n_words];
780 };
781
782 struct __rep
783 {
784 union
785 {
786 __long __l;
787 __short __s;
788 __raw __r;
789 };
790 };
791
792 __compressed_pair<__rep, allocator_type> __r_;
793
Nikolas Klauser55dc8082022-04-09 16:19:45 +0200794 // Construct a string with the given allocator and enough storage to hold `__size` characters, but
795 // don't initialize the characters. The contents of the string, including the null terminator, must be
796 // initialized separately.
Nikolas Klauser8b1c5062022-08-19 13:08:01 +0200797 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200798 explicit basic_string(__uninitialized_size_tag, size_type __size, const allocator_type& __a)
Nikolas Klauser55dc8082022-04-09 16:19:45 +0200799 : __r_(__default_init_tag(), __a) {
800 if (__size > max_size())
801 __throw_length_error();
802 if (__fits_in_sso(__size)) {
Nikolas Klauser8577eec2022-08-30 17:43:14 +0200803 __r_.first() = __rep();
Nikolas Klauser55dc8082022-04-09 16:19:45 +0200804 __set_short_size(__size);
805 } else {
806 auto __capacity = __recommend(__size) + 1;
807 auto __allocation = __alloc_traits::allocate(__alloc(), __capacity);
Nikolas Klauser80b3cf32022-04-27 10:11:44 +0200808 __begin_lifetime(__allocation, __capacity);
Nikolas Klauser55dc8082022-04-09 16:19:45 +0200809 __set_long_cap(__capacity);
810 __set_long_pointer(__allocation);
811 __set_long_size(__size);
812 }
813 std::__debug_db_insert_c(this);
814 }
815
Louis Dionnecd0a0502022-11-14 11:01:05 -1000816 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator __make_iterator(pointer __p) {
817 return iterator(this, __p);
818 }
819
820 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator __make_const_iterator(const_pointer __p) const {
821 return const_iterator(this, __p);
822 }
823
Howard Hinnantc51e1022010-05-11 19:42:16 +0000824public:
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200825 _LIBCPP_TEMPLATE_DATA_VIS static const size_type npos = -1;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000826
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200827 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string()
828 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
829 : __r_(__default_init_tag(), __default_init_tag()) {
830 std::__debug_db_insert_c(this);
831 __default_init();
832 }
Marshall Clowa80abc72015-06-03 19:56:43 +0000833
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200834 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(const allocator_type& __a)
Marshall Clowa80abc72015-06-03 19:56:43 +0000835#if _LIBCPP_STD_VER <= 14
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200836 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
Marshall Clowa80abc72015-06-03 19:56:43 +0000837#else
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200838 _NOEXCEPT
Marshall Clowa80abc72015-06-03 19:56:43 +0000839#endif
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200840 : __r_(__default_init_tag(), __a) {
841 std::__debug_db_insert_c(this);
842 __default_init();
843 }
Marshall Clowa80abc72015-06-03 19:56:43 +0000844
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200845 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const basic_string& __str);
846 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const basic_string& __str, const allocator_type& __a);
Marshall Clowa80abc72015-06-03 19:56:43 +0000847
Eric Fiselierfc92be82017-04-19 00:28:44 +0000848#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200849 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(basic_string&& __str)
850# if _LIBCPP_STD_VER <= 14
851 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
852# else
853 _NOEXCEPT
854# endif
855 : __r_(std::move(__str.__r_)) {
856 __str.__default_init();
857 std::__debug_db_insert_c(this);
858 if (__is_long())
859 std::__debug_db_swap(this, &__str);
860 }
Marshall Clowa80abc72015-06-03 19:56:43 +0000861
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200862 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(basic_string&& __str, const allocator_type& __a)
863 : __r_(__default_init_tag(), __a) {
864 if (__str.__is_long() && __a != __str.__alloc()) // copy, not move
865 __init(std::__to_address(__str.__get_long_pointer()), __str.__get_long_size());
866 else {
867 if (__libcpp_is_constant_evaluated())
868 __r_.first() = __rep();
869 __r_.first() = __str.__r_.first();
870 __str.__default_init();
871 }
872 std::__debug_db_insert_c(this);
873 if (__is_long())
874 std::__debug_db_swap(this, &__str);
875 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400876#endif // _LIBCPP_CXX03_LANG
Marshall Clowe46031a2018-07-02 18:41:15 +0000877
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200878 template <class = __enable_if_t<__is_allocator<_Allocator>::value, nullptr_t> >
879 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const _CharT* __s)
880 : __r_(__default_init_tag(), __default_init_tag()) {
881 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
882 __init(__s, traits_type::length(__s));
883 std::__debug_db_insert_c(this);
884 }
Marshall Clowe46031a2018-07-02 18:41:15 +0000885
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200886 template <class = __enable_if_t<__is_allocator<_Allocator>::value, nullptr_t> >
887 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const _CharT* __s, const _Allocator& __a);
Marshall Clowe46031a2018-07-02 18:41:15 +0000888
Marek Kurdej90d79712021-07-27 16:16:21 +0200889#if _LIBCPP_STD_VER > 20
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200890 basic_string(nullptr_t) = delete;
Marek Kurdej90d79712021-07-27 16:16:21 +0200891#endif
892
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200893 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const _CharT* __s, size_type __n)
894 : __r_(__default_init_tag(), __default_init_tag()) {
895 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
896 __init(__s, __n);
897 std::__debug_db_insert_c(this);
898 }
Marshall Clowe46031a2018-07-02 18:41:15 +0000899
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200900 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
901 basic_string(const _CharT* __s, size_type __n, const _Allocator& __a)
902 : __r_(__default_init_tag(), __a) {
903 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
904 __init(__s, __n);
905 std::__debug_db_insert_c(this);
906 }
Marshall Clowe46031a2018-07-02 18:41:15 +0000907
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200908 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(size_type __n, _CharT __c)
909 : __r_(__default_init_tag(), __default_init_tag()) {
910 __init(__n, __c);
911 std::__debug_db_insert_c(this);
912 }
Marshall Clowe46031a2018-07-02 18:41:15 +0000913
Nikolas Klauser1b531cf2022-08-09 13:17:30 +0200914#if _LIBCPP_STD_VER > 20
915 _LIBCPP_HIDE_FROM_ABI constexpr
916 basic_string(basic_string&& __str, size_type __pos, const _Allocator& __alloc = _Allocator())
917 : basic_string(std::move(__str), __pos, npos, __alloc) {}
918
919 _LIBCPP_HIDE_FROM_ABI constexpr
920 basic_string(basic_string&& __str, size_type __pos, size_type __n, const _Allocator& __alloc = _Allocator())
921 : __r_(__default_init_tag(), __alloc) {
922 if (__pos > __str.size())
923 __throw_out_of_range();
924
925 auto __len = std::min<size_type>(__n, __str.size() - __pos);
926 if (__alloc_traits::is_always_equal::value || __alloc == __str.__alloc()) {
927 __r_.first() = __str.__r_.first();
928 __str.__default_init();
929
930 _Traits::move(data(), data() + __pos, __len);
931 __set_size(__len);
932 _Traits::assign(data()[__len], value_type());
933 } else {
934 // Perform a copy because the allocators are not compatible.
935 __init(__str.data() + __pos, __len);
936 }
937
938 std::__debug_db_insert_c(this);
939 if (__is_long())
940 std::__debug_db_swap(this, &__str);
941 }
942#endif
943
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200944 template <class = __enable_if_t<__is_allocator<_Allocator>::value, nullptr_t> >
945 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(size_type __n, _CharT __c, const _Allocator& __a);
Marshall Clowe46031a2018-07-02 18:41:15 +0000946
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200947 _LIBCPP_CONSTEXPR_SINCE_CXX20
948 basic_string(const basic_string& __str, size_type __pos, size_type __n, const _Allocator& __a = _Allocator());
Marshall Clowe46031a2018-07-02 18:41:15 +0000949
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200950 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
951 basic_string(const basic_string& __str, size_type __pos, const _Allocator& __a = _Allocator())
952 : __r_(__default_init_tag(), __a) {
953 size_type __str_sz = __str.size();
954 if (__pos > __str_sz)
955 __throw_out_of_range();
956 __init(__str.data() + __pos, __str_sz - __pos);
957 std::__debug_db_insert_c(this);
958 }
Marshall Clowe46031a2018-07-02 18:41:15 +0000959
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200960 template <class _Tp,
961 class = __enable_if_t<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value &&
962 !__is_same_uncvref<_Tp, basic_string>::value> >
963 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
964 basic_string(const _Tp& __t, size_type __pos, size_type __n, const allocator_type& __a = allocator_type());
965
966 template <class _Tp,
967 class = __enable_if_t<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value &&
968 !__is_same_uncvref<_Tp, basic_string>::value> >
969 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(
970 const _Tp& __t);
971
972 template <class _Tp,
973 class = __enable_if_t<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value &&
974 !__is_same_uncvref<_Tp, basic_string>::value> >
975 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(
976 const _Tp& __t, const allocator_type& __a);
977
978 template <class _InputIterator, class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value> >
979 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(_InputIterator __first, _InputIterator __last)
980 : __r_(__default_init_tag(), __default_init_tag()) {
981 __init(__first, __last);
982 std::__debug_db_insert_c(this);
983 }
984
985 template <class _InputIterator, class = __enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value> >
986 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
987 basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a)
988 : __r_(__default_init_tag(), __a) {
989 __init(__first, __last);
990 std::__debug_db_insert_c(this);
991 }
992
Eric Fiselierfc92be82017-04-19 00:28:44 +0000993#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauserd128f2b2022-08-26 18:35:25 +0200994 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(initializer_list<_CharT> __il)
995 : __r_(__default_init_tag(), __default_init_tag()) {
996 __init(__il.begin(), __il.end());
997 std::__debug_db_insert_c(this);
998 }
999
1000 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(initializer_list<_CharT> __il, const _Allocator& __a)
1001 : __r_(__default_init_tag(), __a) {
1002 __init(__il.begin(), __il.end());
1003 std::__debug_db_insert_c(this);
1004 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001005#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001006
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001007 inline _LIBCPP_CONSTEXPR_SINCE_CXX20 ~basic_string();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001008
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001009 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00001010 operator __self_view() const _NOEXCEPT { return __self_view(data(), size()); }
1011
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001012 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator=(const basic_string& __str);
Eric Fiselier5ec13b12017-01-23 21:24:58 +00001013
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001014 template <class _Tp, class = __enable_if_t<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value &&
1015 !__is_same_uncvref<_Tp, basic_string>::value> >
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001016 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator=(const _Tp& __t) {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001017 __self_view __sv = __t;
1018 return assign(__sv);
1019 }
Marshall Clowe46031a2018-07-02 18:41:15 +00001020
Eric Fiselierfc92be82017-04-19 00:28:44 +00001021#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser02327072022-10-29 21:04:35 +02001022 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator=(basic_string&& __str)
1023 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)) {
1024 __move_assign(__str, integral_constant<bool, __alloc_traits::propagate_on_container_move_assignment::value>());
1025 return *this;
1026 }
1027
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001028 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Eric Fiselierfc92be82017-04-19 00:28:44 +00001029 basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001030#endif
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001031 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001032 basic_string& operator=(const value_type* __s) {return assign(__s);}
Marek Kurdej90d79712021-07-27 16:16:21 +02001033#if _LIBCPP_STD_VER > 20
1034 basic_string& operator=(nullptr_t) = delete;
1035#endif
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001036 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator=(value_type __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001037
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001038 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant8ea98242013-08-23 17:37:05 +00001039 iterator begin() _NOEXCEPT
Louis Dionnecd0a0502022-11-14 11:01:05 -10001040 {return __make_iterator(__get_pointer());}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001041 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant8ea98242013-08-23 17:37:05 +00001042 const_iterator begin() const _NOEXCEPT
Louis Dionnecd0a0502022-11-14 11:01:05 -10001043 {return __make_const_iterator(__get_pointer());}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001044 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant8ea98242013-08-23 17:37:05 +00001045 iterator end() _NOEXCEPT
Louis Dionnecd0a0502022-11-14 11:01:05 -10001046 {return __make_iterator(__get_pointer() + size());}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001047 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant8ea98242013-08-23 17:37:05 +00001048 const_iterator end() const _NOEXCEPT
Louis Dionnecd0a0502022-11-14 11:01:05 -10001049 {return __make_const_iterator(__get_pointer() + size());}
Louis Dionnee554e102022-06-03 15:17:03 -04001050
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001051 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001052 reverse_iterator rbegin() _NOEXCEPT
1053 {return reverse_iterator(end());}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001054 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001055 const_reverse_iterator rbegin() const _NOEXCEPT
1056 {return const_reverse_iterator(end());}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001057 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001058 reverse_iterator rend() _NOEXCEPT
1059 {return reverse_iterator(begin());}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001060 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001061 const_reverse_iterator rend() const _NOEXCEPT
1062 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001063
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001064 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001065 const_iterator cbegin() const _NOEXCEPT
1066 {return begin();}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001067 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001068 const_iterator cend() const _NOEXCEPT
1069 {return end();}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001070 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001071 const_reverse_iterator crbegin() const _NOEXCEPT
1072 {return rbegin();}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001073 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001074 const_reverse_iterator crend() const _NOEXCEPT
1075 {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001076
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001077 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001078 {return __is_long() ? __get_long_size() : __get_short_size();}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001079 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type length() const _NOEXCEPT {return size();}
Nikolas Klauser02327072022-10-29 21:04:35 +02001080
1081 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type max_size() const _NOEXCEPT {
1082 size_type __m = __alloc_traits::max_size(__alloc());
1083 if (__m <= std::numeric_limits<size_type>::max() / 2) {
1084 return __m - __alignment;
1085 } else {
1086 bool __uses_lsb = __endian_factor == 2;
1087 return __uses_lsb ? __m - __alignment : (__m / 2) - __alignment;
1088 }
1089 }
1090
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001091 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type capacity() const _NOEXCEPT {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001092 return (__is_long() ? __get_long_cap() : static_cast<size_type>(__min_cap)) - 1;
1093 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001094
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001095 _LIBCPP_CONSTEXPR_SINCE_CXX20 void resize(size_type __n, value_type __c);
1096 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void resize(size_type __n) { resize(__n, value_type()); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001097
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001098 _LIBCPP_CONSTEXPR_SINCE_CXX20 void reserve(size_type __requested_capacity);
Nikolas Klauser9e6040c2022-01-06 21:43:26 +01001099
1100#if _LIBCPP_STD_VER > 20
1101 template <class _Op>
1102 _LIBCPP_HIDE_FROM_ABI constexpr
1103 void resize_and_overwrite(size_type __n, _Op __op) {
1104 __resize_default_init(__n);
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001105 __erase_to_end(std::move(__op)(data(), _LIBCPP_AUTO_CAST(__n)));
Nikolas Klauser9e6040c2022-01-06 21:43:26 +01001106 }
1107#endif
1108
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001109 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __resize_default_init(size_type __n);
Eric Fiselier451d5582018-11-26 20:15:38 +00001110
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001111 _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_HIDE_FROM_ABI void reserve() _NOEXCEPT { shrink_to_fit(); }
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001112 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void shrink_to_fit() _NOEXCEPT;
1113 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void clear() _NOEXCEPT;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001114
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001115 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowb7db4972017-11-15 20:02:27 +00001116 bool empty() const _NOEXCEPT {return size() == 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001117
Nikolas Klauser02327072022-10-29 21:04:35 +02001118 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference operator[](size_type __pos) const _NOEXCEPT {
1119 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
1120 return *(data() + __pos);
1121 }
1122
1123 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator[](size_type __pos) _NOEXCEPT {
1124 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
1125 return *(__get_pointer() + __pos);
1126 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001127
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001128 _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference at(size_type __n) const;
1129 _LIBCPP_CONSTEXPR_SINCE_CXX20 reference at(size_type __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001130
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001131 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator+=(const basic_string& __str) {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001132 return append(__str);
1133 }
Marshall Clowe46031a2018-07-02 18:41:15 +00001134
1135 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001136 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001137 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001138 <
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001139 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
1140 && !__is_same_uncvref<_Tp, basic_string >::value,
Marshall Clowe46031a2018-07-02 18:41:15 +00001141 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001142 >
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001143 operator+=(const _Tp& __t) {
1144 __self_view __sv = __t; return append(__sv);
1145 }
1146
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001147 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator+=(const value_type* __s) {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001148 return append(__s);
1149 }
1150
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001151 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator+=(value_type __c) {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001152 push_back(__c);
1153 return *this;
1154 }
1155
Eric Fiselierfc92be82017-04-19 00:28:44 +00001156#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001157 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001158 basic_string& operator+=(initializer_list<value_type> __il) { return append(__il); }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001159#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001160
Nikolas Klauser02327072022-10-29 21:04:35 +02001161 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append(const basic_string& __str) {
1162 return append(__str.data(), __str.size());
1163 }
Marshall Clowe46031a2018-07-02 18:41:15 +00001164
1165 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001166 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001167 __enable_if_t<
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001168 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
1169 && !__is_same_uncvref<_Tp, basic_string>::value,
Marshall Clowe46031a2018-07-02 18:41:15 +00001170 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001171 >
Marshall Clowe46031a2018-07-02 18:41:15 +00001172 append(const _Tp& __t) { __self_view __sv = __t; return append(__sv.data(), __sv.size()); }
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001173 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
Marshall Clowe46031a2018-07-02 18:41:15 +00001174
Marshall Clow62953962016-10-03 23:40:48 +00001175 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001176 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001177 __enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00001178 <
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001179 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
1180 && !__is_same_uncvref<_Tp, basic_string>::value,
Marshall Clow82513342016-09-24 22:45:42 +00001181 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001182 >
Marshall Clow82513342016-09-24 22:45:42 +00001183 append(const _Tp& __t, size_type __pos, size_type __n=npos);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001184 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append(const value_type* __s, size_type __n);
1185 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append(const value_type* __s);
1186 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append(size_type __n, value_type __c);
Eric Fiselier451d5582018-11-26 20:15:38 +00001187
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001188 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Eric Fiselier451d5582018-11-26 20:15:38 +00001189 void __append_default_init(size_type __n);
1190
Howard Hinnantc51e1022010-05-11 19:42:16 +00001191 template<class _InputIterator>
Shoaib Meenai69c57412017-03-02 03:02:50 +00001192 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
Louis Dionne9ce598d2021-09-08 09:14:43 -04001193 __enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00001194 <
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001195 __is_exactly_cpp17_input_iterator<_InputIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001196 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001197 >
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001198 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Eric Fiselierdb7ee8f2016-10-31 02:46:25 +00001199 append(_InputIterator __first, _InputIterator __last) {
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001200 const basic_string __temp(__first, __last, __alloc());
Eric Fiselierdb7ee8f2016-10-31 02:46:25 +00001201 append(__temp.data(), __temp.size());
1202 return *this;
1203 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001204 template<class _ForwardIterator>
Shoaib Meenai69c57412017-03-02 03:02:50 +00001205 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
Louis Dionne9ce598d2021-09-08 09:14:43 -04001206 __enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00001207 <
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001208 __is_cpp17_forward_iterator<_ForwardIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001209 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001210 >
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001211 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001212 append(_ForwardIterator __first, _ForwardIterator __last);
Eric Fiselierdb7ee8f2016-10-31 02:46:25 +00001213
Eric Fiselierfc92be82017-04-19 00:28:44 +00001214#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001215 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001216 basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001217#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001218
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001219 _LIBCPP_CONSTEXPR_SINCE_CXX20 void push_back(value_type __c);
1220 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void pop_back();
Nikolas Klauser02327072022-10-29 21:04:35 +02001221
1222 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference front() _NOEXCEPT {
1223 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
1224 return *__get_pointer();
1225 }
1226
1227 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference front() const _NOEXCEPT {
1228 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
1229 return *data();
1230 }
1231
1232 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference back() _NOEXCEPT {
1233 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
1234 return *(__get_pointer() + size() - 1);
1235 }
1236
1237 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference back() const _NOEXCEPT {
1238 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
1239 return *(data() + size() - 1);
1240 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001241
Marshall Clowe46031a2018-07-02 18:41:15 +00001242 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001243 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001244 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001245 <
1246 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1247 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001248 >
Marshall Clowe46031a2018-07-02 18:41:15 +00001249 assign(const _Tp & __t) { __self_view __sv = __t; return assign(__sv.data(), __sv.size()); }
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001250 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clow95d5e9a2016-03-09 18:08:29 +00001251 basic_string& assign(const basic_string& __str) { return *this = __str; }
Eric Fiselierfc92be82017-04-19 00:28:44 +00001252#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001253 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Eric Fiselierc5ea1ae2017-06-01 02:29:37 +00001254 basic_string& assign(basic_string&& __str)
Marshall Clow5aa9e942015-10-05 16:17:34 +00001255 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001256 {*this = std::move(__str); return *this;}
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001257#endif
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001258 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos);
Marshall Clow62953962016-10-03 23:40:48 +00001259 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001260 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001261 __enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00001262 <
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001263 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
1264 && !__is_same_uncvref<_Tp, basic_string>::value,
Marshall Clow82513342016-09-24 22:45:42 +00001265 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001266 >
Eric Fiselierc5ea1ae2017-06-01 02:29:37 +00001267 assign(const _Tp & __t, size_type __pos, size_type __n=npos);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001268 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign(const value_type* __s, size_type __n);
1269 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign(const value_type* __s);
1270 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign(size_type __n, value_type __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001271 template<class _InputIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001272 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001273 __enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00001274 <
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001275 __is_exactly_cpp17_input_iterator<_InputIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001276 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001277 >
Howard Hinnantc51e1022010-05-11 19:42:16 +00001278 assign(_InputIterator __first, _InputIterator __last);
1279 template<class _ForwardIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001280 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001281 __enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00001282 <
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001283 __is_cpp17_forward_iterator<_ForwardIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001284 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001285 >
Howard Hinnantc51e1022010-05-11 19:42:16 +00001286 assign(_ForwardIterator __first, _ForwardIterator __last);
Eric Fiselierfc92be82017-04-19 00:28:44 +00001287#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001288 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001289 basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001290#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001291
Nikolas Klauser02327072022-10-29 21:04:35 +02001292 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1293 insert(size_type __pos1, const basic_string& __str) {
1294 return insert(__pos1, __str.data(), __str.size());
1295 }
Marshall Clowe46031a2018-07-02 18:41:15 +00001296
1297 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001298 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001299 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001300 <
1301 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1302 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001303 >
Marshall Clowe46031a2018-07-02 18:41:15 +00001304 insert(size_type __pos1, const _Tp& __t)
1305 { __self_view __sv = __t; return insert(__pos1, __sv.data(), __sv.size()); }
1306
Marshall Clow82513342016-09-24 22:45:42 +00001307 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001308 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001309 __enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00001310 <
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001311 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string>::value,
Marshall Clow82513342016-09-24 22:45:42 +00001312 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001313 >
Marshall Clow82513342016-09-24 22:45:42 +00001314 insert(size_type __pos1, const _Tp& __t, size_type __pos2, size_type __n=npos);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001315 _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clow8db7fb02014-03-04 19:17:19 +00001316 basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001317 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& insert(size_type __pos, const value_type* __s, size_type __n);
1318 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& insert(size_type __pos, const value_type* __s);
1319 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& insert(size_type __pos, size_type __n, value_type __c);
1320 _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator insert(const_iterator __pos, value_type __c);
Nikolas Klauser02327072022-10-29 21:04:35 +02001321
1322 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator
1323 insert(const_iterator __pos, size_type __n, value_type __c) {
1324 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
1325 "string::insert(iterator, n, value) called with an iterator not referring to this string");
1326 difference_type __p = __pos - begin();
1327 insert(static_cast<size_type>(__p), __n, __c);
1328 return begin() + __p;
1329 }
1330
Howard Hinnantc51e1022010-05-11 19:42:16 +00001331 template<class _InputIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001332 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001333 __enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00001334 <
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001335 __is_exactly_cpp17_input_iterator<_InputIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001336 iterator
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001337 >
Howard Hinnantc51e1022010-05-11 19:42:16 +00001338 insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
1339 template<class _ForwardIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001340 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001341 __enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00001342 <
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001343 __is_cpp17_forward_iterator<_ForwardIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001344 iterator
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001345 >
Howard Hinnantc51e1022010-05-11 19:42:16 +00001346 insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
Eric Fiselierfc92be82017-04-19 00:28:44 +00001347#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001348 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001349 iterator insert(const_iterator __pos, initializer_list<value_type> __il)
1350 {return insert(__pos, __il.begin(), __il.end());}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001351#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001352
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001353 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& erase(size_type __pos = 0, size_type __n = npos);
1354 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001355 iterator erase(const_iterator __pos);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001356 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001357 iterator erase(const_iterator __first, const_iterator __last);
1358
Nikolas Klauser02327072022-10-29 21:04:35 +02001359 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1360 replace(size_type __pos1, size_type __n1, const basic_string& __str) {
1361 return replace(__pos1, __n1, __str.data(), __str.size());
1362 }
Marshall Clowe46031a2018-07-02 18:41:15 +00001363
1364 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001365 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001366 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001367 <
1368 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1369 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001370 >
Marshall Clowe46031a2018-07-02 18:41:15 +00001371 replace(size_type __pos1, size_type __n1, const _Tp& __t) { __self_view __sv = __t; return replace(__pos1, __n1, __sv.data(), __sv.size()); }
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001372 _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clow8db7fb02014-03-04 19:17:19 +00001373 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos);
Marshall Clow82513342016-09-24 22:45:42 +00001374 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001375 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001376 __enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00001377 <
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001378 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string>::value,
Marshall Clow82513342016-09-24 22:45:42 +00001379 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001380 >
Marshall Clow82513342016-09-24 22:45:42 +00001381 replace(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001382 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001383 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001384 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s);
1385 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
Nikolas Klauser02327072022-10-29 21:04:35 +02001386
1387 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1388 replace(const_iterator __i1, const_iterator __i2, const basic_string& __str) {
1389 return replace(
1390 static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __str.data(), __str.size());
1391 }
Marshall Clowe46031a2018-07-02 18:41:15 +00001392
1393 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001394 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001395 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001396 <
1397 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1398 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001399 >
Marshall Clowe46031a2018-07-02 18:41:15 +00001400 replace(const_iterator __i1, const_iterator __i2, const _Tp& __t) { __self_view __sv = __t; return replace(__i1 - begin(), __i2 - __i1, __sv); }
1401
Nikolas Klauser02327072022-10-29 21:04:35 +02001402 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1403 replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n) {
1404 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
1405 }
1406
1407 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1408 replace(const_iterator __i1, const_iterator __i2, const value_type* __s) {
1409 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
1410 }
1411
1412 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string&
1413 replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c) {
1414 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
1415 }
1416
Howard Hinnantc51e1022010-05-11 19:42:16 +00001417 template<class _InputIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001418 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001419 __enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00001420 <
Eric Fiseliercd5a6772019-11-18 01:46:58 -05001421 __is_cpp17_input_iterator<_InputIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001422 basic_string&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001423 >
Howard Hinnant990d6e82010-11-17 21:11:40 +00001424 replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
Eric Fiselierfc92be82017-04-19 00:28:44 +00001425#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001426 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant990d6e82010-11-17 21:11:40 +00001427 basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001428 {return replace(__i1, __i2, __il.begin(), __il.end());}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001429#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001430
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001431 _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
Nikolas Klauser1b531cf2022-08-09 13:17:30 +02001432
Nikolas Klauser1b531cf2022-08-09 13:17:30 +02001433#if _LIBCPP_STD_VER <= 20
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001434 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser1b531cf2022-08-09 13:17:30 +02001435 basic_string substr(size_type __pos = 0, size_type __n = npos) const {
Nikolas Klauser267afcf2022-11-29 19:39:29 +01001436 return basic_string(*this, __pos, __n);
Nikolas Klauser1b531cf2022-08-09 13:17:30 +02001437 }
1438#else
1439 _LIBCPP_HIDE_FROM_ABI constexpr
1440 basic_string substr(size_type __pos = 0, size_type __n = npos) const& {
Nikolas Klauser267afcf2022-11-29 19:39:29 +01001441 return basic_string(*this, __pos, __n);
Nikolas Klauser1b531cf2022-08-09 13:17:30 +02001442 }
1443
1444 _LIBCPP_HIDE_FROM_ABI constexpr
1445 basic_string substr(size_type __pos = 0, size_type __n = npos) && {
Nikolas Klauser267afcf2022-11-29 19:39:29 +01001446 return basic_string(std::move(*this), __pos, __n);
Nikolas Klauser1b531cf2022-08-09 13:17:30 +02001447 }
1448#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001449
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001450 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant3e276872011-06-03 18:40:47 +00001451 void swap(basic_string& __str)
Marshall Clow8982dcd2015-07-13 20:04:56 +00001452#if _LIBCPP_STD_VER >= 14
Eric Fiselier873b8d32019-03-18 21:50:12 +00001453 _NOEXCEPT;
Marshall Clow8982dcd2015-07-13 20:04:56 +00001454#else
Eric Fiselier873b8d32019-03-18 21:50:12 +00001455 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00001456 __is_nothrow_swappable<allocator_type>::value);
1457#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001458
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001459 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001460 const value_type* c_str() const _NOEXCEPT {return data();}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001461 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001462 const value_type* data() const _NOEXCEPT {return std::__to_address(__get_pointer());}
Eric Fiselier4ee2a892017-11-20 20:23:27 +00001463#if _LIBCPP_STD_VER > 14 || defined(_LIBCPP_BUILDING_LIBRARY)
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001464 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001465 value_type* data() _NOEXCEPT {return std::__to_address(__get_pointer());}
Marshall Clowd3c22392016-03-08 15:44:30 +00001466#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001467
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001468 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001469 allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001470
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001471 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001472 size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Marshall Clowe46031a2018-07-02 18:41:15 +00001473
1474 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001475 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001476 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001477 <
1478 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1479 size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001480 >
zoecarver1997e0a2021-02-05 11:54:47 -08001481 find(const _Tp& __t, size_type __pos = 0) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001482 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001483 size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001484 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001485 size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001486 _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001487
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001488 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001489 size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Marshall Clowe46031a2018-07-02 18:41:15 +00001490
1491 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001492 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001493 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001494 <
1495 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1496 size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001497 >
zoecarver1997e0a2021-02-05 11:54:47 -08001498 rfind(const _Tp& __t, size_type __pos = npos) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001499 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001500 size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001501 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001502 size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001503 _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001504
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001505 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001506 size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Marshall Clowe46031a2018-07-02 18:41:15 +00001507
1508 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001509 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001510 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001511 <
1512 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1513 size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001514 >
zoecarver1997e0a2021-02-05 11:54:47 -08001515 find_first_of(const _Tp& __t, size_type __pos = 0) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001516 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001517 size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001518 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001519 size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001520 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001521 size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001522
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001523 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001524 size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Marshall Clowe46031a2018-07-02 18:41:15 +00001525
1526 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001527 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001528 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001529 <
1530 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1531 size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001532 >
zoecarver1997e0a2021-02-05 11:54:47 -08001533 find_last_of(const _Tp& __t, size_type __pos = npos) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001534 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001535 size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001536 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001537 size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001538 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001539 size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001540
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001541 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001542 size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Marshall Clowe46031a2018-07-02 18:41:15 +00001543
1544 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001545 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001546 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001547 <
1548 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1549 size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001550 >
zoecarver1997e0a2021-02-05 11:54:47 -08001551 find_first_not_of(const _Tp &__t, size_type __pos = 0) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001552 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001553 size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001554 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001555 size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001556 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001557 size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1558
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001559 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001560 size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Marshall Clowe46031a2018-07-02 18:41:15 +00001561
1562 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001563 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001564 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001565 <
1566 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1567 size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001568 >
zoecarver1997e0a2021-02-05 11:54:47 -08001569 find_last_not_of(const _Tp& __t, size_type __pos = npos) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001570 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001571 size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001572 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001573 size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001574 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001575 size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1576
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001577 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001578 int compare(const basic_string& __str) const _NOEXCEPT;
Marshall Clowe46031a2018-07-02 18:41:15 +00001579
1580 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001581 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001582 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001583 <
1584 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1585 int
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001586 >
zoecarver1997e0a2021-02-05 11:54:47 -08001587 compare(const _Tp &__t) const _NOEXCEPT;
Marshall Clowe46031a2018-07-02 18:41:15 +00001588
1589 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001590 _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001591 __enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00001592 <
1593 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1594 int
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001595 >
Marshall Clowe46031a2018-07-02 18:41:15 +00001596 compare(size_type __pos1, size_type __n1, const _Tp& __t) const;
1597
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001598 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001599 int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001600 _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001601 int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2,
1602 size_type __n2 = npos) const;
Marshall Clowe46031a2018-07-02 18:41:15 +00001603
Marshall Clow82513342016-09-24 22:45:42 +00001604 template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001605 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001606 __enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00001607 <
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001608 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string>::value,
Marshall Clow82513342016-09-24 22:45:42 +00001609 int
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001610 >
Marshall Clow82513342016-09-24 22:45:42 +00001611 compare(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos) const;
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001612 _LIBCPP_CONSTEXPR_SINCE_CXX20 int compare(const value_type* __s) const _NOEXCEPT;
1613 _LIBCPP_CONSTEXPR_SINCE_CXX20 int compare(size_type __pos1, size_type __n1, const value_type* __s) const;
1614 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001615 int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001616
Marshall Clow18c293b2017-12-04 20:11:38 +00001617#if _LIBCPP_STD_VER > 17
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001618 constexpr _LIBCPP_HIDE_FROM_ABI
Arthur O'Dwyera0cb1e82021-09-28 12:19:35 -04001619 bool starts_with(__self_view __sv) const noexcept
Marshall Clow18c293b2017-12-04 20:11:38 +00001620 { return __self_view(data(), size()).starts_with(__sv); }
1621
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001622 constexpr _LIBCPP_HIDE_FROM_ABI
Arthur O'Dwyera0cb1e82021-09-28 12:19:35 -04001623 bool starts_with(value_type __c) const noexcept
Marshall Clow18c293b2017-12-04 20:11:38 +00001624 { return !empty() && _Traits::eq(front(), __c); }
1625
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001626 constexpr _LIBCPP_HIDE_FROM_ABI
Arthur O'Dwyera0cb1e82021-09-28 12:19:35 -04001627 bool starts_with(const value_type* __s) const noexcept
Marshall Clow18c293b2017-12-04 20:11:38 +00001628 { return starts_with(__self_view(__s)); }
1629
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001630 constexpr _LIBCPP_HIDE_FROM_ABI
Arthur O'Dwyera0cb1e82021-09-28 12:19:35 -04001631 bool ends_with(__self_view __sv) const noexcept
Marshall Clow18c293b2017-12-04 20:11:38 +00001632 { return __self_view(data(), size()).ends_with( __sv); }
1633
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001634 constexpr _LIBCPP_HIDE_FROM_ABI
Arthur O'Dwyera0cb1e82021-09-28 12:19:35 -04001635 bool ends_with(value_type __c) const noexcept
Marshall Clow18c293b2017-12-04 20:11:38 +00001636 { return !empty() && _Traits::eq(back(), __c); }
1637
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001638 constexpr _LIBCPP_HIDE_FROM_ABI
Arthur O'Dwyera0cb1e82021-09-28 12:19:35 -04001639 bool ends_with(const value_type* __s) const noexcept
Marshall Clow18c293b2017-12-04 20:11:38 +00001640 { return ends_with(__self_view(__s)); }
1641#endif
1642
Wim Leflere023c3542021-01-19 14:33:30 -05001643#if _LIBCPP_STD_VER > 20
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001644 constexpr _LIBCPP_HIDE_FROM_ABI
Wim Leflere023c3542021-01-19 14:33:30 -05001645 bool contains(__self_view __sv) const noexcept
1646 { return __self_view(data(), size()).contains(__sv); }
1647
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001648 constexpr _LIBCPP_HIDE_FROM_ABI
Wim Leflere023c3542021-01-19 14:33:30 -05001649 bool contains(value_type __c) const noexcept
1650 { return __self_view(data(), size()).contains(__c); }
1651
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001652 constexpr _LIBCPP_HIDE_FROM_ABI
Wim Leflere023c3542021-01-19 14:33:30 -05001653 bool contains(const value_type* __s) const
1654 { return __self_view(data(), size()).contains(__s); }
1655#endif
1656
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001657 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __invariants() const;
Howard Hinnantaaeb1132013-04-22 23:55:13 +00001658
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001659 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __clear_and_shrink() _NOEXCEPT;
Howard Hinnantaaeb1132013-04-22 23:55:13 +00001660
Louis Dionne510450b2022-04-01 16:38:30 -04001661#ifdef _LIBCPP_ENABLE_DEBUG_MODE
Howard Hinnant8ea98242013-08-23 17:37:05 +00001662
1663 bool __dereferenceable(const const_iterator* __i) const;
1664 bool __decrementable(const const_iterator* __i) const;
1665 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
1666 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
1667
Louis Dionne510450b2022-04-01 16:38:30 -04001668#endif // _LIBCPP_ENABLE_DEBUG_MODE
Howard Hinnant8ea98242013-08-23 17:37:05 +00001669
Howard Hinnantc51e1022010-05-11 19:42:16 +00001670private:
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001671 template<class _Alloc>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001672 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001673 bool friend operator==(const basic_string<char, char_traits<char>, _Alloc>& __lhs,
1674 const basic_string<char, char_traits<char>, _Alloc>& __rhs) _NOEXCEPT;
1675
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001676 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __shrink_or_extend(size_type __target_capacity);
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001677
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001678 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001679 bool __is_long() const _NOEXCEPT {
1680 if (__libcpp_is_constant_evaluated())
1681 return true;
1682 return __r_.first().__s.__is_long_;
1683 }
1684
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001685 static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __begin_lifetime(pointer __begin, size_type __n) {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001686#if _LIBCPP_STD_VER > 17
1687 if (__libcpp_is_constant_evaluated()) {
1688 for (size_type __i = 0; __i != __n; ++__i)
1689 std::construct_at(std::addressof(__begin[__i]));
1690 }
1691#else
1692 (void)__begin;
1693 (void)__n;
1694#endif // _LIBCPP_STD_VER > 17
1695 }
1696
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001697 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __default_init() {
Nikolas Klauser8577eec2022-08-30 17:43:14 +02001698 __r_.first() = __rep();
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001699 if (__libcpp_is_constant_evaluated()) {
1700 size_type __sz = __recommend(0) + 1;
1701 pointer __ptr = __alloc_traits::allocate(__alloc(), __sz);
1702 __begin_lifetime(__ptr, __sz);
1703 __set_long_pointer(__ptr);
1704 __set_long_cap(__sz);
1705 __set_long_size(0);
1706 }
1707 }
1708
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001709 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __deallocate_constexpr() {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001710 if (__libcpp_is_constant_evaluated() && __get_pointer() != nullptr)
1711 __alloc_traits::deallocate(__alloc(), __get_pointer(), __get_long_cap());
1712 }
1713
Nikolas Klauser93826d12022-01-04 17:24:03 +01001714 _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI static bool __fits_in_sso(size_type __sz) {
1715 // SSO is disabled during constant evaluation because `__is_long` isn't constexpr friendly
1716 return !__libcpp_is_constant_evaluated() && (__sz < __min_cap);
1717 }
1718
Nikolas Klauser48d680d2022-02-26 13:28:33 +01001719 template <class _ForwardIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001720 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
Nikolas Klauser48d680d2022-02-26 13:28:33 +01001721 iterator __insert_from_safe_copy(size_type __n, size_type __ip, _ForwardIterator __first, _ForwardIterator __last) {
1722 size_type __sz = size();
1723 size_type __cap = capacity();
1724 value_type* __p;
1725 if (__cap - __sz >= __n)
1726 {
1727 __p = std::__to_address(__get_pointer());
1728 size_type __n_move = __sz - __ip;
1729 if (__n_move != 0)
1730 traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
1731 }
1732 else
1733 {
1734 __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
1735 __p = std::__to_address(__get_long_pointer());
1736 }
1737 __sz += __n;
1738 __set_size(__sz);
1739 traits_type::assign(__p[__sz], value_type());
1740 for (__p += __ip; __first != __last; ++__p, ++__first)
1741 traits_type::assign(*__p, *__first);
1742
1743 return begin() + __ip;
1744 }
1745
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001746 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 allocator_type& __alloc() _NOEXCEPT { return __r_.second(); }
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001747 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const allocator_type& __alloc() const _NOEXCEPT { return __r_.second(); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001748
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001749 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser62060be2022-04-20 10:52:04 +02001750 void __set_short_size(size_type __s) _NOEXCEPT {
1751 _LIBCPP_ASSERT(__s < __min_cap, "__s should never be greater than or equal to the short string capacity");
1752 __r_.first().__s.__size_ = __s;
1753 __r_.first().__s.__is_long_ = false;
1754 }
Howard Hinnant68bf1812013-04-30 21:44:48 +00001755
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001756 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser62060be2022-04-20 10:52:04 +02001757 size_type __get_short_size() const _NOEXCEPT {
1758 _LIBCPP_ASSERT(!__r_.first().__s.__is_long_, "String has to be short when trying to get the short size");
1759 return __r_.first().__s.__size_;
1760 }
Howard Hinnant68bf1812013-04-30 21:44:48 +00001761
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001762 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001763 void __set_long_size(size_type __s) _NOEXCEPT
1764 {__r_.first().__l.__size_ = __s;}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001765 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001766 size_type __get_long_size() const _NOEXCEPT
1767 {return __r_.first().__l.__size_;}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001768 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001769 void __set_size(size_type __s) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001770 {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
1771
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001772 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser62060be2022-04-20 10:52:04 +02001773 void __set_long_cap(size_type __s) _NOEXCEPT {
1774 __r_.first().__l.__cap_ = __s / __endian_factor;
1775 __r_.first().__l.__is_long_ = true;
1776 }
1777
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001778 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser62060be2022-04-20 10:52:04 +02001779 size_type __get_long_cap() const _NOEXCEPT {
1780 return __r_.first().__l.__cap_ * __endian_factor;
1781 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001782
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001783 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001784 void __set_long_pointer(pointer __p) _NOEXCEPT
1785 {__r_.first().__l.__data_ = __p;}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001786 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001787 pointer __get_long_pointer() _NOEXCEPT
1788 {return __r_.first().__l.__data_;}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001789 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001790 const_pointer __get_long_pointer() const _NOEXCEPT
1791 {return __r_.first().__l.__data_;}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001792 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001793 pointer __get_short_pointer() _NOEXCEPT
Howard Hinnantd17880b2013-06-28 16:59:19 +00001794 {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001795 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001796 const_pointer __get_short_pointer() const _NOEXCEPT
Howard Hinnantd17880b2013-06-28 16:59:19 +00001797 {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001798 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001799 pointer __get_pointer() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001800 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001801 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001802 const_pointer __get_pointer() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001803 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
1804
Howard Hinnantc51e1022010-05-11 19:42:16 +00001805 template <size_type __a> static
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001806 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantea382952013-08-14 18:00:20 +00001807 size_type __align_it(size_type __s) _NOEXCEPT
Eric Fiselier8599fcc2015-08-28 07:02:42 +00001808 {return (__s + (__a-1)) & ~(__a-1);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001809 enum {__alignment = 16};
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001810 static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantaeb17d82011-05-29 19:57:12 +00001811 size_type __recommend(size_type __s) _NOEXCEPT
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001812 {
1813 if (__s < __min_cap) {
1814 if (__libcpp_is_constant_evaluated())
1815 return static_cast<size_type>(__min_cap);
1816 else
1817 return static_cast<size_type>(__min_cap) - 1;
1818 }
Marshall Clow80584522018-02-07 21:30:17 +00001819 size_type __guess = __align_it<sizeof(value_type) < __alignment ?
1820 __alignment/sizeof(value_type) : 1 > (__s+1) - 1;
1821 if (__guess == __min_cap) ++__guess;
1822 return __guess;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001823 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001824
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001825 inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001826 void __init(const value_type* __s, size_type __sz, size_type __reserve);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001827 inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantd17880b2013-06-28 16:59:19 +00001828 void __init(const value_type* __s, size_type __sz);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001829 inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001830 void __init(size_type __n, value_type __c);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001831
Martijn Vels5e7c9752020-03-04 17:52:46 -05001832 // Slow path for the (inlined) copy constructor for 'long' strings.
1833 // Always externally instantiated and not inlined.
1834 // Requires that __s is zero terminated.
1835 // The main reason for this function to exist is because for unstable, we
1836 // want to allow inlining of the copy constructor. However, we don't want
1837 // to call the __init() functions as those are marked as inline which may
1838 // result in over-aggressive inlining by the compiler, where our aim is
1839 // to only inline the fast path code directly in the ctor.
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001840 _LIBCPP_CONSTEXPR_SINCE_CXX20 void __init_copy_ctor_external(const value_type* __s, size_type __sz);
Martijn Vels5e7c9752020-03-04 17:52:46 -05001841
Howard Hinnantc51e1022010-05-11 19:42:16 +00001842 template <class _InputIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001843 inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001844 __enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00001845 <
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001846 __is_exactly_cpp17_input_iterator<_InputIterator>::value
1847 >
Howard Hinnantc51e1022010-05-11 19:42:16 +00001848 __init(_InputIterator __first, _InputIterator __last);
1849
1850 template <class _ForwardIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001851 inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04001852 __enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00001853 <
Eric Fiselierc522ceb2020-01-15 16:57:08 -05001854 __is_cpp17_forward_iterator<_ForwardIterator>::value
1855 >
Howard Hinnantc51e1022010-05-11 19:42:16 +00001856 __init(_ForwardIterator __first, _ForwardIterator __last);
1857
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001858 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001859 void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001860 size_type __n_copy, size_type __n_del, size_type __n_add = 0);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001861 _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00001862 void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1863 size_type __n_copy, size_type __n_del,
Howard Hinnantd17880b2013-06-28 16:59:19 +00001864 size_type __n_add, const value_type* __p_new_stuff);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001865
Martijn Vels596e3de2020-02-26 15:55:49 -05001866 // __assign_no_alias is invoked for assignment operations where we
1867 // have proof that the input does not alias the current instance.
1868 // For example, operator=(basic_string) performs a 'self' check.
1869 template <bool __is_short>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001870 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& __assign_no_alias(const value_type* __s, size_type __n);
Martijn Vels596e3de2020-02-26 15:55:49 -05001871
Nikolas Klauser02327072022-10-29 21:04:35 +02001872 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __erase_to_end(size_type __pos) {
1873 __null_terminate_at(std::__to_address(__get_pointer()), __pos);
1874 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001875
Martijn Velsa81fc792020-02-26 13:25:43 -05001876 // __erase_external_with_move is invoked for erase() invocations where
1877 // `n ~= npos`, likely requiring memory moves on the string data.
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001878 _LIBCPP_CONSTEXPR_SINCE_CXX20 void __erase_external_with_move(size_type __pos, size_type __n);
Martijn Velsa81fc792020-02-26 13:25:43 -05001879
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001880 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantea8f7e12010-11-17 17:55:08 +00001881 void __copy_assign_alloc(const basic_string& __str)
1882 {__copy_assign_alloc(__str, integral_constant<bool,
1883 __alloc_traits::propagate_on_container_copy_assignment::value>());}
1884
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001885 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantea8f7e12010-11-17 17:55:08 +00001886 void __copy_assign_alloc(const basic_string& __str, true_type)
1887 {
Marshall Clowf258c202017-01-31 03:40:52 +00001888 if (__alloc() == __str.__alloc())
1889 __alloc() = __str.__alloc();
1890 else
Howard Hinnantea8f7e12010-11-17 17:55:08 +00001891 {
Marshall Clowf258c202017-01-31 03:40:52 +00001892 if (!__str.__is_long())
1893 {
Vedant Kumar55e007e2018-03-08 21:15:26 +00001894 __clear_and_shrink();
Marshall Clowf258c202017-01-31 03:40:52 +00001895 __alloc() = __str.__alloc();
1896 }
1897 else
1898 {
1899 allocator_type __a = __str.__alloc();
Nikolas Klauserc513eba2022-04-09 09:41:19 +02001900 auto __allocation = std::__allocate_at_least(__a, __str.__get_long_cap());
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001901 __begin_lifetime(__allocation.ptr, __allocation.count);
Nikolas Klauser1821ec32022-10-01 15:37:24 +02001902 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001903 __alloc() = std::move(__a);
Nikolas Klauserc513eba2022-04-09 09:41:19 +02001904 __set_long_pointer(__allocation.ptr);
1905 __set_long_cap(__allocation.count);
Marshall Clowf258c202017-01-31 03:40:52 +00001906 __set_long_size(__str.size());
1907 }
Howard Hinnantea8f7e12010-11-17 17:55:08 +00001908 }
Howard Hinnantea8f7e12010-11-17 17:55:08 +00001909 }
1910
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001911 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant28b24882011-12-01 20:21:04 +00001912 void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
Howard Hinnantea8f7e12010-11-17 17:55:08 +00001913 {}
1914
Eric Fiselierfc92be82017-04-19 00:28:44 +00001915#ifndef _LIBCPP_CXX03_LANG
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001916 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001917 void __move_assign(basic_string& __str, false_type)
1918 _NOEXCEPT_(__alloc_traits::is_always_equal::value);
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001919 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant3e276872011-06-03 18:40:47 +00001920 void __move_assign(basic_string& __str, true_type)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001921#if _LIBCPP_STD_VER > 14
1922 _NOEXCEPT;
1923#else
Howard Hinnant3e276872011-06-03 18:40:47 +00001924 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantea8f7e12010-11-17 17:55:08 +00001925#endif
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001926#endif
Howard Hinnantea8f7e12010-11-17 17:55:08 +00001927
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001928 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant58fe91b2011-08-17 20:36:18 +00001929 void
Howard Hinnantc2734962011-09-02 20:42:31 +00001930 __move_assign_alloc(basic_string& __str)
Howard Hinnant58fe91b2011-08-17 20:36:18 +00001931 _NOEXCEPT_(
1932 !__alloc_traits::propagate_on_container_move_assignment::value ||
1933 is_nothrow_move_assignable<allocator_type>::value)
1934 {__move_assign_alloc(__str, integral_constant<bool,
1935 __alloc_traits::propagate_on_container_move_assignment::value>());}
1936
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001937 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc2734962011-09-02 20:42:31 +00001938 void __move_assign_alloc(basic_string& __c, true_type)
Howard Hinnant58fe91b2011-08-17 20:36:18 +00001939 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1940 {
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001941 __alloc() = std::move(__c.__alloc());
Howard Hinnant58fe91b2011-08-17 20:36:18 +00001942 }
1943
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001944 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant28b24882011-12-01 20:21:04 +00001945 void __move_assign_alloc(basic_string&, false_type)
Howard Hinnant58fe91b2011-08-17 20:36:18 +00001946 _NOEXCEPT
1947 {}
1948
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001949 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& __assign_external(const value_type* __s);
1950 _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& __assign_external(const value_type* __s, size_type __n);
Martijn Velsda7d94f2020-06-19 14:24:03 -04001951
1952 // Assigns the value in __s, guaranteed to be __n < __min_cap in length.
1953 inline basic_string& __assign_short(const value_type* __s, size_type __n) {
1954 pointer __p = __is_long()
1955 ? (__set_long_size(__n), __get_long_pointer())
1956 : (__set_short_size(__n), __get_short_pointer());
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001957 traits_type::move(std::__to_address(__p), __s, __n);
Martijn Velsda7d94f2020-06-19 14:24:03 -04001958 traits_type::assign(__p[__n], value_type());
1959 return *this;
1960 }
1961
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001962 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001963 basic_string& __null_terminate_at(value_type* __p, size_type __newsz) {
Nikolas Klauser3ec7fb22021-12-14 01:20:53 +01001964 __set_size(__newsz);
1965 __invalidate_iterators_past(__newsz);
1966 traits_type::assign(__p[__newsz], value_type());
1967 return *this;
1968 }
1969
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001970 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __invalidate_iterators_past(size_type);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001971
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001972 template<class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001973 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001974 bool __addr_in_range(_Tp&& __t) const {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02001975 // assume that the ranges overlap, because we can't check during constant evaluation
1976 if (__libcpp_is_constant_evaluated())
1977 return true;
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001978 const volatile void *__p = std::addressof(__t);
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04001979 return data() <= __p && __p <= data() + size();
1980 }
1981
Louis Dionned24191c2021-08-19 12:39:16 -04001982 _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI
1983 void __throw_length_error() const {
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001984 std::__throw_length_error("basic_string");
Louis Dionned24191c2021-08-19 12:39:16 -04001985 }
1986
1987 _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI
1988 void __throw_out_of_range() const {
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02001989 std::__throw_out_of_range("basic_string");
Louis Dionned24191c2021-08-19 12:39:16 -04001990 }
1991
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02001992 friend _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string operator+<>(const basic_string&, const basic_string&);
1993 friend _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string operator+<>(const value_type*, const basic_string&);
1994 friend _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string operator+<>(value_type, const basic_string&);
1995 friend _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string operator+<>(const basic_string&, const value_type*);
1996 friend _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string operator+<>(const basic_string&, value_type);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001997};
1998
Eric Fiselier2ed640b2020-03-04 13:54:04 -05001999// These declarations must appear before any functions are implicitly used
2000// so that they have the correct visibility specifier.
Louis Dionnedc496ec2021-06-08 17:25:08 -04002001#define _LIBCPP_DECLARE(...) extern template __VA_ARGS__;
Eric Fiselier2ed640b2020-03-04 13:54:04 -05002002#ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
Louis Dionnedc496ec2021-06-08 17:25:08 -04002003 _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_DECLARE, char)
Louis Dionne89258142021-08-23 15:32:36 -04002004# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Louis Dionnedc496ec2021-06-08 17:25:08 -04002005 _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_DECLARE, wchar_t)
Louis Dionne89258142021-08-23 15:32:36 -04002006# endif
Eric Fiselier2ed640b2020-03-04 13:54:04 -05002007#else
Louis Dionnedc496ec2021-06-08 17:25:08 -04002008 _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_DECLARE, char)
Louis Dionne89258142021-08-23 15:32:36 -04002009# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Louis Dionnedc496ec2021-06-08 17:25:08 -04002010 _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_DECLARE, wchar_t)
Louis Dionne89258142021-08-23 15:32:36 -04002011# endif
Eric Fiselier2ed640b2020-03-04 13:54:04 -05002012#endif
Louis Dionnedc496ec2021-06-08 17:25:08 -04002013#undef _LIBCPP_DECLARE
Eric Fiselier2ed640b2020-03-04 13:54:04 -05002014
2015
Louis Dionned59f8a52021-08-17 11:59:07 -04002016#if _LIBCPP_STD_VER >= 17
Marshall Clowa0563332018-02-08 06:34:03 +00002017template<class _InputIterator,
Arthur O'Dwyer56226762021-03-03 23:02:20 -05002018 class _CharT = __iter_value_type<_InputIterator>,
Marshall Clowa0563332018-02-08 06:34:03 +00002019 class _Allocator = allocator<_CharT>,
Louis Dionne25547162021-08-17 12:26:09 -04002020 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
2021 class = enable_if_t<__is_allocator<_Allocator>::value>
Marshall Clowa0563332018-02-08 06:34:03 +00002022 >
2023basic_string(_InputIterator, _InputIterator, _Allocator = _Allocator())
2024 -> basic_string<_CharT, char_traits<_CharT>, _Allocator>;
Marshall Clowe46031a2018-07-02 18:41:15 +00002025
2026template<class _CharT,
2027 class _Traits,
2028 class _Allocator = allocator<_CharT>,
Louis Dionne25547162021-08-17 12:26:09 -04002029 class = enable_if_t<__is_allocator<_Allocator>::value>
Marshall Clowe46031a2018-07-02 18:41:15 +00002030 >
2031explicit basic_string(basic_string_view<_CharT, _Traits>, const _Allocator& = _Allocator())
2032 -> basic_string<_CharT, _Traits, _Allocator>;
2033
2034template<class _CharT,
2035 class _Traits,
2036 class _Allocator = allocator<_CharT>,
Louis Dionne25547162021-08-17 12:26:09 -04002037 class = enable_if_t<__is_allocator<_Allocator>::value>,
Marshall Clowe46031a2018-07-02 18:41:15 +00002038 class _Sz = typename allocator_traits<_Allocator>::size_type
2039 >
2040basic_string(basic_string_view<_CharT, _Traits>, _Sz, _Sz, const _Allocator& = _Allocator())
2041 -> basic_string<_CharT, _Traits, _Allocator>;
Marshall Clowa0563332018-02-08 06:34:03 +00002042#endif
2043
Howard Hinnantc51e1022010-05-11 19:42:16 +00002044template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002045inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002046void
Arthur O'Dwyerb3db4542021-04-27 09:10:04 -04002047basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type __pos)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002048{
Louis Dionne510450b2022-04-01 16:38:30 -04002049#ifdef _LIBCPP_ENABLE_DEBUG_MODE
Nikolas Klauser1a7d9f02021-12-16 14:55:03 +01002050 if (!__libcpp_is_constant_evaluated()) {
2051 __c_node* __c = __get_db()->__find_c_and_lock(this);
2052 if (__c)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002053 {
Nikolas Klauser1a7d9f02021-12-16 14:55:03 +01002054 const_pointer __new_last = __get_pointer() + __pos;
2055 for (__i_node** __p = __c->end_; __p != __c->beg_; )
Howard Hinnantc51e1022010-05-11 19:42:16 +00002056 {
Nikolas Klauser1a7d9f02021-12-16 14:55:03 +01002057 --__p;
2058 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
2059 if (__i->base() > __new_last)
2060 {
2061 (*__p)->__c_ = nullptr;
2062 if (--__c->end_ != __p)
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002063 std::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
Nikolas Klauser1a7d9f02021-12-16 14:55:03 +01002064 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002065 }
Nikolas Klauser1a7d9f02021-12-16 14:55:03 +01002066 __get_db()->unlock();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002067 }
2068 }
Arthur O'Dwyerb3db4542021-04-27 09:10:04 -04002069#else
2070 (void)__pos;
Louis Dionne510450b2022-04-01 16:38:30 -04002071#endif // _LIBCPP_ENABLE_DEBUG_MODE
Howard Hinnantc51e1022010-05-11 19:42:16 +00002072}
2073
2074template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002075_LIBCPP_CONSTEXPR_SINCE_CXX20
Eric Fiselier815ed732016-09-16 00:00:48 +00002076void basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s,
2077 size_type __sz,
2078 size_type __reserve)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002079{
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002080 if (__libcpp_is_constant_evaluated())
Nikolas Klauser8577eec2022-08-30 17:43:14 +02002081 __r_.first() = __rep();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002082 if (__reserve > max_size())
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002083 __throw_length_error();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002084 pointer __p;
Nikolas Klauser93826d12022-01-04 17:24:03 +01002085 if (__fits_in_sso(__reserve))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002086 {
2087 __set_short_size(__sz);
2088 __p = __get_short_pointer();
2089 }
2090 else
2091 {
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002092 auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__reserve) + 1);
2093 __p = __allocation.ptr;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002094 __begin_lifetime(__p, __allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002095 __set_long_pointer(__p);
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002096 __set_long_cap(__allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002097 __set_long_size(__sz);
2098 }
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002099 traits_type::copy(std::__to_address(__p), __s, __sz);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002100 traits_type::assign(__p[__sz], value_type());
2101}
2102
2103template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002104_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002105void
Howard Hinnantd17880b2013-06-28 16:59:19 +00002106basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002107{
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002108 if (__libcpp_is_constant_evaluated())
Nikolas Klauser8577eec2022-08-30 17:43:14 +02002109 __r_.first() = __rep();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002110 if (__sz > max_size())
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002111 __throw_length_error();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002112 pointer __p;
Nikolas Klauser93826d12022-01-04 17:24:03 +01002113 if (__fits_in_sso(__sz))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002114 {
2115 __set_short_size(__sz);
2116 __p = __get_short_pointer();
2117 }
2118 else
2119 {
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002120 auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2121 __p = __allocation.ptr;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002122 __begin_lifetime(__p, __allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002123 __set_long_pointer(__p);
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002124 __set_long_cap(__allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002125 __set_long_size(__sz);
2126 }
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002127 traits_type::copy(std::__to_address(__p), __s, __sz);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002128 traits_type::assign(__p[__sz], value_type());
2129}
2130
2131template <class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00002132template <class>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002133_LIBCPP_CONSTEXPR_SINCE_CXX20
Eric Fiselier812882b2017-02-17 01:17:10 +00002134basic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, const _Allocator& __a)
Eric Fiselier5169d1c2019-12-16 19:03:23 -05002135 : __r_(__default_init_tag(), __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002136{
Howard Hinnant8ea98242013-08-23 17:37:05 +00002137 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
Howard Hinnantc51e1022010-05-11 19:42:16 +00002138 __init(__s, traits_type::length(__s));
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002139 std::__debug_db_insert_c(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002140}
2141
2142template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002143_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002144basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
Eric Fiselier5169d1c2019-12-16 19:03:23 -05002145 : __r_(__default_init_tag(), __alloc_traits::select_on_container_copy_construction(__str.__alloc()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002146{
2147 if (!__str.__is_long())
Nikolas Klauser8577eec2022-08-30 17:43:14 +02002148 __r_.first() = __str.__r_.first();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002149 else
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002150 __init_copy_ctor_external(std::__to_address(__str.__get_long_pointer()),
Martijn Vels5e7c9752020-03-04 17:52:46 -05002151 __str.__get_long_size());
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002152 std::__debug_db_insert_c(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002153}
2154
2155template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002156_LIBCPP_CONSTEXPR_SINCE_CXX20
Eric Fiselier812882b2017-02-17 01:17:10 +00002157basic_string<_CharT, _Traits, _Allocator>::basic_string(
2158 const basic_string& __str, const allocator_type& __a)
Eric Fiselier5169d1c2019-12-16 19:03:23 -05002159 : __r_(__default_init_tag(), __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002160{
2161 if (!__str.__is_long())
Nikolas Klauser8577eec2022-08-30 17:43:14 +02002162 __r_.first() = __str.__r_.first();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002163 else
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002164 __init_copy_ctor_external(std::__to_address(__str.__get_long_pointer()),
Martijn Vels5e7c9752020-03-04 17:52:46 -05002165 __str.__get_long_size());
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002166 std::__debug_db_insert_c(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002167}
2168
Martijn Vels5e7c9752020-03-04 17:52:46 -05002169template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002170_LIBCPP_CONSTEXPR_SINCE_CXX20
Martijn Vels5e7c9752020-03-04 17:52:46 -05002171void basic_string<_CharT, _Traits, _Allocator>::__init_copy_ctor_external(
2172 const value_type* __s, size_type __sz) {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002173 if (__libcpp_is_constant_evaluated())
Nikolas Klauser8577eec2022-08-30 17:43:14 +02002174 __r_.first() = __rep();
2175
Martijn Vels5e7c9752020-03-04 17:52:46 -05002176 pointer __p;
Nikolas Klauser93826d12022-01-04 17:24:03 +01002177 if (__fits_in_sso(__sz)) {
Martijn Vels5e7c9752020-03-04 17:52:46 -05002178 __p = __get_short_pointer();
2179 __set_short_size(__sz);
2180 } else {
2181 if (__sz > max_size())
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002182 __throw_length_error();
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002183 auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2184 __p = __allocation.ptr;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002185 __begin_lifetime(__p, __allocation.count);
Martijn Vels5e7c9752020-03-04 17:52:46 -05002186 __set_long_pointer(__p);
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002187 __set_long_cap(__allocation.count);
Martijn Vels5e7c9752020-03-04 17:52:46 -05002188 __set_long_size(__sz);
2189 }
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002190 traits_type::copy(std::__to_address(__p), __s, __sz + 1);
Martijn Vels5e7c9752020-03-04 17:52:46 -05002191}
2192
Howard Hinnantc51e1022010-05-11 19:42:16 +00002193template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002194_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002195void
2196basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
2197{
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002198 if (__libcpp_is_constant_evaluated())
Nikolas Klauser8577eec2022-08-30 17:43:14 +02002199 __r_.first() = __rep();
2200
Howard Hinnantc51e1022010-05-11 19:42:16 +00002201 if (__n > max_size())
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002202 __throw_length_error();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002203 pointer __p;
Nikolas Klauser93826d12022-01-04 17:24:03 +01002204 if (__fits_in_sso(__n))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002205 {
2206 __set_short_size(__n);
2207 __p = __get_short_pointer();
2208 }
2209 else
2210 {
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002211 auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__n) + 1);
2212 __p = __allocation.ptr;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002213 __begin_lifetime(__p, __allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002214 __set_long_pointer(__p);
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002215 __set_long_cap(__allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002216 __set_long_size(__n);
2217 }
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002218 traits_type::assign(std::__to_address(__p), __n, __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002219 traits_type::assign(__p[__n], value_type());
2220}
2221
2222template <class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00002223template <class>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002224_LIBCPP_CONSTEXPR_SINCE_CXX20
Eric Fiselier812882b2017-02-17 01:17:10 +00002225basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, _CharT __c, const _Allocator& __a)
Eric Fiselier5169d1c2019-12-16 19:03:23 -05002226 : __r_(__default_init_tag(), __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002227{
2228 __init(__n, __c);
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002229 std::__debug_db_insert_c(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002230}
2231
Howard Hinnantc51e1022010-05-11 19:42:16 +00002232template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002233_LIBCPP_CONSTEXPR_SINCE_CXX20
Eric Fiselier812882b2017-02-17 01:17:10 +00002234basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str,
2235 size_type __pos, size_type __n,
2236 const _Allocator& __a)
Eric Fiselier5169d1c2019-12-16 19:03:23 -05002237 : __r_(__default_init_tag(), __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002238{
2239 size_type __str_sz = __str.size();
2240 if (__pos > __str_sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002241 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002242 __init(__str.data() + __pos, std::min(__n, __str_sz - __pos));
2243 std::__debug_db_insert_c(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002244}
2245
2246template <class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00002247template <class _Tp, class>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002248_LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clow78dbe462016-11-14 18:22:19 +00002249basic_string<_CharT, _Traits, _Allocator>::basic_string(
Marshall Clowe46031a2018-07-02 18:41:15 +00002250 const _Tp& __t, size_type __pos, size_type __n, const allocator_type& __a)
Eric Fiselier5169d1c2019-12-16 19:03:23 -05002251 : __r_(__default_init_tag(), __a)
Marshall Clow78dbe462016-11-14 18:22:19 +00002252{
Marshall Clowe46031a2018-07-02 18:41:15 +00002253 __self_view __sv0 = __t;
2254 __self_view __sv = __sv0.substr(__pos, __n);
Marshall Clow78dbe462016-11-14 18:22:19 +00002255 __init(__sv.data(), __sv.size());
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002256 std::__debug_db_insert_c(this);
Marshall Clow78dbe462016-11-14 18:22:19 +00002257}
2258
2259template <class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00002260template <class _Tp, class>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002261_LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowe46031a2018-07-02 18:41:15 +00002262basic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t)
Eric Fiselier5169d1c2019-12-16 19:03:23 -05002263 : __r_(__default_init_tag(), __default_init_tag())
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002264{
Marshall Clowe46031a2018-07-02 18:41:15 +00002265 __self_view __sv = __t;
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002266 __init(__sv.data(), __sv.size());
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002267 std::__debug_db_insert_c(this);
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002268}
2269
2270template <class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00002271template <class _Tp, class>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002272_LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowe46031a2018-07-02 18:41:15 +00002273basic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t, const _Allocator& __a)
Eric Fiselier5169d1c2019-12-16 19:03:23 -05002274 : __r_(__default_init_tag(), __a)
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002275{
Marshall Clowe46031a2018-07-02 18:41:15 +00002276 __self_view __sv = __t;
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002277 __init(__sv.data(), __sv.size());
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002278 std::__debug_db_insert_c(this);
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002279}
2280
2281template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002282template <class _InputIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002283_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002284__enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00002285<
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002286 __is_exactly_cpp17_input_iterator<_InputIterator>::value
2287>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002288basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
2289{
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002290 __default_init();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002291#ifndef _LIBCPP_NO_EXCEPTIONS
2292 try
2293 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002294#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002295 for (; __first != __last; ++__first)
2296 push_back(*__first);
2297#ifndef _LIBCPP_NO_EXCEPTIONS
2298 }
2299 catch (...)
2300 {
2301 if (__is_long())
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002302 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002303 throw;
2304 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002305#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002306}
2307
2308template <class _CharT, class _Traits, class _Allocator>
2309template <class _ForwardIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002310_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002311__enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00002312<
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002313 __is_cpp17_forward_iterator<_ForwardIterator>::value
2314>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002315basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
2316{
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002317 if (__libcpp_is_constant_evaluated())
Nikolas Klauser8577eec2022-08-30 17:43:14 +02002318 __r_.first() = __rep();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002319 size_type __sz = static_cast<size_type>(std::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002320 if (__sz > max_size())
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002321 __throw_length_error();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002322 pointer __p;
Nikolas Klauser93826d12022-01-04 17:24:03 +01002323 if (__fits_in_sso(__sz))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002324 {
2325 __set_short_size(__sz);
2326 __p = __get_short_pointer();
2327 }
2328 else
2329 {
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002330 auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2331 __p = __allocation.ptr;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002332 __begin_lifetime(__p, __allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002333 __set_long_pointer(__p);
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002334 __set_long_cap(__allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002335 __set_long_size(__sz);
2336 }
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002337
2338#ifndef _LIBCPP_NO_EXCEPTIONS
2339 try
2340 {
2341#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiseliera09a3b42014-10-27 19:28:20 +00002342 for (; __first != __last; ++__first, (void) ++__p)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002343 traits_type::assign(*__p, *__first);
2344 traits_type::assign(*__p, value_type());
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002345#ifndef _LIBCPP_NO_EXCEPTIONS
2346 }
2347 catch (...)
2348 {
2349 if (__is_long())
2350 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2351 throw;
2352 }
2353#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002354}
2355
2356template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002357_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002358basic_string<_CharT, _Traits, _Allocator>::~basic_string()
2359{
Nikolas Klauser98833542022-05-07 22:20:23 +02002360 std::__debug_db_erase_c(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002361 if (__is_long())
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002362 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002363}
2364
2365template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002366_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002367void
2368basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
2369 (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnantd17880b2013-06-28 16:59:19 +00002370 size_type __n_copy, size_type __n_del, size_type __n_add, const value_type* __p_new_stuff)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002371{
2372 size_type __ms = max_size();
2373 if (__delta_cap > __ms - __old_cap - 1)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002374 __throw_length_error();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002375 pointer __old_p = __get_pointer();
2376 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002377 __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantc51e1022010-05-11 19:42:16 +00002378 __ms - 1;
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002379 auto __allocation = std::__allocate_at_least(__alloc(), __cap + 1);
2380 pointer __p = __allocation.ptr;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002381 __begin_lifetime(__p, __allocation.count);
Nikolas Klauserf1d286b2022-05-08 16:40:04 +02002382 std::__debug_db_invalidate_all(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002383 if (__n_copy != 0)
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002384 traits_type::copy(std::__to_address(__p),
2385 std::__to_address(__old_p), __n_copy);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002386 if (__n_add != 0)
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002387 traits_type::copy(std::__to_address(__p) + __n_copy, __p_new_stuff, __n_add);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002388 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2389 if (__sec_cp_sz != 0)
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002390 traits_type::copy(std::__to_address(__p) + __n_copy + __n_add,
2391 std::__to_address(__old_p) + __n_copy + __n_del, __sec_cp_sz);
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002392 if (__old_cap+1 != __min_cap || __libcpp_is_constant_evaluated())
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002393 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002394 __set_long_pointer(__p);
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002395 __set_long_cap(__allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002396 __old_sz = __n_copy + __n_add + __sec_cp_sz;
2397 __set_long_size(__old_sz);
2398 traits_type::assign(__p[__old_sz], value_type());
2399}
2400
2401template <class _CharT, class _Traits, class _Allocator>
2402void
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002403_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002404basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2405 size_type __n_copy, size_type __n_del, size_type __n_add)
2406{
2407 size_type __ms = max_size();
Marshall Clow2267c5d2013-11-06 14:24:38 +00002408 if (__delta_cap > __ms - __old_cap)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002409 __throw_length_error();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002410 pointer __old_p = __get_pointer();
2411 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002412 __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantc51e1022010-05-11 19:42:16 +00002413 __ms - 1;
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002414 auto __allocation = std::__allocate_at_least(__alloc(), __cap + 1);
2415 pointer __p = __allocation.ptr;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002416 __begin_lifetime(__p, __allocation.count);
Nikolas Klauserf1d286b2022-05-08 16:40:04 +02002417 std::__debug_db_invalidate_all(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002418 if (__n_copy != 0)
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002419 traits_type::copy(std::__to_address(__p),
2420 std::__to_address(__old_p), __n_copy);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002421 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2422 if (__sec_cp_sz != 0)
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002423 traits_type::copy(std::__to_address(__p) + __n_copy + __n_add,
2424 std::__to_address(__old_p) + __n_copy + __n_del,
Howard Hinnantd17880b2013-06-28 16:59:19 +00002425 __sec_cp_sz);
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002426 if (__libcpp_is_constant_evaluated() || __old_cap + 1 != __min_cap)
2427 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap + 1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002428 __set_long_pointer(__p);
Nikolas Klauserc513eba2022-04-09 09:41:19 +02002429 __set_long_cap(__allocation.count);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002430}
2431
2432// assign
2433
2434template <class _CharT, class _Traits, class _Allocator>
Martijn Vels596e3de2020-02-26 15:55:49 -05002435template <bool __is_short>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002436_LIBCPP_CONSTEXPR_SINCE_CXX20
Martijn Velsb6a08b62020-04-10 18:36:31 -04002437basic_string<_CharT, _Traits, _Allocator>&
2438basic_string<_CharT, _Traits, _Allocator>::__assign_no_alias(
Martijn Vels596e3de2020-02-26 15:55:49 -05002439 const value_type* __s, size_type __n) {
Louis Dionne6209e9f2022-03-03 13:39:12 -05002440 size_type __cap = __is_short ? static_cast<size_type>(__min_cap) : __get_long_cap();
Martijn Vels596e3de2020-02-26 15:55:49 -05002441 if (__n < __cap) {
2442 pointer __p = __is_short ? __get_short_pointer() : __get_long_pointer();
2443 __is_short ? __set_short_size(__n) : __set_long_size(__n);
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002444 traits_type::copy(std::__to_address(__p), __s, __n);
Martijn Vels596e3de2020-02-26 15:55:49 -05002445 traits_type::assign(__p[__n], value_type());
2446 __invalidate_iterators_past(__n);
2447 } else {
2448 size_type __sz = __is_short ? __get_short_size() : __get_long_size();
2449 __grow_by_and_replace(__cap - 1, __n - __cap + 1, __sz, 0, __sz, __n, __s);
2450 }
Martijn Velsb6a08b62020-04-10 18:36:31 -04002451 return *this;
Martijn Vels596e3de2020-02-26 15:55:49 -05002452}
2453
2454template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002455_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002456basic_string<_CharT, _Traits, _Allocator>&
Martijn Velsda7d94f2020-06-19 14:24:03 -04002457basic_string<_CharT, _Traits, _Allocator>::__assign_external(
2458 const value_type* __s, size_type __n) {
2459 size_type __cap = capacity();
2460 if (__cap >= __n) {
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002461 value_type* __p = std::__to_address(__get_pointer());
Martijn Velsda7d94f2020-06-19 14:24:03 -04002462 traits_type::move(__p, __s, __n);
Nikolas Klauser3ec7fb22021-12-14 01:20:53 +01002463 return __null_terminate_at(__p, __n);
Martijn Velsda7d94f2020-06-19 14:24:03 -04002464 } else {
2465 size_type __sz = size();
2466 __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
Nikolas Klauser3ec7fb22021-12-14 01:20:53 +01002467 return *this;
Martijn Velsda7d94f2020-06-19 14:24:03 -04002468 }
Martijn Velsda7d94f2020-06-19 14:24:03 -04002469}
2470
2471template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002472_LIBCPP_CONSTEXPR_SINCE_CXX20
Martijn Velsda7d94f2020-06-19 14:24:03 -04002473basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnantd17880b2013-06-28 16:59:19 +00002474basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002475{
Alp Tokerb8a95f52014-05-15 11:27:39 +00002476 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr");
Nikolas Klauser93826d12022-01-04 17:24:03 +01002477 return (__builtin_constant_p(__n) && __fits_in_sso(__n))
Martijn Velsda7d94f2020-06-19 14:24:03 -04002478 ? __assign_short(__s, __n)
2479 : __assign_external(__s, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002480}
2481
2482template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002483_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002484basic_string<_CharT, _Traits, _Allocator>&
2485basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
2486{
2487 size_type __cap = capacity();
2488 if (__cap < __n)
2489 {
2490 size_type __sz = size();
2491 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2492 }
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002493 value_type* __p = std::__to_address(__get_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002494 traits_type::assign(__p, __n, __c);
Nikolas Klauser3ec7fb22021-12-14 01:20:53 +01002495 return __null_terminate_at(__p, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002496}
2497
2498template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002499_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002500basic_string<_CharT, _Traits, _Allocator>&
2501basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
2502{
2503 pointer __p;
2504 if (__is_long())
2505 {
2506 __p = __get_long_pointer();
2507 __set_long_size(1);
2508 }
2509 else
2510 {
2511 __p = __get_short_pointer();
2512 __set_short_size(1);
2513 }
2514 traits_type::assign(*__p, __c);
2515 traits_type::assign(*++__p, value_type());
2516 __invalidate_iterators_past(1);
2517 return *this;
2518}
2519
2520template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002521_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002522basic_string<_CharT, _Traits, _Allocator>&
2523basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
2524{
Martijn Vels596e3de2020-02-26 15:55:49 -05002525 if (this != &__str) {
2526 __copy_assign_alloc(__str);
2527 if (!__is_long()) {
2528 if (!__str.__is_long()) {
Nikolas Klauser8577eec2022-08-30 17:43:14 +02002529 __r_.first() = __str.__r_.first();
Martijn Vels596e3de2020-02-26 15:55:49 -05002530 } else {
Martijn Velsb6a08b62020-04-10 18:36:31 -04002531 return __assign_no_alias<true>(__str.data(), __str.size());
Martijn Vels596e3de2020-02-26 15:55:49 -05002532 }
2533 } else {
Martijn Velsb6a08b62020-04-10 18:36:31 -04002534 return __assign_no_alias<false>(__str.data(), __str.size());
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002535 }
Martijn Vels596e3de2020-02-26 15:55:49 -05002536 }
2537 return *this;
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002538}
2539
Eric Fiselierfc92be82017-04-19 00:28:44 +00002540#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002541
2542template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002543inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002544void
2545basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002546 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002547{
2548 if (__alloc() != __str.__alloc())
2549 assign(__str);
2550 else
2551 __move_assign(__str, true_type());
2552}
2553
2554template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002555inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002556void
2557basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002558#if _LIBCPP_STD_VER > 14
2559 _NOEXCEPT
2560#else
Howard Hinnant3e276872011-06-03 18:40:47 +00002561 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002562#endif
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002563{
marshall2ed41622019-11-27 07:13:00 -08002564 if (__is_long()) {
2565 __alloc_traits::deallocate(__alloc(), __get_long_pointer(),
2566 __get_long_cap());
2567#if _LIBCPP_STD_VER <= 14
2568 if (!is_nothrow_move_assignable<allocator_type>::value) {
2569 __set_short_size(0);
2570 traits_type::assign(__get_short_pointer()[0], value_type());
2571 }
2572#endif
2573 }
2574 __move_assign_alloc(__str);
2575 __r_.first() = __str.__r_.first();
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002576 if (__libcpp_is_constant_evaluated()) {
2577 __str.__default_init();
2578 } else {
2579 __str.__set_short_size(0);
2580 traits_type::assign(__str.__get_short_pointer()[0], value_type());
2581 }
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002582}
2583
Howard Hinnantea8f7e12010-11-17 17:55:08 +00002584#endif
2585
2586template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002587template<class _InputIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002588_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002589__enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00002590<
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002591 __is_exactly_cpp17_input_iterator<_InputIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00002592 basic_string<_CharT, _Traits, _Allocator>&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002593>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002594basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2595{
Marshall Clow958362f2016-09-05 01:54:30 +00002596 const basic_string __temp(__first, __last, __alloc());
Marshall Clow039b2f02016-01-13 21:54:34 +00002597 assign(__temp.data(), __temp.size());
Argyrios Kyrtzidisaf904652012-10-13 02:03:45 +00002598 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002599}
2600
2601template <class _CharT, class _Traits, class _Allocator>
2602template<class _ForwardIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002603_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002604__enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00002605<
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002606 __is_cpp17_forward_iterator<_ForwardIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00002607 basic_string<_CharT, _Traits, _Allocator>&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002608>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002609basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2610{
Howard Hinnantc51e1022010-05-11 19:42:16 +00002611 size_type __cap = capacity();
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002612 size_type __n = __string_is_trivial_iterator<_ForwardIterator>::value ?
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002613 static_cast<size_type>(std::distance(__first, __last)) : 0;
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002614
2615 if (__string_is_trivial_iterator<_ForwardIterator>::value &&
2616 (__cap >= __n || !__addr_in_range(*__first)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002617 {
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002618 if (__cap < __n)
2619 {
2620 size_type __sz = size();
2621 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2622 }
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002623 pointer __p = __get_pointer();
Arthur O'Dwyer80dbcbe2021-09-07 21:35:37 -04002624 for (; __first != __last; ++__p, (void) ++__first)
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002625 traits_type::assign(*__p, *__first);
2626 traits_type::assign(*__p, value_type());
2627 __set_size(__n);
Arthur O'Dwyerb3db4542021-04-27 09:10:04 -04002628 __invalidate_iterators_past(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002629 }
2630 else
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002631 {
2632 const basic_string __temp(__first, __last, __alloc());
2633 assign(__temp.data(), __temp.size());
2634 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002635 return *this;
2636}
2637
2638template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002639_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002640basic_string<_CharT, _Traits, _Allocator>&
2641basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
2642{
2643 size_type __sz = __str.size();
2644 if (__pos > __sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002645 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002646 return assign(__str.data() + __pos, std::min(__n, __sz - __pos));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002647}
2648
2649template <class _CharT, class _Traits, class _Allocator>
Marshall Clow82513342016-09-24 22:45:42 +00002650template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002651_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002652__enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00002653<
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002654 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
2655 && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
Marshall Clowb7db4972017-11-15 20:02:27 +00002656 basic_string<_CharT, _Traits, _Allocator>&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002657>
Marshall Clow82513342016-09-24 22:45:42 +00002658basic_string<_CharT, _Traits, _Allocator>::assign(const _Tp & __t, size_type __pos, size_type __n)
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002659{
Marshall Clow82513342016-09-24 22:45:42 +00002660 __self_view __sv = __t;
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002661 size_type __sz = __sv.size();
2662 if (__pos > __sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002663 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002664 return assign(__sv.data() + __pos, std::min(__n, __sz - __pos));
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002665}
2666
2667
2668template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002669_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002670basic_string<_CharT, _Traits, _Allocator>&
Martijn Velsda7d94f2020-06-19 14:24:03 -04002671basic_string<_CharT, _Traits, _Allocator>::__assign_external(const value_type* __s) {
2672 return __assign_external(__s, traits_type::length(__s));
2673}
2674
2675template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002676_LIBCPP_CONSTEXPR_SINCE_CXX20
Martijn Velsda7d94f2020-06-19 14:24:03 -04002677basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnantd17880b2013-06-28 16:59:19 +00002678basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002679{
Alp Tokerb8a95f52014-05-15 11:27:39 +00002680 _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
Louis Dionne3e0c4332021-08-31 10:49:06 -04002681 return __builtin_constant_p(*__s)
Nikolas Klauser93826d12022-01-04 17:24:03 +01002682 ? (__fits_in_sso(traits_type::length(__s))
Martijn Velsda7d94f2020-06-19 14:24:03 -04002683 ? __assign_short(__s, traits_type::length(__s))
2684 : __assign_external(__s, traits_type::length(__s)))
2685 : __assign_external(__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002686}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002687// append
2688
2689template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002690_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002691basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnantd17880b2013-06-28 16:59:19 +00002692basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002693{
Alp Tokerb8a95f52014-05-15 11:27:39 +00002694 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
Howard Hinnantc51e1022010-05-11 19:42:16 +00002695 size_type __cap = capacity();
2696 size_type __sz = size();
2697 if (__cap - __sz >= __n)
2698 {
2699 if (__n)
2700 {
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002701 value_type* __p = std::__to_address(__get_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002702 traits_type::copy(__p + __sz, __s, __n);
2703 __sz += __n;
2704 __set_size(__sz);
2705 traits_type::assign(__p[__sz], value_type());
2706 }
2707 }
2708 else
2709 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
2710 return *this;
2711}
2712
2713template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002714_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002715basic_string<_CharT, _Traits, _Allocator>&
2716basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
2717{
2718 if (__n)
2719 {
2720 size_type __cap = capacity();
2721 size_type __sz = size();
2722 if (__cap - __sz < __n)
2723 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2724 pointer __p = __get_pointer();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002725 traits_type::assign(std::__to_address(__p) + __sz, __n, __c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002726 __sz += __n;
2727 __set_size(__sz);
2728 traits_type::assign(__p[__sz], value_type());
2729 }
2730 return *this;
2731}
2732
2733template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002734_LIBCPP_CONSTEXPR_SINCE_CXX20 inline void
Eric Fiselier451d5582018-11-26 20:15:38 +00002735basic_string<_CharT, _Traits, _Allocator>::__append_default_init(size_type __n)
2736{
2737 if (__n)
2738 {
2739 size_type __cap = capacity();
2740 size_type __sz = size();
2741 if (__cap - __sz < __n)
2742 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2743 pointer __p = __get_pointer();
2744 __sz += __n;
2745 __set_size(__sz);
2746 traits_type::assign(__p[__sz], value_type());
2747 }
2748}
2749
2750template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002751_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002752void
2753basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
2754{
Howard Hinnant68bf1812013-04-30 21:44:48 +00002755 bool __is_short = !__is_long();
2756 size_type __cap;
2757 size_type __sz;
2758 if (__is_short)
2759 {
2760 __cap = __min_cap - 1;
2761 __sz = __get_short_size();
2762 }
2763 else
2764 {
2765 __cap = __get_long_cap() - 1;
2766 __sz = __get_long_size();
2767 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002768 if (__sz == __cap)
Howard Hinnant68bf1812013-04-30 21:44:48 +00002769 {
Howard Hinnantc51e1022010-05-11 19:42:16 +00002770 __grow_by(__cap, 1, __sz, __sz, 0);
Louis Dionne82d2b2c2021-11-16 11:26:56 -05002771 __is_short = false; // the string is always long after __grow_by
Howard Hinnant68bf1812013-04-30 21:44:48 +00002772 }
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002773 pointer __p = __get_pointer();
Howard Hinnant68bf1812013-04-30 21:44:48 +00002774 if (__is_short)
2775 {
2776 __p = __get_short_pointer() + __sz;
2777 __set_short_size(__sz+1);
2778 }
2779 else
2780 {
2781 __p = __get_long_pointer() + __sz;
2782 __set_long_size(__sz+1);
2783 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002784 traits_type::assign(*__p, __c);
2785 traits_type::assign(*++__p, value_type());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002786}
2787
Howard Hinnantc51e1022010-05-11 19:42:16 +00002788template <class _CharT, class _Traits, class _Allocator>
2789template<class _ForwardIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002790_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002791__enable_if_t
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002792<
2793 __is_cpp17_forward_iterator<_ForwardIterator>::value,
2794 basic_string<_CharT, _Traits, _Allocator>&
2795>
2796basic_string<_CharT, _Traits, _Allocator>::append(
Eric Fiselierdb7ee8f2016-10-31 02:46:25 +00002797 _ForwardIterator __first, _ForwardIterator __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002798{
2799 size_type __sz = size();
2800 size_type __cap = capacity();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002801 size_type __n = static_cast<size_type>(std::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002802 if (__n)
2803 {
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002804 if (__string_is_trivial_iterator<_ForwardIterator>::value &&
2805 !__addr_in_range(*__first))
Marshall Clow958362f2016-09-05 01:54:30 +00002806 {
2807 if (__cap - __sz < __n)
2808 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2809 pointer __p = __get_pointer() + __sz;
Arthur O'Dwyer80dbcbe2021-09-07 21:35:37 -04002810 for (; __first != __last; ++__p, (void) ++__first)
Marshall Clow958362f2016-09-05 01:54:30 +00002811 traits_type::assign(*__p, *__first);
2812 traits_type::assign(*__p, value_type());
2813 __set_size(__sz + __n);
2814 }
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002815 else
2816 {
2817 const basic_string __temp(__first, __last, __alloc());
2818 append(__temp.data(), __temp.size());
2819 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002820 }
2821 return *this;
2822}
2823
2824template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002825_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002826basic_string<_CharT, _Traits, _Allocator>&
2827basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
2828{
2829 size_type __sz = __str.size();
2830 if (__pos > __sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002831 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002832 return append(__str.data() + __pos, std::min(__n, __sz - __pos));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002833}
2834
2835template <class _CharT, class _Traits, class _Allocator>
Marshall Clow62953962016-10-03 23:40:48 +00002836template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002837_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002838 __enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00002839 <
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002840 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
Marshall Clow82513342016-09-24 22:45:42 +00002841 basic_string<_CharT, _Traits, _Allocator>&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002842 >
Marshall Clow82513342016-09-24 22:45:42 +00002843basic_string<_CharT, _Traits, _Allocator>::append(const _Tp & __t, size_type __pos, size_type __n)
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002844{
Marshall Clow82513342016-09-24 22:45:42 +00002845 __self_view __sv = __t;
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002846 size_type __sz = __sv.size();
2847 if (__pos > __sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002848 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002849 return append(__sv.data() + __pos, std::min(__n, __sz - __pos));
Marshall Clowdf63a6d2016-07-21 05:31:24 +00002850}
2851
2852template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002853_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002854basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnantd17880b2013-06-28 16:59:19 +00002855basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002856{
Alp Tokerb8a95f52014-05-15 11:27:39 +00002857 _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
Howard Hinnantc51e1022010-05-11 19:42:16 +00002858 return append(__s, traits_type::length(__s));
2859}
2860
2861// insert
2862
2863template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002864_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002865basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnantd17880b2013-06-28 16:59:19 +00002866basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002867{
Alp Tokerb8a95f52014-05-15 11:27:39 +00002868 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
Howard Hinnantc51e1022010-05-11 19:42:16 +00002869 size_type __sz = size();
2870 if (__pos > __sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002871 __throw_out_of_range();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002872 size_type __cap = capacity();
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02002873 if (__libcpp_is_constant_evaluated()) {
2874 if (__cap - __sz >= __n)
2875 __grow_by_and_replace(__cap, 0, __sz, __pos, 0, __n, __s);
2876 else
2877 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2878 return *this;
2879 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002880 if (__cap - __sz >= __n)
2881 {
2882 if (__n)
2883 {
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002884 value_type* __p = std::__to_address(__get_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002885 size_type __n_move = __sz - __pos;
2886 if (__n_move != 0)
2887 {
2888 if (__p + __pos <= __s && __s < __p + __sz)
2889 __s += __n;
2890 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2891 }
2892 traits_type::move(__p + __pos, __s, __n);
2893 __sz += __n;
2894 __set_size(__sz);
2895 traits_type::assign(__p[__sz], value_type());
2896 }
2897 }
2898 else
2899 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2900 return *this;
2901}
2902
2903template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002904_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002905basic_string<_CharT, _Traits, _Allocator>&
2906basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
2907{
2908 size_type __sz = size();
2909 if (__pos > __sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002910 __throw_out_of_range();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002911 if (__n)
2912 {
2913 size_type __cap = capacity();
Howard Hinnantd17880b2013-06-28 16:59:19 +00002914 value_type* __p;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002915 if (__cap - __sz >= __n)
2916 {
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002917 __p = std::__to_address(__get_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002918 size_type __n_move = __sz - __pos;
2919 if (__n_move != 0)
2920 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2921 }
2922 else
2923 {
2924 __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002925 __p = std::__to_address(__get_long_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002926 }
2927 traits_type::assign(__p + __pos, __n, __c);
2928 __sz += __n;
2929 __set_size(__sz);
2930 traits_type::assign(__p[__sz], value_type());
2931 }
2932 return *this;
2933}
2934
2935template <class _CharT, class _Traits, class _Allocator>
2936template<class _InputIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002937_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002938__enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00002939<
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002940 __is_exactly_cpp17_input_iterator<_InputIterator>::value,
Marshall Clow039b2f02016-01-13 21:54:34 +00002941 typename basic_string<_CharT, _Traits, _Allocator>::iterator
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002942>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002943basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
2944{
Nikolas Klausereed25832021-12-15 01:32:30 +01002945 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2946 "string::insert(iterator, range) called with an iterator not"
2947 " referring to this string");
2948 const basic_string __temp(__first, __last, __alloc());
2949 return insert(__pos, __temp.data(), __temp.data() + __temp.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002950}
2951
2952template <class _CharT, class _Traits, class _Allocator>
2953template<class _ForwardIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002954_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002955__enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00002956<
Arthur O'Dwyer98ff31f2021-04-16 17:49:57 -04002957 __is_cpp17_forward_iterator<_ForwardIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00002958 typename basic_string<_CharT, _Traits, _Allocator>::iterator
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002959>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002960basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
2961{
Nikolas Klauser48d680d2022-02-26 13:28:33 +01002962 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2963 "string::insert(iterator, range) called with an iterator not referring to this string");
Nikolas Klausereed25832021-12-15 01:32:30 +01002964
Howard Hinnantc51e1022010-05-11 19:42:16 +00002965 size_type __ip = static_cast<size_type>(__pos - begin());
Nikolas Klauser48d680d2022-02-26 13:28:33 +01002966 size_type __n = static_cast<size_type>(std::distance(__first, __last));
2967 if (__n == 0)
2968 return begin() + __ip;
2969
2970 if (__string_is_trivial_iterator<_ForwardIterator>::value && !__addr_in_range(*__first))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002971 {
Nikolas Klauser48d680d2022-02-26 13:28:33 +01002972 return __insert_from_safe_copy(__n, __ip, __first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002973 }
Nikolas Klauser48d680d2022-02-26 13:28:33 +01002974 else
2975 {
2976 const basic_string __temp(__first, __last, __alloc());
2977 return __insert_from_safe_copy(__n, __ip, __temp.begin(), __temp.end());
2978 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002979}
2980
2981template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002982_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00002983basic_string<_CharT, _Traits, _Allocator>&
2984basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
2985 size_type __pos2, size_type __n)
2986{
2987 size_type __str_sz = __str.size();
2988 if (__pos2 > __str_sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01002989 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02002990 return insert(__pos1, __str.data() + __pos2, std::min(__n, __str_sz - __pos2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002991}
2992
2993template <class _CharT, class _Traits, class _Allocator>
Marshall Clow82513342016-09-24 22:45:42 +00002994template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02002995_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04002996__enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00002997<
Eric Fiselierc522ceb2020-01-15 16:57:08 -05002998 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
Marshall Clowb7db4972017-11-15 20:02:27 +00002999 basic_string<_CharT, _Traits, _Allocator>&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003000>
Marshall Clow82513342016-09-24 22:45:42 +00003001basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const _Tp& __t,
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003002 size_type __pos2, size_type __n)
3003{
Marshall Clow82513342016-09-24 22:45:42 +00003004 __self_view __sv = __t;
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003005 size_type __str_sz = __sv.size();
3006 if (__pos2 > __str_sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003007 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003008 return insert(__pos1, __sv.data() + __pos2, std::min(__n, __str_sz - __pos2));
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003009}
3010
3011template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003012_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003013basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnantd17880b2013-06-28 16:59:19 +00003014basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003015{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003016 _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
Howard Hinnantc51e1022010-05-11 19:42:16 +00003017 return insert(__pos, __s, traits_type::length(__s));
3018}
3019
3020template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003021_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003022typename basic_string<_CharT, _Traits, _Allocator>::iterator
3023basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
3024{
Louis Dionnef4cc6fb2022-02-15 15:47:45 -05003025 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
3026 "string::insert(iterator, character) called with an iterator not"
3027 " referring to this string");
3028
Howard Hinnantc51e1022010-05-11 19:42:16 +00003029 size_type __ip = static_cast<size_type>(__pos - begin());
3030 size_type __sz = size();
3031 size_type __cap = capacity();
Howard Hinnantd17880b2013-06-28 16:59:19 +00003032 value_type* __p;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003033 if (__cap == __sz)
3034 {
3035 __grow_by(__cap, 1, __sz, __ip, 0, 1);
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003036 __p = std::__to_address(__get_long_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003037 }
3038 else
3039 {
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003040 __p = std::__to_address(__get_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003041 size_type __n_move = __sz - __ip;
3042 if (__n_move != 0)
3043 traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
3044 }
3045 traits_type::assign(__p[__ip], __c);
3046 traits_type::assign(__p[++__sz], value_type());
3047 __set_size(__sz);
3048 return begin() + static_cast<difference_type>(__ip);
3049}
3050
Howard Hinnantc51e1022010-05-11 19:42:16 +00003051// replace
3052
3053template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003054_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003055basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnantd17880b2013-06-28 16:59:19 +00003056basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2)
Eric Fiseliere5b21842017-03-09 01:54:13 +00003057 _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
Howard Hinnantc51e1022010-05-11 19:42:16 +00003058{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003059 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
Howard Hinnantc51e1022010-05-11 19:42:16 +00003060 size_type __sz = size();
3061 if (__pos > __sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003062 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003063 __n1 = std::min(__n1, __sz - __pos);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003064 size_type __cap = capacity();
3065 if (__cap - __sz + __n1 >= __n2)
3066 {
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02003067 if (__libcpp_is_constant_evaluated()) {
3068 __grow_by_and_replace(__cap, 0, __sz, __pos, __n1, __n2, __s);
3069 return *this;
3070 }
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003071 value_type* __p = std::__to_address(__get_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003072 if (__n1 != __n2)
3073 {
3074 size_type __n_move = __sz - __pos - __n1;
3075 if (__n_move != 0)
3076 {
3077 if (__n1 > __n2)
3078 {
3079 traits_type::move(__p + __pos, __s, __n2);
3080 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
Nikolas Klauser3ec7fb22021-12-14 01:20:53 +01003081 return __null_terminate_at(__p, __sz + (__n2 - __n1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003082 }
3083 if (__p + __pos < __s && __s < __p + __sz)
3084 {
3085 if (__p + __pos + __n1 <= __s)
3086 __s += __n2 - __n1;
3087 else // __p + __pos < __s < __p + __pos + __n1
3088 {
3089 traits_type::move(__p + __pos, __s, __n1);
3090 __pos += __n1;
3091 __s += __n2;
3092 __n2 -= __n1;
3093 __n1 = 0;
3094 }
3095 }
3096 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
3097 }
3098 }
3099 traits_type::move(__p + __pos, __s, __n2);
Nikolas Klauser3ec7fb22021-12-14 01:20:53 +01003100 return __null_terminate_at(__p, __sz + (__n2 - __n1));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003101 }
3102 else
3103 __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
3104 return *this;
3105}
3106
3107template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003108_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003109basic_string<_CharT, _Traits, _Allocator>&
3110basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
3111{
3112 size_type __sz = size();
3113 if (__pos > __sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003114 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003115 __n1 = std::min(__n1, __sz - __pos);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003116 size_type __cap = capacity();
Howard Hinnantd17880b2013-06-28 16:59:19 +00003117 value_type* __p;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003118 if (__cap - __sz + __n1 >= __n2)
3119 {
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003120 __p = std::__to_address(__get_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003121 if (__n1 != __n2)
3122 {
3123 size_type __n_move = __sz - __pos - __n1;
3124 if (__n_move != 0)
3125 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
3126 }
3127 }
3128 else
3129 {
3130 __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003131 __p = std::__to_address(__get_long_pointer());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003132 }
3133 traits_type::assign(__p + __pos, __n2, __c);
Nikolas Klauser3ec7fb22021-12-14 01:20:53 +01003134 return __null_terminate_at(__p, __sz - (__n1 - __n2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003135}
3136
3137template <class _CharT, class _Traits, class _Allocator>
3138template<class _InputIterator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003139_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003140__enable_if_t
Howard Hinnantc51e1022010-05-11 19:42:16 +00003141<
Eric Fiseliercd5a6772019-11-18 01:46:58 -05003142 __is_cpp17_input_iterator<_InputIterator>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00003143 basic_string<_CharT, _Traits, _Allocator>&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003144>
Howard Hinnant990d6e82010-11-17 21:11:40 +00003145basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
Howard Hinnantc51e1022010-05-11 19:42:16 +00003146 _InputIterator __j1, _InputIterator __j2)
3147{
Marshall Clow958362f2016-09-05 01:54:30 +00003148 const basic_string __temp(__j1, __j2, __alloc());
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003149 return replace(__i1, __i2, __temp);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003150}
3151
3152template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003153_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003154basic_string<_CharT, _Traits, _Allocator>&
3155basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
3156 size_type __pos2, size_type __n2)
3157{
3158 size_type __str_sz = __str.size();
3159 if (__pos2 > __str_sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003160 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003161 return replace(__pos1, __n1, __str.data() + __pos2, std::min(__n2, __str_sz - __pos2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003162}
3163
3164template <class _CharT, class _Traits, class _Allocator>
Marshall Clow82513342016-09-24 22:45:42 +00003165template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003166_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003167__enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00003168<
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003169 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
Marshall Clowb7db4972017-11-15 20:02:27 +00003170 basic_string<_CharT, _Traits, _Allocator>&
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003171>
Marshall Clow82513342016-09-24 22:45:42 +00003172basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const _Tp& __t,
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003173 size_type __pos2, size_type __n2)
3174{
Marshall Clow82513342016-09-24 22:45:42 +00003175 __self_view __sv = __t;
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003176 size_type __str_sz = __sv.size();
3177 if (__pos2 > __str_sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003178 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003179 return replace(__pos1, __n1, __sv.data() + __pos2, std::min(__n2, __str_sz - __pos2));
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003180}
3181
3182template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003183_LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003184basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnantd17880b2013-06-28 16:59:19 +00003185basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003186{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003187 _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr");
Howard Hinnantc51e1022010-05-11 19:42:16 +00003188 return replace(__pos, __n1, __s, traits_type::length(__s));
3189}
3190
Howard Hinnantc51e1022010-05-11 19:42:16 +00003191// erase
3192
Martijn Velsa81fc792020-02-26 13:25:43 -05003193// 'externally instantiated' erase() implementation, called when __n != npos.
3194// Does not check __pos against size()
Howard Hinnantc51e1022010-05-11 19:42:16 +00003195template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003196_LIBCPP_CONSTEXPR_SINCE_CXX20
Martijn Velsa81fc792020-02-26 13:25:43 -05003197void
3198basic_string<_CharT, _Traits, _Allocator>::__erase_external_with_move(
3199 size_type __pos, size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003200{
Howard Hinnantc51e1022010-05-11 19:42:16 +00003201 if (__n)
3202 {
Martijn Velsa81fc792020-02-26 13:25:43 -05003203 size_type __sz = size();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003204 value_type* __p = std::__to_address(__get_pointer());
3205 __n = std::min(__n, __sz - __pos);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003206 size_type __n_move = __sz - __pos - __n;
3207 if (__n_move != 0)
3208 traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
Nikolas Klauser3ec7fb22021-12-14 01:20:53 +01003209 __null_terminate_at(__p, __sz - __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003210 }
Martijn Velsa81fc792020-02-26 13:25:43 -05003211}
3212
3213template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003214_LIBCPP_CONSTEXPR_SINCE_CXX20
Martijn Velsa81fc792020-02-26 13:25:43 -05003215basic_string<_CharT, _Traits, _Allocator>&
3216basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos,
3217 size_type __n) {
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003218 if (__pos > size())
3219 __throw_out_of_range();
Martijn Velsa81fc792020-02-26 13:25:43 -05003220 if (__n == npos) {
3221 __erase_to_end(__pos);
3222 } else {
3223 __erase_external_with_move(__pos, __n);
3224 }
3225 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003226}
3227
3228template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003229inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003230typename basic_string<_CharT, _Traits, _Allocator>::iterator
3231basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
3232{
Nikolas Klausereed25832021-12-15 01:32:30 +01003233 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
3234 "string::erase(iterator) called with an iterator not"
3235 " referring to this string");
3236
3237 _LIBCPP_ASSERT(__pos != end(), "string::erase(iterator) called with a non-dereferenceable iterator");
3238 iterator __b = begin();
3239 size_type __r = static_cast<size_type>(__pos - __b);
3240 erase(__r, 1);
3241 return __b + static_cast<difference_type>(__r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003242}
3243
3244template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003245inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003246typename basic_string<_CharT, _Traits, _Allocator>::iterator
3247basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
3248{
Nikolas Klausereed25832021-12-15 01:32:30 +01003249 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
3250 "string::erase(iterator, iterator) called with an iterator not"
3251 " referring to this string");
3252
3253 _LIBCPP_ASSERT(__first <= __last, "string::erase(first, last) called with invalid range");
3254 iterator __b = begin();
3255 size_type __r = static_cast<size_type>(__first - __b);
3256 erase(__r, static_cast<size_type>(__last - __first));
3257 return __b + static_cast<difference_type>(__r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003258}
3259
3260template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003261inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003262void
3263basic_string<_CharT, _Traits, _Allocator>::pop_back()
3264{
Howard Hinnant8ea98242013-08-23 17:37:05 +00003265 _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty");
Nikolas Klauser3ec7fb22021-12-14 01:20:53 +01003266 __erase_to_end(size() - 1);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003267}
3268
3269template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003270inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003271void
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003272basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003273{
Nikolas Klauserf1d286b2022-05-08 16:40:04 +02003274 std::__debug_db_invalidate_all(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003275 if (__is_long())
3276 {
3277 traits_type::assign(*__get_long_pointer(), value_type());
3278 __set_long_size(0);
3279 }
3280 else
3281 {
3282 traits_type::assign(*__get_short_pointer(), value_type());
3283 __set_short_size(0);
3284 }
3285}
3286
3287template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003288_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003289void
3290basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
3291{
3292 size_type __sz = size();
3293 if (__n > __sz)
3294 append(__n - __sz, __c);
3295 else
3296 __erase_to_end(__n);
3297}
3298
3299template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003300_LIBCPP_CONSTEXPR_SINCE_CXX20 inline void
Eric Fiselier451d5582018-11-26 20:15:38 +00003301basic_string<_CharT, _Traits, _Allocator>::__resize_default_init(size_type __n)
3302{
3303 size_type __sz = size();
3304 if (__n > __sz) {
3305 __append_default_init(__n - __sz);
3306 } else
3307 __erase_to_end(__n);
3308}
3309
3310template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003311_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003312void
Marek Kurdejc9848142020-11-26 10:07:16 +01003313basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __requested_capacity)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003314{
Marek Kurdejc9848142020-11-26 10:07:16 +01003315 if (__requested_capacity > max_size())
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003316 __throw_length_error();
Marek Kurdejc9848142020-11-26 10:07:16 +01003317
Louis Dionne05b6d3e2022-01-14 12:30:22 -05003318 // Make sure reserve(n) never shrinks. This is technically only required in C++20
3319 // and later (since P0966R1), however we provide consistent behavior in all Standard
3320 // modes because this function is instantiated in the shared library.
3321 if (__requested_capacity <= capacity())
3322 return;
Marek Kurdejc9848142020-11-26 10:07:16 +01003323
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003324 size_type __target_capacity = std::max(__requested_capacity, size());
Marek Kurdejc9848142020-11-26 10:07:16 +01003325 __target_capacity = __recommend(__target_capacity);
3326 if (__target_capacity == capacity()) return;
3327
3328 __shrink_or_extend(__target_capacity);
3329}
3330
3331template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003332inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Marek Kurdejc9848142020-11-26 10:07:16 +01003333void
3334basic_string<_CharT, _Traits, _Allocator>::shrink_to_fit() _NOEXCEPT
3335{
3336 size_type __target_capacity = __recommend(size());
3337 if (__target_capacity == capacity()) return;
3338
3339 __shrink_or_extend(__target_capacity);
3340}
3341
3342template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003343inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Marek Kurdejc9848142020-11-26 10:07:16 +01003344void
3345basic_string<_CharT, _Traits, _Allocator>::__shrink_or_extend(size_type __target_capacity)
3346{
Howard Hinnantc51e1022010-05-11 19:42:16 +00003347 size_type __cap = capacity();
3348 size_type __sz = size();
Marek Kurdejc9848142020-11-26 10:07:16 +01003349
3350 pointer __new_data, __p;
3351 bool __was_long, __now_long;
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02003352 if (__fits_in_sso(__target_capacity))
Howard Hinnantc51e1022010-05-11 19:42:16 +00003353 {
Marek Kurdejc9848142020-11-26 10:07:16 +01003354 __was_long = true;
3355 __now_long = false;
3356 __new_data = __get_short_pointer();
3357 __p = __get_long_pointer();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003358 }
Marek Kurdejc9848142020-11-26 10:07:16 +01003359 else
3360 {
Nikolas Klauserc513eba2022-04-09 09:41:19 +02003361 if (__target_capacity > __cap) {
3362 auto __allocation = std::__allocate_at_least(__alloc(), __target_capacity + 1);
3363 __new_data = __allocation.ptr;
3364 __target_capacity = __allocation.count - 1;
3365 }
Marek Kurdejc9848142020-11-26 10:07:16 +01003366 else
3367 {
3368 #ifndef _LIBCPP_NO_EXCEPTIONS
3369 try
3370 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003371 #endif // _LIBCPP_NO_EXCEPTIONS
Nikolas Klauserc513eba2022-04-09 09:41:19 +02003372 auto __allocation = std::__allocate_at_least(__alloc(), __target_capacity + 1);
3373 __new_data = __allocation.ptr;
3374 __target_capacity = __allocation.count - 1;
Marek Kurdejc9848142020-11-26 10:07:16 +01003375 #ifndef _LIBCPP_NO_EXCEPTIONS
3376 }
3377 catch (...)
3378 {
3379 return;
3380 }
3381 #else // _LIBCPP_NO_EXCEPTIONS
3382 if (__new_data == nullptr)
3383 return;
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003384 #endif // _LIBCPP_NO_EXCEPTIONS
Marek Kurdejc9848142020-11-26 10:07:16 +01003385 }
Nikolas Klauser80b3cf32022-04-27 10:11:44 +02003386 __begin_lifetime(__new_data, __target_capacity + 1);
Marek Kurdejc9848142020-11-26 10:07:16 +01003387 __now_long = true;
3388 __was_long = __is_long();
3389 __p = __get_pointer();
3390 }
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003391 traits_type::copy(std::__to_address(__new_data),
3392 std::__to_address(__p), size()+1);
Marek Kurdejc9848142020-11-26 10:07:16 +01003393 if (__was_long)
3394 __alloc_traits::deallocate(__alloc(), __p, __cap+1);
3395 if (__now_long)
3396 {
3397 __set_long_cap(__target_capacity+1);
3398 __set_long_size(__sz);
3399 __set_long_pointer(__new_data);
3400 }
3401 else
3402 __set_short_size(__sz);
Nikolas Klauserf1d286b2022-05-08 16:40:04 +02003403 std::__debug_db_invalidate_all(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003404}
3405
3406template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003407_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003408typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3409basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
3410{
3411 if (__n >= size())
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003412 __throw_out_of_range();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003413 return (*this)[__n];
3414}
3415
3416template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003417_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003418typename basic_string<_CharT, _Traits, _Allocator>::reference
3419basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
3420{
3421 if (__n >= size())
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003422 __throw_out_of_range();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003423 return (*this)[__n];
3424}
3425
3426template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003427_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003428typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003429basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00003430{
3431 size_type __sz = size();
3432 if (__pos > __sz)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003433 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003434 size_type __rlen = std::min(__n, __sz - __pos);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003435 traits_type::copy(__s, data() + __pos, __rlen);
3436 return __rlen;
3437}
3438
3439template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003440inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003441void
3442basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
Marshall Clow8982dcd2015-07-13 20:04:56 +00003443#if _LIBCPP_STD_VER >= 14
Eric Fiselier873b8d32019-03-18 21:50:12 +00003444 _NOEXCEPT
Marshall Clow8982dcd2015-07-13 20:04:56 +00003445#else
Eric Fiselier873b8d32019-03-18 21:50:12 +00003446 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00003447 __is_nothrow_swappable<allocator_type>::value)
3448#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00003449{
Nikolas Klauser98833542022-05-07 22:20:23 +02003450 if (!__is_long())
3451 std::__debug_db_invalidate_all(this);
3452 if (!__str.__is_long())
3453 std::__debug_db_invalidate_all(&__str);
3454 std::__debug_db_swap(this, &__str);
3455
Eric Fiselier9bf691f2016-12-28 05:53:01 +00003456 _LIBCPP_ASSERT(
3457 __alloc_traits::propagate_on_container_swap::value ||
3458 __alloc_traits::is_always_equal::value ||
3459 __alloc() == __str.__alloc(), "swapping non-equal allocators");
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003460 std::swap(__r_.first(), __str.__r_.first());
3461 std::__swap_allocator(__alloc(), __str.__alloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003462}
3463
3464// find
3465
3466template <class _Traits>
3467struct _LIBCPP_HIDDEN __traits_eq
3468{
3469 typedef typename _Traits::char_type char_type;
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003470 _LIBCPP_HIDE_FROM_ABI
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003471 bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
3472 {return _Traits::eq(__x, __y);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00003473};
3474
3475template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003476_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003477typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003478basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003479 size_type __pos,
3480 size_type __n) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003481{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003482 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003483 return std::__str_find<value_type, size_type, traits_type, npos>
Marshall Clowc527b6e2014-06-02 02:22:49 +00003484 (data(), size(), __s, __pos, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003485}
3486
3487template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003488inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003489typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003490basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
3491 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003492{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003493 return std::__str_find<value_type, size_type, traits_type, npos>
Marshall Clowc527b6e2014-06-02 02:22:49 +00003494 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003495}
3496
3497template<class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00003498template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003499_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003500__enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00003501<
3502 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3503 typename basic_string<_CharT, _Traits, _Allocator>::size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003504>
Marshall Clowe46031a2018-07-02 18:41:15 +00003505basic_string<_CharT, _Traits, _Allocator>::find(const _Tp &__t,
zoecarver1997e0a2021-02-05 11:54:47 -08003506 size_type __pos) const _NOEXCEPT
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003507{
Marshall Clowe46031a2018-07-02 18:41:15 +00003508 __self_view __sv = __t;
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003509 return std::__str_find<value_type, size_type, traits_type, npos>
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003510 (data(), size(), __sv.data(), __pos, __sv.size());
3511}
3512
3513template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003514inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003515typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003516basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003517 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003518{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003519 _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003520 return std::__str_find<value_type, size_type, traits_type, npos>
Marshall Clowc527b6e2014-06-02 02:22:49 +00003521 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003522}
3523
3524template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003525_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003526typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003527basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
3528 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003529{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003530 return std::__str_find<value_type, size_type, traits_type, npos>
Marshall Clowc527b6e2014-06-02 02:22:49 +00003531 (data(), size(), __c, __pos);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003532}
3533
3534// rfind
3535
3536template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003537_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003538typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003539basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003540 size_type __pos,
3541 size_type __n) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003542{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003543 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003544 return std::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clowc527b6e2014-06-02 02:22:49 +00003545 (data(), size(), __s, __pos, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003546}
3547
3548template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003549inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003550typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003551basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
3552 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003553{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003554 return std::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clowc527b6e2014-06-02 02:22:49 +00003555 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003556}
3557
3558template<class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00003559template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003560_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003561__enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00003562<
3563 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3564 typename basic_string<_CharT, _Traits, _Allocator>::size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003565>
Marshall Clowe46031a2018-07-02 18:41:15 +00003566basic_string<_CharT, _Traits, _Allocator>::rfind(const _Tp& __t,
zoecarver1997e0a2021-02-05 11:54:47 -08003567 size_type __pos) const _NOEXCEPT
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003568{
Marshall Clowe46031a2018-07-02 18:41:15 +00003569 __self_view __sv = __t;
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003570 return std::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003571 (data(), size(), __sv.data(), __pos, __sv.size());
3572}
3573
3574template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003575inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003576typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003577basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003578 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003579{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003580 _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003581 return std::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clowc527b6e2014-06-02 02:22:49 +00003582 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003583}
3584
3585template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003586_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003587typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003588basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
3589 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003590{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003591 return std::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clowc527b6e2014-06-02 02:22:49 +00003592 (data(), size(), __c, __pos);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003593}
3594
3595// find_first_of
3596
3597template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003598_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003599typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003600basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003601 size_type __pos,
3602 size_type __n) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003603{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003604 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003605 return std::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003606 (data(), size(), __s, __pos, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003607}
3608
3609template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003610inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003611typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003612basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
3613 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003614{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003615 return std::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003616 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003617}
3618
3619template<class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00003620template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003621_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003622__enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00003623<
3624 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3625 typename basic_string<_CharT, _Traits, _Allocator>::size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003626>
Marshall Clowe46031a2018-07-02 18:41:15 +00003627basic_string<_CharT, _Traits, _Allocator>::find_first_of(const _Tp& __t,
zoecarver1997e0a2021-02-05 11:54:47 -08003628 size_type __pos) const _NOEXCEPT
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003629{
Marshall Clowe46031a2018-07-02 18:41:15 +00003630 __self_view __sv = __t;
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003631 return std::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003632 (data(), size(), __sv.data(), __pos, __sv.size());
3633}
3634
3635template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003636inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003637typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003638basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003639 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003640{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003641 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003642 return std::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003643 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003644}
3645
3646template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003647inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003648typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003649basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
3650 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003651{
3652 return find(__c, __pos);
3653}
3654
3655// find_last_of
3656
3657template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003658inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003659typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003660basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003661 size_type __pos,
3662 size_type __n) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003663{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003664 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003665 return std::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003666 (data(), size(), __s, __pos, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003667}
3668
3669template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003670inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003671typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003672basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
3673 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003674{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003675 return std::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003676 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003677}
3678
3679template<class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00003680template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003681_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003682__enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00003683<
3684 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3685 typename basic_string<_CharT, _Traits, _Allocator>::size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003686>
Marshall Clowe46031a2018-07-02 18:41:15 +00003687basic_string<_CharT, _Traits, _Allocator>::find_last_of(const _Tp& __t,
zoecarver1997e0a2021-02-05 11:54:47 -08003688 size_type __pos) const _NOEXCEPT
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003689{
Marshall Clowe46031a2018-07-02 18:41:15 +00003690 __self_view __sv = __t;
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003691 return std::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003692 (data(), size(), __sv.data(), __pos, __sv.size());
3693}
3694
3695template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003696inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003697typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003698basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003699 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003700{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003701 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003702 return std::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003703 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003704}
3705
3706template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003707inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003708typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003709basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
3710 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003711{
3712 return rfind(__c, __pos);
3713}
3714
3715// find_first_not_of
3716
3717template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003718_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003719typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003720basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003721 size_type __pos,
3722 size_type __n) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003723{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003724 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003725 return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003726 (data(), size(), __s, __pos, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003727}
3728
3729template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003730inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003731typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003732basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
3733 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003734{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003735 return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003736 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003737}
3738
3739template<class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00003740template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003741_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003742__enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00003743<
3744 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3745 typename basic_string<_CharT, _Traits, _Allocator>::size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003746>
Marshall Clowe46031a2018-07-02 18:41:15 +00003747basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const _Tp& __t,
zoecarver1997e0a2021-02-05 11:54:47 -08003748 size_type __pos) const _NOEXCEPT
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003749{
Marshall Clowe46031a2018-07-02 18:41:15 +00003750 __self_view __sv = __t;
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003751 return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003752 (data(), size(), __sv.data(), __pos, __sv.size());
3753}
3754
3755template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003756inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003757typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003758basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003759 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003760{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003761 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003762 return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003763 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003764}
3765
3766template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003767inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003768typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003769basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
3770 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003771{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003772 return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003773 (data(), size(), __c, __pos);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003774}
3775
3776// find_last_not_of
3777
3778template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003779_LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003780typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003781basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003782 size_type __pos,
3783 size_type __n) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003784{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003785 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003786 return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003787 (data(), size(), __s, __pos, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003788}
3789
3790template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003791inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003792typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003793basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
3794 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003795{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003796 return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003797 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003798}
3799
3800template<class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00003801template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003802_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003803__enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00003804<
3805 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3806 typename basic_string<_CharT, _Traits, _Allocator>::size_type
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003807>
Marshall Clowe46031a2018-07-02 18:41:15 +00003808basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const _Tp& __t,
zoecarver1997e0a2021-02-05 11:54:47 -08003809 size_type __pos) const _NOEXCEPT
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003810{
Marshall Clowe46031a2018-07-02 18:41:15 +00003811 __self_view __sv = __t;
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003812 return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003813 (data(), size(), __sv.data(), __pos, __sv.size());
3814}
3815
3816template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003817inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003818typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantd17880b2013-06-28 16:59:19 +00003819basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003820 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003821{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003822 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr");
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003823 return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003824 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003825}
3826
3827template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003828inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003829typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003830basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
3831 size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003832{
Nikolas Klauser0ada9192022-08-13 22:33:12 +02003833 return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow4bc2be22014-02-16 01:57:26 +00003834 (data(), size(), __c, __pos);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003835}
3836
3837// compare
3838
3839template <class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00003840template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003841_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003842__enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00003843<
3844 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3845 int
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003846>
zoecarver1997e0a2021-02-05 11:54:47 -08003847basic_string<_CharT, _Traits, _Allocator>::compare(const _Tp& __t) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003848{
Marshall Clowe46031a2018-07-02 18:41:15 +00003849 __self_view __sv = __t;
Howard Hinnantb0485532011-07-24 21:45:06 +00003850 size_t __lhs_sz = size();
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003851 size_t __rhs_sz = __sv.size();
3852 int __result = traits_type::compare(data(), __sv.data(),
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003853 std::min(__lhs_sz, __rhs_sz));
Howard Hinnantb0485532011-07-24 21:45:06 +00003854 if (__result != 0)
3855 return __result;
3856 if (__lhs_sz < __rhs_sz)
3857 return -1;
3858 if (__lhs_sz > __rhs_sz)
3859 return 1;
3860 return 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003861}
3862
3863template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003864inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003865int
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003866basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003867{
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003868 return compare(__self_view(__str));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003869}
3870
3871template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003872inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003873int
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003874basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3875 size_type __n1,
Howard Hinnantd17880b2013-06-28 16:59:19 +00003876 const value_type* __s,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00003877 size_type __n2) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00003878{
Alp Tokerb8a95f52014-05-15 11:27:39 +00003879 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr");
Howard Hinnantc51e1022010-05-11 19:42:16 +00003880 size_type __sz = size();
3881 if (__pos1 > __sz || __n2 == npos)
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003882 __throw_out_of_range();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02003883 size_type __rlen = std::min(__n1, __sz - __pos1);
3884 int __r = traits_type::compare(data() + __pos1, __s, std::min(__rlen, __n2));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003885 if (__r == 0)
3886 {
3887 if (__rlen < __n2)
3888 __r = -1;
3889 else if (__rlen > __n2)
3890 __r = 1;
3891 }
3892 return __r;
3893}
3894
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003895template <class _CharT, class _Traits, class _Allocator>
Marshall Clowe46031a2018-07-02 18:41:15 +00003896template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003897_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003898__enable_if_t
Marshall Clowe46031a2018-07-02 18:41:15 +00003899<
3900 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3901 int
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003902>
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003903basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3904 size_type __n1,
Marshall Clowe46031a2018-07-02 18:41:15 +00003905 const _Tp& __t) const
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003906{
Marshall Clowe46031a2018-07-02 18:41:15 +00003907 __self_view __sv = __t;
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003908 return compare(__pos1, __n1, __sv.data(), __sv.size());
3909}
3910
3911template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003912inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003913int
3914basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3915 size_type __n1,
3916 const basic_string& __str) const
3917{
3918 return compare(__pos1, __n1, __str.data(), __str.size());
3919}
3920
3921template <class _CharT, class _Traits, class _Allocator>
Marshall Clow82513342016-09-24 22:45:42 +00003922template <class _Tp>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003923_LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne9ce598d2021-09-08 09:14:43 -04003924__enable_if_t
Marshall Clow82513342016-09-24 22:45:42 +00003925<
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003926 __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
3927 && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
Marshall Clowb7db4972017-11-15 20:02:27 +00003928 int
Eric Fiselierc522ceb2020-01-15 16:57:08 -05003929>
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003930basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3931 size_type __n1,
Marshall Clow82513342016-09-24 22:45:42 +00003932 const _Tp& __t,
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003933 size_type __pos2,
3934 size_type __n2) const
3935{
Marshall Clow82513342016-09-24 22:45:42 +00003936 __self_view __sv = __t;
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003937 return __self_view(*this).substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
3938}
3939
3940template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003941_LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003942int
3943basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3944 size_type __n1,
3945 const basic_string& __str,
3946 size_type __pos2,
3947 size_type __n2) const
3948{
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01003949 return compare(__pos1, __n1, __self_view(__str), __pos2, __n2);
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003950}
3951
3952template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003953_LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003954int
3955basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
3956{
3957 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
3958 return compare(0, npos, __s, traits_type::length(__s));
3959}
3960
3961template <class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003962_LIBCPP_CONSTEXPR_SINCE_CXX20
Marshall Clowdf63a6d2016-07-21 05:31:24 +00003963int
3964basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3965 size_type __n1,
3966 const value_type* __s) const
3967{
3968 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
3969 return compare(__pos1, __n1, __s, traits_type::length(__s));
3970}
3971
Howard Hinnantc51e1022010-05-11 19:42:16 +00003972// __invariants
3973
3974template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003975inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00003976bool
3977basic_string<_CharT, _Traits, _Allocator>::__invariants() const
3978{
3979 if (size() > capacity())
3980 return false;
3981 if (capacity() < __min_cap - 1)
3982 return false;
Bruce Mitchener170d8972020-11-24 12:53:53 -05003983 if (data() == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003984 return false;
Louis Dionne663415f2020-10-05 16:16:13 -04003985 if (data()[size()] != value_type())
Howard Hinnantc51e1022010-05-11 19:42:16 +00003986 return false;
3987 return true;
3988}
3989
Vedant Kumar55e007e2018-03-08 21:15:26 +00003990// __clear_and_shrink
3991
3992template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02003993inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Louis Dionne173f29e2019-05-29 16:01:36 +00003994void
Marshall Clowe60a7182018-05-29 17:04:37 +00003995basic_string<_CharT, _Traits, _Allocator>::__clear_and_shrink() _NOEXCEPT
Vedant Kumar55e007e2018-03-08 21:15:26 +00003996{
3997 clear();
3998 if(__is_long())
3999 {
4000 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), capacity() + 1);
Nikolas Klauser1821ec32022-10-01 15:37:24 +02004001 __default_init();
Vedant Kumar55e007e2018-03-08 21:15:26 +00004002 }
Louis Dionne173f29e2019-05-29 16:01:36 +00004003}
Vedant Kumar55e007e2018-03-08 21:15:26 +00004004
Howard Hinnantc51e1022010-05-11 19:42:16 +00004005// operator==
4006
4007template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004008inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004009bool
4010operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004011 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004012{
Mark de Weverb4830e62022-07-19 07:56:23 +02004013#if _LIBCPP_STD_VER > 17
4014 return basic_string_view<_CharT, _Traits>(__lhs) == basic_string_view<_CharT, _Traits>(__rhs);
4015#else
Howard Hinnantaaeb1132013-04-22 23:55:13 +00004016 size_t __lhs_sz = __lhs.size();
4017 return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(),
4018 __rhs.data(),
4019 __lhs_sz) == 0;
Mark de Weverb4830e62022-07-19 07:56:23 +02004020#endif
Howard Hinnantaaeb1132013-04-22 23:55:13 +00004021}
4022
4023template<class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004024inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
Howard Hinnantaaeb1132013-04-22 23:55:13 +00004025bool
4026operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
4027 const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT
4028{
4029 size_t __lhs_sz = __lhs.size();
4030 if (__lhs_sz != __rhs.size())
4031 return false;
4032 const char* __lp = __lhs.data();
4033 const char* __rp = __rhs.data();
4034 if (__lhs.__is_long())
4035 return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
4036 for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
4037 if (*__lp != *__rp)
4038 return false;
4039 return true;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004040}
4041
Mark de Weverb4830e62022-07-19 07:56:23 +02004042#if _LIBCPP_STD_VER <= 17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004043template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004044inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004045bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004046operator==(const _CharT* __lhs,
4047 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004048{
Eric Fiselier0cafa3f2015-08-28 03:02:37 +00004049 typedef basic_string<_CharT, _Traits, _Allocator> _String;
4050 _LIBCPP_ASSERT(__lhs != nullptr, "operator==(char*, basic_string): received nullptr");
4051 size_t __lhs_len = _Traits::length(__lhs);
4052 if (__lhs_len != __rhs.size()) return false;
4053 return __rhs.compare(0, _String::npos, __lhs, __lhs_len) == 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004054}
Mark de Weverb4830e62022-07-19 07:56:23 +02004055#endif // _LIBCPP_STD_VER <= 17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004056
Howard Hinnantc51e1022010-05-11 19:42:16 +00004057template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004058inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004059bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004060operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
4061 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004062{
Mark de Weverb4830e62022-07-19 07:56:23 +02004063#if _LIBCPP_STD_VER > 17
4064 return basic_string_view<_CharT, _Traits>(__lhs) == basic_string_view<_CharT, _Traits>(__rhs);
4065#else
Eric Fiselier0cafa3f2015-08-28 03:02:37 +00004066 typedef basic_string<_CharT, _Traits, _Allocator> _String;
4067 _LIBCPP_ASSERT(__rhs != nullptr, "operator==(basic_string, char*): received nullptr");
4068 size_t __rhs_len = _Traits::length(__rhs);
4069 if (__rhs_len != __lhs.size()) return false;
4070 return __lhs.compare(0, _String::npos, __rhs, __rhs_len) == 0;
Mark de Weverb4830e62022-07-19 07:56:23 +02004071#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00004072}
4073
Mark de Weverb4830e62022-07-19 07:56:23 +02004074#if _LIBCPP_STD_VER > 17
4075
4076template <class _CharT, class _Traits, class _Allocator>
4077_LIBCPP_HIDE_FROM_ABI constexpr auto operator<=>(
4078 const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4079 const basic_string<_CharT, _Traits, _Allocator>& __rhs) noexcept {
4080 return basic_string_view<_CharT, _Traits>(__lhs) <=> basic_string_view<_CharT, _Traits>(__rhs);
4081}
4082
4083template <class _CharT, class _Traits, class _Allocator>
4084_LIBCPP_HIDE_FROM_ABI constexpr auto
4085operator<=>(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs) {
4086 return basic_string_view<_CharT, _Traits>(__lhs) <=> basic_string_view<_CharT, _Traits>(__rhs);
4087}
4088
4089#else // _LIBCPP_STD_VER > 17
4090
Howard Hinnant3b6579a2010-08-22 00:02:43 +00004091template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004092inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004093bool
4094operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004095 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004096{
4097 return !(__lhs == __rhs);
4098}
4099
4100template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004101inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004102bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004103operator!=(const _CharT* __lhs,
4104 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004105{
4106 return !(__lhs == __rhs);
4107}
4108
4109template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004110inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004111bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004112operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4113 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004114{
4115 return !(__lhs == __rhs);
4116}
4117
4118// operator<
4119
4120template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004121inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004122bool
4123operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004124 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004125{
Howard Hinnanta2660c12011-07-24 15:07:21 +00004126 return __lhs.compare(__rhs) < 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004127}
4128
4129template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004130inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004131bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004132operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4133 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004134{
Howard Hinnanta2660c12011-07-24 15:07:21 +00004135 return __lhs.compare(__rhs) < 0;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004136}
4137
4138template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004139inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004140bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004141operator< (const _CharT* __lhs,
4142 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004143{
4144 return __rhs.compare(__lhs) > 0;
4145}
4146
Howard Hinnantc51e1022010-05-11 19:42:16 +00004147// operator>
4148
4149template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004150inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004151bool
4152operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004153 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004154{
4155 return __rhs < __lhs;
4156}
4157
4158template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004159inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004160bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004161operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4162 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004163{
4164 return __rhs < __lhs;
4165}
4166
4167template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004168inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004169bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004170operator> (const _CharT* __lhs,
4171 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004172{
4173 return __rhs < __lhs;
4174}
4175
4176// operator<=
4177
4178template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004179inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004180bool
4181operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004182 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004183{
4184 return !(__rhs < __lhs);
4185}
4186
4187template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004188inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004189bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004190operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4191 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004192{
4193 return !(__rhs < __lhs);
4194}
4195
4196template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004197inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004198bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004199operator<=(const _CharT* __lhs,
4200 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004201{
4202 return !(__rhs < __lhs);
4203}
4204
4205// operator>=
4206
4207template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004208inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004209bool
4210operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004211 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004212{
4213 return !(__lhs < __rhs);
4214}
4215
4216template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004217inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004218bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004219operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4220 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004221{
4222 return !(__lhs < __rhs);
4223}
4224
4225template<class _CharT, class _Traits, class _Allocator>
Mark de Weveraf1968a2022-08-14 14:14:09 +02004226inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantc51e1022010-05-11 19:42:16 +00004227bool
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004228operator>=(const _CharT* __lhs,
4229 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00004230{
4231 return !(__lhs < __rhs);
4232}
Mark de Weverb4830e62022-07-19 07:56:23 +02004233#endif // _LIBCPP_STD_VER > 17
Howard Hinnantc51e1022010-05-11 19:42:16 +00004234
4235// operator +
4236
4237template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004238_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004239basic_string<_CharT, _Traits, _Allocator>
4240operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4241 const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4242{
Nikolas Klauser38631bf2022-02-11 19:24:31 +01004243 using _String = basic_string<_CharT, _Traits, _Allocator>;
Nikolas Klauser55dc8082022-04-09 16:19:45 +02004244 auto __lhs_sz = __lhs.size();
4245 auto __rhs_sz = __rhs.size();
4246 _String __r(__uninitialized_size_tag(),
4247 __lhs_sz + __rhs_sz,
4248 _String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
4249 auto __ptr = std::__to_address(__r.__get_pointer());
4250 _Traits::copy(__ptr, __lhs.data(), __lhs_sz);
4251 _Traits::copy(__ptr + __lhs_sz, __rhs.data(), __rhs_sz);
4252 _Traits::assign(__ptr + __lhs_sz + __rhs_sz, 1, _CharT());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004253 return __r;
4254}
4255
4256template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004257_LIBCPP_HIDDEN _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004258basic_string<_CharT, _Traits, _Allocator>
4259operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4260{
Nikolas Klauser38631bf2022-02-11 19:24:31 +01004261 using _String = basic_string<_CharT, _Traits, _Allocator>;
Nikolas Klauser55dc8082022-04-09 16:19:45 +02004262 auto __lhs_sz = _Traits::length(__lhs);
4263 auto __rhs_sz = __rhs.size();
4264 _String __r(__uninitialized_size_tag(),
4265 __lhs_sz + __rhs_sz,
4266 _String::__alloc_traits::select_on_container_copy_construction(__rhs.get_allocator()));
4267 auto __ptr = std::__to_address(__r.__get_pointer());
4268 _Traits::copy(__ptr, __lhs, __lhs_sz);
4269 _Traits::copy(__ptr + __lhs_sz, __rhs.data(), __rhs_sz);
4270 _Traits::assign(__ptr + __lhs_sz + __rhs_sz, 1, _CharT());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004271 return __r;
4272}
4273
4274template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004275_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004276basic_string<_CharT, _Traits, _Allocator>
4277operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4278{
Nikolas Klauser38631bf2022-02-11 19:24:31 +01004279 using _String = basic_string<_CharT, _Traits, _Allocator>;
Nikolas Klauser38631bf2022-02-11 19:24:31 +01004280 typename _String::size_type __rhs_sz = __rhs.size();
Nikolas Klauser55dc8082022-04-09 16:19:45 +02004281 _String __r(__uninitialized_size_tag(),
4282 __rhs_sz + 1,
4283 _String::__alloc_traits::select_on_container_copy_construction(__rhs.get_allocator()));
4284 auto __ptr = std::__to_address(__r.__get_pointer());
4285 _Traits::assign(__ptr, 1, __lhs);
4286 _Traits::copy(__ptr + 1, __rhs.data(), __rhs_sz);
4287 _Traits::assign(__ptr + 1 + __rhs_sz, 1, _CharT());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004288 return __r;
4289}
4290
4291template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004292inline _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004293basic_string<_CharT, _Traits, _Allocator>
4294operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
4295{
Nikolas Klauser38631bf2022-02-11 19:24:31 +01004296 using _String = basic_string<_CharT, _Traits, _Allocator>;
Nikolas Klauser38631bf2022-02-11 19:24:31 +01004297 typename _String::size_type __lhs_sz = __lhs.size();
4298 typename _String::size_type __rhs_sz = _Traits::length(__rhs);
Nikolas Klauser55dc8082022-04-09 16:19:45 +02004299 _String __r(__uninitialized_size_tag(),
4300 __lhs_sz + __rhs_sz,
4301 _String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
4302 auto __ptr = std::__to_address(__r.__get_pointer());
4303 _Traits::copy(__ptr, __lhs.data(), __lhs_sz);
4304 _Traits::copy(__ptr + __lhs_sz, __rhs, __rhs_sz);
4305 _Traits::assign(__ptr + __lhs_sz + __rhs_sz, 1, _CharT());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004306 return __r;
4307}
4308
4309template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004310_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004311basic_string<_CharT, _Traits, _Allocator>
4312operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
4313{
Nikolas Klauser38631bf2022-02-11 19:24:31 +01004314 using _String = basic_string<_CharT, _Traits, _Allocator>;
Nikolas Klauser38631bf2022-02-11 19:24:31 +01004315 typename _String::size_type __lhs_sz = __lhs.size();
Nikolas Klauser55dc8082022-04-09 16:19:45 +02004316 _String __r(__uninitialized_size_tag(),
4317 __lhs_sz + 1,
4318 _String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
4319 auto __ptr = std::__to_address(__r.__get_pointer());
4320 _Traits::copy(__ptr, __lhs.data(), __lhs_sz);
4321 _Traits::assign(__ptr + __lhs_sz, 1, __rhs);
4322 _Traits::assign(__ptr + 1 + __lhs_sz, 1, _CharT());
Howard Hinnantc51e1022010-05-11 19:42:16 +00004323 return __r;
4324}
4325
Eric Fiselierfc92be82017-04-19 00:28:44 +00004326#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004327
4328template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004329inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004330basic_string<_CharT, _Traits, _Allocator>
4331operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4332{
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004333 return std::move(__lhs.append(__rhs));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004334}
4335
4336template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004337inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004338basic_string<_CharT, _Traits, _Allocator>
4339operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4340{
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004341 return std::move(__rhs.insert(0, __lhs));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004342}
4343
4344template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004345inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004346basic_string<_CharT, _Traits, _Allocator>
4347operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4348{
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004349 return std::move(__lhs.append(__rhs));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004350}
4351
4352template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004353inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004354basic_string<_CharT, _Traits, _Allocator>
4355operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4356{
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004357 return std::move(__rhs.insert(0, __lhs));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004358}
4359
4360template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004361inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004362basic_string<_CharT, _Traits, _Allocator>
4363operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4364{
4365 __rhs.insert(__rhs.begin(), __lhs);
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004366 return std::move(__rhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004367}
4368
4369template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004370inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004371basic_string<_CharT, _Traits, _Allocator>
4372operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
4373{
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004374 return std::move(__lhs.append(__rhs));
Howard Hinnantc51e1022010-05-11 19:42:16 +00004375}
4376
4377template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004378inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004379basic_string<_CharT, _Traits, _Allocator>
4380operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
4381{
4382 __lhs.push_back(__rhs);
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004383 return std::move(__lhs);
Howard Hinnantc51e1022010-05-11 19:42:16 +00004384}
4385
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04004386#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00004387
4388// swap
4389
4390template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004391inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnantc51e1022010-05-11 19:42:16 +00004392void
Howard Hinnantaeb17d82011-05-29 19:57:12 +00004393swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnant3e276872011-06-03 18:40:47 +00004394 basic_string<_CharT, _Traits, _Allocator>& __rhs)
4395 _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00004396{
4397 __lhs.swap(__rhs);
4398}
4399
Bruce Mitchener170d8972020-11-24 12:53:53 -05004400_LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* __idx = nullptr, int __base = 10);
4401_LIBCPP_FUNC_VIS long stol (const string& __str, size_t* __idx = nullptr, int __base = 10);
4402_LIBCPP_FUNC_VIS unsigned long stoul (const string& __str, size_t* __idx = nullptr, int __base = 10);
4403_LIBCPP_FUNC_VIS long long stoll (const string& __str, size_t* __idx = nullptr, int __base = 10);
4404_LIBCPP_FUNC_VIS unsigned long long stoull(const string& __str, size_t* __idx = nullptr, int __base = 10);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +00004405
Bruce Mitchener170d8972020-11-24 12:53:53 -05004406_LIBCPP_FUNC_VIS float stof (const string& __str, size_t* __idx = nullptr);
4407_LIBCPP_FUNC_VIS double stod (const string& __str, size_t* __idx = nullptr);
4408_LIBCPP_FUNC_VIS long double stold(const string& __str, size_t* __idx = nullptr);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +00004409
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004410_LIBCPP_FUNC_VIS string to_string(int __val);
4411_LIBCPP_FUNC_VIS string to_string(unsigned __val);
4412_LIBCPP_FUNC_VIS string to_string(long __val);
4413_LIBCPP_FUNC_VIS string to_string(unsigned long __val);
4414_LIBCPP_FUNC_VIS string to_string(long long __val);
4415_LIBCPP_FUNC_VIS string to_string(unsigned long long __val);
4416_LIBCPP_FUNC_VIS string to_string(float __val);
4417_LIBCPP_FUNC_VIS string to_string(double __val);
4418_LIBCPP_FUNC_VIS string to_string(long double __val);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +00004419
Louis Dionne89258142021-08-23 15:32:36 -04004420#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Bruce Mitchener170d8972020-11-24 12:53:53 -05004421_LIBCPP_FUNC_VIS int stoi (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
4422_LIBCPP_FUNC_VIS long stol (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
4423_LIBCPP_FUNC_VIS unsigned long stoul (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
4424_LIBCPP_FUNC_VIS long long stoll (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
4425_LIBCPP_FUNC_VIS unsigned long long stoull(const wstring& __str, size_t* __idx = nullptr, int __base = 10);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +00004426
Bruce Mitchener170d8972020-11-24 12:53:53 -05004427_LIBCPP_FUNC_VIS float stof (const wstring& __str, size_t* __idx = nullptr);
4428_LIBCPP_FUNC_VIS double stod (const wstring& __str, size_t* __idx = nullptr);
4429_LIBCPP_FUNC_VIS long double stold(const wstring& __str, size_t* __idx = nullptr);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +00004430
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00004431_LIBCPP_FUNC_VIS wstring to_wstring(int __val);
4432_LIBCPP_FUNC_VIS wstring to_wstring(unsigned __val);
4433_LIBCPP_FUNC_VIS wstring to_wstring(long __val);
4434_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long __val);
4435_LIBCPP_FUNC_VIS wstring to_wstring(long long __val);
4436_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long long __val);
4437_LIBCPP_FUNC_VIS wstring to_wstring(float __val);
4438_LIBCPP_FUNC_VIS wstring to_wstring(double __val);
4439_LIBCPP_FUNC_VIS wstring to_wstring(long double __val);
Louis Dionne89258142021-08-23 15:32:36 -04004440#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +00004441
Howard Hinnantc51e1022010-05-11 19:42:16 +00004442template<class _CharT, class _Traits, class _Allocator>
Martin Storsjö88890c22021-02-22 01:13:13 +02004443_LIBCPP_TEMPLATE_DATA_VIS
Eric Fiselierc9fdaf12020-01-15 17:02:17 -05004444const typename basic_string<_CharT, _Traits, _Allocator>::size_type
4445 basic_string<_CharT, _Traits, _Allocator>::npos;
Howard Hinnantc51e1022010-05-11 19:42:16 +00004446
Marshall Clow851b9ec2019-05-20 21:56:51 +00004447template <class _CharT, class _Allocator>
Nikolas Klauser3ab26e32022-08-22 02:59:09 +02004448struct __string_hash : public __unary_function<basic_string<_CharT, char_traits<_CharT>, _Allocator>, size_t>
Howard Hinnantc51e1022010-05-11 19:42:16 +00004449{
4450 size_t
Marshall Clow851b9ec2019-05-20 21:56:51 +00004451 operator()(const basic_string<_CharT, char_traits<_CharT>, _Allocator>& __val) const _NOEXCEPT
Nikolas Klauser0ada9192022-08-13 22:33:12 +02004452 { return std::__do_string_hash(__val.data(), __val.data() + __val.size()); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00004453};
4454
Nikolas Klauser3ab26e32022-08-22 02:59:09 +02004455template <class _Allocator>
4456struct hash<basic_string<char, char_traits<char>, _Allocator> > : __string_hash<char, _Allocator> {};
4457
4458#ifndef _LIBCPP_HAS_NO_CHAR8_T
4459template <class _Allocator>
4460struct hash<basic_string<char8_t, char_traits<char8_t>, _Allocator> > : __string_hash<char8_t, _Allocator> {};
4461#endif
4462
4463template <class _Allocator>
4464struct hash<basic_string<char16_t, char_traits<char16_t>, _Allocator> > : __string_hash<char16_t, _Allocator> {};
4465
4466template <class _Allocator>
4467struct hash<basic_string<char32_t, char_traits<char32_t>, _Allocator> > : __string_hash<char32_t, _Allocator> {};
4468
4469#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4470template <class _Allocator>
4471struct hash<basic_string<wchar_t, char_traits<wchar_t>, _Allocator> > : __string_hash<wchar_t, _Allocator> {};
4472#endif
4473
Howard Hinnantdc095972011-07-18 15:51:59 +00004474template<class _CharT, class _Traits, class _Allocator>
Nikolas Klausera9ad6702022-08-13 13:23:16 +02004475_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
Howard Hinnantdc095972011-07-18 15:51:59 +00004476operator<<(basic_ostream<_CharT, _Traits>& __os,
4477 const basic_string<_CharT, _Traits, _Allocator>& __str);
4478
4479template<class _CharT, class _Traits, class _Allocator>
Nikolas Klausera9ad6702022-08-13 13:23:16 +02004480_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
Howard Hinnantdc095972011-07-18 15:51:59 +00004481operator>>(basic_istream<_CharT, _Traits>& __is,
4482 basic_string<_CharT, _Traits, _Allocator>& __str);
4483
4484template<class _CharT, class _Traits, class _Allocator>
Nikolas Klausera9ad6702022-08-13 13:23:16 +02004485_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
Howard Hinnantdc095972011-07-18 15:51:59 +00004486getline(basic_istream<_CharT, _Traits>& __is,
4487 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4488
4489template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004490inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantdc095972011-07-18 15:51:59 +00004491basic_istream<_CharT, _Traits>&
4492getline(basic_istream<_CharT, _Traits>& __is,
4493 basic_string<_CharT, _Traits, _Allocator>& __str);
4494
Howard Hinnantdc095972011-07-18 15:51:59 +00004495template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004496inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantdc095972011-07-18 15:51:59 +00004497basic_istream<_CharT, _Traits>&
4498getline(basic_istream<_CharT, _Traits>&& __is,
4499 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4500
4501template<class _CharT, class _Traits, class _Allocator>
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004502inline _LIBCPP_HIDE_FROM_ABI
Howard Hinnantdc095972011-07-18 15:51:59 +00004503basic_istream<_CharT, _Traits>&
4504getline(basic_istream<_CharT, _Traits>&& __is,
4505 basic_string<_CharT, _Traits, _Allocator>& __str);
4506
Marshall Clow29b53f22018-12-14 18:49:35 +00004507#if _LIBCPP_STD_VER > 17
Marek Kurdeja98b1412020-05-02 13:58:03 +02004508template <class _CharT, class _Traits, class _Allocator, class _Up>
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004509inline _LIBCPP_HIDE_FROM_ABI
Marek Kurdeja98b1412020-05-02 13:58:03 +02004510 typename basic_string<_CharT, _Traits, _Allocator>::size_type
4511 erase(basic_string<_CharT, _Traits, _Allocator>& __str, const _Up& __v) {
4512 auto __old_size = __str.size();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004513 __str.erase(std::remove(__str.begin(), __str.end(), __v), __str.end());
Marek Kurdeja98b1412020-05-02 13:58:03 +02004514 return __old_size - __str.size();
4515}
Marshall Clow29b53f22018-12-14 18:49:35 +00004516
Marek Kurdeja98b1412020-05-02 13:58:03 +02004517template <class _CharT, class _Traits, class _Allocator, class _Predicate>
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004518inline _LIBCPP_HIDE_FROM_ABI
Marek Kurdeja98b1412020-05-02 13:58:03 +02004519 typename basic_string<_CharT, _Traits, _Allocator>::size_type
4520 erase_if(basic_string<_CharT, _Traits, _Allocator>& __str,
4521 _Predicate __pred) {
4522 auto __old_size = __str.size();
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004523 __str.erase(std::remove_if(__str.begin(), __str.end(), __pred),
Marek Kurdeja98b1412020-05-02 13:58:03 +02004524 __str.end());
4525 return __old_size - __str.size();
4526}
Marshall Clow29b53f22018-12-14 18:49:35 +00004527#endif
4528
Louis Dionne510450b2022-04-01 16:38:30 -04004529#ifdef _LIBCPP_ENABLE_DEBUG_MODE
Howard Hinnant8ea98242013-08-23 17:37:05 +00004530
4531template<class _CharT, class _Traits, class _Allocator>
4532bool
4533basic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const
4534{
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004535 return data() <= std::__to_address(__i->base()) &&
4536 std::__to_address(__i->base()) < data() + size();
Howard Hinnant8ea98242013-08-23 17:37:05 +00004537}
4538
4539template<class _CharT, class _Traits, class _Allocator>
4540bool
4541basic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const
4542{
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004543 return data() < std::__to_address(__i->base()) &&
4544 std::__to_address(__i->base()) <= data() + size();
Howard Hinnant8ea98242013-08-23 17:37:05 +00004545}
4546
4547template<class _CharT, class _Traits, class _Allocator>
4548bool
4549basic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
4550{
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004551 const value_type* __p = std::__to_address(__i->base()) + __n;
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01004552 return data() <= __p && __p <= data() + size();
Howard Hinnant8ea98242013-08-23 17:37:05 +00004553}
4554
4555template<class _CharT, class _Traits, class _Allocator>
4556bool
4557basic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
4558{
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004559 const value_type* __p = std::__to_address(__i->base()) + __n;
Nikolas Klauser00ba7f82021-12-28 13:09:40 +01004560 return data() <= __p && __p < data() + size();
Howard Hinnant8ea98242013-08-23 17:37:05 +00004561}
4562
Louis Dionne510450b2022-04-01 16:38:30 -04004563#endif // _LIBCPP_ENABLE_DEBUG_MODE
Howard Hinnant8ea98242013-08-23 17:37:05 +00004564
Louis Dionne173f29e2019-05-29 16:01:36 +00004565#if _LIBCPP_STD_VER > 11
Marshall Clowcba751f2013-07-23 17:05:24 +00004566// Literal suffixes for basic_string [basic.string.literals]
Marshall Clowac868372013-10-05 21:18:32 +00004567inline namespace literals
Marshall Clowcba751f2013-07-23 17:05:24 +00004568{
4569 inline namespace string_literals
4570 {
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004571 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant5c167562013-08-07 19:39:48 +00004572 basic_string<char> operator "" s( const char *__str, size_t __len )
4573 {
4574 return basic_string<char> (__str, __len);
4575 }
Marshall Clowcba751f2013-07-23 17:05:24 +00004576
Louis Dionne89258142021-08-23 15:32:36 -04004577#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004578 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant5c167562013-08-07 19:39:48 +00004579 basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
4580 {
4581 return basic_string<wchar_t> (__str, __len);
4582 }
Louis Dionne89258142021-08-23 15:32:36 -04004583#endif
Marshall Clowcba751f2013-07-23 17:05:24 +00004584
Arthur O'Dwyerafa5d5f2021-04-18 21:47:08 -04004585#ifndef _LIBCPP_HAS_NO_CHAR8_T
Nikolas Klauser1d5108d2022-04-29 11:17:58 +02004586 inline _LIBCPP_HIDE_FROM_ABI constexpr
Nikolas Klauser5da956d2022-09-02 16:20:28 +02004587 basic_string<char8_t> operator "" s(const char8_t *__str, size_t __len)
Marshall Clow8732fed2018-12-11 04:35:44 +00004588 {
4589 return basic_string<char8_t> (__str, __len);
4590 }
4591#endif
4592
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004593 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant5c167562013-08-07 19:39:48 +00004594 basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len )
4595 {
4596 return basic_string<char16_t> (__str, __len);
4597 }
Marshall Clowcba751f2013-07-23 17:05:24 +00004598
Nikolas Klauser8b1c5062022-08-19 13:08:01 +02004599 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
Howard Hinnant5c167562013-08-07 19:39:48 +00004600 basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len )
4601 {
4602 return basic_string<char32_t> (__str, __len);
4603 }
Nikolas Klauserd26407a2021-12-02 14:12:51 +01004604 } // namespace string_literals
4605} // namespace literals
Mark de Weverdf3e0d42021-09-26 15:47:42 +02004606
4607#if _LIBCPP_STD_VER > 17
4608template <>
4609inline constexpr bool __format::__enable_insertable<std::basic_string<char>> = true;
4610#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4611template <>
4612inline constexpr bool __format::__enable_insertable<std::basic_string<wchar_t>> = true;
4613#endif
4614#endif
4615
Marshall Clowcba751f2013-07-23 17:05:24 +00004616#endif
4617
Howard Hinnantc51e1022010-05-11 19:42:16 +00004618_LIBCPP_END_NAMESPACE_STD
4619
Eric Fiselierf4433a32017-05-31 22:07:49 +00004620_LIBCPP_POP_MACROS
4621
Mark de Weveree5fe272022-09-02 17:53:28 +02004622#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
4623# include <algorithm>
Nikolas Klauser1e4ae5d2022-11-02 20:27:42 +01004624# include <concepts>
Mark de Weveree5fe272022-09-02 17:53:28 +02004625# include <functional>
4626# include <iterator>
4627# include <new>
4628# include <typeinfo>
4629# include <utility>
4630# include <vector>
4631#endif
4632
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04004633#endif // _LIBCPP_STRING