blob: d07ff289bb6839fbe0e3d84873c6294a3e432f5d [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(
118 allocator_type::propagate_on_container_move_assignment::value &&
119 is_nothrow_move_assignable<allocator_type>::value);
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)
223 noexcept(!allocator_type::propagate_on_container_swap::value ||
224 __is_nothrow_swappable<allocator_type>::value)
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
Howard Hinnant08e17472011-10-17 20:05:10 +0000456#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000457#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000458#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000459
460_LIBCPP_BEGIN_NAMESPACE_STD
461
462// fpos
463
464template <class _StateT>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000465class _LIBCPP_TYPE_VIS_ONLY fpos
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000466{
467private:
468 _StateT __st_;
469 streamoff __off_;
470public:
471 _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {}
472
473 _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;}
474
475 _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;}
476 _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;}
477
478 _LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;}
479 _LIBCPP_INLINE_VISIBILITY fpos operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;}
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};
483
484template <class _StateT>
485inline _LIBCPP_INLINE_VISIBILITY
486streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
487 {return streamoff(__x) - streamoff(__y);}
488
489template <class _StateT>
490inline _LIBCPP_INLINE_VISIBILITY
491bool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
492 {return streamoff(__x) == streamoff(__y);}
493
494template <class _StateT>
495inline _LIBCPP_INLINE_VISIBILITY
496bool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
497 {return streamoff(__x) != streamoff(__y);}
498
499// char_traits
500
501template <class _CharT>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000502struct _LIBCPP_TYPE_VIS_ONLY char_traits
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000503{
504 typedef _CharT char_type;
505 typedef int int_type;
506 typedef streamoff off_type;
507 typedef streampos pos_type;
508 typedef mbstate_t state_type;
509
Howard Hinnanta6119a82011-05-29 19:57:12 +0000510 _LIBCPP_INLINE_VISIBILITY
511 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
512 {__c1 = __c2;}
513 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000514 static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000515 {return __c1 == __c2;}
516 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000517 static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000518 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000519
520 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
521 static size_t length(const char_type* __s);
522 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
523 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
524 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
525 static char_type* assign(char_type* __s, size_t __n, char_type __a);
526
Howard Hinnant03d71812012-07-20 19:09:12 +0000527 _LIBCPP_INLINE_VISIBILITY
528 static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000529 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000530 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000531 static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000532 {return char_type(__c);}
533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000534 static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000535 {return int_type(__c);}
536 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000537 static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000538 {return __c1 == __c2;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000539 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000540 static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000541 {return int_type(EOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000542};
543
544template <class _CharT>
545int
546char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
547{
548 for (; __n; --__n, ++__s1, ++__s2)
549 {
550 if (lt(*__s1, *__s2))
551 return -1;
552 if (lt(*__s2, *__s1))
553 return 1;
554 }
555 return 0;
556}
557
558template <class _CharT>
559inline _LIBCPP_INLINE_VISIBILITY
560size_t
561char_traits<_CharT>::length(const char_type* __s)
562{
563 size_t __len = 0;
564 for (; !eq(*__s, char_type(0)); ++__s)
565 ++__len;
566 return __len;
567}
568
569template <class _CharT>
570inline _LIBCPP_INLINE_VISIBILITY
571const _CharT*
572char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a)
573{
574 for (; __n; --__n)
575 {
576 if (eq(*__s, __a))
577 return __s;
578 ++__s;
579 }
580 return 0;
581}
582
583template <class _CharT>
584_CharT*
585char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n)
586{
587 char_type* __r = __s1;
588 if (__s1 < __s2)
589 {
590 for (; __n; --__n, ++__s1, ++__s2)
591 assign(*__s1, *__s2);
592 }
593 else if (__s2 < __s1)
594 {
595 __s1 += __n;
596 __s2 += __n;
597 for (; __n; --__n)
598 assign(*--__s1, *--__s2);
599 }
600 return __r;
601}
602
603template <class _CharT>
604inline _LIBCPP_INLINE_VISIBILITY
605_CharT*
606char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
607{
Howard Hinnant499cea12013-08-23 17:37:05 +0000608 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000609 char_type* __r = __s1;
610 for (; __n; --__n, ++__s1, ++__s2)
611 assign(*__s1, *__s2);
612 return __r;
613}
614
615template <class _CharT>
616inline _LIBCPP_INLINE_VISIBILITY
617_CharT*
618char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a)
619{
620 char_type* __r = __s;
621 for (; __n; --__n, ++__s)
622 assign(*__s, __a);
623 return __r;
624}
625
626// char_traits<char>
627
628template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000629struct _LIBCPP_TYPE_VIS_ONLY char_traits<char>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000630{
631 typedef char char_type;
632 typedef int int_type;
633 typedef streamoff off_type;
634 typedef streampos pos_type;
635 typedef mbstate_t state_type;
636
Howard Hinnanta6119a82011-05-29 19:57:12 +0000637 _LIBCPP_INLINE_VISIBILITY
638 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
639 {__c1 = __c2;}
640 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000641 static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000642 {return __c1 == __c2;}
643 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000644 static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000645 {return (unsigned char)__c1 < (unsigned char)__c2;}
646
Howard Hinnanta6119a82011-05-29 19:57:12 +0000647 _LIBCPP_INLINE_VISIBILITY
648 static int compare(const char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000649 {return memcmp(__s1, __s2, __n);}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000650 _LIBCPP_INLINE_VISIBILITY
651 static size_t length(const char_type* __s) {return strlen(__s);}
652 _LIBCPP_INLINE_VISIBILITY
653 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000654 {return (const char_type*)memchr(__s, to_int_type(__a), __n);}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000655 _LIBCPP_INLINE_VISIBILITY
656 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000657 {return (char_type*)memmove(__s1, __s2, __n);}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000658 _LIBCPP_INLINE_VISIBILITY
659 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnant499cea12013-08-23 17:37:05 +0000660 {
661 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
662 return (char_type*)memcpy(__s1, __s2, __n);
663 }
Howard Hinnanta6119a82011-05-29 19:57:12 +0000664 _LIBCPP_INLINE_VISIBILITY
665 static char_type* assign(char_type* __s, size_t __n, char_type __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000666 {return (char_type*)memset(__s, to_int_type(__a), __n);}
667
Howard Hinnant03d71812012-07-20 19:09:12 +0000668 _LIBCPP_INLINE_VISIBILITY
669 static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000670 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000671 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000672 static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000673 {return char_type(__c);}
674 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000675 static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000676 {return int_type((unsigned char)__c);}
677 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000678 static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000679 {return __c1 == __c2;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000680 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000681 static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000682 {return int_type(EOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000683};
684
685// char_traits<wchar_t>
686
687template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000688struct _LIBCPP_TYPE_VIS_ONLY char_traits<wchar_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000689{
690 typedef wchar_t char_type;
691 typedef wint_t int_type;
692 typedef streamoff off_type;
693 typedef streampos pos_type;
694 typedef mbstate_t state_type;
695
Howard Hinnanta6119a82011-05-29 19:57:12 +0000696 _LIBCPP_INLINE_VISIBILITY
697 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
698 {__c1 = __c2;}
699 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000700 static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000701 {return __c1 == __c2;}
702 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000703 static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000704 {return __c1 < __c2;}
705
Howard Hinnanta6119a82011-05-29 19:57:12 +0000706 _LIBCPP_INLINE_VISIBILITY
707 static int compare(const char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000708 {return wmemcmp(__s1, __s2, __n);}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000709 _LIBCPP_INLINE_VISIBILITY
710 static size_t length(const char_type* __s)
711 {return wcslen(__s);}
712 _LIBCPP_INLINE_VISIBILITY
713 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000714 {return (const char_type*)wmemchr(__s, __a, __n);}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000715 _LIBCPP_INLINE_VISIBILITY
716 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000717 {return (char_type*)wmemmove(__s1, __s2, __n);}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000718 _LIBCPP_INLINE_VISIBILITY
719 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnant499cea12013-08-23 17:37:05 +0000720 {
721 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
722 return (char_type*)wmemcpy(__s1, __s2, __n);
723 }
Howard Hinnanta6119a82011-05-29 19:57:12 +0000724 _LIBCPP_INLINE_VISIBILITY
725 static char_type* assign(char_type* __s, size_t __n, char_type __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000726 {return (char_type*)wmemset(__s, __a, __n);}
727
Howard Hinnanta6119a82011-05-29 19:57:12 +0000728 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000729 static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000730 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000731 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000732 static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000733 {return char_type(__c);}
734 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000735 static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000736 {return int_type(__c);}
737 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000738 static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000739 {return __c1 == __c2;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000740 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000741 static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000742 {return int_type(WEOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000743};
744
745#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
746
747template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000748struct _LIBCPP_TYPE_VIS_ONLY char_traits<char16_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000749{
750 typedef char16_t char_type;
751 typedef uint_least16_t int_type;
752 typedef streamoff off_type;
753 typedef u16streampos pos_type;
754 typedef mbstate_t state_type;
755
Howard Hinnanta6119a82011-05-29 19:57:12 +0000756 _LIBCPP_INLINE_VISIBILITY
757 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
758 {__c1 = __c2;}
759 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000760 static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000761 {return __c1 == __c2;}
762 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000763 static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000764 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000765
766 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
767 static size_t length(const char_type* __s);
768 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
769 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
770 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
771 static char_type* assign(char_type* __s, size_t __n, char_type __a);
772
Howard Hinnanta6119a82011-05-29 19:57:12 +0000773 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000774 static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000775 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000776 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000777 static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000778 {return char_type(__c);}
779 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000780 static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000781 {return int_type(__c);}
782 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000783 static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000784 {return __c1 == __c2;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000785 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000786 static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000787 {return int_type(0xDFFF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000788};
789
790inline _LIBCPP_INLINE_VISIBILITY
791int
792char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
793{
794 for (; __n; --__n, ++__s1, ++__s2)
795 {
796 if (lt(*__s1, *__s2))
797 return -1;
798 if (lt(*__s2, *__s1))
799 return 1;
800 }
801 return 0;
802}
803
804inline _LIBCPP_INLINE_VISIBILITY
805size_t
806char_traits<char16_t>::length(const char_type* __s)
807{
808 size_t __len = 0;
809 for (; !eq(*__s, char_type(0)); ++__s)
810 ++__len;
811 return __len;
812}
813
814inline _LIBCPP_INLINE_VISIBILITY
815const char16_t*
816char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a)
817{
818 for (; __n; --__n)
819 {
820 if (eq(*__s, __a))
821 return __s;
822 ++__s;
823 }
824 return 0;
825}
826
827inline _LIBCPP_INLINE_VISIBILITY
828char16_t*
829char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
830{
831 char_type* __r = __s1;
832 if (__s1 < __s2)
833 {
834 for (; __n; --__n, ++__s1, ++__s2)
835 assign(*__s1, *__s2);
836 }
837 else if (__s2 < __s1)
838 {
839 __s1 += __n;
840 __s2 += __n;
841 for (; __n; --__n)
842 assign(*--__s1, *--__s2);
843 }
844 return __r;
845}
846
847inline _LIBCPP_INLINE_VISIBILITY
848char16_t*
849char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
850{
Howard Hinnant499cea12013-08-23 17:37:05 +0000851 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000852 char_type* __r = __s1;
853 for (; __n; --__n, ++__s1, ++__s2)
854 assign(*__s1, *__s2);
855 return __r;
856}
857
858inline _LIBCPP_INLINE_VISIBILITY
859char16_t*
860char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a)
861{
862 char_type* __r = __s;
863 for (; __n; --__n, ++__s)
864 assign(*__s, __a);
865 return __r;
866}
867
868template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000869struct _LIBCPP_TYPE_VIS_ONLY char_traits<char32_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000870{
871 typedef char32_t char_type;
872 typedef uint_least32_t int_type;
873 typedef streamoff off_type;
874 typedef u32streampos pos_type;
875 typedef mbstate_t state_type;
876
Howard Hinnanta6119a82011-05-29 19:57:12 +0000877 _LIBCPP_INLINE_VISIBILITY
878 static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
879 {__c1 = __c2;}
880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000881 static _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000882 {return __c1 == __c2;}
883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000884 static _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000885 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000886
887 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
888 static size_t length(const char_type* __s);
889 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
890 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
891 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
892 static char_type* assign(char_type* __s, size_t __n, char_type __a);
893
Howard Hinnanta6119a82011-05-29 19:57:12 +0000894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000895 static _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000896 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000897 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000898 static _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000899 {return char_type(__c);}
900 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000901 static _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000902 {return int_type(__c);}
903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000904 static _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000905 {return __c1 == __c2;}
Howard Hinnanta6119a82011-05-29 19:57:12 +0000906 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant03d71812012-07-20 19:09:12 +0000907 static _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000908 {return int_type(0xFFFFFFFF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000909};
910
911inline _LIBCPP_INLINE_VISIBILITY
912int
913char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
914{
915 for (; __n; --__n, ++__s1, ++__s2)
916 {
917 if (lt(*__s1, *__s2))
918 return -1;
919 if (lt(*__s2, *__s1))
920 return 1;
921 }
922 return 0;
923}
924
925inline _LIBCPP_INLINE_VISIBILITY
926size_t
927char_traits<char32_t>::length(const char_type* __s)
928{
929 size_t __len = 0;
930 for (; !eq(*__s, char_type(0)); ++__s)
931 ++__len;
932 return __len;
933}
934
935inline _LIBCPP_INLINE_VISIBILITY
936const char32_t*
937char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a)
938{
939 for (; __n; --__n)
940 {
941 if (eq(*__s, __a))
942 return __s;
943 ++__s;
944 }
945 return 0;
946}
947
948inline _LIBCPP_INLINE_VISIBILITY
949char32_t*
950char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
951{
952 char_type* __r = __s1;
953 if (__s1 < __s2)
954 {
955 for (; __n; --__n, ++__s1, ++__s2)
956 assign(*__s1, *__s2);
957 }
958 else if (__s2 < __s1)
959 {
960 __s1 += __n;
961 __s2 += __n;
962 for (; __n; --__n)
963 assign(*--__s1, *--__s2);
964 }
965 return __r;
966}
967
968inline _LIBCPP_INLINE_VISIBILITY
969char32_t*
970char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
971{
Howard Hinnant499cea12013-08-23 17:37:05 +0000972 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000973 char_type* __r = __s1;
974 for (; __n; --__n, ++__s1, ++__s2)
975 assign(*__s1, *__s2);
976 return __r;
977}
978
979inline _LIBCPP_INLINE_VISIBILITY
980char32_t*
981char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a)
982{
983 char_type* __r = __s;
984 for (; __n; --__n, ++__s)
985 assign(*__s, __a);
986 return __r;
987}
988
Howard Hinnant324bb032010-08-22 00:02:43 +0000989#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000990
Marshall Clowb671fc92013-12-09 16:00:28 +0000991// helper fns for basic_string
992
Marshall Clow37025e12014-06-10 18:51:55 +0000993// __str_find
Marshall Clowb671fc92013-12-09 16:00:28 +0000994template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +0000995_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +0000996__str_find(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +0000997 _CharT __c, _SizeT __pos) _NOEXCEPT
998{
999 if (__pos >= __sz)
1000 return __npos;
1001 const _CharT* __r = _Traits::find(__p + __pos, __sz - __pos, __c);
1002 if (__r == 0)
1003 return __npos;
1004 return static_cast<_SizeT>(__r - __p);
1005}
1006
1007template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1008_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001009__str_find(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001010 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1011{
1012 if (__pos > __sz || __sz - __pos < __n)
1013 return __npos;
1014 if (__n == 0)
1015 return __pos;
Marshall Clow360f3192014-06-02 02:22:49 +00001016 const _CharT* __r =
Marshall Clow37025e12014-06-10 18:51:55 +00001017 _VSTD::__search(__p + __pos, __p + __sz,
1018 __s, __s + __n, _Traits::eq,
1019 random_access_iterator_tag(), random_access_iterator_tag());
Marshall Clow360f3192014-06-02 02:22:49 +00001020 if (__r == __p + __sz)
1021 return __npos;
1022 return static_cast<_SizeT>(__r - __p);
1023}
1024
1025
Marshall Clow37025e12014-06-10 18:51:55 +00001026// __str_rfind
Marshall Clow360f3192014-06-02 02:22:49 +00001027
1028template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1029_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001030__str_rfind(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001031 _CharT __c, _SizeT __pos) _NOEXCEPT
1032{
1033 if (__sz < 1)
1034 return __npos;
1035 if (__pos < __sz)
1036 ++__pos;
1037 else
1038 __pos = __sz;
1039 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1040 {
1041 if (_Traits::eq(*--__ps, __c))
1042 return static_cast<_SizeT>(__ps - __p);
1043 }
1044 return __npos;
1045}
1046
1047template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1048_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001049__str_rfind(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001050 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1051{
1052 __pos = _VSTD::min(__pos, __sz);
1053 if (__n < __sz - __pos)
1054 __pos += __n;
1055 else
1056 __pos = __sz;
Marshall Clow37025e12014-06-10 18:51:55 +00001057 const _CharT* __r = _VSTD::__find_end(
1058 __p, __p + __pos, __s, __s + __n, _Traits::eq,
1059 random_access_iterator_tag(), random_access_iterator_tag());
Marshall Clow360f3192014-06-02 02:22:49 +00001060 if (__n > 0 && __r == __p + __pos)
1061 return __npos;
1062 return static_cast<_SizeT>(__r - __p);
1063}
1064
Marshall Clow37025e12014-06-10 18:51:55 +00001065// __str_find_first_of
Marshall Clow360f3192014-06-02 02:22:49 +00001066template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1067_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001068__str_find_first_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001069 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001070{
1071 if (__pos >= __sz || __n == 0)
1072 return __npos;
Marshall Clow37025e12014-06-10 18:51:55 +00001073 const _CharT* __r = _VSTD::__find_first_of_ce
Marshall Clowb671fc92013-12-09 16:00:28 +00001074 (__p + __pos, __p + __sz, __s, __s + __n, _Traits::eq );
1075 if (__r == __p + __sz)
1076 return __npos;
1077 return static_cast<_SizeT>(__r - __p);
1078}
1079
Marshall Clow360f3192014-06-02 02:22:49 +00001080
Marshall Clow37025e12014-06-10 18:51:55 +00001081// __str_find_last_of
Marshall Clowb671fc92013-12-09 16:00:28 +00001082template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001083_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001084__str_find_last_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001085 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001086 {
1087 if (__n != 0)
1088 {
1089 if (__pos < __sz)
1090 ++__pos;
1091 else
1092 __pos = __sz;
1093 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1094 {
1095 const _CharT* __r = _Traits::find(__s, __n, *--__ps);
1096 if (__r)
1097 return static_cast<_SizeT>(__ps - __p);
1098 }
1099 }
1100 return __npos;
1101}
1102
1103
Marshall Clow37025e12014-06-10 18:51:55 +00001104// __str_find_first_not_of
Marshall Clowb671fc92013-12-09 16:00:28 +00001105template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001106_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001107__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001108 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001109{
1110 if (__pos < __sz)
1111 {
1112 const _CharT* __pe = __p + __sz;
1113 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1114 if (_Traits::find(__s, __n, *__ps) == 0)
1115 return static_cast<_SizeT>(__ps - __p);
1116 }
1117 return __npos;
1118}
1119
1120
1121template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001122_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001123__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001124 _CharT __c, _SizeT __pos) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001125{
1126 if (__pos < __sz)
1127 {
1128 const _CharT* __pe = __p + __sz;
1129 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1130 if (!_Traits::eq(*__ps, __c))
1131 return static_cast<_SizeT>(__ps - __p);
1132 }
1133 return __npos;
1134}
1135
1136
Marshall Clow37025e12014-06-10 18:51:55 +00001137// __str_find_last_not_of
Marshall Clowb671fc92013-12-09 16:00:28 +00001138template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001139_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001140__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001141 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001142{
1143 if (__pos < __sz)
1144 ++__pos;
1145 else
1146 __pos = __sz;
1147 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1148 if (_Traits::find(__s, __n, *--__ps) == 0)
1149 return static_cast<_SizeT>(__ps - __p);
1150 return __npos;
1151}
1152
1153
1154template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001155_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001156__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001157 _CharT __c, _SizeT __pos) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001158{
1159 if (__pos < __sz)
1160 ++__pos;
1161 else
1162 __pos = __sz;
1163 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1164 if (!_Traits::eq(*--__ps, __c))
1165 return static_cast<_SizeT>(__ps - __p);
1166 return __npos;
1167}
1168
1169template<class _Ptr>
1170size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e)
1171{
1172 typedef typename iterator_traits<_Ptr>::value_type value_type;
1173 return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type));
1174}
1175
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001176// basic_string
1177
1178template<class _CharT, class _Traits, class _Allocator>
1179basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001180operator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
1181 const basic_string<_CharT, _Traits, _Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001182
1183template<class _CharT, class _Traits, class _Allocator>
1184basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001185operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001186
1187template<class _CharT, class _Traits, class _Allocator>
1188basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001189operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001190
1191template<class _CharT, class _Traits, class _Allocator>
1192basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001193operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001194
1195template<class _CharT, class _Traits, class _Allocator>
1196basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001197operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001198
1199template <bool>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001200class _LIBCPP_TYPE_VIS_ONLY __basic_string_common
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001201{
1202protected:
1203 void __throw_length_error() const;
1204 void __throw_out_of_range() const;
1205};
1206
1207template <bool __b>
1208void
1209__basic_string_common<__b>::__throw_length_error() const
1210{
1211#ifndef _LIBCPP_NO_EXCEPTIONS
1212 throw length_error("basic_string");
1213#else
1214 assert(!"basic_string length_error");
1215#endif
1216}
1217
1218template <bool __b>
1219void
1220__basic_string_common<__b>::__throw_out_of_range() const
1221{
1222#ifndef _LIBCPP_NO_EXCEPTIONS
1223 throw out_of_range("basic_string");
1224#else
1225 assert(!"basic_string out_of_range");
1226#endif
1227}
1228
Howard Hinnante9df0a52013-08-01 18:17:34 +00001229#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:45 +00001230#pragma warning( push )
1231#pragma warning( disable: 4231 )
Howard Hinnante9df0a52013-08-01 18:17:34 +00001232#endif // _LIBCPP_MSVC
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001233_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS __basic_string_common<true>)
Howard Hinnante9df0a52013-08-01 18:17:34 +00001234#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:45 +00001235#pragma warning( pop )
Howard Hinnante9df0a52013-08-01 18:17:34 +00001236#endif // _LIBCPP_MSVC
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001237
Howard Hinnant15467182013-04-30 21:44:48 +00001238#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT
1239
1240template <class _CharT, size_t = sizeof(_CharT)>
1241struct __padding
1242{
1243 unsigned char __xx[sizeof(_CharT)-1];
1244};
1245
1246template <class _CharT>
1247struct __padding<_CharT, 1>
1248{
1249};
1250
1251#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT
1252
Howard Hinnant324bb032010-08-22 00:02:43 +00001253template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001254class _LIBCPP_TYPE_VIS_ONLY basic_string
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001255 : private __basic_string_common<true>
1256{
1257public:
1258 typedef basic_string __self;
1259 typedef _Traits traits_type;
1260 typedef typename traits_type::char_type value_type;
1261 typedef _Allocator allocator_type;
Howard Hinnante32b5e22010-11-17 17:55:08 +00001262 typedef allocator_traits<allocator_type> __alloc_traits;
1263 typedef typename __alloc_traits::size_type size_type;
1264 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001265 typedef value_type& reference;
1266 typedef const value_type& const_reference;
Howard Hinnante32b5e22010-11-17 17:55:08 +00001267 typedef typename __alloc_traits::pointer pointer;
1268 typedef typename __alloc_traits::const_pointer const_pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001269
Howard Hinnant499cea12013-08-23 17:37:05 +00001270 static_assert(is_pod<value_type>::value, "Character type of basic_string must be a POD");
1271 static_assert((is_same<_CharT, value_type>::value),
1272 "traits_type::char_type must be the same type as CharT");
1273 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1274 "Allocator::value_type must be same type as value_type");
1275#if defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001276 typedef pointer iterator;
1277 typedef const_pointer const_iterator;
Howard Hinnant324bb032010-08-22 00:02:43 +00001278#else // defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001279 typedef __wrap_iter<pointer> iterator;
1280 typedef __wrap_iter<const_pointer> const_iterator;
Howard Hinnant324bb032010-08-22 00:02:43 +00001281#endif // defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001282 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1283 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001284
1285private:
Howard Hinnant15467182013-04-30 21:44:48 +00001286
1287#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT
1288
1289 struct __long
1290 {
1291 pointer __data_;
1292 size_type __size_;
1293 size_type __cap_;
1294 };
1295
1296#if _LIBCPP_BIG_ENDIAN
1297 enum {__short_mask = 0x01};
1298 enum {__long_mask = 0x1ul};
1299#else // _LIBCPP_BIG_ENDIAN
1300 enum {__short_mask = 0x80};
1301 enum {__long_mask = ~(size_type(~0) >> 1)};
1302#endif // _LIBCPP_BIG_ENDIAN
1303
1304 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1305 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1306
1307 struct __short
1308 {
1309 value_type __data_[__min_cap];
1310 struct
1311 : __padding<value_type>
1312 {
1313 unsigned char __size_;
1314 };
1315 };
1316
1317#else
1318
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001319 struct __long
1320 {
1321 size_type __cap_;
1322 size_type __size_;
1323 pointer __data_;
1324 };
1325
1326#if _LIBCPP_BIG_ENDIAN
1327 enum {__short_mask = 0x80};
1328 enum {__long_mask = ~(size_type(~0) >> 1)};
Howard Hinnant324bb032010-08-22 00:02:43 +00001329#else // _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001330 enum {__short_mask = 0x01};
Howard Hinnantec3773c2011-12-01 20:21:04 +00001331 enum {__long_mask = 0x1ul};
Howard Hinnant324bb032010-08-22 00:02:43 +00001332#endif // _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001333
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001334 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1335 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1336
1337 struct __short
1338 {
1339 union
1340 {
1341 unsigned char __size_;
Howard Hinnant9c0df142012-10-30 19:06:59 +00001342 value_type __lx;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001343 };
1344 value_type __data_[__min_cap];
1345 };
1346
Howard Hinnant15467182013-04-30 21:44:48 +00001347#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT
1348
Howard Hinnant499cea12013-08-23 17:37:05 +00001349 union __ulx{__long __lx; __short __lxx;};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001350
Howard Hinnant499cea12013-08-23 17:37:05 +00001351 enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001352
1353 struct __raw
1354 {
1355 size_type __words[__n_words];
1356 };
1357
1358 struct __rep
1359 {
1360 union
1361 {
1362 __long __l;
1363 __short __s;
1364 __raw __r;
1365 };
1366 };
1367
1368 __compressed_pair<__rep, allocator_type> __r_;
1369
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001370public:
1371 static const size_type npos = -1;
1372
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001373 _LIBCPP_INLINE_VISIBILITY basic_string()
1374 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001375 _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001376 basic_string(const basic_string& __str);
1377 basic_string(const basic_string& __str, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19 +00001378#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant9f193f22011-01-26 00:06:59 +00001379 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001380 basic_string(basic_string&& __str)
1381 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnant9f193f22011-01-26 00:06:59 +00001382 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001383 basic_string(basic_string&& __str, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19 +00001384#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001385 _LIBCPP_INLINE_VISIBILITY basic_string(const value_type* __s);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001386 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001387 basic_string(const value_type* __s, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001388 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001389 basic_string(const value_type* __s, size_type __n);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001390 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001391 basic_string(const value_type* __s, size_type __n, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001392 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001393 basic_string(size_type __n, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001394 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001395 basic_string(size_type __n, value_type __c, const allocator_type& __a);
1396 basic_string(const basic_string& __str, size_type __pos, size_type __n = npos,
1397 const allocator_type& __a = allocator_type());
1398 template<class _InputIterator>
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001399 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001400 basic_string(_InputIterator __first, _InputIterator __last);
1401 template<class _InputIterator>
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001402 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001403 basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +00001404#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001405 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001406 basic_string(initializer_list<value_type> __il);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001407 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001408 basic_string(initializer_list<value_type> __il, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +00001409#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001410
1411 ~basic_string();
1412
Howard Hinnante32b5e22010-11-17 17:55:08 +00001413 basic_string& operator=(const basic_string& __str);
Howard Hinnant73d21a42010-09-04 23:28:19 +00001414#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001415 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001416 basic_string& operator=(basic_string&& __str)
1417 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
1418 is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001419#endif
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001420 _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001421 basic_string& operator=(value_type __c);
Howard Hinnante3e32912011-08-12 21:56:02 +00001422#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001423 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001424 basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001425#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001426
Howard Hinnant499cea12013-08-23 17:37:05 +00001427#if _LIBCPP_DEBUG_LEVEL >= 2
1428 _LIBCPP_INLINE_VISIBILITY
1429 iterator begin() _NOEXCEPT
1430 {return iterator(this, __get_pointer());}
1431 _LIBCPP_INLINE_VISIBILITY
1432 const_iterator begin() const _NOEXCEPT
1433 {return const_iterator(this, __get_pointer());}
1434 _LIBCPP_INLINE_VISIBILITY
1435 iterator end() _NOEXCEPT
1436 {return iterator(this, __get_pointer() + size());}
1437 _LIBCPP_INLINE_VISIBILITY
1438 const_iterator end() const _NOEXCEPT
1439 {return const_iterator(this, __get_pointer() + size());}
1440#else
Howard Hinnanta6119a82011-05-29 19:57:12 +00001441 _LIBCPP_INLINE_VISIBILITY
1442 iterator begin() _NOEXCEPT
1443 {return iterator(__get_pointer());}
1444 _LIBCPP_INLINE_VISIBILITY
1445 const_iterator begin() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001446 {return const_iterator(__get_pointer());}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001447 _LIBCPP_INLINE_VISIBILITY
1448 iterator end() _NOEXCEPT
1449 {return iterator(__get_pointer() + size());}
1450 _LIBCPP_INLINE_VISIBILITY
1451 const_iterator end() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001452 {return const_iterator(__get_pointer() + size());}
Howard Hinnant499cea12013-08-23 17:37:05 +00001453#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnanta6119a82011-05-29 19:57:12 +00001454 _LIBCPP_INLINE_VISIBILITY
1455 reverse_iterator rbegin() _NOEXCEPT
1456 {return reverse_iterator(end());}
1457 _LIBCPP_INLINE_VISIBILITY
1458 const_reverse_iterator rbegin() const _NOEXCEPT
1459 {return const_reverse_iterator(end());}
1460 _LIBCPP_INLINE_VISIBILITY
1461 reverse_iterator rend() _NOEXCEPT
1462 {return reverse_iterator(begin());}
1463 _LIBCPP_INLINE_VISIBILITY
1464 const_reverse_iterator rend() const _NOEXCEPT
1465 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001466
Howard Hinnanta6119a82011-05-29 19:57:12 +00001467 _LIBCPP_INLINE_VISIBILITY
1468 const_iterator cbegin() const _NOEXCEPT
1469 {return begin();}
1470 _LIBCPP_INLINE_VISIBILITY
1471 const_iterator cend() const _NOEXCEPT
1472 {return end();}
1473 _LIBCPP_INLINE_VISIBILITY
1474 const_reverse_iterator crbegin() const _NOEXCEPT
1475 {return rbegin();}
1476 _LIBCPP_INLINE_VISIBILITY
1477 const_reverse_iterator crend() const _NOEXCEPT
1478 {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001479
Howard Hinnanta6119a82011-05-29 19:57:12 +00001480 _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001481 {return __is_long() ? __get_long_size() : __get_short_size();}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001482 _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
1483 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
1484 _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001485 {return (__is_long() ? __get_long_cap() : __min_cap) - 1;}
1486
1487 void resize(size_type __n, value_type __c);
1488 _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
1489
1490 void reserve(size_type res_arg = 0);
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001491 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001492 void shrink_to_fit() _NOEXCEPT {reserve();}
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001493 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001494 void clear() _NOEXCEPT;
1495 _LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001496
1497 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const;
1498 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos);
1499
1500 const_reference at(size_type __n) const;
1501 reference at(size_type __n);
1502
1503 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001504 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s) {return append(__s);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001505 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;}
Howard Hinnante3e32912011-08-12 21:56:02 +00001506#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001507 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
Howard Hinnante3e32912011-08-12 21:56:02 +00001508#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001509
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001510 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001511 basic_string& append(const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:19 +00001512 basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001513 basic_string& append(const value_type* __s, size_type __n);
1514 basic_string& append(const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001515 basic_string& append(size_type __n, value_type __c);
1516 template<class _InputIterator>
1517 typename enable_if
1518 <
1519 __is_input_iterator <_InputIterator>::value &&
1520 !__is_forward_iterator<_InputIterator>::value,
1521 basic_string&
1522 >::type
1523 append(_InputIterator __first, _InputIterator __last);
1524 template<class _ForwardIterator>
1525 typename enable_if
1526 <
1527 __is_forward_iterator<_ForwardIterator>::value,
1528 basic_string&
1529 >::type
1530 append(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001531#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001532 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001533 basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001534#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001535
1536 void push_back(value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001537 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001538 void pop_back();
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001539 _LIBCPP_INLINE_VISIBILITY reference front();
1540 _LIBCPP_INLINE_VISIBILITY const_reference front() const;
1541 _LIBCPP_INLINE_VISIBILITY reference back();
1542 _LIBCPP_INLINE_VISIBILITY const_reference back() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001543
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001544 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001545 basic_string& assign(const basic_string& __str);
Howard Hinnanta6119a82011-05-29 19:57:12 +00001546#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1547 _LIBCPP_INLINE_VISIBILITY
1548 basic_string& assign(basic_string&& str)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001549 {*this = _VSTD::move(str); return *this;}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001550#endif
Marshall Clowa93b5e22014-03-04 19:17:19 +00001551 basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001552 basic_string& assign(const value_type* __s, size_type __n);
1553 basic_string& assign(const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001554 basic_string& assign(size_type __n, value_type __c);
1555 template<class _InputIterator>
1556 typename enable_if
1557 <
1558 __is_input_iterator <_InputIterator>::value &&
1559 !__is_forward_iterator<_InputIterator>::value,
1560 basic_string&
1561 >::type
1562 assign(_InputIterator __first, _InputIterator __last);
1563 template<class _ForwardIterator>
1564 typename enable_if
1565 <
1566 __is_forward_iterator<_ForwardIterator>::value,
1567 basic_string&
1568 >::type
1569 assign(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001570#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001572 basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001573#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001574
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001575 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001576 basic_string& insert(size_type __pos1, const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:19 +00001577 basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001578 basic_string& insert(size_type __pos, const value_type* __s, size_type __n);
1579 basic_string& insert(size_type __pos, const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001580 basic_string& insert(size_type __pos, size_type __n, value_type __c);
1581 iterator insert(const_iterator __pos, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001583 iterator insert(const_iterator __pos, size_type __n, value_type __c);
1584 template<class _InputIterator>
1585 typename enable_if
1586 <
1587 __is_input_iterator <_InputIterator>::value &&
1588 !__is_forward_iterator<_InputIterator>::value,
1589 iterator
1590 >::type
1591 insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
1592 template<class _ForwardIterator>
1593 typename enable_if
1594 <
1595 __is_forward_iterator<_ForwardIterator>::value,
1596 iterator
1597 >::type
1598 insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001599#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001600 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001601 iterator insert(const_iterator __pos, initializer_list<value_type> __il)
1602 {return insert(__pos, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001603#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001604
1605 basic_string& erase(size_type __pos = 0, size_type __n = npos);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001606 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001607 iterator erase(const_iterator __pos);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001608 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001609 iterator erase(const_iterator __first, const_iterator __last);
1610
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001611 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001612 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:19 +00001613 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 +00001614 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
1615 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001616 basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001618 basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001619 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001620 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001621 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001622 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001624 basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001625 template<class _InputIterator>
1626 typename enable_if
1627 <
1628 __is_input_iterator<_InputIterator>::value,
1629 basic_string&
1630 >::type
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001631 replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
Howard Hinnante3e32912011-08-12 21:56:02 +00001632#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001634 basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001635 {return replace(__i1, __i2, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001636#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001637
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001638 size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001639 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001640 basic_string substr(size_type __pos = 0, size_type __n = npos) const;
1641
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001642 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001643 void swap(basic_string& __str)
1644 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1645 __is_nothrow_swappable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001646
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001647 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001648 const value_type* c_str() const _NOEXCEPT {return data();}
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001649 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001650 const value_type* data() const _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001651
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001652 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001653 allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001654
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001655 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001656 size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001657 size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001658 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001659 size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001660 size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001661
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001662 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001663 size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001664 size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001665 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001666 size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001667 size_type rfind(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_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001671 size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001672 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001673 size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001674 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001675 size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001676
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001677 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001678 size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001679 size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001680 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001681 size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001682 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001683 size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001684
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001685 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001686 size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001687 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 +00001688 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001689 size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001690 _LIBCPP_INLINE_VISIBILITY
1691 size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1692
1693 _LIBCPP_INLINE_VISIBILITY
1694 size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001695 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 +00001696 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001697 size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001698 _LIBCPP_INLINE_VISIBILITY
1699 size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1700
1701 _LIBCPP_INLINE_VISIBILITY
1702 int compare(const basic_string& __str) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001703 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001704 int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
Marshall Clowa93b5e22014-03-04 19:17:19 +00001705 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 +00001706 int compare(const value_type* __s) const _NOEXCEPT;
1707 int compare(size_type __pos1, size_type __n1, const value_type* __s) const;
1708 int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001709
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001710 _LIBCPP_INLINE_VISIBILITY bool __invariants() const;
Howard Hinnant08dd2532013-04-22 23:55:13 +00001711
1712 _LIBCPP_INLINE_VISIBILITY
1713 bool __is_long() const _NOEXCEPT
1714 {return bool(__r_.first().__s.__size_ & __short_mask);}
1715
Howard Hinnant499cea12013-08-23 17:37:05 +00001716#if _LIBCPP_DEBUG_LEVEL >= 2
1717
1718 bool __dereferenceable(const const_iterator* __i) const;
1719 bool __decrementable(const const_iterator* __i) const;
1720 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
1721 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
1722
1723#endif // _LIBCPP_DEBUG_LEVEL >= 2
1724
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001725private:
Howard Hinnanta6119a82011-05-29 19:57:12 +00001726 _LIBCPP_INLINE_VISIBILITY
1727 allocator_type& __alloc() _NOEXCEPT
1728 {return __r_.second();}
1729 _LIBCPP_INLINE_VISIBILITY
1730 const allocator_type& __alloc() const _NOEXCEPT
1731 {return __r_.second();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001732
Howard Hinnant15467182013-04-30 21:44:48 +00001733#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT
1734
Howard Hinnanta6119a82011-05-29 19:57:12 +00001735 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001736 void __set_short_size(size_type __s) _NOEXCEPT
Howard Hinnant15467182013-04-30 21:44:48 +00001737# if _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001738 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
Howard Hinnant15467182013-04-30 21:44:48 +00001739# else
1740 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1741# endif
1742
Howard Hinnanta6119a82011-05-29 19:57:12 +00001743 _LIBCPP_INLINE_VISIBILITY
1744 size_type __get_short_size() const _NOEXCEPT
Howard Hinnant15467182013-04-30 21:44:48 +00001745# if _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001746 {return __r_.first().__s.__size_ >> 1;}
Howard Hinnant15467182013-04-30 21:44:48 +00001747# else
1748 {return __r_.first().__s.__size_;}
1749# endif
1750
1751#else // _LIBCPP_ALTERNATE_STRING_LAYOUT
1752
1753 _LIBCPP_INLINE_VISIBILITY
1754 void __set_short_size(size_type __s) _NOEXCEPT
1755# if _LIBCPP_BIG_ENDIAN
1756 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1757# else
1758 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
1759# endif
1760
1761 _LIBCPP_INLINE_VISIBILITY
1762 size_type __get_short_size() const _NOEXCEPT
1763# if _LIBCPP_BIG_ENDIAN
1764 {return __r_.first().__s.__size_;}
1765# else
1766 {return __r_.first().__s.__size_ >> 1;}
1767# endif
1768
1769#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT
1770
Howard Hinnanta6119a82011-05-29 19:57:12 +00001771 _LIBCPP_INLINE_VISIBILITY
1772 void __set_long_size(size_type __s) _NOEXCEPT
1773 {__r_.first().__l.__size_ = __s;}
1774 _LIBCPP_INLINE_VISIBILITY
1775 size_type __get_long_size() const _NOEXCEPT
1776 {return __r_.first().__l.__size_;}
1777 _LIBCPP_INLINE_VISIBILITY
1778 void __set_size(size_type __s) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001779 {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
1780
Howard Hinnanta6119a82011-05-29 19:57:12 +00001781 _LIBCPP_INLINE_VISIBILITY
1782 void __set_long_cap(size_type __s) _NOEXCEPT
1783 {__r_.first().__l.__cap_ = __long_mask | __s;}
1784 _LIBCPP_INLINE_VISIBILITY
1785 size_type __get_long_cap() const _NOEXCEPT
Howard Hinnantec3773c2011-12-01 20:21:04 +00001786 {return __r_.first().__l.__cap_ & size_type(~__long_mask);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001787
Howard Hinnanta6119a82011-05-29 19:57:12 +00001788 _LIBCPP_INLINE_VISIBILITY
1789 void __set_long_pointer(pointer __p) _NOEXCEPT
1790 {__r_.first().__l.__data_ = __p;}
1791 _LIBCPP_INLINE_VISIBILITY
1792 pointer __get_long_pointer() _NOEXCEPT
1793 {return __r_.first().__l.__data_;}
1794 _LIBCPP_INLINE_VISIBILITY
1795 const_pointer __get_long_pointer() const _NOEXCEPT
1796 {return __r_.first().__l.__data_;}
1797 _LIBCPP_INLINE_VISIBILITY
1798 pointer __get_short_pointer() _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001799 {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001800 _LIBCPP_INLINE_VISIBILITY
1801 const_pointer __get_short_pointer() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001802 {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001803 _LIBCPP_INLINE_VISIBILITY
1804 pointer __get_pointer() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001805 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001806 _LIBCPP_INLINE_VISIBILITY
1807 const_pointer __get_pointer() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001808 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
1809
Howard Hinnanta6119a82011-05-29 19:57:12 +00001810 _LIBCPP_INLINE_VISIBILITY
1811 void __zero() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001812 {
1813 size_type (&__a)[__n_words] = __r_.first().__r.__words;
1814 for (unsigned __i = 0; __i < __n_words; ++__i)
1815 __a[__i] = 0;
1816 }
1817
1818 template <size_type __a> static
Howard Hinnanta6119a82011-05-29 19:57:12 +00001819 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7f764502013-08-14 18:00:20 +00001820 size_type __align_it(size_type __s) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +00001821 {return __s + (__a-1) & ~(__a-1);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001822 enum {__alignment = 16};
Howard Hinnanta6119a82011-05-29 19:57:12 +00001823 static _LIBCPP_INLINE_VISIBILITY
1824 size_type __recommend(size_type __s) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001825 {return (__s < __min_cap ? __min_cap :
Howard Hinnant7f764502013-08-14 18:00:20 +00001826 __align_it<sizeof(value_type) < __alignment ?
Howard Hinnanta6119a82011-05-29 19:57:12 +00001827 __alignment/sizeof(value_type) : 1 > (__s+1)) - 1;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001828
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001829 void __init(const value_type* __s, size_type __sz, size_type __reserve);
1830 void __init(const value_type* __s, size_type __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001831 void __init(size_type __n, value_type __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00001832
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001833 template <class _InputIterator>
1834 typename enable_if
1835 <
1836 __is_input_iterator <_InputIterator>::value &&
1837 !__is_forward_iterator<_InputIterator>::value,
1838 void
1839 >::type
1840 __init(_InputIterator __first, _InputIterator __last);
1841
1842 template <class _ForwardIterator>
1843 typename enable_if
1844 <
1845 __is_forward_iterator<_ForwardIterator>::value,
1846 void
1847 >::type
1848 __init(_ForwardIterator __first, _ForwardIterator __last);
1849
1850 void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnant324bb032010-08-22 00:02:43 +00001851 size_type __n_copy, size_type __n_del, size_type __n_add = 0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001852 void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1853 size_type __n_copy, size_type __n_del,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001854 size_type __n_add, const value_type* __p_new_stuff);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001855
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001856 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001857 void __erase_to_end(size_type __pos);
1858
Howard Hinnante32b5e22010-11-17 17:55:08 +00001859 _LIBCPP_INLINE_VISIBILITY
1860 void __copy_assign_alloc(const basic_string& __str)
1861 {__copy_assign_alloc(__str, integral_constant<bool,
1862 __alloc_traits::propagate_on_container_copy_assignment::value>());}
1863
1864 _LIBCPP_INLINE_VISIBILITY
1865 void __copy_assign_alloc(const basic_string& __str, true_type)
1866 {
1867 if (__alloc() != __str.__alloc())
1868 {
1869 clear();
1870 shrink_to_fit();
1871 }
1872 __alloc() = __str.__alloc();
1873 }
1874
1875 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00001876 void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
Howard Hinnante32b5e22010-11-17 17:55:08 +00001877 {}
1878
1879#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:08 +00001881 void __move_assign(basic_string& __str, false_type);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001882 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001883 void __move_assign(basic_string& __str, true_type)
1884 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnante32b5e22010-11-17 17:55:08 +00001885#endif
1886
1887 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001888 void
Howard Hinnant9cbee432011-09-02 20:42:31 +00001889 __move_assign_alloc(basic_string& __str)
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001890 _NOEXCEPT_(
1891 !__alloc_traits::propagate_on_container_move_assignment::value ||
1892 is_nothrow_move_assignable<allocator_type>::value)
1893 {__move_assign_alloc(__str, integral_constant<bool,
1894 __alloc_traits::propagate_on_container_move_assignment::value>());}
1895
1896 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9cbee432011-09-02 20:42:31 +00001897 void __move_assign_alloc(basic_string& __c, true_type)
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001898 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1899 {
1900 __alloc() = _VSTD::move(__c.__alloc());
1901 }
1902
1903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00001904 void __move_assign_alloc(basic_string&, false_type)
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001905 _NOEXCEPT
1906 {}
1907
1908 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001909 static void __swap_alloc(allocator_type& __x, allocator_type& __y)
1910 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1911 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnante32b5e22010-11-17 17:55:08 +00001912 {__swap_alloc(__x, __y, integral_constant<bool,
1913 __alloc_traits::propagate_on_container_swap::value>());}
1914
1915 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001916 static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type)
1917 _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value)
Howard Hinnante32b5e22010-11-17 17:55:08 +00001918 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00001919 using _VSTD::swap;
Howard Hinnante32b5e22010-11-17 17:55:08 +00001920 swap(__x, __y);
1921 }
1922 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00001923 static void __swap_alloc(allocator_type&, allocator_type&, false_type) _NOEXCEPT
Howard Hinnante32b5e22010-11-17 17:55:08 +00001924 {}
1925
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001926 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
1927 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001928
1929 friend basic_string operator+<>(const basic_string&, const basic_string&);
1930 friend basic_string operator+<>(const value_type*, const basic_string&);
1931 friend basic_string operator+<>(value_type, const basic_string&);
1932 friend basic_string operator+<>(const basic_string&, const value_type*);
1933 friend basic_string operator+<>(const basic_string&, value_type);
1934};
1935
1936template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001937inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001938void
1939basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators()
1940{
Howard Hinnant499cea12013-08-23 17:37:05 +00001941#if _LIBCPP_DEBUG_LEVEL >= 2
1942 __get_db()->__invalidate_all(this);
1943#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001944}
1945
1946template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001947inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001948void
Howard Hinnantec3773c2011-12-01 20:21:04 +00001949basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type
Howard Hinnant499cea12013-08-23 17:37:05 +00001950#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantec3773c2011-12-01 20:21:04 +00001951 __pos
1952#endif
1953 )
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001954{
Howard Hinnant499cea12013-08-23 17:37:05 +00001955#if _LIBCPP_DEBUG_LEVEL >= 2
1956 __c_node* __c = __get_db()->__find_c_and_lock(this);
1957 if (__c)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001958 {
Howard Hinnant499cea12013-08-23 17:37:05 +00001959 const_pointer __new_last = __get_pointer() + __pos;
1960 for (__i_node** __p = __c->end_; __p != __c->beg_; )
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001961 {
Howard Hinnant499cea12013-08-23 17:37:05 +00001962 --__p;
1963 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
1964 if (__i->base() > __new_last)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001965 {
Howard Hinnant499cea12013-08-23 17:37:05 +00001966 (*__p)->__c_ = nullptr;
1967 if (--__c->end_ != __p)
1968 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001969 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001970 }
Howard Hinnant499cea12013-08-23 17:37:05 +00001971 __get_db()->unlock();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001972 }
Howard Hinnant499cea12013-08-23 17:37:05 +00001973#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001974}
1975
1976template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001977inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001978basic_string<_CharT, _Traits, _Allocator>::basic_string()
1979 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001980{
Howard Hinnant499cea12013-08-23 17:37:05 +00001981#if _LIBCPP_DEBUG_LEVEL >= 2
1982 __get_db()->__insert_c(this);
1983#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001984 __zero();
1985}
1986
1987template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001988inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001989basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
1990 : __r_(__a)
1991{
Howard Hinnant499cea12013-08-23 17:37:05 +00001992#if _LIBCPP_DEBUG_LEVEL >= 2
1993 __get_db()->__insert_c(this);
1994#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001995 __zero();
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, size_type __reserve)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002001{
2002 if (__reserve > max_size())
2003 this->__throw_length_error();
2004 pointer __p;
2005 if (__reserve < __min_cap)
2006 {
2007 __set_short_size(__sz);
2008 __p = __get_short_pointer();
2009 }
2010 else
2011 {
2012 size_type __cap = __recommend(__reserve);
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>
2023void
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002024basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002025{
2026 if (__sz > max_size())
2027 this->__throw_length_error();
2028 pointer __p;
2029 if (__sz < __min_cap)
2030 {
2031 __set_short_size(__sz);
2032 __p = __get_short_pointer();
2033 }
2034 else
2035 {
2036 size_type __cap = __recommend(__sz);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002037 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002038 __set_long_pointer(__p);
2039 __set_long_cap(__cap+1);
2040 __set_long_size(__sz);
2041 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002042 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002043 traits_type::assign(__p[__sz], value_type());
2044}
2045
2046template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002047inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002048basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002049{
Howard Hinnant499cea12013-08-23 17:37:05 +00002050 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002051 __init(__s, traits_type::length(__s));
Howard Hinnant499cea12013-08-23 17:37:05 +00002052#if _LIBCPP_DEBUG_LEVEL >= 2
2053 __get_db()->__insert_c(this);
2054#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002055}
2056
2057template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002058inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002059basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002060 : __r_(__a)
2061{
Howard Hinnant499cea12013-08-23 17:37:05 +00002062 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002063 __init(__s, traits_type::length(__s));
Howard Hinnant499cea12013-08-23 17:37:05 +00002064#if _LIBCPP_DEBUG_LEVEL >= 2
2065 __get_db()->__insert_c(this);
2066#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002067}
2068
2069template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002070inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002071basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002072{
Howard Hinnant499cea12013-08-23 17:37:05 +00002073 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002074 __init(__s, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +00002075#if _LIBCPP_DEBUG_LEVEL >= 2
2076 __get_db()->__insert_c(this);
2077#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002078}
2079
2080template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002081inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002082basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002083 : __r_(__a)
2084{
Howard Hinnant499cea12013-08-23 17:37:05 +00002085 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002086 __init(__s, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +00002087#if _LIBCPP_DEBUG_LEVEL >= 2
2088 __get_db()->__insert_c(this);
2089#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002090}
2091
2092template <class _CharT, class _Traits, class _Allocator>
2093basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002094 : __r_(__alloc_traits::select_on_container_copy_construction(__str.__alloc()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002095{
2096 if (!__str.__is_long())
2097 __r_.first().__r = __str.__r_.first().__r;
2098 else
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002099 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Howard Hinnant499cea12013-08-23 17:37:05 +00002100#if _LIBCPP_DEBUG_LEVEL >= 2
2101 __get_db()->__insert_c(this);
2102#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002103}
2104
2105template <class _CharT, class _Traits, class _Allocator>
2106basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, const allocator_type& __a)
2107 : __r_(__a)
2108{
2109 if (!__str.__is_long())
2110 __r_.first().__r = __str.__r_.first().__r;
2111 else
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002112 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Howard Hinnant499cea12013-08-23 17:37:05 +00002113#if _LIBCPP_DEBUG_LEVEL >= 2
2114 __get_db()->__insert_c(this);
2115#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002116}
2117
Howard Hinnant73d21a42010-09-04 23:28:19 +00002118#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002119
2120template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002121inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00002122basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str)
2123 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Howard Hinnant0949eed2011-06-30 21:18:19 +00002124 : __r_(_VSTD::move(__str.__r_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002125{
2126 __str.__zero();
Howard Hinnant499cea12013-08-23 17:37:05 +00002127#if _LIBCPP_DEBUG_LEVEL >= 2
2128 __get_db()->__insert_c(this);
2129 if (__is_long())
2130 __get_db()->swap(this, &__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002131#endif
2132}
2133
2134template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002135inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002136basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002137 : __r_(__a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002138{
Howard Hinnante32b5e22010-11-17 17:55:08 +00002139 if (__a == __str.__alloc() || !__str.__is_long())
2140 __r_.first().__r = __str.__r_.first().__r;
2141 else
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002142 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002143 __str.__zero();
Howard Hinnant499cea12013-08-23 17:37:05 +00002144#if _LIBCPP_DEBUG_LEVEL >= 2
2145 __get_db()->__insert_c(this);
2146 if (__is_long())
2147 __get_db()->swap(this, &__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002148#endif
2149}
2150
Howard Hinnant73d21a42010-09-04 23:28:19 +00002151#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002152
2153template <class _CharT, class _Traits, class _Allocator>
2154void
2155basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
2156{
2157 if (__n > max_size())
2158 this->__throw_length_error();
2159 pointer __p;
2160 if (__n < __min_cap)
2161 {
2162 __set_short_size(__n);
2163 __p = __get_short_pointer();
2164 }
2165 else
2166 {
2167 size_type __cap = __recommend(__n);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002168 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002169 __set_long_pointer(__p);
2170 __set_long_cap(__cap+1);
2171 __set_long_size(__n);
2172 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002173 traits_type::assign(_VSTD::__to_raw_pointer(__p), __n, __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002174 traits_type::assign(__p[__n], value_type());
2175}
2176
2177template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002178inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002179basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c)
2180{
2181 __init(__n, __c);
Howard Hinnant499cea12013-08-23 17:37:05 +00002182#if _LIBCPP_DEBUG_LEVEL >= 2
2183 __get_db()->__insert_c(this);
2184#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002185}
2186
2187template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002188inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002189basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c, const allocator_type& __a)
2190 : __r_(__a)
2191{
2192 __init(__n, __c);
Howard Hinnant499cea12013-08-23 17:37:05 +00002193#if _LIBCPP_DEBUG_LEVEL >= 2
2194 __get_db()->__insert_c(this);
2195#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002196}
2197
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002198template <class _CharT, class _Traits, class _Allocator>
2199basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, size_type __n,
2200 const allocator_type& __a)
2201 : __r_(__a)
2202{
2203 size_type __str_sz = __str.size();
2204 if (__pos > __str_sz)
2205 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002206 __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos));
Howard Hinnant499cea12013-08-23 17:37:05 +00002207#if _LIBCPP_DEBUG_LEVEL >= 2
2208 __get_db()->__insert_c(this);
2209#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002210}
2211
2212template <class _CharT, class _Traits, class _Allocator>
2213template <class _InputIterator>
2214typename enable_if
2215<
2216 __is_input_iterator <_InputIterator>::value &&
2217 !__is_forward_iterator<_InputIterator>::value,
2218 void
2219>::type
2220basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
2221{
2222 __zero();
2223#ifndef _LIBCPP_NO_EXCEPTIONS
2224 try
2225 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002226#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002227 for (; __first != __last; ++__first)
2228 push_back(*__first);
2229#ifndef _LIBCPP_NO_EXCEPTIONS
2230 }
2231 catch (...)
2232 {
2233 if (__is_long())
Howard Hinnante32b5e22010-11-17 17:55:08 +00002234 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002235 throw;
2236 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002237#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002238}
2239
2240template <class _CharT, class _Traits, class _Allocator>
2241template <class _ForwardIterator>
2242typename enable_if
2243<
2244 __is_forward_iterator<_ForwardIterator>::value,
2245 void
2246>::type
2247basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
2248{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002249 size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002250 if (__sz > max_size())
2251 this->__throw_length_error();
2252 pointer __p;
2253 if (__sz < __min_cap)
2254 {
2255 __set_short_size(__sz);
2256 __p = __get_short_pointer();
2257 }
2258 else
2259 {
2260 size_type __cap = __recommend(__sz);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002261 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002262 __set_long_pointer(__p);
2263 __set_long_cap(__cap+1);
2264 __set_long_size(__sz);
2265 }
2266 for (; __first != __last; ++__first, ++__p)
2267 traits_type::assign(*__p, *__first);
2268 traits_type::assign(*__p, value_type());
2269}
2270
2271template <class _CharT, class _Traits, class _Allocator>
2272template<class _InputIterator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002273inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002274basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last)
2275{
2276 __init(__first, __last);
Howard Hinnant499cea12013-08-23 17:37:05 +00002277#if _LIBCPP_DEBUG_LEVEL >= 2
2278 __get_db()->__insert_c(this);
2279#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002280}
2281
2282template <class _CharT, class _Traits, class _Allocator>
2283template<class _InputIterator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002284inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002285basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last,
2286 const allocator_type& __a)
2287 : __r_(__a)
2288{
2289 __init(__first, __last);
Howard Hinnant499cea12013-08-23 17:37:05 +00002290#if _LIBCPP_DEBUG_LEVEL >= 2
2291 __get_db()->__insert_c(this);
2292#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002293}
2294
Howard Hinnante3e32912011-08-12 21:56:02 +00002295#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2296
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002297template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002298inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002299basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il)
2300{
2301 __init(__il.begin(), __il.end());
Howard Hinnant499cea12013-08-23 17:37:05 +00002302#if _LIBCPP_DEBUG_LEVEL >= 2
2303 __get_db()->__insert_c(this);
2304#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002305}
2306
2307template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002308inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002309basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il, const allocator_type& __a)
2310 : __r_(__a)
2311{
2312 __init(__il.begin(), __il.end());
Howard Hinnant499cea12013-08-23 17:37:05 +00002313#if _LIBCPP_DEBUG_LEVEL >= 2
2314 __get_db()->__insert_c(this);
2315#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002316}
2317
Howard Hinnante3e32912011-08-12 21:56:02 +00002318#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2319
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002320template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002321basic_string<_CharT, _Traits, _Allocator>::~basic_string()
2322{
Howard Hinnant499cea12013-08-23 17:37:05 +00002323#if _LIBCPP_DEBUG_LEVEL >= 2
2324 __get_db()->__erase_c(this);
2325#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002326 if (__is_long())
Howard Hinnante32b5e22010-11-17 17:55:08 +00002327 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002328}
2329
2330template <class _CharT, class _Traits, class _Allocator>
2331void
2332basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
2333 (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002334 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 +00002335{
2336 size_type __ms = max_size();
2337 if (__delta_cap > __ms - __old_cap - 1)
2338 this->__throw_length_error();
2339 pointer __old_p = __get_pointer();
2340 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Howard Hinnant0949eed2011-06-30 21:18:19 +00002341 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002342 __ms - 1;
Howard Hinnante32b5e22010-11-17 17:55:08 +00002343 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002344 __invalidate_all_iterators();
2345 if (__n_copy != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002346 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2347 _VSTD::__to_raw_pointer(__old_p), __n_copy);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002348 if (__n_add != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002349 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy, __p_new_stuff, __n_add);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002350 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2351 if (__sec_cp_sz != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002352 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2353 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del, __sec_cp_sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002354 if (__old_cap+1 != __min_cap)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002355 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002356 __set_long_pointer(__p);
2357 __set_long_cap(__cap+1);
2358 __old_sz = __n_copy + __n_add + __sec_cp_sz;
2359 __set_long_size(__old_sz);
2360 traits_type::assign(__p[__old_sz], value_type());
2361}
2362
2363template <class _CharT, class _Traits, class _Allocator>
2364void
2365basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2366 size_type __n_copy, size_type __n_del, size_type __n_add)
2367{
2368 size_type __ms = max_size();
Marshall Clowecc8d7b2013-11-06 14:24:38 +00002369 if (__delta_cap > __ms - __old_cap)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002370 this->__throw_length_error();
2371 pointer __old_p = __get_pointer();
2372 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Howard Hinnant0949eed2011-06-30 21:18:19 +00002373 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002374 __ms - 1;
Howard Hinnante32b5e22010-11-17 17:55:08 +00002375 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002376 __invalidate_all_iterators();
2377 if (__n_copy != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002378 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2379 _VSTD::__to_raw_pointer(__old_p), __n_copy);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002380 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2381 if (__sec_cp_sz != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002382 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2383 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del,
2384 __sec_cp_sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002385 if (__old_cap+1 != __min_cap)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002386 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002387 __set_long_pointer(__p);
2388 __set_long_cap(__cap+1);
2389}
2390
2391// assign
2392
2393template <class _CharT, class _Traits, class _Allocator>
2394basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002395basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002396{
Alp Tokerec34c482014-05-15 11:27:39 +00002397 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002398 size_type __cap = capacity();
2399 if (__cap >= __n)
2400 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002401 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002402 traits_type::move(__p, __s, __n);
2403 traits_type::assign(__p[__n], value_type());
2404 __set_size(__n);
2405 __invalidate_iterators_past(__n);
2406 }
2407 else
2408 {
2409 size_type __sz = size();
2410 __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
2411 }
2412 return *this;
2413}
2414
2415template <class _CharT, class _Traits, class _Allocator>
2416basic_string<_CharT, _Traits, _Allocator>&
2417basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
2418{
2419 size_type __cap = capacity();
2420 if (__cap < __n)
2421 {
2422 size_type __sz = size();
2423 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2424 }
2425 else
2426 __invalidate_iterators_past(__n);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002427 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002428 traits_type::assign(__p, __n, __c);
2429 traits_type::assign(__p[__n], value_type());
2430 __set_size(__n);
2431 return *this;
2432}
2433
2434template <class _CharT, class _Traits, class _Allocator>
2435basic_string<_CharT, _Traits, _Allocator>&
2436basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
2437{
2438 pointer __p;
2439 if (__is_long())
2440 {
2441 __p = __get_long_pointer();
2442 __set_long_size(1);
2443 }
2444 else
2445 {
2446 __p = __get_short_pointer();
2447 __set_short_size(1);
2448 }
2449 traits_type::assign(*__p, __c);
2450 traits_type::assign(*++__p, value_type());
2451 __invalidate_iterators_past(1);
2452 return *this;
2453}
2454
2455template <class _CharT, class _Traits, class _Allocator>
Howard Hinnante32b5e22010-11-17 17:55:08 +00002456basic_string<_CharT, _Traits, _Allocator>&
2457basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
2458{
2459 if (this != &__str)
2460 {
2461 __copy_assign_alloc(__str);
2462 assign(__str);
2463 }
2464 return *this;
2465}
2466
2467#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2468
2469template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002470inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:08 +00002471void
2472basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
2473{
2474 if (__alloc() != __str.__alloc())
2475 assign(__str);
2476 else
2477 __move_assign(__str, true_type());
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 +00002482void
2483basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00002484 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002485{
2486 clear();
2487 shrink_to_fit();
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00002488 __r_.first() = __str.__r_.first();
2489 __move_assign_alloc(__str);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002490 __str.__zero();
2491}
2492
2493template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002494inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:08 +00002495basic_string<_CharT, _Traits, _Allocator>&
2496basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str)
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00002497 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
2498 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002499{
2500 __move_assign(__str, integral_constant<bool,
2501 __alloc_traits::propagate_on_container_move_assignment::value>());
2502 return *this;
2503}
2504
2505#endif
2506
2507template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002508template<class _InputIterator>
2509typename enable_if
2510<
2511 __is_input_iterator <_InputIterator>::value &&
2512 !__is_forward_iterator<_InputIterator>::value,
2513 basic_string<_CharT, _Traits, _Allocator>&
2514>::type
2515basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2516{
2517 clear();
2518 for (; __first != __last; ++__first)
2519 push_back(*__first);
Argyrios Kyrtzidis1dc6f7a2012-10-13 02:03:45 +00002520 return *this;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002521}
2522
2523template <class _CharT, class _Traits, class _Allocator>
2524template<class _ForwardIterator>
2525typename enable_if
2526<
2527 __is_forward_iterator<_ForwardIterator>::value,
2528 basic_string<_CharT, _Traits, _Allocator>&
2529>::type
2530basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2531{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002532 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002533 size_type __cap = capacity();
2534 if (__cap < __n)
2535 {
2536 size_type __sz = size();
2537 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2538 }
2539 else
2540 __invalidate_iterators_past(__n);
2541 pointer __p = __get_pointer();
2542 for (; __first != __last; ++__first, ++__p)
2543 traits_type::assign(*__p, *__first);
2544 traits_type::assign(*__p, value_type());
2545 __set_size(__n);
2546 return *this;
2547}
2548
2549template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002550inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002551basic_string<_CharT, _Traits, _Allocator>&
2552basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str)
2553{
2554 return assign(__str.data(), __str.size());
2555}
2556
2557template <class _CharT, class _Traits, class _Allocator>
2558basic_string<_CharT, _Traits, _Allocator>&
2559basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
2560{
2561 size_type __sz = __str.size();
2562 if (__pos > __sz)
2563 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002564 return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002565}
2566
2567template <class _CharT, class _Traits, class _Allocator>
2568basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002569basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002570{
Alp Tokerec34c482014-05-15 11:27:39 +00002571 _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002572 return assign(__s, traits_type::length(__s));
2573}
2574
2575// append
2576
2577template <class _CharT, class _Traits, class _Allocator>
2578basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002579basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002580{
Alp Tokerec34c482014-05-15 11:27:39 +00002581 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002582 size_type __cap = capacity();
2583 size_type __sz = size();
2584 if (__cap - __sz >= __n)
2585 {
2586 if (__n)
2587 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002588 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002589 traits_type::copy(__p + __sz, __s, __n);
2590 __sz += __n;
2591 __set_size(__sz);
2592 traits_type::assign(__p[__sz], value_type());
2593 }
2594 }
2595 else
2596 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
2597 return *this;
2598}
2599
2600template <class _CharT, class _Traits, class _Allocator>
2601basic_string<_CharT, _Traits, _Allocator>&
2602basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
2603{
2604 if (__n)
2605 {
2606 size_type __cap = capacity();
2607 size_type __sz = size();
2608 if (__cap - __sz < __n)
2609 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2610 pointer __p = __get_pointer();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002611 traits_type::assign(_VSTD::__to_raw_pointer(__p) + __sz, __n, __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002612 __sz += __n;
2613 __set_size(__sz);
2614 traits_type::assign(__p[__sz], value_type());
2615 }
2616 return *this;
2617}
2618
2619template <class _CharT, class _Traits, class _Allocator>
2620void
2621basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
2622{
Howard Hinnant15467182013-04-30 21:44:48 +00002623 bool __is_short = !__is_long();
2624 size_type __cap;
2625 size_type __sz;
2626 if (__is_short)
2627 {
2628 __cap = __min_cap - 1;
2629 __sz = __get_short_size();
2630 }
2631 else
2632 {
2633 __cap = __get_long_cap() - 1;
2634 __sz = __get_long_size();
2635 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002636 if (__sz == __cap)
Howard Hinnant15467182013-04-30 21:44:48 +00002637 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002638 __grow_by(__cap, 1, __sz, __sz, 0);
Howard Hinnant15467182013-04-30 21:44:48 +00002639 __is_short = !__is_long();
2640 }
2641 pointer __p;
2642 if (__is_short)
2643 {
2644 __p = __get_short_pointer() + __sz;
2645 __set_short_size(__sz+1);
2646 }
2647 else
2648 {
2649 __p = __get_long_pointer() + __sz;
2650 __set_long_size(__sz+1);
2651 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002652 traits_type::assign(*__p, __c);
2653 traits_type::assign(*++__p, value_type());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002654}
2655
2656template <class _CharT, class _Traits, class _Allocator>
2657template<class _InputIterator>
2658typename enable_if
2659<
2660 __is_input_iterator <_InputIterator>::value &&
2661 !__is_forward_iterator<_InputIterator>::value,
2662 basic_string<_CharT, _Traits, _Allocator>&
2663>::type
2664basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last)
2665{
2666 for (; __first != __last; ++__first)
2667 push_back(*__first);
2668 return *this;
2669}
2670
2671template <class _CharT, class _Traits, class _Allocator>
2672template<class _ForwardIterator>
2673typename enable_if
2674<
2675 __is_forward_iterator<_ForwardIterator>::value,
2676 basic_string<_CharT, _Traits, _Allocator>&
2677>::type
2678basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last)
2679{
2680 size_type __sz = size();
2681 size_type __cap = capacity();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002682 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002683 if (__n)
2684 {
2685 if (__cap - __sz < __n)
2686 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2687 pointer __p = __get_pointer() + __sz;
2688 for (; __first != __last; ++__p, ++__first)
2689 traits_type::assign(*__p, *__first);
2690 traits_type::assign(*__p, value_type());
2691 __set_size(__sz + __n);
2692 }
2693 return *this;
2694}
2695
2696template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002697inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002698basic_string<_CharT, _Traits, _Allocator>&
2699basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
2700{
2701 return append(__str.data(), __str.size());
2702}
2703
2704template <class _CharT, class _Traits, class _Allocator>
2705basic_string<_CharT, _Traits, _Allocator>&
2706basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
2707{
2708 size_type __sz = __str.size();
2709 if (__pos > __sz)
2710 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002711 return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002712}
2713
2714template <class _CharT, class _Traits, class _Allocator>
2715basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002716basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002717{
Alp Tokerec34c482014-05-15 11:27:39 +00002718 _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002719 return append(__s, traits_type::length(__s));
2720}
2721
2722// insert
2723
2724template <class _CharT, class _Traits, class _Allocator>
2725basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002726basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002727{
Alp Tokerec34c482014-05-15 11:27:39 +00002728 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002729 size_type __sz = size();
2730 if (__pos > __sz)
2731 this->__throw_out_of_range();
2732 size_type __cap = capacity();
2733 if (__cap - __sz >= __n)
2734 {
2735 if (__n)
2736 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002737 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002738 size_type __n_move = __sz - __pos;
2739 if (__n_move != 0)
2740 {
2741 if (__p + __pos <= __s && __s < __p + __sz)
2742 __s += __n;
2743 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2744 }
2745 traits_type::move(__p + __pos, __s, __n);
2746 __sz += __n;
2747 __set_size(__sz);
2748 traits_type::assign(__p[__sz], value_type());
2749 }
2750 }
2751 else
2752 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2753 return *this;
2754}
2755
2756template <class _CharT, class _Traits, class _Allocator>
2757basic_string<_CharT, _Traits, _Allocator>&
2758basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
2759{
2760 size_type __sz = size();
2761 if (__pos > __sz)
2762 this->__throw_out_of_range();
2763 if (__n)
2764 {
2765 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002766 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002767 if (__cap - __sz >= __n)
2768 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002769 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002770 size_type __n_move = __sz - __pos;
2771 if (__n_move != 0)
2772 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2773 }
2774 else
2775 {
2776 __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002777 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002778 }
2779 traits_type::assign(__p + __pos, __n, __c);
2780 __sz += __n;
2781 __set_size(__sz);
2782 traits_type::assign(__p[__sz], value_type());
2783 }
2784 return *this;
2785}
2786
2787template <class _CharT, class _Traits, class _Allocator>
2788template<class _InputIterator>
2789typename enable_if
2790<
2791 __is_input_iterator <_InputIterator>::value &&
2792 !__is_forward_iterator<_InputIterator>::value,
2793 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2794>::type
2795basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
2796{
Howard Hinnant499cea12013-08-23 17:37:05 +00002797#if _LIBCPP_DEBUG_LEVEL >= 2
2798 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2799 "string::insert(iterator, range) called with an iterator not"
2800 " referring to this string");
2801#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002802 size_type __old_sz = size();
2803 difference_type __ip = __pos - begin();
2804 for (; __first != __last; ++__first)
2805 push_back(*__first);
2806 pointer __p = __get_pointer();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002807 _VSTD::rotate(__p + __ip, __p + __old_sz, __p + size());
Howard Hinnant499cea12013-08-23 17:37:05 +00002808#if _LIBCPP_DEBUG_LEVEL >= 2
2809 return iterator(this, __p + __ip);
2810#else
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002811 return iterator(__p + __ip);
Howard Hinnant499cea12013-08-23 17:37:05 +00002812#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002813}
2814
2815template <class _CharT, class _Traits, class _Allocator>
2816template<class _ForwardIterator>
2817typename enable_if
2818<
2819 __is_forward_iterator<_ForwardIterator>::value,
2820 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2821>::type
2822basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
2823{
Howard Hinnant499cea12013-08-23 17:37:05 +00002824#if _LIBCPP_DEBUG_LEVEL >= 2
2825 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2826 "string::insert(iterator, range) called with an iterator not"
2827 " referring to this string");
2828#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002829 size_type __ip = static_cast<size_type>(__pos - begin());
2830 size_type __sz = size();
2831 size_type __cap = capacity();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002832 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002833 if (__n)
2834 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002835 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002836 if (__cap - __sz >= __n)
2837 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002838 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002839 size_type __n_move = __sz - __ip;
2840 if (__n_move != 0)
2841 traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
2842 }
2843 else
2844 {
2845 __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002846 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002847 }
2848 __sz += __n;
2849 __set_size(__sz);
2850 traits_type::assign(__p[__sz], value_type());
2851 for (__p += __ip; __first != __last; ++__p, ++__first)
2852 traits_type::assign(*__p, *__first);
2853 }
2854 return begin() + __ip;
2855}
2856
2857template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002858inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002859basic_string<_CharT, _Traits, _Allocator>&
2860basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str)
2861{
2862 return insert(__pos1, __str.data(), __str.size());
2863}
2864
2865template <class _CharT, class _Traits, class _Allocator>
2866basic_string<_CharT, _Traits, _Allocator>&
2867basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
2868 size_type __pos2, size_type __n)
2869{
2870 size_type __str_sz = __str.size();
2871 if (__pos2 > __str_sz)
2872 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002873 return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002874}
2875
2876template <class _CharT, class _Traits, class _Allocator>
2877basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002878basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002879{
Alp Tokerec34c482014-05-15 11:27:39 +00002880 _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002881 return insert(__pos, __s, traits_type::length(__s));
2882}
2883
2884template <class _CharT, class _Traits, class _Allocator>
2885typename basic_string<_CharT, _Traits, _Allocator>::iterator
2886basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
2887{
2888 size_type __ip = static_cast<size_type>(__pos - begin());
2889 size_type __sz = size();
2890 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002891 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002892 if (__cap == __sz)
2893 {
2894 __grow_by(__cap, 1, __sz, __ip, 0, 1);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002895 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002896 }
2897 else
2898 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002899 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002900 size_type __n_move = __sz - __ip;
2901 if (__n_move != 0)
2902 traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
2903 }
2904 traits_type::assign(__p[__ip], __c);
2905 traits_type::assign(__p[++__sz], value_type());
2906 __set_size(__sz);
2907 return begin() + static_cast<difference_type>(__ip);
2908}
2909
2910template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002911inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002912typename basic_string<_CharT, _Traits, _Allocator>::iterator
2913basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c)
2914{
Howard Hinnant499cea12013-08-23 17:37:05 +00002915#if _LIBCPP_DEBUG_LEVEL >= 2
2916 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2917 "string::insert(iterator, n, value) called with an iterator not"
2918 " referring to this string");
2919#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002920 difference_type __p = __pos - begin();
2921 insert(static_cast<size_type>(__p), __n, __c);
2922 return begin() + __p;
2923}
2924
2925// replace
2926
2927template <class _CharT, class _Traits, class _Allocator>
2928basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002929basic_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 +00002930{
Alp Tokerec34c482014-05-15 11:27:39 +00002931 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002932 size_type __sz = size();
2933 if (__pos > __sz)
2934 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002935 __n1 = _VSTD::min(__n1, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002936 size_type __cap = capacity();
2937 if (__cap - __sz + __n1 >= __n2)
2938 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002939 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002940 if (__n1 != __n2)
2941 {
2942 size_type __n_move = __sz - __pos - __n1;
2943 if (__n_move != 0)
2944 {
2945 if (__n1 > __n2)
2946 {
2947 traits_type::move(__p + __pos, __s, __n2);
2948 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2949 goto __finish;
2950 }
2951 if (__p + __pos < __s && __s < __p + __sz)
2952 {
2953 if (__p + __pos + __n1 <= __s)
2954 __s += __n2 - __n1;
2955 else // __p + __pos < __s < __p + __pos + __n1
2956 {
2957 traits_type::move(__p + __pos, __s, __n1);
2958 __pos += __n1;
2959 __s += __n2;
2960 __n2 -= __n1;
2961 __n1 = 0;
2962 }
2963 }
2964 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2965 }
2966 }
2967 traits_type::move(__p + __pos, __s, __n2);
2968__finish:
2969 __sz += __n2 - __n1;
2970 __set_size(__sz);
2971 __invalidate_iterators_past(__sz);
2972 traits_type::assign(__p[__sz], value_type());
2973 }
2974 else
2975 __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
2976 return *this;
2977}
2978
2979template <class _CharT, class _Traits, class _Allocator>
2980basic_string<_CharT, _Traits, _Allocator>&
2981basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
2982{
2983 size_type __sz = size();
2984 if (__pos > __sz)
2985 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002986 __n1 = _VSTD::min(__n1, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002987 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002988 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002989 if (__cap - __sz + __n1 >= __n2)
2990 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002991 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002992 if (__n1 != __n2)
2993 {
2994 size_type __n_move = __sz - __pos - __n1;
2995 if (__n_move != 0)
2996 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2997 }
2998 }
2999 else
3000 {
3001 __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003002 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003003 }
3004 traits_type::assign(__p + __pos, __n2, __c);
3005 __sz += __n2 - __n1;
3006 __set_size(__sz);
3007 __invalidate_iterators_past(__sz);
3008 traits_type::assign(__p[__sz], value_type());
3009 return *this;
3010}
3011
3012template <class _CharT, class _Traits, class _Allocator>
3013template<class _InputIterator>
3014typename enable_if
3015<
3016 __is_input_iterator<_InputIterator>::value,
3017 basic_string<_CharT, _Traits, _Allocator>&
3018>::type
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003019basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003020 _InputIterator __j1, _InputIterator __j2)
3021{
3022 for (; true; ++__i1, ++__j1)
3023 {
3024 if (__i1 == __i2)
3025 {
3026 if (__j1 != __j2)
3027 insert(__i1, __j1, __j2);
3028 break;
3029 }
3030 if (__j1 == __j2)
3031 {
3032 erase(__i1, __i2);
3033 break;
3034 }
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003035 traits_type::assign(const_cast<value_type&>(*__i1), *__j1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003036 }
3037 return *this;
3038}
3039
3040template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003041inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003042basic_string<_CharT, _Traits, _Allocator>&
3043basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str)
3044{
3045 return replace(__pos1, __n1, __str.data(), __str.size());
3046}
3047
3048template <class _CharT, class _Traits, class _Allocator>
3049basic_string<_CharT, _Traits, _Allocator>&
3050basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
3051 size_type __pos2, size_type __n2)
3052{
3053 size_type __str_sz = __str.size();
3054 if (__pos2 > __str_sz)
3055 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003056 return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003057}
3058
3059template <class _CharT, class _Traits, class _Allocator>
3060basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003061basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003062{
Alp Tokerec34c482014-05-15 11:27:39 +00003063 _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003064 return replace(__pos, __n1, __s, traits_type::length(__s));
3065}
3066
3067template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003068inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003069basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003070basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003071{
3072 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1),
3073 __str.data(), __str.size());
3074}
3075
3076template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003077inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003078basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003079basic_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 +00003080{
3081 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
3082}
3083
3084template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003085inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003086basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003087basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003088{
3089 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
3090}
3091
3092template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003093inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003094basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003095basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003096{
3097 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
3098}
3099
3100// erase
3101
3102template <class _CharT, class _Traits, class _Allocator>
3103basic_string<_CharT, _Traits, _Allocator>&
3104basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n)
3105{
3106 size_type __sz = size();
3107 if (__pos > __sz)
3108 this->__throw_out_of_range();
3109 if (__n)
3110 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003111 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnant0949eed2011-06-30 21:18:19 +00003112 __n = _VSTD::min(__n, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003113 size_type __n_move = __sz - __pos - __n;
3114 if (__n_move != 0)
3115 traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
3116 __sz -= __n;
3117 __set_size(__sz);
3118 __invalidate_iterators_past(__sz);
3119 traits_type::assign(__p[__sz], value_type());
3120 }
3121 return *this;
3122}
3123
3124template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003125inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003126typename basic_string<_CharT, _Traits, _Allocator>::iterator
3127basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
3128{
Howard Hinnant499cea12013-08-23 17:37:05 +00003129#if _LIBCPP_DEBUG_LEVEL >= 2
3130 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
3131 "string::erase(iterator) called with an iterator not"
3132 " referring to this string");
3133#endif
3134 _LIBCPP_ASSERT(__pos != end(),
3135 "string::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003136 iterator __b = begin();
3137 size_type __r = static_cast<size_type>(__pos - __b);
3138 erase(__r, 1);
Howard Hinnantec3773c2011-12-01 20:21:04 +00003139 return __b + static_cast<difference_type>(__r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003140}
3141
3142template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003143inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003144typename basic_string<_CharT, _Traits, _Allocator>::iterator
3145basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
3146{
Howard Hinnant499cea12013-08-23 17:37:05 +00003147#if _LIBCPP_DEBUG_LEVEL >= 2
3148 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
3149 "string::erase(iterator, iterator) called with an iterator not"
3150 " referring to this string");
3151#endif
3152 _LIBCPP_ASSERT(__first <= __last, "string::erase(first, last) called with invalid range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003153 iterator __b = begin();
3154 size_type __r = static_cast<size_type>(__first - __b);
3155 erase(__r, static_cast<size_type>(__last - __first));
Howard Hinnantec3773c2011-12-01 20:21:04 +00003156 return __b + static_cast<difference_type>(__r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003157}
3158
3159template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003160inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003161void
3162basic_string<_CharT, _Traits, _Allocator>::pop_back()
3163{
Howard Hinnant499cea12013-08-23 17:37:05 +00003164 _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003165 size_type __sz;
3166 if (__is_long())
3167 {
3168 __sz = __get_long_size() - 1;
3169 __set_long_size(__sz);
3170 traits_type::assign(*(__get_long_pointer() + __sz), value_type());
3171 }
3172 else
3173 {
3174 __sz = __get_short_size() - 1;
3175 __set_short_size(__sz);
3176 traits_type::assign(*(__get_short_pointer() + __sz), value_type());
3177 }
3178 __invalidate_iterators_past(__sz);
3179}
3180
3181template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003182inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003183void
Howard Hinnanta6119a82011-05-29 19:57:12 +00003184basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003185{
3186 __invalidate_all_iterators();
3187 if (__is_long())
3188 {
3189 traits_type::assign(*__get_long_pointer(), value_type());
3190 __set_long_size(0);
3191 }
3192 else
3193 {
3194 traits_type::assign(*__get_short_pointer(), value_type());
3195 __set_short_size(0);
3196 }
3197}
3198
3199template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003200inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003201void
3202basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
3203{
3204 if (__is_long())
3205 {
3206 traits_type::assign(*(__get_long_pointer() + __pos), value_type());
3207 __set_long_size(__pos);
3208 }
3209 else
3210 {
3211 traits_type::assign(*(__get_short_pointer() + __pos), value_type());
3212 __set_short_size(__pos);
3213 }
3214 __invalidate_iterators_past(__pos);
3215}
3216
3217template <class _CharT, class _Traits, class _Allocator>
3218void
3219basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
3220{
3221 size_type __sz = size();
3222 if (__n > __sz)
3223 append(__n - __sz, __c);
3224 else
3225 __erase_to_end(__n);
3226}
3227
3228template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003229inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003230typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003231basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003232{
Howard Hinnante32b5e22010-11-17 17:55:08 +00003233 size_type __m = __alloc_traits::max_size(__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003234#if _LIBCPP_BIG_ENDIAN
Marshall Clow09f85502013-10-31 17:23:08 +00003235 return (__m <= ~__long_mask ? __m : __m/2) - __alignment;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003236#else
Marshall Clow09f85502013-10-31 17:23:08 +00003237 return __m - __alignment;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003238#endif
3239}
3240
3241template <class _CharT, class _Traits, class _Allocator>
3242void
3243basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
3244{
3245 if (__res_arg > max_size())
3246 this->__throw_length_error();
3247 size_type __cap = capacity();
3248 size_type __sz = size();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003249 __res_arg = _VSTD::max(__res_arg, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003250 __res_arg = __recommend(__res_arg);
3251 if (__res_arg != __cap)
3252 {
3253 pointer __new_data, __p;
3254 bool __was_long, __now_long;
3255 if (__res_arg == __min_cap - 1)
3256 {
3257 __was_long = true;
3258 __now_long = false;
3259 __new_data = __get_short_pointer();
3260 __p = __get_long_pointer();
3261 }
3262 else
3263 {
3264 if (__res_arg > __cap)
Howard Hinnante32b5e22010-11-17 17:55:08 +00003265 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003266 else
3267 {
3268 #ifndef _LIBCPP_NO_EXCEPTIONS
3269 try
3270 {
Howard Hinnant324bb032010-08-22 00:02:43 +00003271 #endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante32b5e22010-11-17 17:55:08 +00003272 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003273 #ifndef _LIBCPP_NO_EXCEPTIONS
3274 }
3275 catch (...)
3276 {
3277 return;
3278 }
Howard Hinnant324bb032010-08-22 00:02:43 +00003279 #else // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003280 if (__new_data == nullptr)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003281 return;
Howard Hinnant324bb032010-08-22 00:02:43 +00003282 #endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003283 }
3284 __now_long = true;
3285 __was_long = __is_long();
3286 __p = __get_pointer();
3287 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003288 traits_type::copy(_VSTD::__to_raw_pointer(__new_data),
3289 _VSTD::__to_raw_pointer(__p), size()+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003290 if (__was_long)
Howard Hinnante32b5e22010-11-17 17:55:08 +00003291 __alloc_traits::deallocate(__alloc(), __p, __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003292 if (__now_long)
3293 {
3294 __set_long_cap(__res_arg+1);
3295 __set_long_size(__sz);
3296 __set_long_pointer(__new_data);
3297 }
3298 else
3299 __set_short_size(__sz);
3300 __invalidate_all_iterators();
3301 }
3302}
3303
3304template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003305inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003306typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3307basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const
3308{
Howard Hinnant499cea12013-08-23 17:37:05 +00003309 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003310 return *(data() + __pos);
3311}
3312
3313template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003314inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003315typename basic_string<_CharT, _Traits, _Allocator>::reference
3316basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos)
3317{
Howard Hinnant499cea12013-08-23 17:37:05 +00003318 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003319 return *(__get_pointer() + __pos);
3320}
3321
3322template <class _CharT, class _Traits, class _Allocator>
3323typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3324basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
3325{
3326 if (__n >= size())
3327 this->__throw_out_of_range();
3328 return (*this)[__n];
3329}
3330
3331template <class _CharT, class _Traits, class _Allocator>
3332typename basic_string<_CharT, _Traits, _Allocator>::reference
3333basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
3334{
3335 if (__n >= size())
3336 this->__throw_out_of_range();
3337 return (*this)[__n];
3338}
3339
3340template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003341inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003342typename basic_string<_CharT, _Traits, _Allocator>::reference
3343basic_string<_CharT, _Traits, _Allocator>::front()
3344{
Howard Hinnant499cea12013-08-23 17:37:05 +00003345 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003346 return *__get_pointer();
3347}
3348
3349template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003350inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003351typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3352basic_string<_CharT, _Traits, _Allocator>::front() const
3353{
Howard Hinnant499cea12013-08-23 17:37:05 +00003354 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003355 return *data();
3356}
3357
3358template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003359inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003360typename basic_string<_CharT, _Traits, _Allocator>::reference
3361basic_string<_CharT, _Traits, _Allocator>::back()
3362{
Howard Hinnant499cea12013-08-23 17:37:05 +00003363 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003364 return *(__get_pointer() + size() - 1);
3365}
3366
3367template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003368inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003369typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3370basic_string<_CharT, _Traits, _Allocator>::back() const
3371{
Howard Hinnant499cea12013-08-23 17:37:05 +00003372 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003373 return *(data() + size() - 1);
3374}
3375
3376template <class _CharT, class _Traits, class _Allocator>
3377typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003378basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003379{
3380 size_type __sz = size();
3381 if (__pos > __sz)
3382 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003383 size_type __rlen = _VSTD::min(__n, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003384 traits_type::copy(__s, data() + __pos, __rlen);
3385 return __rlen;
3386}
3387
3388template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003389inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003390basic_string<_CharT, _Traits, _Allocator>
3391basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const
3392{
3393 return basic_string(*this, __pos, __n, __alloc());
3394}
3395
3396template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003397inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003398void
3399basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00003400 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3401 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003402{
Howard Hinnant499cea12013-08-23 17:37:05 +00003403#if _LIBCPP_DEBUG_LEVEL >= 2
3404 if (!__is_long())
3405 __get_db()->__invalidate_all(this);
3406 if (!__str.__is_long())
3407 __get_db()->__invalidate_all(&__str);
3408 __get_db()->swap(this, &__str);
3409#endif
Howard Hinnant0949eed2011-06-30 21:18:19 +00003410 _VSTD::swap(__r_.first(), __str.__r_.first());
Howard Hinnante32b5e22010-11-17 17:55:08 +00003411 __swap_alloc(__alloc(), __str.__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003412}
3413
3414// find
3415
3416template <class _Traits>
3417struct _LIBCPP_HIDDEN __traits_eq
3418{
3419 typedef typename _Traits::char_type char_type;
Howard Hinnanta6119a82011-05-29 19:57:12 +00003420 _LIBCPP_INLINE_VISIBILITY
3421 bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
3422 {return _Traits::eq(__x, __y);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003423};
3424
3425template<class _CharT, class _Traits, class _Allocator>
3426typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003427basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003428 size_type __pos,
3429 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003430{
Alp Tokerec34c482014-05-15 11:27:39 +00003431 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr");
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(), __s, __pos, __n);
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 Hinnanta6119a82011-05-29 19:57:12 +00003439basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
3440 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003441{
Marshall Clow37025e12014-06-10 18:51:55 +00003442 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003443 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003444}
3445
3446template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003447inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003448typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003449basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003450 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003451{
Alp Tokerec34c482014-05-15 11:27:39 +00003452 _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003453 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003454 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003455}
3456
3457template<class _CharT, class _Traits, class _Allocator>
3458typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003459basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
3460 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003461{
Marshall Clow37025e12014-06-10 18:51:55 +00003462 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003463 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003464}
3465
3466// rfind
3467
3468template<class _CharT, class _Traits, class _Allocator>
3469typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003470basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003471 size_type __pos,
3472 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003473{
Alp Tokerec34c482014-05-15 11:27:39 +00003474 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr");
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(), __s, __pos, __n);
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 Hinnanta6119a82011-05-29 19:57:12 +00003482basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
3483 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003484{
Marshall Clow37025e12014-06-10 18:51:55 +00003485 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003486 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003487}
3488
3489template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003490inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003491typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003492basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003493 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003494{
Alp Tokerec34c482014-05-15 11:27:39 +00003495 _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003496 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003497 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003498}
3499
3500template<class _CharT, class _Traits, class _Allocator>
3501typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003502basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
3503 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003504{
Marshall Clow37025e12014-06-10 18:51:55 +00003505 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003506 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003507}
3508
3509// find_first_of
3510
3511template<class _CharT, class _Traits, class _Allocator>
3512typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003513basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003514 size_type __pos,
3515 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003516{
Alp Tokerec34c482014-05-15 11:27:39 +00003517 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr");
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(), __s, __pos, __n);
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 Hinnanta6119a82011-05-29 19:57:12 +00003525basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
3526 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003527{
Marshall Clow37025e12014-06-10 18:51:55 +00003528 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003529 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003530}
3531
3532template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003533inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003534typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003535basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003536 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003537{
Alp Tokerec34c482014-05-15 11:27:39 +00003538 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003539 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003540 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003541}
3542
3543template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003544inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003545typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003546basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
3547 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003548{
3549 return find(__c, __pos);
3550}
3551
3552// find_last_of
3553
3554template<class _CharT, class _Traits, class _Allocator>
3555typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003556basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003557 size_type __pos,
3558 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003559{
Alp Tokerec34c482014-05-15 11:27:39 +00003560 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr");
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(), __s, __pos, __n);
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 Hinnanta6119a82011-05-29 19:57:12 +00003568basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
3569 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003570{
Marshall Clow37025e12014-06-10 18:51:55 +00003571 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003572 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003573}
3574
3575template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003576inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003577typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003578basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003579 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003580{
Alp Tokerec34c482014-05-15 11:27:39 +00003581 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003582 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003583 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003584}
3585
3586template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003587inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003588typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003589basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
3590 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003591{
3592 return rfind(__c, __pos);
3593}
3594
3595// find_first_not_of
3596
3597template<class _CharT, class _Traits, class _Allocator>
3598typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003599basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003600 size_type __pos,
3601 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003602{
Alp Tokerec34c482014-05-15 11:27:39 +00003603 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr");
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(), __s, __pos, __n);
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 Hinnanta6119a82011-05-29 19:57:12 +00003611basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
3612 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003613{
Marshall Clow37025e12014-06-10 18:51:55 +00003614 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003615 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003616}
3617
3618template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003619inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003620typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003621basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003622 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003623{
Alp Tokerec34c482014-05-15 11:27:39 +00003624 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr");
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(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003627}
3628
3629template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003630inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003631typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003632basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
3633 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003634{
Marshall Clow37025e12014-06-10 18:51:55 +00003635 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003636 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003637}
3638
3639// find_last_not_of
3640
3641template<class _CharT, class _Traits, class _Allocator>
3642typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003643basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003644 size_type __pos,
3645 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003646{
Alp Tokerec34c482014-05-15 11:27:39 +00003647 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr");
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(), __s, __pos, __n);
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 Hinnanta6119a82011-05-29 19:57:12 +00003655basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
3656 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003657{
Marshall Clow37025e12014-06-10 18:51:55 +00003658 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003659 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003660}
3661
3662template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003663inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003664typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003665basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003666 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003667{
Alp Tokerec34c482014-05-15 11:27:39 +00003668 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr");
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(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003671}
3672
3673template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003674inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003675typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003676basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
3677 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003678{
Marshall Clow37025e12014-06-10 18:51:55 +00003679 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003680 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003681}
3682
3683// compare
3684
3685template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003686inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003687int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003688basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003689{
Howard Hinnantfa06d752011-07-24 21:45:06 +00003690 size_t __lhs_sz = size();
3691 size_t __rhs_sz = __str.size();
3692 int __result = traits_type::compare(data(), __str.data(),
3693 _VSTD::min(__lhs_sz, __rhs_sz));
3694 if (__result != 0)
3695 return __result;
3696 if (__lhs_sz < __rhs_sz)
3697 return -1;
3698 if (__lhs_sz > __rhs_sz)
3699 return 1;
3700 return 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003701}
3702
3703template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003704inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003705int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003706basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3707 size_type __n1,
3708 const basic_string& __str) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003709{
3710 return compare(__pos1, __n1, __str.data(), __str.size());
3711}
3712
3713template <class _CharT, class _Traits, class _Allocator>
3714int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003715basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3716 size_type __n1,
3717 const basic_string& __str,
3718 size_type __pos2,
3719 size_type __n2) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003720{
3721 size_type __sz = __str.size();
3722 if (__pos2 > __sz)
3723 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003724 return compare(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003725 __sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003726}
3727
3728template <class _CharT, class _Traits, class _Allocator>
3729int
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003730basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
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(0, npos, __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) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003741{
Alp Tokerec34c482014-05-15 11:27:39 +00003742 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003743 return compare(__pos1, __n1, __s, traits_type::length(__s));
3744}
3745
3746template <class _CharT, class _Traits, class _Allocator>
3747int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003748basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3749 size_type __n1,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003750 const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003751 size_type __n2) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003752{
Alp Tokerec34c482014-05-15 11:27:39 +00003753 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003754 size_type __sz = size();
3755 if (__pos1 > __sz || __n2 == npos)
3756 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003757 size_type __rlen = _VSTD::min(__n1, __sz - __pos1);
3758 int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003759 if (__r == 0)
3760 {
3761 if (__rlen < __n2)
3762 __r = -1;
3763 else if (__rlen > __n2)
3764 __r = 1;
3765 }
3766 return __r;
3767}
3768
3769// __invariants
3770
3771template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003772inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003773bool
3774basic_string<_CharT, _Traits, _Allocator>::__invariants() const
3775{
3776 if (size() > capacity())
3777 return false;
3778 if (capacity() < __min_cap - 1)
3779 return false;
3780 if (data() == 0)
3781 return false;
3782 if (data()[size()] != value_type(0))
3783 return false;
3784 return true;
3785}
3786
3787// operator==
3788
3789template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003790inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003791bool
3792operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003793 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003794{
Howard Hinnant08dd2532013-04-22 23:55:13 +00003795 size_t __lhs_sz = __lhs.size();
3796 return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(),
3797 __rhs.data(),
3798 __lhs_sz) == 0;
3799}
3800
3801template<class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003802inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant08dd2532013-04-22 23:55:13 +00003803bool
3804operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
3805 const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT
3806{
3807 size_t __lhs_sz = __lhs.size();
3808 if (__lhs_sz != __rhs.size())
3809 return false;
3810 const char* __lp = __lhs.data();
3811 const char* __rp = __rhs.data();
3812 if (__lhs.__is_long())
3813 return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
3814 for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
3815 if (*__lp != *__rp)
3816 return false;
3817 return true;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003818}
3819
3820template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003821inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003822bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003823operator==(const _CharT* __lhs,
3824 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003825{
3826 return __rhs.compare(__lhs) == 0;
3827}
3828
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003829template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003830inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003831bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003832operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
3833 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003834{
3835 return __lhs.compare(__rhs) == 0;
3836}
3837
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003838// operator!=
3839
Howard Hinnant324bb032010-08-22 00:02:43 +00003840template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003841inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003842bool
3843operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003844 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003845{
3846 return !(__lhs == __rhs);
3847}
3848
3849template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003850inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003851bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003852operator!=(const _CharT* __lhs,
3853 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003854{
3855 return !(__lhs == __rhs);
3856}
3857
3858template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003859inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003860bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003861operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3862 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003863{
3864 return !(__lhs == __rhs);
3865}
3866
3867// operator<
3868
3869template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003870inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003871bool
3872operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003873 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003874{
Howard Hinnant2644a7b2011-07-24 15:07:21 +00003875 return __lhs.compare(__rhs) < 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003876}
3877
3878template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003879inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003880bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003881operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3882 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003883{
Howard Hinnant2644a7b2011-07-24 15:07:21 +00003884 return __lhs.compare(__rhs) < 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003885}
3886
3887template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003888inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003889bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003890operator< (const _CharT* __lhs,
3891 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003892{
3893 return __rhs.compare(__lhs) > 0;
3894}
3895
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003896// operator>
3897
3898template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003899inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003900bool
3901operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003902 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003903{
3904 return __rhs < __lhs;
3905}
3906
3907template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003908inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003909bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003910operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3911 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003912{
3913 return __rhs < __lhs;
3914}
3915
3916template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003917inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003918bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003919operator> (const _CharT* __lhs,
3920 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003921{
3922 return __rhs < __lhs;
3923}
3924
3925// operator<=
3926
3927template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003928inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003929bool
3930operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003931 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003932{
3933 return !(__rhs < __lhs);
3934}
3935
3936template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003937inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003938bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003939operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3940 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003941{
3942 return !(__rhs < __lhs);
3943}
3944
3945template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003946inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003947bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003948operator<=(const _CharT* __lhs,
3949 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003950{
3951 return !(__rhs < __lhs);
3952}
3953
3954// operator>=
3955
3956template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003957inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003958bool
3959operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003960 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003961{
3962 return !(__lhs < __rhs);
3963}
3964
3965template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003966inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003967bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003968operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3969 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003970{
3971 return !(__lhs < __rhs);
3972}
3973
3974template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003975inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003976bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003977operator>=(const _CharT* __lhs,
3978 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003979{
3980 return !(__lhs < __rhs);
3981}
3982
3983// operator +
3984
3985template<class _CharT, class _Traits, class _Allocator>
3986basic_string<_CharT, _Traits, _Allocator>
3987operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3988 const basic_string<_CharT, _Traits, _Allocator>& __rhs)
3989{
3990 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
3991 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
3992 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
3993 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
3994 __r.append(__rhs.data(), __rhs_sz);
3995 return __r;
3996}
3997
3998template<class _CharT, class _Traits, class _Allocator>
3999basic_string<_CharT, _Traits, _Allocator>
4000operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4001{
4002 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
4003 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs);
4004 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
4005 __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
4006 __r.append(__rhs.data(), __rhs_sz);
4007 return __r;
4008}
4009
4010template<class _CharT, class _Traits, class _Allocator>
4011basic_string<_CharT, _Traits, _Allocator>
4012operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
4013{
4014 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
4015 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
4016 __r.__init(&__lhs, 1, 1 + __rhs_sz);
4017 __r.append(__rhs.data(), __rhs_sz);
4018 return __r;
4019}
4020
4021template<class _CharT, class _Traits, class _Allocator>
4022basic_string<_CharT, _Traits, _Allocator>
4023operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
4024{
4025 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4026 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4027 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs);
4028 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
4029 __r.append(__rhs, __rhs_sz);
4030 return __r;
4031}
4032
4033template<class _CharT, class _Traits, class _Allocator>
4034basic_string<_CharT, _Traits, _Allocator>
4035operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
4036{
4037 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4038 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4039 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
4040 __r.push_back(__rhs);
4041 return __r;
4042}
4043
Howard Hinnant73d21a42010-09-04 23:28:19 +00004044#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004045
4046template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004047inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004048basic_string<_CharT, _Traits, _Allocator>
4049operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4050{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004051 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004052}
4053
4054template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004055inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004056basic_string<_CharT, _Traits, _Allocator>
4057operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4058{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004059 return _VSTD::move(__rhs.insert(0, __lhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004060}
4061
4062template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004063inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004064basic_string<_CharT, _Traits, _Allocator>
4065operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4066{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004067 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004068}
4069
4070template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004071inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004072basic_string<_CharT, _Traits, _Allocator>
4073operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4074{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004075 return _VSTD::move(__rhs.insert(0, __lhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004076}
4077
4078template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004079inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004080basic_string<_CharT, _Traits, _Allocator>
4081operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4082{
4083 __rhs.insert(__rhs.begin(), __lhs);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004084 return _VSTD::move(__rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004085}
4086
4087template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004088inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004089basic_string<_CharT, _Traits, _Allocator>
4090operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
4091{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004092 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004093}
4094
4095template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004096inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004097basic_string<_CharT, _Traits, _Allocator>
4098operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
4099{
4100 __lhs.push_back(__rhs);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004101 return _VSTD::move(__lhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004102}
4103
Howard Hinnant73d21a42010-09-04 23:28:19 +00004104#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004105
4106// swap
4107
4108template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004109inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004110void
Howard Hinnanta6119a82011-05-29 19:57:12 +00004111swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00004112 basic_string<_CharT, _Traits, _Allocator>& __rhs)
4113 _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004114{
4115 __lhs.swap(__rhs);
4116}
4117
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004118#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
4119
4120typedef basic_string<char16_t> u16string;
4121typedef basic_string<char32_t> u32string;
4122
Howard Hinnant324bb032010-08-22 00:02:43 +00004123#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004124
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004125_LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* __idx = 0, int __base = 10);
4126_LIBCPP_FUNC_VIS long stol (const string& __str, size_t* __idx = 0, int __base = 10);
4127_LIBCPP_FUNC_VIS unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10);
4128_LIBCPP_FUNC_VIS long long stoll (const string& __str, size_t* __idx = 0, int __base = 10);
4129_LIBCPP_FUNC_VIS unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004130
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004131_LIBCPP_FUNC_VIS float stof (const string& __str, size_t* __idx = 0);
4132_LIBCPP_FUNC_VIS double stod (const string& __str, size_t* __idx = 0);
4133_LIBCPP_FUNC_VIS long double stold(const string& __str, size_t* __idx = 0);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004134
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004135_LIBCPP_FUNC_VIS string to_string(int __val);
4136_LIBCPP_FUNC_VIS string to_string(unsigned __val);
4137_LIBCPP_FUNC_VIS string to_string(long __val);
4138_LIBCPP_FUNC_VIS string to_string(unsigned long __val);
4139_LIBCPP_FUNC_VIS string to_string(long long __val);
4140_LIBCPP_FUNC_VIS string to_string(unsigned long long __val);
4141_LIBCPP_FUNC_VIS string to_string(float __val);
4142_LIBCPP_FUNC_VIS string to_string(double __val);
4143_LIBCPP_FUNC_VIS string to_string(long double __val);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004144
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004145_LIBCPP_FUNC_VIS int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10);
4146_LIBCPP_FUNC_VIS long stol (const wstring& __str, size_t* __idx = 0, int __base = 10);
4147_LIBCPP_FUNC_VIS unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10);
4148_LIBCPP_FUNC_VIS long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10);
4149_LIBCPP_FUNC_VIS unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004150
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004151_LIBCPP_FUNC_VIS float stof (const wstring& __str, size_t* __idx = 0);
4152_LIBCPP_FUNC_VIS double stod (const wstring& __str, size_t* __idx = 0);
4153_LIBCPP_FUNC_VIS long double stold(const wstring& __str, size_t* __idx = 0);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004154
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004155_LIBCPP_FUNC_VIS wstring to_wstring(int __val);
4156_LIBCPP_FUNC_VIS wstring to_wstring(unsigned __val);
4157_LIBCPP_FUNC_VIS wstring to_wstring(long __val);
4158_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long __val);
4159_LIBCPP_FUNC_VIS wstring to_wstring(long long __val);
4160_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long long __val);
4161_LIBCPP_FUNC_VIS wstring to_wstring(float __val);
4162_LIBCPP_FUNC_VIS wstring to_wstring(double __val);
4163_LIBCPP_FUNC_VIS wstring to_wstring(long double __val);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004164
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004165template<class _CharT, class _Traits, class _Allocator>
4166 const typename basic_string<_CharT, _Traits, _Allocator>::size_type
4167 basic_string<_CharT, _Traits, _Allocator>::npos;
4168
4169template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004170struct _LIBCPP_TYPE_VIS_ONLY hash<basic_string<_CharT, _Traits, _Allocator> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004171 : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t>
4172{
4173 size_t
Howard Hinnanta6119a82011-05-29 19:57:12 +00004174 operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004175};
4176
4177template<class _CharT, class _Traits, class _Allocator>
4178size_t
4179hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(
Howard Hinnanta6119a82011-05-29 19:57:12 +00004180 const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004181{
Sean Huntaffd9e52011-07-29 23:31:56 +00004182 return __do_string_hash(__val.data(), __val.data() + __val.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004183}
4184
Howard Hinnant464aa5c2011-07-18 15:51:59 +00004185template<class _CharT, class _Traits, class _Allocator>
4186basic_ostream<_CharT, _Traits>&
4187operator<<(basic_ostream<_CharT, _Traits>& __os,
4188 const basic_string<_CharT, _Traits, _Allocator>& __str);
4189
4190template<class _CharT, class _Traits, class _Allocator>
4191basic_istream<_CharT, _Traits>&
4192operator>>(basic_istream<_CharT, _Traits>& __is,
4193 basic_string<_CharT, _Traits, _Allocator>& __str);
4194
4195template<class _CharT, class _Traits, class _Allocator>
4196basic_istream<_CharT, _Traits>&
4197getline(basic_istream<_CharT, _Traits>& __is,
4198 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4199
4200template<class _CharT, class _Traits, class _Allocator>
4201inline _LIBCPP_INLINE_VISIBILITY
4202basic_istream<_CharT, _Traits>&
4203getline(basic_istream<_CharT, _Traits>& __is,
4204 basic_string<_CharT, _Traits, _Allocator>& __str);
4205
4206#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4207
4208template<class _CharT, class _Traits, class _Allocator>
4209inline _LIBCPP_INLINE_VISIBILITY
4210basic_istream<_CharT, _Traits>&
4211getline(basic_istream<_CharT, _Traits>&& __is,
4212 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4213
4214template<class _CharT, class _Traits, class _Allocator>
4215inline _LIBCPP_INLINE_VISIBILITY
4216basic_istream<_CharT, _Traits>&
4217getline(basic_istream<_CharT, _Traits>&& __is,
4218 basic_string<_CharT, _Traits, _Allocator>& __str);
4219
4220#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4221
Howard Hinnant499cea12013-08-23 17:37:05 +00004222#if _LIBCPP_DEBUG_LEVEL >= 2
4223
4224template<class _CharT, class _Traits, class _Allocator>
4225bool
4226basic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const
4227{
4228 return this->data() <= _VSTD::__to_raw_pointer(__i->base()) &&
4229 _VSTD::__to_raw_pointer(__i->base()) < this->data() + this->size();
4230}
4231
4232template<class _CharT, class _Traits, class _Allocator>
4233bool
4234basic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const
4235{
4236 return this->data() < _VSTD::__to_raw_pointer(__i->base()) &&
4237 _VSTD::__to_raw_pointer(__i->base()) <= this->data() + this->size();
4238}
4239
4240template<class _CharT, class _Traits, class _Allocator>
4241bool
4242basic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
4243{
4244 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4245 return this->data() <= __p && __p <= this->data() + this->size();
4246}
4247
4248template<class _CharT, class _Traits, class _Allocator>
4249bool
4250basic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
4251{
4252 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4253 return this->data() <= __p && __p < this->data() + this->size();
4254}
4255
4256#endif // _LIBCPP_DEBUG_LEVEL >= 2
4257
Marshall Clow15234322013-07-23 17:05:24 +00004258#if _LIBCPP_STD_VER > 11
4259// Literal suffixes for basic_string [basic.string.literals]
Marshall Clow8d9dd7a2013-10-05 21:18:32 +00004260inline namespace literals
Marshall Clow15234322013-07-23 17:05:24 +00004261{
4262 inline namespace string_literals
4263 {
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004264 inline _LIBCPP_INLINE_VISIBILITY
4265 basic_string<char> operator "" s( const char *__str, size_t __len )
4266 {
4267 return basic_string<char> (__str, __len);
4268 }
Marshall Clow15234322013-07-23 17:05:24 +00004269
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004270 inline _LIBCPP_INLINE_VISIBILITY
4271 basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
4272 {
4273 return basic_string<wchar_t> (__str, __len);
4274 }
Marshall Clow15234322013-07-23 17:05:24 +00004275
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004276 inline _LIBCPP_INLINE_VISIBILITY
4277 basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len )
4278 {
4279 return basic_string<char16_t> (__str, __len);
4280 }
Marshall Clow15234322013-07-23 17:05:24 +00004281
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004282 inline _LIBCPP_INLINE_VISIBILITY
4283 basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len )
4284 {
4285 return basic_string<char32_t> (__str, __len);
4286 }
Marshall Clow15234322013-07-23 17:05:24 +00004287 }
4288}
4289#endif
4290
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004291_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<char>)
4292_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<wchar_t>)
Howard Hinnant499cea12013-08-23 17:37:05 +00004293_LIBCPP_EXTERN_TEMPLATE(string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004294
4295_LIBCPP_END_NAMESPACE_STD
4296
4297#endif // _LIBCPP_STRING