Coverage Report

Created: 2024-09-08 06:18

/src/llvm-project-16.0.6.build/include/c++/v1/string
Line
Count
Source (jump to first uncovered line)
1
// -*- C++ -*-
2
//===----------------------------------------------------------------------===//
3
//
4
// 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
7
//
8
//===----------------------------------------------------------------------===//
9
10
#ifndef _LIBCPP_STRING
11
#define _LIBCPP_STRING
12
13
/*
14
    string synopsis
15
16
#include <compare>
17
#include <initializer_list>
18
19
namespace std
20
{
21
22
template <class stateT>
23
class fpos
24
{
25
private:
26
    stateT st;
27
public:
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
41
template <class stateT> streamoff operator-(const fpos<stateT>& x, const fpos<stateT>& y);
42
43
template <class stateT> bool operator==(const fpos<stateT>& x, const fpos<stateT>& y);
44
template <class stateT> bool operator!=(const fpos<stateT>& x, const fpos<stateT>& y);
45
46
template <class charT>
47
struct char_traits
48
{
49
    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.
56
57
    static void assign(char_type& c1, const char_type& c2) noexcept;
58
    static constexpr bool eq(char_type c1, char_type c2) noexcept;
59
    static constexpr bool lt(char_type c1, char_type c2) noexcept;
60
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
68
    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;
73
};
74
75
template <> struct char_traits<char>;
76
template <> struct char_traits<wchar_t>;
77
template <> struct char_traits<char8_t>;  // C++20
78
template <> struct char_traits<char16_t>;
79
template <> struct char_traits<char32_t>;
80
81
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
82
class basic_string
83
{
84
public:
85
// types:
86
    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
102
    basic_string()
103
        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
106
    basic_string(basic_string&& str)
107
        noexcept(is_nothrow_move_constructible<allocator_type>::value);                         // constexpr since C++20
108
    basic_string(const basic_string& str, size_type pos,
109
                 const allocator_type& a = allocator_type());                                   // constexpr since C++20
110
    basic_string(const basic_string& str, size_type pos, size_type n,
111
                 const Allocator& a = Allocator());                                             // constexpr since C++20
112
    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
116
    template<class T>
117
        basic_string(const T& t, size_type pos, size_type n, const Allocator& a = Allocator()); // C++17, constexpr since C++20
118
    template <class T>
119
        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
122
    basic_string(nullptr_t) = delete; // C++2b
123
    basic_string(size_type n, value_type c, const allocator_type& a = allocator_type());        // constexpr since C++20
124
    template<class InputIterator>
125
        basic_string(InputIterator begin, InputIterator end,
126
                     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
130
131
    ~basic_string();                                                                            // constexpr since C++20
132
133
    operator basic_string_view<charT, traits>() const noexcept;                                 // constexpr since C++20
134
135
    basic_string& operator=(const basic_string& str);                                           // constexpr since C++20
136
    template <class T>
137
        basic_string& operator=(const T& t);                                                    // C++17, constexpr since C++20
138
    basic_string& operator=(basic_string&& str)
139
        noexcept(
140
             allocator_type::propagate_on_container_move_assignment::value ||
141
             allocator_type::is_always_equal::value );                                          // C++17, constexpr since C++20
142
    basic_string& operator=(const value_type* s);                                               // constexpr since C++20
143
    basic_string& operator=(nullptr_t) = delete; // C++2b
144
    basic_string& operator=(value_type c);                                                      // constexpr since C++20
145
    basic_string& operator=(initializer_list<value_type>);                                      // constexpr since C++20
146
147
    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
151
152
    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
156
157
    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
161
162
    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
166
167
    void resize(size_type n, value_type c);                                                     // constexpr since C++20
168
    void resize(size_type n);                                                                   // constexpr since C++20
169
170
    template<class Operation>
171
    constexpr void resize_and_overwrite(size_type n, Operation op); // since C++23
172
173
    void reserve(size_type res_arg);                                                            // constexpr since C++20
174
    void reserve(); // deprecated in C++20
175
    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
178
179
    const_reference operator[](size_type pos) const;                                            // constexpr since C++20
180
    reference       operator[](size_type pos);                                                  // constexpr since C++20
181
182
    const_reference at(size_type n) const;                                                      // constexpr since C++20
183
    reference       at(size_type n);                                                            // constexpr since C++20
184
185
    basic_string& operator+=(const basic_string& str);                                          // constexpr since C++20
186
    template <class T>
187
        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
191
192
    basic_string& append(const basic_string& str);                                              // constexpr since C++20
193
    template <class T>
194
        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
196
    template <class T>
197
        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
201
    template<class InputIterator>
202
        basic_string& append(InputIterator first, InputIterator last);                          // constexpr since C++20
203
    basic_string& append(initializer_list<value_type>);                                         // constexpr since C++20
204
205
    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
211
212
    basic_string& assign(const basic_string& str);                                              // constexpr since C++20
213
    template <class T>
214
        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
217
    template <class T>
218
        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
222
    template<class InputIterator>
223
        basic_string& assign(InputIterator first, InputIterator last);                          // constexpr since C++20
224
    basic_string& assign(initializer_list<value_type>);                                         // constexpr since C++20
225
226
    basic_string& insert(size_type pos1, const basic_string& str);                              // constexpr since C++20
227
    template <class T>
228
        basic_string& insert(size_type pos1, const T& t);                                       // constexpr since C++20
229
    basic_string& insert(size_type pos1, const basic_string& str,
230
                         size_type pos2, size_type n);                                          // constexpr since C++20
231
    template <class T>
232
        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
238
    template<class InputIterator>
239
        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
241
242
    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
245
246
    basic_string& replace(size_type pos1, size_type n1, const basic_string& str);               // constexpr since C++20
247
    template <class T>
248
    basic_string& replace(size_type pos1, size_type n1, const T& t);                            // C++17, constexpr since C++20
249
    basic_string& replace(size_type pos1, size_type n1, const basic_string& str,
250
                          size_type pos2, size_type n2=npos);                                   // C++14, constexpr since C++20
251
    template <class T>
252
        basic_string& replace(size_type pos1, size_type n1, const T& t,
253
                              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
258
    template <class T>
259
        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
263
    template<class InputIterator>
264
        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
266
267
    size_type copy(value_type* s, size_type n, size_type pos = 0) const;                        // constexpr since C++20
268
    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
271
    void swap(basic_string& str)
272
        noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
273
                 allocator_traits<allocator_type>::is_always_equal::value);                     // C++17, constexpr since C++20
274
275
    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
278
279
    allocator_type get_allocator() const noexcept;                                              // constexpr since C++20
280
281
    size_type find(const basic_string& str, size_type pos = 0) const noexcept;                  // constexpr since C++20
282
    template <class T>
283
        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
287
288
    size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;              // constexpr since C++20
289
    template <class T>
290
        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
294
295
    size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;         // constexpr since C++20
296
    template <class T>
297
        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
301
302
    size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept;       // constexpr since C++20
303
    template <class T>
304
        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
308
309
    size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;     // constexpr since C++20
310
    template <class T>
311
        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
315
316
    size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept;   // constexpr since C++20
317
    template <class T>
318
        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
322
323
    int compare(const basic_string& str) const noexcept;                                        // constexpr since C++20
324
    template <class T>
325
        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
327
    template <class T>
328
        int compare(size_type pos1, size_type n1, const T& t) const;                            // C++17, constexpr since C++20
329
    int compare(size_type pos1, size_type n1, const basic_string& str,
330
                size_type pos2, size_type n2=npos) const;                                       // C++14, constexpr since C++20
331
    template <class T>
332
        int compare(size_type pos1, size_type n1, const T& t,
333
                    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
337
338
    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
344
345
    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
348
};
349
350
template<class InputIterator,
351
         class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
352
basic_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
357
template<class charT, class traits, class Allocator>
358
basic_string<charT, traits, Allocator>
359
operator+(const basic_string<charT, traits, Allocator>& lhs,
360
          const basic_string<charT, traits, Allocator>& rhs);                                   // constexpr since C++20
361
362
template<class charT, class traits, class Allocator>
363
basic_string<charT, traits, Allocator>
364
operator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs);                   // constexpr since C++20
365
366
template<class charT, class traits, class Allocator>
367
basic_string<charT, traits, Allocator>
368
operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs);                          // constexpr since C++20
369
370
template<class charT, class traits, class Allocator>
371
basic_string<charT, traits, Allocator>
372
operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);                 // constexpr since C++20
373
374
template<class charT, class traits, class Allocator>
375
basic_string<charT, traits, Allocator>
376
operator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs);                        // constexpr since C++20
377
378
template<class charT, class traits, class Allocator>
379
bool operator==(const basic_string<charT, traits, Allocator>& lhs,
380
                const basic_string<charT, traits, Allocator>& rhs) noexcept;                    // constexpr since C++20
381
382
template<class charT, class traits, class Allocator>
383
bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;  // removed in C++20
384
385
template<class charT, class traits, class Allocator>
386
bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept;    // constexpr since C++20
387
388
template<class charT, class traits, class Allocator>
389
bool operator!=(const basic_string<charT,traits,Allocator>& lhs,
390
                const basic_string<charT, traits, Allocator>& rhs) noexcept;                    // removed in C++20
391
392
template<class charT, class traits, class Allocator>
393
bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;  // removed in C++20
394
395
template<class charT, class traits, class Allocator>
396
bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;  // removed in C++20
397
398
template<class charT, class traits, class Allocator>
399
bool operator< (const basic_string<charT, traits, Allocator>& lhs,
400
                const basic_string<charT, traits, Allocator>& rhs) noexcept;                    // removed in C++20
401
402
template<class charT, class traits, class Allocator>
403
bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;  // removed in C++20
404
405
template<class charT, class traits, class Allocator>
406
bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;  // removed in C++20
407
408
template<class charT, class traits, class Allocator>
409
bool operator> (const basic_string<charT, traits, Allocator>& lhs,
410
                const basic_string<charT, traits, Allocator>& rhs) noexcept;                    // removed in C++20
411
412
template<class charT, class traits, class Allocator>
413
bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;  // removed in C++20
414
415
template<class charT, class traits, class Allocator>
416
bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;  // removed in C++20
417
418
template<class charT, class traits, class Allocator>
419
bool operator<=(const basic_string<charT, traits, Allocator>& lhs,
420
                const basic_string<charT, traits, Allocator>& rhs) noexcept;                    // removed in C++20
421
422
template<class charT, class traits, class Allocator>
423
bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;  // removed in C++20
424
425
template<class charT, class traits, class Allocator>
426
bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;  // removed in C++20
427
428
template<class charT, class traits, class Allocator>
429
bool operator>=(const basic_string<charT, traits, Allocator>& lhs,
430
                const basic_string<charT, traits, Allocator>& rhs) noexcept;                    // removed in C++20
431
432
template<class charT, class traits, class Allocator>
433
bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;  // removed in C++20
434
435
template<class charT, class traits, class Allocator>
436
bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;  // removed in C++20
437
438
template<class charT, class traits, class Allocator>                                            // since C++20
439
constexpr see below operator<=>(const basic_string<charT, traits, Allocator>& lhs,
440
                                const basic_string<charT, traits, Allocator>& rhs) noexcept;
441
442
template<class charT, class traits, class Allocator>                                            // since C++20
443
constexpr see below operator<=>(const basic_string<charT, traits, Allocator>& lhs,
444
                                const charT* rhs) noexcept;
445
446
template<class charT, class traits, class Allocator>
447
void swap(basic_string<charT, traits, Allocator>& lhs,
448
          basic_string<charT, traits, Allocator>& rhs)
449
            noexcept(noexcept(lhs.swap(rhs)));                                                  // constexpr since C++20
450
451
template<class charT, class traits, class Allocator>
452
basic_istream<charT, traits>&
453
operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
454
455
template<class charT, class traits, class Allocator>
456
basic_ostream<charT, traits>&
457
operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
458
459
template<class charT, class traits, class Allocator>
460
basic_istream<charT, traits>&
461
getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str,
462
        charT delim);
463
464
template<class charT, class traits, class Allocator>
465
basic_istream<charT, traits>&
466
getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
467
468
template<class charT, class traits, class Allocator, class U>
469
typename basic_string<charT, traits, Allocator>::size_type
470
erase(basic_string<charT, traits, Allocator>& c, const U& value);    // C++20
471
template<class charT, class traits, class Allocator, class Predicate>
472
typename basic_string<charT, traits, Allocator>::size_type
473
erase_if(basic_string<charT, traits, Allocator>& c, Predicate pred); // C++20
474
475
typedef basic_string<char>    string;
476
typedef basic_string<wchar_t> wstring;
477
typedef basic_string<char8_t> u8string; // C++20
478
typedef basic_string<char16_t> u16string;
479
typedef basic_string<char32_t> u32string;
480
481
int                stoi  (const string& str, size_t* idx = nullptr, int base = 10);
482
long               stol  (const string& str, size_t* idx = nullptr, int base = 10);
483
unsigned long      stoul (const string& str, size_t* idx = nullptr, int base = 10);
484
long long          stoll (const string& str, size_t* idx = nullptr, int base = 10);
485
unsigned long long stoull(const string& str, size_t* idx = nullptr, int base = 10);
486
487
float       stof (const string& str, size_t* idx = nullptr);
488
double      stod (const string& str, size_t* idx = nullptr);
489
long double stold(const string& str, size_t* idx = nullptr);
490
491
string to_string(int val);
492
string to_string(unsigned val);
493
string to_string(long val);
494
string to_string(unsigned long val);
495
string to_string(long long val);
496
string to_string(unsigned long long val);
497
string to_string(float val);
498
string to_string(double val);
499
string to_string(long double val);
500
501
int                stoi  (const wstring& str, size_t* idx = nullptr, int base = 10);
502
long               stol  (const wstring& str, size_t* idx = nullptr, int base = 10);
503
unsigned long      stoul (const wstring& str, size_t* idx = nullptr, int base = 10);
504
long long          stoll (const wstring& str, size_t* idx = nullptr, int base = 10);
505
unsigned long long stoull(const wstring& str, size_t* idx = nullptr, int base = 10);
506
507
float       stof (const wstring& str, size_t* idx = nullptr);
508
double      stod (const wstring& str, size_t* idx = nullptr);
509
long double stold(const wstring& str, size_t* idx = nullptr);
510
511
wstring to_wstring(int val);
512
wstring to_wstring(unsigned val);
513
wstring to_wstring(long val);
514
wstring to_wstring(unsigned long val);
515
wstring to_wstring(long long val);
516
wstring to_wstring(unsigned long long val);
517
wstring to_wstring(float val);
518
wstring to_wstring(double val);
519
wstring to_wstring(long double val);
520
521
template <> struct hash<string>;
522
template <> struct hash<u8string>; // C++20
523
template <> struct hash<u16string>;
524
template <> struct hash<u32string>;
525
template <> struct hash<wstring>;
526
527
basic_string<char>     operator "" s( const char *str,     size_t len );           // C++14, constexpr since C++20
528
basic_string<wchar_t>  operator "" s( const wchar_t *str,  size_t len );           // C++14, constexpr since C++20
529
constexpr basic_string<char8_t>  operator "" s( const char8_t *str,  size_t len ); // C++20
530
basic_string<char16_t> operator "" s( const char16_t *str, size_t len );           // C++14, constexpr since C++20
531
basic_string<char32_t> operator "" s( const char32_t *str, size_t len );           // C++14, constexpr since C++20
532
533
}  // std
534
535
*/
536
537
#include <__algorithm/max.h>
538
#include <__algorithm/min.h>
539
#include <__algorithm/remove.h>
540
#include <__algorithm/remove_if.h>
541
#include <__assert> // all public C++ headers provide the assertion handler
542
#include <__config>
543
#include <__debug>
544
#include <__format/enable_insertable.h>
545
#include <__functional/hash.h>
546
#include <__functional/unary_function.h>
547
#include <__fwd/string.h>
548
#include <__ios/fpos.h>
549
#include <__iterator/distance.h>
550
#include <__iterator/iterator_traits.h>
551
#include <__iterator/reverse_iterator.h>
552
#include <__iterator/wrap_iter.h>
553
#include <__memory/allocate_at_least.h>
554
#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>
559
#include <__memory/swap_allocator.h>
560
#include <__memory_resource/polymorphic_allocator.h>
561
#include <__string/char_traits.h>
562
#include <__string/extern_template_lists.h>
563
#include <__type_traits/is_allocator.h>
564
#include <__type_traits/noexcept_move_assign_container.h>
565
#include <__utility/auto_cast.h>
566
#include <__utility/move.h>
567
#include <__utility/swap.h>
568
#include <__utility/unreachable.h>
569
#include <climits>
570
#include <cstdint>
571
#include <cstdio>  // EOF
572
#include <cstdlib>
573
#include <cstring>
574
#include <limits>
575
#include <stdexcept>
576
#include <string_view>
577
#include <type_traits>
578
#include <version>
579
580
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
581
#  include <cwchar>
582
#endif
583
584
// 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
597
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
598
#  pragma GCC system_header
599
#endif
600
601
_LIBCPP_PUSH_MACROS
602
#include <__undef_macros>
603
604
605
_LIBCPP_BEGIN_NAMESPACE_STD
606
607
// basic_string
608
609
template<class _CharT, class _Traits, class _Allocator>
610
basic_string<_CharT, _Traits, _Allocator>
611
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
612
operator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
613
          const basic_string<_CharT, _Traits, _Allocator>& __y);
614
615
template<class _CharT, class _Traits, class _Allocator>
616
_LIBCPP_HIDDEN _LIBCPP_CONSTEXPR_SINCE_CXX20
617
basic_string<_CharT, _Traits, _Allocator>
618
operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
619
620
template<class _CharT, class _Traits, class _Allocator>
621
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
622
basic_string<_CharT, _Traits, _Allocator>
623
operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
624
625
template<class _CharT, class _Traits, class _Allocator>
626
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
627
basic_string<_CharT, _Traits, _Allocator>
628
operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
629
630
template<class _CharT, class _Traits, class _Allocator>
631
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
632
basic_string<_CharT, _Traits, _Allocator>
633
operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
634
635
extern template _LIBCPP_FUNC_VIS string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&);
636
637
template <class _Iter>
638
struct __string_is_trivial_iterator : public false_type {};
639
640
template <class _Tp>
641
struct __string_is_trivial_iterator<_Tp*>
642
    : public is_arithmetic<_Tp> {};
643
644
template <class _Iter>
645
struct __string_is_trivial_iterator<__wrap_iter<_Iter> >
646
    : public __string_is_trivial_iterator<_Iter> {};
647
648
template <class _CharT, class _Traits, class _Tp>
649
struct __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
    > {};
653
654
struct __uninitialized_size_tag {};
655
656
template<class _CharT, class _Traits, class _Allocator>
657
class basic_string
658
{
659
public:
660
    typedef basic_string                                 __self;
661
    typedef basic_string_view<_CharT, _Traits>           __self_view;
662
    typedef _Traits                                      traits_type;
663
    typedef _CharT                                       value_type;
664
    typedef _Allocator                                   allocator_type;
665
    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;
668
    typedef value_type&                                  reference;
669
    typedef const value_type&                            const_reference;
670
    typedef typename __alloc_traits::pointer             pointer;
671
    typedef typename __alloc_traits::const_pointer       const_pointer;
672
673
    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),
677
                  "traits_type::char_type must be the same type as CharT");
678
    static_assert(( is_same<typename allocator_type::value_type, value_type>::value),
679
                  "Allocator::value_type must be same type as value_type");
680
681
    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
685
    // TODO: Implement iterator bounds checking without requiring the global database.
686
    typedef __wrap_iter<pointer>                         iterator;
687
    typedef __wrap_iter<const_pointer>                   const_iterator;
688
    typedef std::reverse_iterator<iterator>              reverse_iterator;
689
    typedef std::reverse_iterator<const_iterator>        const_reverse_iterator;
690
691
private:
692
    static_assert(CHAR_BIT == 8, "This implementation assumes that one byte contains 8 bits");
693
694
#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
695
696
    struct __long
697
    {
698
        pointer   __data_;
699
        size_type __size_;
700
        size_type __cap_ : sizeof(size_type) * CHAR_BIT - 1;
701
        size_type __is_long_ : 1;
702
    };
703
704
    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];
710
        unsigned char __padding_[sizeof(value_type) - 1];
711
        unsigned char __size_ : 7;
712
        unsigned char __is_long_ : 1;
713
    };
714
715
// The __endian_factor is required because the field we use to store the size
716
// has one fewer bit than it would if it were not a bitfield.
717
//
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;
730
#else
731
    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
741
742
    // 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.
746
    struct __long
747
    {
748
        struct _LIBCPP_PACKED {
749
            size_type __is_long_ : 1;
750
            size_type __cap_ : sizeof(size_type) * CHAR_BIT - 1;
751
        };
752
        size_type __size_;
753
        pointer   __data_;
754
    };
755
756
    enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
757
                      (sizeof(__long) - 1)/sizeof(value_type) : 2};
758
759
    struct __short
760
    {
761
        struct _LIBCPP_PACKED {
762
            unsigned char __is_long_ : 1;
763
            unsigned char __size_ : 7;
764
        };
765
        char __padding_[sizeof(value_type) - 1];
766
        value_type __data_[__min_cap];
767
    };
768
769
#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
770
771
    static_assert(sizeof(__short) == (sizeof(value_type) * (__min_cap + 1)), "__short has an unexpected size.");
772
773
    union __ulx{__long __lx; __short __lxx;};
774
775
    enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
776
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
794
    // 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.
797
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
798
    explicit basic_string(__uninitialized_size_tag, size_type __size, const allocator_type& __a)
799
5.95k
            : __r_(__default_init_tag(), __a) {
800
5.95k
        if (__size > max_size())
801
0
            __throw_length_error();
802
5.95k
        if (__fits_in_sso(__size)) {
803
5.57k
            __r_.first() = __rep();
804
5.57k
            __set_short_size(__size);
805
5.57k
        } else {
806
378
            auto __capacity = __recommend(__size) + 1;
807
378
            auto __allocation = __alloc_traits::allocate(__alloc(), __capacity);
808
378
            __begin_lifetime(__allocation, __capacity);
809
378
            __set_long_cap(__capacity);
810
378
            __set_long_pointer(__allocation);
811
378
            __set_long_size(__size);
812
378
        }
813
5.95k
        std::__debug_db_insert_c(this);
814
5.95k
    }
815
816
90
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator __make_iterator(pointer __p) {
817
90
        return iterator(this, __p);
818
90
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__make_iterator[abi:v160006](char*)
Line
Count
Source
816
90
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator __make_iterator(pointer __p) {
817
90
        return iterator(this, __p);
818
90
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__make_iterator[abi:v160006](wchar_t*)
819
820
0
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator __make_const_iterator(const_pointer __p) const {
821
0
        return const_iterator(this, __p);
822
0
    }
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__make_const_iterator[abi:v160006](char const*) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__make_const_iterator[abi:v160006](wchar_t const*) const
823
824
public:
825
  _LIBCPP_TEMPLATE_DATA_VIS static const size_type npos = -1;
826
827
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string()
828
      _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
829
1.36M
      : __r_(__default_init_tag(), __default_init_tag()) {
830
1.36M
    std::__debug_db_insert_c(this);
831
1.36M
    __default_init();
832
1.36M
  }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string[abi:v160006]()
Line
Count
Source
829
1.36M
      : __r_(__default_init_tag(), __default_init_tag()) {
830
1.36M
    std::__debug_db_insert_c(this);
831
1.36M
    __default_init();
832
1.36M
  }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::basic_string[abi:v160006]()
833
834
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(const allocator_type& __a)
835
#if _LIBCPP_STD_VER <= 14
836
      _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
837
#else
838
      _NOEXCEPT
839
#endif
840
1.32k
      : __r_(__default_init_tag(), __a) {
841
1.32k
    std::__debug_db_insert_c(this);
842
1.32k
    __default_init();
843
1.32k
  }
844
845
  _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);
847
848
#ifndef _LIBCPP_CXX03_LANG
849
  _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
428k
      : __r_(std::move(__str.__r_)) {
856
428k
    __str.__default_init();
857
428k
    std::__debug_db_insert_c(this);
858
428k
    if (__is_long())
859
379k
      std::__debug_db_swap(this, &__str);
860
428k
  }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string[abi:v160006](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&)
Line
Count
Source
855
428k
      : __r_(std::move(__str.__r_)) {
856
428k
    __str.__default_init();
857
428k
    std::__debug_db_insert_c(this);
858
428k
    if (__is_long())
859
379k
      std::__debug_db_swap(this, &__str);
860
428k
  }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::basic_string[abi:v160006](std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >&&)
861
862
  _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
  }
876
#endif // _LIBCPP_CXX03_LANG
877
878
  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
913k
      : __r_(__default_init_tag(), __default_init_tag()) {
881
913k
    _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
882
913k
    __init(__s, traits_type::length(__s));
883
913k
    std::__debug_db_insert_c(this);
884
913k
  }
_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2B7v160006IDnEEPKc
Line
Count
Source
880
913k
      : __r_(__default_init_tag(), __default_init_tag()) {
881
913k
    _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
882
913k
    __init(__s, traits_type::length(__s));
883
913k
    std::__debug_db_insert_c(this);
884
913k
  }
Unexecuted instantiation: _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2B7v160006IDnEEPKw
885
886
  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);
888
889
#if _LIBCPP_STD_VER > 20
890
  basic_string(nullptr_t) = delete;
891
#endif
892
893
  _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
  }
899
900
  _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
  }
907
908
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(size_type __n, _CharT __c)
909
0
      : __r_(__default_init_tag(), __default_init_tag()) {
910
0
    __init(__n, __c);
911
0
    std::__debug_db_insert_c(this);
912
0
  }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::basic_string[abi:v160006](unsigned long, wchar_t)
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string[abi:v160006](unsigned long, char)
913
914
#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
944
  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);
946
947
  _LIBCPP_CONSTEXPR_SINCE_CXX20
948
  basic_string(const basic_string& __str, size_type __pos, size_type __n, const _Allocator& __a = _Allocator());
949
950
  _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
  }
959
960
  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
901k
      : __r_(__default_init_tag(), __default_init_tag()) {
981
901k
    __init(__first, __last);
982
901k
    std::__debug_db_insert_c(this);
983
901k
  }
Unexecuted instantiation: char* std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string[abi:v160006]<char*, void>(char*)
Unexecuted instantiation: char* std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::basic_string[abi:v160006]<char*, void>(char*)
char const* std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string[abi:v160006]<char const*, void>(char const*)
Line
Count
Source
980
901k
      : __r_(__default_init_tag(), __default_init_tag()) {
981
901k
    __init(__first, __last);
982
901k
    std::__debug_db_insert_c(this);
983
901k
  }
Unexecuted instantiation: wchar_t const* std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::basic_string[abi:v160006]<wchar_t const*, void>(wchar_t const*)
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
2.88k
      : __r_(__default_init_tag(), __a) {
989
2.88k
    __init(__first, __last);
990
2.88k
    std::__debug_db_insert_c(this);
991
2.88k
  }
char* std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string[abi:v160006]<char*, void>(char*, std::__1::allocator<char> const&)
Line
Count
Source
988
2.88k
      : __r_(__default_init_tag(), __a) {
989
2.88k
    __init(__first, __last);
990
2.88k
    std::__debug_db_insert_c(this);
991
2.88k
  }
Unexecuted instantiation: wchar_t* std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::basic_string[abi:v160006]<wchar_t*, void>(wchar_t*, std::__1::allocator<wchar_t> const&)
992
993
#ifndef _LIBCPP_CXX03_LANG
994
  _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
  }
1005
#endif // _LIBCPP_CXX03_LANG
1006
1007
    inline _LIBCPP_CONSTEXPR_SINCE_CXX20 ~basic_string();
1008
1009
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1010
1.23M
    operator __self_view() const _NOEXCEPT { return __self_view(data(), size()); }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator std::__1::basic_string_view<char, std::__1::char_traits<char> >[abi:v160006]() const
Line
Count
Source
1010
1.23M
    operator __self_view() const _NOEXCEPT { return __self_view(data(), size()); }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::operator std::__1::basic_string_view<wchar_t, std::__1::char_traits<wchar_t> >[abi:v160006]() const
1011
1012
    _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator=(const basic_string& __str);
1013
1014
    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> >
1016
    _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator=(const _Tp& __t) {
1017
      __self_view __sv = __t;
1018
      return assign(__sv);
1019
    }
1020
1021
#ifndef _LIBCPP_CXX03_LANG
1022
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator=(basic_string&& __str)
1023
455k
      _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)) {
1024
455k
    __move_assign(__str, integral_constant<bool, __alloc_traits::propagate_on_container_move_assignment::value>());
1025
455k
    return *this;
1026
455k
  }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=[abi:v160006](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&&)
Line
Count
Source
1023
455k
      _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)) {
1024
455k
    __move_assign(__str, integral_constant<bool, __alloc_traits::propagate_on_container_move_assignment::value>());
1025
455k
    return *this;
1026
455k
  }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::operator=[abi:v160006](std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >&&)
1027
1028
     _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1029
    basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
1030
#endif
1031
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1032
890
    basic_string& operator=(const value_type* __s) {return assign(__s);}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=[abi:v160006](char const*)
Line
Count
Source
1032
890
    basic_string& operator=(const value_type* __s) {return assign(__s);}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::operator=[abi:v160006](wchar_t const*)
1033
#if _LIBCPP_STD_VER > 20
1034
    basic_string& operator=(nullptr_t) = delete;
1035
#endif
1036
    _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator=(value_type __c);
1037
1038
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1039
    iterator begin() _NOEXCEPT
1040
45
        {return __make_iterator(__get_pointer());}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::begin[abi:v160006]()
Line
Count
Source
1040
45
        {return __make_iterator(__get_pointer());}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::begin[abi:v160006]()
1041
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1042
    const_iterator begin() const _NOEXCEPT
1043
0
        {return __make_const_iterator(__get_pointer());}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::begin[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::begin[abi:v160006]() const
1044
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1045
    iterator end() _NOEXCEPT
1046
45
        {return __make_iterator(__get_pointer() + size());}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::end[abi:v160006]()
Line
Count
Source
1046
45
        {return __make_iterator(__get_pointer() + size());}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::end[abi:v160006]()
1047
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1048
    const_iterator end() const _NOEXCEPT
1049
0
        {return __make_const_iterator(__get_pointer() + size());}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::end[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::end[abi:v160006]() const
1050
1051
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1052
    reverse_iterator rbegin() _NOEXCEPT
1053
        {return reverse_iterator(end());}
1054
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1055
    const_reverse_iterator rbegin() const _NOEXCEPT
1056
        {return const_reverse_iterator(end());}
1057
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1058
    reverse_iterator rend() _NOEXCEPT
1059
        {return reverse_iterator(begin());}
1060
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1061
    const_reverse_iterator rend() const _NOEXCEPT
1062
        {return const_reverse_iterator(begin());}
1063
1064
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1065
    const_iterator cbegin() const _NOEXCEPT
1066
        {return begin();}
1067
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1068
    const_iterator cend() const _NOEXCEPT
1069
        {return end();}
1070
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1071
    const_reverse_iterator crbegin() const _NOEXCEPT
1072
        {return rbegin();}
1073
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1074
    const_reverse_iterator crend() const _NOEXCEPT
1075
        {return rend();}
1076
1077
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type size() const _NOEXCEPT
1078
11.3M
        {return __is_long() ? __get_long_size() : __get_short_size();}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::size[abi:v160006]() const
Line
Count
Source
1078
11.3M
        {return __is_long() ? __get_long_size() : __get_short_size();}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::size[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::size[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::size[abi:v160006]() const
1079
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type length() const _NOEXCEPT {return size();}
1080
1081
2.13M
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type max_size() const _NOEXCEPT {
1082
2.13M
    size_type __m = __alloc_traits::max_size(__alloc());
1083
2.13M
    if (__m <= std::numeric_limits<size_type>::max() / 2) {
1084
0
      return __m - __alignment;
1085
2.13M
    } else {
1086
2.13M
    bool __uses_lsb = __endian_factor == 2;
1087
18.4E
      return __uses_lsb ? __m - __alignment : (__m / 2) - __alignment;
1088
2.13M
    }
1089
2.13M
  }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::max_size[abi:v160006]() const
Line
Count
Source
1081
2.13M
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type max_size() const _NOEXCEPT {
1082
2.13M
    size_type __m = __alloc_traits::max_size(__alloc());
1083
2.13M
    if (__m <= std::numeric_limits<size_type>::max() / 2) {
1084
0
      return __m - __alignment;
1085
2.13M
    } else {
1086
2.13M
    bool __uses_lsb = __endian_factor == 2;
1087
18.4E
      return __uses_lsb ? __m - __alignment : (__m / 2) - __alignment;
1088
2.13M
    }
1089
2.13M
  }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::max_size[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::max_size[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::max_size[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::max_size[abi:v160006]() const
1090
1091
30.9k
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type capacity() const _NOEXCEPT {
1092
30.9k
        return (__is_long() ? __get_long_cap() : static_cast<size_type>(__min_cap)) - 1;
1093
30.9k
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::capacity[abi:v160006]() const
Line
Count
Source
1091
30.9k
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type capacity() const _NOEXCEPT {
1092
30.9k
        return (__is_long() ? __get_long_cap() : static_cast<size_type>(__min_cap)) - 1;
1093
30.9k
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::capacity[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::capacity[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::capacity[abi:v160006]() const
1094
1095
    _LIBCPP_CONSTEXPR_SINCE_CXX20 void resize(size_type __n, value_type __c);
1096
9.81k
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void resize(size_type __n) { resize(__n, value_type()); }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::resize[abi:v160006](unsigned long)
Line
Count
Source
1096
9.81k
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void resize(size_type __n) { resize(__n, value_type()); }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::resize[abi:v160006](unsigned long)
1097
1098
    _LIBCPP_CONSTEXPR_SINCE_CXX20 void reserve(size_type __requested_capacity);
1099
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);
1105
      __erase_to_end(std::move(__op)(data(), _LIBCPP_AUTO_CAST(__n)));
1106
    }
1107
#endif
1108
1109
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __resize_default_init(size_type __n);
1110
1111
    _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_HIDE_FROM_ABI void reserve() _NOEXCEPT { shrink_to_fit(); }
1112
    _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;
1114
1115
    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1116
3.74k
    bool empty() const _NOEXCEPT {return size() == 0;}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::empty[abi:v160006]() const
Line
Count
Source
1116
3.74k
    bool empty() const _NOEXCEPT {return size() == 0;}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::empty[abi:v160006]() const
1117
1118
426k
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference operator[](size_type __pos) const _NOEXCEPT {
1119
426k
    _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
1120
426k
    return *(data() + __pos);
1121
426k
  }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator[][abi:v160006](unsigned long) const
Line
Count
Source
1118
426k
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference operator[](size_type __pos) const _NOEXCEPT {
1119
426k
    _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
1120
426k
    return *(data() + __pos);
1121
426k
  }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::operator[][abi:v160006](unsigned long) const
1122
1123
4.54k
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator[](size_type __pos) _NOEXCEPT {
1124
4.54k
    _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
1125
4.54k
    return *(__get_pointer() + __pos);
1126
4.54k
  }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator[][abi:v160006](unsigned long)
Line
Count
Source
1123
4.54k
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator[](size_type __pos) _NOEXCEPT {
1124
4.54k
    _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
1125
4.54k
    return *(__get_pointer() + __pos);
1126
4.54k
  }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::operator[][abi:v160006](unsigned long)
1127
1128
    _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference at(size_type __n) const;
1129
    _LIBCPP_CONSTEXPR_SINCE_CXX20 reference       at(size_type __n);
1130
1131
388
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator+=(const basic_string& __str) {
1132
388
        return append(__str);
1133
388
    }
1134
1135
    template <class _Tp>
1136
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1137
    __enable_if_t
1138
        <
1139
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
1140
            && !__is_same_uncvref<_Tp, basic_string >::value,
1141
            basic_string&
1142
        >
1143
0
    operator+=(const _Tp& __t) {
1144
0
        __self_view __sv = __t; return append(__sv);
1145
0
    }
1146
1147
388
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator+=(const value_type* __s) {
1148
388
        return append(__s);
1149
388
    }
1150
1151
0
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& operator+=(value_type __c) {
1152
0
        push_back(__c);
1153
0
        return *this;
1154
0
    }
1155
1156
#ifndef _LIBCPP_CXX03_LANG
1157
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1158
    basic_string& operator+=(initializer_list<value_type> __il) { return append(__il); }
1159
#endif // _LIBCPP_CXX03_LANG
1160
1161
6.34k
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append(const basic_string& __str) {
1162
6.34k
        return append(__str.data(), __str.size());
1163
6.34k
  }
1164
1165
    template <class _Tp>
1166
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1167
    __enable_if_t<
1168
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
1169
            && !__is_same_uncvref<_Tp, basic_string>::value,
1170
            basic_string&
1171
        >
1172
0
                  append(const _Tp& __t) { __self_view __sv = __t; return append(__sv.data(), __sv.size()); }
1173
    _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
1174
1175
    template <class _Tp>
1176
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1177
    __enable_if_t
1178
        <
1179
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
1180
            && !__is_same_uncvref<_Tp, basic_string>::value,
1181
            basic_string&
1182
        >
1183
                  append(const _Tp& __t, size_type __pos, size_type __n=npos);
1184
    _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);
1187
1188
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1189
    void __append_default_init(size_type __n);
1190
1191
    template<class _InputIterator>
1192
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
1193
    __enable_if_t
1194
        <
1195
            __is_exactly_cpp17_input_iterator<_InputIterator>::value,
1196
            basic_string&
1197
        >
1198
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1199
    append(_InputIterator __first, _InputIterator __last) {
1200
      const basic_string __temp(__first, __last, __alloc());
1201
      append(__temp.data(), __temp.size());
1202
      return *this;
1203
    }
1204
    template<class _ForwardIterator>
1205
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
1206
    __enable_if_t
1207
        <
1208
            __is_cpp17_forward_iterator<_ForwardIterator>::value,
1209
            basic_string&
1210
        >
1211
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1212
    append(_ForwardIterator __first, _ForwardIterator __last);
1213
1214
#ifndef _LIBCPP_CXX03_LANG
1215
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1216
    basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
1217
#endif // _LIBCPP_CXX03_LANG
1218
1219
    _LIBCPP_CONSTEXPR_SINCE_CXX20 void push_back(value_type __c);
1220
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void pop_back();
1221
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
0
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference back() _NOEXCEPT {
1233
0
    _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
1234
0
    return *(__get_pointer() + size() - 1);
1235
0
  }
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::back[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::back[abi:v160006]()
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
  }
1241
1242
    template <class _Tp>
1243
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1244
    __enable_if_t
1245
        <
1246
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1247
            basic_string&
1248
        >
1249
                 assign(const _Tp & __t) { __self_view __sv = __t; return assign(__sv.data(), __sv.size()); }
1250
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1251
    basic_string& assign(const basic_string& __str) { return *this = __str; }
1252
#ifndef _LIBCPP_CXX03_LANG
1253
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1254
    basic_string& assign(basic_string&& __str)
1255
        _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
1256
        {*this = std::move(__str); return *this;}
1257
#endif
1258
    _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos);
1259
    template <class _Tp>
1260
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1261
    __enable_if_t
1262
        <
1263
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
1264
            && !__is_same_uncvref<_Tp, basic_string>::value,
1265
            basic_string&
1266
        >
1267
                  assign(const _Tp & __t, size_type __pos, size_type __n=npos);
1268
    _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);
1271
    template<class _InputIterator>
1272
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1273
    __enable_if_t
1274
        <
1275
            __is_exactly_cpp17_input_iterator<_InputIterator>::value,
1276
            basic_string&
1277
        >
1278
        assign(_InputIterator __first, _InputIterator __last);
1279
    template<class _ForwardIterator>
1280
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1281
    __enable_if_t
1282
        <
1283
            __is_cpp17_forward_iterator<_ForwardIterator>::value,
1284
            basic_string&
1285
        >
1286
        assign(_ForwardIterator __first, _ForwardIterator __last);
1287
#ifndef _LIBCPP_CXX03_LANG
1288
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1289
    basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
1290
#endif // _LIBCPP_CXX03_LANG
1291
1292
  _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
  }
1296
1297
    template <class _Tp>
1298
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1299
    __enable_if_t
1300
        <
1301
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1302
            basic_string&
1303
        >
1304
                 insert(size_type __pos1, const _Tp& __t)
1305
    { __self_view __sv = __t; return insert(__pos1, __sv.data(), __sv.size()); }
1306
1307
    template <class _Tp>
1308
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1309
    __enable_if_t
1310
        <
1311
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string>::value,
1312
            basic_string&
1313
        >
1314
                  insert(size_type __pos1, const _Tp& __t, size_type __pos2, size_type __n=npos);
1315
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1316
    basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos);
1317
    _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);
1321
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
1331
    template<class _InputIterator>
1332
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1333
    __enable_if_t
1334
        <
1335
            __is_exactly_cpp17_input_iterator<_InputIterator>::value,
1336
            iterator
1337
        >
1338
        insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
1339
    template<class _ForwardIterator>
1340
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1341
    __enable_if_t
1342
        <
1343
            __is_cpp17_forward_iterator<_ForwardIterator>::value,
1344
            iterator
1345
        >
1346
        insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
1347
#ifndef _LIBCPP_CXX03_LANG
1348
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1349
    iterator insert(const_iterator __pos, initializer_list<value_type> __il)
1350
                    {return insert(__pos, __il.begin(), __il.end());}
1351
#endif // _LIBCPP_CXX03_LANG
1352
1353
    _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& erase(size_type __pos = 0, size_type __n = npos);
1354
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1355
    iterator      erase(const_iterator __pos);
1356
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1357
    iterator      erase(const_iterator __first, const_iterator __last);
1358
1359
  _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
  }
1363
1364
    template <class _Tp>
1365
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1366
    __enable_if_t
1367
        <
1368
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1369
            basic_string&
1370
        >
1371
                  replace(size_type __pos1, size_type __n1, const _Tp& __t) { __self_view __sv = __t; return replace(__pos1, __n1, __sv.data(), __sv.size()); }
1372
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1373
    basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos);
1374
    template <class _Tp>
1375
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1376
    __enable_if_t
1377
        <
1378
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value  && !__is_same_uncvref<_Tp, basic_string>::value,
1379
            basic_string&
1380
        >
1381
                  replace(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos);
1382
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1383
    basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
1384
    _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);
1386
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
  }
1392
1393
    template <class _Tp>
1394
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1395
    __enable_if_t
1396
        <
1397
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1398
            basic_string&
1399
        >
1400
                  replace(const_iterator __i1, const_iterator __i2, const _Tp& __t) { __self_view __sv = __t; return replace(__i1 - begin(), __i2 - __i1, __sv); }
1401
1402
  _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
1417
    template<class _InputIterator>
1418
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1419
    __enable_if_t
1420
        <
1421
            __is_cpp17_input_iterator<_InputIterator>::value,
1422
            basic_string&
1423
        >
1424
        replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
1425
#ifndef _LIBCPP_CXX03_LANG
1426
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1427
    basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
1428
        {return replace(__i1, __i2, __il.begin(), __il.end());}
1429
#endif // _LIBCPP_CXX03_LANG
1430
1431
    _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
1432
1433
#if _LIBCPP_STD_VER <= 20
1434
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1435
    basic_string substr(size_type __pos = 0, size_type __n = npos) const {
1436
      return basic_string(*this, __pos, __n);
1437
    }
1438
#else
1439
    _LIBCPP_HIDE_FROM_ABI constexpr
1440
    basic_string substr(size_type __pos = 0, size_type __n = npos) const& {
1441
      return basic_string(*this, __pos, __n);
1442
    }
1443
1444
    _LIBCPP_HIDE_FROM_ABI constexpr
1445
    basic_string substr(size_type __pos = 0, size_type __n = npos) && {
1446
      return basic_string(std::move(*this), __pos, __n);
1447
    }
1448
#endif
1449
1450
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1451
    void swap(basic_string& __str)
1452
#if _LIBCPP_STD_VER >= 14
1453
        _NOEXCEPT;
1454
#else
1455
        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1456
                    __is_nothrow_swappable<allocator_type>::value);
1457
#endif
1458
1459
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1460
38.9k
    const value_type* c_str() const _NOEXCEPT {return data();}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str[abi:v160006]() const
Line
Count
Source
1460
38.9k
    const value_type* c_str() const _NOEXCEPT {return data();}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::c_str[abi:v160006]() const
1461
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1462
1.72M
    const value_type* data() const _NOEXCEPT  {return std::__to_address(__get_pointer());}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::data[abi:v160006]() const
Line
Count
Source
1462
1.72M
    const value_type* data() const _NOEXCEPT  {return std::__to_address(__get_pointer());}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::data[abi:v160006]() const
1463
#if _LIBCPP_STD_VER > 14 || defined(_LIBCPP_BUILDING_LIBRARY)
1464
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1465
7.51k
    value_type* data()             _NOEXCEPT  {return std::__to_address(__get_pointer());}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::data[abi:v160006]()
Line
Count
Source
1465
7.51k
    value_type* data()             _NOEXCEPT  {return std::__to_address(__get_pointer());}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::data[abi:v160006]()
1466
#endif
1467
1468
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1469
10.1k
    allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
1470
1471
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1472
    size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
1473
1474
    template <class _Tp>
1475
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1476
    __enable_if_t
1477
        <
1478
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1479
            size_type
1480
        >
1481
              find(const _Tp& __t, size_type __pos = 0) const _NOEXCEPT;
1482
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1483
    size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1484
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1485
    size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
1486
    _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1487
1488
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1489
    size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
1490
1491
    template <class _Tp>
1492
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1493
    __enable_if_t
1494
        <
1495
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1496
            size_type
1497
        >
1498
              rfind(const _Tp& __t, size_type __pos = npos) const _NOEXCEPT;
1499
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1500
    size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1501
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1502
    size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
1503
    _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1504
1505
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1506
    size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
1507
1508
    template <class _Tp>
1509
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1510
    __enable_if_t
1511
        <
1512
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1513
            size_type
1514
        >
1515
              find_first_of(const _Tp& __t, size_type __pos = 0) const _NOEXCEPT;
1516
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1517
    size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1518
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1519
    size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
1520
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1521
    size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1522
1523
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1524
    size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
1525
1526
    template <class _Tp>
1527
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1528
    __enable_if_t
1529
        <
1530
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1531
            size_type
1532
        >
1533
              find_last_of(const _Tp& __t, size_type __pos = npos) const _NOEXCEPT;
1534
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1535
    size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1536
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1537
    size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
1538
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1539
    size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1540
1541
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1542
    size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
1543
1544
    template <class _Tp>
1545
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1546
    __enable_if_t
1547
        <
1548
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1549
            size_type
1550
        >
1551
              find_first_not_of(const _Tp &__t, size_type __pos = 0) const _NOEXCEPT;
1552
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1553
    size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1554
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1555
    size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
1556
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1557
    size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1558
1559
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1560
    size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
1561
1562
    template <class _Tp>
1563
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1564
    __enable_if_t
1565
        <
1566
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1567
            size_type
1568
        >
1569
              find_last_not_of(const _Tp& __t, size_type __pos = npos) const _NOEXCEPT;
1570
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1571
    size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
1572
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1573
    size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
1574
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1575
    size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1576
1577
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1578
    int compare(const basic_string& __str) const _NOEXCEPT;
1579
1580
    template <class _Tp>
1581
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1582
    __enable_if_t
1583
        <
1584
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1585
            int
1586
        >
1587
        compare(const _Tp &__t) const _NOEXCEPT;
1588
1589
    template <class _Tp>
1590
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS _LIBCPP_CONSTEXPR_SINCE_CXX20
1591
    __enable_if_t
1592
        <
1593
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
1594
            int
1595
        >
1596
         compare(size_type __pos1, size_type __n1, const _Tp& __t) const;
1597
1598
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1599
    int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
1600
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1601
    int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2,
1602
                size_type __n2 = npos) const;
1603
1604
    template <class _Tp>
1605
    inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1606
        __enable_if_t
1607
        <
1608
            __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value  && !__is_same_uncvref<_Tp, basic_string>::value,
1609
            int
1610
        >
1611
        compare(size_type __pos1, size_type __n1, const _Tp& __t, size_type __pos2, size_type __n2=npos) const;
1612
    _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
1615
    int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
1616
1617
#if _LIBCPP_STD_VER > 17
1618
    constexpr _LIBCPP_HIDE_FROM_ABI
1619
    bool starts_with(__self_view __sv) const noexcept
1620
    { return __self_view(data(), size()).starts_with(__sv); }
1621
1622
    constexpr _LIBCPP_HIDE_FROM_ABI
1623
    bool starts_with(value_type __c) const noexcept
1624
    { return !empty() && _Traits::eq(front(), __c); }
1625
1626
    constexpr _LIBCPP_HIDE_FROM_ABI
1627
    bool starts_with(const value_type* __s) const noexcept
1628
    { return starts_with(__self_view(__s)); }
1629
1630
    constexpr _LIBCPP_HIDE_FROM_ABI
1631
    bool ends_with(__self_view __sv) const noexcept
1632
    { return __self_view(data(), size()).ends_with( __sv); }
1633
1634
    constexpr _LIBCPP_HIDE_FROM_ABI
1635
    bool ends_with(value_type __c) const noexcept
1636
    { return !empty() && _Traits::eq(back(), __c); }
1637
1638
    constexpr _LIBCPP_HIDE_FROM_ABI
1639
    bool ends_with(const value_type* __s) const noexcept
1640
    { return ends_with(__self_view(__s)); }
1641
#endif
1642
1643
#if _LIBCPP_STD_VER > 20
1644
    constexpr _LIBCPP_HIDE_FROM_ABI
1645
    bool contains(__self_view __sv) const noexcept
1646
    { return __self_view(data(), size()).contains(__sv); }
1647
1648
    constexpr _LIBCPP_HIDE_FROM_ABI
1649
    bool contains(value_type __c) const noexcept
1650
    { return __self_view(data(), size()).contains(__c); }
1651
1652
    constexpr _LIBCPP_HIDE_FROM_ABI
1653
    bool contains(const value_type* __s) const
1654
    { return __self_view(data(), size()).contains(__s); }
1655
#endif
1656
1657
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __invariants() const;
1658
1659
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __clear_and_shrink() _NOEXCEPT;
1660
1661
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
1662
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
1668
#endif // _LIBCPP_ENABLE_DEBUG_MODE
1669
1670
private:
1671
    template<class _Alloc>
1672
    inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1673
    bool friend operator==(const basic_string<char, char_traits<char>, _Alloc>& __lhs,
1674
                           const basic_string<char, char_traits<char>, _Alloc>& __rhs) _NOEXCEPT;
1675
1676
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __shrink_or_extend(size_type __target_capacity);
1677
1678
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1679
18.3M
    bool __is_long() const _NOEXCEPT {
1680
18.3M
        if (__libcpp_is_constant_evaluated())
1681
0
            return true;
1682
18.3M
        return __r_.first().__s.__is_long_;
1683
18.3M
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__is_long[abi:v160006]() const
Line
Count
Source
1679
18.3M
    bool __is_long() const _NOEXCEPT {
1680
18.3M
        if (__libcpp_is_constant_evaluated())
1681
0
            return true;
1682
18.3M
        return __r_.first().__s.__is_long_;
1683
18.3M
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__is_long[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__is_long[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__is_long[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__is_long[abi:v160006]() const
1684
1685
785k
    static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __begin_lifetime(pointer __begin, size_type __n) {
1686
785k
#if _LIBCPP_STD_VER > 17
1687
785k
        if (__libcpp_is_constant_evaluated()) {
1688
0
            for (size_type __i = 0; __i != __n; ++__i)
1689
0
                std::construct_at(std::addressof(__begin[__i]));
1690
0
        }
1691
#else
1692
        (void)__begin;
1693
        (void)__n;
1694
#endif // _LIBCPP_STD_VER > 17
1695
785k
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__begin_lifetime[abi:v160006](char*, unsigned long)
Line
Count
Source
1685
785k
    static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __begin_lifetime(pointer __begin, size_type __n) {
1686
785k
#if _LIBCPP_STD_VER > 17
1687
785k
        if (__libcpp_is_constant_evaluated()) {
1688
0
            for (size_type __i = 0; __i != __n; ++__i)
1689
0
                std::construct_at(std::addressof(__begin[__i]));
1690
0
        }
1691
#else
1692
        (void)__begin;
1693
        (void)__n;
1694
#endif // _LIBCPP_STD_VER > 17
1695
785k
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__begin_lifetime[abi:v160006](wchar_t*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__begin_lifetime[abi:v160006](char8_t*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__begin_lifetime[abi:v160006](char16_t*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__begin_lifetime[abi:v160006](char32_t*, unsigned long)
1696
1697
1.79M
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __default_init() {
1698
1.79M
        __r_.first() = __rep();
1699
1.79M
        if (__libcpp_is_constant_evaluated()) {
1700
0
            size_type __sz = __recommend(0) + 1;
1701
0
            pointer __ptr = __alloc_traits::allocate(__alloc(), __sz);
1702
0
            __begin_lifetime(__ptr, __sz);
1703
0
            __set_long_pointer(__ptr);
1704
0
            __set_long_cap(__sz);
1705
0
            __set_long_size(0);
1706
0
        }
1707
1.79M
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__default_init[abi:v160006]()
Line
Count
Source
1697
1.79M
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __default_init() {
1698
1.79M
        __r_.first() = __rep();
1699
1.79M
        if (__libcpp_is_constant_evaluated()) {
1700
0
            size_type __sz = __recommend(0) + 1;
1701
0
            pointer __ptr = __alloc_traits::allocate(__alloc(), __sz);
1702
0
            __begin_lifetime(__ptr, __sz);
1703
0
            __set_long_pointer(__ptr);
1704
0
            __set_long_cap(__sz);
1705
0
            __set_long_size(0);
1706
0
        }
1707
1.79M
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__default_init[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__default_init[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__default_init[abi:v160006]()
1708
1709
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __deallocate_constexpr() {
1710
        if (__libcpp_is_constant_evaluated() && __get_pointer() != nullptr)
1711
            __alloc_traits::deallocate(__alloc(), __get_pointer(), __get_long_cap());
1712
    }
1713
1714
2.12M
    _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
2.12M
        return !__libcpp_is_constant_evaluated() && (__sz < __min_cap);
1717
2.12M
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__fits_in_sso[abi:v160006](unsigned long)
Line
Count
Source
1714
2.12M
    _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
2.12M
        return !__libcpp_is_constant_evaluated() && (__sz < __min_cap);
1717
2.12M
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__fits_in_sso[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__fits_in_sso[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__fits_in_sso[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__fits_in_sso[abi:v160006](unsigned long)
1718
1719
    template <class _ForwardIterator>
1720
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
1721
    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
1746
2.48M
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 allocator_type& __alloc() _NOEXCEPT { return __r_.second(); }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__alloc[abi:v160006]()
Line
Count
Source
1746
2.48M
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 allocator_type& __alloc() _NOEXCEPT { return __r_.second(); }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__alloc[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__alloc[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__alloc[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__alloc[abi:v160006]()
1747
2.44M
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const allocator_type& __alloc() const _NOEXCEPT { return __r_.second(); }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__alloc[abi:v160006]() const
Line
Count
Source
1747
2.44M
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const allocator_type& __alloc() const _NOEXCEPT { return __r_.second(); }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__alloc[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__alloc[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__alloc[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__alloc[abi:v160006]() const
1748
1749
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1750
1.82M
    void __set_short_size(size_type __s) _NOEXCEPT {
1751
1.82M
        _LIBCPP_ASSERT(__s < __min_cap, "__s should never be greater than or equal to the short string capacity");
1752
1.82M
        __r_.first().__s.__size_ = __s;
1753
1.82M
        __r_.first().__s.__is_long_ = false;
1754
1.82M
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__set_short_size[abi:v160006](unsigned long)
Line
Count
Source
1750
1.82M
    void __set_short_size(size_type __s) _NOEXCEPT {
1751
1.82M
        _LIBCPP_ASSERT(__s < __min_cap, "__s should never be greater than or equal to the short string capacity");
1752
1.82M
        __r_.first().__s.__size_ = __s;
1753
1.82M
        __r_.first().__s.__is_long_ = false;
1754
1.82M
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__set_short_size[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__set_short_size[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__set_short_size[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__set_short_size[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__set_short_size[abi:v160006](unsigned long)
1755
1756
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1757
6.17M
    size_type __get_short_size() const _NOEXCEPT {
1758
6.17M
        _LIBCPP_ASSERT(!__r_.first().__s.__is_long_, "String has to be short when trying to get the short size");
1759
6.17M
        return __r_.first().__s.__size_;
1760
6.17M
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_short_size[abi:v160006]() const
Line
Count
Source
1757
6.17M
    size_type __get_short_size() const _NOEXCEPT {
1758
6.17M
        _LIBCPP_ASSERT(!__r_.first().__s.__is_long_, "String has to be short when trying to get the short size");
1759
6.17M
        return __r_.first().__s.__size_;
1760
6.17M
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__get_short_size[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__get_short_size[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__get_short_size[abi:v160006]() const
1761
1762
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1763
    void __set_long_size(size_type __s) _NOEXCEPT
1764
788k
        {__r_.first().__l.__size_ = __s;}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__set_long_size[abi:v160006](unsigned long)
Line
Count
Source
1764
788k
        {__r_.first().__l.__size_ = __s;}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__set_long_size[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__set_long_size[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__set_long_size[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__set_long_size[abi:v160006](unsigned long)
1765
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1766
    size_type __get_long_size() const _NOEXCEPT
1767
5.48M
        {return __r_.first().__l.__size_;}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_long_size[abi:v160006]() const
Line
Count
Source
1767
5.48M
        {return __r_.first().__l.__size_;}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__get_long_size[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__get_long_size[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__get_long_size[abi:v160006]() const
1768
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1769
    void __set_size(size_type __s) _NOEXCEPT
1770
17.0k
        {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__set_size[abi:v160006](unsigned long)
Line
Count
Source
1770
17.0k
        {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__set_size[abi:v160006](unsigned long)
1771
1772
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1773
786k
    void __set_long_cap(size_type __s) _NOEXCEPT {
1774
786k
        __r_.first().__l.__cap_ = __s / __endian_factor;
1775
786k
        __r_.first().__l.__is_long_ = true;
1776
786k
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__set_long_cap[abi:v160006](unsigned long)
Line
Count
Source
1773
786k
    void __set_long_cap(size_type __s) _NOEXCEPT {
1774
786k
        __r_.first().__l.__cap_ = __s / __endian_factor;
1775
786k
        __r_.first().__l.__is_long_ = true;
1776
786k
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__set_long_cap[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__set_long_cap[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__set_long_cap[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__set_long_cap[abi:v160006](unsigned long)
1777
1778
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1779
796k
    size_type __get_long_cap() const _NOEXCEPT {
1780
796k
        return __r_.first().__l.__cap_ * __endian_factor;
1781
796k
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_long_cap[abi:v160006]() const
Line
Count
Source
1779
796k
    size_type __get_long_cap() const _NOEXCEPT {
1780
796k
        return __r_.first().__l.__cap_ * __endian_factor;
1781
796k
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__get_long_cap[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__get_long_cap[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__get_long_cap[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__get_long_cap[abi:v160006]() const
1782
1783
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1784
    void __set_long_pointer(pointer __p) _NOEXCEPT
1785
785k
        {__r_.first().__l.__data_ = __p;}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__set_long_pointer[abi:v160006](char*)
Line
Count
Source
1785
785k
        {__r_.first().__l.__data_ = __p;}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__set_long_pointer[abi:v160006](wchar_t*)
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__set_long_pointer[abi:v160006](char8_t*)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__set_long_pointer[abi:v160006](char16_t*)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__set_long_pointer[abi:v160006](char32_t*)
1786
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1787
    pointer __get_long_pointer() _NOEXCEPT
1788
801k
        {return __r_.first().__l.__data_;}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_long_pointer[abi:v160006]()
Line
Count
Source
1788
801k
        {return __r_.first().__l.__data_;}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__get_long_pointer[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__get_long_pointer[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__get_long_pointer[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__get_long_pointer[abi:v160006]()
1789
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1790
    const_pointer __get_long_pointer() const _NOEXCEPT
1791
909k
        {return __r_.first().__l.__data_;}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_long_pointer[abi:v160006]() const
Line
Count
Source
1791
909k
        {return __r_.first().__l.__data_;}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__get_long_pointer[abi:v160006]() const
1792
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1793
    pointer __get_short_pointer() _NOEXCEPT
1794
1.84M
        {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_short_pointer[abi:v160006]()
Line
Count
Source
1794
1.84M
        {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__get_short_pointer[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__get_short_pointer[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__get_short_pointer[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__get_short_pointer[abi:v160006]()
1795
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1796
    const_pointer __get_short_pointer() const _NOEXCEPT
1797
1.11M
        {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_short_pointer[abi:v160006]() const
Line
Count
Source
1797
1.11M
        {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__get_short_pointer[abi:v160006]() const
1798
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1799
    pointer __get_pointer() _NOEXCEPT
1800
51.0k
        {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_pointer[abi:v160006]()
Line
Count
Source
1800
51.0k
        {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__get_pointer[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__get_pointer[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__get_pointer[abi:v160006]()
1801
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1802
    const_pointer __get_pointer() const _NOEXCEPT
1803
1.72M
        {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__get_pointer[abi:v160006]() const
Line
Count
Source
1803
1.72M
        {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__get_pointer[abi:v160006]() const
1804
1805
    template <size_type __a> static
1806
        _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1807
        size_type __align_it(size_type __s) _NOEXCEPT
1808
784k
            {return (__s + (__a-1)) & ~(__a-1);}
unsigned long std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__align_it[abi:v160006]<16ul>(unsigned long)
Line
Count
Source
1808
784k
            {return (__s + (__a-1)) & ~(__a-1);}
Unexecuted instantiation: unsigned long std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__align_it[abi:v160006]<4ul>(unsigned long)
Unexecuted instantiation: unsigned long std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__align_it[abi:v160006]<16ul>(unsigned long)
Unexecuted instantiation: unsigned long std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__align_it[abi:v160006]<8ul>(unsigned long)
Unexecuted instantiation: unsigned long std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__align_it[abi:v160006]<4ul>(unsigned long)
1809
    enum {__alignment = 16};
1810
    static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1811
    size_type __recommend(size_type __s) _NOEXCEPT
1812
784k
    {
1813
784k
        if (__s < __min_cap) {
1814
0
            if (__libcpp_is_constant_evaluated())
1815
0
                return static_cast<size_type>(__min_cap);
1816
0
            else
1817
0
                return static_cast<size_type>(__min_cap) - 1;
1818
0
        }
1819
784k
        size_type __guess = __align_it<sizeof(value_type) < __alignment ?
1820
784k
                     __alignment/sizeof(value_type) : 1 > (__s+1) - 1;
1821
784k
        if (__guess == __min_cap) ++__guess;
1822
784k
        return __guess;
1823
784k
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__recommend[abi:v160006](unsigned long)
Line
Count
Source
1812
784k
    {
1813
784k
        if (__s < __min_cap) {
1814
0
            if (__libcpp_is_constant_evaluated())
1815
0
                return static_cast<size_type>(__min_cap);
1816
0
            else
1817
0
                return static_cast<size_type>(__min_cap) - 1;
1818
0
        }
1819
784k
        size_type __guess = __align_it<sizeof(value_type) < __alignment ?
1820
784k
                     __alignment/sizeof(value_type) : 1 > (__s+1) - 1;
1821
784k
        if (__guess == __min_cap) ++__guess;
1822
784k
        return __guess;
1823
784k
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__recommend[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__recommend[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__recommend[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__recommend[abi:v160006](unsigned long)
1824
1825
    inline _LIBCPP_CONSTEXPR_SINCE_CXX20
1826
    void __init(const value_type* __s, size_type __sz, size_type __reserve);
1827
    inline _LIBCPP_CONSTEXPR_SINCE_CXX20
1828
    void __init(const value_type* __s, size_type __sz);
1829
    inline _LIBCPP_CONSTEXPR_SINCE_CXX20
1830
    void __init(size_type __n, value_type __c);
1831
1832
    // 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.
1840
    _LIBCPP_CONSTEXPR_SINCE_CXX20 void __init_copy_ctor_external(const value_type* __s, size_type __sz);
1841
1842
    template <class _InputIterator>
1843
    inline _LIBCPP_CONSTEXPR_SINCE_CXX20
1844
    __enable_if_t
1845
    <
1846
        __is_exactly_cpp17_input_iterator<_InputIterator>::value
1847
    >
1848
    __init(_InputIterator __first, _InputIterator __last);
1849
1850
    template <class _ForwardIterator>
1851
    inline _LIBCPP_CONSTEXPR_SINCE_CXX20
1852
    __enable_if_t
1853
    <
1854
        __is_cpp17_forward_iterator<_ForwardIterator>::value
1855
    >
1856
    __init(_ForwardIterator __first, _ForwardIterator __last);
1857
1858
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1859
    void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1860
                   size_type __n_copy,  size_type __n_del,     size_type __n_add = 0);
1861
    _LIBCPP_CONSTEXPR_SINCE_CXX20
1862
    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,
1864
                               size_type __n_add, const value_type* __p_new_stuff);
1865
1866
    // __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>
1870
    _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string& __assign_no_alias(const value_type* __s, size_type __n);
1871
1872
0
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __erase_to_end(size_type __pos) {
1873
0
    __null_terminate_at(std::__to_address(__get_pointer()), __pos);
1874
0
  }
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__erase_to_end[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__erase_to_end[abi:v160006](unsigned long)
1875
1876
    // __erase_external_with_move is invoked for erase() invocations where
1877
    // `n ~= npos`, likely requiring memory moves on the string data.
1878
    _LIBCPP_CONSTEXPR_SINCE_CXX20 void __erase_external_with_move(size_type __pos, size_type __n);
1879
1880
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1881
    void __copy_assign_alloc(const basic_string& __str)
1882
44.8k
        {__copy_assign_alloc(__str, integral_constant<bool,
1883
44.8k
                      __alloc_traits::propagate_on_container_copy_assignment::value>());}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__copy_assign_alloc[abi:v160006](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
1882
44.8k
        {__copy_assign_alloc(__str, integral_constant<bool,
1883
44.8k
                      __alloc_traits::propagate_on_container_copy_assignment::value>());}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__copy_assign_alloc[abi:v160006](std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&)
1884
1885
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1886
    void __copy_assign_alloc(const basic_string& __str, true_type)
1887
        {
1888
            if (__alloc() == __str.__alloc())
1889
                __alloc() = __str.__alloc();
1890
            else
1891
            {
1892
                if (!__str.__is_long())
1893
                {
1894
                    __clear_and_shrink();
1895
                    __alloc() = __str.__alloc();
1896
                }
1897
                else
1898
                {
1899
                    allocator_type __a = __str.__alloc();
1900
                    auto __allocation = std::__allocate_at_least(__a, __str.__get_long_cap());
1901
                    __begin_lifetime(__allocation.ptr, __allocation.count);
1902
                    __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
1903
                    __alloc() = std::move(__a);
1904
                    __set_long_pointer(__allocation.ptr);
1905
                    __set_long_cap(__allocation.count);
1906
                    __set_long_size(__str.size());
1907
                }
1908
            }
1909
        }
1910
1911
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1912
    void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
1913
44.8k
        {}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__copy_assign_alloc[abi:v160006](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::integral_constant<bool, false>)
Line
Count
Source
1913
44.8k
        {}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__copy_assign_alloc[abi:v160006](std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, std::__1::integral_constant<bool, false>)
1914
1915
#ifndef _LIBCPP_CXX03_LANG
1916
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1917
    void __move_assign(basic_string& __str, false_type)
1918
        _NOEXCEPT_(__alloc_traits::is_always_equal::value);
1919
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1920
    void __move_assign(basic_string& __str, true_type)
1921
#if _LIBCPP_STD_VER > 14
1922
        _NOEXCEPT;
1923
#else
1924
        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
1925
#endif
1926
#endif
1927
1928
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1929
    void
1930
    __move_assign_alloc(basic_string& __str)
1931
        _NOEXCEPT_(
1932
            !__alloc_traits::propagate_on_container_move_assignment::value ||
1933
            is_nothrow_move_assignable<allocator_type>::value)
1934
455k
    {__move_assign_alloc(__str, integral_constant<bool,
1935
455k
                      __alloc_traits::propagate_on_container_move_assignment::value>());}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign_alloc[abi:v160006](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
Line
Count
Source
1934
455k
    {__move_assign_alloc(__str, integral_constant<bool,
1935
455k
                      __alloc_traits::propagate_on_container_move_assignment::value>());}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__move_assign_alloc[abi:v160006](std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >&)
1936
1937
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1938
    void __move_assign_alloc(basic_string& __c, true_type)
1939
        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1940
455k
        {
1941
455k
            __alloc() = std::move(__c.__alloc());
1942
455k
        }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign_alloc[abi:v160006](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::integral_constant<bool, true>)
Line
Count
Source
1940
455k
        {
1941
455k
            __alloc() = std::move(__c.__alloc());
1942
455k
        }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__move_assign_alloc[abi:v160006](std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >&, std::__1::integral_constant<bool, true>)
1943
1944
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1945
    void __move_assign_alloc(basic_string&, false_type)
1946
        _NOEXCEPT
1947
        {}
1948
1949
    _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);
1951
1952
    // Assigns the value in __s, guaranteed to be __n < __min_cap in length.
1953
890
    inline basic_string& __assign_short(const value_type* __s, size_type __n) {
1954
890
      pointer __p = __is_long()
1955
890
                        ? (__set_long_size(__n), __get_long_pointer())
1956
890
                        : (__set_short_size(__n), __get_short_pointer());
1957
890
      traits_type::move(std::__to_address(__p), __s, __n);
1958
890
      traits_type::assign(__p[__n], value_type());
1959
890
      return *this;
1960
890
    }
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__assign_short(char const*, unsigned long)
Line
Count
Source
1953
890
    inline basic_string& __assign_short(const value_type* __s, size_type __n) {
1954
890
      pointer __p = __is_long()
1955
890
                        ? (__set_long_size(__n), __get_long_pointer())
1956
890
                        : (__set_short_size(__n), __get_short_pointer());
1957
890
      traits_type::move(std::__to_address(__p), __s, __n);
1958
890
      traits_type::assign(__p[__n], value_type());
1959
890
      return *this;
1960
890
    }
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__assign_short(wchar_t const*, unsigned long)
1961
1962
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1963
0
    basic_string& __null_terminate_at(value_type* __p, size_type __newsz) {
1964
0
      __set_size(__newsz);
1965
0
      __invalidate_iterators_past(__newsz);
1966
0
      traits_type::assign(__p[__newsz], value_type());
1967
0
      return *this;
1968
0
    }
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__null_terminate_at[abi:v160006](char*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__null_terminate_at[abi:v160006](wchar_t*, unsigned long)
1969
1970
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __invalidate_iterators_past(size_type);
1971
1972
    template<class _Tp>
1973
    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
1974
0
    bool __addr_in_range(_Tp&& __t) const {
1975
        // assume that the ranges overlap, because we can't check during constant evaluation
1976
0
        if (__libcpp_is_constant_evaluated())
1977
0
          return true;
1978
0
        const volatile void *__p = std::addressof(__t);
1979
0
        return data() <= __p && __p <= data() + size();
1980
0
    }
Unexecuted instantiation: bool std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__addr_in_range[abi:v160006]<char const&>(char const&) const
Unexecuted instantiation: bool std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__addr_in_range[abi:v160006]<char&>(char&) const
Unexecuted instantiation: bool std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__addr_in_range[abi:v160006]<wchar_t&>(wchar_t&) const
1981
1982
    _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI
1983
0
    void __throw_length_error() const {
1984
0
        std::__throw_length_error("basic_string");
1985
0
    }
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__throw_length_error[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__throw_length_error[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__throw_length_error[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__throw_length_error[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__throw_length_error[abi:v160006]() const
1986
1987
    _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI
1988
0
    void __throw_out_of_range() const {
1989
0
        std::__throw_out_of_range("basic_string");
1990
0
    }
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__throw_out_of_range[abi:v160006]() const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__throw_out_of_range[abi:v160006]() const
1991
1992
    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);
1997
};
1998
1999
// These declarations must appear before any functions are implicitly used
2000
// so that they have the correct visibility specifier.
2001
#define _LIBCPP_DECLARE(...) extern template __VA_ARGS__;
2002
#ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
2003
    _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_DECLARE, char)
2004
#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
2005
        _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_DECLARE, wchar_t)
2006
#   endif
2007
#else
2008
    _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_DECLARE, char)
2009
#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
2010
        _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_DECLARE, wchar_t)
2011
#   endif
2012
#endif
2013
#undef _LIBCPP_DECLARE
2014
2015
2016
#if _LIBCPP_STD_VER >= 17
2017
template<class _InputIterator,
2018
         class _CharT = __iter_value_type<_InputIterator>,
2019
         class _Allocator = allocator<_CharT>,
2020
         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
2021
         class = enable_if_t<__is_allocator<_Allocator>::value>
2022
         >
2023
basic_string(_InputIterator, _InputIterator, _Allocator = _Allocator())
2024
  -> basic_string<_CharT, char_traits<_CharT>, _Allocator>;
2025
2026
template<class _CharT,
2027
         class _Traits,
2028
         class _Allocator = allocator<_CharT>,
2029
         class = enable_if_t<__is_allocator<_Allocator>::value>
2030
         >
2031
explicit basic_string(basic_string_view<_CharT, _Traits>, const _Allocator& = _Allocator())
2032
  -> basic_string<_CharT, _Traits, _Allocator>;
2033
2034
template<class _CharT,
2035
         class _Traits,
2036
         class _Allocator = allocator<_CharT>,
2037
         class = enable_if_t<__is_allocator<_Allocator>::value>,
2038
         class _Sz = typename allocator_traits<_Allocator>::size_type
2039
         >
2040
basic_string(basic_string_view<_CharT, _Traits>, _Sz, _Sz, const _Allocator& = _Allocator())
2041
  -> basic_string<_CharT, _Traits, _Allocator>;
2042
#endif
2043
2044
template <class _CharT, class _Traits, class _Allocator>
2045
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
2046
void
2047
basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type __pos)
2048
0
{
2049
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
2050
    if (!__libcpp_is_constant_evaluated()) {
2051
        __c_node* __c = __get_db()->__find_c_and_lock(this);
2052
        if (__c)
2053
        {
2054
            const_pointer __new_last = __get_pointer() + __pos;
2055
            for (__i_node** __p = __c->end_; __p != __c->beg_; )
2056
            {
2057
                --__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)
2063
                        std::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
2064
                }
2065
            }
2066
            __get_db()->unlock();
2067
        }
2068
    }
2069
#else
2070
0
    (void)__pos;
2071
0
#endif // _LIBCPP_ENABLE_DEBUG_MODE
2072
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__invalidate_iterators_past[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__invalidate_iterators_past[abi:v160006](unsigned long)
2073
2074
template <class _CharT, class _Traits, class _Allocator>
2075
_LIBCPP_CONSTEXPR_SINCE_CXX20
2076
void basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s,
2077
                                                       size_type __sz,
2078
                                                       size_type __reserve)
2079
0
{
2080
0
    if (__libcpp_is_constant_evaluated())
2081
0
        __r_.first() = __rep();
2082
0
    if (__reserve > max_size())
2083
0
        __throw_length_error();
2084
0
    pointer __p;
2085
0
    if (__fits_in_sso(__reserve))
2086
0
    {
2087
0
        __set_short_size(__sz);
2088
0
        __p = __get_short_pointer();
2089
0
    }
2090
0
    else
2091
0
    {
2092
0
        auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__reserve) + 1);
2093
0
        __p = __allocation.ptr;
2094
0
        __begin_lifetime(__p, __allocation.count);
2095
0
        __set_long_pointer(__p);
2096
0
        __set_long_cap(__allocation.count);
2097
0
        __set_long_size(__sz);
2098
0
    }
2099
0
    traits_type::copy(std::__to_address(__p), __s, __sz);
2100
0
    traits_type::assign(__p[__sz], value_type());
2101
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__init(wchar_t const*, unsigned long, unsigned long)
2102
2103
template <class _CharT, class _Traits, class _Allocator>
2104
_LIBCPP_CONSTEXPR_SINCE_CXX20
2105
void
2106
basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
2107
919k
{
2108
919k
    if (__libcpp_is_constant_evaluated())
2109
0
        __r_.first() = __rep();
2110
919k
    if (__sz > max_size())
2111
0
        __throw_length_error();
2112
919k
    pointer __p;
2113
919k
    if (__fits_in_sso(__sz))
2114
622k
    {
2115
622k
        __set_short_size(__sz);
2116
622k
        __p = __get_short_pointer();
2117
622k
    }
2118
297k
    else
2119
297k
    {
2120
297k
        auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2121
297k
        __p = __allocation.ptr;
2122
297k
        __begin_lifetime(__p, __allocation.count);
2123
297k
        __set_long_pointer(__p);
2124
297k
        __set_long_cap(__allocation.count);
2125
297k
        __set_long_size(__sz);
2126
297k
    }
2127
919k
    traits_type::copy(std::__to_address(__p), __s, __sz);
2128
919k
    traits_type::assign(__p[__sz], value_type());
2129
919k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long)
Line
Count
Source
2107
919k
{
2108
919k
    if (__libcpp_is_constant_evaluated())
2109
0
        __r_.first() = __rep();
2110
919k
    if (__sz > max_size())
2111
0
        __throw_length_error();
2112
919k
    pointer __p;
2113
919k
    if (__fits_in_sso(__sz))
2114
622k
    {
2115
622k
        __set_short_size(__sz);
2116
622k
        __p = __get_short_pointer();
2117
622k
    }
2118
297k
    else
2119
297k
    {
2120
297k
        auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2121
297k
        __p = __allocation.ptr;
2122
297k
        __begin_lifetime(__p, __allocation.count);
2123
297k
        __set_long_pointer(__p);
2124
297k
        __set_long_cap(__allocation.count);
2125
297k
        __set_long_size(__sz);
2126
297k
    }
2127
919k
    traits_type::copy(std::__to_address(__p), __s, __sz);
2128
919k
    traits_type::assign(__p[__sz], value_type());
2129
919k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__init(wchar_t const*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<char8_t, std::__1::char_traits<char8_t>, std::__1::allocator<char8_t> >::__init(char8_t const*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__init(char16_t const*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__init(char32_t const*, unsigned long)
2130
2131
template <class _CharT, class _Traits, class _Allocator>
2132
template <class>
2133
_LIBCPP_CONSTEXPR_SINCE_CXX20
2134
basic_string<_CharT, _Traits, _Allocator>::basic_string(const _CharT* __s, const _Allocator& __a)
2135
    : __r_(__default_init_tag(), __a)
2136
{
2137
    _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
2138
    __init(__s, traits_type::length(__s));
2139
    std::__debug_db_insert_c(this);
2140
}
2141
2142
template <class _CharT, class _Traits, class _Allocator>
2143
_LIBCPP_CONSTEXPR_SINCE_CXX20
2144
basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
2145
    : __r_(__default_init_tag(), __alloc_traits::select_on_container_copy_construction(__str.__alloc()))
2146
303k
{
2147
303k
    if (!__str.__is_long())
2148
7.44k
        __r_.first() = __str.__r_.first();
2149
296k
    else
2150
296k
        __init_copy_ctor_external(std::__to_address(__str.__get_long_pointer()),
2151
296k
                                  __str.__get_long_size());
2152
303k
    std::__debug_db_insert_c(this);
2153
303k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
2146
303k
{
2147
303k
    if (!__str.__is_long())
2148
7.44k
        __r_.first() = __str.__r_.first();
2149
296k
    else
2150
296k
        __init_copy_ctor_external(std::__to_address(__str.__get_long_pointer()),
2151
296k
                                  __str.__get_long_size());
2152
303k
    std::__debug_db_insert_c(this);
2153
303k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::basic_string(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&)
2154
2155
template <class _CharT, class _Traits, class _Allocator>
2156
_LIBCPP_CONSTEXPR_SINCE_CXX20
2157
basic_string<_CharT, _Traits, _Allocator>::basic_string(
2158
    const basic_string& __str, const allocator_type& __a)
2159
    : __r_(__default_init_tag(), __a)
2160
0
{
2161
0
    if (!__str.__is_long())
2162
0
        __r_.first() = __str.__r_.first();
2163
0
    else
2164
0
        __init_copy_ctor_external(std::__to_address(__str.__get_long_pointer()),
2165
0
                                  __str.__get_long_size());
2166
0
    std::__debug_db_insert_c(this);
2167
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::allocator<char> const&)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::basic_string(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, std::__1::allocator<wchar_t> const&)
2168
2169
template <class _CharT, class _Traits, class _Allocator>
2170
_LIBCPP_CONSTEXPR_SINCE_CXX20
2171
void basic_string<_CharT, _Traits, _Allocator>::__init_copy_ctor_external(
2172
296k
    const value_type* __s, size_type __sz) {
2173
296k
  if (__libcpp_is_constant_evaluated())
2174
0
    __r_.first() = __rep();
2175
2176
296k
  pointer __p;
2177
296k
  if (__fits_in_sso(__sz)) {
2178
0
    __p = __get_short_pointer();
2179
0
    __set_short_size(__sz);
2180
296k
  } else {
2181
296k
    if (__sz > max_size())
2182
0
      __throw_length_error();
2183
296k
    auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2184
296k
    __p = __allocation.ptr;
2185
296k
    __begin_lifetime(__p, __allocation.count);
2186
296k
    __set_long_pointer(__p);
2187
296k
    __set_long_cap(__allocation.count);
2188
296k
    __set_long_size(__sz);
2189
296k
  }
2190
296k
  traits_type::copy(std::__to_address(__p), __s, __sz + 1);
2191
296k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init_copy_ctor_external(char const*, unsigned long)
Line
Count
Source
2172
296k
    const value_type* __s, size_type __sz) {
2173
296k
  if (__libcpp_is_constant_evaluated())
2174
0
    __r_.first() = __rep();
2175
2176
296k
  pointer __p;
2177
296k
  if (__fits_in_sso(__sz)) {
2178
0
    __p = __get_short_pointer();
2179
0
    __set_short_size(__sz);
2180
296k
  } else {
2181
296k
    if (__sz > max_size())
2182
0
      __throw_length_error();
2183
296k
    auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2184
296k
    __p = __allocation.ptr;
2185
296k
    __begin_lifetime(__p, __allocation.count);
2186
296k
    __set_long_pointer(__p);
2187
296k
    __set_long_cap(__allocation.count);
2188
296k
    __set_long_size(__sz);
2189
296k
  }
2190
296k
  traits_type::copy(std::__to_address(__p), __s, __sz + 1);
2191
296k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__init_copy_ctor_external(wchar_t const*, unsigned long)
2192
2193
template <class _CharT, class _Traits, class _Allocator>
2194
_LIBCPP_CONSTEXPR_SINCE_CXX20
2195
void
2196
basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
2197
0
{
2198
0
    if (__libcpp_is_constant_evaluated())
2199
0
        __r_.first() = __rep();
2200
2201
0
    if (__n > max_size())
2202
0
        __throw_length_error();
2203
0
    pointer __p;
2204
0
    if (__fits_in_sso(__n))
2205
0
    {
2206
0
        __set_short_size(__n);
2207
0
        __p = __get_short_pointer();
2208
0
    }
2209
0
    else
2210
0
    {
2211
0
        auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__n) + 1);
2212
0
        __p = __allocation.ptr;
2213
0
        __begin_lifetime(__p, __allocation.count);
2214
0
        __set_long_pointer(__p);
2215
0
        __set_long_cap(__allocation.count);
2216
0
        __set_long_size(__n);
2217
0
    }
2218
0
    traits_type::assign(std::__to_address(__p), __n, __c);
2219
0
    traits_type::assign(__p[__n], value_type());
2220
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__init(unsigned long, wchar_t)
2221
2222
template <class _CharT, class _Traits, class _Allocator>
2223
template <class>
2224
_LIBCPP_CONSTEXPR_SINCE_CXX20
2225
basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, _CharT __c, const _Allocator& __a)
2226
    : __r_(__default_init_tag(), __a)
2227
{
2228
    __init(__n, __c);
2229
    std::__debug_db_insert_c(this);
2230
}
2231
2232
template <class _CharT, class _Traits, class _Allocator>
2233
_LIBCPP_CONSTEXPR_SINCE_CXX20
2234
basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str,
2235
                                                        size_type __pos, size_type __n,
2236
                                                        const _Allocator& __a)
2237
    : __r_(__default_init_tag(), __a)
2238
0
{
2239
0
    size_type __str_sz = __str.size();
2240
0
    if (__pos > __str_sz)
2241
0
        __throw_out_of_range();
2242
0
    __init(__str.data() + __pos, std::min(__n, __str_sz - __pos));
2243
0
    std::__debug_db_insert_c(this);
2244
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long, std::__1::allocator<char> const&)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::basic_string(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, unsigned long, unsigned long, std::__1::allocator<wchar_t> const&)
2245
2246
template <class _CharT, class _Traits, class _Allocator>
2247
template <class _Tp, class>
2248
_LIBCPP_CONSTEXPR_SINCE_CXX20
2249
basic_string<_CharT, _Traits, _Allocator>::basic_string(
2250
             const _Tp& __t, size_type __pos, size_type __n, const allocator_type& __a)
2251
    : __r_(__default_init_tag(), __a)
2252
{
2253
    __self_view __sv0 = __t;
2254
    __self_view __sv = __sv0.substr(__pos, __n);
2255
    __init(__sv.data(), __sv.size());
2256
    std::__debug_db_insert_c(this);
2257
}
2258
2259
template <class _CharT, class _Traits, class _Allocator>
2260
template <class _Tp, class>
2261
_LIBCPP_CONSTEXPR_SINCE_CXX20
2262
basic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t)
2263
     : __r_(__default_init_tag(), __default_init_tag())
2264
{
2265
    __self_view __sv = __t;
2266
    __init(__sv.data(), __sv.size());
2267
    std::__debug_db_insert_c(this);
2268
}
2269
2270
template <class _CharT, class _Traits, class _Allocator>
2271
template <class _Tp, class>
2272
_LIBCPP_CONSTEXPR_SINCE_CXX20
2273
basic_string<_CharT, _Traits, _Allocator>::basic_string(const _Tp & __t, const _Allocator& __a)
2274
    : __r_(__default_init_tag(), __a)
2275
{
2276
    __self_view __sv = __t;
2277
    __init(__sv.data(), __sv.size());
2278
    std::__debug_db_insert_c(this);
2279
}
2280
2281
template <class _CharT, class _Traits, class _Allocator>
2282
template <class _InputIterator>
2283
_LIBCPP_CONSTEXPR_SINCE_CXX20
2284
__enable_if_t
2285
<
2286
    __is_exactly_cpp17_input_iterator<_InputIterator>::value
2287
>
2288
basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
2289
{
2290
    __default_init();
2291
#ifndef _LIBCPP_NO_EXCEPTIONS
2292
    try
2293
    {
2294
#endif // _LIBCPP_NO_EXCEPTIONS
2295
    for (; __first != __last; ++__first)
2296
        push_back(*__first);
2297
#ifndef _LIBCPP_NO_EXCEPTIONS
2298
    }
2299
    catch (...)
2300
    {
2301
        if (__is_long())
2302
            __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2303
        throw;
2304
    }
2305
#endif // _LIBCPP_NO_EXCEPTIONS
2306
}
2307
2308
template <class _CharT, class _Traits, class _Allocator>
2309
template <class _ForwardIterator>
2310
_LIBCPP_CONSTEXPR_SINCE_CXX20
2311
__enable_if_t
2312
<
2313
    __is_cpp17_forward_iterator<_ForwardIterator>::value
2314
>
2315
basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
2316
903k
{
2317
903k
    if (__libcpp_is_constant_evaluated())
2318
0
        __r_.first() = __rep();
2319
903k
    size_type __sz = static_cast<size_type>(std::distance(__first, __last));
2320
903k
    if (__sz > max_size())
2321
0
        __throw_length_error();
2322
903k
    pointer __p;
2323
903k
    if (__fits_in_sso(__sz))
2324
721k
    {
2325
721k
        __set_short_size(__sz);
2326
721k
        __p = __get_short_pointer();
2327
721k
    }
2328
182k
    else
2329
182k
    {
2330
182k
        auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2331
182k
        __p = __allocation.ptr;
2332
182k
        __begin_lifetime(__p, __allocation.count);
2333
182k
        __set_long_pointer(__p);
2334
182k
        __set_long_cap(__allocation.count);
2335
182k
        __set_long_size(__sz);
2336
182k
    }
2337
2338
903k
#ifndef _LIBCPP_NO_EXCEPTIONS
2339
903k
    try
2340
903k
    {
2341
903k
#endif  // _LIBCPP_NO_EXCEPTIONS
2342
6.48G
    for (; __first != __last; ++__first, (void) ++__p)
2343
6.48G
        traits_type::assign(*__p, *__first);
2344
903k
    traits_type::assign(*__p, value_type());
2345
903k
#ifndef _LIBCPP_NO_EXCEPTIONS
2346
903k
    }
2347
903k
    catch (...)
2348
903k
    {
2349
0
        if (__is_long())
2350
0
            __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2351
0
        throw;
2352
0
    }
2353
903k
#endif  // _LIBCPP_NO_EXCEPTIONS
2354
903k
}
_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueEvE4typeES9_S9_
Line
Count
Source
2316
2.88k
{
2317
2.88k
    if (__libcpp_is_constant_evaluated())
2318
0
        __r_.first() = __rep();
2319
2.88k
    size_type __sz = static_cast<size_type>(std::distance(__first, __last));
2320
2.88k
    if (__sz > max_size())
2321
0
        __throw_length_error();
2322
2.88k
    pointer __p;
2323
2.88k
    if (__fits_in_sso(__sz))
2324
2.23k
    {
2325
2.23k
        __set_short_size(__sz);
2326
2.23k
        __p = __get_short_pointer();
2327
2.23k
    }
2328
650
    else
2329
650
    {
2330
650
        auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2331
650
        __p = __allocation.ptr;
2332
650
        __begin_lifetime(__p, __allocation.count);
2333
650
        __set_long_pointer(__p);
2334
650
        __set_long_cap(__allocation.count);
2335
650
        __set_long_size(__sz);
2336
650
    }
2337
2338
2.88k
#ifndef _LIBCPP_NO_EXCEPTIONS
2339
2.88k
    try
2340
2.88k
    {
2341
2.88k
#endif  // _LIBCPP_NO_EXCEPTIONS
2342
61.2k
    for (; __first != __last; ++__first, (void) ++__p)
2343
58.3k
        traits_type::assign(*__p, *__first);
2344
2.88k
    traits_type::assign(*__p, value_type());
2345
2.88k
#ifndef _LIBCPP_NO_EXCEPTIONS
2346
2.88k
    }
2347
2.88k
    catch (...)
2348
2.88k
    {
2349
0
        if (__is_long())
2350
0
            __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2351
0
        throw;
2352
0
    }
2353
2.88k
#endif  // _LIBCPP_NO_EXCEPTIONS
2354
2.88k
}
Unexecuted instantiation: _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initIPcEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueEvE4typeES9_S9_
Unexecuted instantiation: _ZNSt3__112basic_stringIDuNS_11char_traitsIDuEENS_9allocatorIDuEEE6__initINS_11__wrap_iterIPKcEEEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueEvE4typeESC_SC_
_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPKcEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueEvE4typeESA_SA_
Line
Count
Source
2316
901k
{
2317
901k
    if (__libcpp_is_constant_evaluated())
2318
0
        __r_.first() = __rep();
2319
901k
    size_type __sz = static_cast<size_type>(std::distance(__first, __last));
2320
901k
    if (__sz > max_size())
2321
0
        __throw_length_error();
2322
901k
    pointer __p;
2323
901k
    if (__fits_in_sso(__sz))
2324
718k
    {
2325
718k
        __set_short_size(__sz);
2326
718k
        __p = __get_short_pointer();
2327
718k
    }
2328
182k
    else
2329
182k
    {
2330
182k
        auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1);
2331
182k
        __p = __allocation.ptr;
2332
182k
        __begin_lifetime(__p, __allocation.count);
2333
182k
        __set_long_pointer(__p);
2334
182k
        __set_long_cap(__allocation.count);
2335
182k
        __set_long_size(__sz);
2336
182k
    }
2337
2338
901k
#ifndef _LIBCPP_NO_EXCEPTIONS
2339
901k
    try
2340
901k
    {
2341
901k
#endif  // _LIBCPP_NO_EXCEPTIONS
2342
6.48G
    for (; __first != __last; ++__first, (void) ++__p)
2343
6.48G
        traits_type::assign(*__p, *__first);
2344
901k
    traits_type::assign(*__p, value_type());
2345
901k
#ifndef _LIBCPP_NO_EXCEPTIONS
2346
901k
    }
2347
901k
    catch (...)
2348
901k
    {
2349
0
        if (__is_long())
2350
0
            __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2351
0
        throw;
2352
0
    }
2353
901k
#endif  // _LIBCPP_NO_EXCEPTIONS
2354
901k
}
Unexecuted instantiation: _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initIPKwEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueEvE4typeESA_SA_
Unexecuted instantiation: _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initIPwEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueEvE4typeES9_S9_
2355
2356
template <class _CharT, class _Traits, class _Allocator>
2357
_LIBCPP_CONSTEXPR_SINCE_CXX20
2358
basic_string<_CharT, _Traits, _Allocator>::~basic_string()
2359
3.92M
{
2360
3.92M
    std::__debug_db_erase_c(this);
2361
3.92M
    if (__is_long())
2362
790k
        __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2363
3.92M
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()
Line
Count
Source
2359
3.92M
{
2360
3.92M
    std::__debug_db_erase_c(this);
2361
3.92M
    if (__is_long())
2362
790k
        __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
2363
3.92M
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::~basic_string()
2364
2365
template <class _CharT, class _Traits, class _Allocator>
2366
_LIBCPP_CONSTEXPR_SINCE_CXX20
2367
void
2368
basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
2369
    (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2370
     size_type __n_copy,  size_type __n_del,     size_type __n_add, const value_type* __p_new_stuff)
2371
9.96k
{
2372
9.96k
    size_type __ms = max_size();
2373
9.96k
    if (__delta_cap > __ms - __old_cap - 1)
2374
0
        __throw_length_error();
2375
9.96k
    pointer __old_p = __get_pointer();
2376
9.96k
    size_type __cap = __old_cap < __ms / 2 - __alignment ?
2377
9.96k
                          __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) :
2378
9.96k
                          __ms - 1;
2379
9.96k
    auto __allocation = std::__allocate_at_least(__alloc(), __cap + 1);
2380
9.96k
    pointer __p = __allocation.ptr;
2381
9.96k
    __begin_lifetime(__p, __allocation.count);
2382
9.96k
    std::__debug_db_invalidate_all(this);
2383
9.96k
    if (__n_copy != 0)
2384
433
        traits_type::copy(std::__to_address(__p),
2385
433
                          std::__to_address(__old_p), __n_copy);
2386
9.96k
    if (__n_add != 0)
2387
9.96k
        traits_type::copy(std::__to_address(__p) + __n_copy, __p_new_stuff, __n_add);
2388
9.96k
    size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2389
9.96k
    if (__sec_cp_sz != 0)
2390
0
        traits_type::copy(std::__to_address(__p) + __n_copy + __n_add,
2391
0
                          std::__to_address(__old_p) + __n_copy + __n_del, __sec_cp_sz);
2392
9.96k
    if (__old_cap+1 != __min_cap || __libcpp_is_constant_evaluated())
2393
271
        __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
2394
9.96k
    __set_long_pointer(__p);
2395
9.96k
    __set_long_cap(__allocation.count);
2396
9.96k
    __old_sz = __n_copy + __n_add + __sec_cp_sz;
2397
9.96k
    __set_long_size(__old_sz);
2398
9.96k
    traits_type::assign(__p[__old_sz], value_type());
2399
9.96k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__grow_by_and_replace(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, char const*)
Line
Count
Source
2371
9.96k
{
2372
9.96k
    size_type __ms = max_size();
2373
9.96k
    if (__delta_cap > __ms - __old_cap - 1)
2374
0
        __throw_length_error();
2375
9.96k
    pointer __old_p = __get_pointer();
2376
9.96k
    size_type __cap = __old_cap < __ms / 2 - __alignment ?
2377
9.96k
                          __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) :
2378
9.96k
                          __ms - 1;
2379
9.96k
    auto __allocation = std::__allocate_at_least(__alloc(), __cap + 1);
2380
9.96k
    pointer __p = __allocation.ptr;
2381
9.96k
    __begin_lifetime(__p, __allocation.count);
2382
9.96k
    std::__debug_db_invalidate_all(this);
2383
9.96k
    if (__n_copy != 0)
2384
433
        traits_type::copy(std::__to_address(__p),
2385
433
                          std::__to_address(__old_p), __n_copy);
2386
9.96k
    if (__n_add != 0)
2387
9.96k
        traits_type::copy(std::__to_address(__p) + __n_copy, __p_new_stuff, __n_add);
2388
9.96k
    size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2389
9.96k
    if (__sec_cp_sz != 0)
2390
0
        traits_type::copy(std::__to_address(__p) + __n_copy + __n_add,
2391
0
                          std::__to_address(__old_p) + __n_copy + __n_del, __sec_cp_sz);
2392
9.96k
    if (__old_cap+1 != __min_cap || __libcpp_is_constant_evaluated())
2393
271
        __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
2394
9.96k
    __set_long_pointer(__p);
2395
9.96k
    __set_long_cap(__allocation.count);
2396
9.96k
    __old_sz = __n_copy + __n_add + __sec_cp_sz;
2397
9.96k
    __set_long_size(__old_sz);
2398
9.96k
    traits_type::assign(__p[__old_sz], value_type());
2399
9.96k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__grow_by_and_replace(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, wchar_t const*)
2400
2401
template <class _CharT, class _Traits, class _Allocator>
2402
void
2403
_LIBCPP_CONSTEXPR_SINCE_CXX20
2404
basic_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
2.38k
{
2407
2.38k
    size_type __ms = max_size();
2408
2.38k
    if (__delta_cap > __ms - __old_cap)
2409
0
        __throw_length_error();
2410
2.38k
    pointer __old_p = __get_pointer();
2411
2.38k
    size_type __cap = __old_cap < __ms / 2 - __alignment ?
2412
2.38k
                          __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) :
2413
2.38k
                          __ms - 1;
2414
2.38k
    auto __allocation = std::__allocate_at_least(__alloc(), __cap + 1);
2415
2.38k
    pointer __p = __allocation.ptr;
2416
2.38k
    __begin_lifetime(__p, __allocation.count);
2417
2.38k
    std::__debug_db_invalidate_all(this);
2418
2.38k
    if (__n_copy != 0)
2419
2.38k
        traits_type::copy(std::__to_address(__p),
2420
2.38k
                          std::__to_address(__old_p), __n_copy);
2421
2.38k
    size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2422
2.38k
    if (__sec_cp_sz != 0)
2423
0
        traits_type::copy(std::__to_address(__p) + __n_copy + __n_add,
2424
0
                          std::__to_address(__old_p) + __n_copy + __n_del,
2425
0
                          __sec_cp_sz);
2426
2.38k
    if (__libcpp_is_constant_evaluated() || __old_cap + 1 != __min_cap)
2427
1.24k
        __alloc_traits::deallocate(__alloc(), __old_p, __old_cap + 1);
2428
2.38k
    __set_long_pointer(__p);
2429
2.38k
    __set_long_cap(__allocation.count);
2430
2.38k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__grow_by(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
2406
2.38k
{
2407
2.38k
    size_type __ms = max_size();
2408
2.38k
    if (__delta_cap > __ms - __old_cap)
2409
0
        __throw_length_error();
2410
2.38k
    pointer __old_p = __get_pointer();
2411
2.38k
    size_type __cap = __old_cap < __ms / 2 - __alignment ?
2412
2.38k
                          __recommend(std::max(__old_cap + __delta_cap, 2 * __old_cap)) :
2413
2.38k
                          __ms - 1;
2414
2.38k
    auto __allocation = std::__allocate_at_least(__alloc(), __cap + 1);
2415
2.38k
    pointer __p = __allocation.ptr;
2416
2.38k
    __begin_lifetime(__p, __allocation.count);
2417
2.38k
    std::__debug_db_invalidate_all(this);
2418
2.38k
    if (__n_copy != 0)
2419
2.38k
        traits_type::copy(std::__to_address(__p),
2420
2.38k
                          std::__to_address(__old_p), __n_copy);
2421
2.38k
    size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2422
2.38k
    if (__sec_cp_sz != 0)
2423
0
        traits_type::copy(std::__to_address(__p) + __n_copy + __n_add,
2424
0
                          std::__to_address(__old_p) + __n_copy + __n_del,
2425
0
                          __sec_cp_sz);
2426
2.38k
    if (__libcpp_is_constant_evaluated() || __old_cap + 1 != __min_cap)
2427
1.24k
        __alloc_traits::deallocate(__alloc(), __old_p, __old_cap + 1);
2428
2.38k
    __set_long_pointer(__p);
2429
2.38k
    __set_long_cap(__allocation.count);
2430
2.38k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__grow_by(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__grow_by(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__grow_by(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
2431
2432
// assign
2433
2434
template <class _CharT, class _Traits, class _Allocator>
2435
template <bool __is_short>
2436
_LIBCPP_CONSTEXPR_SINCE_CXX20
2437
basic_string<_CharT, _Traits, _Allocator>&
2438
basic_string<_CharT, _Traits, _Allocator>::__assign_no_alias(
2439
9.53k
    const value_type* __s, size_type __n) {
2440
9.53k
  size_type __cap = __is_short ? static_cast<size_type>(__min_cap) : __get_long_cap();
2441
9.53k
  if (__n < __cap) {
2442
0
    pointer __p = __is_short ? __get_short_pointer() : __get_long_pointer();
2443
0
    __is_short ? __set_short_size(__n) : __set_long_size(__n);
2444
0
    traits_type::copy(std::__to_address(__p), __s, __n);
2445
0
    traits_type::assign(__p[__n], value_type());
2446
0
    __invalidate_iterators_past(__n);
2447
9.53k
  } else {
2448
9.53k
    size_type __sz = __is_short ? __get_short_size() : __get_long_size();
2449
9.53k
    __grow_by_and_replace(__cap - 1, __n - __cap + 1, __sz, 0, __sz, __n, __s);
2450
9.53k
  }
2451
9.53k
  return *this;
2452
9.53k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >& std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__assign_no_alias<true>(char const*, unsigned long)
Line
Count
Source
2439
9.53k
    const value_type* __s, size_type __n) {
2440
9.53k
  size_type __cap = __is_short ? static_cast<size_type>(__min_cap) : __get_long_cap();
2441
9.53k
  if (__n < __cap) {
2442
0
    pointer __p = __is_short ? __get_short_pointer() : __get_long_pointer();
2443
0
    __is_short ? __set_short_size(__n) : __set_long_size(__n);
2444
0
    traits_type::copy(std::__to_address(__p), __s, __n);
2445
0
    traits_type::assign(__p[__n], value_type());
2446
0
    __invalidate_iterators_past(__n);
2447
9.53k
  } else {
2448
9.53k
    size_type __sz = __is_short ? __get_short_size() : __get_long_size();
2449
9.53k
    __grow_by_and_replace(__cap - 1, __n - __cap + 1, __sz, 0, __sz, __n, __s);
2450
9.53k
  }
2451
9.53k
  return *this;
2452
9.53k
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >& std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__assign_no_alias<false>(char const*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >& std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__assign_no_alias<true>(wchar_t const*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >& std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__assign_no_alias<false>(wchar_t const*, unsigned long)
2453
2454
template <class _CharT, class _Traits, class _Allocator>
2455
_LIBCPP_CONSTEXPR_SINCE_CXX20
2456
basic_string<_CharT, _Traits, _Allocator>&
2457
basic_string<_CharT, _Traits, _Allocator>::__assign_external(
2458
0
    const value_type* __s, size_type __n) {
2459
0
  size_type __cap = capacity();
2460
0
  if (__cap >= __n) {
2461
0
    value_type* __p = std::__to_address(__get_pointer());
2462
0
    traits_type::move(__p, __s, __n);
2463
0
    return __null_terminate_at(__p, __n);
2464
0
  } else {
2465
0
    size_type __sz = size();
2466
0
    __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
2467
0
    return *this;
2468
0
  }
2469
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__assign_external(char const*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__assign_external(wchar_t const*, unsigned long)
2470
2471
template <class _CharT, class _Traits, class _Allocator>
2472
_LIBCPP_CONSTEXPR_SINCE_CXX20
2473
basic_string<_CharT, _Traits, _Allocator>&
2474
basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
2475
0
{
2476
0
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr");
2477
0
    return (__builtin_constant_p(__n) && __fits_in_sso(__n))
2478
0
               ? __assign_short(__s, __n)
2479
0
               : __assign_external(__s, __n);
2480
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(char const*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::assign(wchar_t const*, unsigned long)
2481
2482
template <class _CharT, class _Traits, class _Allocator>
2483
_LIBCPP_CONSTEXPR_SINCE_CXX20
2484
basic_string<_CharT, _Traits, _Allocator>&
2485
basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
2486
0
{
2487
0
    size_type __cap = capacity();
2488
0
    if (__cap < __n)
2489
0
    {
2490
0
        size_type __sz = size();
2491
0
        __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2492
0
    }
2493
0
    value_type* __p = std::__to_address(__get_pointer());
2494
0
    traits_type::assign(__p, __n, __c);
2495
0
    return __null_terminate_at(__p, __n);
2496
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(unsigned long, char)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::assign(unsigned long, wchar_t)
2497
2498
template <class _CharT, class _Traits, class _Allocator>
2499
_LIBCPP_CONSTEXPR_SINCE_CXX20
2500
basic_string<_CharT, _Traits, _Allocator>&
2501
basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
2502
0
{
2503
0
    pointer __p;
2504
0
    if (__is_long())
2505
0
    {
2506
0
        __p = __get_long_pointer();
2507
0
        __set_long_size(1);
2508
0
    }
2509
0
    else
2510
0
    {
2511
0
        __p = __get_short_pointer();
2512
0
        __set_short_size(1);
2513
0
    }
2514
0
    traits_type::assign(*__p, __c);
2515
0
    traits_type::assign(*++__p, value_type());
2516
0
    __invalidate_iterators_past(1);
2517
0
    return *this;
2518
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(char)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::operator=(wchar_t)
2519
2520
template <class _CharT, class _Traits, class _Allocator>
2521
_LIBCPP_CONSTEXPR_SINCE_CXX20
2522
basic_string<_CharT, _Traits, _Allocator>&
2523
basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
2524
44.8k
{
2525
44.8k
  if (this != &__str) {
2526
44.8k
    __copy_assign_alloc(__str);
2527
44.8k
    if (!__is_long()) {
2528
44.8k
      if (!__str.__is_long()) {
2529
35.3k
        __r_.first() = __str.__r_.first();
2530
35.3k
      } else {
2531
9.53k
        return __assign_no_alias<true>(__str.data(), __str.size());
2532
9.53k
      }
2533
44.8k
    } else {
2534
0
      return __assign_no_alias<false>(__str.data(), __str.size());
2535
0
    }
2536
44.8k
  }
2537
35.3k
  return *this;
2538
44.8k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
2524
44.8k
{
2525
44.8k
  if (this != &__str) {
2526
44.8k
    __copy_assign_alloc(__str);
2527
44.8k
    if (!__is_long()) {
2528
44.8k
      if (!__str.__is_long()) {
2529
35.3k
        __r_.first() = __str.__r_.first();
2530
35.3k
      } else {
2531
9.53k
        return __assign_no_alias<true>(__str.data(), __str.size());
2532
9.53k
      }
2533
44.8k
    } else {
2534
0
      return __assign_no_alias<false>(__str.data(), __str.size());
2535
0
    }
2536
44.8k
  }
2537
35.3k
  return *this;
2538
44.8k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::operator=(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&)
2539
2540
#ifndef _LIBCPP_CXX03_LANG
2541
2542
template <class _CharT, class _Traits, class _Allocator>
2543
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
2544
void
2545
basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
2546
    _NOEXCEPT_(__alloc_traits::is_always_equal::value)
2547
{
2548
    if (__alloc() != __str.__alloc())
2549
        assign(__str);
2550
    else
2551
        __move_assign(__str, true_type());
2552
}
2553
2554
template <class _CharT, class _Traits, class _Allocator>
2555
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
2556
void
2557
basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
2558
#if _LIBCPP_STD_VER > 14
2559
    _NOEXCEPT
2560
#else
2561
    _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
2562
#endif
2563
455k
{
2564
455k
  if (__is_long()) {
2565
0
    __alloc_traits::deallocate(__alloc(), __get_long_pointer(),
2566
0
                               __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
0
  }
2574
455k
  __move_assign_alloc(__str);
2575
455k
  __r_.first() = __str.__r_.first();
2576
455k
  if (__libcpp_is_constant_evaluated()) {
2577
0
    __str.__default_init();
2578
455k
  } else {
2579
455k
    __str.__set_short_size(0);
2580
455k
    traits_type::assign(__str.__get_short_pointer()[0], value_type());
2581
455k
  }
2582
455k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign[abi:v160006](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::integral_constant<bool, true>)
Line
Count
Source
2563
455k
{
2564
455k
  if (__is_long()) {
2565
0
    __alloc_traits::deallocate(__alloc(), __get_long_pointer(),
2566
0
                               __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
0
  }
2574
455k
  __move_assign_alloc(__str);
2575
455k
  __r_.first() = __str.__r_.first();
2576
455k
  if (__libcpp_is_constant_evaluated()) {
2577
0
    __str.__default_init();
2578
455k
  } else {
2579
455k
    __str.__set_short_size(0);
2580
455k
    traits_type::assign(__str.__get_short_pointer()[0], value_type());
2581
455k
  }
2582
455k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__move_assign[abi:v160006](std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >&, std::__1::integral_constant<bool, true>)
2583
2584
#endif
2585
2586
template <class _CharT, class _Traits, class _Allocator>
2587
template<class _InputIterator>
2588
_LIBCPP_CONSTEXPR_SINCE_CXX20
2589
__enable_if_t
2590
<
2591
     __is_exactly_cpp17_input_iterator<_InputIterator>::value,
2592
    basic_string<_CharT, _Traits, _Allocator>&
2593
>
2594
basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2595
{
2596
    const basic_string __temp(__first, __last, __alloc());
2597
    assign(__temp.data(), __temp.size());
2598
    return *this;
2599
}
2600
2601
template <class _CharT, class _Traits, class _Allocator>
2602
template<class _ForwardIterator>
2603
_LIBCPP_CONSTEXPR_SINCE_CXX20
2604
__enable_if_t
2605
<
2606
    __is_cpp17_forward_iterator<_ForwardIterator>::value,
2607
    basic_string<_CharT, _Traits, _Allocator>&
2608
>
2609
basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2610
0
{
2611
0
    size_type __cap = capacity();
2612
0
    size_type __n = __string_is_trivial_iterator<_ForwardIterator>::value ?
2613
0
        static_cast<size_type>(std::distance(__first, __last)) : 0;
2614
2615
0
    if (__string_is_trivial_iterator<_ForwardIterator>::value &&
2616
0
        (__cap >= __n || !__addr_in_range(*__first)))
2617
0
    {
2618
0
        if (__cap < __n)
2619
0
        {
2620
0
            size_type __sz = size();
2621
0
            __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2622
0
        }
2623
0
        pointer __p = __get_pointer();
2624
0
        for (; __first != __last; ++__p, (void) ++__first)
2625
0
            traits_type::assign(*__p, *__first);
2626
0
        traits_type::assign(*__p, value_type());
2627
0
        __set_size(__n);
2628
0
        __invalidate_iterators_past(__n);
2629
0
    }
2630
0
    else
2631
0
    {
2632
0
        const basic_string __temp(__first, __last, __alloc());
2633
0
        assign(__temp.data(), __temp.size());
2634
0
    }
2635
0
    return *this;
2636
0
}
2637
2638
template <class _CharT, class _Traits, class _Allocator>
2639
_LIBCPP_CONSTEXPR_SINCE_CXX20
2640
basic_string<_CharT, _Traits, _Allocator>&
2641
basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
2642
0
{
2643
0
    size_type __sz = __str.size();
2644
0
    if (__pos > __sz)
2645
0
        __throw_out_of_range();
2646
0
    return assign(__str.data() + __pos, std::min(__n, __sz - __pos));
2647
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::assign(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, unsigned long, unsigned long)
2648
2649
template <class _CharT, class _Traits, class _Allocator>
2650
template <class _Tp>
2651
_LIBCPP_CONSTEXPR_SINCE_CXX20
2652
__enable_if_t
2653
<
2654
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
2655
    && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
2656
    basic_string<_CharT, _Traits, _Allocator>&
2657
>
2658
basic_string<_CharT, _Traits, _Allocator>::assign(const _Tp & __t, size_type __pos, size_type __n)
2659
{
2660
    __self_view __sv = __t;
2661
    size_type __sz = __sv.size();
2662
    if (__pos > __sz)
2663
        __throw_out_of_range();
2664
    return assign(__sv.data() + __pos, std::min(__n, __sz - __pos));
2665
}
2666
2667
2668
template <class _CharT, class _Traits, class _Allocator>
2669
_LIBCPP_CONSTEXPR_SINCE_CXX20
2670
basic_string<_CharT, _Traits, _Allocator>&
2671
0
basic_string<_CharT, _Traits, _Allocator>::__assign_external(const value_type* __s) {
2672
0
  return __assign_external(__s, traits_type::length(__s));
2673
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__assign_external(char const*)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__assign_external(wchar_t const*)
2674
2675
template <class _CharT, class _Traits, class _Allocator>
2676
_LIBCPP_CONSTEXPR_SINCE_CXX20
2677
basic_string<_CharT, _Traits, _Allocator>&
2678
basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
2679
890
{
2680
890
    _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
2681
890
    return __builtin_constant_p(*__s)
2682
890
               ? (__fits_in_sso(traits_type::length(__s))
2683
890
                      ? __assign_short(__s, traits_type::length(__s))
2684
890
                      : __assign_external(__s, traits_type::length(__s)))
2685
890
               : __assign_external(__s);
2686
890
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(char const*)
Line
Count
Source
2679
890
{
2680
890
    _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
2681
890
    return __builtin_constant_p(*__s)
2682
890
               ? (__fits_in_sso(traits_type::length(__s))
2683
890
                      ? __assign_short(__s, traits_type::length(__s))
2684
890
                      : __assign_external(__s, traits_type::length(__s)))
2685
890
               : __assign_external(__s);
2686
890
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::assign(wchar_t const*)
2687
// append
2688
2689
template <class _CharT, class _Traits, class _Allocator>
2690
_LIBCPP_CONSTEXPR_SINCE_CXX20
2691
basic_string<_CharT, _Traits, _Allocator>&
2692
basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
2693
9.91k
{
2694
9.91k
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
2695
9.91k
    size_type __cap = capacity();
2696
9.91k
    size_type __sz = size();
2697
9.91k
    if (__cap - __sz >= __n)
2698
9.47k
    {
2699
9.47k
        if (__n)
2700
4.03k
        {
2701
4.03k
            value_type* __p = std::__to_address(__get_pointer());
2702
4.03k
            traits_type::copy(__p + __sz, __s, __n);
2703
4.03k
            __sz += __n;
2704
4.03k
            __set_size(__sz);
2705
4.03k
            traits_type::assign(__p[__sz], value_type());
2706
4.03k
        }
2707
9.47k
    }
2708
433
    else
2709
433
        __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
2710
9.91k
    return *this;
2711
9.91k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*, unsigned long)
Line
Count
Source
2693
9.91k
{
2694
9.91k
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
2695
9.91k
    size_type __cap = capacity();
2696
9.91k
    size_type __sz = size();
2697
9.91k
    if (__cap - __sz >= __n)
2698
9.47k
    {
2699
9.47k
        if (__n)
2700
4.03k
        {
2701
4.03k
            value_type* __p = std::__to_address(__get_pointer());
2702
4.03k
            traits_type::copy(__p + __sz, __s, __n);
2703
4.03k
            __sz += __n;
2704
4.03k
            __set_size(__sz);
2705
4.03k
            traits_type::assign(__p[__sz], value_type());
2706
4.03k
        }
2707
9.47k
    }
2708
433
    else
2709
433
        __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
2710
9.91k
    return *this;
2711
9.91k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::append(wchar_t const*, unsigned long)
2712
2713
template <class _CharT, class _Traits, class _Allocator>
2714
_LIBCPP_CONSTEXPR_SINCE_CXX20
2715
basic_string<_CharT, _Traits, _Allocator>&
2716
basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
2717
9.81k
{
2718
9.81k
    if (__n)
2719
9.81k
    {
2720
9.81k
        size_type __cap = capacity();
2721
9.81k
        size_type __sz = size();
2722
9.81k
        if (__cap - __sz < __n)
2723
1.73k
            __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2724
9.81k
        pointer __p = __get_pointer();
2725
9.81k
        traits_type::assign(std::__to_address(__p) + __sz, __n, __c);
2726
9.81k
        __sz += __n;
2727
9.81k
        __set_size(__sz);
2728
9.81k
        traits_type::assign(__p[__sz], value_type());
2729
9.81k
    }
2730
9.81k
    return *this;
2731
9.81k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(unsigned long, char)
Line
Count
Source
2717
9.81k
{
2718
9.81k
    if (__n)
2719
9.81k
    {
2720
9.81k
        size_type __cap = capacity();
2721
9.81k
        size_type __sz = size();
2722
9.81k
        if (__cap - __sz < __n)
2723
1.73k
            __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2724
9.81k
        pointer __p = __get_pointer();
2725
9.81k
        traits_type::assign(std::__to_address(__p) + __sz, __n, __c);
2726
9.81k
        __sz += __n;
2727
9.81k
        __set_size(__sz);
2728
9.81k
        traits_type::assign(__p[__sz], value_type());
2729
9.81k
    }
2730
9.81k
    return *this;
2731
9.81k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::append(unsigned long, wchar_t)
2732
2733
template <class _CharT, class _Traits, class _Allocator>
2734
_LIBCPP_CONSTEXPR_SINCE_CXX20 inline void
2735
basic_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
2750
template <class _CharT, class _Traits, class _Allocator>
2751
_LIBCPP_CONSTEXPR_SINCE_CXX20
2752
void
2753
basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
2754
3.53k
{
2755
3.53k
    bool __is_short = !__is_long();
2756
3.53k
    size_type __cap;
2757
3.53k
    size_type __sz;
2758
3.53k
    if (__is_short)
2759
3.53k
    {
2760
3.53k
        __cap = __min_cap - 1;
2761
3.53k
        __sz = __get_short_size();
2762
3.53k
    }
2763
0
    else
2764
0
    {
2765
0
        __cap = __get_long_cap() - 1;
2766
0
        __sz = __get_long_size();
2767
0
    }
2768
3.53k
    if (__sz == __cap)
2769
650
    {
2770
650
        __grow_by(__cap, 1, __sz, __sz, 0);
2771
650
        __is_short = false; // the string is always long after __grow_by
2772
650
    }
2773
3.53k
    pointer __p = __get_pointer();
2774
3.53k
    if (__is_short)
2775
2.88k
    {
2776
2.88k
        __p = __get_short_pointer() + __sz;
2777
2.88k
        __set_short_size(__sz+1);
2778
2.88k
    }
2779
650
    else
2780
650
    {
2781
650
        __p = __get_long_pointer() + __sz;
2782
650
        __set_long_size(__sz+1);
2783
650
    }
2784
3.53k
    traits_type::assign(*__p, __c);
2785
3.53k
    traits_type::assign(*++__p, value_type());
2786
3.53k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::push_back(char)
Line
Count
Source
2754
3.53k
{
2755
3.53k
    bool __is_short = !__is_long();
2756
3.53k
    size_type __cap;
2757
3.53k
    size_type __sz;
2758
3.53k
    if (__is_short)
2759
3.53k
    {
2760
3.53k
        __cap = __min_cap - 1;
2761
3.53k
        __sz = __get_short_size();
2762
3.53k
    }
2763
0
    else
2764
0
    {
2765
0
        __cap = __get_long_cap() - 1;
2766
0
        __sz = __get_long_size();
2767
0
    }
2768
3.53k
    if (__sz == __cap)
2769
650
    {
2770
650
        __grow_by(__cap, 1, __sz, __sz, 0);
2771
650
        __is_short = false; // the string is always long after __grow_by
2772
650
    }
2773
3.53k
    pointer __p = __get_pointer();
2774
3.53k
    if (__is_short)
2775
2.88k
    {
2776
2.88k
        __p = __get_short_pointer() + __sz;
2777
2.88k
        __set_short_size(__sz+1);
2778
2.88k
    }
2779
650
    else
2780
650
    {
2781
650
        __p = __get_long_pointer() + __sz;
2782
650
        __set_long_size(__sz+1);
2783
650
    }
2784
3.53k
    traits_type::assign(*__p, __c);
2785
3.53k
    traits_type::assign(*++__p, value_type());
2786
3.53k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::push_back(wchar_t)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::push_back(char16_t)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::push_back(char32_t)
2787
2788
template <class _CharT, class _Traits, class _Allocator>
2789
template<class _ForwardIterator>
2790
_LIBCPP_CONSTEXPR_SINCE_CXX20
2791
__enable_if_t
2792
<
2793
    __is_cpp17_forward_iterator<_ForwardIterator>::value,
2794
    basic_string<_CharT, _Traits, _Allocator>&
2795
>
2796
basic_string<_CharT, _Traits, _Allocator>::append(
2797
    _ForwardIterator __first, _ForwardIterator __last)
2798
0
{
2799
0
    size_type __sz = size();
2800
0
    size_type __cap = capacity();
2801
0
    size_type __n = static_cast<size_type>(std::distance(__first, __last));
2802
0
    if (__n)
2803
0
    {
2804
0
        if (__string_is_trivial_iterator<_ForwardIterator>::value &&
2805
0
            !__addr_in_range(*__first))
2806
0
        {
2807
0
            if (__cap - __sz < __n)
2808
0
                __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2809
0
            pointer __p = __get_pointer() + __sz;
2810
0
            for (; __first != __last; ++__p, (void) ++__first)
2811
0
                traits_type::assign(*__p, *__first);
2812
0
            traits_type::assign(*__p, value_type());
2813
0
            __set_size(__sz + __n);
2814
0
        }
2815
0
        else
2816
0
        {
2817
0
            const basic_string __temp(__first, __last, __alloc());
2818
0
            append(__temp.data(), __temp.size());
2819
0
        }
2820
0
    }
2821
0
    return *this;
2822
0
}
Unexecuted instantiation: _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendB7v160006IPKcEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueERS5_E4typeESA_SA_
Unexecuted instantiation: _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendB7v160006IPcEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_
Unexecuted instantiation: _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendB7v160006IPwEENS_9enable_ifIXsr27__is_cpp17_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_
2823
2824
template <class _CharT, class _Traits, class _Allocator>
2825
_LIBCPP_CONSTEXPR_SINCE_CXX20
2826
basic_string<_CharT, _Traits, _Allocator>&
2827
basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
2828
0
{
2829
0
    size_type __sz = __str.size();
2830
0
    if (__pos > __sz)
2831
0
        __throw_out_of_range();
2832
0
    return append(__str.data() + __pos, std::min(__n, __sz - __pos));
2833
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::append(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, unsigned long, unsigned long)
2834
2835
template <class _CharT, class _Traits, class _Allocator>
2836
template <class _Tp>
2837
_LIBCPP_CONSTEXPR_SINCE_CXX20
2838
    __enable_if_t
2839
    <
2840
        __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value  && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
2841
        basic_string<_CharT, _Traits, _Allocator>&
2842
    >
2843
basic_string<_CharT, _Traits, _Allocator>::append(const _Tp & __t, size_type __pos, size_type __n)
2844
{
2845
    __self_view __sv = __t;
2846
    size_type __sz = __sv.size();
2847
    if (__pos > __sz)
2848
        __throw_out_of_range();
2849
    return append(__sv.data() + __pos, std::min(__n, __sz - __pos));
2850
}
2851
2852
template <class _CharT, class _Traits, class _Allocator>
2853
_LIBCPP_CONSTEXPR_SINCE_CXX20
2854
basic_string<_CharT, _Traits, _Allocator>&
2855
basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
2856
3.56k
{
2857
3.56k
    _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
2858
3.56k
    return append(__s, traits_type::length(__s));
2859
3.56k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*)
Line
Count
Source
2856
3.56k
{
2857
3.56k
    _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
2858
3.56k
    return append(__s, traits_type::length(__s));
2859
3.56k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::append(wchar_t const*)
2860
2861
// insert
2862
2863
template <class _CharT, class _Traits, class _Allocator>
2864
_LIBCPP_CONSTEXPR_SINCE_CXX20
2865
basic_string<_CharT, _Traits, _Allocator>&
2866
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
2867
3.18k
{
2868
3.18k
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
2869
3.18k
    size_type __sz = size();
2870
3.18k
    if (__pos > __sz)
2871
0
        __throw_out_of_range();
2872
3.18k
    size_type __cap = capacity();
2873
3.18k
    if (__libcpp_is_constant_evaluated()) {
2874
0
        if (__cap - __sz >= __n)
2875
0
            __grow_by_and_replace(__cap, 0, __sz, __pos, 0, __n, __s);
2876
0
        else
2877
0
            __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2878
0
        return *this;
2879
0
    }
2880
3.18k
    if (__cap - __sz >= __n)
2881
3.18k
    {
2882
3.18k
        if (__n)
2883
3.18k
        {
2884
3.18k
            value_type* __p = std::__to_address(__get_pointer());
2885
3.18k
            size_type __n_move = __sz - __pos;
2886
3.18k
            if (__n_move != 0)
2887
3.18k
            {
2888
3.18k
                if (__p + __pos <= __s && __s < __p + __sz)
2889
0
                    __s += __n;
2890
3.18k
                traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2891
3.18k
            }
2892
3.18k
            traits_type::move(__p + __pos, __s, __n);
2893
3.18k
            __sz += __n;
2894
3.18k
            __set_size(__sz);
2895
3.18k
            traits_type::assign(__p[__sz], value_type());
2896
3.18k
        }
2897
3.18k
    }
2898
0
    else
2899
0
        __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2900
3.18k
    return *this;
2901
3.18k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::insert(unsigned long, char const*, unsigned long)
Line
Count
Source
2867
3.18k
{
2868
3.18k
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
2869
3.18k
    size_type __sz = size();
2870
3.18k
    if (__pos > __sz)
2871
0
        __throw_out_of_range();
2872
3.18k
    size_type __cap = capacity();
2873
3.18k
    if (__libcpp_is_constant_evaluated()) {
2874
0
        if (__cap - __sz >= __n)
2875
0
            __grow_by_and_replace(__cap, 0, __sz, __pos, 0, __n, __s);
2876
0
        else
2877
0
            __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2878
0
        return *this;
2879
0
    }
2880
3.18k
    if (__cap - __sz >= __n)
2881
3.18k
    {
2882
3.18k
        if (__n)
2883
3.18k
        {
2884
3.18k
            value_type* __p = std::__to_address(__get_pointer());
2885
3.18k
            size_type __n_move = __sz - __pos;
2886
3.18k
            if (__n_move != 0)
2887
3.18k
            {
2888
3.18k
                if (__p + __pos <= __s && __s < __p + __sz)
2889
0
                    __s += __n;
2890
3.18k
                traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2891
3.18k
            }
2892
3.18k
            traits_type::move(__p + __pos, __s, __n);
2893
3.18k
            __sz += __n;
2894
3.18k
            __set_size(__sz);
2895
3.18k
            traits_type::assign(__p[__sz], value_type());
2896
3.18k
        }
2897
3.18k
    }
2898
0
    else
2899
0
        __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2900
3.18k
    return *this;
2901
3.18k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::insert(unsigned long, wchar_t const*, unsigned long)
2902
2903
template <class _CharT, class _Traits, class _Allocator>
2904
_LIBCPP_CONSTEXPR_SINCE_CXX20
2905
basic_string<_CharT, _Traits, _Allocator>&
2906
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
2907
0
{
2908
0
    size_type __sz = size();
2909
0
    if (__pos > __sz)
2910
0
        __throw_out_of_range();
2911
0
    if (__n)
2912
0
    {
2913
0
        size_type __cap = capacity();
2914
0
        value_type* __p;
2915
0
        if (__cap - __sz >= __n)
2916
0
        {
2917
0
            __p = std::__to_address(__get_pointer());
2918
0
            size_type __n_move = __sz - __pos;
2919
0
            if (__n_move != 0)
2920
0
                traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2921
0
        }
2922
0
        else
2923
0
        {
2924
0
            __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
2925
0
            __p = std::__to_address(__get_long_pointer());
2926
0
        }
2927
0
        traits_type::assign(__p + __pos, __n, __c);
2928
0
        __sz += __n;
2929
0
        __set_size(__sz);
2930
0
        traits_type::assign(__p[__sz], value_type());
2931
0
    }
2932
0
    return *this;
2933
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::insert(unsigned long, unsigned long, char)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::insert(unsigned long, unsigned long, wchar_t)
2934
2935
template <class _CharT, class _Traits, class _Allocator>
2936
template<class _InputIterator>
2937
_LIBCPP_CONSTEXPR_SINCE_CXX20
2938
__enable_if_t
2939
<
2940
   __is_exactly_cpp17_input_iterator<_InputIterator>::value,
2941
   typename basic_string<_CharT, _Traits, _Allocator>::iterator
2942
>
2943
basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
2944
{
2945
  _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());
2950
}
2951
2952
template <class _CharT, class _Traits, class _Allocator>
2953
template<class _ForwardIterator>
2954
_LIBCPP_CONSTEXPR_SINCE_CXX20
2955
__enable_if_t
2956
<
2957
    __is_cpp17_forward_iterator<_ForwardIterator>::value,
2958
    typename basic_string<_CharT, _Traits, _Allocator>::iterator
2959
>
2960
basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
2961
{
2962
    _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");
2964
2965
    size_type __ip = static_cast<size_type>(__pos - begin());
2966
    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))
2971
    {
2972
        return __insert_from_safe_copy(__n, __ip, __first, __last);
2973
    }
2974
    else
2975
    {
2976
        const basic_string __temp(__first, __last, __alloc());
2977
        return __insert_from_safe_copy(__n, __ip, __temp.begin(), __temp.end());
2978
    }
2979
}
2980
2981
template <class _CharT, class _Traits, class _Allocator>
2982
_LIBCPP_CONSTEXPR_SINCE_CXX20
2983
basic_string<_CharT, _Traits, _Allocator>&
2984
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
2985
                                                  size_type __pos2, size_type __n)
2986
0
{
2987
0
    size_type __str_sz = __str.size();
2988
0
    if (__pos2 > __str_sz)
2989
0
        __throw_out_of_range();
2990
0
    return insert(__pos1, __str.data() + __pos2, std::min(__n, __str_sz - __pos2));
2991
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::insert(unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::insert(unsigned long, std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, unsigned long, unsigned long)
2992
2993
template <class _CharT, class _Traits, class _Allocator>
2994
template <class _Tp>
2995
_LIBCPP_CONSTEXPR_SINCE_CXX20
2996
__enable_if_t
2997
<
2998
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value  && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
2999
    basic_string<_CharT, _Traits, _Allocator>&
3000
>
3001
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const _Tp& __t,
3002
                                                  size_type __pos2, size_type __n)
3003
{
3004
    __self_view __sv = __t;
3005
    size_type __str_sz = __sv.size();
3006
    if (__pos2 > __str_sz)
3007
        __throw_out_of_range();
3008
    return insert(__pos1, __sv.data() + __pos2, std::min(__n, __str_sz - __pos2));
3009
}
3010
3011
template <class _CharT, class _Traits, class _Allocator>
3012
_LIBCPP_CONSTEXPR_SINCE_CXX20
3013
basic_string<_CharT, _Traits, _Allocator>&
3014
basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
3015
3.18k
{
3016
3.18k
    _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
3017
3.18k
    return insert(__pos, __s, traits_type::length(__s));
3018
3.18k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::insert(unsigned long, char const*)
Line
Count
Source
3015
3.18k
{
3016
3.18k
    _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
3017
3.18k
    return insert(__pos, __s, traits_type::length(__s));
3018
3.18k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::insert(unsigned long, wchar_t const*)
3019
3020
template <class _CharT, class _Traits, class _Allocator>
3021
_LIBCPP_CONSTEXPR_SINCE_CXX20
3022
typename basic_string<_CharT, _Traits, _Allocator>::iterator
3023
basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
3024
0
{
3025
0
    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
3026
0
                         "string::insert(iterator, character) called with an iterator not"
3027
0
                         " referring to this string");
3028
3029
0
    size_type __ip = static_cast<size_type>(__pos - begin());
3030
0
    size_type __sz = size();
3031
0
    size_type __cap = capacity();
3032
0
    value_type* __p;
3033
0
    if (__cap == __sz)
3034
0
    {
3035
0
        __grow_by(__cap, 1, __sz, __ip, 0, 1);
3036
0
        __p = std::__to_address(__get_long_pointer());
3037
0
    }
3038
0
    else
3039
0
    {
3040
0
        __p = std::__to_address(__get_pointer());
3041
0
        size_type __n_move = __sz - __ip;
3042
0
        if (__n_move != 0)
3043
0
            traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
3044
0
    }
3045
0
    traits_type::assign(__p[__ip], __c);
3046
0
    traits_type::assign(__p[++__sz], value_type());
3047
0
    __set_size(__sz);
3048
0
    return begin() + static_cast<difference_type>(__ip);
3049
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::insert(std::__1::__wrap_iter<char const*>, char)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::insert(std::__1::__wrap_iter<wchar_t const*>, wchar_t)
3050
3051
// replace
3052
3053
template <class _CharT, class _Traits, class _Allocator>
3054
_LIBCPP_CONSTEXPR_SINCE_CXX20
3055
basic_string<_CharT, _Traits, _Allocator>&
3056
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2)
3057
    _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
3058
0
{
3059
0
    _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
3060
0
    size_type __sz = size();
3061
0
    if (__pos > __sz)
3062
0
        __throw_out_of_range();
3063
0
    __n1 = std::min(__n1, __sz - __pos);
3064
0
    size_type __cap = capacity();
3065
0
    if (__cap - __sz + __n1 >= __n2)
3066
0
    {
3067
0
        if (__libcpp_is_constant_evaluated()) {
3068
0
            __grow_by_and_replace(__cap, 0, __sz, __pos, __n1, __n2, __s);
3069
0
            return *this;
3070
0
        }
3071
0
        value_type* __p = std::__to_address(__get_pointer());
3072
0
        if (__n1 != __n2)
3073
0
        {
3074
0
            size_type __n_move = __sz - __pos - __n1;
3075
0
            if (__n_move != 0)
3076
0
            {
3077
0
                if (__n1 > __n2)
3078
0
                {
3079
0
                    traits_type::move(__p + __pos, __s, __n2);
3080
0
                    traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
3081
0
                    return __null_terminate_at(__p, __sz + (__n2 - __n1));
3082
0
                }
3083
0
                if (__p + __pos < __s && __s < __p + __sz)
3084
0
                {
3085
0
                    if (__p + __pos + __n1 <= __s)
3086
0
                        __s += __n2 - __n1;
3087
0
                    else // __p + __pos < __s < __p + __pos + __n1
3088
0
                    {
3089
0
                        traits_type::move(__p + __pos, __s, __n1);
3090
0
                        __pos += __n1;
3091
0
                        __s += __n2;
3092
0
                        __n2 -= __n1;
3093
0
                        __n1 = 0;
3094
0
                    }
3095
0
                }
3096
0
                traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
3097
0
            }
3098
0
        }
3099
0
        traits_type::move(__p + __pos, __s, __n2);
3100
0
        return __null_terminate_at(__p, __sz + (__n2 - __n1));
3101
0
    }
3102
0
    else
3103
0
        __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
3104
0
    return *this;
3105
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::replace(unsigned long, unsigned long, char const*, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::replace(unsigned long, unsigned long, wchar_t const*, unsigned long)
3106
3107
template <class _CharT, class _Traits, class _Allocator>
3108
_LIBCPP_CONSTEXPR_SINCE_CXX20
3109
basic_string<_CharT, _Traits, _Allocator>&
3110
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
3111
0
{
3112
0
    size_type __sz = size();
3113
0
    if (__pos > __sz)
3114
0
        __throw_out_of_range();
3115
0
    __n1 = std::min(__n1, __sz - __pos);
3116
0
    size_type __cap = capacity();
3117
0
    value_type* __p;
3118
0
    if (__cap - __sz + __n1 >= __n2)
3119
0
    {
3120
0
        __p = std::__to_address(__get_pointer());
3121
0
        if (__n1 != __n2)
3122
0
        {
3123
0
            size_type __n_move = __sz - __pos - __n1;
3124
0
            if (__n_move != 0)
3125
0
                traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
3126
0
        }
3127
0
    }
3128
0
    else
3129
0
    {
3130
0
        __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
3131
0
        __p = std::__to_address(__get_long_pointer());
3132
0
    }
3133
0
    traits_type::assign(__p + __pos, __n2, __c);
3134
0
    return __null_terminate_at(__p, __sz - (__n1 - __n2));
3135
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::replace(unsigned long, unsigned long, unsigned long, char)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::replace(unsigned long, unsigned long, unsigned long, wchar_t)
3136
3137
template <class _CharT, class _Traits, class _Allocator>
3138
template<class _InputIterator>
3139
_LIBCPP_CONSTEXPR_SINCE_CXX20
3140
__enable_if_t
3141
<
3142
    __is_cpp17_input_iterator<_InputIterator>::value,
3143
    basic_string<_CharT, _Traits, _Allocator>&
3144
>
3145
basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
3146
                                                   _InputIterator __j1, _InputIterator __j2)
3147
{
3148
    const basic_string __temp(__j1, __j2, __alloc());
3149
    return replace(__i1, __i2, __temp);
3150
}
3151
3152
template <class _CharT, class _Traits, class _Allocator>
3153
_LIBCPP_CONSTEXPR_SINCE_CXX20
3154
basic_string<_CharT, _Traits, _Allocator>&
3155
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
3156
                                                   size_type __pos2, size_type __n2)
3157
0
{
3158
0
    size_type __str_sz = __str.size();
3159
0
    if (__pos2 > __str_sz)
3160
0
        __throw_out_of_range();
3161
0
    return replace(__pos1, __n1, __str.data() + __pos2, std::min(__n2, __str_sz - __pos2));
3162
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::replace(unsigned long, unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::replace(unsigned long, unsigned long, std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, unsigned long, unsigned long)
3163
3164
template <class _CharT, class _Traits, class _Allocator>
3165
template <class _Tp>
3166
_LIBCPP_CONSTEXPR_SINCE_CXX20
3167
__enable_if_t
3168
<
3169
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
3170
    basic_string<_CharT, _Traits, _Allocator>&
3171
>
3172
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const _Tp& __t,
3173
                                                   size_type __pos2, size_type __n2)
3174
{
3175
    __self_view __sv = __t;
3176
    size_type __str_sz = __sv.size();
3177
    if (__pos2 > __str_sz)
3178
        __throw_out_of_range();
3179
    return replace(__pos1, __n1, __sv.data() + __pos2, std::min(__n2, __str_sz - __pos2));
3180
}
3181
3182
template <class _CharT, class _Traits, class _Allocator>
3183
_LIBCPP_CONSTEXPR_SINCE_CXX20
3184
basic_string<_CharT, _Traits, _Allocator>&
3185
basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
3186
0
{
3187
0
    _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr");
3188
0
    return replace(__pos, __n1, __s, traits_type::length(__s));
3189
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::replace(unsigned long, unsigned long, char const*)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::replace(unsigned long, unsigned long, wchar_t const*)
3190
3191
// erase
3192
3193
// 'externally instantiated' erase() implementation, called when __n != npos.
3194
// Does not check __pos against size()
3195
template <class _CharT, class _Traits, class _Allocator>
3196
_LIBCPP_CONSTEXPR_SINCE_CXX20
3197
void
3198
basic_string<_CharT, _Traits, _Allocator>::__erase_external_with_move(
3199
    size_type __pos, size_type __n)
3200
0
{
3201
0
    if (__n)
3202
0
    {
3203
0
        size_type __sz = size();
3204
0
        value_type* __p = std::__to_address(__get_pointer());
3205
0
        __n = std::min(__n, __sz - __pos);
3206
0
        size_type __n_move = __sz - __pos - __n;
3207
0
        if (__n_move != 0)
3208
0
            traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
3209
0
        __null_terminate_at(__p, __sz - __n);
3210
0
    }
3211
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__erase_external_with_move(unsigned long, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__erase_external_with_move(unsigned long, unsigned long)
3212
3213
template <class _CharT, class _Traits, class _Allocator>
3214
_LIBCPP_CONSTEXPR_SINCE_CXX20
3215
basic_string<_CharT, _Traits, _Allocator>&
3216
basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos,
3217
0
                                                 size_type __n) {
3218
0
  if (__pos > size())
3219
0
    __throw_out_of_range();
3220
0
  if (__n == npos) {
3221
0
    __erase_to_end(__pos);
3222
0
  } else {
3223
0
    __erase_external_with_move(__pos, __n);
3224
0
  }
3225
0
  return *this;
3226
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::erase(unsigned long, unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::erase(unsigned long, unsigned long)
3227
3228
template <class _CharT, class _Traits, class _Allocator>
3229
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3230
typename basic_string<_CharT, _Traits, _Allocator>::iterator
3231
basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
3232
0
{
3233
0
  _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
3234
0
                       "string::erase(iterator) called with an iterator not"
3235
0
                       " referring to this string");
3236
3237
0
  _LIBCPP_ASSERT(__pos != end(), "string::erase(iterator) called with a non-dereferenceable iterator");
3238
0
  iterator __b = begin();
3239
0
  size_type __r = static_cast<size_type>(__pos - __b);
3240
0
  erase(__r, 1);
3241
0
  return __b + static_cast<difference_type>(__r);
3242
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::erase[abi:v160006](std::__1::__wrap_iter<char const*>)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::erase[abi:v160006](std::__1::__wrap_iter<wchar_t const*>)
3243
3244
template <class _CharT, class _Traits, class _Allocator>
3245
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3246
typename basic_string<_CharT, _Traits, _Allocator>::iterator
3247
basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
3248
{
3249
  _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);
3258
}
3259
3260
template <class _CharT, class _Traits, class _Allocator>
3261
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3262
void
3263
basic_string<_CharT, _Traits, _Allocator>::pop_back()
3264
0
{
3265
0
    _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty");
3266
0
    __erase_to_end(size() - 1);
3267
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::pop_back[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::pop_back[abi:v160006]()
3268
3269
template <class _CharT, class _Traits, class _Allocator>
3270
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3271
void
3272
basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
3273
0
{
3274
0
    std::__debug_db_invalidate_all(this);
3275
0
    if (__is_long())
3276
0
    {
3277
0
        traits_type::assign(*__get_long_pointer(), value_type());
3278
0
        __set_long_size(0);
3279
0
    }
3280
0
    else
3281
0
    {
3282
0
        traits_type::assign(*__get_short_pointer(), value_type());
3283
0
        __set_short_size(0);
3284
0
    }
3285
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::clear[abi:v160006]()
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::clear[abi:v160006]()
3286
3287
template <class _CharT, class _Traits, class _Allocator>
3288
_LIBCPP_CONSTEXPR_SINCE_CXX20
3289
void
3290
basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
3291
9.81k
{
3292
9.81k
    size_type __sz = size();
3293
9.81k
    if (__n > __sz)
3294
9.81k
        append(__n - __sz, __c);
3295
0
    else
3296
0
        __erase_to_end(__n);
3297
9.81k
}
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::resize(unsigned long, char)
Line
Count
Source
3291
9.81k
{
3292
9.81k
    size_type __sz = size();
3293
9.81k
    if (__n > __sz)
3294
9.81k
        append(__n - __sz, __c);
3295
0
    else
3296
0
        __erase_to_end(__n);
3297
9.81k
}
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::resize(unsigned long, wchar_t)
3298
3299
template <class _CharT, class _Traits, class _Allocator>
3300
_LIBCPP_CONSTEXPR_SINCE_CXX20 inline void
3301
basic_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
3310
template <class _CharT, class _Traits, class _Allocator>
3311
_LIBCPP_CONSTEXPR_SINCE_CXX20
3312
void
3313
basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __requested_capacity)
3314
0
{
3315
0
    if (__requested_capacity > max_size())
3316
0
        __throw_length_error();
3317
3318
    // 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
0
    if (__requested_capacity <= capacity())
3322
0
        return;
3323
3324
0
    size_type __target_capacity = std::max(__requested_capacity, size());
3325
0
    __target_capacity = __recommend(__target_capacity);
3326
0
    if (__target_capacity == capacity()) return;
3327
3328
0
    __shrink_or_extend(__target_capacity);
3329
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::reserve(unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::reserve(unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::reserve(unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::reserve(unsigned long)
3330
3331
template <class _CharT, class _Traits, class _Allocator>
3332
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3333
void
3334
basic_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
3342
template <class _CharT, class _Traits, class _Allocator>
3343
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3344
void
3345
basic_string<_CharT, _Traits, _Allocator>::__shrink_or_extend(size_type __target_capacity)
3346
0
{
3347
0
    size_type __cap = capacity();
3348
0
    size_type __sz = size();
3349
3350
0
    pointer __new_data, __p;
3351
0
    bool __was_long, __now_long;
3352
0
    if (__fits_in_sso(__target_capacity))
3353
0
    {
3354
0
        __was_long = true;
3355
0
        __now_long = false;
3356
0
        __new_data = __get_short_pointer();
3357
0
        __p = __get_long_pointer();
3358
0
    }
3359
0
    else
3360
0
    {
3361
0
        if (__target_capacity > __cap) {
3362
0
            auto __allocation = std::__allocate_at_least(__alloc(), __target_capacity + 1);
3363
0
            __new_data = __allocation.ptr;
3364
0
            __target_capacity = __allocation.count - 1;
3365
0
        }
3366
0
        else
3367
0
        {
3368
0
        #ifndef _LIBCPP_NO_EXCEPTIONS
3369
0
            try
3370
0
            {
3371
0
        #endif // _LIBCPP_NO_EXCEPTIONS
3372
0
                auto __allocation = std::__allocate_at_least(__alloc(), __target_capacity + 1);
3373
0
                __new_data = __allocation.ptr;
3374
0
                __target_capacity = __allocation.count - 1;
3375
0
        #ifndef _LIBCPP_NO_EXCEPTIONS
3376
0
            }
3377
0
            catch (...)
3378
0
            {
3379
0
                return;
3380
0
            }
3381
        #else  // _LIBCPP_NO_EXCEPTIONS
3382
            if (__new_data == nullptr)
3383
                return;
3384
        #endif // _LIBCPP_NO_EXCEPTIONS
3385
0
        }
3386
0
        __begin_lifetime(__new_data, __target_capacity + 1);
3387
0
        __now_long = true;
3388
0
        __was_long = __is_long();
3389
0
        __p = __get_pointer();
3390
0
    }
3391
0
    traits_type::copy(std::__to_address(__new_data),
3392
0
                      std::__to_address(__p), size()+1);
3393
0
    if (__was_long)
3394
0
        __alloc_traits::deallocate(__alloc(), __p, __cap+1);
3395
0
    if (__now_long)
3396
0
    {
3397
0
        __set_long_cap(__target_capacity+1);
3398
0
        __set_long_size(__sz);
3399
0
        __set_long_pointer(__new_data);
3400
0
    }
3401
0
    else
3402
0
        __set_short_size(__sz);
3403
0
    std::__debug_db_invalidate_all(this);
3404
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__shrink_or_extend[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::__shrink_or_extend[abi:v160006](unsigned long)
Unexecuted instantiation: std::__1::basic_string<char16_t, std::__1::char_traits<char16_t>, std::__1::allocator<char16_t> >::__shrink_or_extend(unsigned long)
Unexecuted instantiation: std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> >::__shrink_or_extend(unsigned long)
3405
3406
template <class _CharT, class _Traits, class _Allocator>
3407
_LIBCPP_CONSTEXPR_SINCE_CXX20
3408
typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3409
basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
3410
0
{
3411
0
    if (__n >= size())
3412
0
        __throw_out_of_range();
3413
0
    return (*this)[__n];
3414
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::at(unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::at(unsigned long) const
3415
3416
template <class _CharT, class _Traits, class _Allocator>
3417
_LIBCPP_CONSTEXPR_SINCE_CXX20
3418
typename basic_string<_CharT, _Traits, _Allocator>::reference
3419
basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
3420
0
{
3421
0
    if (__n >= size())
3422
0
        __throw_out_of_range();
3423
0
    return (*this)[__n];
3424
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::at(unsigned long)
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::at(unsigned long)
3425
3426
template <class _CharT, class _Traits, class _Allocator>
3427
_LIBCPP_CONSTEXPR_SINCE_CXX20
3428
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3429
basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
3430
0
{
3431
0
    size_type __sz = size();
3432
0
    if (__pos > __sz)
3433
0
        __throw_out_of_range();
3434
0
    size_type __rlen = std::min(__n, __sz - __pos);
3435
0
    traits_type::copy(__s, data() + __pos, __rlen);
3436
0
    return __rlen;
3437
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::copy(char*, unsigned long, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::copy(wchar_t*, unsigned long, unsigned long) const
3438
3439
template <class _CharT, class _Traits, class _Allocator>
3440
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3441
void
3442
basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
3443
#if _LIBCPP_STD_VER >= 14
3444
        _NOEXCEPT
3445
#else
3446
        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3447
                    __is_nothrow_swappable<allocator_type>::value)
3448
#endif
3449
0
{
3450
0
    if (!__is_long())
3451
0
        std::__debug_db_invalidate_all(this);
3452
0
    if (!__str.__is_long())
3453
0
        std::__debug_db_invalidate_all(&__str);
3454
0
    std::__debug_db_swap(this, &__str);
3455
3456
0
    _LIBCPP_ASSERT(
3457
0
        __alloc_traits::propagate_on_container_swap::value ||
3458
0
        __alloc_traits::is_always_equal::value ||
3459
0
        __alloc() == __str.__alloc(), "swapping non-equal allocators");
3460
0
    std::swap(__r_.first(), __str.__r_.first());
3461
0
    std::__swap_allocator(__alloc(), __str.__alloc());
3462
0
}
3463
3464
// find
3465
3466
template <class _Traits>
3467
struct _LIBCPP_HIDDEN __traits_eq
3468
{
3469
    typedef typename _Traits::char_type char_type;
3470
    _LIBCPP_HIDE_FROM_ABI
3471
    bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
3472
        {return _Traits::eq(__x, __y);}
3473
};
3474
3475
template<class _CharT, class _Traits, class _Allocator>
3476
_LIBCPP_CONSTEXPR_SINCE_CXX20
3477
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3478
basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
3479
                                                size_type __pos,
3480
                                                size_type __n) const _NOEXCEPT
3481
0
{
3482
0
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr");
3483
0
    return std::__str_find<value_type, size_type, traits_type, npos>
3484
0
        (data(), size(), __s, __pos, __n);
3485
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find(char const*, unsigned long, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const
3486
3487
template<class _CharT, class _Traits, class _Allocator>
3488
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3489
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3490
basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
3491
                                                size_type __pos) const _NOEXCEPT
3492
{
3493
    return std::__str_find<value_type, size_type, traits_type, npos>
3494
        (data(), size(), __str.data(), __pos, __str.size());
3495
}
3496
3497
template<class _CharT, class _Traits, class _Allocator>
3498
template <class _Tp>
3499
_LIBCPP_CONSTEXPR_SINCE_CXX20
3500
__enable_if_t
3501
<
3502
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3503
    typename basic_string<_CharT, _Traits, _Allocator>::size_type
3504
>
3505
basic_string<_CharT, _Traits, _Allocator>::find(const _Tp &__t,
3506
                                                size_type __pos) const _NOEXCEPT
3507
{
3508
    __self_view __sv = __t;
3509
    return std::__str_find<value_type, size_type, traits_type, npos>
3510
        (data(), size(), __sv.data(), __pos, __sv.size());
3511
}
3512
3513
template<class _CharT, class _Traits, class _Allocator>
3514
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3515
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3516
basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
3517
                                                size_type __pos) const _NOEXCEPT
3518
{
3519
    _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr");
3520
    return std::__str_find<value_type, size_type, traits_type, npos>
3521
        (data(), size(), __s, __pos, traits_type::length(__s));
3522
}
3523
3524
template<class _CharT, class _Traits, class _Allocator>
3525
_LIBCPP_CONSTEXPR_SINCE_CXX20
3526
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3527
basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
3528
                                                size_type __pos) const _NOEXCEPT
3529
0
{
3530
0
    return std::__str_find<value_type, size_type, traits_type, npos>
3531
0
        (data(), size(), __c, __pos);
3532
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find(char, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::find(wchar_t, unsigned long) const
3533
3534
// rfind
3535
3536
template<class _CharT, class _Traits, class _Allocator>
3537
_LIBCPP_CONSTEXPR_SINCE_CXX20
3538
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3539
basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
3540
                                                 size_type __pos,
3541
                                                 size_type __n) const _NOEXCEPT
3542
0
{
3543
0
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr");
3544
0
    return std::__str_rfind<value_type, size_type, traits_type, npos>
3545
0
        (data(), size(), __s, __pos, __n);
3546
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::rfind(char const*, unsigned long, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::rfind(wchar_t const*, unsigned long, unsigned long) const
3547
3548
template<class _CharT, class _Traits, class _Allocator>
3549
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3550
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3551
basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
3552
                                                 size_type __pos) const _NOEXCEPT
3553
{
3554
    return std::__str_rfind<value_type, size_type, traits_type, npos>
3555
        (data(), size(), __str.data(), __pos, __str.size());
3556
}
3557
3558
template<class _CharT, class _Traits, class _Allocator>
3559
template <class _Tp>
3560
_LIBCPP_CONSTEXPR_SINCE_CXX20
3561
__enable_if_t
3562
<
3563
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3564
    typename basic_string<_CharT, _Traits, _Allocator>::size_type
3565
>
3566
basic_string<_CharT, _Traits, _Allocator>::rfind(const _Tp& __t,
3567
                                                size_type __pos) const _NOEXCEPT
3568
{
3569
    __self_view __sv = __t;
3570
    return std::__str_rfind<value_type, size_type, traits_type, npos>
3571
        (data(), size(), __sv.data(), __pos, __sv.size());
3572
}
3573
3574
template<class _CharT, class _Traits, class _Allocator>
3575
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3576
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3577
basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
3578
                                                 size_type __pos) const _NOEXCEPT
3579
{
3580
    _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr");
3581
    return std::__str_rfind<value_type, size_type, traits_type, npos>
3582
        (data(), size(), __s, __pos, traits_type::length(__s));
3583
}
3584
3585
template<class _CharT, class _Traits, class _Allocator>
3586
_LIBCPP_CONSTEXPR_SINCE_CXX20
3587
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3588
basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
3589
                                                 size_type __pos) const _NOEXCEPT
3590
0
{
3591
0
    return std::__str_rfind<value_type, size_type, traits_type, npos>
3592
0
        (data(), size(), __c, __pos);
3593
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::rfind(char, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::rfind(wchar_t, unsigned long) const
3594
3595
// find_first_of
3596
3597
template<class _CharT, class _Traits, class _Allocator>
3598
_LIBCPP_CONSTEXPR_SINCE_CXX20
3599
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3600
basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
3601
                                                         size_type __pos,
3602
                                                         size_type __n) const _NOEXCEPT
3603
0
{
3604
0
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr");
3605
0
    return std::__str_find_first_of<value_type, size_type, traits_type, npos>
3606
0
        (data(), size(), __s, __pos, __n);
3607
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find_first_of(char const*, unsigned long, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::find_first_of(wchar_t const*, unsigned long, unsigned long) const
3608
3609
template<class _CharT, class _Traits, class _Allocator>
3610
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3611
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3612
basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
3613
                                                         size_type __pos) const _NOEXCEPT
3614
{
3615
    return std::__str_find_first_of<value_type, size_type, traits_type, npos>
3616
        (data(), size(), __str.data(), __pos, __str.size());
3617
}
3618
3619
template<class _CharT, class _Traits, class _Allocator>
3620
template <class _Tp>
3621
_LIBCPP_CONSTEXPR_SINCE_CXX20
3622
__enable_if_t
3623
<
3624
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3625
    typename basic_string<_CharT, _Traits, _Allocator>::size_type
3626
>
3627
basic_string<_CharT, _Traits, _Allocator>::find_first_of(const _Tp& __t,
3628
                                                size_type __pos) const _NOEXCEPT
3629
{
3630
    __self_view __sv = __t;
3631
    return std::__str_find_first_of<value_type, size_type, traits_type, npos>
3632
        (data(), size(), __sv.data(), __pos, __sv.size());
3633
}
3634
3635
template<class _CharT, class _Traits, class _Allocator>
3636
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3637
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3638
basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
3639
                                                         size_type __pos) const _NOEXCEPT
3640
{
3641
    _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr");
3642
    return std::__str_find_first_of<value_type, size_type, traits_type, npos>
3643
        (data(), size(), __s, __pos, traits_type::length(__s));
3644
}
3645
3646
template<class _CharT, class _Traits, class _Allocator>
3647
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3648
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3649
basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
3650
                                                         size_type __pos) const _NOEXCEPT
3651
{
3652
    return find(__c, __pos);
3653
}
3654
3655
// find_last_of
3656
3657
template<class _CharT, class _Traits, class _Allocator>
3658
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3659
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3660
basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
3661
                                                        size_type __pos,
3662
                                                        size_type __n) const _NOEXCEPT
3663
0
{
3664
0
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr");
3665
0
    return std::__str_find_last_of<value_type, size_type, traits_type, npos>
3666
0
        (data(), size(), __s, __pos, __n);
3667
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find_last_of(char const*, unsigned long, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::find_last_of(wchar_t const*, unsigned long, unsigned long) const
3668
3669
template<class _CharT, class _Traits, class _Allocator>
3670
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3671
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3672
basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
3673
                                                        size_type __pos) const _NOEXCEPT
3674
{
3675
    return std::__str_find_last_of<value_type, size_type, traits_type, npos>
3676
        (data(), size(), __str.data(), __pos, __str.size());
3677
}
3678
3679
template<class _CharT, class _Traits, class _Allocator>
3680
template <class _Tp>
3681
_LIBCPP_CONSTEXPR_SINCE_CXX20
3682
__enable_if_t
3683
<
3684
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3685
    typename basic_string<_CharT, _Traits, _Allocator>::size_type
3686
>
3687
basic_string<_CharT, _Traits, _Allocator>::find_last_of(const _Tp& __t,
3688
                                                size_type __pos) const _NOEXCEPT
3689
{
3690
    __self_view __sv = __t;
3691
    return std::__str_find_last_of<value_type, size_type, traits_type, npos>
3692
        (data(), size(), __sv.data(), __pos, __sv.size());
3693
}
3694
3695
template<class _CharT, class _Traits, class _Allocator>
3696
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3697
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3698
basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
3699
                                                        size_type __pos) const _NOEXCEPT
3700
{
3701
    _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr");
3702
    return std::__str_find_last_of<value_type, size_type, traits_type, npos>
3703
        (data(), size(), __s, __pos, traits_type::length(__s));
3704
}
3705
3706
template<class _CharT, class _Traits, class _Allocator>
3707
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3708
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3709
basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
3710
                                                        size_type __pos) const _NOEXCEPT
3711
{
3712
    return rfind(__c, __pos);
3713
}
3714
3715
// find_first_not_of
3716
3717
template<class _CharT, class _Traits, class _Allocator>
3718
_LIBCPP_CONSTEXPR_SINCE_CXX20
3719
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3720
basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
3721
                                                             size_type __pos,
3722
                                                             size_type __n) const _NOEXCEPT
3723
0
{
3724
0
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr");
3725
0
    return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
3726
0
        (data(), size(), __s, __pos, __n);
3727
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find_first_not_of(char const*, unsigned long, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::find_first_not_of(wchar_t const*, unsigned long, unsigned long) const
3728
3729
template<class _CharT, class _Traits, class _Allocator>
3730
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3731
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3732
basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
3733
                                                             size_type __pos) const _NOEXCEPT
3734
{
3735
    return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
3736
        (data(), size(), __str.data(), __pos, __str.size());
3737
}
3738
3739
template<class _CharT, class _Traits, class _Allocator>
3740
template <class _Tp>
3741
_LIBCPP_CONSTEXPR_SINCE_CXX20
3742
__enable_if_t
3743
<
3744
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3745
    typename basic_string<_CharT, _Traits, _Allocator>::size_type
3746
>
3747
basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const _Tp& __t,
3748
                                                size_type __pos) const _NOEXCEPT
3749
{
3750
    __self_view __sv = __t;
3751
    return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
3752
        (data(), size(), __sv.data(), __pos, __sv.size());
3753
}
3754
3755
template<class _CharT, class _Traits, class _Allocator>
3756
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3757
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3758
basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
3759
                                                             size_type __pos) const _NOEXCEPT
3760
{
3761
    _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr");
3762
    return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
3763
        (data(), size(), __s, __pos, traits_type::length(__s));
3764
}
3765
3766
template<class _CharT, class _Traits, class _Allocator>
3767
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3768
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3769
basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
3770
                                                             size_type __pos) const _NOEXCEPT
3771
{
3772
    return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>
3773
        (data(), size(), __c, __pos);
3774
}
3775
3776
// find_last_not_of
3777
3778
template<class _CharT, class _Traits, class _Allocator>
3779
_LIBCPP_CONSTEXPR_SINCE_CXX20
3780
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3781
basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
3782
                                                            size_type __pos,
3783
                                                            size_type __n) const _NOEXCEPT
3784
0
{
3785
0
    _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr");
3786
0
    return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
3787
0
        (data(), size(), __s, __pos, __n);
3788
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find_last_not_of(char const*, unsigned long, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::find_last_not_of(wchar_t const*, unsigned long, unsigned long) const
3789
3790
template<class _CharT, class _Traits, class _Allocator>
3791
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3792
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3793
basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
3794
                                                            size_type __pos) const _NOEXCEPT
3795
{
3796
    return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
3797
        (data(), size(), __str.data(), __pos, __str.size());
3798
}
3799
3800
template<class _CharT, class _Traits, class _Allocator>
3801
template <class _Tp>
3802
_LIBCPP_CONSTEXPR_SINCE_CXX20
3803
__enable_if_t
3804
<
3805
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3806
    typename basic_string<_CharT, _Traits, _Allocator>::size_type
3807
>
3808
basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const _Tp& __t,
3809
                                                size_type __pos) const _NOEXCEPT
3810
{
3811
    __self_view __sv = __t;
3812
    return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
3813
        (data(), size(), __sv.data(), __pos, __sv.size());
3814
}
3815
3816
template<class _CharT, class _Traits, class _Allocator>
3817
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3818
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3819
basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
3820
                                                            size_type __pos) const _NOEXCEPT
3821
{
3822
    _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr");
3823
    return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
3824
        (data(), size(), __s, __pos, traits_type::length(__s));
3825
}
3826
3827
template<class _CharT, class _Traits, class _Allocator>
3828
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3829
typename basic_string<_CharT, _Traits, _Allocator>::size_type
3830
basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
3831
                                                            size_type __pos) const _NOEXCEPT
3832
{
3833
    return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>
3834
        (data(), size(), __c, __pos);
3835
}
3836
3837
// compare
3838
3839
template <class _CharT, class _Traits, class _Allocator>
3840
template <class _Tp>
3841
_LIBCPP_CONSTEXPR_SINCE_CXX20
3842
__enable_if_t
3843
<
3844
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3845
    int
3846
>
3847
basic_string<_CharT, _Traits, _Allocator>::compare(const _Tp& __t) const _NOEXCEPT
3848
{
3849
    __self_view __sv = __t;
3850
    size_t __lhs_sz = size();
3851
    size_t __rhs_sz = __sv.size();
3852
    int __result = traits_type::compare(data(), __sv.data(),
3853
                                        std::min(__lhs_sz, __rhs_sz));
3854
    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;
3861
}
3862
3863
template <class _CharT, class _Traits, class _Allocator>
3864
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3865
int
3866
basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
3867
{
3868
    return compare(__self_view(__str));
3869
}
3870
3871
template <class _CharT, class _Traits, class _Allocator>
3872
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3873
int
3874
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3875
                                                   size_type __n1,
3876
                                                   const value_type* __s,
3877
                                                   size_type __n2) const
3878
0
{
3879
0
    _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr");
3880
0
    size_type __sz = size();
3881
0
    if (__pos1 > __sz || __n2 == npos)
3882
0
        __throw_out_of_range();
3883
0
    size_type __rlen = std::min(__n1, __sz - __pos1);
3884
0
    int __r = traits_type::compare(data() + __pos1, __s, std::min(__rlen, __n2));
3885
0
    if (__r == 0)
3886
0
    {
3887
0
        if (__rlen < __n2)
3888
0
            __r = -1;
3889
0
        else if (__rlen > __n2)
3890
0
            __r = 1;
3891
0
    }
3892
0
    return __r;
3893
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(unsigned long, unsigned long, char const*, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::compare(unsigned long, unsigned long, wchar_t const*, unsigned long) const
3894
3895
template <class _CharT, class _Traits, class _Allocator>
3896
template <class _Tp>
3897
_LIBCPP_CONSTEXPR_SINCE_CXX20
3898
__enable_if_t
3899
<
3900
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
3901
    int
3902
>
3903
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3904
                                                   size_type __n1,
3905
                                                   const _Tp& __t) const
3906
{
3907
    __self_view __sv = __t;
3908
    return compare(__pos1, __n1, __sv.data(), __sv.size());
3909
}
3910
3911
template <class _CharT, class _Traits, class _Allocator>
3912
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3913
int
3914
basic_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
3921
template <class _CharT, class _Traits, class _Allocator>
3922
template <class _Tp>
3923
_LIBCPP_CONSTEXPR_SINCE_CXX20
3924
__enable_if_t
3925
<
3926
    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value
3927
    && !__is_same_uncvref<_Tp, basic_string<_CharT, _Traits, _Allocator> >::value,
3928
    int
3929
>
3930
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3931
                                                   size_type __n1,
3932
                                                   const _Tp& __t,
3933
                                                   size_type __pos2,
3934
                                                   size_type __n2) const
3935
0
{
3936
0
    __self_view __sv = __t;
3937
0
    return __self_view(*this).substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
3938
0
}
Unexecuted instantiation: _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareB7v160006INS_17basic_string_viewIcS2_EEEENS_9enable_ifIXaasr33__can_be_converted_to_string_viewIcS2_T_EE5valuentsr17__is_same_uncvrefISA_S5_EE5valueEiE4typeEmmRKSA_mm
Unexecuted instantiation: _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7compareB7v160006INS_17basic_string_viewIwS2_EEEENS_9enable_ifIXaasr33__can_be_converted_to_string_viewIwS2_T_EE5valuentsr17__is_same_uncvrefISA_S5_EE5valueEiE4typeEmmRKSA_mm
3939
3940
template <class _CharT, class _Traits, class _Allocator>
3941
_LIBCPP_CONSTEXPR_SINCE_CXX20
3942
int
3943
basic_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
0
{
3949
0
    return compare(__pos1, __n1, __self_view(__str), __pos2, __n2);
3950
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(unsigned long, unsigned long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::compare(unsigned long, unsigned long, std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, unsigned long, unsigned long) const
3951
3952
template <class _CharT, class _Traits, class _Allocator>
3953
_LIBCPP_CONSTEXPR_SINCE_CXX20
3954
int
3955
basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
3956
0
{
3957
0
    _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
3958
0
    return compare(0, npos, __s, traits_type::length(__s));
3959
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(char const*) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::compare(wchar_t const*) const
3960
3961
template <class _CharT, class _Traits, class _Allocator>
3962
_LIBCPP_CONSTEXPR_SINCE_CXX20
3963
int
3964
basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3965
                                                   size_type __n1,
3966
                                                   const value_type* __s) const
3967
0
{
3968
0
    _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
3969
0
    return compare(__pos1, __n1, __s, traits_type::length(__s));
3970
0
}
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(unsigned long, unsigned long, char const*) const
Unexecuted instantiation: std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >::compare(unsigned long, unsigned long, wchar_t const*) const
3971
3972
// __invariants
3973
3974
template<class _CharT, class _Traits, class _Allocator>
3975
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3976
bool
3977
basic_string<_CharT, _Traits, _Allocator>::__invariants() const
3978
{
3979
    if (size() > capacity())
3980
        return false;
3981
    if (capacity() < __min_cap - 1)
3982
        return false;
3983
    if (data() == nullptr)
3984
        return false;
3985
    if (data()[size()] != value_type())
3986
        return false;
3987
    return true;
3988
}
3989
3990
// __clear_and_shrink
3991
3992
template<class _CharT, class _Traits, class _Allocator>
3993
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
3994
void
3995
basic_string<_CharT, _Traits, _Allocator>::__clear_and_shrink() _NOEXCEPT
3996
{
3997
    clear();
3998
    if(__is_long())
3999
    {
4000
        __alloc_traits::deallocate(__alloc(), __get_long_pointer(), capacity() + 1);
4001
        __default_init();
4002
    }
4003
}
4004
4005
// operator==
4006
4007
template<class _CharT, class _Traits, class _Allocator>
4008
inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
4009
bool
4010
operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4011
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4012
{
4013
#if _LIBCPP_STD_VER > 17
4014
    return basic_string_view<_CharT, _Traits>(__lhs) == basic_string_view<_CharT, _Traits>(__rhs);
4015
#else
4016
    size_t __lhs_sz = __lhs.size();
4017
    return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(),
4018
                                                        __rhs.data(),
4019
                                                        __lhs_sz) == 0;
4020
#endif
4021
}
4022
4023
template<class _Allocator>
4024
inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
4025
bool
4026
operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
4027
           const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT
4028
0
{
4029
0
    size_t __lhs_sz = __lhs.size();
4030
0
    if (__lhs_sz != __rhs.size())
4031
0
        return false;
4032
0
    const char* __lp = __lhs.data();
4033
0
    const char* __rp = __rhs.data();
4034
0
    if (__lhs.__is_long())
4035
0
        return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
4036
0
    for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
4037
0
        if (*__lp != *__rp)
4038
0
            return false;
4039
0
    return true;
4040
0
}
4041
4042
#if _LIBCPP_STD_VER <= 17
4043
template<class _CharT, class _Traits, class _Allocator>
4044
inline _LIBCPP_HIDE_FROM_ABI
4045
bool
4046
operator==(const _CharT* __lhs,
4047
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4048
{
4049
    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;
4054
}
4055
#endif // _LIBCPP_STD_VER <= 17
4056
4057
template<class _CharT, class _Traits, class _Allocator>
4058
inline _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
4059
bool
4060
operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
4061
           const _CharT* __rhs) _NOEXCEPT
4062
639k
{
4063
639k
#if _LIBCPP_STD_VER > 17
4064
639k
    return basic_string_view<_CharT, _Traits>(__lhs) == basic_string_view<_CharT, _Traits>(__rhs);
4065
#else
4066
    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;
4071
#endif
4072
639k
}
4073
4074
#if _LIBCPP_STD_VER > 17
4075
4076
template <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
4083
template <class _CharT, class _Traits, class _Allocator>
4084
_LIBCPP_HIDE_FROM_ABI constexpr auto
4085
operator<=>(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
4091
template<class _CharT, class _Traits, class _Allocator>
4092
inline _LIBCPP_HIDE_FROM_ABI
4093
bool
4094
operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
4095
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4096
{
4097
    return !(__lhs == __rhs);
4098
}
4099
4100
template<class _CharT, class _Traits, class _Allocator>
4101
inline _LIBCPP_HIDE_FROM_ABI
4102
bool
4103
operator!=(const _CharT* __lhs,
4104
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4105
{
4106
    return !(__lhs == __rhs);
4107
}
4108
4109
template<class _CharT, class _Traits, class _Allocator>
4110
inline _LIBCPP_HIDE_FROM_ABI
4111
bool
4112
operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4113
           const _CharT* __rhs) _NOEXCEPT
4114
{
4115
    return !(__lhs == __rhs);
4116
}
4117
4118
// operator<
4119
4120
template<class _CharT, class _Traits, class _Allocator>
4121
inline _LIBCPP_HIDE_FROM_ABI
4122
bool
4123
operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4124
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4125
{
4126
    return __lhs.compare(__rhs) < 0;
4127
}
4128
4129
template<class _CharT, class _Traits, class _Allocator>
4130
inline _LIBCPP_HIDE_FROM_ABI
4131
bool
4132
operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4133
           const _CharT* __rhs) _NOEXCEPT
4134
{
4135
    return __lhs.compare(__rhs) < 0;
4136
}
4137
4138
template<class _CharT, class _Traits, class _Allocator>
4139
inline _LIBCPP_HIDE_FROM_ABI
4140
bool
4141
operator< (const _CharT* __lhs,
4142
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4143
{
4144
    return __rhs.compare(__lhs) > 0;
4145
}
4146
4147
// operator>
4148
4149
template<class _CharT, class _Traits, class _Allocator>
4150
inline _LIBCPP_HIDE_FROM_ABI
4151
bool
4152
operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4153
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4154
{
4155
    return __rhs < __lhs;
4156
}
4157
4158
template<class _CharT, class _Traits, class _Allocator>
4159
inline _LIBCPP_HIDE_FROM_ABI
4160
bool
4161
operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4162
           const _CharT* __rhs) _NOEXCEPT
4163
{
4164
    return __rhs < __lhs;
4165
}
4166
4167
template<class _CharT, class _Traits, class _Allocator>
4168
inline _LIBCPP_HIDE_FROM_ABI
4169
bool
4170
operator> (const _CharT* __lhs,
4171
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4172
{
4173
    return __rhs < __lhs;
4174
}
4175
4176
// operator<=
4177
4178
template<class _CharT, class _Traits, class _Allocator>
4179
inline _LIBCPP_HIDE_FROM_ABI
4180
bool
4181
operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4182
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4183
{
4184
    return !(__rhs < __lhs);
4185
}
4186
4187
template<class _CharT, class _Traits, class _Allocator>
4188
inline _LIBCPP_HIDE_FROM_ABI
4189
bool
4190
operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4191
           const _CharT* __rhs) _NOEXCEPT
4192
{
4193
    return !(__rhs < __lhs);
4194
}
4195
4196
template<class _CharT, class _Traits, class _Allocator>
4197
inline _LIBCPP_HIDE_FROM_ABI
4198
bool
4199
operator<=(const _CharT* __lhs,
4200
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4201
{
4202
    return !(__rhs < __lhs);
4203
}
4204
4205
// operator>=
4206
4207
template<class _CharT, class _Traits, class _Allocator>
4208
inline _LIBCPP_HIDE_FROM_ABI
4209
bool
4210
operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4211
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4212
{
4213
    return !(__lhs < __rhs);
4214
}
4215
4216
template<class _CharT, class _Traits, class _Allocator>
4217
inline _LIBCPP_HIDE_FROM_ABI
4218
bool
4219
operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4220
           const _CharT* __rhs) _NOEXCEPT
4221
{
4222
    return !(__lhs < __rhs);
4223
}
4224
4225
template<class _CharT, class _Traits, class _Allocator>
4226
inline _LIBCPP_HIDE_FROM_ABI
4227
bool
4228
operator>=(const _CharT* __lhs,
4229
           const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
4230
{
4231
    return !(__lhs < __rhs);
4232
}
4233
#endif // _LIBCPP_STD_VER > 17
4234
4235
// operator +
4236
4237
template<class _CharT, class _Traits, class _Allocator>
4238
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4239
basic_string<_CharT, _Traits, _Allocator>
4240
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4241
          const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4242
{
4243
    using _String = basic_string<_CharT, _Traits, _Allocator>;
4244
    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());
4253
    return __r;
4254
}
4255
4256
template<class _CharT, class _Traits, class _Allocator>
4257
_LIBCPP_HIDDEN _LIBCPP_CONSTEXPR_SINCE_CXX20
4258
basic_string<_CharT, _Traits, _Allocator>
4259
operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4260
0
{
4261
0
    using _String = basic_string<_CharT, _Traits, _Allocator>;
4262
0
    auto __lhs_sz = _Traits::length(__lhs);
4263
0
    auto __rhs_sz = __rhs.size();
4264
0
    _String __r(__uninitialized_size_tag(),
4265
0
                __lhs_sz + __rhs_sz,
4266
0
                _String::__alloc_traits::select_on_container_copy_construction(__rhs.get_allocator()));
4267
0
    auto __ptr = std::__to_address(__r.__get_pointer());
4268
0
    _Traits::copy(__ptr, __lhs, __lhs_sz);
4269
0
    _Traits::copy(__ptr + __lhs_sz, __rhs.data(), __rhs_sz);
4270
0
    _Traits::assign(__ptr + __lhs_sz + __rhs_sz, 1, _CharT());
4271
0
    return __r;
4272
0
}
4273
4274
template<class _CharT, class _Traits, class _Allocator>
4275
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4276
basic_string<_CharT, _Traits, _Allocator>
4277
operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4278
{
4279
    using _String = basic_string<_CharT, _Traits, _Allocator>;
4280
    typename _String::size_type __rhs_sz = __rhs.size();
4281
    _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());
4288
    return __r;
4289
}
4290
4291
template<class _CharT, class _Traits, class _Allocator>
4292
inline _LIBCPP_CONSTEXPR_SINCE_CXX20
4293
basic_string<_CharT, _Traits, _Allocator>
4294
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
4295
5.95k
{
4296
5.95k
    using _String = basic_string<_CharT, _Traits, _Allocator>;
4297
5.95k
    typename _String::size_type __lhs_sz = __lhs.size();
4298
5.95k
    typename _String::size_type __rhs_sz = _Traits::length(__rhs);
4299
5.95k
    _String __r(__uninitialized_size_tag(),
4300
5.95k
                __lhs_sz + __rhs_sz,
4301
5.95k
                _String::__alloc_traits::select_on_container_copy_construction(__lhs.get_allocator()));
4302
5.95k
    auto __ptr = std::__to_address(__r.__get_pointer());
4303
5.95k
    _Traits::copy(__ptr, __lhs.data(), __lhs_sz);
4304
5.95k
    _Traits::copy(__ptr + __lhs_sz, __rhs, __rhs_sz);
4305
5.95k
    _Traits::assign(__ptr + __lhs_sz + __rhs_sz, 1, _CharT());
4306
5.95k
    return __r;
4307
5.95k
}
4308
4309
template<class _CharT, class _Traits, class _Allocator>
4310
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4311
basic_string<_CharT, _Traits, _Allocator>
4312
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
4313
{
4314
    using _String = basic_string<_CharT, _Traits, _Allocator>;
4315
    typename _String::size_type __lhs_sz = __lhs.size();
4316
    _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());
4323
    return __r;
4324
}
4325
4326
#ifndef _LIBCPP_CXX03_LANG
4327
4328
template<class _CharT, class _Traits, class _Allocator>
4329
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4330
basic_string<_CharT, _Traits, _Allocator>
4331
operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4332
{
4333
    return std::move(__lhs.append(__rhs));
4334
}
4335
4336
template<class _CharT, class _Traits, class _Allocator>
4337
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4338
basic_string<_CharT, _Traits, _Allocator>
4339
operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4340
{
4341
    return std::move(__rhs.insert(0, __lhs));
4342
}
4343
4344
template<class _CharT, class _Traits, class _Allocator>
4345
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4346
basic_string<_CharT, _Traits, _Allocator>
4347
operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4348
{
4349
    return std::move(__lhs.append(__rhs));
4350
}
4351
4352
template<class _CharT, class _Traits, class _Allocator>
4353
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4354
basic_string<_CharT, _Traits, _Allocator>
4355
operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4356
3.18k
{
4357
3.18k
    return std::move(__rhs.insert(0, __lhs));
4358
3.18k
}
4359
4360
template<class _CharT, class _Traits, class _Allocator>
4361
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4362
basic_string<_CharT, _Traits, _Allocator>
4363
operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4364
{
4365
    __rhs.insert(__rhs.begin(), __lhs);
4366
    return std::move(__rhs);
4367
}
4368
4369
template<class _CharT, class _Traits, class _Allocator>
4370
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4371
basic_string<_CharT, _Traits, _Allocator>
4372
operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
4373
{
4374
    return std::move(__lhs.append(__rhs));
4375
}
4376
4377
template<class _CharT, class _Traits, class _Allocator>
4378
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4379
basic_string<_CharT, _Traits, _Allocator>
4380
operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
4381
{
4382
    __lhs.push_back(__rhs);
4383
    return std::move(__lhs);
4384
}
4385
4386
#endif // _LIBCPP_CXX03_LANG
4387
4388
// swap
4389
4390
template<class _CharT, class _Traits, class _Allocator>
4391
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4392
void
4393
swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
4394
     basic_string<_CharT, _Traits, _Allocator>& __rhs)
4395
     _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
4396
{
4397
    __lhs.swap(__rhs);
4398
}
4399
4400
_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);
4405
4406
_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);
4409
4410
_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);
4419
4420
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4421
_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);
4426
4427
_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);
4430
4431
_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);
4440
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
4441
4442
template<class _CharT, class _Traits, class _Allocator>
4443
_LIBCPP_TEMPLATE_DATA_VIS
4444
const typename basic_string<_CharT, _Traits, _Allocator>::size_type
4445
               basic_string<_CharT, _Traits, _Allocator>::npos;
4446
4447
template <class _CharT, class _Allocator>
4448
struct __string_hash : public __unary_function<basic_string<_CharT, char_traits<_CharT>, _Allocator>, size_t>
4449
{
4450
    size_t
4451
    operator()(const basic_string<_CharT, char_traits<_CharT>, _Allocator>& __val) const _NOEXCEPT
4452
    { return std::__do_string_hash(__val.data(), __val.data() + __val.size()); }
4453
};
4454
4455
template <class _Allocator>
4456
struct hash<basic_string<char, char_traits<char>, _Allocator> > : __string_hash<char, _Allocator> {};
4457
4458
#ifndef _LIBCPP_HAS_NO_CHAR8_T
4459
template <class _Allocator>
4460
struct hash<basic_string<char8_t, char_traits<char8_t>, _Allocator> > : __string_hash<char8_t, _Allocator> {};
4461
#endif
4462
4463
template <class _Allocator>
4464
struct hash<basic_string<char16_t, char_traits<char16_t>, _Allocator> > : __string_hash<char16_t, _Allocator> {};
4465
4466
template <class _Allocator>
4467
struct hash<basic_string<char32_t, char_traits<char32_t>, _Allocator> > : __string_hash<char32_t, _Allocator> {};
4468
4469
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4470
template <class _Allocator>
4471
struct hash<basic_string<wchar_t, char_traits<wchar_t>, _Allocator> > : __string_hash<wchar_t, _Allocator> {};
4472
#endif
4473
4474
template<class _CharT, class _Traits, class _Allocator>
4475
_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
4476
operator<<(basic_ostream<_CharT, _Traits>& __os,
4477
           const basic_string<_CharT, _Traits, _Allocator>& __str);
4478
4479
template<class _CharT, class _Traits, class _Allocator>
4480
_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
4481
operator>>(basic_istream<_CharT, _Traits>& __is,
4482
           basic_string<_CharT, _Traits, _Allocator>& __str);
4483
4484
template<class _CharT, class _Traits, class _Allocator>
4485
_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
4486
getline(basic_istream<_CharT, _Traits>& __is,
4487
        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4488
4489
template<class _CharT, class _Traits, class _Allocator>
4490
inline _LIBCPP_HIDE_FROM_ABI
4491
basic_istream<_CharT, _Traits>&
4492
getline(basic_istream<_CharT, _Traits>& __is,
4493
        basic_string<_CharT, _Traits, _Allocator>& __str);
4494
4495
template<class _CharT, class _Traits, class _Allocator>
4496
inline _LIBCPP_HIDE_FROM_ABI
4497
basic_istream<_CharT, _Traits>&
4498
getline(basic_istream<_CharT, _Traits>&& __is,
4499
        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4500
4501
template<class _CharT, class _Traits, class _Allocator>
4502
inline _LIBCPP_HIDE_FROM_ABI
4503
basic_istream<_CharT, _Traits>&
4504
getline(basic_istream<_CharT, _Traits>&& __is,
4505
        basic_string<_CharT, _Traits, _Allocator>& __str);
4506
4507
#if _LIBCPP_STD_VER > 17
4508
template <class _CharT, class _Traits, class _Allocator, class _Up>
4509
inline _LIBCPP_HIDE_FROM_ABI
4510
    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();
4513
  __str.erase(std::remove(__str.begin(), __str.end(), __v), __str.end());
4514
  return __old_size - __str.size();
4515
}
4516
4517
template <class _CharT, class _Traits, class _Allocator, class _Predicate>
4518
inline _LIBCPP_HIDE_FROM_ABI
4519
    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();
4523
  __str.erase(std::remove_if(__str.begin(), __str.end(), __pred),
4524
              __str.end());
4525
  return __old_size - __str.size();
4526
}
4527
#endif
4528
4529
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
4530
4531
template<class _CharT, class _Traits, class _Allocator>
4532
bool
4533
basic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const
4534
{
4535
    return data() <= std::__to_address(__i->base()) &&
4536
           std::__to_address(__i->base()) < data() + size();
4537
}
4538
4539
template<class _CharT, class _Traits, class _Allocator>
4540
bool
4541
basic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const
4542
{
4543
    return data() < std::__to_address(__i->base()) &&
4544
           std::__to_address(__i->base()) <= data() + size();
4545
}
4546
4547
template<class _CharT, class _Traits, class _Allocator>
4548
bool
4549
basic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
4550
{
4551
    const value_type* __p = std::__to_address(__i->base()) + __n;
4552
    return data() <= __p && __p <= data() + size();
4553
}
4554
4555
template<class _CharT, class _Traits, class _Allocator>
4556
bool
4557
basic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
4558
{
4559
    const value_type* __p = std::__to_address(__i->base()) + __n;
4560
    return data() <= __p && __p < data() + size();
4561
}
4562
4563
#endif // _LIBCPP_ENABLE_DEBUG_MODE
4564
4565
#if _LIBCPP_STD_VER > 11
4566
// Literal suffixes for basic_string [basic.string.literals]
4567
inline namespace literals
4568
{
4569
  inline namespace string_literals
4570
  {
4571
    inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4572
    basic_string<char> operator "" s( const char *__str, size_t __len )
4573
0
    {
4574
0
        return basic_string<char> (__str, __len);
4575
0
    }
4576
4577
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4578
    inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4579
    basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
4580
0
    {
4581
0
        return basic_string<wchar_t> (__str, __len);
4582
0
    }
4583
#endif
4584
4585
#ifndef _LIBCPP_HAS_NO_CHAR8_T
4586
    inline _LIBCPP_HIDE_FROM_ABI constexpr
4587
    basic_string<char8_t> operator "" s(const char8_t *__str, size_t __len)
4588
0
    {
4589
0
        return basic_string<char8_t> (__str, __len);
4590
0
    }
4591
#endif
4592
4593
    inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4594
    basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len )
4595
0
    {
4596
0
        return basic_string<char16_t> (__str, __len);
4597
0
    }
4598
4599
    inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
4600
    basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len )
4601
0
    {
4602
0
        return basic_string<char32_t> (__str, __len);
4603
0
    }
4604
  } // namespace string_literals
4605
} // namespace literals
4606
4607
#if _LIBCPP_STD_VER > 17
4608
template <>
4609
inline constexpr bool __format::__enable_insertable<std::basic_string<char>> = true;
4610
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4611
template <>
4612
inline constexpr bool __format::__enable_insertable<std::basic_string<wchar_t>> = true;
4613
#endif
4614
#endif
4615
4616
#endif
4617
4618
_LIBCPP_END_NAMESPACE_STD
4619
4620
_LIBCPP_POP_MACROS
4621
4622
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
4623
#  include <algorithm>
4624
#  include <concepts>
4625
#  include <functional>
4626
#  include <iterator>
4627
#  include <new>
4628
#  include <typeinfo>
4629
#  include <utility>
4630
#  include <vector>
4631
#endif
4632
4633
#endif // _LIBCPP_STRING