blob: ee5db1aab63b28e0598ea762e34b482ebf66d40a [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- string -----------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
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:12 +000053 static void assign(char_type& c1, const char_type& c2) noexcept;
Howard Hinnant03d71812012-07-20 19:09:12 +000054 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:16 +000056
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:12 +000064 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:16 +000069};
70
71template <> struct char_traits<char>;
72template <> struct char_traits<wchar_t>;
73
Howard Hinnant324bb032010-08-22 00:02:43 +000074template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000075class basic_string
76{
Howard Hinnant324bb032010-08-22 00:02:43 +000077public:
78// types:
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000079 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:47 +000095 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:16 +000098 basic_string(const basic_string& str);
Howard Hinnant53f7d4c2011-06-03 18:40:47 +000099 basic_string(basic_string&& str)
100 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000101 basic_string(const basic_string& str, size_type pos, size_type n = npos,
102 const allocator_type& a = allocator_type());
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000103 basic_string(const value_type* s, const allocator_type& a = allocator_type());
104 basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000105 basic_string(size_type n, value_type c, const allocator_type& a = allocator_type());
106 template<class InputIterator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000107 basic_string(InputIterator begin, InputIterator end,
108 const allocator_type& a = allocator_type());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000109 basic_string(initializer_list<value_type>, const Allocator& = Allocator());
110 basic_string(const basic_string&, const Allocator&);
111 basic_string(basic_string&&, const Allocator&);
112
113 ~basic_string();
114
115 basic_string& operator=(const basic_string& str);
Howard Hinnant53f7d4c2011-06-03 18:40:47 +0000116 basic_string& operator=(basic_string&& str)
117 noexcept(
Marshall Clowaf961ed2015-08-18 18:57:00 +0000118 allocator_type::propagate_on_container_move_assignment::value ||
119 allocator_type::is_always_equal::value ); // C++17
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000120 basic_string& operator=(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000121 basic_string& operator=(value_type c);
122 basic_string& operator=(initializer_list<value_type>);
123
Howard Hinnanta6119a82011-05-29 19:57:12 +0000124 iterator begin() noexcept;
125 const_iterator begin() const noexcept;
126 iterator end() noexcept;
127 const_iterator end() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000128
Howard Hinnanta6119a82011-05-29 19:57:12 +0000129 reverse_iterator rbegin() noexcept;
130 const_reverse_iterator rbegin() const noexcept;
131 reverse_iterator rend() noexcept;
132 const_reverse_iterator rend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000133
Howard Hinnanta6119a82011-05-29 19:57:12 +0000134 const_iterator cbegin() const noexcept;
135 const_iterator cend() const noexcept;
136 const_reverse_iterator crbegin() const noexcept;
137 const_reverse_iterator crend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000138
Howard Hinnanta6119a82011-05-29 19:57:12 +0000139 size_type size() const noexcept;
140 size_type length() const noexcept;
141 size_type max_size() const noexcept;
142 size_type capacity() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000143
144 void resize(size_type n, value_type c);
145 void resize(size_type n);
146
147 void reserve(size_type res_arg = 0);
148 void shrink_to_fit();
Howard Hinnanta6119a82011-05-29 19:57:12 +0000149 void clear() noexcept;
150 bool empty() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000151
152 const_reference operator[](size_type pos) const;
153 reference operator[](size_type pos);
154
155 const_reference at(size_type n) const;
156 reference at(size_type n);
157
158 basic_string& operator+=(const basic_string& str);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000159 basic_string& operator+=(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000160 basic_string& operator+=(value_type c);
161 basic_string& operator+=(initializer_list<value_type>);
162
163 basic_string& append(const basic_string& str);
Marshall Clowa93b5e22014-03-04 19:17:19 +0000164 basic_string& append(const basic_string& str, size_type pos, size_type n=npos); //C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000165 basic_string& append(const value_type* s, size_type n);
166 basic_string& append(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000167 basic_string& append(size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000168 template<class InputIterator>
169 basic_string& append(InputIterator first, InputIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000170 basic_string& append(initializer_list<value_type>);
171
172 void push_back(value_type c);
173 void pop_back();
174 reference front();
175 const_reference front() const;
176 reference back();
177 const_reference back() const;
178
179 basic_string& assign(const basic_string& str);
Howard Hinnanta6119a82011-05-29 19:57:12 +0000180 basic_string& assign(basic_string&& str);
Marshall Clowa93b5e22014-03-04 19:17:19 +0000181 basic_string& assign(const basic_string& str, size_type pos, size_type n=npos); // C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000182 basic_string& assign(const value_type* s, size_type n);
183 basic_string& assign(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000184 basic_string& assign(size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000185 template<class InputIterator>
186 basic_string& assign(InputIterator first, InputIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000187 basic_string& assign(initializer_list<value_type>);
188
189 basic_string& insert(size_type pos1, const basic_string& str);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000190 basic_string& insert(size_type pos1, const basic_string& str,
191 size_type pos2, size_type n);
Marshall Clowa93b5e22014-03-04 19:17:19 +0000192 basic_string& insert(size_type pos, const value_type* s, size_type n=npos); //C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000193 basic_string& insert(size_type pos, const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000194 basic_string& insert(size_type pos, size_type n, value_type c);
195 iterator insert(const_iterator p, value_type c);
196 iterator insert(const_iterator p, size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000197 template<class InputIterator>
198 iterator insert(const_iterator p, InputIterator first, InputIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000199 iterator insert(const_iterator p, initializer_list<value_type>);
200
201 basic_string& erase(size_type pos = 0, size_type n = npos);
202 iterator erase(const_iterator position);
203 iterator erase(const_iterator first, const_iterator last);
204
205 basic_string& replace(size_type pos1, size_type n1, const basic_string& str);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000206 basic_string& replace(size_type pos1, size_type n1, const basic_string& str,
Marshall Clowa93b5e22014-03-04 19:17:19 +0000207 size_type pos2, size_type n2=npos); // C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000208 basic_string& replace(size_type pos, size_type n1, const value_type* s, size_type n2);
209 basic_string& replace(size_type pos, size_type n1, const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000210 basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c);
Howard Hinnant7b2cb482010-11-17 21:11:40 +0000211 basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000212 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n);
213 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s);
Howard Hinnant7b2cb482010-11-17 21:11:40 +0000214 basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000215 template<class InputIterator>
Howard Hinnant7b2cb482010-11-17 21:11:40 +0000216 basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
217 basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000218
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000219 size_type copy(value_type* s, size_type n, size_type pos = 0) const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000220 basic_string substr(size_type pos = 0, size_type n = npos) const;
221
Howard Hinnant53f7d4c2011-06-03 18:40:47 +0000222 void swap(basic_string& str)
Marshall Clow7d914d12015-07-13 20:04:56 +0000223 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
224 allocator_traits<allocator_type>::is_always_equal::value); // C++17
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000225
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000226 const value_type* c_str() const noexcept;
227 const value_type* data() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000228
Howard Hinnanta6119a82011-05-29 19:57:12 +0000229 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000230
Howard Hinnanta6119a82011-05-29 19:57:12 +0000231 size_type find(const basic_string& str, size_type pos = 0) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000232 size_type find(const value_type* s, size_type pos, size_type n) const noexcept;
233 size_type find(const value_type* s, size_type pos = 0) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000234 size_type find(value_type c, size_type pos = 0) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000235
Howard Hinnanta6119a82011-05-29 19:57:12 +0000236 size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000237 size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept;
238 size_type rfind(const value_type* s, size_type pos = npos) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000239 size_type rfind(value_type c, size_type pos = npos) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000240
Howard Hinnanta6119a82011-05-29 19:57:12 +0000241 size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000242 size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept;
243 size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000244 size_type find_first_of(value_type c, size_type pos = 0) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000245
Howard Hinnanta6119a82011-05-29 19:57:12 +0000246 size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000247 size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept;
248 size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000249 size_type find_last_of(value_type c, size_type pos = npos) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000250
Howard Hinnanta6119a82011-05-29 19:57:12 +0000251 size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000252 size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
253 size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000254 size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000255
Howard Hinnanta6119a82011-05-29 19:57:12 +0000256 size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000257 size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
258 size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000259 size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000260
Howard Hinnanta6119a82011-05-29 19:57:12 +0000261 int compare(const basic_string& str) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000262 int compare(size_type pos1, size_type n1, const basic_string& str) const;
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000263 int compare(size_type pos1, size_type n1, const basic_string& str,
Marshall Clowa93b5e22014-03-04 19:17:19 +0000264 size_type pos2, size_type n2=npos) const; // C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000265 int compare(const value_type* s) const noexcept;
266 int compare(size_type pos1, size_type n1, const value_type* s) const;
267 int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000268
269 bool __invariants() const;
270};
271
272template<class charT, class traits, class Allocator>
273basic_string<charT, traits, Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000274operator+(const basic_string<charT, traits, Allocator>& lhs,
275 const basic_string<charT, traits, Allocator>& rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000276
277template<class charT, class traits, class Allocator>
278basic_string<charT, traits, Allocator>
279operator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs);
280
281template<class charT, class traits, class Allocator>
282basic_string<charT, traits, Allocator>
283operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs);
284
285template<class charT, class traits, class Allocator>
286basic_string<charT, traits, Allocator>
287operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
288
289template<class charT, class traits, class Allocator>
290basic_string<charT, traits, Allocator>
291operator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs);
292
293template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000294bool operator==(const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000295 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000296
297template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000298bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000299
300template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000301bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000302
Howard Hinnant324bb032010-08-22 00:02:43 +0000303template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000304bool operator!=(const basic_string<charT,traits,Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000305 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000306
307template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000308bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000309
310template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000311bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000312
313template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000314bool operator< (const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000315 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000316
317template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000318bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000319
320template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000321bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000322
323template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000324bool operator> (const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000325 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000326
327template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000328bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000329
330template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000331bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000332
333template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000334bool operator<=(const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000335 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000336
337template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000338bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000339
340template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000341bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000342
343template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000344bool operator>=(const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000345 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000346
347template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000348bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000349
350template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000351bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000352
353template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000354void swap(basic_string<charT, traits, Allocator>& lhs,
Howard Hinnant53f7d4c2011-06-03 18:40:47 +0000355 basic_string<charT, traits, Allocator>& rhs)
356 noexcept(noexcept(lhs.swap(rhs)));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000357
358template<class charT, class traits, class Allocator>
359basic_istream<charT, traits>&
360operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
361
362template<class charT, class traits, class Allocator>
363basic_ostream<charT, traits>&
364operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
365
366template<class charT, class traits, class Allocator>
Howard Hinnant324bb032010-08-22 00:02:43 +0000367basic_istream<charT, traits>&
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000368getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str,
369 charT delim);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000370
371template<class charT, class traits, class Allocator>
372basic_istream<charT, traits>&
373getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
374
375typedef basic_string<char> string;
376typedef basic_string<wchar_t> wstring;
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000377typedef basic_string<char16_t> u16string;
378typedef basic_string<char32_t> u32string;
379
380int stoi (const string& str, size_t* idx = 0, int base = 10);
381long stol (const string& str, size_t* idx = 0, int base = 10);
382unsigned long stoul (const string& str, size_t* idx = 0, int base = 10);
383long long stoll (const string& str, size_t* idx = 0, int base = 10);
384unsigned long long stoull(const string& str, size_t* idx = 0, int base = 10);
385
386float stof (const string& str, size_t* idx = 0);
387double stod (const string& str, size_t* idx = 0);
388long double stold(const string& str, size_t* idx = 0);
389
390string to_string(int val);
391string to_string(unsigned val);
392string to_string(long val);
393string to_string(unsigned long val);
394string to_string(long long val);
395string to_string(unsigned long long val);
396string to_string(float val);
397string to_string(double val);
398string to_string(long double val);
399
400int stoi (const wstring& str, size_t* idx = 0, int base = 10);
401long stol (const wstring& str, size_t* idx = 0, int base = 10);
402unsigned long stoul (const wstring& str, size_t* idx = 0, int base = 10);
403long long stoll (const wstring& str, size_t* idx = 0, int base = 10);
404unsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10);
405
406float stof (const wstring& str, size_t* idx = 0);
407double stod (const wstring& str, size_t* idx = 0);
408long double stold(const wstring& str, size_t* idx = 0);
409
410wstring to_wstring(int val);
411wstring to_wstring(unsigned val);
412wstring to_wstring(long val);
413wstring to_wstring(unsigned long val);
414wstring to_wstring(long long val);
415wstring to_wstring(unsigned long long val);
416wstring to_wstring(float val);
417wstring to_wstring(double val);
418wstring to_wstring(long double val);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000419
420template <> struct hash<string>;
421template <> struct hash<u16string>;
422template <> struct hash<u32string>;
423template <> struct hash<wstring>;
424
Marshall Clow15234322013-07-23 17:05:24 +0000425basic_string<char> operator "" s( const char *str, size_t len ); // C++14
426basic_string<wchar_t> operator "" s( const wchar_t *str, size_t len ); // C++14
427basic_string<char16_t> operator "" s( const char16_t *str, size_t len ); // C++14
428basic_string<char32_t> operator "" s( const char32_t *str, size_t len ); // C++14
429
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000430} // std
431
432*/
433
434#include <__config>
435#include <iosfwd>
436#include <cstring>
Howard Hinnantadff4892010-05-24 17:49:41 +0000437#include <cstdio> // For EOF.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000438#include <cwchar>
439#include <algorithm>
440#include <iterator>
441#include <utility>
442#include <memory>
443#include <stdexcept>
444#include <type_traits>
445#include <initializer_list>
446#include <__functional_base>
447#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
448#include <cstdint>
449#endif
Howard Hinnant499cea12013-08-23 17:37:05 +0000450#if defined(_LIBCPP_NO_EXCEPTIONS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000451#include <cassert>
452#endif
453
Howard Hinnant66c6f972011-11-29 16:45:27 +0000454#include <__undef_min_max>
455
Eric Fiselierb9536102014-08-10 23:53:08 +0000456#include <__debug>
457
Howard Hinnant08e17472011-10-17 20:05:10 +0000458#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000459#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000460#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000461
462_LIBCPP_BEGIN_NAMESPACE_STD
463
464// fpos
465
466template <class _StateT>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000467class _LIBCPP_TYPE_VIS_ONLY fpos
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000468{
469private:
470 _StateT __st_;
471 streamoff __off_;
472public:
473 _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {}
474
475 _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;}
476
477 _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;}
478 _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;}
479
480 _LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;}
481 _LIBCPP_INLINE_VISIBILITY fpos operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;}
482 _LIBCPP_INLINE_VISIBILITY fpos& operator-=(streamoff __off) {__off_ -= __off; return *this;}
483 _LIBCPP_INLINE_VISIBILITY fpos operator- (streamoff __off) const {fpos __t(*this); __t -= __off; return __t;}
484};
485
486template <class _StateT>
487inline _LIBCPP_INLINE_VISIBILITY
488streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
489 {return streamoff(__x) - streamoff(__y);}
490
491template <class _StateT>
492inline _LIBCPP_INLINE_VISIBILITY
493bool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
494 {return streamoff(__x) == streamoff(__y);}
495
496template <class _StateT>
497inline _LIBCPP_INLINE_VISIBILITY
498bool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
499 {return streamoff(__x) != streamoff(__y);}
500
501// char_traits
502
503template <class _CharT>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000504struct _LIBCPP_TYPE_VIS_ONLY char_traits
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000505{
506 typedef _CharT char_type;
507 typedef int int_type;
508 typedef streamoff off_type;
509 typedef streampos pos_type;
510 typedef mbstate_t state_type;
511
Dan Albert6d9505a2014-09-17 16:34:29 +0000512 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000513 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000514 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000515 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000516 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000517 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000518
519 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000520 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000521 static size_t length(const char_type* __s);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000522 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000523 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
524 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000525 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000526 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000527 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000528 static char_type* assign(char_type* __s, size_t __n, char_type __a);
529
Dan Albert6d9505a2014-09-17 16:34:29 +0000530 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000531 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000532 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000533 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000534 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000535 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000536 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000537 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000538 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000539 {return int_type(EOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000540};
541
542template <class _CharT>
543int
544char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
545{
546 for (; __n; --__n, ++__s1, ++__s2)
547 {
548 if (lt(*__s1, *__s2))
549 return -1;
550 if (lt(*__s2, *__s1))
551 return 1;
552 }
553 return 0;
554}
555
556template <class _CharT>
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000557inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000558size_t
559char_traits<_CharT>::length(const char_type* __s)
560{
561 size_t __len = 0;
562 for (; !eq(*__s, char_type(0)); ++__s)
563 ++__len;
564 return __len;
565}
566
567template <class _CharT>
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000568inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000569const _CharT*
570char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a)
571{
572 for (; __n; --__n)
573 {
574 if (eq(*__s, __a))
575 return __s;
576 ++__s;
577 }
578 return 0;
579}
580
581template <class _CharT>
582_CharT*
583char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n)
584{
585 char_type* __r = __s1;
586 if (__s1 < __s2)
587 {
588 for (; __n; --__n, ++__s1, ++__s2)
589 assign(*__s1, *__s2);
590 }
591 else if (__s2 < __s1)
592 {
593 __s1 += __n;
594 __s2 += __n;
595 for (; __n; --__n)
596 assign(*--__s1, *--__s2);
597 }
598 return __r;
599}
600
601template <class _CharT>
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000602inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000603_CharT*
604char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
605{
Howard Hinnant499cea12013-08-23 17:37:05 +0000606 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000607 char_type* __r = __s1;
608 for (; __n; --__n, ++__s1, ++__s2)
609 assign(*__s1, *__s2);
610 return __r;
611}
612
613template <class _CharT>
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000614inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000615_CharT*
616char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a)
617{
618 char_type* __r = __s;
619 for (; __n; --__n, ++__s)
620 assign(*__s, __a);
621 return __r;
622}
623
624// char_traits<char>
625
626template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000627struct _LIBCPP_TYPE_VIS_ONLY char_traits<char>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000628{
629 typedef char char_type;
630 typedef int int_type;
631 typedef streamoff off_type;
632 typedef streampos pos_type;
633 typedef mbstate_t state_type;
634
Dan Albert6d9505a2014-09-17 16:34:29 +0000635 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000636 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000637 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000638 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000639 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000640 {return (unsigned char)__c1 < (unsigned char)__c2;}
641
Dan Albert6d9505a2014-09-17 16:34:29 +0000642 static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clowf2e36ef2015-02-12 23:34:52 +0000643 {return __n == 0 ? 0 : memcmp(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000644 static inline size_t length(const char_type* __s) {return strlen(__s);}
645 static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000646 {return __n == 0 ? NULL : (const char_type*) memchr(__s, to_int_type(__a), __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000647 static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000648 {return __n == 0 ? __s1 : (char_type*) memmove(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000649 static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnant499cea12013-08-23 17:37:05 +0000650 {
651 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Marshall Clow6bcbced2015-02-13 16:04:42 +0000652 return __n == 0 ? __s1 : (char_type*)memcpy(__s1, __s2, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +0000653 }
Dan Albert6d9505a2014-09-17 16:34:29 +0000654 static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000655 {return __n == 0 ? __s : (char_type*)memset(__s, to_int_type(__a), __n);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000656
Dan Albert6d9505a2014-09-17 16:34:29 +0000657 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000658 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000659 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000660 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000661 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000662 {return int_type((unsigned char)__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000663 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000664 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000665 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000666 {return int_type(EOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000667};
668
669// char_traits<wchar_t>
670
671template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000672struct _LIBCPP_TYPE_VIS_ONLY char_traits<wchar_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000673{
674 typedef wchar_t char_type;
675 typedef wint_t int_type;
676 typedef streamoff off_type;
677 typedef streampos pos_type;
678 typedef mbstate_t state_type;
679
Dan Albert6d9505a2014-09-17 16:34:29 +0000680 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000681 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000682 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000683 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000684 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000685 {return __c1 < __c2;}
686
Dan Albert6d9505a2014-09-17 16:34:29 +0000687 static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clowf2e36ef2015-02-12 23:34:52 +0000688 {return __n == 0 ? 0 : wmemcmp(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000689 static inline size_t length(const char_type* __s)
Howard Hinnanta6119a82011-05-29 19:57:12 +0000690 {return wcslen(__s);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000691 static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000692 {return __n == 0 ? NULL : (const char_type*)wmemchr(__s, __a, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000693 static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000694 {return __n == 0 ? __s1 : (char_type*)wmemmove(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000695 static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnant499cea12013-08-23 17:37:05 +0000696 {
697 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Marshall Clow6bcbced2015-02-13 16:04:42 +0000698 return __n == 0 ? __s1 : (char_type*)wmemcpy(__s1, __s2, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +0000699 }
Dan Albert6d9505a2014-09-17 16:34:29 +0000700 static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000701 {return __n == 0 ? __s : (char_type*)wmemset(__s, __a, __n);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000702
Dan Albert6d9505a2014-09-17 16:34:29 +0000703 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000704 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000705 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000706 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000707 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000708 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000709 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000710 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000711 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000712 {return int_type(WEOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000713};
714
715#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
716
717template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000718struct _LIBCPP_TYPE_VIS_ONLY char_traits<char16_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000719{
720 typedef char16_t char_type;
721 typedef uint_least16_t int_type;
722 typedef streamoff off_type;
723 typedef u16streampos pos_type;
724 typedef mbstate_t state_type;
725
Dan Albert6d9505a2014-09-17 16:34:29 +0000726 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000727 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000728 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000729 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000730 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000731 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000732
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000733 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000734 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000735 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000736 static size_t length(const char_type* __s);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000737 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000738 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000739 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000740 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000741 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000742 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000743 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000744 static char_type* assign(char_type* __s, size_t __n, char_type __a);
745
Dan Albert6d9505a2014-09-17 16:34:29 +0000746 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000747 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000748 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000749 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000750 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000751 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000752 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000753 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000754 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Marshall Clow9a3c6892015-08-04 01:38:34 +0000755 {return int_type(0xFFFF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000756};
757
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000758inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000759int
760char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
761{
762 for (; __n; --__n, ++__s1, ++__s2)
763 {
764 if (lt(*__s1, *__s2))
765 return -1;
766 if (lt(*__s2, *__s1))
767 return 1;
768 }
769 return 0;
770}
771
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000772inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000773size_t
774char_traits<char16_t>::length(const char_type* __s)
775{
776 size_t __len = 0;
777 for (; !eq(*__s, char_type(0)); ++__s)
778 ++__len;
779 return __len;
780}
781
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000782inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000783const char16_t*
784char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a)
785{
786 for (; __n; --__n)
787 {
788 if (eq(*__s, __a))
789 return __s;
790 ++__s;
791 }
792 return 0;
793}
794
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000795inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000796char16_t*
797char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
798{
799 char_type* __r = __s1;
800 if (__s1 < __s2)
801 {
802 for (; __n; --__n, ++__s1, ++__s2)
803 assign(*__s1, *__s2);
804 }
805 else if (__s2 < __s1)
806 {
807 __s1 += __n;
808 __s2 += __n;
809 for (; __n; --__n)
810 assign(*--__s1, *--__s2);
811 }
812 return __r;
813}
814
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000815inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000816char16_t*
817char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
818{
Howard Hinnant499cea12013-08-23 17:37:05 +0000819 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000820 char_type* __r = __s1;
821 for (; __n; --__n, ++__s1, ++__s2)
822 assign(*__s1, *__s2);
823 return __r;
824}
825
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000826inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000827char16_t*
828char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a)
829{
830 char_type* __r = __s;
831 for (; __n; --__n, ++__s)
832 assign(*__s, __a);
833 return __r;
834}
835
836template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000837struct _LIBCPP_TYPE_VIS_ONLY char_traits<char32_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000838{
839 typedef char32_t char_type;
840 typedef uint_least32_t int_type;
841 typedef streamoff off_type;
842 typedef u32streampos pos_type;
843 typedef mbstate_t state_type;
844
Dan Albert6d9505a2014-09-17 16:34:29 +0000845 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000846 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000847 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000848 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000849 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000850 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000851
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000852 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000853 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000854 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000855 static size_t length(const char_type* __s);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000856 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000857 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000858 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000859 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000860 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000861 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000862 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000863 static char_type* assign(char_type* __s, size_t __n, char_type __a);
864
Dan Albert6d9505a2014-09-17 16:34:29 +0000865 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000866 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000867 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000868 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000869 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000870 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000871 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000872 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000873 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000874 {return int_type(0xFFFFFFFF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000875};
876
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000877inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000878int
879char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
880{
881 for (; __n; --__n, ++__s1, ++__s2)
882 {
883 if (lt(*__s1, *__s2))
884 return -1;
885 if (lt(*__s2, *__s1))
886 return 1;
887 }
888 return 0;
889}
890
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000891inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000892size_t
893char_traits<char32_t>::length(const char_type* __s)
894{
895 size_t __len = 0;
896 for (; !eq(*__s, char_type(0)); ++__s)
897 ++__len;
898 return __len;
899}
900
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000901inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000902const char32_t*
903char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a)
904{
905 for (; __n; --__n)
906 {
907 if (eq(*__s, __a))
908 return __s;
909 ++__s;
910 }
911 return 0;
912}
913
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000914inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000915char32_t*
916char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
917{
918 char_type* __r = __s1;
919 if (__s1 < __s2)
920 {
921 for (; __n; --__n, ++__s1, ++__s2)
922 assign(*__s1, *__s2);
923 }
924 else if (__s2 < __s1)
925 {
926 __s1 += __n;
927 __s2 += __n;
928 for (; __n; --__n)
929 assign(*--__s1, *--__s2);
930 }
931 return __r;
932}
933
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000934inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000935char32_t*
936char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
937{
Howard Hinnant499cea12013-08-23 17:37:05 +0000938 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000939 char_type* __r = __s1;
940 for (; __n; --__n, ++__s1, ++__s2)
941 assign(*__s1, *__s2);
942 return __r;
943}
944
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +0000945inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000946char32_t*
947char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a)
948{
949 char_type* __r = __s;
950 for (; __n; --__n, ++__s)
951 assign(*__s, __a);
952 return __r;
953}
954
Howard Hinnant324bb032010-08-22 00:02:43 +0000955#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000956
Marshall Clowb671fc92013-12-09 16:00:28 +0000957// helper fns for basic_string
958
Marshall Clow37025e12014-06-10 18:51:55 +0000959// __str_find
Marshall Clowb671fc92013-12-09 16:00:28 +0000960template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +0000961_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +0000962__str_find(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +0000963 _CharT __c, _SizeT __pos) _NOEXCEPT
964{
965 if (__pos >= __sz)
966 return __npos;
967 const _CharT* __r = _Traits::find(__p + __pos, __sz - __pos, __c);
968 if (__r == 0)
969 return __npos;
970 return static_cast<_SizeT>(__r - __p);
971}
972
973template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
974_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +0000975__str_find(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +0000976 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
977{
978 if (__pos > __sz || __sz - __pos < __n)
979 return __npos;
980 if (__n == 0)
981 return __pos;
Marshall Clow360f3192014-06-02 02:22:49 +0000982 const _CharT* __r =
Marshall Clow37025e12014-06-10 18:51:55 +0000983 _VSTD::__search(__p + __pos, __p + __sz,
984 __s, __s + __n, _Traits::eq,
985 random_access_iterator_tag(), random_access_iterator_tag());
Marshall Clow360f3192014-06-02 02:22:49 +0000986 if (__r == __p + __sz)
987 return __npos;
988 return static_cast<_SizeT>(__r - __p);
989}
990
991
Marshall Clow37025e12014-06-10 18:51:55 +0000992// __str_rfind
Marshall Clow360f3192014-06-02 02:22:49 +0000993
994template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
995_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +0000996__str_rfind(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +0000997 _CharT __c, _SizeT __pos) _NOEXCEPT
998{
999 if (__sz < 1)
Marshall Clowd5549cc2014-07-17 15:32:20 +00001000 return __npos;
1001 if (__pos < __sz)
1002 ++__pos;
1003 else
1004 __pos = __sz;
1005 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1006 {
1007 if (_Traits::eq(*--__ps, __c))
1008 return static_cast<_SizeT>(__ps - __p);
1009 }
Marshall Clow360f3192014-06-02 02:22:49 +00001010 return __npos;
1011}
1012
1013template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1014_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001015__str_rfind(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001016 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1017{
1018 __pos = _VSTD::min(__pos, __sz);
1019 if (__n < __sz - __pos)
1020 __pos += __n;
1021 else
1022 __pos = __sz;
Marshall Clow37025e12014-06-10 18:51:55 +00001023 const _CharT* __r = _VSTD::__find_end(
1024 __p, __p + __pos, __s, __s + __n, _Traits::eq,
1025 random_access_iterator_tag(), random_access_iterator_tag());
Marshall Clow360f3192014-06-02 02:22:49 +00001026 if (__n > 0 && __r == __p + __pos)
1027 return __npos;
1028 return static_cast<_SizeT>(__r - __p);
1029}
1030
Marshall Clow37025e12014-06-10 18:51:55 +00001031// __str_find_first_of
Marshall Clow360f3192014-06-02 02:22:49 +00001032template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1033_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001034__str_find_first_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001035 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001036{
1037 if (__pos >= __sz || __n == 0)
1038 return __npos;
Marshall Clow37025e12014-06-10 18:51:55 +00001039 const _CharT* __r = _VSTD::__find_first_of_ce
Marshall Clowb671fc92013-12-09 16:00:28 +00001040 (__p + __pos, __p + __sz, __s, __s + __n, _Traits::eq );
1041 if (__r == __p + __sz)
1042 return __npos;
1043 return static_cast<_SizeT>(__r - __p);
1044}
1045
Marshall Clow360f3192014-06-02 02:22:49 +00001046
Marshall Clow37025e12014-06-10 18:51:55 +00001047// __str_find_last_of
Marshall Clowb671fc92013-12-09 16:00:28 +00001048template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001049_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001050__str_find_last_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001051 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001052 {
1053 if (__n != 0)
1054 {
1055 if (__pos < __sz)
1056 ++__pos;
1057 else
1058 __pos = __sz;
1059 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1060 {
1061 const _CharT* __r = _Traits::find(__s, __n, *--__ps);
1062 if (__r)
1063 return static_cast<_SizeT>(__ps - __p);
1064 }
1065 }
1066 return __npos;
1067}
1068
1069
Marshall Clow37025e12014-06-10 18:51:55 +00001070// __str_find_first_not_of
Marshall Clowb671fc92013-12-09 16:00:28 +00001071template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001072_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001073__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001074 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001075{
1076 if (__pos < __sz)
1077 {
1078 const _CharT* __pe = __p + __sz;
1079 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1080 if (_Traits::find(__s, __n, *__ps) == 0)
1081 return static_cast<_SizeT>(__ps - __p);
1082 }
1083 return __npos;
1084}
1085
1086
1087template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001088_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001089__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001090 _CharT __c, _SizeT __pos) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001091{
1092 if (__pos < __sz)
1093 {
1094 const _CharT* __pe = __p + __sz;
1095 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1096 if (!_Traits::eq(*__ps, __c))
1097 return static_cast<_SizeT>(__ps - __p);
1098 }
1099 return __npos;
1100}
1101
1102
Marshall Clow37025e12014-06-10 18:51:55 +00001103// __str_find_last_not_of
Marshall Clowb671fc92013-12-09 16:00:28 +00001104template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001105_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001106__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001107 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001108{
1109 if (__pos < __sz)
1110 ++__pos;
1111 else
1112 __pos = __sz;
1113 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1114 if (_Traits::find(__s, __n, *--__ps) == 0)
1115 return static_cast<_SizeT>(__ps - __p);
1116 return __npos;
1117}
1118
1119
1120template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001121_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001122__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001123 _CharT __c, _SizeT __pos) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001124{
1125 if (__pos < __sz)
1126 ++__pos;
1127 else
1128 __pos = __sz;
1129 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1130 if (!_Traits::eq(*--__ps, __c))
1131 return static_cast<_SizeT>(__ps - __p);
1132 return __npos;
1133}
1134
1135template<class _Ptr>
1136size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e)
1137{
1138 typedef typename iterator_traits<_Ptr>::value_type value_type;
1139 return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type));
1140}
1141
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001142// basic_string
1143
1144template<class _CharT, class _Traits, class _Allocator>
1145basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001146operator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
1147 const basic_string<_CharT, _Traits, _Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001148
1149template<class _CharT, class _Traits, class _Allocator>
1150basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001151operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001152
1153template<class _CharT, class _Traits, class _Allocator>
1154basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001155operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001156
1157template<class _CharT, class _Traits, class _Allocator>
1158basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001159operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001160
1161template<class _CharT, class _Traits, class _Allocator>
1162basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001163operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001164
1165template <bool>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001166class _LIBCPP_TYPE_VIS_ONLY __basic_string_common
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001167{
1168protected:
1169 void __throw_length_error() const;
1170 void __throw_out_of_range() const;
1171};
1172
1173template <bool __b>
1174void
1175__basic_string_common<__b>::__throw_length_error() const
1176{
1177#ifndef _LIBCPP_NO_EXCEPTIONS
1178 throw length_error("basic_string");
1179#else
1180 assert(!"basic_string length_error");
1181#endif
1182}
1183
1184template <bool __b>
1185void
1186__basic_string_common<__b>::__throw_out_of_range() const
1187{
1188#ifndef _LIBCPP_NO_EXCEPTIONS
1189 throw out_of_range("basic_string");
1190#else
1191 assert(!"basic_string out_of_range");
1192#endif
1193}
1194
Howard Hinnante9df0a52013-08-01 18:17:34 +00001195#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:45 +00001196#pragma warning( push )
1197#pragma warning( disable: 4231 )
Howard Hinnante9df0a52013-08-01 18:17:34 +00001198#endif // _LIBCPP_MSVC
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001199_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS __basic_string_common<true>)
Howard Hinnante9df0a52013-08-01 18:17:34 +00001200#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:45 +00001201#pragma warning( pop )
Howard Hinnante9df0a52013-08-01 18:17:34 +00001202#endif // _LIBCPP_MSVC
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001203
Evgeniy Stepanov4f01aa82015-10-13 23:48:28 +00001204#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:48 +00001205
1206template <class _CharT, size_t = sizeof(_CharT)>
1207struct __padding
1208{
1209 unsigned char __xx[sizeof(_CharT)-1];
1210};
1211
1212template <class _CharT>
1213struct __padding<_CharT, 1>
1214{
1215};
1216
Evgeniy Stepanov4f01aa82015-10-13 23:48:28 +00001217#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:48 +00001218
Howard Hinnant324bb032010-08-22 00:02:43 +00001219template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001220class _LIBCPP_TYPE_VIS_ONLY basic_string
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001221 : private __basic_string_common<true>
1222{
1223public:
1224 typedef basic_string __self;
1225 typedef _Traits traits_type;
1226 typedef typename traits_type::char_type value_type;
1227 typedef _Allocator allocator_type;
Howard Hinnante32b5e22010-11-17 17:55:08 +00001228 typedef allocator_traits<allocator_type> __alloc_traits;
1229 typedef typename __alloc_traits::size_type size_type;
1230 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001231 typedef value_type& reference;
1232 typedef const value_type& const_reference;
Howard Hinnante32b5e22010-11-17 17:55:08 +00001233 typedef typename __alloc_traits::pointer pointer;
1234 typedef typename __alloc_traits::const_pointer const_pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001235
Howard Hinnant499cea12013-08-23 17:37:05 +00001236 static_assert(is_pod<value_type>::value, "Character type of basic_string must be a POD");
1237 static_assert((is_same<_CharT, value_type>::value),
1238 "traits_type::char_type must be the same type as CharT");
1239 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1240 "Allocator::value_type must be same type as value_type");
1241#if defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001242 typedef pointer iterator;
1243 typedef const_pointer const_iterator;
Howard Hinnant324bb032010-08-22 00:02:43 +00001244#else // defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001245 typedef __wrap_iter<pointer> iterator;
1246 typedef __wrap_iter<const_pointer> const_iterator;
Howard Hinnant324bb032010-08-22 00:02:43 +00001247#endif // defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001248 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1249 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001250
1251private:
Howard Hinnant15467182013-04-30 21:44:48 +00001252
Evgeniy Stepanov4f01aa82015-10-13 23:48:28 +00001253#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:48 +00001254
1255 struct __long
1256 {
1257 pointer __data_;
1258 size_type __size_;
1259 size_type __cap_;
1260 };
1261
1262#if _LIBCPP_BIG_ENDIAN
1263 enum {__short_mask = 0x01};
1264 enum {__long_mask = 0x1ul};
1265#else // _LIBCPP_BIG_ENDIAN
1266 enum {__short_mask = 0x80};
1267 enum {__long_mask = ~(size_type(~0) >> 1)};
1268#endif // _LIBCPP_BIG_ENDIAN
1269
1270 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1271 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1272
1273 struct __short
1274 {
1275 value_type __data_[__min_cap];
1276 struct
1277 : __padding<value_type>
1278 {
1279 unsigned char __size_;
1280 };
1281 };
1282
1283#else
1284
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001285 struct __long
1286 {
1287 size_type __cap_;
1288 size_type __size_;
1289 pointer __data_;
1290 };
1291
1292#if _LIBCPP_BIG_ENDIAN
1293 enum {__short_mask = 0x80};
1294 enum {__long_mask = ~(size_type(~0) >> 1)};
Howard Hinnant324bb032010-08-22 00:02:43 +00001295#else // _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001296 enum {__short_mask = 0x01};
Howard Hinnantec3773c2011-12-01 20:21:04 +00001297 enum {__long_mask = 0x1ul};
Howard Hinnant324bb032010-08-22 00:02:43 +00001298#endif // _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001299
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001300 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1301 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1302
1303 struct __short
1304 {
1305 union
1306 {
1307 unsigned char __size_;
Howard Hinnant9c0df142012-10-30 19:06:59 +00001308 value_type __lx;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001309 };
1310 value_type __data_[__min_cap];
1311 };
1312
Evgeniy Stepanov4f01aa82015-10-13 23:48:28 +00001313#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:48 +00001314
Howard Hinnant499cea12013-08-23 17:37:05 +00001315 union __ulx{__long __lx; __short __lxx;};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001316
Howard Hinnant499cea12013-08-23 17:37:05 +00001317 enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001318
1319 struct __raw
1320 {
1321 size_type __words[__n_words];
1322 };
1323
1324 struct __rep
1325 {
1326 union
1327 {
1328 __long __l;
1329 __short __s;
1330 __raw __r;
1331 };
1332 };
1333
1334 __compressed_pair<__rep, allocator_type> __r_;
1335
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001336public:
1337 static const size_type npos = -1;
1338
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001339 _LIBCPP_INLINE_VISIBILITY basic_string()
1340 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Marshall Clow7b193f72015-06-03 19:56:43 +00001341
1342 _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a)
1343#if _LIBCPP_STD_VER <= 14
1344 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
1345#else
1346 _NOEXCEPT;
1347#endif
1348
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001349 basic_string(const basic_string& __str);
1350 basic_string(const basic_string& __str, const allocator_type& __a);
Marshall Clow7b193f72015-06-03 19:56:43 +00001351
Howard Hinnant73d21a42010-09-04 23:28:19 +00001352#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant9f193f22011-01-26 00:06:59 +00001353 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001354 basic_string(basic_string&& __str)
Marshall Clow7b193f72015-06-03 19:56:43 +00001355#if _LIBCPP_STD_VER <= 14
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001356 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clow7b193f72015-06-03 19:56:43 +00001357#else
1358 _NOEXCEPT;
1359#endif
1360
Howard Hinnant9f193f22011-01-26 00:06:59 +00001361 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001362 basic_string(basic_string&& __str, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19 +00001363#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001364 _LIBCPP_INLINE_VISIBILITY basic_string(const value_type* __s);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001365 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001366 basic_string(const value_type* __s, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001367 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001368 basic_string(const value_type* __s, size_type __n);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001369 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001370 basic_string(const value_type* __s, size_type __n, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001371 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001372 basic_string(size_type __n, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001373 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001374 basic_string(size_type __n, value_type __c, const allocator_type& __a);
1375 basic_string(const basic_string& __str, size_type __pos, size_type __n = npos,
1376 const allocator_type& __a = allocator_type());
1377 template<class _InputIterator>
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001378 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001379 basic_string(_InputIterator __first, _InputIterator __last);
1380 template<class _InputIterator>
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001381 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001382 basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +00001383#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001384 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001385 basic_string(initializer_list<value_type> __il);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001386 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001387 basic_string(initializer_list<value_type> __il, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +00001388#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001389
1390 ~basic_string();
1391
Howard Hinnante32b5e22010-11-17 17:55:08 +00001392 basic_string& operator=(const basic_string& __str);
Howard Hinnant73d21a42010-09-04 23:28:19 +00001393#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001394 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001395 basic_string& operator=(basic_string&& __str)
Marshall Clowaf961ed2015-08-18 18:57:00 +00001396 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001397#endif
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001398 _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001399 basic_string& operator=(value_type __c);
Howard Hinnante3e32912011-08-12 21:56:02 +00001400#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001401 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001402 basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001403#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001404
Howard Hinnant499cea12013-08-23 17:37:05 +00001405#if _LIBCPP_DEBUG_LEVEL >= 2
1406 _LIBCPP_INLINE_VISIBILITY
1407 iterator begin() _NOEXCEPT
1408 {return iterator(this, __get_pointer());}
1409 _LIBCPP_INLINE_VISIBILITY
1410 const_iterator begin() const _NOEXCEPT
1411 {return const_iterator(this, __get_pointer());}
1412 _LIBCPP_INLINE_VISIBILITY
1413 iterator end() _NOEXCEPT
1414 {return iterator(this, __get_pointer() + size());}
1415 _LIBCPP_INLINE_VISIBILITY
1416 const_iterator end() const _NOEXCEPT
1417 {return const_iterator(this, __get_pointer() + size());}
1418#else
Howard Hinnanta6119a82011-05-29 19:57:12 +00001419 _LIBCPP_INLINE_VISIBILITY
1420 iterator begin() _NOEXCEPT
1421 {return iterator(__get_pointer());}
1422 _LIBCPP_INLINE_VISIBILITY
1423 const_iterator begin() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001424 {return const_iterator(__get_pointer());}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001425 _LIBCPP_INLINE_VISIBILITY
1426 iterator end() _NOEXCEPT
1427 {return iterator(__get_pointer() + size());}
1428 _LIBCPP_INLINE_VISIBILITY
1429 const_iterator end() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001430 {return const_iterator(__get_pointer() + size());}
Howard Hinnant499cea12013-08-23 17:37:05 +00001431#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnanta6119a82011-05-29 19:57:12 +00001432 _LIBCPP_INLINE_VISIBILITY
1433 reverse_iterator rbegin() _NOEXCEPT
1434 {return reverse_iterator(end());}
1435 _LIBCPP_INLINE_VISIBILITY
1436 const_reverse_iterator rbegin() const _NOEXCEPT
1437 {return const_reverse_iterator(end());}
1438 _LIBCPP_INLINE_VISIBILITY
1439 reverse_iterator rend() _NOEXCEPT
1440 {return reverse_iterator(begin());}
1441 _LIBCPP_INLINE_VISIBILITY
1442 const_reverse_iterator rend() const _NOEXCEPT
1443 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001444
Howard Hinnanta6119a82011-05-29 19:57:12 +00001445 _LIBCPP_INLINE_VISIBILITY
1446 const_iterator cbegin() const _NOEXCEPT
1447 {return begin();}
1448 _LIBCPP_INLINE_VISIBILITY
1449 const_iterator cend() const _NOEXCEPT
1450 {return end();}
1451 _LIBCPP_INLINE_VISIBILITY
1452 const_reverse_iterator crbegin() const _NOEXCEPT
1453 {return rbegin();}
1454 _LIBCPP_INLINE_VISIBILITY
1455 const_reverse_iterator crend() const _NOEXCEPT
1456 {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001457
Howard Hinnanta6119a82011-05-29 19:57:12 +00001458 _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001459 {return __is_long() ? __get_long_size() : __get_short_size();}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001460 _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
1461 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
1462 _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
Eric Fiseliere2d48922015-08-28 07:02:42 +00001463 {return (__is_long() ? __get_long_cap()
1464 : static_cast<size_type>(__min_cap)) - 1;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001465
1466 void resize(size_type __n, value_type __c);
1467 _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
1468
1469 void reserve(size_type res_arg = 0);
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001470 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001471 void shrink_to_fit() _NOEXCEPT {reserve();}
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001472 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001473 void clear() _NOEXCEPT;
1474 _LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001475
1476 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const;
1477 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos);
1478
1479 const_reference at(size_type __n) const;
1480 reference at(size_type __n);
1481
1482 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001483 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s) {return append(__s);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001484 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;}
Howard Hinnante3e32912011-08-12 21:56:02 +00001485#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001486 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
Howard Hinnante3e32912011-08-12 21:56:02 +00001487#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001488
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001489 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001490 basic_string& append(const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:19 +00001491 basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001492 basic_string& append(const value_type* __s, size_type __n);
1493 basic_string& append(const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001494 basic_string& append(size_type __n, value_type __c);
1495 template<class _InputIterator>
1496 typename enable_if
1497 <
1498 __is_input_iterator <_InputIterator>::value &&
1499 !__is_forward_iterator<_InputIterator>::value,
1500 basic_string&
1501 >::type
1502 append(_InputIterator __first, _InputIterator __last);
1503 template<class _ForwardIterator>
1504 typename enable_if
1505 <
1506 __is_forward_iterator<_ForwardIterator>::value,
1507 basic_string&
1508 >::type
1509 append(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001510#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001511 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001512 basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001513#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001514
1515 void push_back(value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001516 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001517 void pop_back();
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001518 _LIBCPP_INLINE_VISIBILITY reference front();
1519 _LIBCPP_INLINE_VISIBILITY const_reference front() const;
1520 _LIBCPP_INLINE_VISIBILITY reference back();
1521 _LIBCPP_INLINE_VISIBILITY const_reference back() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001522
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001523 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001524 basic_string& assign(const basic_string& __str);
Howard Hinnanta6119a82011-05-29 19:57:12 +00001525#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1526 _LIBCPP_INLINE_VISIBILITY
1527 basic_string& assign(basic_string&& str)
Marshall Clow7ed093b2015-10-05 16:17:34 +00001528 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnant0949eed2011-06-30 21:18:19 +00001529 {*this = _VSTD::move(str); return *this;}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001530#endif
Marshall Clowa93b5e22014-03-04 19:17:19 +00001531 basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001532 basic_string& assign(const value_type* __s, size_type __n);
1533 basic_string& assign(const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001534 basic_string& assign(size_type __n, value_type __c);
1535 template<class _InputIterator>
1536 typename enable_if
1537 <
1538 __is_input_iterator <_InputIterator>::value &&
1539 !__is_forward_iterator<_InputIterator>::value,
1540 basic_string&
1541 >::type
1542 assign(_InputIterator __first, _InputIterator __last);
1543 template<class _ForwardIterator>
1544 typename enable_if
1545 <
1546 __is_forward_iterator<_ForwardIterator>::value,
1547 basic_string&
1548 >::type
1549 assign(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001550#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001551 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001552 basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001553#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001554
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001556 basic_string& insert(size_type __pos1, const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:19 +00001557 basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001558 basic_string& insert(size_type __pos, const value_type* __s, size_type __n);
1559 basic_string& insert(size_type __pos, const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001560 basic_string& insert(size_type __pos, size_type __n, value_type __c);
1561 iterator insert(const_iterator __pos, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001563 iterator insert(const_iterator __pos, size_type __n, value_type __c);
1564 template<class _InputIterator>
1565 typename enable_if
1566 <
1567 __is_input_iterator <_InputIterator>::value &&
1568 !__is_forward_iterator<_InputIterator>::value,
1569 iterator
1570 >::type
1571 insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
1572 template<class _ForwardIterator>
1573 typename enable_if
1574 <
1575 __is_forward_iterator<_ForwardIterator>::value,
1576 iterator
1577 >::type
1578 insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001579#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001580 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001581 iterator insert(const_iterator __pos, initializer_list<value_type> __il)
1582 {return insert(__pos, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001583#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001584
1585 basic_string& erase(size_type __pos = 0, size_type __n = npos);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001586 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001587 iterator erase(const_iterator __pos);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001588 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001589 iterator erase(const_iterator __first, const_iterator __last);
1590
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001592 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:19 +00001593 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:19 +00001594 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
1595 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001596 basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001597 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001598 basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001599 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001600 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001601 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001602 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001603 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001604 basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001605 template<class _InputIterator>
1606 typename enable_if
1607 <
1608 __is_input_iterator<_InputIterator>::value,
1609 basic_string&
1610 >::type
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001611 replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
Howard Hinnante3e32912011-08-12 21:56:02 +00001612#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001613 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001614 basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001615 {return replace(__i1, __i2, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001616#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001617
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001618 size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001619 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001620 basic_string substr(size_type __pos = 0, size_type __n = npos) const;
1621
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001622 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001623 void swap(basic_string& __str)
Marshall Clow7d914d12015-07-13 20:04:56 +00001624#if _LIBCPP_STD_VER >= 14
1625 _NOEXCEPT;
1626#else
1627 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1628 __is_nothrow_swappable<allocator_type>::value);
1629#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001630
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001631 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001632 const value_type* c_str() const _NOEXCEPT {return data();}
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001634 const value_type* data() const _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001635
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001636 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001637 allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001638
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001639 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001640 size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001641 size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001642 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001643 size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001644 size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001645
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001646 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001647 size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001648 size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001649 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001650 size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001651 size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001652
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001653 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001654 size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001655 size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001656 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001657 size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001658 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001659 size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001660
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001661 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001662 size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001663 size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001664 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001665 size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001666 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001667 size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001668
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001669 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001670 size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001671 size_type find_first_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001672 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001673 size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001674 _LIBCPP_INLINE_VISIBILITY
1675 size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1676
1677 _LIBCPP_INLINE_VISIBILITY
1678 size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001679 size_type find_last_not_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001680 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001681 size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001682 _LIBCPP_INLINE_VISIBILITY
1683 size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1684
1685 _LIBCPP_INLINE_VISIBILITY
1686 int compare(const basic_string& __str) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001687 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001688 int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
Marshall Clowa93b5e22014-03-04 19:17:19 +00001689 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:19 +00001690 int compare(const value_type* __s) const _NOEXCEPT;
1691 int compare(size_type __pos1, size_type __n1, const value_type* __s) const;
1692 int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001693
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001694 _LIBCPP_INLINE_VISIBILITY bool __invariants() const;
Howard Hinnant08dd2532013-04-22 23:55:13 +00001695
1696 _LIBCPP_INLINE_VISIBILITY
1697 bool __is_long() const _NOEXCEPT
1698 {return bool(__r_.first().__s.__size_ & __short_mask);}
1699
Howard Hinnant499cea12013-08-23 17:37:05 +00001700#if _LIBCPP_DEBUG_LEVEL >= 2
1701
1702 bool __dereferenceable(const const_iterator* __i) const;
1703 bool __decrementable(const const_iterator* __i) const;
1704 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
1705 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
1706
1707#endif // _LIBCPP_DEBUG_LEVEL >= 2
1708
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001709private:
Howard Hinnanta6119a82011-05-29 19:57:12 +00001710 _LIBCPP_INLINE_VISIBILITY
1711 allocator_type& __alloc() _NOEXCEPT
1712 {return __r_.second();}
1713 _LIBCPP_INLINE_VISIBILITY
1714 const allocator_type& __alloc() const _NOEXCEPT
1715 {return __r_.second();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001716
Evgeniy Stepanov4f01aa82015-10-13 23:48:28 +00001717#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:48 +00001718
Howard Hinnanta6119a82011-05-29 19:57:12 +00001719 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001720 void __set_short_size(size_type __s) _NOEXCEPT
Howard Hinnant15467182013-04-30 21:44:48 +00001721# if _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001722 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
Howard Hinnant15467182013-04-30 21:44:48 +00001723# else
1724 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1725# endif
1726
Howard Hinnanta6119a82011-05-29 19:57:12 +00001727 _LIBCPP_INLINE_VISIBILITY
1728 size_type __get_short_size() const _NOEXCEPT
Howard Hinnant15467182013-04-30 21:44:48 +00001729# if _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001730 {return __r_.first().__s.__size_ >> 1;}
Howard Hinnant15467182013-04-30 21:44:48 +00001731# else
1732 {return __r_.first().__s.__size_;}
1733# endif
1734
Evgeniy Stepanov4f01aa82015-10-13 23:48:28 +00001735#else // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:48 +00001736
1737 _LIBCPP_INLINE_VISIBILITY
1738 void __set_short_size(size_type __s) _NOEXCEPT
1739# if _LIBCPP_BIG_ENDIAN
1740 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1741# else
1742 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
1743# endif
1744
1745 _LIBCPP_INLINE_VISIBILITY
1746 size_type __get_short_size() const _NOEXCEPT
1747# if _LIBCPP_BIG_ENDIAN
1748 {return __r_.first().__s.__size_;}
1749# else
1750 {return __r_.first().__s.__size_ >> 1;}
1751# endif
1752
Evgeniy Stepanov4f01aa82015-10-13 23:48:28 +00001753#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
Howard Hinnant15467182013-04-30 21:44:48 +00001754
Howard Hinnanta6119a82011-05-29 19:57:12 +00001755 _LIBCPP_INLINE_VISIBILITY
1756 void __set_long_size(size_type __s) _NOEXCEPT
1757 {__r_.first().__l.__size_ = __s;}
1758 _LIBCPP_INLINE_VISIBILITY
1759 size_type __get_long_size() const _NOEXCEPT
1760 {return __r_.first().__l.__size_;}
1761 _LIBCPP_INLINE_VISIBILITY
1762 void __set_size(size_type __s) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001763 {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
1764
Howard Hinnanta6119a82011-05-29 19:57:12 +00001765 _LIBCPP_INLINE_VISIBILITY
1766 void __set_long_cap(size_type __s) _NOEXCEPT
1767 {__r_.first().__l.__cap_ = __long_mask | __s;}
1768 _LIBCPP_INLINE_VISIBILITY
1769 size_type __get_long_cap() const _NOEXCEPT
Howard Hinnantec3773c2011-12-01 20:21:04 +00001770 {return __r_.first().__l.__cap_ & size_type(~__long_mask);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001771
Howard Hinnanta6119a82011-05-29 19:57:12 +00001772 _LIBCPP_INLINE_VISIBILITY
1773 void __set_long_pointer(pointer __p) _NOEXCEPT
1774 {__r_.first().__l.__data_ = __p;}
1775 _LIBCPP_INLINE_VISIBILITY
1776 pointer __get_long_pointer() _NOEXCEPT
1777 {return __r_.first().__l.__data_;}
1778 _LIBCPP_INLINE_VISIBILITY
1779 const_pointer __get_long_pointer() const _NOEXCEPT
1780 {return __r_.first().__l.__data_;}
1781 _LIBCPP_INLINE_VISIBILITY
1782 pointer __get_short_pointer() _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001783 {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001784 _LIBCPP_INLINE_VISIBILITY
1785 const_pointer __get_short_pointer() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001786 {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001787 _LIBCPP_INLINE_VISIBILITY
1788 pointer __get_pointer() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001789 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001790 _LIBCPP_INLINE_VISIBILITY
1791 const_pointer __get_pointer() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001792 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
1793
Howard Hinnanta6119a82011-05-29 19:57:12 +00001794 _LIBCPP_INLINE_VISIBILITY
1795 void __zero() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001796 {
1797 size_type (&__a)[__n_words] = __r_.first().__r.__words;
1798 for (unsigned __i = 0; __i < __n_words; ++__i)
1799 __a[__i] = 0;
1800 }
1801
1802 template <size_type __a> static
Howard Hinnanta6119a82011-05-29 19:57:12 +00001803 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7f764502013-08-14 18:00:20 +00001804 size_type __align_it(size_type __s) _NOEXCEPT
Eric Fiseliere2d48922015-08-28 07:02:42 +00001805 {return (__s + (__a-1)) & ~(__a-1);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001806 enum {__alignment = 16};
Howard Hinnanta6119a82011-05-29 19:57:12 +00001807 static _LIBCPP_INLINE_VISIBILITY
1808 size_type __recommend(size_type __s) _NOEXCEPT
Eric Fiseliere2d48922015-08-28 07:02:42 +00001809 {return (__s < __min_cap ? static_cast<size_type>(__min_cap) :
Howard Hinnant7f764502013-08-14 18:00:20 +00001810 __align_it<sizeof(value_type) < __alignment ?
Howard Hinnanta6119a82011-05-29 19:57:12 +00001811 __alignment/sizeof(value_type) : 1 > (__s+1)) - 1;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001812
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001813 void __init(const value_type* __s, size_type __sz, size_type __reserve);
1814 void __init(const value_type* __s, size_type __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001815 void __init(size_type __n, value_type __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00001816
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001817 template <class _InputIterator>
1818 typename enable_if
1819 <
1820 __is_input_iterator <_InputIterator>::value &&
1821 !__is_forward_iterator<_InputIterator>::value,
1822 void
1823 >::type
1824 __init(_InputIterator __first, _InputIterator __last);
1825
1826 template <class _ForwardIterator>
1827 typename enable_if
1828 <
1829 __is_forward_iterator<_ForwardIterator>::value,
1830 void
1831 >::type
1832 __init(_ForwardIterator __first, _ForwardIterator __last);
1833
1834 void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnant324bb032010-08-22 00:02:43 +00001835 size_type __n_copy, size_type __n_del, size_type __n_add = 0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001836 void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1837 size_type __n_copy, size_type __n_del,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001838 size_type __n_add, const value_type* __p_new_stuff);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001839
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001840 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001841 void __erase_to_end(size_type __pos);
1842
Howard Hinnante32b5e22010-11-17 17:55:08 +00001843 _LIBCPP_INLINE_VISIBILITY
1844 void __copy_assign_alloc(const basic_string& __str)
1845 {__copy_assign_alloc(__str, integral_constant<bool,
1846 __alloc_traits::propagate_on_container_copy_assignment::value>());}
1847
1848 _LIBCPP_INLINE_VISIBILITY
1849 void __copy_assign_alloc(const basic_string& __str, true_type)
1850 {
1851 if (__alloc() != __str.__alloc())
1852 {
1853 clear();
1854 shrink_to_fit();
1855 }
1856 __alloc() = __str.__alloc();
1857 }
1858
1859 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00001860 void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
Howard Hinnante32b5e22010-11-17 17:55:08 +00001861 {}
1862
1863#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001864 _LIBCPP_INLINE_VISIBILITY
Marshall Clowaf961ed2015-08-18 18:57:00 +00001865 void __move_assign(basic_string& __str, false_type)
1866 _NOEXCEPT_(__alloc_traits::is_always_equal::value);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001867 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001868 void __move_assign(basic_string& __str, true_type)
Marshall Clowaf961ed2015-08-18 18:57:00 +00001869#if _LIBCPP_STD_VER > 14
1870 _NOEXCEPT;
1871#else
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001872 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnante32b5e22010-11-17 17:55:08 +00001873#endif
Marshall Clowaf961ed2015-08-18 18:57:00 +00001874#endif
Howard Hinnante32b5e22010-11-17 17:55:08 +00001875
1876 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001877 void
Howard Hinnant9cbee432011-09-02 20:42:31 +00001878 __move_assign_alloc(basic_string& __str)
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001879 _NOEXCEPT_(
1880 !__alloc_traits::propagate_on_container_move_assignment::value ||
1881 is_nothrow_move_assignable<allocator_type>::value)
1882 {__move_assign_alloc(__str, integral_constant<bool,
1883 __alloc_traits::propagate_on_container_move_assignment::value>());}
1884
1885 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9cbee432011-09-02 20:42:31 +00001886 void __move_assign_alloc(basic_string& __c, true_type)
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001887 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1888 {
1889 __alloc() = _VSTD::move(__c.__alloc());
1890 }
1891
1892 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00001893 void __move_assign_alloc(basic_string&, false_type)
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001894 _NOEXCEPT
1895 {}
1896
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001897 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
1898 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001899
1900 friend basic_string operator+<>(const basic_string&, const basic_string&);
1901 friend basic_string operator+<>(const value_type*, const basic_string&);
1902 friend basic_string operator+<>(value_type, const basic_string&);
1903 friend basic_string operator+<>(const basic_string&, const value_type*);
1904 friend basic_string operator+<>(const basic_string&, value_type);
1905};
1906
1907template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001908inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001909void
1910basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators()
1911{
Howard Hinnant499cea12013-08-23 17:37:05 +00001912#if _LIBCPP_DEBUG_LEVEL >= 2
1913 __get_db()->__invalidate_all(this);
1914#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001915}
1916
1917template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001918inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001919void
Howard Hinnantec3773c2011-12-01 20:21:04 +00001920basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type
Howard Hinnant499cea12013-08-23 17:37:05 +00001921#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantec3773c2011-12-01 20:21:04 +00001922 __pos
1923#endif
1924 )
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001925{
Howard Hinnant499cea12013-08-23 17:37:05 +00001926#if _LIBCPP_DEBUG_LEVEL >= 2
1927 __c_node* __c = __get_db()->__find_c_and_lock(this);
1928 if (__c)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001929 {
Howard Hinnant499cea12013-08-23 17:37:05 +00001930 const_pointer __new_last = __get_pointer() + __pos;
1931 for (__i_node** __p = __c->end_; __p != __c->beg_; )
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001932 {
Howard Hinnant499cea12013-08-23 17:37:05 +00001933 --__p;
1934 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
1935 if (__i->base() > __new_last)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001936 {
Howard Hinnant499cea12013-08-23 17:37:05 +00001937 (*__p)->__c_ = nullptr;
1938 if (--__c->end_ != __p)
1939 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001940 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001941 }
Howard Hinnant499cea12013-08-23 17:37:05 +00001942 __get_db()->unlock();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001943 }
Howard Hinnant499cea12013-08-23 17:37:05 +00001944#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001945}
1946
1947template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001948inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001949basic_string<_CharT, _Traits, _Allocator>::basic_string()
Marshall Clowc912c0c2015-06-04 02:05:41 +00001950 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001951{
Howard Hinnant499cea12013-08-23 17:37:05 +00001952#if _LIBCPP_DEBUG_LEVEL >= 2
1953 __get_db()->__insert_c(this);
1954#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001955 __zero();
1956}
1957
1958template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001959inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001960basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
Eric Fiselier692177d2015-07-18 20:40:46 +00001961#if _LIBCPP_STD_VER <= 14
1962 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
1963#else
1964 _NOEXCEPT
1965#endif
1966: __r_(__a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001967{
Howard Hinnant499cea12013-08-23 17:37:05 +00001968#if _LIBCPP_DEBUG_LEVEL >= 2
1969 __get_db()->__insert_c(this);
1970#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001971 __zero();
1972}
1973
1974template <class _CharT, class _Traits, class _Allocator>
1975void
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001976basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz, size_type __reserve)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001977{
1978 if (__reserve > max_size())
1979 this->__throw_length_error();
1980 pointer __p;
1981 if (__reserve < __min_cap)
1982 {
1983 __set_short_size(__sz);
1984 __p = __get_short_pointer();
1985 }
1986 else
1987 {
1988 size_type __cap = __recommend(__reserve);
Howard Hinnante32b5e22010-11-17 17:55:08 +00001989 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001990 __set_long_pointer(__p);
1991 __set_long_cap(__cap+1);
1992 __set_long_size(__sz);
1993 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001994 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001995 traits_type::assign(__p[__sz], value_type());
1996}
1997
1998template <class _CharT, class _Traits, class _Allocator>
1999void
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002000basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002001{
2002 if (__sz > max_size())
2003 this->__throw_length_error();
2004 pointer __p;
2005 if (__sz < __min_cap)
2006 {
2007 __set_short_size(__sz);
2008 __p = __get_short_pointer();
2009 }
2010 else
2011 {
2012 size_type __cap = __recommend(__sz);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002013 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002014 __set_long_pointer(__p);
2015 __set_long_cap(__cap+1);
2016 __set_long_size(__sz);
2017 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002018 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002019 traits_type::assign(__p[__sz], value_type());
2020}
2021
2022template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002023inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002024basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002025{
Howard Hinnant499cea12013-08-23 17:37:05 +00002026 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002027 __init(__s, traits_type::length(__s));
Howard Hinnant499cea12013-08-23 17:37:05 +00002028#if _LIBCPP_DEBUG_LEVEL >= 2
2029 __get_db()->__insert_c(this);
2030#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002031}
2032
2033template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002034inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002035basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002036 : __r_(__a)
2037{
Howard Hinnant499cea12013-08-23 17:37:05 +00002038 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002039 __init(__s, traits_type::length(__s));
Howard Hinnant499cea12013-08-23 17:37:05 +00002040#if _LIBCPP_DEBUG_LEVEL >= 2
2041 __get_db()->__insert_c(this);
2042#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002043}
2044
2045template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002046inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002047basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002048{
Howard Hinnant499cea12013-08-23 17:37:05 +00002049 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002050 __init(__s, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +00002051#if _LIBCPP_DEBUG_LEVEL >= 2
2052 __get_db()->__insert_c(this);
2053#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002054}
2055
2056template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002057inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002058basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002059 : __r_(__a)
2060{
Howard Hinnant499cea12013-08-23 17:37:05 +00002061 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002062 __init(__s, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +00002063#if _LIBCPP_DEBUG_LEVEL >= 2
2064 __get_db()->__insert_c(this);
2065#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002066}
2067
2068template <class _CharT, class _Traits, class _Allocator>
2069basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002070 : __r_(__alloc_traits::select_on_container_copy_construction(__str.__alloc()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002071{
2072 if (!__str.__is_long())
2073 __r_.first().__r = __str.__r_.first().__r;
2074 else
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002075 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Howard Hinnant499cea12013-08-23 17:37:05 +00002076#if _LIBCPP_DEBUG_LEVEL >= 2
2077 __get_db()->__insert_c(this);
2078#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002079}
2080
2081template <class _CharT, class _Traits, class _Allocator>
2082basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, const allocator_type& __a)
2083 : __r_(__a)
2084{
2085 if (!__str.__is_long())
2086 __r_.first().__r = __str.__r_.first().__r;
2087 else
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002088 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Howard Hinnant499cea12013-08-23 17:37:05 +00002089#if _LIBCPP_DEBUG_LEVEL >= 2
2090 __get_db()->__insert_c(this);
2091#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002092}
2093
Howard Hinnant73d21a42010-09-04 23:28:19 +00002094#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002095
2096template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002097inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00002098basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str)
Marshall Clow7b193f72015-06-03 19:56:43 +00002099#if _LIBCPP_STD_VER <= 14
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00002100 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clow7b193f72015-06-03 19:56:43 +00002101#else
2102 _NOEXCEPT
2103#endif
Howard Hinnant0949eed2011-06-30 21:18:19 +00002104 : __r_(_VSTD::move(__str.__r_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002105{
2106 __str.__zero();
Howard Hinnant499cea12013-08-23 17:37:05 +00002107#if _LIBCPP_DEBUG_LEVEL >= 2
2108 __get_db()->__insert_c(this);
2109 if (__is_long())
2110 __get_db()->swap(this, &__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002111#endif
2112}
2113
2114template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002115inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002116basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002117 : __r_(__a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002118{
Marshall Clowd5549cc2014-07-17 15:32:20 +00002119 if (__str.__is_long() && __a != __str.__alloc()) // copy, not move
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002120 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Marshall Clowd5549cc2014-07-17 15:32:20 +00002121 else
2122 {
2123 __r_.first().__r = __str.__r_.first().__r;
2124 __str.__zero();
2125 }
Howard Hinnant499cea12013-08-23 17:37:05 +00002126#if _LIBCPP_DEBUG_LEVEL >= 2
2127 __get_db()->__insert_c(this);
2128 if (__is_long())
2129 __get_db()->swap(this, &__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002130#endif
2131}
2132
Howard Hinnant73d21a42010-09-04 23:28:19 +00002133#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002134
2135template <class _CharT, class _Traits, class _Allocator>
2136void
2137basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
2138{
2139 if (__n > max_size())
2140 this->__throw_length_error();
2141 pointer __p;
2142 if (__n < __min_cap)
2143 {
2144 __set_short_size(__n);
2145 __p = __get_short_pointer();
2146 }
2147 else
2148 {
2149 size_type __cap = __recommend(__n);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002150 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002151 __set_long_pointer(__p);
2152 __set_long_cap(__cap+1);
2153 __set_long_size(__n);
2154 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002155 traits_type::assign(_VSTD::__to_raw_pointer(__p), __n, __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002156 traits_type::assign(__p[__n], value_type());
2157}
2158
2159template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002160inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002161basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c)
2162{
2163 __init(__n, __c);
Howard Hinnant499cea12013-08-23 17:37:05 +00002164#if _LIBCPP_DEBUG_LEVEL >= 2
2165 __get_db()->__insert_c(this);
2166#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002167}
2168
2169template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002170inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002171basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c, const allocator_type& __a)
2172 : __r_(__a)
2173{
2174 __init(__n, __c);
Howard Hinnant499cea12013-08-23 17:37:05 +00002175#if _LIBCPP_DEBUG_LEVEL >= 2
2176 __get_db()->__insert_c(this);
2177#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002178}
2179
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002180template <class _CharT, class _Traits, class _Allocator>
2181basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, size_type __n,
2182 const allocator_type& __a)
2183 : __r_(__a)
2184{
2185 size_type __str_sz = __str.size();
2186 if (__pos > __str_sz)
2187 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002188 __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos));
Howard Hinnant499cea12013-08-23 17:37:05 +00002189#if _LIBCPP_DEBUG_LEVEL >= 2
2190 __get_db()->__insert_c(this);
2191#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002192}
2193
2194template <class _CharT, class _Traits, class _Allocator>
2195template <class _InputIterator>
2196typename enable_if
2197<
2198 __is_input_iterator <_InputIterator>::value &&
2199 !__is_forward_iterator<_InputIterator>::value,
2200 void
2201>::type
2202basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
2203{
2204 __zero();
2205#ifndef _LIBCPP_NO_EXCEPTIONS
2206 try
2207 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002208#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002209 for (; __first != __last; ++__first)
2210 push_back(*__first);
2211#ifndef _LIBCPP_NO_EXCEPTIONS
2212 }
2213 catch (...)
2214 {
2215 if (__is_long())
Howard Hinnante32b5e22010-11-17 17:55:08 +00002216 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002217 throw;
2218 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002219#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002220}
2221
2222template <class _CharT, class _Traits, class _Allocator>
2223template <class _ForwardIterator>
2224typename enable_if
2225<
2226 __is_forward_iterator<_ForwardIterator>::value,
2227 void
2228>::type
2229basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
2230{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002231 size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002232 if (__sz > max_size())
2233 this->__throw_length_error();
2234 pointer __p;
2235 if (__sz < __min_cap)
2236 {
2237 __set_short_size(__sz);
2238 __p = __get_short_pointer();
2239 }
2240 else
2241 {
2242 size_type __cap = __recommend(__sz);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002243 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002244 __set_long_pointer(__p);
2245 __set_long_cap(__cap+1);
2246 __set_long_size(__sz);
2247 }
Eric Fiselierb9919752014-10-27 19:28:20 +00002248 for (; __first != __last; ++__first, (void) ++__p)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002249 traits_type::assign(*__p, *__first);
2250 traits_type::assign(*__p, value_type());
2251}
2252
2253template <class _CharT, class _Traits, class _Allocator>
2254template<class _InputIterator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002255inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002256basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last)
2257{
2258 __init(__first, __last);
Howard Hinnant499cea12013-08-23 17:37:05 +00002259#if _LIBCPP_DEBUG_LEVEL >= 2
2260 __get_db()->__insert_c(this);
2261#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002262}
2263
2264template <class _CharT, class _Traits, class _Allocator>
2265template<class _InputIterator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002266inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002267basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last,
2268 const allocator_type& __a)
2269 : __r_(__a)
2270{
2271 __init(__first, __last);
Howard Hinnant499cea12013-08-23 17:37:05 +00002272#if _LIBCPP_DEBUG_LEVEL >= 2
2273 __get_db()->__insert_c(this);
2274#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002275}
2276
Howard Hinnante3e32912011-08-12 21:56:02 +00002277#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2278
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002279template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002280inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002281basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il)
2282{
2283 __init(__il.begin(), __il.end());
Howard Hinnant499cea12013-08-23 17:37:05 +00002284#if _LIBCPP_DEBUG_LEVEL >= 2
2285 __get_db()->__insert_c(this);
2286#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002287}
2288
2289template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002290inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002291basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il, const allocator_type& __a)
2292 : __r_(__a)
2293{
2294 __init(__il.begin(), __il.end());
Howard Hinnant499cea12013-08-23 17:37:05 +00002295#if _LIBCPP_DEBUG_LEVEL >= 2
2296 __get_db()->__insert_c(this);
2297#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002298}
2299
Howard Hinnante3e32912011-08-12 21:56:02 +00002300#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2301
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002302template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002303basic_string<_CharT, _Traits, _Allocator>::~basic_string()
2304{
Howard Hinnant499cea12013-08-23 17:37:05 +00002305#if _LIBCPP_DEBUG_LEVEL >= 2
2306 __get_db()->__erase_c(this);
2307#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002308 if (__is_long())
Howard Hinnante32b5e22010-11-17 17:55:08 +00002309 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002310}
2311
2312template <class _CharT, class _Traits, class _Allocator>
2313void
2314basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
2315 (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002316 size_type __n_copy, size_type __n_del, size_type __n_add, const value_type* __p_new_stuff)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002317{
2318 size_type __ms = max_size();
2319 if (__delta_cap > __ms - __old_cap - 1)
2320 this->__throw_length_error();
2321 pointer __old_p = __get_pointer();
2322 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Howard Hinnant0949eed2011-06-30 21:18:19 +00002323 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002324 __ms - 1;
Howard Hinnante32b5e22010-11-17 17:55:08 +00002325 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002326 __invalidate_all_iterators();
2327 if (__n_copy != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002328 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2329 _VSTD::__to_raw_pointer(__old_p), __n_copy);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002330 if (__n_add != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002331 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy, __p_new_stuff, __n_add);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002332 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2333 if (__sec_cp_sz != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002334 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2335 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del, __sec_cp_sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002336 if (__old_cap+1 != __min_cap)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002337 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002338 __set_long_pointer(__p);
2339 __set_long_cap(__cap+1);
2340 __old_sz = __n_copy + __n_add + __sec_cp_sz;
2341 __set_long_size(__old_sz);
2342 traits_type::assign(__p[__old_sz], value_type());
2343}
2344
2345template <class _CharT, class _Traits, class _Allocator>
2346void
2347basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2348 size_type __n_copy, size_type __n_del, size_type __n_add)
2349{
2350 size_type __ms = max_size();
Marshall Clowecc8d7b2013-11-06 14:24:38 +00002351 if (__delta_cap > __ms - __old_cap)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002352 this->__throw_length_error();
2353 pointer __old_p = __get_pointer();
2354 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Howard Hinnant0949eed2011-06-30 21:18:19 +00002355 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002356 __ms - 1;
Howard Hinnante32b5e22010-11-17 17:55:08 +00002357 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002358 __invalidate_all_iterators();
2359 if (__n_copy != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002360 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2361 _VSTD::__to_raw_pointer(__old_p), __n_copy);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002362 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2363 if (__sec_cp_sz != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002364 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2365 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del,
2366 __sec_cp_sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002367 if (__old_cap+1 != __min_cap)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002368 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002369 __set_long_pointer(__p);
2370 __set_long_cap(__cap+1);
2371}
2372
2373// assign
2374
2375template <class _CharT, class _Traits, class _Allocator>
2376basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002377basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002378{
Alp Tokerec34c482014-05-15 11:27:39 +00002379 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002380 size_type __cap = capacity();
2381 if (__cap >= __n)
2382 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002383 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002384 traits_type::move(__p, __s, __n);
2385 traits_type::assign(__p[__n], value_type());
2386 __set_size(__n);
2387 __invalidate_iterators_past(__n);
2388 }
2389 else
2390 {
2391 size_type __sz = size();
2392 __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
2393 }
2394 return *this;
2395}
2396
2397template <class _CharT, class _Traits, class _Allocator>
2398basic_string<_CharT, _Traits, _Allocator>&
2399basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
2400{
2401 size_type __cap = capacity();
2402 if (__cap < __n)
2403 {
2404 size_type __sz = size();
2405 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2406 }
2407 else
2408 __invalidate_iterators_past(__n);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002409 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002410 traits_type::assign(__p, __n, __c);
2411 traits_type::assign(__p[__n], value_type());
2412 __set_size(__n);
2413 return *this;
2414}
2415
2416template <class _CharT, class _Traits, class _Allocator>
2417basic_string<_CharT, _Traits, _Allocator>&
2418basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
2419{
2420 pointer __p;
2421 if (__is_long())
2422 {
2423 __p = __get_long_pointer();
2424 __set_long_size(1);
2425 }
2426 else
2427 {
2428 __p = __get_short_pointer();
2429 __set_short_size(1);
2430 }
2431 traits_type::assign(*__p, __c);
2432 traits_type::assign(*++__p, value_type());
2433 __invalidate_iterators_past(1);
2434 return *this;
2435}
2436
2437template <class _CharT, class _Traits, class _Allocator>
Howard Hinnante32b5e22010-11-17 17:55:08 +00002438basic_string<_CharT, _Traits, _Allocator>&
2439basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
2440{
2441 if (this != &__str)
2442 {
2443 __copy_assign_alloc(__str);
2444 assign(__str);
2445 }
2446 return *this;
2447}
2448
2449#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2450
2451template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002452inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:08 +00002453void
2454basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
Marshall Clowaf961ed2015-08-18 18:57:00 +00002455 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002456{
2457 if (__alloc() != __str.__alloc())
2458 assign(__str);
2459 else
2460 __move_assign(__str, true_type());
2461}
2462
2463template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002464inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:08 +00002465void
2466basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
Marshall Clowaf961ed2015-08-18 18:57:00 +00002467#if _LIBCPP_STD_VER > 14
2468 _NOEXCEPT
2469#else
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00002470 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Marshall Clowaf961ed2015-08-18 18:57:00 +00002471#endif
Howard Hinnante32b5e22010-11-17 17:55:08 +00002472{
2473 clear();
2474 shrink_to_fit();
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00002475 __r_.first() = __str.__r_.first();
2476 __move_assign_alloc(__str);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002477 __str.__zero();
2478}
2479
2480template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002481inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:08 +00002482basic_string<_CharT, _Traits, _Allocator>&
2483basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str)
Marshall Clowaf961ed2015-08-18 18:57:00 +00002484 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnante32b5e22010-11-17 17:55:08 +00002485{
2486 __move_assign(__str, integral_constant<bool,
2487 __alloc_traits::propagate_on_container_move_assignment::value>());
2488 return *this;
2489}
2490
2491#endif
2492
2493template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002494template<class _InputIterator>
2495typename enable_if
2496<
2497 __is_input_iterator <_InputIterator>::value &&
2498 !__is_forward_iterator<_InputIterator>::value,
2499 basic_string<_CharT, _Traits, _Allocator>&
2500>::type
2501basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2502{
2503 clear();
2504 for (; __first != __last; ++__first)
2505 push_back(*__first);
Argyrios Kyrtzidis1dc6f7a2012-10-13 02:03:45 +00002506 return *this;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002507}
2508
2509template <class _CharT, class _Traits, class _Allocator>
2510template<class _ForwardIterator>
2511typename enable_if
2512<
2513 __is_forward_iterator<_ForwardIterator>::value,
2514 basic_string<_CharT, _Traits, _Allocator>&
2515>::type
2516basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2517{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002518 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002519 size_type __cap = capacity();
2520 if (__cap < __n)
2521 {
2522 size_type __sz = size();
2523 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2524 }
2525 else
2526 __invalidate_iterators_past(__n);
2527 pointer __p = __get_pointer();
2528 for (; __first != __last; ++__first, ++__p)
2529 traits_type::assign(*__p, *__first);
2530 traits_type::assign(*__p, value_type());
2531 __set_size(__n);
2532 return *this;
2533}
2534
2535template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002536inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002537basic_string<_CharT, _Traits, _Allocator>&
2538basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str)
2539{
2540 return assign(__str.data(), __str.size());
2541}
2542
2543template <class _CharT, class _Traits, class _Allocator>
2544basic_string<_CharT, _Traits, _Allocator>&
2545basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
2546{
2547 size_type __sz = __str.size();
2548 if (__pos > __sz)
2549 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002550 return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002551}
2552
2553template <class _CharT, class _Traits, class _Allocator>
2554basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002555basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002556{
Alp Tokerec34c482014-05-15 11:27:39 +00002557 _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002558 return assign(__s, traits_type::length(__s));
2559}
2560
2561// append
2562
2563template <class _CharT, class _Traits, class _Allocator>
2564basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002565basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002566{
Alp Tokerec34c482014-05-15 11:27:39 +00002567 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002568 size_type __cap = capacity();
2569 size_type __sz = size();
2570 if (__cap - __sz >= __n)
2571 {
2572 if (__n)
2573 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002574 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002575 traits_type::copy(__p + __sz, __s, __n);
2576 __sz += __n;
2577 __set_size(__sz);
2578 traits_type::assign(__p[__sz], value_type());
2579 }
2580 }
2581 else
2582 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
2583 return *this;
2584}
2585
2586template <class _CharT, class _Traits, class _Allocator>
2587basic_string<_CharT, _Traits, _Allocator>&
2588basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
2589{
2590 if (__n)
2591 {
2592 size_type __cap = capacity();
2593 size_type __sz = size();
2594 if (__cap - __sz < __n)
2595 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2596 pointer __p = __get_pointer();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002597 traits_type::assign(_VSTD::__to_raw_pointer(__p) + __sz, __n, __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002598 __sz += __n;
2599 __set_size(__sz);
2600 traits_type::assign(__p[__sz], value_type());
2601 }
2602 return *this;
2603}
2604
2605template <class _CharT, class _Traits, class _Allocator>
2606void
2607basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
2608{
Howard Hinnant15467182013-04-30 21:44:48 +00002609 bool __is_short = !__is_long();
2610 size_type __cap;
2611 size_type __sz;
2612 if (__is_short)
2613 {
2614 __cap = __min_cap - 1;
2615 __sz = __get_short_size();
2616 }
2617 else
2618 {
2619 __cap = __get_long_cap() - 1;
2620 __sz = __get_long_size();
2621 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002622 if (__sz == __cap)
Howard Hinnant15467182013-04-30 21:44:48 +00002623 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002624 __grow_by(__cap, 1, __sz, __sz, 0);
Howard Hinnant15467182013-04-30 21:44:48 +00002625 __is_short = !__is_long();
2626 }
2627 pointer __p;
2628 if (__is_short)
2629 {
2630 __p = __get_short_pointer() + __sz;
2631 __set_short_size(__sz+1);
2632 }
2633 else
2634 {
2635 __p = __get_long_pointer() + __sz;
2636 __set_long_size(__sz+1);
2637 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002638 traits_type::assign(*__p, __c);
2639 traits_type::assign(*++__p, value_type());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002640}
2641
2642template <class _CharT, class _Traits, class _Allocator>
2643template<class _InputIterator>
2644typename enable_if
2645<
2646 __is_input_iterator <_InputIterator>::value &&
2647 !__is_forward_iterator<_InputIterator>::value,
2648 basic_string<_CharT, _Traits, _Allocator>&
2649>::type
2650basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last)
2651{
2652 for (; __first != __last; ++__first)
2653 push_back(*__first);
2654 return *this;
2655}
2656
2657template <class _CharT, class _Traits, class _Allocator>
2658template<class _ForwardIterator>
2659typename enable_if
2660<
2661 __is_forward_iterator<_ForwardIterator>::value,
2662 basic_string<_CharT, _Traits, _Allocator>&
2663>::type
2664basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last)
2665{
2666 size_type __sz = size();
2667 size_type __cap = capacity();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002668 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002669 if (__n)
2670 {
2671 if (__cap - __sz < __n)
2672 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2673 pointer __p = __get_pointer() + __sz;
2674 for (; __first != __last; ++__p, ++__first)
2675 traits_type::assign(*__p, *__first);
2676 traits_type::assign(*__p, value_type());
2677 __set_size(__sz + __n);
2678 }
2679 return *this;
2680}
2681
2682template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002683inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002684basic_string<_CharT, _Traits, _Allocator>&
2685basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
2686{
2687 return append(__str.data(), __str.size());
2688}
2689
2690template <class _CharT, class _Traits, class _Allocator>
2691basic_string<_CharT, _Traits, _Allocator>&
2692basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
2693{
2694 size_type __sz = __str.size();
2695 if (__pos > __sz)
2696 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002697 return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002698}
2699
2700template <class _CharT, class _Traits, class _Allocator>
2701basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002702basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002703{
Alp Tokerec34c482014-05-15 11:27:39 +00002704 _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002705 return append(__s, traits_type::length(__s));
2706}
2707
2708// insert
2709
2710template <class _CharT, class _Traits, class _Allocator>
2711basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002712basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002713{
Alp Tokerec34c482014-05-15 11:27:39 +00002714 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002715 size_type __sz = size();
2716 if (__pos > __sz)
2717 this->__throw_out_of_range();
2718 size_type __cap = capacity();
2719 if (__cap - __sz >= __n)
2720 {
2721 if (__n)
2722 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002723 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002724 size_type __n_move = __sz - __pos;
2725 if (__n_move != 0)
2726 {
2727 if (__p + __pos <= __s && __s < __p + __sz)
2728 __s += __n;
2729 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2730 }
2731 traits_type::move(__p + __pos, __s, __n);
2732 __sz += __n;
2733 __set_size(__sz);
2734 traits_type::assign(__p[__sz], value_type());
2735 }
2736 }
2737 else
2738 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2739 return *this;
2740}
2741
2742template <class _CharT, class _Traits, class _Allocator>
2743basic_string<_CharT, _Traits, _Allocator>&
2744basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
2745{
2746 size_type __sz = size();
2747 if (__pos > __sz)
2748 this->__throw_out_of_range();
2749 if (__n)
2750 {
2751 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002752 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002753 if (__cap - __sz >= __n)
2754 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002755 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002756 size_type __n_move = __sz - __pos;
2757 if (__n_move != 0)
2758 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2759 }
2760 else
2761 {
2762 __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002763 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002764 }
2765 traits_type::assign(__p + __pos, __n, __c);
2766 __sz += __n;
2767 __set_size(__sz);
2768 traits_type::assign(__p[__sz], value_type());
2769 }
2770 return *this;
2771}
2772
2773template <class _CharT, class _Traits, class _Allocator>
2774template<class _InputIterator>
2775typename enable_if
2776<
2777 __is_input_iterator <_InputIterator>::value &&
2778 !__is_forward_iterator<_InputIterator>::value,
2779 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2780>::type
2781basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
2782{
Howard Hinnant499cea12013-08-23 17:37:05 +00002783#if _LIBCPP_DEBUG_LEVEL >= 2
2784 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2785 "string::insert(iterator, range) called with an iterator not"
2786 " referring to this string");
2787#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002788 size_type __old_sz = size();
2789 difference_type __ip = __pos - begin();
2790 for (; __first != __last; ++__first)
2791 push_back(*__first);
2792 pointer __p = __get_pointer();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002793 _VSTD::rotate(__p + __ip, __p + __old_sz, __p + size());
Howard Hinnant499cea12013-08-23 17:37:05 +00002794#if _LIBCPP_DEBUG_LEVEL >= 2
2795 return iterator(this, __p + __ip);
2796#else
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002797 return iterator(__p + __ip);
Howard Hinnant499cea12013-08-23 17:37:05 +00002798#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002799}
2800
2801template <class _CharT, class _Traits, class _Allocator>
2802template<class _ForwardIterator>
2803typename enable_if
2804<
2805 __is_forward_iterator<_ForwardIterator>::value,
2806 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2807>::type
2808basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
2809{
Howard Hinnant499cea12013-08-23 17:37:05 +00002810#if _LIBCPP_DEBUG_LEVEL >= 2
2811 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2812 "string::insert(iterator, range) called with an iterator not"
2813 " referring to this string");
2814#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002815 size_type __ip = static_cast<size_type>(__pos - begin());
2816 size_type __sz = size();
2817 size_type __cap = capacity();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002818 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002819 if (__n)
2820 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002821 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002822 if (__cap - __sz >= __n)
2823 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002824 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002825 size_type __n_move = __sz - __ip;
2826 if (__n_move != 0)
2827 traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
2828 }
2829 else
2830 {
2831 __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002832 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002833 }
2834 __sz += __n;
2835 __set_size(__sz);
2836 traits_type::assign(__p[__sz], value_type());
2837 for (__p += __ip; __first != __last; ++__p, ++__first)
2838 traits_type::assign(*__p, *__first);
2839 }
2840 return begin() + __ip;
2841}
2842
2843template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002844inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002845basic_string<_CharT, _Traits, _Allocator>&
2846basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str)
2847{
2848 return insert(__pos1, __str.data(), __str.size());
2849}
2850
2851template <class _CharT, class _Traits, class _Allocator>
2852basic_string<_CharT, _Traits, _Allocator>&
2853basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
2854 size_type __pos2, size_type __n)
2855{
2856 size_type __str_sz = __str.size();
2857 if (__pos2 > __str_sz)
2858 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002859 return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002860}
2861
2862template <class _CharT, class _Traits, class _Allocator>
2863basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002864basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002865{
Alp Tokerec34c482014-05-15 11:27:39 +00002866 _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002867 return insert(__pos, __s, traits_type::length(__s));
2868}
2869
2870template <class _CharT, class _Traits, class _Allocator>
2871typename basic_string<_CharT, _Traits, _Allocator>::iterator
2872basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
2873{
2874 size_type __ip = static_cast<size_type>(__pos - begin());
2875 size_type __sz = size();
2876 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002877 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002878 if (__cap == __sz)
2879 {
2880 __grow_by(__cap, 1, __sz, __ip, 0, 1);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002881 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002882 }
2883 else
2884 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002885 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002886 size_type __n_move = __sz - __ip;
2887 if (__n_move != 0)
2888 traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
2889 }
2890 traits_type::assign(__p[__ip], __c);
2891 traits_type::assign(__p[++__sz], value_type());
2892 __set_size(__sz);
2893 return begin() + static_cast<difference_type>(__ip);
2894}
2895
2896template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002897inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002898typename basic_string<_CharT, _Traits, _Allocator>::iterator
2899basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c)
2900{
Howard Hinnant499cea12013-08-23 17:37:05 +00002901#if _LIBCPP_DEBUG_LEVEL >= 2
2902 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2903 "string::insert(iterator, n, value) called with an iterator not"
2904 " referring to this string");
2905#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002906 difference_type __p = __pos - begin();
2907 insert(static_cast<size_type>(__p), __n, __c);
2908 return begin() + __p;
2909}
2910
2911// replace
2912
2913template <class _CharT, class _Traits, class _Allocator>
2914basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002915basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002916{
Alp Tokerec34c482014-05-15 11:27:39 +00002917 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002918 size_type __sz = size();
2919 if (__pos > __sz)
2920 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002921 __n1 = _VSTD::min(__n1, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002922 size_type __cap = capacity();
2923 if (__cap - __sz + __n1 >= __n2)
2924 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002925 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002926 if (__n1 != __n2)
2927 {
2928 size_type __n_move = __sz - __pos - __n1;
2929 if (__n_move != 0)
2930 {
2931 if (__n1 > __n2)
2932 {
2933 traits_type::move(__p + __pos, __s, __n2);
2934 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2935 goto __finish;
2936 }
2937 if (__p + __pos < __s && __s < __p + __sz)
2938 {
2939 if (__p + __pos + __n1 <= __s)
2940 __s += __n2 - __n1;
2941 else // __p + __pos < __s < __p + __pos + __n1
2942 {
2943 traits_type::move(__p + __pos, __s, __n1);
2944 __pos += __n1;
2945 __s += __n2;
2946 __n2 -= __n1;
2947 __n1 = 0;
2948 }
2949 }
2950 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2951 }
2952 }
2953 traits_type::move(__p + __pos, __s, __n2);
2954__finish:
2955 __sz += __n2 - __n1;
2956 __set_size(__sz);
2957 __invalidate_iterators_past(__sz);
2958 traits_type::assign(__p[__sz], value_type());
2959 }
2960 else
2961 __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
2962 return *this;
2963}
2964
2965template <class _CharT, class _Traits, class _Allocator>
2966basic_string<_CharT, _Traits, _Allocator>&
2967basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
2968{
2969 size_type __sz = size();
2970 if (__pos > __sz)
2971 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002972 __n1 = _VSTD::min(__n1, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002973 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002974 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002975 if (__cap - __sz + __n1 >= __n2)
2976 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002977 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002978 if (__n1 != __n2)
2979 {
2980 size_type __n_move = __sz - __pos - __n1;
2981 if (__n_move != 0)
2982 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2983 }
2984 }
2985 else
2986 {
2987 __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002988 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002989 }
2990 traits_type::assign(__p + __pos, __n2, __c);
2991 __sz += __n2 - __n1;
2992 __set_size(__sz);
2993 __invalidate_iterators_past(__sz);
2994 traits_type::assign(__p[__sz], value_type());
2995 return *this;
2996}
2997
2998template <class _CharT, class _Traits, class _Allocator>
2999template<class _InputIterator>
3000typename enable_if
3001<
3002 __is_input_iterator<_InputIterator>::value,
3003 basic_string<_CharT, _Traits, _Allocator>&
3004>::type
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003005basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003006 _InputIterator __j1, _InputIterator __j2)
3007{
3008 for (; true; ++__i1, ++__j1)
3009 {
3010 if (__i1 == __i2)
3011 {
3012 if (__j1 != __j2)
3013 insert(__i1, __j1, __j2);
3014 break;
3015 }
3016 if (__j1 == __j2)
3017 {
3018 erase(__i1, __i2);
3019 break;
3020 }
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003021 traits_type::assign(const_cast<value_type&>(*__i1), *__j1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003022 }
3023 return *this;
3024}
3025
3026template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003027inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003028basic_string<_CharT, _Traits, _Allocator>&
3029basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str)
3030{
3031 return replace(__pos1, __n1, __str.data(), __str.size());
3032}
3033
3034template <class _CharT, class _Traits, class _Allocator>
3035basic_string<_CharT, _Traits, _Allocator>&
3036basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
3037 size_type __pos2, size_type __n2)
3038{
3039 size_type __str_sz = __str.size();
3040 if (__pos2 > __str_sz)
3041 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003042 return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003043}
3044
3045template <class _CharT, class _Traits, class _Allocator>
3046basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003047basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003048{
Alp Tokerec34c482014-05-15 11:27:39 +00003049 _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003050 return replace(__pos, __n1, __s, traits_type::length(__s));
3051}
3052
3053template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003054inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003055basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003056basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003057{
3058 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1),
3059 __str.data(), __str.size());
3060}
3061
3062template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003063inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003064basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003065basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003066{
3067 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
3068}
3069
3070template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003071inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003072basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003073basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003074{
3075 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
3076}
3077
3078template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003079inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003080basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003081basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003082{
3083 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
3084}
3085
3086// erase
3087
3088template <class _CharT, class _Traits, class _Allocator>
3089basic_string<_CharT, _Traits, _Allocator>&
3090basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n)
3091{
3092 size_type __sz = size();
3093 if (__pos > __sz)
3094 this->__throw_out_of_range();
3095 if (__n)
3096 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003097 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnant0949eed2011-06-30 21:18:19 +00003098 __n = _VSTD::min(__n, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003099 size_type __n_move = __sz - __pos - __n;
3100 if (__n_move != 0)
3101 traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
3102 __sz -= __n;
3103 __set_size(__sz);
3104 __invalidate_iterators_past(__sz);
3105 traits_type::assign(__p[__sz], value_type());
3106 }
3107 return *this;
3108}
3109
3110template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003111inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003112typename basic_string<_CharT, _Traits, _Allocator>::iterator
3113basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
3114{
Howard Hinnant499cea12013-08-23 17:37:05 +00003115#if _LIBCPP_DEBUG_LEVEL >= 2
3116 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
3117 "string::erase(iterator) called with an iterator not"
3118 " referring to this string");
3119#endif
3120 _LIBCPP_ASSERT(__pos != end(),
3121 "string::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003122 iterator __b = begin();
3123 size_type __r = static_cast<size_type>(__pos - __b);
3124 erase(__r, 1);
Howard Hinnantec3773c2011-12-01 20:21:04 +00003125 return __b + static_cast<difference_type>(__r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003126}
3127
3128template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003129inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003130typename basic_string<_CharT, _Traits, _Allocator>::iterator
3131basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
3132{
Howard Hinnant499cea12013-08-23 17:37:05 +00003133#if _LIBCPP_DEBUG_LEVEL >= 2
3134 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
3135 "string::erase(iterator, iterator) called with an iterator not"
3136 " referring to this string");
3137#endif
3138 _LIBCPP_ASSERT(__first <= __last, "string::erase(first, last) called with invalid range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003139 iterator __b = begin();
3140 size_type __r = static_cast<size_type>(__first - __b);
3141 erase(__r, static_cast<size_type>(__last - __first));
Howard Hinnantec3773c2011-12-01 20:21:04 +00003142 return __b + static_cast<difference_type>(__r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003143}
3144
3145template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003146inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003147void
3148basic_string<_CharT, _Traits, _Allocator>::pop_back()
3149{
Howard Hinnant499cea12013-08-23 17:37:05 +00003150 _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003151 size_type __sz;
3152 if (__is_long())
3153 {
3154 __sz = __get_long_size() - 1;
3155 __set_long_size(__sz);
3156 traits_type::assign(*(__get_long_pointer() + __sz), value_type());
3157 }
3158 else
3159 {
3160 __sz = __get_short_size() - 1;
3161 __set_short_size(__sz);
3162 traits_type::assign(*(__get_short_pointer() + __sz), value_type());
3163 }
3164 __invalidate_iterators_past(__sz);
3165}
3166
3167template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003168inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003169void
Howard Hinnanta6119a82011-05-29 19:57:12 +00003170basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003171{
3172 __invalidate_all_iterators();
3173 if (__is_long())
3174 {
3175 traits_type::assign(*__get_long_pointer(), value_type());
3176 __set_long_size(0);
3177 }
3178 else
3179 {
3180 traits_type::assign(*__get_short_pointer(), value_type());
3181 __set_short_size(0);
3182 }
3183}
3184
3185template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003186inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003187void
3188basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
3189{
3190 if (__is_long())
3191 {
3192 traits_type::assign(*(__get_long_pointer() + __pos), value_type());
3193 __set_long_size(__pos);
3194 }
3195 else
3196 {
3197 traits_type::assign(*(__get_short_pointer() + __pos), value_type());
3198 __set_short_size(__pos);
3199 }
3200 __invalidate_iterators_past(__pos);
3201}
3202
3203template <class _CharT, class _Traits, class _Allocator>
3204void
3205basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
3206{
3207 size_type __sz = size();
3208 if (__n > __sz)
3209 append(__n - __sz, __c);
3210 else
3211 __erase_to_end(__n);
3212}
3213
3214template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003215inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003216typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003217basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003218{
Howard Hinnante32b5e22010-11-17 17:55:08 +00003219 size_type __m = __alloc_traits::max_size(__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003220#if _LIBCPP_BIG_ENDIAN
Marshall Clow09f85502013-10-31 17:23:08 +00003221 return (__m <= ~__long_mask ? __m : __m/2) - __alignment;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003222#else
Marshall Clow09f85502013-10-31 17:23:08 +00003223 return __m - __alignment;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003224#endif
3225}
3226
3227template <class _CharT, class _Traits, class _Allocator>
3228void
3229basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
3230{
3231 if (__res_arg > max_size())
3232 this->__throw_length_error();
3233 size_type __cap = capacity();
3234 size_type __sz = size();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003235 __res_arg = _VSTD::max(__res_arg, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003236 __res_arg = __recommend(__res_arg);
3237 if (__res_arg != __cap)
3238 {
3239 pointer __new_data, __p;
3240 bool __was_long, __now_long;
3241 if (__res_arg == __min_cap - 1)
3242 {
3243 __was_long = true;
3244 __now_long = false;
3245 __new_data = __get_short_pointer();
3246 __p = __get_long_pointer();
3247 }
3248 else
3249 {
3250 if (__res_arg > __cap)
Howard Hinnante32b5e22010-11-17 17:55:08 +00003251 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003252 else
3253 {
3254 #ifndef _LIBCPP_NO_EXCEPTIONS
3255 try
3256 {
Howard Hinnant324bb032010-08-22 00:02:43 +00003257 #endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante32b5e22010-11-17 17:55:08 +00003258 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003259 #ifndef _LIBCPP_NO_EXCEPTIONS
3260 }
3261 catch (...)
3262 {
3263 return;
3264 }
Howard Hinnant324bb032010-08-22 00:02:43 +00003265 #else // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003266 if (__new_data == nullptr)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003267 return;
Howard Hinnant324bb032010-08-22 00:02:43 +00003268 #endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003269 }
3270 __now_long = true;
3271 __was_long = __is_long();
3272 __p = __get_pointer();
3273 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003274 traits_type::copy(_VSTD::__to_raw_pointer(__new_data),
3275 _VSTD::__to_raw_pointer(__p), size()+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003276 if (__was_long)
Howard Hinnante32b5e22010-11-17 17:55:08 +00003277 __alloc_traits::deallocate(__alloc(), __p, __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003278 if (__now_long)
3279 {
3280 __set_long_cap(__res_arg+1);
3281 __set_long_size(__sz);
3282 __set_long_pointer(__new_data);
3283 }
3284 else
3285 __set_short_size(__sz);
3286 __invalidate_all_iterators();
3287 }
3288}
3289
3290template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003291inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003292typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3293basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const
3294{
Howard Hinnant499cea12013-08-23 17:37:05 +00003295 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003296 return *(data() + __pos);
3297}
3298
3299template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003300inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003301typename basic_string<_CharT, _Traits, _Allocator>::reference
3302basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos)
3303{
Howard Hinnant499cea12013-08-23 17:37:05 +00003304 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003305 return *(__get_pointer() + __pos);
3306}
3307
3308template <class _CharT, class _Traits, class _Allocator>
3309typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3310basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
3311{
3312 if (__n >= size())
3313 this->__throw_out_of_range();
3314 return (*this)[__n];
3315}
3316
3317template <class _CharT, class _Traits, class _Allocator>
3318typename basic_string<_CharT, _Traits, _Allocator>::reference
3319basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
3320{
3321 if (__n >= size())
3322 this->__throw_out_of_range();
3323 return (*this)[__n];
3324}
3325
3326template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003327inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003328typename basic_string<_CharT, _Traits, _Allocator>::reference
3329basic_string<_CharT, _Traits, _Allocator>::front()
3330{
Howard Hinnant499cea12013-08-23 17:37:05 +00003331 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003332 return *__get_pointer();
3333}
3334
3335template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003336inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003337typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3338basic_string<_CharT, _Traits, _Allocator>::front() const
3339{
Howard Hinnant499cea12013-08-23 17:37:05 +00003340 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003341 return *data();
3342}
3343
3344template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003345inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003346typename basic_string<_CharT, _Traits, _Allocator>::reference
3347basic_string<_CharT, _Traits, _Allocator>::back()
3348{
Howard Hinnant499cea12013-08-23 17:37:05 +00003349 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003350 return *(__get_pointer() + size() - 1);
3351}
3352
3353template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003354inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003355typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3356basic_string<_CharT, _Traits, _Allocator>::back() const
3357{
Howard Hinnant499cea12013-08-23 17:37:05 +00003358 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003359 return *(data() + size() - 1);
3360}
3361
3362template <class _CharT, class _Traits, class _Allocator>
3363typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003364basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003365{
3366 size_type __sz = size();
3367 if (__pos > __sz)
3368 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003369 size_type __rlen = _VSTD::min(__n, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003370 traits_type::copy(__s, data() + __pos, __rlen);
3371 return __rlen;
3372}
3373
3374template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003375inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003376basic_string<_CharT, _Traits, _Allocator>
3377basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const
3378{
3379 return basic_string(*this, __pos, __n, __alloc());
3380}
3381
3382template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003383inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003384void
3385basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
Marshall Clow7d914d12015-07-13 20:04:56 +00003386#if _LIBCPP_STD_VER >= 14
3387 _NOEXCEPT
3388#else
3389 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3390 __is_nothrow_swappable<allocator_type>::value)
3391#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003392{
Howard Hinnant499cea12013-08-23 17:37:05 +00003393#if _LIBCPP_DEBUG_LEVEL >= 2
3394 if (!__is_long())
3395 __get_db()->__invalidate_all(this);
3396 if (!__str.__is_long())
3397 __get_db()->__invalidate_all(&__str);
3398 __get_db()->swap(this, &__str);
3399#endif
Howard Hinnant0949eed2011-06-30 21:18:19 +00003400 _VSTD::swap(__r_.first(), __str.__r_.first());
Marshall Clow7d914d12015-07-13 20:04:56 +00003401 __swap_allocator(__alloc(), __str.__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003402}
3403
3404// find
3405
3406template <class _Traits>
3407struct _LIBCPP_HIDDEN __traits_eq
3408{
3409 typedef typename _Traits::char_type char_type;
Howard Hinnanta6119a82011-05-29 19:57:12 +00003410 _LIBCPP_INLINE_VISIBILITY
3411 bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
3412 {return _Traits::eq(__x, __y);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003413};
3414
3415template<class _CharT, class _Traits, class _Allocator>
3416typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003417basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003418 size_type __pos,
3419 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003420{
Alp Tokerec34c482014-05-15 11:27:39 +00003421 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003422 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003423 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003424}
3425
3426template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003427inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003428typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003429basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
3430 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003431{
Marshall Clow37025e12014-06-10 18:51:55 +00003432 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003433 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003434}
3435
3436template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003437inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003438typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003439basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003440 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003441{
Alp Tokerec34c482014-05-15 11:27:39 +00003442 _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003443 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003444 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003445}
3446
3447template<class _CharT, class _Traits, class _Allocator>
3448typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003449basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
3450 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003451{
Marshall Clow37025e12014-06-10 18:51:55 +00003452 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003453 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003454}
3455
3456// rfind
3457
3458template<class _CharT, class _Traits, class _Allocator>
3459typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003460basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003461 size_type __pos,
3462 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003463{
Alp Tokerec34c482014-05-15 11:27:39 +00003464 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003465 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003466 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003467}
3468
3469template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003470inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003471typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003472basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
3473 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003474{
Marshall Clow37025e12014-06-10 18:51:55 +00003475 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003476 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003477}
3478
3479template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003480inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003481typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003482basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003483 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003484{
Alp Tokerec34c482014-05-15 11:27:39 +00003485 _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003486 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003487 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003488}
3489
3490template<class _CharT, class _Traits, class _Allocator>
3491typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003492basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
3493 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003494{
Marshall Clow37025e12014-06-10 18:51:55 +00003495 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003496 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003497}
3498
3499// find_first_of
3500
3501template<class _CharT, class _Traits, class _Allocator>
3502typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003503basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003504 size_type __pos,
3505 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003506{
Alp Tokerec34c482014-05-15 11:27:39 +00003507 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003508 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003509 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003510}
3511
3512template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003513inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003514typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003515basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
3516 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003517{
Marshall Clow37025e12014-06-10 18:51:55 +00003518 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003519 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003520}
3521
3522template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003523inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003524typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003525basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003526 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003527{
Alp Tokerec34c482014-05-15 11:27:39 +00003528 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003529 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003530 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003531}
3532
3533template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003534inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003535typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003536basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
3537 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003538{
3539 return find(__c, __pos);
3540}
3541
3542// find_last_of
3543
3544template<class _CharT, class _Traits, class _Allocator>
3545typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003546basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003547 size_type __pos,
3548 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003549{
Alp Tokerec34c482014-05-15 11:27:39 +00003550 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003551 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003552 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003553}
3554
3555template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003556inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003557typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003558basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
3559 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003560{
Marshall Clow37025e12014-06-10 18:51:55 +00003561 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003562 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003563}
3564
3565template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003566inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003567typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003568basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003569 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003570{
Alp Tokerec34c482014-05-15 11:27:39 +00003571 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003572 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003573 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003574}
3575
3576template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003577inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003578typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003579basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
3580 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003581{
3582 return rfind(__c, __pos);
3583}
3584
3585// find_first_not_of
3586
3587template<class _CharT, class _Traits, class _Allocator>
3588typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003589basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003590 size_type __pos,
3591 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003592{
Alp Tokerec34c482014-05-15 11:27:39 +00003593 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003594 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003595 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003596}
3597
3598template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003599inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003600typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003601basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
3602 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003603{
Marshall Clow37025e12014-06-10 18:51:55 +00003604 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003605 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003606}
3607
3608template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003609inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003610typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003611basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003612 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003613{
Alp Tokerec34c482014-05-15 11:27:39 +00003614 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003615 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003616 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003617}
3618
3619template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003620inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003621typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003622basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
3623 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003624{
Marshall Clow37025e12014-06-10 18:51:55 +00003625 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003626 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003627}
3628
3629// find_last_not_of
3630
3631template<class _CharT, class _Traits, class _Allocator>
3632typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003633basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003634 size_type __pos,
3635 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003636{
Alp Tokerec34c482014-05-15 11:27:39 +00003637 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003638 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003639 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003640}
3641
3642template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003643inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003644typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003645basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
3646 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003647{
Marshall Clow37025e12014-06-10 18:51:55 +00003648 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003649 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003650}
3651
3652template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003653inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003654typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003655basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003656 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003657{
Alp Tokerec34c482014-05-15 11:27:39 +00003658 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003659 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003660 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003661}
3662
3663template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003664inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003665typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003666basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
3667 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003668{
Marshall Clow37025e12014-06-10 18:51:55 +00003669 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003670 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003671}
3672
3673// compare
3674
3675template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003676inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003677int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003678basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003679{
Howard Hinnantfa06d752011-07-24 21:45:06 +00003680 size_t __lhs_sz = size();
3681 size_t __rhs_sz = __str.size();
3682 int __result = traits_type::compare(data(), __str.data(),
3683 _VSTD::min(__lhs_sz, __rhs_sz));
3684 if (__result != 0)
3685 return __result;
3686 if (__lhs_sz < __rhs_sz)
3687 return -1;
3688 if (__lhs_sz > __rhs_sz)
3689 return 1;
3690 return 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003691}
3692
3693template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003694inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003695int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003696basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3697 size_type __n1,
3698 const basic_string& __str) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003699{
3700 return compare(__pos1, __n1, __str.data(), __str.size());
3701}
3702
3703template <class _CharT, class _Traits, class _Allocator>
3704int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003705basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3706 size_type __n1,
3707 const basic_string& __str,
3708 size_type __pos2,
3709 size_type __n2) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003710{
3711 size_type __sz = __str.size();
3712 if (__pos2 > __sz)
3713 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003714 return compare(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003715 __sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003716}
3717
3718template <class _CharT, class _Traits, class _Allocator>
3719int
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003720basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003721{
Alp Tokerec34c482014-05-15 11:27:39 +00003722 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003723 return compare(0, npos, __s, traits_type::length(__s));
3724}
3725
3726template <class _CharT, class _Traits, class _Allocator>
3727int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003728basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3729 size_type __n1,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003730 const value_type* __s) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003731{
Alp Tokerec34c482014-05-15 11:27:39 +00003732 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003733 return compare(__pos1, __n1, __s, traits_type::length(__s));
3734}
3735
3736template <class _CharT, class _Traits, class _Allocator>
3737int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003738basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3739 size_type __n1,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003740 const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003741 size_type __n2) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003742{
Alp Tokerec34c482014-05-15 11:27:39 +00003743 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003744 size_type __sz = size();
3745 if (__pos1 > __sz || __n2 == npos)
3746 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003747 size_type __rlen = _VSTD::min(__n1, __sz - __pos1);
3748 int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003749 if (__r == 0)
3750 {
3751 if (__rlen < __n2)
3752 __r = -1;
3753 else if (__rlen > __n2)
3754 __r = 1;
3755 }
3756 return __r;
3757}
3758
3759// __invariants
3760
3761template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003762inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003763bool
3764basic_string<_CharT, _Traits, _Allocator>::__invariants() const
3765{
3766 if (size() > capacity())
3767 return false;
3768 if (capacity() < __min_cap - 1)
3769 return false;
3770 if (data() == 0)
3771 return false;
3772 if (data()[size()] != value_type(0))
3773 return false;
3774 return true;
3775}
3776
3777// operator==
3778
3779template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003780inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003781bool
3782operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003783 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003784{
Howard Hinnant08dd2532013-04-22 23:55:13 +00003785 size_t __lhs_sz = __lhs.size();
3786 return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(),
3787 __rhs.data(),
3788 __lhs_sz) == 0;
3789}
3790
3791template<class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003792inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant08dd2532013-04-22 23:55:13 +00003793bool
3794operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
3795 const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT
3796{
3797 size_t __lhs_sz = __lhs.size();
3798 if (__lhs_sz != __rhs.size())
3799 return false;
3800 const char* __lp = __lhs.data();
3801 const char* __rp = __rhs.data();
3802 if (__lhs.__is_long())
3803 return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
3804 for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
3805 if (*__lp != *__rp)
3806 return false;
3807 return true;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003808}
3809
3810template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003811inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003812bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003813operator==(const _CharT* __lhs,
3814 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003815{
Eric Fiselier4f241822015-08-28 03:02:37 +00003816 typedef basic_string<_CharT, _Traits, _Allocator> _String;
3817 _LIBCPP_ASSERT(__lhs != nullptr, "operator==(char*, basic_string): received nullptr");
3818 size_t __lhs_len = _Traits::length(__lhs);
3819 if (__lhs_len != __rhs.size()) return false;
3820 return __rhs.compare(0, _String::npos, __lhs, __lhs_len) == 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003821}
3822
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003823template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003824inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003825bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003826operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
3827 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003828{
Eric Fiselier4f241822015-08-28 03:02:37 +00003829 typedef basic_string<_CharT, _Traits, _Allocator> _String;
3830 _LIBCPP_ASSERT(__rhs != nullptr, "operator==(basic_string, char*): received nullptr");
3831 size_t __rhs_len = _Traits::length(__rhs);
3832 if (__rhs_len != __lhs.size()) return false;
3833 return __lhs.compare(0, _String::npos, __rhs, __rhs_len) == 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003834}
3835
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003836// operator!=
3837
Howard Hinnant324bb032010-08-22 00:02:43 +00003838template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003839inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003840bool
3841operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003842 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003843{
3844 return !(__lhs == __rhs);
3845}
3846
3847template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003848inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003849bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003850operator!=(const _CharT* __lhs,
3851 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003852{
3853 return !(__lhs == __rhs);
3854}
3855
3856template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003857inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003858bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003859operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3860 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003861{
3862 return !(__lhs == __rhs);
3863}
3864
3865// operator<
3866
3867template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003868inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003869bool
3870operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003871 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003872{
Howard Hinnant2644a7b2011-07-24 15:07:21 +00003873 return __lhs.compare(__rhs) < 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003874}
3875
3876template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003877inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003878bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003879operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3880 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003881{
Howard Hinnant2644a7b2011-07-24 15:07:21 +00003882 return __lhs.compare(__rhs) < 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003883}
3884
3885template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003886inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003887bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003888operator< (const _CharT* __lhs,
3889 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003890{
3891 return __rhs.compare(__lhs) > 0;
3892}
3893
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003894// operator>
3895
3896template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003897inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003898bool
3899operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003900 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003901{
3902 return __rhs < __lhs;
3903}
3904
3905template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003906inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003907bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003908operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3909 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003910{
3911 return __rhs < __lhs;
3912}
3913
3914template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003915inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003916bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003917operator> (const _CharT* __lhs,
3918 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003919{
3920 return __rhs < __lhs;
3921}
3922
3923// operator<=
3924
3925template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003926inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003927bool
3928operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003929 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003930{
3931 return !(__rhs < __lhs);
3932}
3933
3934template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003935inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003936bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003937operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3938 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003939{
3940 return !(__rhs < __lhs);
3941}
3942
3943template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003944inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003945bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003946operator<=(const _CharT* __lhs,
3947 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003948{
3949 return !(__rhs < __lhs);
3950}
3951
3952// operator>=
3953
3954template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003955inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003956bool
3957operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003958 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003959{
3960 return !(__lhs < __rhs);
3961}
3962
3963template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003964inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003965bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003966operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3967 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003968{
3969 return !(__lhs < __rhs);
3970}
3971
3972template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003973inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003974bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003975operator>=(const _CharT* __lhs,
3976 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003977{
3978 return !(__lhs < __rhs);
3979}
3980
3981// operator +
3982
3983template<class _CharT, class _Traits, class _Allocator>
3984basic_string<_CharT, _Traits, _Allocator>
3985operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3986 const basic_string<_CharT, _Traits, _Allocator>& __rhs)
3987{
3988 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
3989 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
3990 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
3991 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
3992 __r.append(__rhs.data(), __rhs_sz);
3993 return __r;
3994}
3995
3996template<class _CharT, class _Traits, class _Allocator>
3997basic_string<_CharT, _Traits, _Allocator>
3998operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
3999{
4000 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
4001 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs);
4002 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
4003 __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
4004 __r.append(__rhs.data(), __rhs_sz);
4005 return __r;
4006}
4007
4008template<class _CharT, class _Traits, class _Allocator>
4009basic_string<_CharT, _Traits, _Allocator>
4010operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4011{
4012 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
4013 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
4014 __r.__init(&__lhs, 1, 1 + __rhs_sz);
4015 __r.append(__rhs.data(), __rhs_sz);
4016 return __r;
4017}
4018
4019template<class _CharT, class _Traits, class _Allocator>
4020basic_string<_CharT, _Traits, _Allocator>
4021operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
4022{
4023 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4024 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4025 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs);
4026 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
4027 __r.append(__rhs, __rhs_sz);
4028 return __r;
4029}
4030
4031template<class _CharT, class _Traits, class _Allocator>
4032basic_string<_CharT, _Traits, _Allocator>
4033operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
4034{
4035 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4036 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4037 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
4038 __r.push_back(__rhs);
4039 return __r;
4040}
4041
Howard Hinnant73d21a42010-09-04 23:28:19 +00004042#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004043
4044template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004045inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004046basic_string<_CharT, _Traits, _Allocator>
4047operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4048{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004049 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004050}
4051
4052template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004053inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004054basic_string<_CharT, _Traits, _Allocator>
4055operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4056{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004057 return _VSTD::move(__rhs.insert(0, __lhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004058}
4059
4060template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004061inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004062basic_string<_CharT, _Traits, _Allocator>
4063operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4064{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004065 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004066}
4067
4068template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004069inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004070basic_string<_CharT, _Traits, _Allocator>
4071operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4072{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004073 return _VSTD::move(__rhs.insert(0, __lhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004074}
4075
4076template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004077inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004078basic_string<_CharT, _Traits, _Allocator>
4079operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4080{
4081 __rhs.insert(__rhs.begin(), __lhs);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004082 return _VSTD::move(__rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004083}
4084
4085template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004086inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004087basic_string<_CharT, _Traits, _Allocator>
4088operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
4089{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004090 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004091}
4092
4093template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004094inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004095basic_string<_CharT, _Traits, _Allocator>
4096operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
4097{
4098 __lhs.push_back(__rhs);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004099 return _VSTD::move(__lhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004100}
4101
Howard Hinnant73d21a42010-09-04 23:28:19 +00004102#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004103
4104// swap
4105
4106template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004107inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004108void
Howard Hinnanta6119a82011-05-29 19:57:12 +00004109swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00004110 basic_string<_CharT, _Traits, _Allocator>& __rhs)
4111 _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004112{
4113 __lhs.swap(__rhs);
4114}
4115
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004116#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
4117
4118typedef basic_string<char16_t> u16string;
4119typedef basic_string<char32_t> u32string;
4120
Howard Hinnant324bb032010-08-22 00:02:43 +00004121#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004122
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004123_LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* __idx = 0, int __base = 10);
4124_LIBCPP_FUNC_VIS long stol (const string& __str, size_t* __idx = 0, int __base = 10);
4125_LIBCPP_FUNC_VIS unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10);
4126_LIBCPP_FUNC_VIS long long stoll (const string& __str, size_t* __idx = 0, int __base = 10);
4127_LIBCPP_FUNC_VIS unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004128
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004129_LIBCPP_FUNC_VIS float stof (const string& __str, size_t* __idx = 0);
4130_LIBCPP_FUNC_VIS double stod (const string& __str, size_t* __idx = 0);
4131_LIBCPP_FUNC_VIS long double stold(const string& __str, size_t* __idx = 0);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004132
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004133_LIBCPP_FUNC_VIS string to_string(int __val);
4134_LIBCPP_FUNC_VIS string to_string(unsigned __val);
4135_LIBCPP_FUNC_VIS string to_string(long __val);
4136_LIBCPP_FUNC_VIS string to_string(unsigned long __val);
4137_LIBCPP_FUNC_VIS string to_string(long long __val);
4138_LIBCPP_FUNC_VIS string to_string(unsigned long long __val);
4139_LIBCPP_FUNC_VIS string to_string(float __val);
4140_LIBCPP_FUNC_VIS string to_string(double __val);
4141_LIBCPP_FUNC_VIS string to_string(long double __val);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004142
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004143_LIBCPP_FUNC_VIS int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10);
4144_LIBCPP_FUNC_VIS long stol (const wstring& __str, size_t* __idx = 0, int __base = 10);
4145_LIBCPP_FUNC_VIS unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10);
4146_LIBCPP_FUNC_VIS long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10);
4147_LIBCPP_FUNC_VIS unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004148
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004149_LIBCPP_FUNC_VIS float stof (const wstring& __str, size_t* __idx = 0);
4150_LIBCPP_FUNC_VIS double stod (const wstring& __str, size_t* __idx = 0);
4151_LIBCPP_FUNC_VIS long double stold(const wstring& __str, size_t* __idx = 0);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004152
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004153_LIBCPP_FUNC_VIS wstring to_wstring(int __val);
4154_LIBCPP_FUNC_VIS wstring to_wstring(unsigned __val);
4155_LIBCPP_FUNC_VIS wstring to_wstring(long __val);
4156_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long __val);
4157_LIBCPP_FUNC_VIS wstring to_wstring(long long __val);
4158_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long long __val);
4159_LIBCPP_FUNC_VIS wstring to_wstring(float __val);
4160_LIBCPP_FUNC_VIS wstring to_wstring(double __val);
4161_LIBCPP_FUNC_VIS wstring to_wstring(long double __val);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004162
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004163template<class _CharT, class _Traits, class _Allocator>
4164 const typename basic_string<_CharT, _Traits, _Allocator>::size_type
4165 basic_string<_CharT, _Traits, _Allocator>::npos;
4166
4167template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004168struct _LIBCPP_TYPE_VIS_ONLY hash<basic_string<_CharT, _Traits, _Allocator> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004169 : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t>
4170{
4171 size_t
Howard Hinnanta6119a82011-05-29 19:57:12 +00004172 operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004173};
4174
4175template<class _CharT, class _Traits, class _Allocator>
4176size_t
4177hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(
Howard Hinnanta6119a82011-05-29 19:57:12 +00004178 const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004179{
Sean Huntaffd9e52011-07-29 23:31:56 +00004180 return __do_string_hash(__val.data(), __val.data() + __val.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004181}
4182
Howard Hinnant464aa5c2011-07-18 15:51:59 +00004183template<class _CharT, class _Traits, class _Allocator>
4184basic_ostream<_CharT, _Traits>&
4185operator<<(basic_ostream<_CharT, _Traits>& __os,
4186 const basic_string<_CharT, _Traits, _Allocator>& __str);
4187
4188template<class _CharT, class _Traits, class _Allocator>
4189basic_istream<_CharT, _Traits>&
4190operator>>(basic_istream<_CharT, _Traits>& __is,
4191 basic_string<_CharT, _Traits, _Allocator>& __str);
4192
4193template<class _CharT, class _Traits, class _Allocator>
4194basic_istream<_CharT, _Traits>&
4195getline(basic_istream<_CharT, _Traits>& __is,
4196 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4197
4198template<class _CharT, class _Traits, class _Allocator>
4199inline _LIBCPP_INLINE_VISIBILITY
4200basic_istream<_CharT, _Traits>&
4201getline(basic_istream<_CharT, _Traits>& __is,
4202 basic_string<_CharT, _Traits, _Allocator>& __str);
4203
4204#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4205
4206template<class _CharT, class _Traits, class _Allocator>
4207inline _LIBCPP_INLINE_VISIBILITY
4208basic_istream<_CharT, _Traits>&
4209getline(basic_istream<_CharT, _Traits>&& __is,
4210 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4211
4212template<class _CharT, class _Traits, class _Allocator>
4213inline _LIBCPP_INLINE_VISIBILITY
4214basic_istream<_CharT, _Traits>&
4215getline(basic_istream<_CharT, _Traits>&& __is,
4216 basic_string<_CharT, _Traits, _Allocator>& __str);
4217
4218#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4219
Howard Hinnant499cea12013-08-23 17:37:05 +00004220#if _LIBCPP_DEBUG_LEVEL >= 2
4221
4222template<class _CharT, class _Traits, class _Allocator>
4223bool
4224basic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const
4225{
4226 return this->data() <= _VSTD::__to_raw_pointer(__i->base()) &&
4227 _VSTD::__to_raw_pointer(__i->base()) < this->data() + this->size();
4228}
4229
4230template<class _CharT, class _Traits, class _Allocator>
4231bool
4232basic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const
4233{
4234 return this->data() < _VSTD::__to_raw_pointer(__i->base()) &&
4235 _VSTD::__to_raw_pointer(__i->base()) <= this->data() + this->size();
4236}
4237
4238template<class _CharT, class _Traits, class _Allocator>
4239bool
4240basic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
4241{
4242 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4243 return this->data() <= __p && __p <= this->data() + this->size();
4244}
4245
4246template<class _CharT, class _Traits, class _Allocator>
4247bool
4248basic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
4249{
4250 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4251 return this->data() <= __p && __p < this->data() + this->size();
4252}
4253
4254#endif // _LIBCPP_DEBUG_LEVEL >= 2
4255
Marshall Clow15234322013-07-23 17:05:24 +00004256#if _LIBCPP_STD_VER > 11
4257// Literal suffixes for basic_string [basic.string.literals]
Marshall Clow8d9dd7a2013-10-05 21:18:32 +00004258inline namespace literals
Marshall Clow15234322013-07-23 17:05:24 +00004259{
4260 inline namespace string_literals
4261 {
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004262 inline _LIBCPP_INLINE_VISIBILITY
4263 basic_string<char> operator "" s( const char *__str, size_t __len )
4264 {
4265 return basic_string<char> (__str, __len);
4266 }
Marshall Clow15234322013-07-23 17:05:24 +00004267
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004268 inline _LIBCPP_INLINE_VISIBILITY
4269 basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
4270 {
4271 return basic_string<wchar_t> (__str, __len);
4272 }
Marshall Clow15234322013-07-23 17:05:24 +00004273
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004274 inline _LIBCPP_INLINE_VISIBILITY
4275 basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len )
4276 {
4277 return basic_string<char16_t> (__str, __len);
4278 }
Marshall Clow15234322013-07-23 17:05:24 +00004279
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004280 inline _LIBCPP_INLINE_VISIBILITY
4281 basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len )
4282 {
4283 return basic_string<char32_t> (__str, __len);
4284 }
Marshall Clow15234322013-07-23 17:05:24 +00004285 }
4286}
4287#endif
4288
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004289_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<char>)
4290_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<wchar_t>)
Howard Hinnant499cea12013-08-23 17:37:05 +00004291_LIBCPP_EXTERN_TEMPLATE(string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004292
4293_LIBCPP_END_NAMESPACE_STD
4294
4295#endif // _LIBCPP_STRING