blob: 6f5089c17fa8754fcc838df8011a17402134c6b0 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:161// -*- C++ -*-
2//===--------------------------- string -----------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:014// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:165//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_STRING
12#define _LIBCPP_STRING
13
14/*
15 string synopsis
16
17namespace std
18{
19
20template <class stateT>
21class fpos
22{
23private:
24 stateT st;
25public:
26 fpos(streamoff = streamoff());
27
28 operator streamoff() const;
29
30 stateT state() const;
31 void state(stateT);
32
33 fpos& operator+=(streamoff);
34 fpos operator+ (streamoff) const;
35 fpos& operator-=(streamoff);
36 fpos operator- (streamoff) const;
37};
38
39template <class stateT> streamoff operator-(const fpos<stateT>& x, const fpos<stateT>& y);
40
41template <class stateT> bool operator==(const fpos<stateT>& x, const fpos<stateT>& y);
42template <class stateT> bool operator!=(const fpos<stateT>& x, const fpos<stateT>& y);
43
44template <class charT>
45struct char_traits
46{
47 typedef charT char_type;
48 typedef ... int_type;
49 typedef streamoff off_type;
50 typedef streampos pos_type;
51 typedef mbstate_t state_type;
52
Howard Hinnanta6119a82011-05-29 19:57:1253 static void assign(char_type& c1, const char_type& c2) noexcept;
Howard Hinnant03d71812012-07-20 19:09:1254 static constexpr bool eq(char_type c1, char_type c2) noexcept;
55 static constexpr bool lt(char_type c1, char_type c2) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1656
57 static int compare(const char_type* s1, const char_type* s2, size_t n);
58 static size_t length(const char_type* s);
59 static const char_type* find(const char_type* s, size_t n, const char_type& a);
60 static char_type* move(char_type* s1, const char_type* s2, size_t n);
61 static char_type* copy(char_type* s1, const char_type* s2, size_t n);
62 static char_type* assign(char_type* s, size_t n, char_type a);
63
Howard Hinnant03d71812012-07-20 19:09:1264 static constexpr int_type not_eof(int_type c) noexcept;
65 static constexpr char_type to_char_type(int_type c) noexcept;
66 static constexpr int_type to_int_type(char_type c) noexcept;
67 static constexpr bool eq_int_type(int_type c1, int_type c2) noexcept;
68 static constexpr int_type eof() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1669};
70
71template <> struct char_traits<char>;
72template <> struct char_traits<wchar_t>;
73
Howard Hinnant324bb032010-08-22 00:02:4374template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
Howard Hinnantbc8d3f92010-05-11 19:42:1675class basic_string
76{
Howard Hinnant324bb032010-08-22 00:02:4377public:
78// types:
Howard Hinnantbc8d3f92010-05-11 19:42:1679 typedef traits traits_type;
80 typedef typename traits_type::char_type value_type;
81 typedef Allocator allocator_type;
82 typedef typename allocator_type::size_type size_type;
83 typedef typename allocator_type::difference_type difference_type;
84 typedef typename allocator_type::reference reference;
85 typedef typename allocator_type::const_reference const_reference;
86 typedef typename allocator_type::pointer pointer;
87 typedef typename allocator_type::const_pointer const_pointer;
88 typedef implementation-defined iterator;
89 typedef implementation-defined const_iterator;
90 typedef std::reverse_iterator<iterator> reverse_iterator;
91 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
92
93 static const size_type npos = -1;
94
Howard Hinnant53f7d4c2011-06-03 18:40:4795 basic_string()
96 noexcept(is_nothrow_default_constructible<allocator_type>::value);
97 explicit basic_string(const allocator_type& a);
Howard Hinnantbc8d3f92010-05-11 19:42:1698 basic_string(const basic_string& str);
Howard Hinnant53f7d4c2011-06-03 18:40:4799 basic_string(basic_string&& str)
100 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clowff0b9f52016-03-09 17:51:43101 basic_string(const basic_string& str, size_type pos, // LWG#2583
Howard Hinnanta6a062d2010-06-02 18:20:39102 const allocator_type& a = allocator_type());
Marshall Clowff0b9f52016-03-09 17:51:43103 basic_string(const basic_string& str, size_type pos, size_type n, // LWG#2583
104 const Allocator& a = Allocator());
Howard Hinnant9dcdcde2013-06-28 16:59:19105 basic_string(const value_type* s, const allocator_type& a = allocator_type());
106 basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type());
Howard Hinnantbc8d3f92010-05-11 19:42:16107 basic_string(size_type n, value_type c, const allocator_type& a = allocator_type());
108 template<class InputIterator>
Howard Hinnanta6a062d2010-06-02 18:20:39109 basic_string(InputIterator begin, InputIterator end,
110 const allocator_type& a = allocator_type());
Howard Hinnantbc8d3f92010-05-11 19:42:16111 basic_string(initializer_list<value_type>, const Allocator& = Allocator());
112 basic_string(const basic_string&, const Allocator&);
113 basic_string(basic_string&&, const Allocator&);
114
115 ~basic_string();
116
117 basic_string& operator=(const basic_string& str);
Howard Hinnant53f7d4c2011-06-03 18:40:47118 basic_string& operator=(basic_string&& str)
119 noexcept(
Marshall Clowaf961ed2015-08-18 18:57:00120 allocator_type::propagate_on_container_move_assignment::value ||
121 allocator_type::is_always_equal::value ); // C++17
Howard Hinnant9dcdcde2013-06-28 16:59:19122 basic_string& operator=(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16123 basic_string& operator=(value_type c);
124 basic_string& operator=(initializer_list<value_type>);
125
Howard Hinnanta6119a82011-05-29 19:57:12126 iterator begin() noexcept;
127 const_iterator begin() const noexcept;
128 iterator end() noexcept;
129 const_iterator end() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16130
Howard Hinnanta6119a82011-05-29 19:57:12131 reverse_iterator rbegin() noexcept;
132 const_reverse_iterator rbegin() const noexcept;
133 reverse_iterator rend() noexcept;
134 const_reverse_iterator rend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16135
Howard Hinnanta6119a82011-05-29 19:57:12136 const_iterator cbegin() const noexcept;
137 const_iterator cend() const noexcept;
138 const_reverse_iterator crbegin() const noexcept;
139 const_reverse_iterator crend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16140
Howard Hinnanta6119a82011-05-29 19:57:12141 size_type size() const noexcept;
142 size_type length() const noexcept;
143 size_type max_size() const noexcept;
144 size_type capacity() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16145
146 void resize(size_type n, value_type c);
147 void resize(size_type n);
148
149 void reserve(size_type res_arg = 0);
150 void shrink_to_fit();
Howard Hinnanta6119a82011-05-29 19:57:12151 void clear() noexcept;
152 bool empty() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16153
154 const_reference operator[](size_type pos) const;
155 reference operator[](size_type pos);
156
157 const_reference at(size_type n) const;
158 reference at(size_type n);
159
160 basic_string& operator+=(const basic_string& str);
Howard Hinnant9dcdcde2013-06-28 16:59:19161 basic_string& operator+=(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16162 basic_string& operator+=(value_type c);
163 basic_string& operator+=(initializer_list<value_type>);
164
165 basic_string& append(const basic_string& str);
Marshall Clowa93b5e22014-03-04 19:17:19166 basic_string& append(const basic_string& str, size_type pos, size_type n=npos); //C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19167 basic_string& append(const value_type* s, size_type n);
168 basic_string& append(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16169 basic_string& append(size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39170 template<class InputIterator>
171 basic_string& append(InputIterator first, InputIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16172 basic_string& append(initializer_list<value_type>);
173
174 void push_back(value_type c);
175 void pop_back();
176 reference front();
177 const_reference front() const;
178 reference back();
179 const_reference back() const;
180
181 basic_string& assign(const basic_string& str);
Howard Hinnanta6119a82011-05-29 19:57:12182 basic_string& assign(basic_string&& str);
Marshall Clowa93b5e22014-03-04 19:17:19183 basic_string& assign(const basic_string& str, size_type pos, size_type n=npos); // C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19184 basic_string& assign(const value_type* s, size_type n);
185 basic_string& assign(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16186 basic_string& assign(size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39187 template<class InputIterator>
188 basic_string& assign(InputIterator first, InputIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16189 basic_string& assign(initializer_list<value_type>);
190
191 basic_string& insert(size_type pos1, const basic_string& str);
Howard Hinnanta6a062d2010-06-02 18:20:39192 basic_string& insert(size_type pos1, const basic_string& str,
193 size_type pos2, size_type n);
Marshall Clowa93b5e22014-03-04 19:17:19194 basic_string& insert(size_type pos, const value_type* s, size_type n=npos); //C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19195 basic_string& insert(size_type pos, const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16196 basic_string& insert(size_type pos, size_type n, value_type c);
197 iterator insert(const_iterator p, value_type c);
198 iterator insert(const_iterator p, size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39199 template<class InputIterator>
200 iterator insert(const_iterator p, InputIterator first, InputIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16201 iterator insert(const_iterator p, initializer_list<value_type>);
202
203 basic_string& erase(size_type pos = 0, size_type n = npos);
204 iterator erase(const_iterator position);
205 iterator erase(const_iterator first, const_iterator last);
206
207 basic_string& replace(size_type pos1, size_type n1, const basic_string& str);
Howard Hinnanta6a062d2010-06-02 18:20:39208 basic_string& replace(size_type pos1, size_type n1, const basic_string& str,
Marshall Clowa93b5e22014-03-04 19:17:19209 size_type pos2, size_type n2=npos); // C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19210 basic_string& replace(size_type pos, size_type n1, const value_type* s, size_type n2);
211 basic_string& replace(size_type pos, size_type n1, const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16212 basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c);
Howard Hinnant7b2cb482010-11-17 21:11:40213 basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str);
Howard Hinnant9dcdcde2013-06-28 16:59:19214 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n);
215 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s);
Howard Hinnant7b2cb482010-11-17 21:11:40216 basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39217 template<class InputIterator>
Howard Hinnant7b2cb482010-11-17 21:11:40218 basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
219 basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>);
Howard Hinnantbc8d3f92010-05-11 19:42:16220
Howard Hinnant9dcdcde2013-06-28 16:59:19221 size_type copy(value_type* s, size_type n, size_type pos = 0) const;
Howard Hinnantbc8d3f92010-05-11 19:42:16222 basic_string substr(size_type pos = 0, size_type n = npos) const;
223
Howard Hinnant53f7d4c2011-06-03 18:40:47224 void swap(basic_string& str)
Marshall Clow7d914d12015-07-13 20:04:56225 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
226 allocator_traits<allocator_type>::is_always_equal::value); // C++17
Howard Hinnantbc8d3f92010-05-11 19:42:16227
Howard Hinnant9dcdcde2013-06-28 16:59:19228 const value_type* c_str() const noexcept;
229 const value_type* data() const noexcept;
Marshall Clowf532a702016-03-08 15:44:30230 value_type* data() noexcept; // C++17
Howard Hinnantbc8d3f92010-05-11 19:42:16231
Howard Hinnanta6119a82011-05-29 19:57:12232 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16233
Howard Hinnanta6119a82011-05-29 19:57:12234 size_type find(const basic_string& str, size_type pos = 0) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19235 size_type find(const value_type* s, size_type pos, size_type n) const noexcept;
236 size_type find(const value_type* s, size_type pos = 0) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12237 size_type find(value_type c, size_type pos = 0) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16238
Howard Hinnanta6119a82011-05-29 19:57:12239 size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19240 size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept;
241 size_type rfind(const value_type* s, size_type pos = npos) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12242 size_type rfind(value_type c, size_type pos = npos) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16243
Howard Hinnanta6119a82011-05-29 19:57:12244 size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19245 size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept;
246 size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12247 size_type find_first_of(value_type c, size_type pos = 0) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16248
Howard Hinnanta6119a82011-05-29 19:57:12249 size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19250 size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept;
251 size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12252 size_type find_last_of(value_type c, size_type pos = npos) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16253
Howard Hinnanta6119a82011-05-29 19:57:12254 size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19255 size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
256 size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12257 size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16258
Howard Hinnanta6119a82011-05-29 19:57:12259 size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19260 size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
261 size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12262 size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16263
Howard Hinnanta6119a82011-05-29 19:57:12264 int compare(const basic_string& str) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16265 int compare(size_type pos1, size_type n1, const basic_string& str) const;
Howard Hinnanta6a062d2010-06-02 18:20:39266 int compare(size_type pos1, size_type n1, const basic_string& str,
Marshall Clowa93b5e22014-03-04 19:17:19267 size_type pos2, size_type n2=npos) const; // C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19268 int compare(const value_type* s) const noexcept;
269 int compare(size_type pos1, size_type n1, const value_type* s) const;
270 int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const;
Howard Hinnantbc8d3f92010-05-11 19:42:16271
272 bool __invariants() const;
273};
274
275template<class charT, class traits, class Allocator>
276basic_string<charT, traits, Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39277operator+(const basic_string<charT, traits, Allocator>& lhs,
278 const basic_string<charT, traits, Allocator>& rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16279
280template<class charT, class traits, class Allocator>
281basic_string<charT, traits, Allocator>
282operator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs);
283
284template<class charT, class traits, class Allocator>
285basic_string<charT, traits, Allocator>
286operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs);
287
288template<class charT, class traits, class Allocator>
289basic_string<charT, traits, Allocator>
290operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
291
292template<class charT, class traits, class Allocator>
293basic_string<charT, traits, Allocator>
294operator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs);
295
296template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39297bool operator==(const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12298 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16299
300template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12301bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16302
303template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12304bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16305
Howard Hinnant324bb032010-08-22 00:02:43306template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39307bool operator!=(const basic_string<charT,traits,Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12308 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16309
310template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12311bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16312
313template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12314bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16315
316template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39317bool operator< (const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12318 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16319
320template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12321bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16322
323template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12324bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16325
326template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39327bool operator> (const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12328 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16329
330template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12331bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16332
333template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12334bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16335
336template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39337bool operator<=(const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12338 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16339
340template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12341bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16342
343template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12344bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16345
346template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39347bool operator>=(const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12348 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16349
350template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12351bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16352
353template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12354bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16355
356template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39357void swap(basic_string<charT, traits, Allocator>& lhs,
Howard Hinnant53f7d4c2011-06-03 18:40:47358 basic_string<charT, traits, Allocator>& rhs)
359 noexcept(noexcept(lhs.swap(rhs)));
Howard Hinnantbc8d3f92010-05-11 19:42:16360
361template<class charT, class traits, class Allocator>
362basic_istream<charT, traits>&
363operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
364
365template<class charT, class traits, class Allocator>
366basic_ostream<charT, traits>&
367operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
368
369template<class charT, class traits, class Allocator>
Howard Hinnant324bb032010-08-22 00:02:43370basic_istream<charT, traits>&
Howard Hinnanta6a062d2010-06-02 18:20:39371getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str,
372 charT delim);
Howard Hinnantbc8d3f92010-05-11 19:42:16373
374template<class charT, class traits, class Allocator>
375basic_istream<charT, traits>&
376getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
377
378typedef basic_string<char> string;
379typedef basic_string<wchar_t> wstring;
Howard Hinnanta6a062d2010-06-02 18:20:39380typedef basic_string<char16_t> u16string;
381typedef basic_string<char32_t> u32string;
382
383int stoi (const string& str, size_t* idx = 0, int base = 10);
384long stol (const string& str, size_t* idx = 0, int base = 10);
385unsigned long stoul (const string& str, size_t* idx = 0, int base = 10);
386long long stoll (const string& str, size_t* idx = 0, int base = 10);
387unsigned long long stoull(const string& str, size_t* idx = 0, int base = 10);
388
389float stof (const string& str, size_t* idx = 0);
390double stod (const string& str, size_t* idx = 0);
391long double stold(const string& str, size_t* idx = 0);
392
393string to_string(int val);
394string to_string(unsigned val);
395string to_string(long val);
396string to_string(unsigned long val);
397string to_string(long long val);
398string to_string(unsigned long long val);
399string to_string(float val);
400string to_string(double val);
401string to_string(long double val);
402
403int stoi (const wstring& str, size_t* idx = 0, int base = 10);
404long stol (const wstring& str, size_t* idx = 0, int base = 10);
405unsigned long stoul (const wstring& str, size_t* idx = 0, int base = 10);
406long long stoll (const wstring& str, size_t* idx = 0, int base = 10);
407unsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10);
408
409float stof (const wstring& str, size_t* idx = 0);
410double stod (const wstring& str, size_t* idx = 0);
411long double stold(const wstring& str, size_t* idx = 0);
412
413wstring to_wstring(int val);
414wstring to_wstring(unsigned val);
415wstring to_wstring(long val);
416wstring to_wstring(unsigned long val);
417wstring to_wstring(long long val);
418wstring to_wstring(unsigned long long val);
419wstring to_wstring(float val);
420wstring to_wstring(double val);
421wstring to_wstring(long double val);
Howard Hinnantbc8d3f92010-05-11 19:42:16422
423template <> struct hash<string>;
424template <> struct hash<u16string>;
425template <> struct hash<u32string>;
426template <> struct hash<wstring>;
427
Marshall Clow15234322013-07-23 17:05:24428basic_string<char> operator "" s( const char *str, size_t len ); // C++14
429basic_string<wchar_t> operator "" s( const wchar_t *str, size_t len ); // C++14
430basic_string<char16_t> operator "" s( const char16_t *str, size_t len ); // C++14
431basic_string<char32_t> operator "" s( const char32_t *str, size_t len ); // C++14
432
Howard Hinnantbc8d3f92010-05-11 19:42:16433} // std
434
435*/
436
437#include <__config>
438#include <iosfwd>
439#include <cstring>
Howard Hinnantadff4892010-05-24 17:49:41440#include <cstdio> // For EOF.
Howard Hinnantbc8d3f92010-05-11 19:42:16441#include <cwchar>
442#include <algorithm>
443#include <iterator>
444#include <utility>
445#include <memory>
446#include <stdexcept>
447#include <type_traits>
448#include <initializer_list>
449#include <__functional_base>
450#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
451#include <cstdint>
452#endif
Howard Hinnant499cea12013-08-23 17:37:05453#if defined(_LIBCPP_NO_EXCEPTIONS)
Howard Hinnantbc8d3f92010-05-11 19:42:16454#include <cassert>
455#endif
456
Howard Hinnant66c6f972011-11-29 16:45:27457#include <__undef_min_max>
458
Eric Fiselierb9536102014-08-10 23:53:08459#include <__debug>
460
Howard Hinnant08e17472011-10-17 20:05:10461#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16462#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10463#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16464
465_LIBCPP_BEGIN_NAMESPACE_STD
466
467// fpos
468
469template <class _StateT>
Howard Hinnant0f678bd2013-08-12 18:38:34470class _LIBCPP_TYPE_VIS_ONLY fpos
Howard Hinnantbc8d3f92010-05-11 19:42:16471{
472private:
473 _StateT __st_;
474 streamoff __off_;
475public:
476 _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {}
477
478 _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;}
479
480 _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;}
481 _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;}
482
483 _LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;}
484 _LIBCPP_INLINE_VISIBILITY fpos operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;}
485 _LIBCPP_INLINE_VISIBILITY fpos& operator-=(streamoff __off) {__off_ -= __off; return *this;}
486 _LIBCPP_INLINE_VISIBILITY fpos operator- (streamoff __off) const {fpos __t(*this); __t -= __off; return __t;}
487};
488
489template <class _StateT>
490inline _LIBCPP_INLINE_VISIBILITY
491streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
492 {return streamoff(__x) - streamoff(__y);}
493
494template <class _StateT>
495inline _LIBCPP_INLINE_VISIBILITY
496bool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
497 {return streamoff(__x) == streamoff(__y);}
498
499template <class _StateT>
500inline _LIBCPP_INLINE_VISIBILITY
501bool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
502 {return streamoff(__x) != streamoff(__y);}
503
504// char_traits
505
506template <class _CharT>
Howard Hinnant0f678bd2013-08-12 18:38:34507struct _LIBCPP_TYPE_VIS_ONLY char_traits
Howard Hinnantbc8d3f92010-05-11 19:42:16508{
509 typedef _CharT char_type;
510 typedef int int_type;
511 typedef streamoff off_type;
512 typedef streampos pos_type;
513 typedef mbstate_t state_type;
514
Dan Albert6d9505a2014-09-17 16:34:29515 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12516 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29517 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12518 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29519 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12520 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16521
522 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13523 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16524 static size_t length(const char_type* __s);
Evgeniy Stepanova3b25f82015-11-07 01:22:13525 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16526 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
527 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13528 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16529 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13530 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16531 static char_type* assign(char_type* __s, size_t __n, char_type __a);
532
Dan Albert6d9505a2014-09-17 16:34:29533 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16534 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29535 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12536 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29537 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12538 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29539 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16540 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29541 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12542 {return int_type(EOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16543};
544
545template <class _CharT>
546int
547char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
548{
549 for (; __n; --__n, ++__s1, ++__s2)
550 {
551 if (lt(*__s1, *__s2))
552 return -1;
553 if (lt(*__s2, *__s1))
554 return 1;
555 }
556 return 0;
557}
558
559template <class _CharT>
Evgeniy Stepanova3b25f82015-11-07 01:22:13560inline
Howard Hinnantbc8d3f92010-05-11 19:42:16561size_t
562char_traits<_CharT>::length(const char_type* __s)
563{
564 size_t __len = 0;
565 for (; !eq(*__s, char_type(0)); ++__s)
566 ++__len;
567 return __len;
568}
569
570template <class _CharT>
Evgeniy Stepanova3b25f82015-11-07 01:22:13571inline
Howard Hinnantbc8d3f92010-05-11 19:42:16572const _CharT*
573char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a)
574{
575 for (; __n; --__n)
576 {
577 if (eq(*__s, __a))
578 return __s;
579 ++__s;
580 }
581 return 0;
582}
583
584template <class _CharT>
585_CharT*
586char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n)
587{
588 char_type* __r = __s1;
589 if (__s1 < __s2)
590 {
591 for (; __n; --__n, ++__s1, ++__s2)
592 assign(*__s1, *__s2);
593 }
594 else if (__s2 < __s1)
595 {
596 __s1 += __n;
597 __s2 += __n;
598 for (; __n; --__n)
599 assign(*--__s1, *--__s2);
600 }
601 return __r;
602}
603
604template <class _CharT>
Evgeniy Stepanova3b25f82015-11-07 01:22:13605inline
Howard Hinnantbc8d3f92010-05-11 19:42:16606_CharT*
607char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
608{
Howard Hinnant499cea12013-08-23 17:37:05609 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16610 char_type* __r = __s1;
611 for (; __n; --__n, ++__s1, ++__s2)
612 assign(*__s1, *__s2);
613 return __r;
614}
615
616template <class _CharT>
Evgeniy Stepanova3b25f82015-11-07 01:22:13617inline
Howard Hinnantbc8d3f92010-05-11 19:42:16618_CharT*
619char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a)
620{
621 char_type* __r = __s;
622 for (; __n; --__n, ++__s)
623 assign(*__s, __a);
624 return __r;
625}
626
627// char_traits<char>
628
629template <>
Howard Hinnant0f678bd2013-08-12 18:38:34630struct _LIBCPP_TYPE_VIS_ONLY char_traits<char>
Howard Hinnantbc8d3f92010-05-11 19:42:16631{
632 typedef char char_type;
633 typedef int int_type;
634 typedef streamoff off_type;
635 typedef streampos pos_type;
636 typedef mbstate_t state_type;
637
Dan Albert6d9505a2014-09-17 16:34:29638 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12639 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29640 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12641 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29642 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16643 {return (unsigned char)__c1 < (unsigned char)__c2;}
644
Dan Albert6d9505a2014-09-17 16:34:29645 static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clowf2e36ef2015-02-12 23:34:52646 {return __n == 0 ? 0 : memcmp(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29647 static inline size_t length(const char_type* __s) {return strlen(__s);}
648 static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
Marshall Clow6bcbced2015-02-13 16:04:42649 {return __n == 0 ? NULL : (const char_type*) memchr(__s, to_int_type(__a), __n);}
Dan Albert6d9505a2014-09-17 16:34:29650 static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clow6bcbced2015-02-13 16:04:42651 {return __n == 0 ? __s1 : (char_type*) memmove(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29652 static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnant499cea12013-08-23 17:37:05653 {
654 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Marshall Clow6bcbced2015-02-13 16:04:42655 return __n == 0 ? __s1 : (char_type*)memcpy(__s1, __s2, __n);
Howard Hinnant499cea12013-08-23 17:37:05656 }
Dan Albert6d9505a2014-09-17 16:34:29657 static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
Marshall Clow6bcbced2015-02-13 16:04:42658 {return __n == 0 ? __s : (char_type*)memset(__s, to_int_type(__a), __n);}
Howard Hinnantbc8d3f92010-05-11 19:42:16659
Dan Albert6d9505a2014-09-17 16:34:29660 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16661 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29662 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12663 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29664 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12665 {return int_type((unsigned char)__c);}
Dan Albert6d9505a2014-09-17 16:34:29666 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16667 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29668 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12669 {return int_type(EOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16670};
671
672// char_traits<wchar_t>
673
674template <>
Howard Hinnant0f678bd2013-08-12 18:38:34675struct _LIBCPP_TYPE_VIS_ONLY char_traits<wchar_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16676{
677 typedef wchar_t char_type;
678 typedef wint_t int_type;
679 typedef streamoff off_type;
680 typedef streampos pos_type;
681 typedef mbstate_t state_type;
682
Dan Albert6d9505a2014-09-17 16:34:29683 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12684 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29685 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12686 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29687 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16688 {return __c1 < __c2;}
689
Dan Albert6d9505a2014-09-17 16:34:29690 static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clowf2e36ef2015-02-12 23:34:52691 {return __n == 0 ? 0 : wmemcmp(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29692 static inline size_t length(const char_type* __s)
Howard Hinnanta6119a82011-05-29 19:57:12693 {return wcslen(__s);}
Dan Albert6d9505a2014-09-17 16:34:29694 static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
Marshall Clow6bcbced2015-02-13 16:04:42695 {return __n == 0 ? NULL : (const char_type*)wmemchr(__s, __a, __n);}
Dan Albert6d9505a2014-09-17 16:34:29696 static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clow6bcbced2015-02-13 16:04:42697 {return __n == 0 ? __s1 : (char_type*)wmemmove(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29698 static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnant499cea12013-08-23 17:37:05699 {
700 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Marshall Clow6bcbced2015-02-13 16:04:42701 return __n == 0 ? __s1 : (char_type*)wmemcpy(__s1, __s2, __n);
Howard Hinnant499cea12013-08-23 17:37:05702 }
Dan Albert6d9505a2014-09-17 16:34:29703 static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
Marshall Clow6bcbced2015-02-13 16:04:42704 {return __n == 0 ? __s : (char_type*)wmemset(__s, __a, __n);}
Howard Hinnantbc8d3f92010-05-11 19:42:16705
Dan Albert6d9505a2014-09-17 16:34:29706 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16707 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29708 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12709 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29710 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12711 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29712 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16713 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29714 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12715 {return int_type(WEOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16716};
717
718#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
719
720template <>
Howard Hinnant0f678bd2013-08-12 18:38:34721struct _LIBCPP_TYPE_VIS_ONLY char_traits<char16_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16722{
723 typedef char16_t char_type;
724 typedef uint_least16_t int_type;
725 typedef streamoff off_type;
726 typedef u16streampos pos_type;
727 typedef mbstate_t state_type;
728
Dan Albert6d9505a2014-09-17 16:34:29729 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12730 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29731 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12732 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29733 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12734 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16735
Evgeniy Stepanova3b25f82015-11-07 01:22:13736 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16737 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13738 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16739 static size_t length(const char_type* __s);
Evgeniy Stepanova3b25f82015-11-07 01:22:13740 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16741 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
Evgeniy Stepanova3b25f82015-11-07 01:22:13742 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16743 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13744 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16745 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13746 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16747 static char_type* assign(char_type* __s, size_t __n, char_type __a);
748
Dan Albert6d9505a2014-09-17 16:34:29749 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16750 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29751 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12752 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29753 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12754 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29755 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16756 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29757 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Marshall Clow9a3c6892015-08-04 01:38:34758 {return int_type(0xFFFF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16759};
760
Evgeniy Stepanova3b25f82015-11-07 01:22:13761inline
Howard Hinnantbc8d3f92010-05-11 19:42:16762int
763char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
764{
765 for (; __n; --__n, ++__s1, ++__s2)
766 {
767 if (lt(*__s1, *__s2))
768 return -1;
769 if (lt(*__s2, *__s1))
770 return 1;
771 }
772 return 0;
773}
774
Evgeniy Stepanova3b25f82015-11-07 01:22:13775inline
Howard Hinnantbc8d3f92010-05-11 19:42:16776size_t
777char_traits<char16_t>::length(const char_type* __s)
778{
779 size_t __len = 0;
780 for (; !eq(*__s, char_type(0)); ++__s)
781 ++__len;
782 return __len;
783}
784
Evgeniy Stepanova3b25f82015-11-07 01:22:13785inline
Howard Hinnantbc8d3f92010-05-11 19:42:16786const char16_t*
787char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a)
788{
789 for (; __n; --__n)
790 {
791 if (eq(*__s, __a))
792 return __s;
793 ++__s;
794 }
795 return 0;
796}
797
Evgeniy Stepanova3b25f82015-11-07 01:22:13798inline
Howard Hinnantbc8d3f92010-05-11 19:42:16799char16_t*
800char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
801{
802 char_type* __r = __s1;
803 if (__s1 < __s2)
804 {
805 for (; __n; --__n, ++__s1, ++__s2)
806 assign(*__s1, *__s2);
807 }
808 else if (__s2 < __s1)
809 {
810 __s1 += __n;
811 __s2 += __n;
812 for (; __n; --__n)
813 assign(*--__s1, *--__s2);
814 }
815 return __r;
816}
817
Evgeniy Stepanova3b25f82015-11-07 01:22:13818inline
Howard Hinnantbc8d3f92010-05-11 19:42:16819char16_t*
820char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
821{
Howard Hinnant499cea12013-08-23 17:37:05822 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16823 char_type* __r = __s1;
824 for (; __n; --__n, ++__s1, ++__s2)
825 assign(*__s1, *__s2);
826 return __r;
827}
828
Evgeniy Stepanova3b25f82015-11-07 01:22:13829inline
Howard Hinnantbc8d3f92010-05-11 19:42:16830char16_t*
831char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a)
832{
833 char_type* __r = __s;
834 for (; __n; --__n, ++__s)
835 assign(*__s, __a);
836 return __r;
837}
838
839template <>
Howard Hinnant0f678bd2013-08-12 18:38:34840struct _LIBCPP_TYPE_VIS_ONLY char_traits<char32_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16841{
842 typedef char32_t char_type;
843 typedef uint_least32_t int_type;
844 typedef streamoff off_type;
845 typedef u32streampos pos_type;
846 typedef mbstate_t state_type;
847
Dan Albert6d9505a2014-09-17 16:34:29848 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12849 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29850 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12851 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29852 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12853 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16854
Evgeniy Stepanova3b25f82015-11-07 01:22:13855 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16856 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13857 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16858 static size_t length(const char_type* __s);
Evgeniy Stepanova3b25f82015-11-07 01:22:13859 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16860 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
Evgeniy Stepanova3b25f82015-11-07 01:22:13861 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16862 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13863 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16864 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13865 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16866 static char_type* assign(char_type* __s, size_t __n, char_type __a);
867
Dan Albert6d9505a2014-09-17 16:34:29868 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16869 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29870 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12871 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29872 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12873 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29874 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16875 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29876 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12877 {return int_type(0xFFFFFFFF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16878};
879
Evgeniy Stepanova3b25f82015-11-07 01:22:13880inline
Howard Hinnantbc8d3f92010-05-11 19:42:16881int
882char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
883{
884 for (; __n; --__n, ++__s1, ++__s2)
885 {
886 if (lt(*__s1, *__s2))
887 return -1;
888 if (lt(*__s2, *__s1))
889 return 1;
890 }
891 return 0;
892}
893
Evgeniy Stepanova3b25f82015-11-07 01:22:13894inline
Howard Hinnantbc8d3f92010-05-11 19:42:16895size_t
896char_traits<char32_t>::length(const char_type* __s)
897{
898 size_t __len = 0;
899 for (; !eq(*__s, char_type(0)); ++__s)
900 ++__len;
901 return __len;
902}
903
Evgeniy Stepanova3b25f82015-11-07 01:22:13904inline
Howard Hinnantbc8d3f92010-05-11 19:42:16905const char32_t*
906char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a)
907{
908 for (; __n; --__n)
909 {
910 if (eq(*__s, __a))
911 return __s;
912 ++__s;
913 }
914 return 0;
915}
916
Evgeniy Stepanova3b25f82015-11-07 01:22:13917inline
Howard Hinnantbc8d3f92010-05-11 19:42:16918char32_t*
919char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
920{
921 char_type* __r = __s1;
922 if (__s1 < __s2)
923 {
924 for (; __n; --__n, ++__s1, ++__s2)
925 assign(*__s1, *__s2);
926 }
927 else if (__s2 < __s1)
928 {
929 __s1 += __n;
930 __s2 += __n;
931 for (; __n; --__n)
932 assign(*--__s1, *--__s2);
933 }
934 return __r;
935}
936
Evgeniy Stepanova3b25f82015-11-07 01:22:13937inline
Howard Hinnantbc8d3f92010-05-11 19:42:16938char32_t*
939char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
940{
Howard Hinnant499cea12013-08-23 17:37:05941 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16942 char_type* __r = __s1;
943 for (; __n; --__n, ++__s1, ++__s2)
944 assign(*__s1, *__s2);
945 return __r;
946}
947
Evgeniy Stepanova3b25f82015-11-07 01:22:13948inline
Howard Hinnantbc8d3f92010-05-11 19:42:16949char32_t*
950char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a)
951{
952 char_type* __r = __s;
953 for (; __n; --__n, ++__s)
954 assign(*__s, __a);
955 return __r;
956}
957
Howard Hinnant324bb032010-08-22 00:02:43958#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
Howard Hinnantbc8d3f92010-05-11 19:42:16959
Marshall Clowb671fc92013-12-09 16:00:28960// helper fns for basic_string
961
Marshall Clow37025e12014-06-10 18:51:55962// __str_find
Marshall Clowb671fc92013-12-09 16:00:28963template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49964_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55965__str_find(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49966 _CharT __c, _SizeT __pos) _NOEXCEPT
967{
968 if (__pos >= __sz)
969 return __npos;
970 const _CharT* __r = _Traits::find(__p + __pos, __sz - __pos, __c);
971 if (__r == 0)
972 return __npos;
973 return static_cast<_SizeT>(__r - __p);
974}
975
976template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
977_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55978__str_find(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49979 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
980{
981 if (__pos > __sz || __sz - __pos < __n)
982 return __npos;
983 if (__n == 0)
984 return __pos;
Marshall Clow360f3192014-06-02 02:22:49985 const _CharT* __r =
Marshall Clow37025e12014-06-10 18:51:55986 _VSTD::__search(__p + __pos, __p + __sz,
987 __s, __s + __n, _Traits::eq,
Marshall Clowf6d6b512016-03-08 15:12:52988 random_access_iterator_tag(), random_access_iterator_tag()).first;
Marshall Clow360f3192014-06-02 02:22:49989 if (__r == __p + __sz)
990 return __npos;
991 return static_cast<_SizeT>(__r - __p);
992}
993
994
Marshall Clow37025e12014-06-10 18:51:55995// __str_rfind
Marshall Clow360f3192014-06-02 02:22:49996
997template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
998_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55999__str_rfind(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:491000 _CharT __c, _SizeT __pos) _NOEXCEPT
1001{
1002 if (__sz < 1)
Marshall Clowd5549cc2014-07-17 15:32:201003 return __npos;
1004 if (__pos < __sz)
1005 ++__pos;
1006 else
1007 __pos = __sz;
1008 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1009 {
1010 if (_Traits::eq(*--__ps, __c))
1011 return static_cast<_SizeT>(__ps - __p);
1012 }
Marshall Clow360f3192014-06-02 02:22:491013 return __npos;
1014}
1015
1016template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1017_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:551018__str_rfind(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:491019 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1020{
1021 __pos = _VSTD::min(__pos, __sz);
1022 if (__n < __sz - __pos)
1023 __pos += __n;
1024 else
1025 __pos = __sz;
Marshall Clow37025e12014-06-10 18:51:551026 const _CharT* __r = _VSTD::__find_end(
1027 __p, __p + __pos, __s, __s + __n, _Traits::eq,
1028 random_access_iterator_tag(), random_access_iterator_tag());
Marshall Clow360f3192014-06-02 02:22:491029 if (__n > 0 && __r == __p + __pos)
1030 return __npos;
1031 return static_cast<_SizeT>(__r - __p);
1032}
1033
Marshall Clow37025e12014-06-10 18:51:551034// __str_find_first_of
Marshall Clow360f3192014-06-02 02:22:491035template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1036_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:551037__str_find_first_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:491038 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:281039{
1040 if (__pos >= __sz || __n == 0)
1041 return __npos;
Marshall Clow37025e12014-06-10 18:51:551042 const _CharT* __r = _VSTD::__find_first_of_ce
Marshall Clowb671fc92013-12-09 16:00:281043 (__p + __pos, __p + __sz, __s, __s + __n, _Traits::eq );
1044 if (__r == __p + __sz)
1045 return __npos;
1046 return static_cast<_SizeT>(__r - __p);
1047}
1048
Marshall Clow360f3192014-06-02 02:22:491049
Marshall Clow37025e12014-06-10 18:51:551050// __str_find_last_of
Marshall Clowb671fc92013-12-09 16:00:281051template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:491052_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:551053__str_find_last_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:491054 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:281055 {
1056 if (__n != 0)
1057 {
1058 if (__pos < __sz)
1059 ++__pos;
1060 else
1061 __pos = __sz;
1062 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1063 {
1064 const _CharT* __r = _Traits::find(__s, __n, *--__ps);
1065 if (__r)
1066 return static_cast<_SizeT>(__ps - __p);
1067 }
1068 }
1069 return __npos;
1070}
1071
1072
Marshall Clow37025e12014-06-10 18:51:551073// __str_find_first_not_of
Marshall Clowb671fc92013-12-09 16:00:281074template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:491075_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:551076__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:491077 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:281078{
1079 if (__pos < __sz)
1080 {
1081 const _CharT* __pe = __p + __sz;
1082 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1083 if (_Traits::find(__s, __n, *__ps) == 0)
1084 return static_cast<_SizeT>(__ps - __p);
1085 }
1086 return __npos;
1087}
1088
1089
1090template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:491091_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:551092__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:491093 _CharT __c, _SizeT __pos) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:281094{
1095 if (__pos < __sz)
1096 {
1097 const _CharT* __pe = __p + __sz;
1098 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1099 if (!_Traits::eq(*__ps, __c))
1100 return static_cast<_SizeT>(__ps - __p);
1101 }
1102 return __npos;
1103}
1104
1105
Marshall Clow37025e12014-06-10 18:51:551106// __str_find_last_not_of
Marshall Clowb671fc92013-12-09 16:00:281107template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:491108_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:551109__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:491110 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:281111{
1112 if (__pos < __sz)
1113 ++__pos;
1114 else
1115 __pos = __sz;
1116 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1117 if (_Traits::find(__s, __n, *--__ps) == 0)
1118 return static_cast<_SizeT>(__ps - __p);
1119 return __npos;
1120}
1121
1122
1123template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:491124_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:551125__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:491126 _CharT __c, _SizeT __pos) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:281127{
1128 if (__pos < __sz)
1129 ++__pos;
1130 else
1131 __pos = __sz;
1132 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1133 if (!_Traits::eq(*--__ps, __c))
1134 return static_cast<_SizeT>(__ps - __p);
1135 return __npos;
1136}
1137
1138template<class _Ptr>
1139size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e)
1140{
1141 typedef typename iterator_traits<_Ptr>::value_type value_type;
1142 return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type));
1143}
1144
Howard Hinnantbc8d3f92010-05-11 19:42:161145// basic_string
1146
1147template<class _CharT, class _Traits, class _Allocator>
1148basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:171149operator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
1150 const basic_string<_CharT, _Traits, _Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:161151
1152template<class _CharT, class _Traits, class _Allocator>
1153basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:171154operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:161155
1156template<class _CharT, class _Traits, class _Allocator>
1157basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:171158operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:161159
1160template<class _CharT, class _Traits, class _Allocator>
1161basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:171162operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
Howard Hinnantbc8d3f92010-05-11 19:42:161163
1164template<class _CharT, class _Traits, class _Allocator>
1165basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:171166operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
Howard Hinnantbc8d3f92010-05-11 19:42:161167
1168template <bool>
Howard Hinnant0f678bd2013-08-12 18:38:341169class _LIBCPP_TYPE_VIS_ONLY __basic_string_common
Howard Hinnantbc8d3f92010-05-11 19:42:161170{
1171protected:
1172 void __throw_length_error() const;
1173 void __throw_out_of_range() const;
1174};
1175
1176template <bool __b>
1177void
1178__basic_string_common<__b>::__throw_length_error() const
1179{
1180#ifndef _LIBCPP_NO_EXCEPTIONS
1181 throw length_error("basic_string");
1182#else
1183 assert(!"basic_string length_error");
1184#endif
1185}
1186
1187template <bool __b>
1188void
1189__basic_string_common<__b>::__throw_out_of_range() const
1190{
1191#ifndef _LIBCPP_NO_EXCEPTIONS
1192 throw out_of_range("basic_string");
1193#else
1194 assert(!"basic_string out_of_range");
1195#endif
1196}
1197
Howard Hinnante9df0a52013-08-01 18:17:341198#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:451199#pragma warning( push )
1200#pragma warning( disable: 4231 )
Howard Hinnante9df0a52013-08-01 18:17:341201#endif // _LIBCPP_MSVC
Howard Hinnant0f678bd2013-08-12 18:38:341202_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS __basic_string_common<true>)
Howard Hinnante9df0a52013-08-01 18:17:341203#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:451204#pragma warning( pop )
Howard Hinnante9df0a52013-08-01 18:17:341205#endif // _LIBCPP_MSVC
Howard Hinnantbc8d3f92010-05-11 19:42:161206
Marshall Clowdf9db312016-01-13 21:54:341207#ifdef _LIBCPP_NO_EXCEPTIONS
1208template <class _Iter>
1209struct __libcpp_string_gets_noexcept_iterator_impl : public true_type {};
1210#elif defined(_LIBCPP_HAS_NO_NOEXCEPT)
1211template <class _Iter>
1212struct __libcpp_string_gets_noexcept_iterator_impl : public false_type {};
1213#else
1214template <class _Iter, bool = __is_forward_iterator<_Iter>::value>
1215struct __libcpp_string_gets_noexcept_iterator_impl : public _LIBCPP_BOOL_CONSTANT((
1216 noexcept(++(declval<_Iter&>())) &&
1217 is_nothrow_assignable<_Iter&, _Iter>::value &&
1218 noexcept(declval<_Iter>() == declval<_Iter>()) &&
1219 noexcept(*declval<_Iter>())
1220)) {};
1221
1222template <class _Iter>
1223struct __libcpp_string_gets_noexcept_iterator_impl<_Iter, false> : public false_type {};
1224#endif
1225
1226
1227template <class _Iter>
1228struct __libcpp_string_gets_noexcept_iterator
1229 : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value || __libcpp_string_gets_noexcept_iterator_impl<_Iter>::value) {};
1230
Evgeniy Stepanov4f01aa82015-10-13 23:48:281231#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:481232
1233template <class _CharT, size_t = sizeof(_CharT)>
1234struct __padding
1235{
1236 unsigned char __xx[sizeof(_CharT)-1];
1237};
1238
1239template <class _CharT>
1240struct __padding<_CharT, 1>
1241{
1242};
1243
Evgeniy Stepanov4f01aa82015-10-13 23:48:281244#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:481245
Howard Hinnant324bb032010-08-22 00:02:431246template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:341247class _LIBCPP_TYPE_VIS_ONLY basic_string
Howard Hinnantbc8d3f92010-05-11 19:42:161248 : private __basic_string_common<true>
1249{
1250public:
1251 typedef basic_string __self;
1252 typedef _Traits traits_type;
1253 typedef typename traits_type::char_type value_type;
1254 typedef _Allocator allocator_type;
Howard Hinnante32b5e22010-11-17 17:55:081255 typedef allocator_traits<allocator_type> __alloc_traits;
1256 typedef typename __alloc_traits::size_type size_type;
1257 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant53f7d4c2011-06-03 18:40:471258 typedef value_type& reference;
1259 typedef const value_type& const_reference;
Howard Hinnante32b5e22010-11-17 17:55:081260 typedef typename __alloc_traits::pointer pointer;
1261 typedef typename __alloc_traits::const_pointer const_pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:161262
Howard Hinnant499cea12013-08-23 17:37:051263 static_assert(is_pod<value_type>::value, "Character type of basic_string must be a POD");
1264 static_assert((is_same<_CharT, value_type>::value),
1265 "traits_type::char_type must be the same type as CharT");
1266 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1267 "Allocator::value_type must be same type as value_type");
1268#if defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnantbc8d3f92010-05-11 19:42:161269 typedef pointer iterator;
1270 typedef const_pointer const_iterator;
Howard Hinnant324bb032010-08-22 00:02:431271#else // defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnantbc8d3f92010-05-11 19:42:161272 typedef __wrap_iter<pointer> iterator;
1273 typedef __wrap_iter<const_pointer> const_iterator;
Howard Hinnant324bb032010-08-22 00:02:431274#endif // defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnant0949eed2011-06-30 21:18:191275 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1276 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:161277
1278private:
Howard Hinnant15467182013-04-30 21:44:481279
Evgeniy Stepanov4f01aa82015-10-13 23:48:281280#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:481281
1282 struct __long
1283 {
1284 pointer __data_;
1285 size_type __size_;
1286 size_type __cap_;
1287 };
1288
1289#if _LIBCPP_BIG_ENDIAN
1290 enum {__short_mask = 0x01};
1291 enum {__long_mask = 0x1ul};
1292#else // _LIBCPP_BIG_ENDIAN
1293 enum {__short_mask = 0x80};
1294 enum {__long_mask = ~(size_type(~0) >> 1)};
1295#endif // _LIBCPP_BIG_ENDIAN
1296
1297 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1298 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1299
1300 struct __short
1301 {
1302 value_type __data_[__min_cap];
1303 struct
1304 : __padding<value_type>
1305 {
1306 unsigned char __size_;
1307 };
1308 };
1309
1310#else
1311
Howard Hinnantbc8d3f92010-05-11 19:42:161312 struct __long
1313 {
1314 size_type __cap_;
1315 size_type __size_;
1316 pointer __data_;
1317 };
1318
1319#if _LIBCPP_BIG_ENDIAN
1320 enum {__short_mask = 0x80};
1321 enum {__long_mask = ~(size_type(~0) >> 1)};
Howard Hinnant324bb032010-08-22 00:02:431322#else // _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:161323 enum {__short_mask = 0x01};
Howard Hinnantec3773c2011-12-01 20:21:041324 enum {__long_mask = 0x1ul};
Howard Hinnant324bb032010-08-22 00:02:431325#endif // _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:161326
Howard Hinnantbc8d3f92010-05-11 19:42:161327 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1328 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1329
1330 struct __short
1331 {
1332 union
1333 {
1334 unsigned char __size_;
Howard Hinnant9c0df142012-10-30 19:06:591335 value_type __lx;
Howard Hinnantbc8d3f92010-05-11 19:42:161336 };
1337 value_type __data_[__min_cap];
1338 };
1339
Evgeniy Stepanov4f01aa82015-10-13 23:48:281340#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:481341
Howard Hinnant499cea12013-08-23 17:37:051342 union __ulx{__long __lx; __short __lxx;};
Howard Hinnantbc8d3f92010-05-11 19:42:161343
Howard Hinnant499cea12013-08-23 17:37:051344 enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
Howard Hinnantbc8d3f92010-05-11 19:42:161345
1346 struct __raw
1347 {
1348 size_type __words[__n_words];
1349 };
1350
1351 struct __rep
1352 {
1353 union
1354 {
1355 __long __l;
1356 __short __s;
1357 __raw __r;
1358 };
1359 };
1360
1361 __compressed_pair<__rep, allocator_type> __r_;
1362
Howard Hinnantbc8d3f92010-05-11 19:42:161363public:
1364 static const size_type npos = -1;
1365
Howard Hinnant53f7d4c2011-06-03 18:40:471366 _LIBCPP_INLINE_VISIBILITY basic_string()
1367 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Marshall Clow7b193f72015-06-03 19:56:431368
1369 _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a)
1370#if _LIBCPP_STD_VER <= 14
1371 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
1372#else
1373 _NOEXCEPT;
1374#endif
1375
Howard Hinnantbc8d3f92010-05-11 19:42:161376 basic_string(const basic_string& __str);
1377 basic_string(const basic_string& __str, const allocator_type& __a);
Marshall Clow7b193f72015-06-03 19:56:431378
Howard Hinnant73d21a42010-09-04 23:28:191379#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant9f193f22011-01-26 00:06:591380 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:471381 basic_string(basic_string&& __str)
Marshall Clow7b193f72015-06-03 19:56:431382#if _LIBCPP_STD_VER <= 14
Howard Hinnant53f7d4c2011-06-03 18:40:471383 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clow7b193f72015-06-03 19:56:431384#else
1385 _NOEXCEPT;
1386#endif
1387
Howard Hinnant9f193f22011-01-26 00:06:591388 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161389 basic_string(basic_string&& __str, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:191390#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant9dcdcde2013-06-28 16:59:191391 _LIBCPP_INLINE_VISIBILITY basic_string(const value_type* __s);
Howard Hinnant2d72b1e2010-12-17 14:46:431392 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191393 basic_string(const value_type* __s, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:431394 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191395 basic_string(const value_type* __s, size_type __n);
Howard Hinnant2d72b1e2010-12-17 14:46:431396 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191397 basic_string(const value_type* __s, size_type __n, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:431398 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161399 basic_string(size_type __n, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:431400 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161401 basic_string(size_type __n, value_type __c, const allocator_type& __a);
Marshall Clowff0b9f52016-03-09 17:51:431402 basic_string(const basic_string& __str, size_type __pos, size_type __n,
1403 const allocator_type& __a = allocator_type());
1404 basic_string(const basic_string& __str, size_type __pos,
Howard Hinnantbc8d3f92010-05-11 19:42:161405 const allocator_type& __a = allocator_type());
1406 template<class _InputIterator>
Howard Hinnant2d72b1e2010-12-17 14:46:431407 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161408 basic_string(_InputIterator __first, _InputIterator __last);
1409 template<class _InputIterator>
Howard Hinnant2d72b1e2010-12-17 14:46:431410 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161411 basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:021412#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant2d72b1e2010-12-17 14:46:431413 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161414 basic_string(initializer_list<value_type> __il);
Howard Hinnant2d72b1e2010-12-17 14:46:431415 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161416 basic_string(initializer_list<value_type> __il, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:021417#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161418
1419 ~basic_string();
1420
Howard Hinnante32b5e22010-11-17 17:55:081421 basic_string& operator=(const basic_string& __str);
Howard Hinnant73d21a42010-09-04 23:28:191422#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:431423 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:471424 basic_string& operator=(basic_string&& __str)
Marshall Clowaf961ed2015-08-18 18:57:001425 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Howard Hinnantbc8d3f92010-05-11 19:42:161426#endif
Howard Hinnant9dcdcde2013-06-28 16:59:191427 _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);}
Howard Hinnantbc8d3f92010-05-11 19:42:161428 basic_string& operator=(value_type __c);
Howard Hinnante3e32912011-08-12 21:56:021429#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:071430 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161431 basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:021432#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161433
Howard Hinnant499cea12013-08-23 17:37:051434#if _LIBCPP_DEBUG_LEVEL >= 2
1435 _LIBCPP_INLINE_VISIBILITY
1436 iterator begin() _NOEXCEPT
1437 {return iterator(this, __get_pointer());}
1438 _LIBCPP_INLINE_VISIBILITY
1439 const_iterator begin() const _NOEXCEPT
1440 {return const_iterator(this, __get_pointer());}
1441 _LIBCPP_INLINE_VISIBILITY
1442 iterator end() _NOEXCEPT
1443 {return iterator(this, __get_pointer() + size());}
1444 _LIBCPP_INLINE_VISIBILITY
1445 const_iterator end() const _NOEXCEPT
1446 {return const_iterator(this, __get_pointer() + size());}
1447#else
Howard Hinnanta6119a82011-05-29 19:57:121448 _LIBCPP_INLINE_VISIBILITY
1449 iterator begin() _NOEXCEPT
1450 {return iterator(__get_pointer());}
1451 _LIBCPP_INLINE_VISIBILITY
1452 const_iterator begin() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:191453 {return const_iterator(__get_pointer());}
Howard Hinnanta6119a82011-05-29 19:57:121454 _LIBCPP_INLINE_VISIBILITY
1455 iterator end() _NOEXCEPT
1456 {return iterator(__get_pointer() + size());}
1457 _LIBCPP_INLINE_VISIBILITY
1458 const_iterator end() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:191459 {return const_iterator(__get_pointer() + size());}
Howard Hinnant499cea12013-08-23 17:37:051460#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnanta6119a82011-05-29 19:57:121461 _LIBCPP_INLINE_VISIBILITY
1462 reverse_iterator rbegin() _NOEXCEPT
1463 {return reverse_iterator(end());}
1464 _LIBCPP_INLINE_VISIBILITY
1465 const_reverse_iterator rbegin() const _NOEXCEPT
1466 {return const_reverse_iterator(end());}
1467 _LIBCPP_INLINE_VISIBILITY
1468 reverse_iterator rend() _NOEXCEPT
1469 {return reverse_iterator(begin());}
1470 _LIBCPP_INLINE_VISIBILITY
1471 const_reverse_iterator rend() const _NOEXCEPT
1472 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:161473
Howard Hinnanta6119a82011-05-29 19:57:121474 _LIBCPP_INLINE_VISIBILITY
1475 const_iterator cbegin() const _NOEXCEPT
1476 {return begin();}
1477 _LIBCPP_INLINE_VISIBILITY
1478 const_iterator cend() const _NOEXCEPT
1479 {return end();}
1480 _LIBCPP_INLINE_VISIBILITY
1481 const_reverse_iterator crbegin() const _NOEXCEPT
1482 {return rbegin();}
1483 _LIBCPP_INLINE_VISIBILITY
1484 const_reverse_iterator crend() const _NOEXCEPT
1485 {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:161486
Howard Hinnanta6119a82011-05-29 19:57:121487 _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:161488 {return __is_long() ? __get_long_size() : __get_short_size();}
Howard Hinnanta6119a82011-05-29 19:57:121489 _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
1490 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
1491 _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
Eric Fiseliere2d48922015-08-28 07:02:421492 {return (__is_long() ? __get_long_cap()
1493 : static_cast<size_type>(__min_cap)) - 1;}
Howard Hinnantbc8d3f92010-05-11 19:42:161494
1495 void resize(size_type __n, value_type __c);
1496 _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
1497
1498 void reserve(size_type res_arg = 0);
Howard Hinnant8d7a9552010-09-23 17:31:071499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:471500 void shrink_to_fit() _NOEXCEPT {reserve();}
Howard Hinnant2d72b1e2010-12-17 14:46:431501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121502 void clear() _NOEXCEPT;
1503 _LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:161504
1505 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const;
1506 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos);
1507
1508 const_reference at(size_type __n) const;
1509 reference at(size_type __n);
1510
1511 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
Howard Hinnant9dcdcde2013-06-28 16:59:191512 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s) {return append(__s);}
Howard Hinnantbc8d3f92010-05-11 19:42:161513 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;}
Howard Hinnante3e32912011-08-12 21:56:021514#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161515 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
Howard Hinnante3e32912011-08-12 21:56:021516#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161517
Howard Hinnant2d72b1e2010-12-17 14:46:431518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161519 basic_string& append(const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:191520 basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:191521 basic_string& append(const value_type* __s, size_type __n);
1522 basic_string& append(const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:161523 basic_string& append(size_type __n, value_type __c);
1524 template<class _InputIterator>
1525 typename enable_if
1526 <
Marshall Clowdf9db312016-01-13 21:54:341527 __is_exactly_input_iterator<_InputIterator>::value
1528 || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:161529 basic_string&
1530 >::type
1531 append(_InputIterator __first, _InputIterator __last);
1532 template<class _ForwardIterator>
1533 typename enable_if
1534 <
Marshall Clowdf9db312016-01-13 21:54:341535 __is_forward_iterator<_ForwardIterator>::value
1536 && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:161537 basic_string&
1538 >::type
1539 append(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:021540#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:071541 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161542 basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:021543#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161544
1545 void push_back(value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:431546 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161547 void pop_back();
Howard Hinnant2d72b1e2010-12-17 14:46:431548 _LIBCPP_INLINE_VISIBILITY reference front();
1549 _LIBCPP_INLINE_VISIBILITY const_reference front() const;
1550 _LIBCPP_INLINE_VISIBILITY reference back();
1551 _LIBCPP_INLINE_VISIBILITY const_reference back() const;
Howard Hinnantbc8d3f92010-05-11 19:42:161552
Howard Hinnant2d72b1e2010-12-17 14:46:431553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161554 basic_string& assign(const basic_string& __str);
Howard Hinnanta6119a82011-05-29 19:57:121555#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1556 _LIBCPP_INLINE_VISIBILITY
1557 basic_string& assign(basic_string&& str)
Marshall Clow7ed093b2015-10-05 16:17:341558 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnant0949eed2011-06-30 21:18:191559 {*this = _VSTD::move(str); return *this;}
Howard Hinnanta6119a82011-05-29 19:57:121560#endif
Marshall Clowa93b5e22014-03-04 19:17:191561 basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:191562 basic_string& assign(const value_type* __s, size_type __n);
1563 basic_string& assign(const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:161564 basic_string& assign(size_type __n, value_type __c);
1565 template<class _InputIterator>
1566 typename enable_if
1567 <
Marshall Clowdf9db312016-01-13 21:54:341568 __is_exactly_input_iterator<_InputIterator>::value
1569 || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:161570 basic_string&
1571 >::type
1572 assign(_InputIterator __first, _InputIterator __last);
1573 template<class _ForwardIterator>
1574 typename enable_if
1575 <
Marshall Clowdf9db312016-01-13 21:54:341576 __is_forward_iterator<_ForwardIterator>::value
1577 && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:161578 basic_string&
1579 >::type
1580 assign(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:021581#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:071582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161583 basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:021584#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161585
Howard Hinnant2d72b1e2010-12-17 14:46:431586 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161587 basic_string& insert(size_type __pos1, const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:191588 basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:191589 basic_string& insert(size_type __pos, const value_type* __s, size_type __n);
1590 basic_string& insert(size_type __pos, const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:161591 basic_string& insert(size_type __pos, size_type __n, value_type __c);
1592 iterator insert(const_iterator __pos, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:431593 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161594 iterator insert(const_iterator __pos, size_type __n, value_type __c);
1595 template<class _InputIterator>
1596 typename enable_if
1597 <
Marshall Clowdf9db312016-01-13 21:54:341598 __is_exactly_input_iterator<_InputIterator>::value
1599 || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:161600 iterator
1601 >::type
1602 insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
1603 template<class _ForwardIterator>
1604 typename enable_if
1605 <
Marshall Clowdf9db312016-01-13 21:54:341606 __is_forward_iterator<_ForwardIterator>::value
1607 && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:161608 iterator
1609 >::type
1610 insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:021611#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:071612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161613 iterator insert(const_iterator __pos, initializer_list<value_type> __il)
1614 {return insert(__pos, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:021615#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161616
1617 basic_string& erase(size_type __pos = 0, size_type __n = npos);
Howard Hinnant2d72b1e2010-12-17 14:46:431618 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161619 iterator erase(const_iterator __pos);
Howard Hinnant2d72b1e2010-12-17 14:46:431620 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161621 iterator erase(const_iterator __first, const_iterator __last);
1622
Howard Hinnant2d72b1e2010-12-17 14:46:431623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161624 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:191625 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:191626 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
1627 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:161628 basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:431629 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:401630 basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
Howard Hinnant2d72b1e2010-12-17 14:46:431631 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191632 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n);
Howard Hinnant2d72b1e2010-12-17 14:46:431633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191634 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s);
Howard Hinnant2d72b1e2010-12-17 14:46:431635 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:401636 basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
Howard Hinnantbc8d3f92010-05-11 19:42:161637 template<class _InputIterator>
1638 typename enable_if
1639 <
1640 __is_input_iterator<_InputIterator>::value,
1641 basic_string&
1642 >::type
Howard Hinnant7b2cb482010-11-17 21:11:401643 replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
Howard Hinnante3e32912011-08-12 21:56:021644#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:071645 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:401646 basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
Howard Hinnantbc8d3f92010-05-11 19:42:161647 {return replace(__i1, __i2, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:021648#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161649
Howard Hinnant9dcdcde2013-06-28 16:59:191650 size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
Howard Hinnant2d72b1e2010-12-17 14:46:431651 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161652 basic_string substr(size_type __pos = 0, size_type __n = npos) const;
1653
Howard Hinnant2d72b1e2010-12-17 14:46:431654 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:471655 void swap(basic_string& __str)
Marshall Clow7d914d12015-07-13 20:04:561656#if _LIBCPP_STD_VER >= 14
1657 _NOEXCEPT;
1658#else
1659 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1660 __is_nothrow_swappable<allocator_type>::value);
1661#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161662
Howard Hinnant2d72b1e2010-12-17 14:46:431663 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191664 const value_type* c_str() const _NOEXCEPT {return data();}
Howard Hinnant2d72b1e2010-12-17 14:46:431665 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191666 const value_type* data() const _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());}
Marshall Clowf532a702016-03-08 15:44:301667#if _LIBCPP_STD_VER > 14
1668 _LIBCPP_INLINE_VISIBILITY
1669 value_type* data() _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());}
1670#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161671
Howard Hinnant2d72b1e2010-12-17 14:46:431672 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121673 allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
Howard Hinnantbc8d3f92010-05-11 19:42:161674
Howard Hinnant2d72b1e2010-12-17 14:46:431675 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121676 size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:191677 size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:431678 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191679 size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:121680 size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:161681
Howard Hinnant2d72b1e2010-12-17 14:46:431682 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121683 size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:191684 size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:431685 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191686 size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:121687 size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:161688
Howard Hinnant2d72b1e2010-12-17 14:46:431689 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121690 size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:191691 size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:431692 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191693 size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:431694 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121695 size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:161696
Howard Hinnant2d72b1e2010-12-17 14:46:431697 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121698 size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:191699 size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:431700 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191701 size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:431702 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121703 size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:161704
Howard Hinnant2d72b1e2010-12-17 14:46:431705 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121706 size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:191707 size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:121708 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191709 size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:121710 _LIBCPP_INLINE_VISIBILITY
1711 size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1712
1713 _LIBCPP_INLINE_VISIBILITY
1714 size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:191715 size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:121716 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:191717 size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:121718 _LIBCPP_INLINE_VISIBILITY
1719 size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1720
1721 _LIBCPP_INLINE_VISIBILITY
1722 int compare(const basic_string& __str) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:431723 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161724 int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
Marshall Clowa93b5e22014-03-04 19:17:191725 int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2=npos) const;
Howard Hinnant9dcdcde2013-06-28 16:59:191726 int compare(const value_type* __s) const _NOEXCEPT;
1727 int compare(size_type __pos1, size_type __n1, const value_type* __s) const;
1728 int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
Howard Hinnantbc8d3f92010-05-11 19:42:161729
Howard Hinnant2d72b1e2010-12-17 14:46:431730 _LIBCPP_INLINE_VISIBILITY bool __invariants() const;
Howard Hinnant08dd2532013-04-22 23:55:131731
1732 _LIBCPP_INLINE_VISIBILITY
1733 bool __is_long() const _NOEXCEPT
1734 {return bool(__r_.first().__s.__size_ & __short_mask);}
1735
Howard Hinnant499cea12013-08-23 17:37:051736#if _LIBCPP_DEBUG_LEVEL >= 2
1737
1738 bool __dereferenceable(const const_iterator* __i) const;
1739 bool __decrementable(const const_iterator* __i) const;
1740 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
1741 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
1742
1743#endif // _LIBCPP_DEBUG_LEVEL >= 2
1744
Howard Hinnantbc8d3f92010-05-11 19:42:161745private:
Howard Hinnanta6119a82011-05-29 19:57:121746 _LIBCPP_INLINE_VISIBILITY
1747 allocator_type& __alloc() _NOEXCEPT
1748 {return __r_.second();}
1749 _LIBCPP_INLINE_VISIBILITY
1750 const allocator_type& __alloc() const _NOEXCEPT
1751 {return __r_.second();}
Howard Hinnantbc8d3f92010-05-11 19:42:161752
Evgeniy Stepanov4f01aa82015-10-13 23:48:281753#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:481754
Howard Hinnanta6119a82011-05-29 19:57:121755 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:121756 void __set_short_size(size_type __s) _NOEXCEPT
Howard Hinnant15467182013-04-30 21:44:481757# if _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:161758 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
Howard Hinnant15467182013-04-30 21:44:481759# else
1760 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1761# endif
1762
Howard Hinnanta6119a82011-05-29 19:57:121763 _LIBCPP_INLINE_VISIBILITY
1764 size_type __get_short_size() const _NOEXCEPT
Howard Hinnant15467182013-04-30 21:44:481765# if _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:161766 {return __r_.first().__s.__size_ >> 1;}
Howard Hinnant15467182013-04-30 21:44:481767# else
1768 {return __r_.first().__s.__size_;}
1769# endif
1770
Evgeniy Stepanov4f01aa82015-10-13 23:48:281771#else // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:481772
1773 _LIBCPP_INLINE_VISIBILITY
1774 void __set_short_size(size_type __s) _NOEXCEPT
1775# if _LIBCPP_BIG_ENDIAN
1776 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1777# else
1778 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
1779# endif
1780
1781 _LIBCPP_INLINE_VISIBILITY
1782 size_type __get_short_size() const _NOEXCEPT
1783# if _LIBCPP_BIG_ENDIAN
1784 {return __r_.first().__s.__size_;}
1785# else
1786 {return __r_.first().__s.__size_ >> 1;}
1787# endif
1788
Evgeniy Stepanov4f01aa82015-10-13 23:48:281789#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:481790
Howard Hinnanta6119a82011-05-29 19:57:121791 _LIBCPP_INLINE_VISIBILITY
1792 void __set_long_size(size_type __s) _NOEXCEPT
1793 {__r_.first().__l.__size_ = __s;}
1794 _LIBCPP_INLINE_VISIBILITY
1795 size_type __get_long_size() const _NOEXCEPT
1796 {return __r_.first().__l.__size_;}
1797 _LIBCPP_INLINE_VISIBILITY
1798 void __set_size(size_type __s) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:161799 {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
1800
Howard Hinnanta6119a82011-05-29 19:57:121801 _LIBCPP_INLINE_VISIBILITY
1802 void __set_long_cap(size_type __s) _NOEXCEPT
1803 {__r_.first().__l.__cap_ = __long_mask | __s;}
1804 _LIBCPP_INLINE_VISIBILITY
1805 size_type __get_long_cap() const _NOEXCEPT
Howard Hinnantec3773c2011-12-01 20:21:041806 {return __r_.first().__l.__cap_ & size_type(~__long_mask);}
Howard Hinnantbc8d3f92010-05-11 19:42:161807
Howard Hinnanta6119a82011-05-29 19:57:121808 _LIBCPP_INLINE_VISIBILITY
1809 void __set_long_pointer(pointer __p) _NOEXCEPT
1810 {__r_.first().__l.__data_ = __p;}
1811 _LIBCPP_INLINE_VISIBILITY
1812 pointer __get_long_pointer() _NOEXCEPT
1813 {return __r_.first().__l.__data_;}
1814 _LIBCPP_INLINE_VISIBILITY
1815 const_pointer __get_long_pointer() const _NOEXCEPT
1816 {return __r_.first().__l.__data_;}
1817 _LIBCPP_INLINE_VISIBILITY
1818 pointer __get_short_pointer() _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:191819 {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Howard Hinnanta6119a82011-05-29 19:57:121820 _LIBCPP_INLINE_VISIBILITY
1821 const_pointer __get_short_pointer() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:191822 {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Howard Hinnanta6119a82011-05-29 19:57:121823 _LIBCPP_INLINE_VISIBILITY
1824 pointer __get_pointer() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:161825 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
Howard Hinnanta6119a82011-05-29 19:57:121826 _LIBCPP_INLINE_VISIBILITY
1827 const_pointer __get_pointer() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:161828 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
1829
Howard Hinnanta6119a82011-05-29 19:57:121830 _LIBCPP_INLINE_VISIBILITY
1831 void __zero() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:161832 {
1833 size_type (&__a)[__n_words] = __r_.first().__r.__words;
1834 for (unsigned __i = 0; __i < __n_words; ++__i)
1835 __a[__i] = 0;
1836 }
1837
1838 template <size_type __a> static
Howard Hinnanta6119a82011-05-29 19:57:121839 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7f764502013-08-14 18:00:201840 size_type __align_it(size_type __s) _NOEXCEPT
Eric Fiseliere2d48922015-08-28 07:02:421841 {return (__s + (__a-1)) & ~(__a-1);}
Howard Hinnantbc8d3f92010-05-11 19:42:161842 enum {__alignment = 16};
Howard Hinnanta6119a82011-05-29 19:57:121843 static _LIBCPP_INLINE_VISIBILITY
1844 size_type __recommend(size_type __s) _NOEXCEPT
Eric Fiseliere2d48922015-08-28 07:02:421845 {return (__s < __min_cap ? static_cast<size_type>(__min_cap) :
Howard Hinnant7f764502013-08-14 18:00:201846 __align_it<sizeof(value_type) < __alignment ?
Howard Hinnanta6119a82011-05-29 19:57:121847 __alignment/sizeof(value_type) : 1 > (__s+1)) - 1;}
Howard Hinnantbc8d3f92010-05-11 19:42:161848
Howard Hinnant9dcdcde2013-06-28 16:59:191849 void __init(const value_type* __s, size_type __sz, size_type __reserve);
1850 void __init(const value_type* __s, size_type __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:161851 void __init(size_type __n, value_type __c);
Howard Hinnant324bb032010-08-22 00:02:431852
Howard Hinnantbc8d3f92010-05-11 19:42:161853 template <class _InputIterator>
1854 typename enable_if
1855 <
Marshall Clowdf9db312016-01-13 21:54:341856 __is_exactly_input_iterator<_InputIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:161857 void
1858 >::type
1859 __init(_InputIterator __first, _InputIterator __last);
1860
1861 template <class _ForwardIterator>
1862 typename enable_if
1863 <
1864 __is_forward_iterator<_ForwardIterator>::value,
1865 void
1866 >::type
1867 __init(_ForwardIterator __first, _ForwardIterator __last);
1868
1869 void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnant324bb032010-08-22 00:02:431870 size_type __n_copy, size_type __n_del, size_type __n_add = 0);
Howard Hinnantbc8d3f92010-05-11 19:42:161871 void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1872 size_type __n_copy, size_type __n_del,
Howard Hinnant9dcdcde2013-06-28 16:59:191873 size_type __n_add, const value_type* __p_new_stuff);
Howard Hinnantbc8d3f92010-05-11 19:42:161874
Howard Hinnant2d72b1e2010-12-17 14:46:431875 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161876 void __erase_to_end(size_type __pos);
1877
Howard Hinnante32b5e22010-11-17 17:55:081878 _LIBCPP_INLINE_VISIBILITY
1879 void __copy_assign_alloc(const basic_string& __str)
1880 {__copy_assign_alloc(__str, integral_constant<bool,
1881 __alloc_traits::propagate_on_container_copy_assignment::value>());}
1882
1883 _LIBCPP_INLINE_VISIBILITY
1884 void __copy_assign_alloc(const basic_string& __str, true_type)
1885 {
1886 if (__alloc() != __str.__alloc())
1887 {
1888 clear();
1889 shrink_to_fit();
1890 }
1891 __alloc() = __str.__alloc();
1892 }
1893
1894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:041895 void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
Howard Hinnante32b5e22010-11-17 17:55:081896 {}
1897
1898#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:431899 _LIBCPP_INLINE_VISIBILITY
Marshall Clowaf961ed2015-08-18 18:57:001900 void __move_assign(basic_string& __str, false_type)
1901 _NOEXCEPT_(__alloc_traits::is_always_equal::value);
Howard Hinnant2d72b1e2010-12-17 14:46:431902 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:471903 void __move_assign(basic_string& __str, true_type)
Marshall Clowaf961ed2015-08-18 18:57:001904#if _LIBCPP_STD_VER > 14
1905 _NOEXCEPT;
1906#else
Howard Hinnant53f7d4c2011-06-03 18:40:471907 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnante32b5e22010-11-17 17:55:081908#endif
Marshall Clowaf961ed2015-08-18 18:57:001909#endif
Howard Hinnante32b5e22010-11-17 17:55:081910
1911 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3fdbbd22011-08-17 20:36:181912 void
Howard Hinnant9cbee432011-09-02 20:42:311913 __move_assign_alloc(basic_string& __str)
Howard Hinnant3fdbbd22011-08-17 20:36:181914 _NOEXCEPT_(
1915 !__alloc_traits::propagate_on_container_move_assignment::value ||
1916 is_nothrow_move_assignable<allocator_type>::value)
1917 {__move_assign_alloc(__str, integral_constant<bool,
1918 __alloc_traits::propagate_on_container_move_assignment::value>());}
1919
1920 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9cbee432011-09-02 20:42:311921 void __move_assign_alloc(basic_string& __c, true_type)
Howard Hinnant3fdbbd22011-08-17 20:36:181922 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1923 {
1924 __alloc() = _VSTD::move(__c.__alloc());
1925 }
1926
1927 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:041928 void __move_assign_alloc(basic_string&, false_type)
Howard Hinnant3fdbbd22011-08-17 20:36:181929 _NOEXCEPT
1930 {}
1931
Howard Hinnant2d72b1e2010-12-17 14:46:431932 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
1933 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type);
Howard Hinnantbc8d3f92010-05-11 19:42:161934
1935 friend basic_string operator+<>(const basic_string&, const basic_string&);
1936 friend basic_string operator+<>(const value_type*, const basic_string&);
1937 friend basic_string operator+<>(value_type, const basic_string&);
1938 friend basic_string operator+<>(const basic_string&, const value_type*);
1939 friend basic_string operator+<>(const basic_string&, value_type);
1940};
1941
1942template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:001943inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161944void
1945basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators()
1946{
Howard Hinnant499cea12013-08-23 17:37:051947#if _LIBCPP_DEBUG_LEVEL >= 2
1948 __get_db()->__invalidate_all(this);
1949#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:161950}
1951
1952template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:001953inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161954void
Howard Hinnantec3773c2011-12-01 20:21:041955basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type
Howard Hinnant499cea12013-08-23 17:37:051956#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantec3773c2011-12-01 20:21:041957 __pos
1958#endif
1959 )
Howard Hinnantbc8d3f92010-05-11 19:42:161960{
Howard Hinnant499cea12013-08-23 17:37:051961#if _LIBCPP_DEBUG_LEVEL >= 2
1962 __c_node* __c = __get_db()->__find_c_and_lock(this);
1963 if (__c)
Howard Hinnantbc8d3f92010-05-11 19:42:161964 {
Howard Hinnant499cea12013-08-23 17:37:051965 const_pointer __new_last = __get_pointer() + __pos;
1966 for (__i_node** __p = __c->end_; __p != __c->beg_; )
Howard Hinnantbc8d3f92010-05-11 19:42:161967 {
Howard Hinnant499cea12013-08-23 17:37:051968 --__p;
1969 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
1970 if (__i->base() > __new_last)
Howard Hinnantbc8d3f92010-05-11 19:42:161971 {
Howard Hinnant499cea12013-08-23 17:37:051972 (*__p)->__c_ = nullptr;
1973 if (--__c->end_ != __p)
1974 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
Howard Hinnantbc8d3f92010-05-11 19:42:161975 }
Howard Hinnantbc8d3f92010-05-11 19:42:161976 }
Howard Hinnant499cea12013-08-23 17:37:051977 __get_db()->unlock();
Howard Hinnantbc8d3f92010-05-11 19:42:161978 }
Howard Hinnant499cea12013-08-23 17:37:051979#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:161980}
1981
1982template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:001983inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:471984basic_string<_CharT, _Traits, _Allocator>::basic_string()
Marshall Clowc912c0c2015-06-04 02:05:411985 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:161986{
Howard Hinnant499cea12013-08-23 17:37:051987#if _LIBCPP_DEBUG_LEVEL >= 2
1988 __get_db()->__insert_c(this);
1989#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161990 __zero();
1991}
1992
1993template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:001994inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161995basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
Eric Fiselier692177d2015-07-18 20:40:461996#if _LIBCPP_STD_VER <= 14
1997 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
1998#else
1999 _NOEXCEPT
2000#endif
2001: __r_(__a)
Howard Hinnantbc8d3f92010-05-11 19:42:162002{
Howard Hinnant499cea12013-08-23 17:37:052003#if _LIBCPP_DEBUG_LEVEL >= 2
2004 __get_db()->__insert_c(this);
2005#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162006 __zero();
2007}
2008
2009template <class _CharT, class _Traits, class _Allocator>
2010void
Howard Hinnant9dcdcde2013-06-28 16:59:192011basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz, size_type __reserve)
Howard Hinnantbc8d3f92010-05-11 19:42:162012{
2013 if (__reserve > max_size())
2014 this->__throw_length_error();
2015 pointer __p;
2016 if (__reserve < __min_cap)
2017 {
2018 __set_short_size(__sz);
2019 __p = __get_short_pointer();
2020 }
2021 else
2022 {
2023 size_type __cap = __recommend(__reserve);
Howard Hinnante32b5e22010-11-17 17:55:082024 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:162025 __set_long_pointer(__p);
2026 __set_long_cap(__cap+1);
2027 __set_long_size(__sz);
2028 }
Howard Hinnant9dcdcde2013-06-28 16:59:192029 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:162030 traits_type::assign(__p[__sz], value_type());
2031}
2032
2033template <class _CharT, class _Traits, class _Allocator>
2034void
Howard Hinnant9dcdcde2013-06-28 16:59:192035basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
Howard Hinnantbc8d3f92010-05-11 19:42:162036{
2037 if (__sz > max_size())
2038 this->__throw_length_error();
2039 pointer __p;
2040 if (__sz < __min_cap)
2041 {
2042 __set_short_size(__sz);
2043 __p = __get_short_pointer();
2044 }
2045 else
2046 {
2047 size_type __cap = __recommend(__sz);
Howard Hinnante32b5e22010-11-17 17:55:082048 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:162049 __set_long_pointer(__p);
2050 __set_long_cap(__cap+1);
2051 __set_long_size(__sz);
2052 }
Howard Hinnant9dcdcde2013-06-28 16:59:192053 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:162054 traits_type::assign(__p[__sz], value_type());
2055}
2056
2057template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002058inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:192059basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:162060{
Howard Hinnant499cea12013-08-23 17:37:052061 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162062 __init(__s, traits_type::length(__s));
Howard Hinnant499cea12013-08-23 17:37:052063#if _LIBCPP_DEBUG_LEVEL >= 2
2064 __get_db()->__insert_c(this);
2065#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162066}
2067
2068template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002069inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:192070basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:162071 : __r_(__a)
2072{
Howard Hinnant499cea12013-08-23 17:37:052073 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162074 __init(__s, traits_type::length(__s));
Howard Hinnant499cea12013-08-23 17:37:052075#if _LIBCPP_DEBUG_LEVEL >= 2
2076 __get_db()->__insert_c(this);
2077#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162078}
2079
2080template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002081inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:192082basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:162083{
Howard Hinnant499cea12013-08-23 17:37:052084 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162085 __init(__s, __n);
Howard Hinnant499cea12013-08-23 17:37:052086#if _LIBCPP_DEBUG_LEVEL >= 2
2087 __get_db()->__insert_c(this);
2088#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162089}
2090
2091template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002092inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:192093basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:162094 : __r_(__a)
2095{
Howard Hinnant499cea12013-08-23 17:37:052096 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162097 __init(__s, __n);
Howard Hinnant499cea12013-08-23 17:37:052098#if _LIBCPP_DEBUG_LEVEL >= 2
2099 __get_db()->__insert_c(this);
2100#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162101}
2102
2103template <class _CharT, class _Traits, class _Allocator>
2104basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
Howard Hinnante32b5e22010-11-17 17:55:082105 : __r_(__alloc_traits::select_on_container_copy_construction(__str.__alloc()))
Howard Hinnantbc8d3f92010-05-11 19:42:162106{
2107 if (!__str.__is_long())
2108 __r_.first().__r = __str.__r_.first().__r;
2109 else
Howard Hinnant9dcdcde2013-06-28 16:59:192110 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Howard Hinnant499cea12013-08-23 17:37:052111#if _LIBCPP_DEBUG_LEVEL >= 2
2112 __get_db()->__insert_c(this);
2113#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162114}
2115
2116template <class _CharT, class _Traits, class _Allocator>
2117basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, const allocator_type& __a)
2118 : __r_(__a)
2119{
2120 if (!__str.__is_long())
2121 __r_.first().__r = __str.__r_.first().__r;
2122 else
Howard Hinnant9dcdcde2013-06-28 16:59:192123 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Howard Hinnant499cea12013-08-23 17:37:052124#if _LIBCPP_DEBUG_LEVEL >= 2
2125 __get_db()->__insert_c(this);
2126#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162127}
2128
Howard Hinnant73d21a42010-09-04 23:28:192129#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:162130
2131template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002132inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:472133basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str)
Marshall Clow7b193f72015-06-03 19:56:432134#if _LIBCPP_STD_VER <= 14
Howard Hinnant53f7d4c2011-06-03 18:40:472135 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clow7b193f72015-06-03 19:56:432136#else
2137 _NOEXCEPT
2138#endif
Howard Hinnant0949eed2011-06-30 21:18:192139 : __r_(_VSTD::move(__str.__r_))
Howard Hinnantbc8d3f92010-05-11 19:42:162140{
2141 __str.__zero();
Howard Hinnant499cea12013-08-23 17:37:052142#if _LIBCPP_DEBUG_LEVEL >= 2
2143 __get_db()->__insert_c(this);
2144 if (__is_long())
2145 __get_db()->swap(this, &__str);
Howard Hinnantbc8d3f92010-05-11 19:42:162146#endif
2147}
2148
2149template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002150inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162151basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)
Howard Hinnante32b5e22010-11-17 17:55:082152 : __r_(__a)
Howard Hinnantbc8d3f92010-05-11 19:42:162153{
Marshall Clowd5549cc2014-07-17 15:32:202154 if (__str.__is_long() && __a != __str.__alloc()) // copy, not move
Howard Hinnant9dcdcde2013-06-28 16:59:192155 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Marshall Clowd5549cc2014-07-17 15:32:202156 else
2157 {
2158 __r_.first().__r = __str.__r_.first().__r;
2159 __str.__zero();
2160 }
Howard Hinnant499cea12013-08-23 17:37:052161#if _LIBCPP_DEBUG_LEVEL >= 2
2162 __get_db()->__insert_c(this);
2163 if (__is_long())
2164 __get_db()->swap(this, &__str);
Howard Hinnantbc8d3f92010-05-11 19:42:162165#endif
2166}
2167
Howard Hinnant73d21a42010-09-04 23:28:192168#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:162169
2170template <class _CharT, class _Traits, class _Allocator>
2171void
2172basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
2173{
2174 if (__n > max_size())
2175 this->__throw_length_error();
2176 pointer __p;
2177 if (__n < __min_cap)
2178 {
2179 __set_short_size(__n);
2180 __p = __get_short_pointer();
2181 }
2182 else
2183 {
2184 size_type __cap = __recommend(__n);
Howard Hinnante32b5e22010-11-17 17:55:082185 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:162186 __set_long_pointer(__p);
2187 __set_long_cap(__cap+1);
2188 __set_long_size(__n);
2189 }
Howard Hinnant9dcdcde2013-06-28 16:59:192190 traits_type::assign(_VSTD::__to_raw_pointer(__p), __n, __c);
Howard Hinnantbc8d3f92010-05-11 19:42:162191 traits_type::assign(__p[__n], value_type());
2192}
2193
2194template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002195inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162196basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c)
2197{
2198 __init(__n, __c);
Howard Hinnant499cea12013-08-23 17:37:052199#if _LIBCPP_DEBUG_LEVEL >= 2
2200 __get_db()->__insert_c(this);
2201#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162202}
2203
2204template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002205inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162206basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c, const allocator_type& __a)
2207 : __r_(__a)
2208{
2209 __init(__n, __c);
Howard Hinnant499cea12013-08-23 17:37:052210#if _LIBCPP_DEBUG_LEVEL >= 2
2211 __get_db()->__insert_c(this);
2212#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162213}
2214
Howard Hinnantbc8d3f92010-05-11 19:42:162215template <class _CharT, class _Traits, class _Allocator>
2216basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, size_type __n,
2217 const allocator_type& __a)
2218 : __r_(__a)
2219{
2220 size_type __str_sz = __str.size();
2221 if (__pos > __str_sz)
2222 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:192223 __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos));
Howard Hinnant499cea12013-08-23 17:37:052224#if _LIBCPP_DEBUG_LEVEL >= 2
2225 __get_db()->__insert_c(this);
2226#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162227}
2228
2229template <class _CharT, class _Traits, class _Allocator>
Marshall Clowff0b9f52016-03-09 17:51:432230basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos,
2231 const allocator_type& __a)
2232 : __r_(__a)
2233{
2234 size_type __str_sz = __str.size();
2235 if (__pos > __str_sz)
2236 this->__throw_out_of_range();
2237 __init(__str.data() + __pos, __str_sz - __pos);
2238#if _LIBCPP_DEBUG_LEVEL >= 2
2239 __get_db()->__insert_c(this);
2240#endif
2241}
2242
2243template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:162244template <class _InputIterator>
2245typename enable_if
2246<
Marshall Clowdf9db312016-01-13 21:54:342247 __is_exactly_input_iterator<_InputIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:162248 void
2249>::type
2250basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
2251{
2252 __zero();
2253#ifndef _LIBCPP_NO_EXCEPTIONS
2254 try
2255 {
Howard Hinnant324bb032010-08-22 00:02:432256#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:162257 for (; __first != __last; ++__first)
2258 push_back(*__first);
2259#ifndef _LIBCPP_NO_EXCEPTIONS
2260 }
2261 catch (...)
2262 {
2263 if (__is_long())
Howard Hinnante32b5e22010-11-17 17:55:082264 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:162265 throw;
2266 }
Howard Hinnant324bb032010-08-22 00:02:432267#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:162268}
2269
2270template <class _CharT, class _Traits, class _Allocator>
2271template <class _ForwardIterator>
2272typename enable_if
2273<
2274 __is_forward_iterator<_ForwardIterator>::value,
2275 void
2276>::type
2277basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
2278{
Howard Hinnant0949eed2011-06-30 21:18:192279 size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:162280 if (__sz > max_size())
2281 this->__throw_length_error();
2282 pointer __p;
2283 if (__sz < __min_cap)
2284 {
2285 __set_short_size(__sz);
2286 __p = __get_short_pointer();
2287 }
2288 else
2289 {
2290 size_type __cap = __recommend(__sz);
Howard Hinnante32b5e22010-11-17 17:55:082291 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:162292 __set_long_pointer(__p);
2293 __set_long_cap(__cap+1);
2294 __set_long_size(__sz);
2295 }
Eric Fiselierb9919752014-10-27 19:28:202296 for (; __first != __last; ++__first, (void) ++__p)
Howard Hinnantbc8d3f92010-05-11 19:42:162297 traits_type::assign(*__p, *__first);
2298 traits_type::assign(*__p, value_type());
2299}
2300
2301template <class _CharT, class _Traits, class _Allocator>
2302template<class _InputIterator>
Howard Hinnant1e564242013-10-04 22:09:002303inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162304basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last)
2305{
2306 __init(__first, __last);
Howard Hinnant499cea12013-08-23 17:37:052307#if _LIBCPP_DEBUG_LEVEL >= 2
2308 __get_db()->__insert_c(this);
2309#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162310}
2311
2312template <class _CharT, class _Traits, class _Allocator>
2313template<class _InputIterator>
Howard Hinnant1e564242013-10-04 22:09:002314inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162315basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last,
2316 const allocator_type& __a)
2317 : __r_(__a)
2318{
2319 __init(__first, __last);
Howard Hinnant499cea12013-08-23 17:37:052320#if _LIBCPP_DEBUG_LEVEL >= 2
2321 __get_db()->__insert_c(this);
2322#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162323}
2324
Howard Hinnante3e32912011-08-12 21:56:022325#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2326
Howard Hinnantbc8d3f92010-05-11 19:42:162327template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002328inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162329basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il)
2330{
2331 __init(__il.begin(), __il.end());
Howard Hinnant499cea12013-08-23 17:37:052332#if _LIBCPP_DEBUG_LEVEL >= 2
2333 __get_db()->__insert_c(this);
2334#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162335}
2336
2337template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002338inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162339basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il, const allocator_type& __a)
2340 : __r_(__a)
2341{
2342 __init(__il.begin(), __il.end());
Howard Hinnant499cea12013-08-23 17:37:052343#if _LIBCPP_DEBUG_LEVEL >= 2
2344 __get_db()->__insert_c(this);
2345#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162346}
2347
Howard Hinnante3e32912011-08-12 21:56:022348#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2349
Howard Hinnantbc8d3f92010-05-11 19:42:162350template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:162351basic_string<_CharT, _Traits, _Allocator>::~basic_string()
2352{
Howard Hinnant499cea12013-08-23 17:37:052353#if _LIBCPP_DEBUG_LEVEL >= 2
2354 __get_db()->__erase_c(this);
2355#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162356 if (__is_long())
Howard Hinnante32b5e22010-11-17 17:55:082357 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:162358}
2359
2360template <class _CharT, class _Traits, class _Allocator>
2361void
2362basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
2363 (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnant9dcdcde2013-06-28 16:59:192364 size_type __n_copy, size_type __n_del, size_type __n_add, const value_type* __p_new_stuff)
Howard Hinnantbc8d3f92010-05-11 19:42:162365{
2366 size_type __ms = max_size();
2367 if (__delta_cap > __ms - __old_cap - 1)
2368 this->__throw_length_error();
2369 pointer __old_p = __get_pointer();
2370 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Howard Hinnant0949eed2011-06-30 21:18:192371 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantbc8d3f92010-05-11 19:42:162372 __ms - 1;
Howard Hinnante32b5e22010-11-17 17:55:082373 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:162374 __invalidate_all_iterators();
2375 if (__n_copy != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:192376 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2377 _VSTD::__to_raw_pointer(__old_p), __n_copy);
Howard Hinnantbc8d3f92010-05-11 19:42:162378 if (__n_add != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:192379 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy, __p_new_stuff, __n_add);
Howard Hinnantbc8d3f92010-05-11 19:42:162380 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2381 if (__sec_cp_sz != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:192382 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2383 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del, __sec_cp_sz);
Howard Hinnantbc8d3f92010-05-11 19:42:162384 if (__old_cap+1 != __min_cap)
Howard Hinnante32b5e22010-11-17 17:55:082385 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:162386 __set_long_pointer(__p);
2387 __set_long_cap(__cap+1);
2388 __old_sz = __n_copy + __n_add + __sec_cp_sz;
2389 __set_long_size(__old_sz);
2390 traits_type::assign(__p[__old_sz], value_type());
2391}
2392
2393template <class _CharT, class _Traits, class _Allocator>
2394void
2395basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2396 size_type __n_copy, size_type __n_del, size_type __n_add)
2397{
2398 size_type __ms = max_size();
Marshall Clowecc8d7b2013-11-06 14:24:382399 if (__delta_cap > __ms - __old_cap)
Howard Hinnantbc8d3f92010-05-11 19:42:162400 this->__throw_length_error();
2401 pointer __old_p = __get_pointer();
2402 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Howard Hinnant0949eed2011-06-30 21:18:192403 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantbc8d3f92010-05-11 19:42:162404 __ms - 1;
Howard Hinnante32b5e22010-11-17 17:55:082405 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:162406 __invalidate_all_iterators();
2407 if (__n_copy != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:192408 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2409 _VSTD::__to_raw_pointer(__old_p), __n_copy);
Howard Hinnantbc8d3f92010-05-11 19:42:162410 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2411 if (__sec_cp_sz != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:192412 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2413 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del,
2414 __sec_cp_sz);
Howard Hinnantbc8d3f92010-05-11 19:42:162415 if (__old_cap+1 != __min_cap)
Howard Hinnante32b5e22010-11-17 17:55:082416 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:162417 __set_long_pointer(__p);
2418 __set_long_cap(__cap+1);
2419}
2420
2421// assign
2422
2423template <class _CharT, class _Traits, class _Allocator>
2424basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:192425basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:162426{
Alp Tokerec34c482014-05-15 11:27:392427 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162428 size_type __cap = capacity();
2429 if (__cap >= __n)
2430 {
Howard Hinnant9dcdcde2013-06-28 16:59:192431 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162432 traits_type::move(__p, __s, __n);
2433 traits_type::assign(__p[__n], value_type());
2434 __set_size(__n);
2435 __invalidate_iterators_past(__n);
2436 }
2437 else
2438 {
2439 size_type __sz = size();
2440 __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
2441 }
2442 return *this;
2443}
2444
2445template <class _CharT, class _Traits, class _Allocator>
2446basic_string<_CharT, _Traits, _Allocator>&
2447basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
2448{
2449 size_type __cap = capacity();
2450 if (__cap < __n)
2451 {
2452 size_type __sz = size();
2453 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2454 }
2455 else
2456 __invalidate_iterators_past(__n);
Howard Hinnant9dcdcde2013-06-28 16:59:192457 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162458 traits_type::assign(__p, __n, __c);
2459 traits_type::assign(__p[__n], value_type());
2460 __set_size(__n);
2461 return *this;
2462}
2463
2464template <class _CharT, class _Traits, class _Allocator>
2465basic_string<_CharT, _Traits, _Allocator>&
2466basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
2467{
2468 pointer __p;
2469 if (__is_long())
2470 {
2471 __p = __get_long_pointer();
2472 __set_long_size(1);
2473 }
2474 else
2475 {
2476 __p = __get_short_pointer();
2477 __set_short_size(1);
2478 }
2479 traits_type::assign(*__p, __c);
2480 traits_type::assign(*++__p, value_type());
2481 __invalidate_iterators_past(1);
2482 return *this;
2483}
2484
2485template <class _CharT, class _Traits, class _Allocator>
Howard Hinnante32b5e22010-11-17 17:55:082486basic_string<_CharT, _Traits, _Allocator>&
2487basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
2488{
2489 if (this != &__str)
2490 {
2491 __copy_assign_alloc(__str);
2492 assign(__str);
2493 }
2494 return *this;
2495}
2496
2497#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2498
2499template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002500inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:082501void
2502basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
Marshall Clowaf961ed2015-08-18 18:57:002503 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
Howard Hinnante32b5e22010-11-17 17:55:082504{
2505 if (__alloc() != __str.__alloc())
2506 assign(__str);
2507 else
2508 __move_assign(__str, true_type());
2509}
2510
2511template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002512inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:082513void
2514basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
Marshall Clowaf961ed2015-08-18 18:57:002515#if _LIBCPP_STD_VER > 14
2516 _NOEXCEPT
2517#else
Howard Hinnant53f7d4c2011-06-03 18:40:472518 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Marshall Clowaf961ed2015-08-18 18:57:002519#endif
Howard Hinnante32b5e22010-11-17 17:55:082520{
2521 clear();
2522 shrink_to_fit();
Howard Hinnant3fdbbd22011-08-17 20:36:182523 __r_.first() = __str.__r_.first();
2524 __move_assign_alloc(__str);
Howard Hinnante32b5e22010-11-17 17:55:082525 __str.__zero();
2526}
2527
2528template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002529inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:082530basic_string<_CharT, _Traits, _Allocator>&
2531basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str)
Marshall Clowaf961ed2015-08-18 18:57:002532 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnante32b5e22010-11-17 17:55:082533{
2534 __move_assign(__str, integral_constant<bool,
2535 __alloc_traits::propagate_on_container_move_assignment::value>());
2536 return *this;
2537}
2538
2539#endif
2540
2541template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:162542template<class _InputIterator>
2543typename enable_if
2544<
Marshall Clowdf9db312016-01-13 21:54:342545 __is_exactly_input_iterator <_InputIterator>::value
2546 || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:162547 basic_string<_CharT, _Traits, _Allocator>&
2548>::type
2549basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2550{
Marshall Clowdf9db312016-01-13 21:54:342551 basic_string __temp(__first, __last, __alloc());
2552 assign(__temp.data(), __temp.size());
Argyrios Kyrtzidis1dc6f7a2012-10-13 02:03:452553 return *this;
Howard Hinnantbc8d3f92010-05-11 19:42:162554}
2555
2556template <class _CharT, class _Traits, class _Allocator>
2557template<class _ForwardIterator>
2558typename enable_if
2559<
Marshall Clowdf9db312016-01-13 21:54:342560 __is_forward_iterator<_ForwardIterator>::value
2561 && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:162562 basic_string<_CharT, _Traits, _Allocator>&
2563>::type
2564basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2565{
Howard Hinnant0949eed2011-06-30 21:18:192566 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:162567 size_type __cap = capacity();
2568 if (__cap < __n)
2569 {
2570 size_type __sz = size();
2571 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2572 }
2573 else
2574 __invalidate_iterators_past(__n);
2575 pointer __p = __get_pointer();
2576 for (; __first != __last; ++__first, ++__p)
2577 traits_type::assign(*__p, *__first);
2578 traits_type::assign(*__p, value_type());
2579 __set_size(__n);
2580 return *this;
2581}
2582
2583template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002584inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162585basic_string<_CharT, _Traits, _Allocator>&
2586basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str)
2587{
2588 return assign(__str.data(), __str.size());
2589}
2590
2591template <class _CharT, class _Traits, class _Allocator>
2592basic_string<_CharT, _Traits, _Allocator>&
2593basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
2594{
2595 size_type __sz = __str.size();
2596 if (__pos > __sz)
2597 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:192598 return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
Howard Hinnantbc8d3f92010-05-11 19:42:162599}
2600
2601template <class _CharT, class _Traits, class _Allocator>
2602basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:192603basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:162604{
Alp Tokerec34c482014-05-15 11:27:392605 _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162606 return assign(__s, traits_type::length(__s));
2607}
2608
2609// append
2610
2611template <class _CharT, class _Traits, class _Allocator>
2612basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:192613basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:162614{
Alp Tokerec34c482014-05-15 11:27:392615 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162616 size_type __cap = capacity();
2617 size_type __sz = size();
2618 if (__cap - __sz >= __n)
2619 {
2620 if (__n)
2621 {
Howard Hinnant9dcdcde2013-06-28 16:59:192622 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162623 traits_type::copy(__p + __sz, __s, __n);
2624 __sz += __n;
2625 __set_size(__sz);
2626 traits_type::assign(__p[__sz], value_type());
2627 }
2628 }
2629 else
2630 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
2631 return *this;
2632}
2633
2634template <class _CharT, class _Traits, class _Allocator>
2635basic_string<_CharT, _Traits, _Allocator>&
2636basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
2637{
2638 if (__n)
2639 {
2640 size_type __cap = capacity();
2641 size_type __sz = size();
2642 if (__cap - __sz < __n)
2643 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2644 pointer __p = __get_pointer();
Howard Hinnant9dcdcde2013-06-28 16:59:192645 traits_type::assign(_VSTD::__to_raw_pointer(__p) + __sz, __n, __c);
Howard Hinnantbc8d3f92010-05-11 19:42:162646 __sz += __n;
2647 __set_size(__sz);
2648 traits_type::assign(__p[__sz], value_type());
2649 }
2650 return *this;
2651}
2652
2653template <class _CharT, class _Traits, class _Allocator>
2654void
2655basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
2656{
Howard Hinnant15467182013-04-30 21:44:482657 bool __is_short = !__is_long();
2658 size_type __cap;
2659 size_type __sz;
2660 if (__is_short)
2661 {
2662 __cap = __min_cap - 1;
2663 __sz = __get_short_size();
2664 }
2665 else
2666 {
2667 __cap = __get_long_cap() - 1;
2668 __sz = __get_long_size();
2669 }
Howard Hinnantbc8d3f92010-05-11 19:42:162670 if (__sz == __cap)
Howard Hinnant15467182013-04-30 21:44:482671 {
Howard Hinnantbc8d3f92010-05-11 19:42:162672 __grow_by(__cap, 1, __sz, __sz, 0);
Howard Hinnant15467182013-04-30 21:44:482673 __is_short = !__is_long();
2674 }
2675 pointer __p;
2676 if (__is_short)
2677 {
2678 __p = __get_short_pointer() + __sz;
2679 __set_short_size(__sz+1);
2680 }
2681 else
2682 {
2683 __p = __get_long_pointer() + __sz;
2684 __set_long_size(__sz+1);
2685 }
Howard Hinnantbc8d3f92010-05-11 19:42:162686 traits_type::assign(*__p, __c);
2687 traits_type::assign(*++__p, value_type());
Howard Hinnantbc8d3f92010-05-11 19:42:162688}
2689
2690template <class _CharT, class _Traits, class _Allocator>
2691template<class _InputIterator>
2692typename enable_if
2693<
Marshall Clowdf9db312016-01-13 21:54:342694 __is_exactly_input_iterator<_InputIterator>::value
2695 || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:162696 basic_string<_CharT, _Traits, _Allocator>&
2697>::type
2698basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last)
2699{
Marshall Clowdf9db312016-01-13 21:54:342700basic_string __temp (__first, __last, __alloc());
2701append(__temp.data(), __temp.size());
Howard Hinnantbc8d3f92010-05-11 19:42:162702 return *this;
2703}
2704
2705template <class _CharT, class _Traits, class _Allocator>
2706template<class _ForwardIterator>
2707typename enable_if
2708<
Marshall Clowdf9db312016-01-13 21:54:342709 __is_forward_iterator<_ForwardIterator>::value
2710 && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:162711 basic_string<_CharT, _Traits, _Allocator>&
2712>::type
2713basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last)
2714{
2715 size_type __sz = size();
2716 size_type __cap = capacity();
Howard Hinnant0949eed2011-06-30 21:18:192717 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:162718 if (__n)
2719 {
2720 if (__cap - __sz < __n)
2721 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2722 pointer __p = __get_pointer() + __sz;
2723 for (; __first != __last; ++__p, ++__first)
2724 traits_type::assign(*__p, *__first);
2725 traits_type::assign(*__p, value_type());
2726 __set_size(__sz + __n);
2727 }
2728 return *this;
2729}
2730
2731template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002732inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162733basic_string<_CharT, _Traits, _Allocator>&
2734basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
2735{
2736 return append(__str.data(), __str.size());
2737}
2738
2739template <class _CharT, class _Traits, class _Allocator>
2740basic_string<_CharT, _Traits, _Allocator>&
2741basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
2742{
2743 size_type __sz = __str.size();
2744 if (__pos > __sz)
2745 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:192746 return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
Howard Hinnantbc8d3f92010-05-11 19:42:162747}
2748
2749template <class _CharT, class _Traits, class _Allocator>
2750basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:192751basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:162752{
Alp Tokerec34c482014-05-15 11:27:392753 _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162754 return append(__s, traits_type::length(__s));
2755}
2756
2757// insert
2758
2759template <class _CharT, class _Traits, class _Allocator>
2760basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:192761basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:162762{
Alp Tokerec34c482014-05-15 11:27:392763 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162764 size_type __sz = size();
2765 if (__pos > __sz)
2766 this->__throw_out_of_range();
2767 size_type __cap = capacity();
2768 if (__cap - __sz >= __n)
2769 {
2770 if (__n)
2771 {
Howard Hinnant9dcdcde2013-06-28 16:59:192772 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162773 size_type __n_move = __sz - __pos;
2774 if (__n_move != 0)
2775 {
2776 if (__p + __pos <= __s && __s < __p + __sz)
2777 __s += __n;
2778 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2779 }
2780 traits_type::move(__p + __pos, __s, __n);
2781 __sz += __n;
2782 __set_size(__sz);
2783 traits_type::assign(__p[__sz], value_type());
2784 }
2785 }
2786 else
2787 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2788 return *this;
2789}
2790
2791template <class _CharT, class _Traits, class _Allocator>
2792basic_string<_CharT, _Traits, _Allocator>&
2793basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
2794{
2795 size_type __sz = size();
2796 if (__pos > __sz)
2797 this->__throw_out_of_range();
2798 if (__n)
2799 {
2800 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:192801 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:162802 if (__cap - __sz >= __n)
2803 {
Howard Hinnant9dcdcde2013-06-28 16:59:192804 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162805 size_type __n_move = __sz - __pos;
2806 if (__n_move != 0)
2807 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2808 }
2809 else
2810 {
2811 __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
Howard Hinnant9dcdcde2013-06-28 16:59:192812 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162813 }
2814 traits_type::assign(__p + __pos, __n, __c);
2815 __sz += __n;
2816 __set_size(__sz);
2817 traits_type::assign(__p[__sz], value_type());
2818 }
2819 return *this;
2820}
2821
2822template <class _CharT, class _Traits, class _Allocator>
2823template<class _InputIterator>
2824typename enable_if
2825<
Marshall Clowdf9db312016-01-13 21:54:342826 __is_exactly_input_iterator<_InputIterator>::value
2827 || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value,
2828 typename basic_string<_CharT, _Traits, _Allocator>::iterator
Howard Hinnantbc8d3f92010-05-11 19:42:162829>::type
2830basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
2831{
Howard Hinnant499cea12013-08-23 17:37:052832#if _LIBCPP_DEBUG_LEVEL >= 2
2833 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2834 "string::insert(iterator, range) called with an iterator not"
2835 " referring to this string");
2836#endif
Marshall Clowdf9db312016-01-13 21:54:342837 basic_string __temp(__first, __last, __alloc());
2838 return insert(__pos, __temp.data(), __temp.data() + __temp.size());
Howard Hinnantbc8d3f92010-05-11 19:42:162839}
2840
2841template <class _CharT, class _Traits, class _Allocator>
2842template<class _ForwardIterator>
2843typename enable_if
2844<
Marshall Clowdf9db312016-01-13 21:54:342845 __is_forward_iterator<_ForwardIterator>::value
2846 && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:162847 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2848>::type
2849basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
2850{
Howard Hinnant499cea12013-08-23 17:37:052851#if _LIBCPP_DEBUG_LEVEL >= 2
2852 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2853 "string::insert(iterator, range) called with an iterator not"
2854 " referring to this string");
2855#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162856 size_type __ip = static_cast<size_type>(__pos - begin());
2857 size_type __sz = size();
2858 size_type __cap = capacity();
Howard Hinnant0949eed2011-06-30 21:18:192859 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:162860 if (__n)
2861 {
Howard Hinnant9dcdcde2013-06-28 16:59:192862 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:162863 if (__cap - __sz >= __n)
2864 {
Howard Hinnant9dcdcde2013-06-28 16:59:192865 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162866 size_type __n_move = __sz - __ip;
2867 if (__n_move != 0)
2868 traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
2869 }
2870 else
2871 {
2872 __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
Howard Hinnant9dcdcde2013-06-28 16:59:192873 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162874 }
2875 __sz += __n;
2876 __set_size(__sz);
2877 traits_type::assign(__p[__sz], value_type());
2878 for (__p += __ip; __first != __last; ++__p, ++__first)
2879 traits_type::assign(*__p, *__first);
2880 }
2881 return begin() + __ip;
2882}
2883
2884template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002885inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162886basic_string<_CharT, _Traits, _Allocator>&
2887basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str)
2888{
2889 return insert(__pos1, __str.data(), __str.size());
2890}
2891
2892template <class _CharT, class _Traits, class _Allocator>
2893basic_string<_CharT, _Traits, _Allocator>&
2894basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
2895 size_type __pos2, size_type __n)
2896{
2897 size_type __str_sz = __str.size();
2898 if (__pos2 > __str_sz)
2899 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:192900 return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:162901}
2902
2903template <class _CharT, class _Traits, class _Allocator>
2904basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:192905basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:162906{
Alp Tokerec34c482014-05-15 11:27:392907 _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162908 return insert(__pos, __s, traits_type::length(__s));
2909}
2910
2911template <class _CharT, class _Traits, class _Allocator>
2912typename basic_string<_CharT, _Traits, _Allocator>::iterator
2913basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
2914{
2915 size_type __ip = static_cast<size_type>(__pos - begin());
2916 size_type __sz = size();
2917 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:192918 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:162919 if (__cap == __sz)
2920 {
2921 __grow_by(__cap, 1, __sz, __ip, 0, 1);
Howard Hinnant9dcdcde2013-06-28 16:59:192922 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162923 }
2924 else
2925 {
Howard Hinnant9dcdcde2013-06-28 16:59:192926 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162927 size_type __n_move = __sz - __ip;
2928 if (__n_move != 0)
2929 traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
2930 }
2931 traits_type::assign(__p[__ip], __c);
2932 traits_type::assign(__p[++__sz], value_type());
2933 __set_size(__sz);
2934 return begin() + static_cast<difference_type>(__ip);
2935}
2936
2937template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:002938inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162939typename basic_string<_CharT, _Traits, _Allocator>::iterator
2940basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c)
2941{
Howard Hinnant499cea12013-08-23 17:37:052942#if _LIBCPP_DEBUG_LEVEL >= 2
2943 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2944 "string::insert(iterator, n, value) called with an iterator not"
2945 " referring to this string");
2946#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162947 difference_type __p = __pos - begin();
2948 insert(static_cast<size_type>(__p), __n, __c);
2949 return begin() + __p;
2950}
2951
2952// replace
2953
2954template <class _CharT, class _Traits, class _Allocator>
2955basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:192956basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2)
Howard Hinnantbc8d3f92010-05-11 19:42:162957{
Alp Tokerec34c482014-05-15 11:27:392958 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:162959 size_type __sz = size();
2960 if (__pos > __sz)
2961 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:192962 __n1 = _VSTD::min(__n1, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:162963 size_type __cap = capacity();
2964 if (__cap - __sz + __n1 >= __n2)
2965 {
Howard Hinnant9dcdcde2013-06-28 16:59:192966 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:162967 if (__n1 != __n2)
2968 {
2969 size_type __n_move = __sz - __pos - __n1;
2970 if (__n_move != 0)
2971 {
2972 if (__n1 > __n2)
2973 {
2974 traits_type::move(__p + __pos, __s, __n2);
2975 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2976 goto __finish;
2977 }
2978 if (__p + __pos < __s && __s < __p + __sz)
2979 {
2980 if (__p + __pos + __n1 <= __s)
2981 __s += __n2 - __n1;
2982 else // __p + __pos < __s < __p + __pos + __n1
2983 {
2984 traits_type::move(__p + __pos, __s, __n1);
2985 __pos += __n1;
2986 __s += __n2;
2987 __n2 -= __n1;
2988 __n1 = 0;
2989 }
2990 }
2991 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2992 }
2993 }
2994 traits_type::move(__p + __pos, __s, __n2);
2995__finish:
2996 __sz += __n2 - __n1;
2997 __set_size(__sz);
2998 __invalidate_iterators_past(__sz);
2999 traits_type::assign(__p[__sz], value_type());
3000 }
3001 else
3002 __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
3003 return *this;
3004}
3005
3006template <class _CharT, class _Traits, class _Allocator>
3007basic_string<_CharT, _Traits, _Allocator>&
3008basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
3009{
3010 size_type __sz = size();
3011 if (__pos > __sz)
3012 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:193013 __n1 = _VSTD::min(__n1, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:163014 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:193015 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:163016 if (__cap - __sz + __n1 >= __n2)
3017 {
Howard Hinnant9dcdcde2013-06-28 16:59:193018 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:163019 if (__n1 != __n2)
3020 {
3021 size_type __n_move = __sz - __pos - __n1;
3022 if (__n_move != 0)
3023 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
3024 }
3025 }
3026 else
3027 {
3028 __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
Howard Hinnant9dcdcde2013-06-28 16:59:193029 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:163030 }
3031 traits_type::assign(__p + __pos, __n2, __c);
3032 __sz += __n2 - __n1;
3033 __set_size(__sz);
3034 __invalidate_iterators_past(__sz);
3035 traits_type::assign(__p[__sz], value_type());
3036 return *this;
3037}
3038
3039template <class _CharT, class _Traits, class _Allocator>
3040template<class _InputIterator>
3041typename enable_if
3042<
3043 __is_input_iterator<_InputIterator>::value,
3044 basic_string<_CharT, _Traits, _Allocator>&
3045>::type
Howard Hinnant7b2cb482010-11-17 21:11:403046basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
Howard Hinnantbc8d3f92010-05-11 19:42:163047 _InputIterator __j1, _InputIterator __j2)
3048{
Marshall Clowdf9db312016-01-13 21:54:343049 basic_string __temp(__j1, __j2, __alloc());
3050 return this->replace(__i1, __i2, __temp);
Howard Hinnantbc8d3f92010-05-11 19:42:163051}
3052
3053template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003054inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163055basic_string<_CharT, _Traits, _Allocator>&
3056basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str)
3057{
3058 return replace(__pos1, __n1, __str.data(), __str.size());
3059}
3060
3061template <class _CharT, class _Traits, class _Allocator>
3062basic_string<_CharT, _Traits, _Allocator>&
3063basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
3064 size_type __pos2, size_type __n2)
3065{
3066 size_type __str_sz = __str.size();
3067 if (__pos2 > __str_sz)
3068 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:193069 return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:163070}
3071
3072template <class _CharT, class _Traits, class _Allocator>
3073basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:193074basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:163075{
Alp Tokerec34c482014-05-15 11:27:393076 _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:163077 return replace(__pos, __n1, __s, traits_type::length(__s));
3078}
3079
3080template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003081inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163082basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant7b2cb482010-11-17 21:11:403083basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str)
Howard Hinnantbc8d3f92010-05-11 19:42:163084{
3085 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1),
3086 __str.data(), __str.size());
3087}
3088
3089template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003090inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163091basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:193092basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:163093{
3094 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
3095}
3096
3097template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003098inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163099basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:193100basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:163101{
3102 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
3103}
3104
3105template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003106inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163107basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant7b2cb482010-11-17 21:11:403108basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c)
Howard Hinnantbc8d3f92010-05-11 19:42:163109{
3110 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
3111}
3112
3113// erase
3114
3115template <class _CharT, class _Traits, class _Allocator>
3116basic_string<_CharT, _Traits, _Allocator>&
3117basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n)
3118{
3119 size_type __sz = size();
3120 if (__pos > __sz)
3121 this->__throw_out_of_range();
3122 if (__n)
3123 {
Howard Hinnant9dcdcde2013-06-28 16:59:193124 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnant0949eed2011-06-30 21:18:193125 __n = _VSTD::min(__n, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:163126 size_type __n_move = __sz - __pos - __n;
3127 if (__n_move != 0)
3128 traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
3129 __sz -= __n;
3130 __set_size(__sz);
3131 __invalidate_iterators_past(__sz);
3132 traits_type::assign(__p[__sz], value_type());
3133 }
3134 return *this;
3135}
3136
3137template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003138inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163139typename basic_string<_CharT, _Traits, _Allocator>::iterator
3140basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
3141{
Howard Hinnant499cea12013-08-23 17:37:053142#if _LIBCPP_DEBUG_LEVEL >= 2
3143 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
3144 "string::erase(iterator) called with an iterator not"
3145 " referring to this string");
3146#endif
3147 _LIBCPP_ASSERT(__pos != end(),
3148 "string::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnantbc8d3f92010-05-11 19:42:163149 iterator __b = begin();
3150 size_type __r = static_cast<size_type>(__pos - __b);
3151 erase(__r, 1);
Howard Hinnantec3773c2011-12-01 20:21:043152 return __b + static_cast<difference_type>(__r);
Howard Hinnantbc8d3f92010-05-11 19:42:163153}
3154
3155template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003156inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163157typename basic_string<_CharT, _Traits, _Allocator>::iterator
3158basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
3159{
Howard Hinnant499cea12013-08-23 17:37:053160#if _LIBCPP_DEBUG_LEVEL >= 2
3161 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
3162 "string::erase(iterator, iterator) called with an iterator not"
3163 " referring to this string");
3164#endif
3165 _LIBCPP_ASSERT(__first <= __last, "string::erase(first, last) called with invalid range");
Howard Hinnantbc8d3f92010-05-11 19:42:163166 iterator __b = begin();
3167 size_type __r = static_cast<size_type>(__first - __b);
3168 erase(__r, static_cast<size_type>(__last - __first));
Howard Hinnantec3773c2011-12-01 20:21:043169 return __b + static_cast<difference_type>(__r);
Howard Hinnantbc8d3f92010-05-11 19:42:163170}
3171
3172template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003173inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163174void
3175basic_string<_CharT, _Traits, _Allocator>::pop_back()
3176{
Howard Hinnant499cea12013-08-23 17:37:053177 _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty");
Howard Hinnantbc8d3f92010-05-11 19:42:163178 size_type __sz;
3179 if (__is_long())
3180 {
3181 __sz = __get_long_size() - 1;
3182 __set_long_size(__sz);
3183 traits_type::assign(*(__get_long_pointer() + __sz), value_type());
3184 }
3185 else
3186 {
3187 __sz = __get_short_size() - 1;
3188 __set_short_size(__sz);
3189 traits_type::assign(*(__get_short_pointer() + __sz), value_type());
3190 }
3191 __invalidate_iterators_past(__sz);
3192}
3193
3194template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003195inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163196void
Howard Hinnanta6119a82011-05-29 19:57:123197basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163198{
3199 __invalidate_all_iterators();
3200 if (__is_long())
3201 {
3202 traits_type::assign(*__get_long_pointer(), value_type());
3203 __set_long_size(0);
3204 }
3205 else
3206 {
3207 traits_type::assign(*__get_short_pointer(), value_type());
3208 __set_short_size(0);
3209 }
3210}
3211
3212template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003213inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163214void
3215basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
3216{
3217 if (__is_long())
3218 {
3219 traits_type::assign(*(__get_long_pointer() + __pos), value_type());
3220 __set_long_size(__pos);
3221 }
3222 else
3223 {
3224 traits_type::assign(*(__get_short_pointer() + __pos), value_type());
3225 __set_short_size(__pos);
3226 }
3227 __invalidate_iterators_past(__pos);
3228}
3229
3230template <class _CharT, class _Traits, class _Allocator>
3231void
3232basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
3233{
3234 size_type __sz = size();
3235 if (__n > __sz)
3236 append(__n - __sz, __c);
3237 else
3238 __erase_to_end(__n);
3239}
3240
3241template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003242inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163243typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123244basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163245{
Howard Hinnante32b5e22010-11-17 17:55:083246 size_type __m = __alloc_traits::max_size(__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:163247#if _LIBCPP_BIG_ENDIAN
Marshall Clow09f85502013-10-31 17:23:083248 return (__m <= ~__long_mask ? __m : __m/2) - __alignment;
Howard Hinnantbc8d3f92010-05-11 19:42:163249#else
Marshall Clow09f85502013-10-31 17:23:083250 return __m - __alignment;
Howard Hinnantbc8d3f92010-05-11 19:42:163251#endif
3252}
3253
3254template <class _CharT, class _Traits, class _Allocator>
3255void
3256basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
3257{
3258 if (__res_arg > max_size())
3259 this->__throw_length_error();
3260 size_type __cap = capacity();
3261 size_type __sz = size();
Howard Hinnant0949eed2011-06-30 21:18:193262 __res_arg = _VSTD::max(__res_arg, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:163263 __res_arg = __recommend(__res_arg);
3264 if (__res_arg != __cap)
3265 {
3266 pointer __new_data, __p;
3267 bool __was_long, __now_long;
3268 if (__res_arg == __min_cap - 1)
3269 {
3270 __was_long = true;
3271 __now_long = false;
3272 __new_data = __get_short_pointer();
3273 __p = __get_long_pointer();
3274 }
3275 else
3276 {
3277 if (__res_arg > __cap)
Howard Hinnante32b5e22010-11-17 17:55:083278 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
Howard Hinnantbc8d3f92010-05-11 19:42:163279 else
3280 {
3281 #ifndef _LIBCPP_NO_EXCEPTIONS
3282 try
3283 {
Howard Hinnant324bb032010-08-22 00:02:433284 #endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante32b5e22010-11-17 17:55:083285 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
Howard Hinnantbc8d3f92010-05-11 19:42:163286 #ifndef _LIBCPP_NO_EXCEPTIONS
3287 }
3288 catch (...)
3289 {
3290 return;
3291 }
Howard Hinnant324bb032010-08-22 00:02:433292 #else // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant9dcdcde2013-06-28 16:59:193293 if (__new_data == nullptr)
Howard Hinnantbc8d3f92010-05-11 19:42:163294 return;
Howard Hinnant324bb032010-08-22 00:02:433295 #endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:163296 }
3297 __now_long = true;
3298 __was_long = __is_long();
3299 __p = __get_pointer();
3300 }
Howard Hinnant9dcdcde2013-06-28 16:59:193301 traits_type::copy(_VSTD::__to_raw_pointer(__new_data),
3302 _VSTD::__to_raw_pointer(__p), size()+1);
Howard Hinnantbc8d3f92010-05-11 19:42:163303 if (__was_long)
Howard Hinnante32b5e22010-11-17 17:55:083304 __alloc_traits::deallocate(__alloc(), __p, __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:163305 if (__now_long)
3306 {
3307 __set_long_cap(__res_arg+1);
3308 __set_long_size(__sz);
3309 __set_long_pointer(__new_data);
3310 }
3311 else
3312 __set_short_size(__sz);
3313 __invalidate_all_iterators();
3314 }
3315}
3316
3317template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003318inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163319typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3320basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const
3321{
Howard Hinnant499cea12013-08-23 17:37:053322 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:163323 return *(data() + __pos);
3324}
3325
3326template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003327inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163328typename basic_string<_CharT, _Traits, _Allocator>::reference
3329basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos)
3330{
Howard Hinnant499cea12013-08-23 17:37:053331 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:163332 return *(__get_pointer() + __pos);
3333}
3334
3335template <class _CharT, class _Traits, class _Allocator>
3336typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3337basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
3338{
3339 if (__n >= size())
3340 this->__throw_out_of_range();
3341 return (*this)[__n];
3342}
3343
3344template <class _CharT, class _Traits, class _Allocator>
3345typename basic_string<_CharT, _Traits, _Allocator>::reference
3346basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
3347{
3348 if (__n >= size())
3349 this->__throw_out_of_range();
3350 return (*this)[__n];
3351}
3352
3353template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003354inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163355typename basic_string<_CharT, _Traits, _Allocator>::reference
3356basic_string<_CharT, _Traits, _Allocator>::front()
3357{
Howard Hinnant499cea12013-08-23 17:37:053358 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:163359 return *__get_pointer();
3360}
3361
3362template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003363inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163364typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3365basic_string<_CharT, _Traits, _Allocator>::front() const
3366{
Howard Hinnant499cea12013-08-23 17:37:053367 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:163368 return *data();
3369}
3370
3371template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003372inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163373typename basic_string<_CharT, _Traits, _Allocator>::reference
3374basic_string<_CharT, _Traits, _Allocator>::back()
3375{
Howard Hinnant499cea12013-08-23 17:37:053376 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:163377 return *(__get_pointer() + size() - 1);
3378}
3379
3380template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003381inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163382typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3383basic_string<_CharT, _Traits, _Allocator>::back() const
3384{
Howard Hinnant499cea12013-08-23 17:37:053385 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:163386 return *(data() + size() - 1);
3387}
3388
3389template <class _CharT, class _Traits, class _Allocator>
3390typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193391basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
Howard Hinnantbc8d3f92010-05-11 19:42:163392{
3393 size_type __sz = size();
3394 if (__pos > __sz)
3395 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:193396 size_type __rlen = _VSTD::min(__n, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:163397 traits_type::copy(__s, data() + __pos, __rlen);
3398 return __rlen;
3399}
3400
3401template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003402inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163403basic_string<_CharT, _Traits, _Allocator>
3404basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const
3405{
3406 return basic_string(*this, __pos, __n, __alloc());
3407}
3408
3409template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003410inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163411void
3412basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
Marshall Clow7d914d12015-07-13 20:04:563413#if _LIBCPP_STD_VER >= 14
3414 _NOEXCEPT
3415#else
3416 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3417 __is_nothrow_swappable<allocator_type>::value)
3418#endif
Howard Hinnantbc8d3f92010-05-11 19:42:163419{
Howard Hinnant499cea12013-08-23 17:37:053420#if _LIBCPP_DEBUG_LEVEL >= 2
3421 if (!__is_long())
3422 __get_db()->__invalidate_all(this);
3423 if (!__str.__is_long())
3424 __get_db()->__invalidate_all(&__str);
3425 __get_db()->swap(this, &__str);
3426#endif
Howard Hinnant0949eed2011-06-30 21:18:193427 _VSTD::swap(__r_.first(), __str.__r_.first());
Marshall Clow7d914d12015-07-13 20:04:563428 __swap_allocator(__alloc(), __str.__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:163429}
3430
3431// find
3432
3433template <class _Traits>
3434struct _LIBCPP_HIDDEN __traits_eq
3435{
3436 typedef typename _Traits::char_type char_type;
Howard Hinnanta6119a82011-05-29 19:57:123437 _LIBCPP_INLINE_VISIBILITY
3438 bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
3439 {return _Traits::eq(__x, __y);}
Howard Hinnantbc8d3f92010-05-11 19:42:163440};
3441
3442template<class _CharT, class _Traits, class _Allocator>
3443typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193444basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123445 size_type __pos,
3446 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163447{
Alp Tokerec34c482014-05-15 11:27:393448 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553449 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:493450 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:163451}
3452
3453template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003454inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163455typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123456basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
3457 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163458{
Marshall Clow37025e12014-06-10 18:51:553459 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:493460 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:163461}
3462
3463template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003464inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163465typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193466basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123467 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163468{
Alp Tokerec34c482014-05-15 11:27:393469 _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553470 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:493471 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:163472}
3473
3474template<class _CharT, class _Traits, class _Allocator>
3475typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123476basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
3477 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163478{
Marshall Clow37025e12014-06-10 18:51:553479 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:493480 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:163481}
3482
3483// rfind
3484
3485template<class _CharT, class _Traits, class _Allocator>
3486typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193487basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123488 size_type __pos,
3489 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163490{
Alp Tokerec34c482014-05-15 11:27:393491 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553492 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:493493 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:163494}
3495
3496template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003497inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163498typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123499basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
3500 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163501{
Marshall Clow37025e12014-06-10 18:51:553502 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:493503 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:163504}
3505
3506template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003507inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163508typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193509basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123510 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163511{
Alp Tokerec34c482014-05-15 11:27:393512 _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553513 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:493514 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:163515}
3516
3517template<class _CharT, class _Traits, class _Allocator>
3518typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123519basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
3520 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163521{
Marshall Clow37025e12014-06-10 18:51:553522 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:493523 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:163524}
3525
3526// find_first_of
3527
3528template<class _CharT, class _Traits, class _Allocator>
3529typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193530basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123531 size_type __pos,
3532 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163533{
Alp Tokerec34c482014-05-15 11:27:393534 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553535 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263536 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:163537}
3538
3539template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003540inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163541typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123542basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
3543 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163544{
Marshall Clow37025e12014-06-10 18:51:553545 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263546 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:163547}
3548
3549template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003550inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163551typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193552basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123553 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163554{
Alp Tokerec34c482014-05-15 11:27:393555 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553556 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263557 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:163558}
3559
3560template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003561inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163562typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123563basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
3564 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163565{
3566 return find(__c, __pos);
3567}
3568
3569// find_last_of
3570
3571template<class _CharT, class _Traits, class _Allocator>
3572typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193573basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123574 size_type __pos,
3575 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163576{
Alp Tokerec34c482014-05-15 11:27:393577 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553578 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263579 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:163580}
3581
3582template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003583inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163584typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123585basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
3586 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163587{
Marshall Clow37025e12014-06-10 18:51:553588 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263589 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:163590}
3591
3592template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003593inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163594typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193595basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123596 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163597{
Alp Tokerec34c482014-05-15 11:27:393598 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553599 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263600 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:163601}
3602
3603template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003604inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163605typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123606basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
3607 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163608{
3609 return rfind(__c, __pos);
3610}
3611
3612// find_first_not_of
3613
3614template<class _CharT, class _Traits, class _Allocator>
3615typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193616basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123617 size_type __pos,
3618 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163619{
Alp Tokerec34c482014-05-15 11:27:393620 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553621 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263622 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:163623}
3624
3625template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003626inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163627typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123628basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
3629 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163630{
Marshall Clow37025e12014-06-10 18:51:553631 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263632 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:163633}
3634
3635template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003636inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163637typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193638basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123639 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163640{
Alp Tokerec34c482014-05-15 11:27:393641 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553642 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263643 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:163644}
3645
3646template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003647inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163648typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123649basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
3650 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163651{
Marshall Clow37025e12014-06-10 18:51:553652 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263653 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:163654}
3655
3656// find_last_not_of
3657
3658template<class _CharT, class _Traits, class _Allocator>
3659typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193660basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123661 size_type __pos,
3662 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163663{
Alp Tokerec34c482014-05-15 11:27:393664 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553665 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263666 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:163667}
3668
3669template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003670inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163671typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123672basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
3673 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163674{
Marshall Clow37025e12014-06-10 18:51:553675 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263676 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:163677}
3678
3679template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003680inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163681typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:193682basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123683 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163684{
Alp Tokerec34c482014-05-15 11:27:393685 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:553686 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263687 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:163688}
3689
3690template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003691inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163692typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:123693basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
3694 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163695{
Marshall Clow37025e12014-06-10 18:51:553696 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:263697 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:163698}
3699
3700// compare
3701
3702template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003703inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163704int
Howard Hinnanta6119a82011-05-29 19:57:123705basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163706{
Howard Hinnantfa06d752011-07-24 21:45:063707 size_t __lhs_sz = size();
3708 size_t __rhs_sz = __str.size();
3709 int __result = traits_type::compare(data(), __str.data(),
3710 _VSTD::min(__lhs_sz, __rhs_sz));
3711 if (__result != 0)
3712 return __result;
3713 if (__lhs_sz < __rhs_sz)
3714 return -1;
3715 if (__lhs_sz > __rhs_sz)
3716 return 1;
3717 return 0;
Howard Hinnantbc8d3f92010-05-11 19:42:163718}
3719
3720template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003721inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163722int
Howard Hinnanta6119a82011-05-29 19:57:123723basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3724 size_type __n1,
3725 const basic_string& __str) const
Howard Hinnantbc8d3f92010-05-11 19:42:163726{
3727 return compare(__pos1, __n1, __str.data(), __str.size());
3728}
3729
3730template <class _CharT, class _Traits, class _Allocator>
3731int
Howard Hinnanta6119a82011-05-29 19:57:123732basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3733 size_type __n1,
3734 const basic_string& __str,
3735 size_type __pos2,
3736 size_type __n2) const
Howard Hinnantbc8d3f92010-05-11 19:42:163737{
3738 size_type __sz = __str.size();
3739 if (__pos2 > __sz)
3740 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:193741 return compare(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2,
Howard Hinnanta6119a82011-05-29 19:57:123742 __sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:163743}
3744
3745template <class _CharT, class _Traits, class _Allocator>
3746int
Howard Hinnant9dcdcde2013-06-28 16:59:193747basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163748{
Alp Tokerec34c482014-05-15 11:27:393749 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:163750 return compare(0, npos, __s, traits_type::length(__s));
3751}
3752
3753template <class _CharT, class _Traits, class _Allocator>
3754int
Howard Hinnanta6119a82011-05-29 19:57:123755basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3756 size_type __n1,
Howard Hinnant9dcdcde2013-06-28 16:59:193757 const value_type* __s) const
Howard Hinnantbc8d3f92010-05-11 19:42:163758{
Alp Tokerec34c482014-05-15 11:27:393759 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:163760 return compare(__pos1, __n1, __s, traits_type::length(__s));
3761}
3762
3763template <class _CharT, class _Traits, class _Allocator>
3764int
Howard Hinnanta6119a82011-05-29 19:57:123765basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3766 size_type __n1,
Howard Hinnant9dcdcde2013-06-28 16:59:193767 const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:123768 size_type __n2) const
Howard Hinnantbc8d3f92010-05-11 19:42:163769{
Alp Tokerec34c482014-05-15 11:27:393770 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:163771 size_type __sz = size();
3772 if (__pos1 > __sz || __n2 == npos)
3773 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:193774 size_type __rlen = _VSTD::min(__n1, __sz - __pos1);
3775 int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2));
Howard Hinnantbc8d3f92010-05-11 19:42:163776 if (__r == 0)
3777 {
3778 if (__rlen < __n2)
3779 __r = -1;
3780 else if (__rlen > __n2)
3781 __r = 1;
3782 }
3783 return __r;
3784}
3785
3786// __invariants
3787
3788template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003789inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163790bool
3791basic_string<_CharT, _Traits, _Allocator>::__invariants() const
3792{
3793 if (size() > capacity())
3794 return false;
3795 if (capacity() < __min_cap - 1)
3796 return false;
3797 if (data() == 0)
3798 return false;
3799 if (data()[size()] != value_type(0))
3800 return false;
3801 return true;
3802}
3803
3804// operator==
3805
3806template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003807inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163808bool
3809operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:123810 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163811{
Howard Hinnant08dd2532013-04-22 23:55:133812 size_t __lhs_sz = __lhs.size();
3813 return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(),
3814 __rhs.data(),
3815 __lhs_sz) == 0;
3816}
3817
3818template<class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003819inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant08dd2532013-04-22 23:55:133820bool
3821operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
3822 const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT
3823{
3824 size_t __lhs_sz = __lhs.size();
3825 if (__lhs_sz != __rhs.size())
3826 return false;
3827 const char* __lp = __lhs.data();
3828 const char* __rp = __rhs.data();
3829 if (__lhs.__is_long())
3830 return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
3831 for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
3832 if (*__lp != *__rp)
3833 return false;
3834 return true;
Howard Hinnantbc8d3f92010-05-11 19:42:163835}
3836
3837template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003838inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163839bool
Howard Hinnanta6119a82011-05-29 19:57:123840operator==(const _CharT* __lhs,
3841 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163842{
Eric Fiselier4f241822015-08-28 03:02:373843 typedef basic_string<_CharT, _Traits, _Allocator> _String;
3844 _LIBCPP_ASSERT(__lhs != nullptr, "operator==(char*, basic_string): received nullptr");
3845 size_t __lhs_len = _Traits::length(__lhs);
3846 if (__lhs_len != __rhs.size()) return false;
3847 return __rhs.compare(0, _String::npos, __lhs, __lhs_len) == 0;
Howard Hinnantbc8d3f92010-05-11 19:42:163848}
3849
Howard Hinnantbc8d3f92010-05-11 19:42:163850template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003851inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163852bool
Howard Hinnanta6119a82011-05-29 19:57:123853operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
3854 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163855{
Eric Fiselier4f241822015-08-28 03:02:373856 typedef basic_string<_CharT, _Traits, _Allocator> _String;
3857 _LIBCPP_ASSERT(__rhs != nullptr, "operator==(basic_string, char*): received nullptr");
3858 size_t __rhs_len = _Traits::length(__rhs);
3859 if (__rhs_len != __lhs.size()) return false;
3860 return __lhs.compare(0, _String::npos, __rhs, __rhs_len) == 0;
Howard Hinnantbc8d3f92010-05-11 19:42:163861}
3862
Howard Hinnantbc8d3f92010-05-11 19:42:163863// operator!=
3864
Howard Hinnant324bb032010-08-22 00:02:433865template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003866inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163867bool
3868operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:123869 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163870{
3871 return !(__lhs == __rhs);
3872}
3873
3874template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003875inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163876bool
Howard Hinnanta6119a82011-05-29 19:57:123877operator!=(const _CharT* __lhs,
3878 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163879{
3880 return !(__lhs == __rhs);
3881}
3882
3883template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003884inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163885bool
Howard Hinnanta6119a82011-05-29 19:57:123886operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3887 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163888{
3889 return !(__lhs == __rhs);
3890}
3891
3892// operator<
3893
3894template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003895inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163896bool
3897operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:123898 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163899{
Howard Hinnant2644a7b2011-07-24 15:07:213900 return __lhs.compare(__rhs) < 0;
Howard Hinnantbc8d3f92010-05-11 19:42:163901}
3902
3903template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003904inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163905bool
Howard Hinnanta6119a82011-05-29 19:57:123906operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3907 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163908{
Howard Hinnant2644a7b2011-07-24 15:07:213909 return __lhs.compare(__rhs) < 0;
Howard Hinnantbc8d3f92010-05-11 19:42:163910}
3911
3912template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003913inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163914bool
Howard Hinnanta6119a82011-05-29 19:57:123915operator< (const _CharT* __lhs,
3916 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163917{
3918 return __rhs.compare(__lhs) > 0;
3919}
3920
Howard Hinnantbc8d3f92010-05-11 19:42:163921// operator>
3922
3923template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003924inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163925bool
3926operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:123927 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163928{
3929 return __rhs < __lhs;
3930}
3931
3932template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003933inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163934bool
Howard Hinnanta6119a82011-05-29 19:57:123935operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3936 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163937{
3938 return __rhs < __lhs;
3939}
3940
3941template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003942inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163943bool
Howard Hinnanta6119a82011-05-29 19:57:123944operator> (const _CharT* __lhs,
3945 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163946{
3947 return __rhs < __lhs;
3948}
3949
3950// operator<=
3951
3952template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003953inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163954bool
3955operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:123956 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163957{
3958 return !(__rhs < __lhs);
3959}
3960
3961template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003962inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163963bool
Howard Hinnanta6119a82011-05-29 19:57:123964operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3965 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163966{
3967 return !(__rhs < __lhs);
3968}
3969
3970template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003971inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163972bool
Howard Hinnanta6119a82011-05-29 19:57:123973operator<=(const _CharT* __lhs,
3974 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163975{
3976 return !(__rhs < __lhs);
3977}
3978
3979// operator>=
3980
3981template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003982inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163983bool
3984operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:123985 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163986{
3987 return !(__lhs < __rhs);
3988}
3989
3990template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:003991inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:163992bool
Howard Hinnanta6119a82011-05-29 19:57:123993operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3994 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:163995{
3996 return !(__lhs < __rhs);
3997}
3998
3999template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:004000inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:164001bool
Howard Hinnanta6119a82011-05-29 19:57:124002operator>=(const _CharT* __lhs,
4003 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:164004{
4005 return !(__lhs < __rhs);
4006}
4007
4008// operator +
4009
4010template<class _CharT, class _Traits, class _Allocator>
4011basic_string<_CharT, _Traits, _Allocator>
4012operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
4013 const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4014{
4015 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4016 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4017 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
4018 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
4019 __r.append(__rhs.data(), __rhs_sz);
4020 return __r;
4021}
4022
4023template<class _CharT, class _Traits, class _Allocator>
4024basic_string<_CharT, _Traits, _Allocator>
4025operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4026{
4027 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
4028 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs);
4029 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
4030 __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
4031 __r.append(__rhs.data(), __rhs_sz);
4032 return __r;
4033}
4034
4035template<class _CharT, class _Traits, class _Allocator>
4036basic_string<_CharT, _Traits, _Allocator>
4037operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4038{
4039 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
4040 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
4041 __r.__init(&__lhs, 1, 1 + __rhs_sz);
4042 __r.append(__rhs.data(), __rhs_sz);
4043 return __r;
4044}
4045
4046template<class _CharT, class _Traits, class _Allocator>
4047basic_string<_CharT, _Traits, _Allocator>
4048operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
4049{
4050 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4051 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4052 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs);
4053 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
4054 __r.append(__rhs, __rhs_sz);
4055 return __r;
4056}
4057
4058template<class _CharT, class _Traits, class _Allocator>
4059basic_string<_CharT, _Traits, _Allocator>
4060operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
4061{
4062 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4063 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4064 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
4065 __r.push_back(__rhs);
4066 return __r;
4067}
4068
Howard Hinnant73d21a42010-09-04 23:28:194069#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:164070
4071template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:004072inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:164073basic_string<_CharT, _Traits, _Allocator>
4074operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4075{
Howard Hinnant0949eed2011-06-30 21:18:194076 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:164077}
4078
4079template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:004080inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:164081basic_string<_CharT, _Traits, _Allocator>
4082operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4083{
Howard Hinnant0949eed2011-06-30 21:18:194084 return _VSTD::move(__rhs.insert(0, __lhs));
Howard Hinnantbc8d3f92010-05-11 19:42:164085}
4086
4087template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:004088inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:164089basic_string<_CharT, _Traits, _Allocator>
4090operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4091{
Howard Hinnant0949eed2011-06-30 21:18:194092 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:164093}
4094
4095template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:004096inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:164097basic_string<_CharT, _Traits, _Allocator>
4098operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4099{
Howard Hinnant0949eed2011-06-30 21:18:194100 return _VSTD::move(__rhs.insert(0, __lhs));
Howard Hinnantbc8d3f92010-05-11 19:42:164101}
4102
4103template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:004104inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:164105basic_string<_CharT, _Traits, _Allocator>
4106operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4107{
4108 __rhs.insert(__rhs.begin(), __lhs);
Howard Hinnant0949eed2011-06-30 21:18:194109 return _VSTD::move(__rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:164110}
4111
4112template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:004113inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:164114basic_string<_CharT, _Traits, _Allocator>
4115operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
4116{
Howard Hinnant0949eed2011-06-30 21:18:194117 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:164118}
4119
4120template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:004121inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:164122basic_string<_CharT, _Traits, _Allocator>
4123operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
4124{
4125 __lhs.push_back(__rhs);
Howard Hinnant0949eed2011-06-30 21:18:194126 return _VSTD::move(__lhs);
Howard Hinnantbc8d3f92010-05-11 19:42:164127}
4128
Howard Hinnant73d21a42010-09-04 23:28:194129#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:164130
4131// swap
4132
4133template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:004134inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:164135void
Howard Hinnanta6119a82011-05-29 19:57:124136swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnant53f7d4c2011-06-03 18:40:474137 basic_string<_CharT, _Traits, _Allocator>& __rhs)
4138 _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
Howard Hinnantbc8d3f92010-05-11 19:42:164139{
4140 __lhs.swap(__rhs);
4141}
4142
Howard Hinnantbc8d3f92010-05-11 19:42:164143#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
4144
4145typedef basic_string<char16_t> u16string;
4146typedef basic_string<char32_t> u32string;
4147
Howard Hinnant324bb032010-08-22 00:02:434148#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
Howard Hinnantbc8d3f92010-05-11 19:42:164149
Howard Hinnant0f678bd2013-08-12 18:38:344150_LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* __idx = 0, int __base = 10);
4151_LIBCPP_FUNC_VIS long stol (const string& __str, size_t* __idx = 0, int __base = 10);
4152_LIBCPP_FUNC_VIS unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10);
4153_LIBCPP_FUNC_VIS long long stoll (const string& __str, size_t* __idx = 0, int __base = 10);
4154_LIBCPP_FUNC_VIS unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10);
Howard Hinnanta6a062d2010-06-02 18:20:394155
Howard Hinnant0f678bd2013-08-12 18:38:344156_LIBCPP_FUNC_VIS float stof (const string& __str, size_t* __idx = 0);
4157_LIBCPP_FUNC_VIS double stod (const string& __str, size_t* __idx = 0);
4158_LIBCPP_FUNC_VIS long double stold(const string& __str, size_t* __idx = 0);
Howard Hinnanta6a062d2010-06-02 18:20:394159
Howard Hinnant0f678bd2013-08-12 18:38:344160_LIBCPP_FUNC_VIS string to_string(int __val);
4161_LIBCPP_FUNC_VIS string to_string(unsigned __val);
4162_LIBCPP_FUNC_VIS string to_string(long __val);
4163_LIBCPP_FUNC_VIS string to_string(unsigned long __val);
4164_LIBCPP_FUNC_VIS string to_string(long long __val);
4165_LIBCPP_FUNC_VIS string to_string(unsigned long long __val);
4166_LIBCPP_FUNC_VIS string to_string(float __val);
4167_LIBCPP_FUNC_VIS string to_string(double __val);
4168_LIBCPP_FUNC_VIS string to_string(long double __val);
Howard Hinnanta6a062d2010-06-02 18:20:394169
Howard Hinnant0f678bd2013-08-12 18:38:344170_LIBCPP_FUNC_VIS int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10);
4171_LIBCPP_FUNC_VIS long stol (const wstring& __str, size_t* __idx = 0, int __base = 10);
4172_LIBCPP_FUNC_VIS unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10);
4173_LIBCPP_FUNC_VIS long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10);
4174_LIBCPP_FUNC_VIS unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10);
Howard Hinnanta6a062d2010-06-02 18:20:394175
Howard Hinnant0f678bd2013-08-12 18:38:344176_LIBCPP_FUNC_VIS float stof (const wstring& __str, size_t* __idx = 0);
4177_LIBCPP_FUNC_VIS double stod (const wstring& __str, size_t* __idx = 0);
4178_LIBCPP_FUNC_VIS long double stold(const wstring& __str, size_t* __idx = 0);
Howard Hinnanta6a062d2010-06-02 18:20:394179
Howard Hinnant0f678bd2013-08-12 18:38:344180_LIBCPP_FUNC_VIS wstring to_wstring(int __val);
4181_LIBCPP_FUNC_VIS wstring to_wstring(unsigned __val);
4182_LIBCPP_FUNC_VIS wstring to_wstring(long __val);
4183_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long __val);
4184_LIBCPP_FUNC_VIS wstring to_wstring(long long __val);
4185_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long long __val);
4186_LIBCPP_FUNC_VIS wstring to_wstring(float __val);
4187_LIBCPP_FUNC_VIS wstring to_wstring(double __val);
4188_LIBCPP_FUNC_VIS wstring to_wstring(long double __val);
Howard Hinnanta6a062d2010-06-02 18:20:394189
Howard Hinnantbc8d3f92010-05-11 19:42:164190template<class _CharT, class _Traits, class _Allocator>
4191 const typename basic_string<_CharT, _Traits, _Allocator>::size_type
4192 basic_string<_CharT, _Traits, _Allocator>::npos;
4193
4194template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:344195struct _LIBCPP_TYPE_VIS_ONLY hash<basic_string<_CharT, _Traits, _Allocator> >
Howard Hinnantbc8d3f92010-05-11 19:42:164196 : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t>
4197{
4198 size_t
Howard Hinnanta6119a82011-05-29 19:57:124199 operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:164200};
4201
4202template<class _CharT, class _Traits, class _Allocator>
4203size_t
4204hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(
Howard Hinnanta6119a82011-05-29 19:57:124205 const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:164206{
Sean Huntaffd9e52011-07-29 23:31:564207 return __do_string_hash(__val.data(), __val.data() + __val.size());
Howard Hinnantbc8d3f92010-05-11 19:42:164208}
4209
Howard Hinnant464aa5c2011-07-18 15:51:594210template<class _CharT, class _Traits, class _Allocator>
4211basic_ostream<_CharT, _Traits>&
4212operator<<(basic_ostream<_CharT, _Traits>& __os,
4213 const basic_string<_CharT, _Traits, _Allocator>& __str);
4214
4215template<class _CharT, class _Traits, class _Allocator>
4216basic_istream<_CharT, _Traits>&
4217operator>>(basic_istream<_CharT, _Traits>& __is,
4218 basic_string<_CharT, _Traits, _Allocator>& __str);
4219
4220template<class _CharT, class _Traits, class _Allocator>
4221basic_istream<_CharT, _Traits>&
4222getline(basic_istream<_CharT, _Traits>& __is,
4223 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4224
4225template<class _CharT, class _Traits, class _Allocator>
4226inline _LIBCPP_INLINE_VISIBILITY
4227basic_istream<_CharT, _Traits>&
4228getline(basic_istream<_CharT, _Traits>& __is,
4229 basic_string<_CharT, _Traits, _Allocator>& __str);
4230
4231#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4232
4233template<class _CharT, class _Traits, class _Allocator>
4234inline _LIBCPP_INLINE_VISIBILITY
4235basic_istream<_CharT, _Traits>&
4236getline(basic_istream<_CharT, _Traits>&& __is,
4237 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4238
4239template<class _CharT, class _Traits, class _Allocator>
4240inline _LIBCPP_INLINE_VISIBILITY
4241basic_istream<_CharT, _Traits>&
4242getline(basic_istream<_CharT, _Traits>&& __is,
4243 basic_string<_CharT, _Traits, _Allocator>& __str);
4244
4245#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4246
Howard Hinnant499cea12013-08-23 17:37:054247#if _LIBCPP_DEBUG_LEVEL >= 2
4248
4249template<class _CharT, class _Traits, class _Allocator>
4250bool
4251basic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const
4252{
4253 return this->data() <= _VSTD::__to_raw_pointer(__i->base()) &&
4254 _VSTD::__to_raw_pointer(__i->base()) < this->data() + this->size();
4255}
4256
4257template<class _CharT, class _Traits, class _Allocator>
4258bool
4259basic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const
4260{
4261 return this->data() < _VSTD::__to_raw_pointer(__i->base()) &&
4262 _VSTD::__to_raw_pointer(__i->base()) <= this->data() + this->size();
4263}
4264
4265template<class _CharT, class _Traits, class _Allocator>
4266bool
4267basic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
4268{
4269 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4270 return this->data() <= __p && __p <= this->data() + this->size();
4271}
4272
4273template<class _CharT, class _Traits, class _Allocator>
4274bool
4275basic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
4276{
4277 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4278 return this->data() <= __p && __p < this->data() + this->size();
4279}
4280
4281#endif // _LIBCPP_DEBUG_LEVEL >= 2
4282
Marshall Clow15234322013-07-23 17:05:244283#if _LIBCPP_STD_VER > 11
4284// Literal suffixes for basic_string [basic.string.literals]
Marshall Clow8d9dd7a2013-10-05 21:18:324285inline namespace literals
Marshall Clow15234322013-07-23 17:05:244286{
4287 inline namespace string_literals
4288 {
Howard Hinnantab61b2c2013-08-07 19:39:484289 inline _LIBCPP_INLINE_VISIBILITY
4290 basic_string<char> operator "" s( const char *__str, size_t __len )
4291 {
4292 return basic_string<char> (__str, __len);
4293 }
Marshall Clow15234322013-07-23 17:05:244294
Howard Hinnantab61b2c2013-08-07 19:39:484295 inline _LIBCPP_INLINE_VISIBILITY
4296 basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
4297 {
4298 return basic_string<wchar_t> (__str, __len);
4299 }
Marshall Clow15234322013-07-23 17:05:244300
Howard Hinnantab61b2c2013-08-07 19:39:484301 inline _LIBCPP_INLINE_VISIBILITY
4302 basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len )
4303 {
4304 return basic_string<char16_t> (__str, __len);
4305 }
Marshall Clow15234322013-07-23 17:05:244306
Howard Hinnantab61b2c2013-08-07 19:39:484307 inline _LIBCPP_INLINE_VISIBILITY
4308 basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len )
4309 {
4310 return basic_string<char32_t> (__str, __len);
4311 }
Marshall Clow15234322013-07-23 17:05:244312 }
4313}
4314#endif
4315
Howard Hinnant0f678bd2013-08-12 18:38:344316_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<char>)
4317_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<wchar_t>)
Howard Hinnant499cea12013-08-23 17:37:054318_LIBCPP_EXTERN_TEMPLATE(string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
Howard Hinnantbc8d3f92010-05-11 19:42:164319
4320_LIBCPP_END_NAMESPACE_STD
4321
4322#endif // _LIBCPP_STRING