blob: 372522cead76b342ae22a022fc910e97ab0964fb [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===--------------------------- string -----------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_STRING
12#define _LIBCPP_STRING
13
14/*
15 string synopsis
16
17namespace std
18{
19
20template <class stateT>
21class fpos
22{
23private:
24 stateT st;
25public:
26 fpos(streamoff = streamoff());
27
28 operator streamoff() const;
29
30 stateT state() const;
31 void state(stateT);
32
33 fpos& operator+=(streamoff);
34 fpos operator+ (streamoff) const;
35 fpos& operator-=(streamoff);
36 fpos operator- (streamoff) const;
37};
38
39template <class stateT> streamoff operator-(const fpos<stateT>& x, const fpos<stateT>& y);
40
41template <class stateT> bool operator==(const fpos<stateT>& x, const fpos<stateT>& y);
42template <class stateT> bool operator!=(const fpos<stateT>& x, const fpos<stateT>& y);
43
44template <class charT>
45struct char_traits
46{
47 typedef charT char_type;
48 typedef ... int_type;
49 typedef streamoff off_type;
50 typedef streampos pos_type;
51 typedef mbstate_t state_type;
52
Howard Hinnanta6119a82011-05-29 19:57:12 +000053 static void assign(char_type& c1, const char_type& c2) noexcept;
Howard Hinnant03d71812012-07-20 19:09:12 +000054 static constexpr bool eq(char_type c1, char_type c2) noexcept;
55 static constexpr bool lt(char_type c1, char_type c2) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000056
57 static int compare(const char_type* s1, const char_type* s2, size_t n);
58 static size_t length(const char_type* s);
59 static const char_type* find(const char_type* s, size_t n, const char_type& a);
60 static char_type* move(char_type* s1, const char_type* s2, size_t n);
61 static char_type* copy(char_type* s1, const char_type* s2, size_t n);
62 static char_type* assign(char_type* s, size_t n, char_type a);
63
Howard Hinnant03d71812012-07-20 19:09:12 +000064 static constexpr int_type not_eof(int_type c) noexcept;
65 static constexpr char_type to_char_type(int_type c) noexcept;
66 static constexpr int_type to_int_type(char_type c) noexcept;
67 static constexpr bool eq_int_type(int_type c1, int_type c2) noexcept;
68 static constexpr int_type eof() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000069};
70
71template <> struct char_traits<char>;
72template <> struct char_traits<wchar_t>;
73
Howard Hinnant324bb032010-08-22 00:02:43 +000074template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000075class basic_string
76{
Howard Hinnant324bb032010-08-22 00:02:43 +000077public:
78// types:
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000079 typedef traits traits_type;
80 typedef typename traits_type::char_type value_type;
81 typedef Allocator allocator_type;
82 typedef typename allocator_type::size_type size_type;
83 typedef typename allocator_type::difference_type difference_type;
84 typedef typename allocator_type::reference reference;
85 typedef typename allocator_type::const_reference const_reference;
86 typedef typename allocator_type::pointer pointer;
87 typedef typename allocator_type::const_pointer const_pointer;
88 typedef implementation-defined iterator;
89 typedef implementation-defined const_iterator;
90 typedef std::reverse_iterator<iterator> reverse_iterator;
91 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
92
93 static const size_type npos = -1;
94
Howard Hinnant53f7d4c2011-06-03 18:40:47 +000095 basic_string()
96 noexcept(is_nothrow_default_constructible<allocator_type>::value);
97 explicit basic_string(const allocator_type& a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000098 basic_string(const basic_string& str);
Howard Hinnant53f7d4c2011-06-03 18:40:47 +000099 basic_string(basic_string&& str)
100 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000101 basic_string(const basic_string& str, size_type pos, size_type n = npos,
102 const allocator_type& a = allocator_type());
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000103 basic_string(const value_type* s, const allocator_type& a = allocator_type());
104 basic_string(const value_type* s, size_type n, const allocator_type& a = allocator_type());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000105 basic_string(size_type n, value_type c, const allocator_type& a = allocator_type());
106 template<class InputIterator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000107 basic_string(InputIterator begin, InputIterator end,
108 const allocator_type& a = allocator_type());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000109 basic_string(initializer_list<value_type>, const Allocator& = Allocator());
110 basic_string(const basic_string&, const Allocator&);
111 basic_string(basic_string&&, const Allocator&);
112
113 ~basic_string();
114
115 basic_string& operator=(const basic_string& str);
Howard Hinnant53f7d4c2011-06-03 18:40:47 +0000116 basic_string& operator=(basic_string&& str)
117 noexcept(
Marshall Clowaf961ed2015-08-18 18:57:00 +0000118 allocator_type::propagate_on_container_move_assignment::value ||
119 allocator_type::is_always_equal::value ); // C++17
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000120 basic_string& operator=(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000121 basic_string& operator=(value_type c);
122 basic_string& operator=(initializer_list<value_type>);
123
Howard Hinnanta6119a82011-05-29 19:57:12 +0000124 iterator begin() noexcept;
125 const_iterator begin() const noexcept;
126 iterator end() noexcept;
127 const_iterator end() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000128
Howard Hinnanta6119a82011-05-29 19:57:12 +0000129 reverse_iterator rbegin() noexcept;
130 const_reverse_iterator rbegin() const noexcept;
131 reverse_iterator rend() noexcept;
132 const_reverse_iterator rend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000133
Howard Hinnanta6119a82011-05-29 19:57:12 +0000134 const_iterator cbegin() const noexcept;
135 const_iterator cend() const noexcept;
136 const_reverse_iterator crbegin() const noexcept;
137 const_reverse_iterator crend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000138
Howard Hinnanta6119a82011-05-29 19:57:12 +0000139 size_type size() const noexcept;
140 size_type length() const noexcept;
141 size_type max_size() const noexcept;
142 size_type capacity() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000143
144 void resize(size_type n, value_type c);
145 void resize(size_type n);
146
147 void reserve(size_type res_arg = 0);
148 void shrink_to_fit();
Howard Hinnanta6119a82011-05-29 19:57:12 +0000149 void clear() noexcept;
150 bool empty() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000151
152 const_reference operator[](size_type pos) const;
153 reference operator[](size_type pos);
154
155 const_reference at(size_type n) const;
156 reference at(size_type n);
157
158 basic_string& operator+=(const basic_string& str);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000159 basic_string& operator+=(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000160 basic_string& operator+=(value_type c);
161 basic_string& operator+=(initializer_list<value_type>);
162
163 basic_string& append(const basic_string& str);
Marshall Clowa93b5e22014-03-04 19:17:19 +0000164 basic_string& append(const basic_string& str, size_type pos, size_type n=npos); //C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000165 basic_string& append(const value_type* s, size_type n);
166 basic_string& append(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000167 basic_string& append(size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000168 template<class InputIterator>
169 basic_string& append(InputIterator first, InputIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000170 basic_string& append(initializer_list<value_type>);
171
172 void push_back(value_type c);
173 void pop_back();
174 reference front();
175 const_reference front() const;
176 reference back();
177 const_reference back() const;
178
179 basic_string& assign(const basic_string& str);
Howard Hinnanta6119a82011-05-29 19:57:12 +0000180 basic_string& assign(basic_string&& str);
Marshall Clowa93b5e22014-03-04 19:17:19 +0000181 basic_string& assign(const basic_string& str, size_type pos, size_type n=npos); // C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000182 basic_string& assign(const value_type* s, size_type n);
183 basic_string& assign(const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000184 basic_string& assign(size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000185 template<class InputIterator>
186 basic_string& assign(InputIterator first, InputIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000187 basic_string& assign(initializer_list<value_type>);
188
189 basic_string& insert(size_type pos1, const basic_string& str);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000190 basic_string& insert(size_type pos1, const basic_string& str,
191 size_type pos2, size_type n);
Marshall Clowa93b5e22014-03-04 19:17:19 +0000192 basic_string& insert(size_type pos, const value_type* s, size_type n=npos); //C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000193 basic_string& insert(size_type pos, const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000194 basic_string& insert(size_type pos, size_type n, value_type c);
195 iterator insert(const_iterator p, value_type c);
196 iterator insert(const_iterator p, size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000197 template<class InputIterator>
198 iterator insert(const_iterator p, InputIterator first, InputIterator last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000199 iterator insert(const_iterator p, initializer_list<value_type>);
200
201 basic_string& erase(size_type pos = 0, size_type n = npos);
202 iterator erase(const_iterator position);
203 iterator erase(const_iterator first, const_iterator last);
204
205 basic_string& replace(size_type pos1, size_type n1, const basic_string& str);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000206 basic_string& replace(size_type pos1, size_type n1, const basic_string& str,
Marshall Clowa93b5e22014-03-04 19:17:19 +0000207 size_type pos2, size_type n2=npos); // C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000208 basic_string& replace(size_type pos, size_type n1, const value_type* s, size_type n2);
209 basic_string& replace(size_type pos, size_type n1, const value_type* s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000210 basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c);
Howard Hinnant7b2cb482010-11-17 21:11:40 +0000211 basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000212 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s, size_type n);
213 basic_string& replace(const_iterator i1, const_iterator i2, const value_type* s);
Howard Hinnant7b2cb482010-11-17 21:11:40 +0000214 basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c);
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000215 template<class InputIterator>
Howard Hinnant7b2cb482010-11-17 21:11:40 +0000216 basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2);
217 basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000218
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000219 size_type copy(value_type* s, size_type n, size_type pos = 0) const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000220 basic_string substr(size_type pos = 0, size_type n = npos) const;
221
Howard Hinnant53f7d4c2011-06-03 18:40:47 +0000222 void swap(basic_string& str)
Marshall Clow7d914d12015-07-13 20:04:56 +0000223 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
224 allocator_traits<allocator_type>::is_always_equal::value); // C++17
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000225
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000226 const value_type* c_str() const noexcept;
227 const value_type* data() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000228
Howard Hinnanta6119a82011-05-29 19:57:12 +0000229 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000230
Howard Hinnanta6119a82011-05-29 19:57:12 +0000231 size_type find(const basic_string& str, size_type pos = 0) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000232 size_type find(const value_type* s, size_type pos, size_type n) const noexcept;
233 size_type find(const value_type* s, size_type pos = 0) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000234 size_type find(value_type c, size_type pos = 0) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000235
Howard Hinnanta6119a82011-05-29 19:57:12 +0000236 size_type rfind(const basic_string& str, size_type pos = npos) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000237 size_type rfind(const value_type* s, size_type pos, size_type n) const noexcept;
238 size_type rfind(const value_type* s, size_type pos = npos) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000239 size_type rfind(value_type c, size_type pos = npos) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000240
Howard Hinnanta6119a82011-05-29 19:57:12 +0000241 size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000242 size_type find_first_of(const value_type* s, size_type pos, size_type n) const noexcept;
243 size_type find_first_of(const value_type* s, size_type pos = 0) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000244 size_type find_first_of(value_type c, size_type pos = 0) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000245
Howard Hinnanta6119a82011-05-29 19:57:12 +0000246 size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000247 size_type find_last_of(const value_type* s, size_type pos, size_type n) const noexcept;
248 size_type find_last_of(const value_type* s, size_type pos = npos) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000249 size_type find_last_of(value_type c, size_type pos = npos) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000250
Howard Hinnanta6119a82011-05-29 19:57:12 +0000251 size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000252 size_type find_first_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
253 size_type find_first_not_of(const value_type* s, size_type pos = 0) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000254 size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000255
Howard Hinnanta6119a82011-05-29 19:57:12 +0000256 size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000257 size_type find_last_not_of(const value_type* s, size_type pos, size_type n) const noexcept;
258 size_type find_last_not_of(const value_type* s, size_type pos = npos) const noexcept;
Howard Hinnanta6119a82011-05-29 19:57:12 +0000259 size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000260
Howard Hinnanta6119a82011-05-29 19:57:12 +0000261 int compare(const basic_string& str) const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000262 int compare(size_type pos1, size_type n1, const basic_string& str) const;
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000263 int compare(size_type pos1, size_type n1, const basic_string& str,
Marshall Clowa93b5e22014-03-04 19:17:19 +0000264 size_type pos2, size_type n2=npos) const; // C++14
Howard Hinnant9dcdcde2013-06-28 16:59:19 +0000265 int compare(const value_type* s) const noexcept;
266 int compare(size_type pos1, size_type n1, const value_type* s) const;
267 int compare(size_type pos1, size_type n1, const value_type* s, size_type n2) const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000268
269 bool __invariants() const;
270};
271
272template<class charT, class traits, class Allocator>
273basic_string<charT, traits, Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000274operator+(const basic_string<charT, traits, Allocator>& lhs,
275 const basic_string<charT, traits, Allocator>& rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000276
277template<class charT, class traits, class Allocator>
278basic_string<charT, traits, Allocator>
279operator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs);
280
281template<class charT, class traits, class Allocator>
282basic_string<charT, traits, Allocator>
283operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs);
284
285template<class charT, class traits, class Allocator>
286basic_string<charT, traits, Allocator>
287operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
288
289template<class charT, class traits, class Allocator>
290basic_string<charT, traits, Allocator>
291operator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs);
292
293template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000294bool operator==(const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000295 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000296
297template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000298bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000299
300template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000301bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000302
Howard Hinnant324bb032010-08-22 00:02:43 +0000303template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000304bool operator!=(const basic_string<charT,traits,Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000305 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000306
307template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000308bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000309
310template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000311bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000312
313template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000314bool operator< (const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000315 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000316
317template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000318bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000319
320template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000321bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000322
323template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000324bool operator> (const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000325 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000326
327template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000328bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000329
330template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000331bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000332
333template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000334bool operator<=(const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000335 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000336
337template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000338bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000339
340template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000341bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000342
343template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000344bool operator>=(const basic_string<charT, traits, Allocator>& lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +0000345 const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000346
347template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000348bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000349
350template<class charT, class traits, class Allocator>
Howard Hinnanta6119a82011-05-29 19:57:12 +0000351bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000352
353template<class charT, class traits, class Allocator>
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000354void swap(basic_string<charT, traits, Allocator>& lhs,
Howard Hinnant53f7d4c2011-06-03 18:40:47 +0000355 basic_string<charT, traits, Allocator>& rhs)
356 noexcept(noexcept(lhs.swap(rhs)));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000357
358template<class charT, class traits, class Allocator>
359basic_istream<charT, traits>&
360operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
361
362template<class charT, class traits, class Allocator>
363basic_ostream<charT, traits>&
364operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
365
366template<class charT, class traits, class Allocator>
Howard Hinnant324bb032010-08-22 00:02:43 +0000367basic_istream<charT, traits>&
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000368getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str,
369 charT delim);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000370
371template<class charT, class traits, class Allocator>
372basic_istream<charT, traits>&
373getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
374
375typedef basic_string<char> string;
376typedef basic_string<wchar_t> wstring;
Howard Hinnanta6a062d2010-06-02 18:20:39 +0000377typedef basic_string<char16_t> u16string;
378typedef basic_string<char32_t> u32string;
379
380int stoi (const string& str, size_t* idx = 0, int base = 10);
381long stol (const string& str, size_t* idx = 0, int base = 10);
382unsigned long stoul (const string& str, size_t* idx = 0, int base = 10);
383long long stoll (const string& str, size_t* idx = 0, int base = 10);
384unsigned long long stoull(const string& str, size_t* idx = 0, int base = 10);
385
386float stof (const string& str, size_t* idx = 0);
387double stod (const string& str, size_t* idx = 0);
388long double stold(const string& str, size_t* idx = 0);
389
390string to_string(int val);
391string to_string(unsigned val);
392string to_string(long val);
393string to_string(unsigned long val);
394string to_string(long long val);
395string to_string(unsigned long long val);
396string to_string(float val);
397string to_string(double val);
398string to_string(long double val);
399
400int stoi (const wstring& str, size_t* idx = 0, int base = 10);
401long stol (const wstring& str, size_t* idx = 0, int base = 10);
402unsigned long stoul (const wstring& str, size_t* idx = 0, int base = 10);
403long long stoll (const wstring& str, size_t* idx = 0, int base = 10);
404unsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10);
405
406float stof (const wstring& str, size_t* idx = 0);
407double stod (const wstring& str, size_t* idx = 0);
408long double stold(const wstring& str, size_t* idx = 0);
409
410wstring to_wstring(int val);
411wstring to_wstring(unsigned val);
412wstring to_wstring(long val);
413wstring to_wstring(unsigned long val);
414wstring to_wstring(long long val);
415wstring to_wstring(unsigned long long val);
416wstring to_wstring(float val);
417wstring to_wstring(double val);
418wstring to_wstring(long double val);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000419
420template <> struct hash<string>;
421template <> struct hash<u16string>;
422template <> struct hash<u32string>;
423template <> struct hash<wstring>;
424
Marshall Clow15234322013-07-23 17:05:24 +0000425basic_string<char> operator "" s( const char *str, size_t len ); // C++14
426basic_string<wchar_t> operator "" s( const wchar_t *str, size_t len ); // C++14
427basic_string<char16_t> operator "" s( const char16_t *str, size_t len ); // C++14
428basic_string<char32_t> operator "" s( const char32_t *str, size_t len ); // C++14
429
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000430} // std
431
432*/
433
434#include <__config>
435#include <iosfwd>
436#include <cstring>
Howard Hinnantadff4892010-05-24 17:49:41 +0000437#include <cstdio> // For EOF.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000438#include <cwchar>
439#include <algorithm>
440#include <iterator>
441#include <utility>
442#include <memory>
443#include <stdexcept>
444#include <type_traits>
445#include <initializer_list>
446#include <__functional_base>
447#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
448#include <cstdint>
449#endif
Howard Hinnant499cea12013-08-23 17:37:05 +0000450#if defined(_LIBCPP_NO_EXCEPTIONS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000451#include <cassert>
452#endif
453
Howard Hinnant66c6f972011-11-29 16:45:27 +0000454#include <__undef_min_max>
455
Eric Fiselierb9536102014-08-10 23:53:08 +0000456#include <__debug>
457
Howard Hinnant08e17472011-10-17 20:05:10 +0000458#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000459#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000460#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000461
462_LIBCPP_BEGIN_NAMESPACE_STD
463
464// fpos
465
466template <class _StateT>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000467class _LIBCPP_TYPE_VIS_ONLY fpos
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000468{
469private:
470 _StateT __st_;
471 streamoff __off_;
472public:
473 _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {}
474
475 _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;}
476
477 _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;}
478 _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;}
479
480 _LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;}
481 _LIBCPP_INLINE_VISIBILITY fpos operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;}
482 _LIBCPP_INLINE_VISIBILITY fpos& operator-=(streamoff __off) {__off_ -= __off; return *this;}
483 _LIBCPP_INLINE_VISIBILITY fpos operator- (streamoff __off) const {fpos __t(*this); __t -= __off; return __t;}
484};
485
486template <class _StateT>
487inline _LIBCPP_INLINE_VISIBILITY
488streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
489 {return streamoff(__x) - streamoff(__y);}
490
491template <class _StateT>
492inline _LIBCPP_INLINE_VISIBILITY
493bool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
494 {return streamoff(__x) == streamoff(__y);}
495
496template <class _StateT>
497inline _LIBCPP_INLINE_VISIBILITY
498bool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y)
499 {return streamoff(__x) != streamoff(__y);}
500
501// char_traits
502
503template <class _CharT>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000504struct _LIBCPP_TYPE_VIS_ONLY char_traits
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000505{
506 typedef _CharT char_type;
507 typedef int int_type;
508 typedef streamoff off_type;
509 typedef streampos pos_type;
510 typedef mbstate_t state_type;
511
Dan Albert6d9505a2014-09-17 16:34:29 +0000512 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000513 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000514 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000515 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000516 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000517 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000518
519 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
520 static size_t length(const char_type* __s);
521 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
522 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
523 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
524 static char_type* assign(char_type* __s, size_t __n, char_type __a);
525
Dan Albert6d9505a2014-09-17 16:34:29 +0000526 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000527 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000528 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000529 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000530 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000531 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000532 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000533 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000534 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000535 {return int_type(EOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000536};
537
538template <class _CharT>
539int
540char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
541{
542 for (; __n; --__n, ++__s1, ++__s2)
543 {
544 if (lt(*__s1, *__s2))
545 return -1;
546 if (lt(*__s2, *__s1))
547 return 1;
548 }
549 return 0;
550}
551
552template <class _CharT>
553inline _LIBCPP_INLINE_VISIBILITY
554size_t
555char_traits<_CharT>::length(const char_type* __s)
556{
557 size_t __len = 0;
558 for (; !eq(*__s, char_type(0)); ++__s)
559 ++__len;
560 return __len;
561}
562
563template <class _CharT>
564inline _LIBCPP_INLINE_VISIBILITY
565const _CharT*
566char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a)
567{
568 for (; __n; --__n)
569 {
570 if (eq(*__s, __a))
571 return __s;
572 ++__s;
573 }
574 return 0;
575}
576
577template <class _CharT>
578_CharT*
579char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n)
580{
581 char_type* __r = __s1;
582 if (__s1 < __s2)
583 {
584 for (; __n; --__n, ++__s1, ++__s2)
585 assign(*__s1, *__s2);
586 }
587 else if (__s2 < __s1)
588 {
589 __s1 += __n;
590 __s2 += __n;
591 for (; __n; --__n)
592 assign(*--__s1, *--__s2);
593 }
594 return __r;
595}
596
597template <class _CharT>
598inline _LIBCPP_INLINE_VISIBILITY
599_CharT*
600char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
601{
Howard Hinnant499cea12013-08-23 17:37:05 +0000602 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000603 char_type* __r = __s1;
604 for (; __n; --__n, ++__s1, ++__s2)
605 assign(*__s1, *__s2);
606 return __r;
607}
608
609template <class _CharT>
610inline _LIBCPP_INLINE_VISIBILITY
611_CharT*
612char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a)
613{
614 char_type* __r = __s;
615 for (; __n; --__n, ++__s)
616 assign(*__s, __a);
617 return __r;
618}
619
620// char_traits<char>
621
622template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000623struct _LIBCPP_TYPE_VIS_ONLY char_traits<char>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000624{
625 typedef char char_type;
626 typedef int int_type;
627 typedef streamoff off_type;
628 typedef streampos pos_type;
629 typedef mbstate_t state_type;
630
Dan Albert6d9505a2014-09-17 16:34:29 +0000631 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000632 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000633 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000634 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000635 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000636 {return (unsigned char)__c1 < (unsigned char)__c2;}
637
Dan Albert6d9505a2014-09-17 16:34:29 +0000638 static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clowf2e36ef2015-02-12 23:34:52 +0000639 {return __n == 0 ? 0 : memcmp(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000640 static inline size_t length(const char_type* __s) {return strlen(__s);}
641 static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000642 {return __n == 0 ? NULL : (const char_type*) memchr(__s, to_int_type(__a), __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000643 static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000644 {return __n == 0 ? __s1 : (char_type*) memmove(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000645 static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnant499cea12013-08-23 17:37:05 +0000646 {
647 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Marshall Clow6bcbced2015-02-13 16:04:42 +0000648 return __n == 0 ? __s1 : (char_type*)memcpy(__s1, __s2, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +0000649 }
Dan Albert6d9505a2014-09-17 16:34:29 +0000650 static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000651 {return __n == 0 ? __s : (char_type*)memset(__s, to_int_type(__a), __n);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000652
Dan Albert6d9505a2014-09-17 16:34:29 +0000653 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000654 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000655 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000656 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000657 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000658 {return int_type((unsigned char)__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000659 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000660 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000661 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000662 {return int_type(EOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000663};
664
665// char_traits<wchar_t>
666
667template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000668struct _LIBCPP_TYPE_VIS_ONLY char_traits<wchar_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000669{
670 typedef wchar_t char_type;
671 typedef wint_t int_type;
672 typedef streamoff off_type;
673 typedef streampos pos_type;
674 typedef mbstate_t state_type;
675
Dan Albert6d9505a2014-09-17 16:34:29 +0000676 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000677 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000678 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000679 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000680 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000681 {return __c1 < __c2;}
682
Dan Albert6d9505a2014-09-17 16:34:29 +0000683 static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clowf2e36ef2015-02-12 23:34:52 +0000684 {return __n == 0 ? 0 : wmemcmp(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000685 static inline size_t length(const char_type* __s)
Howard Hinnanta6119a82011-05-29 19:57:12 +0000686 {return wcslen(__s);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000687 static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000688 {return __n == 0 ? NULL : (const char_type*)wmemchr(__s, __a, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000689 static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000690 {return __n == 0 ? __s1 : (char_type*)wmemmove(__s1, __s2, __n);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000691 static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n)
Howard Hinnant499cea12013-08-23 17:37:05 +0000692 {
693 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Marshall Clow6bcbced2015-02-13 16:04:42 +0000694 return __n == 0 ? __s1 : (char_type*)wmemcpy(__s1, __s2, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +0000695 }
Dan Albert6d9505a2014-09-17 16:34:29 +0000696 static inline char_type* assign(char_type* __s, size_t __n, char_type __a)
Marshall Clow6bcbced2015-02-13 16:04:42 +0000697 {return __n == 0 ? __s : (char_type*)wmemset(__s, __a, __n);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000698
Dan Albert6d9505a2014-09-17 16:34:29 +0000699 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000700 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000701 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000702 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000703 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000704 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000705 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000706 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000707 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000708 {return int_type(WEOF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000709};
710
711#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
712
713template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000714struct _LIBCPP_TYPE_VIS_ONLY char_traits<char16_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000715{
716 typedef char16_t char_type;
717 typedef uint_least16_t int_type;
718 typedef streamoff off_type;
719 typedef u16streampos pos_type;
720 typedef mbstate_t state_type;
721
Dan Albert6d9505a2014-09-17 16:34:29 +0000722 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000723 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000724 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000725 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000726 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000727 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000728
729 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
730 static size_t length(const char_type* __s);
731 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
732 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
733 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
734 static char_type* assign(char_type* __s, size_t __n, char_type __a);
735
Dan Albert6d9505a2014-09-17 16:34:29 +0000736 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000737 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000738 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000739 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000740 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000741 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000742 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000743 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000744 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Marshall Clow9a3c6892015-08-04 01:38:34 +0000745 {return int_type(0xFFFF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000746};
747
748inline _LIBCPP_INLINE_VISIBILITY
749int
750char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
751{
752 for (; __n; --__n, ++__s1, ++__s2)
753 {
754 if (lt(*__s1, *__s2))
755 return -1;
756 if (lt(*__s2, *__s1))
757 return 1;
758 }
759 return 0;
760}
761
762inline _LIBCPP_INLINE_VISIBILITY
763size_t
764char_traits<char16_t>::length(const char_type* __s)
765{
766 size_t __len = 0;
767 for (; !eq(*__s, char_type(0)); ++__s)
768 ++__len;
769 return __len;
770}
771
772inline _LIBCPP_INLINE_VISIBILITY
773const char16_t*
774char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a)
775{
776 for (; __n; --__n)
777 {
778 if (eq(*__s, __a))
779 return __s;
780 ++__s;
781 }
782 return 0;
783}
784
785inline _LIBCPP_INLINE_VISIBILITY
786char16_t*
787char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
788{
789 char_type* __r = __s1;
790 if (__s1 < __s2)
791 {
792 for (; __n; --__n, ++__s1, ++__s2)
793 assign(*__s1, *__s2);
794 }
795 else if (__s2 < __s1)
796 {
797 __s1 += __n;
798 __s2 += __n;
799 for (; __n; --__n)
800 assign(*--__s1, *--__s2);
801 }
802 return __r;
803}
804
805inline _LIBCPP_INLINE_VISIBILITY
806char16_t*
807char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
808{
Howard Hinnant499cea12013-08-23 17:37:05 +0000809 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000810 char_type* __r = __s1;
811 for (; __n; --__n, ++__s1, ++__s2)
812 assign(*__s1, *__s2);
813 return __r;
814}
815
816inline _LIBCPP_INLINE_VISIBILITY
817char16_t*
818char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a)
819{
820 char_type* __r = __s;
821 for (; __n; --__n, ++__s)
822 assign(*__s, __a);
823 return __r;
824}
825
826template <>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000827struct _LIBCPP_TYPE_VIS_ONLY char_traits<char32_t>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000828{
829 typedef char32_t char_type;
830 typedef uint_least32_t int_type;
831 typedef streamoff off_type;
832 typedef u32streampos pos_type;
833 typedef mbstate_t state_type;
834
Dan Albert6d9505a2014-09-17 16:34:29 +0000835 static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000836 {__c1 = __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000837 static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000838 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000839 static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000840 {return __c1 < __c2;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000841
842 static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
843 static size_t length(const char_type* __s);
844 static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
845 static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
846 static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
847 static char_type* assign(char_type* __s, size_t __n, char_type __a);
848
Dan Albert6d9505a2014-09-17 16:34:29 +0000849 static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000850 {return eq_int_type(__c, eof()) ? ~eof() : __c;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000851 static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000852 {return char_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000853 static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000854 {return int_type(__c);}
Dan Albert6d9505a2014-09-17 16:34:29 +0000855 static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000856 {return __c1 == __c2;}
Dan Albert6d9505a2014-09-17 16:34:29 +0000857 static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +0000858 {return int_type(0xFFFFFFFF);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000859};
860
861inline _LIBCPP_INLINE_VISIBILITY
862int
863char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
864{
865 for (; __n; --__n, ++__s1, ++__s2)
866 {
867 if (lt(*__s1, *__s2))
868 return -1;
869 if (lt(*__s2, *__s1))
870 return 1;
871 }
872 return 0;
873}
874
875inline _LIBCPP_INLINE_VISIBILITY
876size_t
877char_traits<char32_t>::length(const char_type* __s)
878{
879 size_t __len = 0;
880 for (; !eq(*__s, char_type(0)); ++__s)
881 ++__len;
882 return __len;
883}
884
885inline _LIBCPP_INLINE_VISIBILITY
886const char32_t*
887char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a)
888{
889 for (; __n; --__n)
890 {
891 if (eq(*__s, __a))
892 return __s;
893 ++__s;
894 }
895 return 0;
896}
897
898inline _LIBCPP_INLINE_VISIBILITY
899char32_t*
900char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n)
901{
902 char_type* __r = __s1;
903 if (__s1 < __s2)
904 {
905 for (; __n; --__n, ++__s1, ++__s2)
906 assign(*__s1, *__s2);
907 }
908 else if (__s2 < __s1)
909 {
910 __s1 += __n;
911 __s2 += __n;
912 for (; __n; --__n)
913 assign(*--__s1, *--__s2);
914 }
915 return __r;
916}
917
918inline _LIBCPP_INLINE_VISIBILITY
919char32_t*
920char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n)
921{
Howard Hinnant499cea12013-08-23 17:37:05 +0000922 _LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000923 char_type* __r = __s1;
924 for (; __n; --__n, ++__s1, ++__s2)
925 assign(*__s1, *__s2);
926 return __r;
927}
928
929inline _LIBCPP_INLINE_VISIBILITY
930char32_t*
931char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a)
932{
933 char_type* __r = __s;
934 for (; __n; --__n, ++__s)
935 assign(*__s, __a);
936 return __r;
937}
938
Howard Hinnant324bb032010-08-22 00:02:43 +0000939#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000940
Marshall Clowb671fc92013-12-09 16:00:28 +0000941// helper fns for basic_string
942
Marshall Clow37025e12014-06-10 18:51:55 +0000943// __str_find
Marshall Clowb671fc92013-12-09 16:00:28 +0000944template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +0000945_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +0000946__str_find(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +0000947 _CharT __c, _SizeT __pos) _NOEXCEPT
948{
949 if (__pos >= __sz)
950 return __npos;
951 const _CharT* __r = _Traits::find(__p + __pos, __sz - __pos, __c);
952 if (__r == 0)
953 return __npos;
954 return static_cast<_SizeT>(__r - __p);
955}
956
957template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
958_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +0000959__str_find(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +0000960 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
961{
962 if (__pos > __sz || __sz - __pos < __n)
963 return __npos;
964 if (__n == 0)
965 return __pos;
Marshall Clow360f3192014-06-02 02:22:49 +0000966 const _CharT* __r =
Marshall Clow37025e12014-06-10 18:51:55 +0000967 _VSTD::__search(__p + __pos, __p + __sz,
968 __s, __s + __n, _Traits::eq,
969 random_access_iterator_tag(), random_access_iterator_tag());
Marshall Clow360f3192014-06-02 02:22:49 +0000970 if (__r == __p + __sz)
971 return __npos;
972 return static_cast<_SizeT>(__r - __p);
973}
974
975
Marshall Clow37025e12014-06-10 18:51:55 +0000976// __str_rfind
Marshall Clow360f3192014-06-02 02:22:49 +0000977
978template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
979_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +0000980__str_rfind(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +0000981 _CharT __c, _SizeT __pos) _NOEXCEPT
982{
983 if (__sz < 1)
Marshall Clowd5549cc2014-07-17 15:32:20 +0000984 return __npos;
985 if (__pos < __sz)
986 ++__pos;
987 else
988 __pos = __sz;
989 for (const _CharT* __ps = __p + __pos; __ps != __p;)
990 {
991 if (_Traits::eq(*--__ps, __c))
992 return static_cast<_SizeT>(__ps - __p);
993 }
Marshall Clow360f3192014-06-02 02:22:49 +0000994 return __npos;
995}
996
997template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
998_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +0000999__str_rfind(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001000 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
1001{
1002 __pos = _VSTD::min(__pos, __sz);
1003 if (__n < __sz - __pos)
1004 __pos += __n;
1005 else
1006 __pos = __sz;
Marshall Clow37025e12014-06-10 18:51:55 +00001007 const _CharT* __r = _VSTD::__find_end(
1008 __p, __p + __pos, __s, __s + __n, _Traits::eq,
1009 random_access_iterator_tag(), random_access_iterator_tag());
Marshall Clow360f3192014-06-02 02:22:49 +00001010 if (__n > 0 && __r == __p + __pos)
1011 return __npos;
1012 return static_cast<_SizeT>(__r - __p);
1013}
1014
Marshall Clow37025e12014-06-10 18:51:55 +00001015// __str_find_first_of
Marshall Clow360f3192014-06-02 02:22:49 +00001016template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
1017_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001018__str_find_first_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001019 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001020{
1021 if (__pos >= __sz || __n == 0)
1022 return __npos;
Marshall Clow37025e12014-06-10 18:51:55 +00001023 const _CharT* __r = _VSTD::__find_first_of_ce
Marshall Clowb671fc92013-12-09 16:00:28 +00001024 (__p + __pos, __p + __sz, __s, __s + __n, _Traits::eq );
1025 if (__r == __p + __sz)
1026 return __npos;
1027 return static_cast<_SizeT>(__r - __p);
1028}
1029
Marshall Clow360f3192014-06-02 02:22:49 +00001030
Marshall Clow37025e12014-06-10 18:51:55 +00001031// __str_find_last_of
Marshall Clowb671fc92013-12-09 16:00:28 +00001032template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001033_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001034__str_find_last_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001035 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001036 {
1037 if (__n != 0)
1038 {
1039 if (__pos < __sz)
1040 ++__pos;
1041 else
1042 __pos = __sz;
1043 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1044 {
1045 const _CharT* __r = _Traits::find(__s, __n, *--__ps);
1046 if (__r)
1047 return static_cast<_SizeT>(__ps - __p);
1048 }
1049 }
1050 return __npos;
1051}
1052
1053
Marshall Clow37025e12014-06-10 18:51:55 +00001054// __str_find_first_not_of
Marshall Clowb671fc92013-12-09 16:00:28 +00001055template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001056_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001057__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001058 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001059{
1060 if (__pos < __sz)
1061 {
1062 const _CharT* __pe = __p + __sz;
1063 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1064 if (_Traits::find(__s, __n, *__ps) == 0)
1065 return static_cast<_SizeT>(__ps - __p);
1066 }
1067 return __npos;
1068}
1069
1070
1071template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001072_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001073__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001074 _CharT __c, _SizeT __pos) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001075{
1076 if (__pos < __sz)
1077 {
1078 const _CharT* __pe = __p + __sz;
1079 for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
1080 if (!_Traits::eq(*__ps, __c))
1081 return static_cast<_SizeT>(__ps - __p);
1082 }
1083 return __npos;
1084}
1085
1086
Marshall Clow37025e12014-06-10 18:51:55 +00001087// __str_find_last_not_of
Marshall Clowb671fc92013-12-09 16:00:28 +00001088template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001089_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001090__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001091 const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001092{
1093 if (__pos < __sz)
1094 ++__pos;
1095 else
1096 __pos = __sz;
1097 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1098 if (_Traits::find(__s, __n, *--__ps) == 0)
1099 return static_cast<_SizeT>(__ps - __p);
1100 return __npos;
1101}
1102
1103
1104template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
Marshall Clow360f3192014-06-02 02:22:49 +00001105_SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
Marshall Clow37025e12014-06-10 18:51:55 +00001106__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
Marshall Clow360f3192014-06-02 02:22:49 +00001107 _CharT __c, _SizeT __pos) _NOEXCEPT
Marshall Clowb671fc92013-12-09 16:00:28 +00001108{
1109 if (__pos < __sz)
1110 ++__pos;
1111 else
1112 __pos = __sz;
1113 for (const _CharT* __ps = __p + __pos; __ps != __p;)
1114 if (!_Traits::eq(*--__ps, __c))
1115 return static_cast<_SizeT>(__ps - __p);
1116 return __npos;
1117}
1118
1119template<class _Ptr>
1120size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e)
1121{
1122 typedef typename iterator_traits<_Ptr>::value_type value_type;
1123 return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type));
1124}
1125
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001126// basic_string
1127
1128template<class _CharT, class _Traits, class _Allocator>
1129basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001130operator+(const basic_string<_CharT, _Traits, _Allocator>& __x,
1131 const basic_string<_CharT, _Traits, _Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001132
1133template<class _CharT, class _Traits, class _Allocator>
1134basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001135operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001136
1137template<class _CharT, class _Traits, class _Allocator>
1138basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001139operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001140
1141template<class _CharT, class _Traits, class _Allocator>
1142basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001143operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001144
1145template<class _CharT, class _Traits, class _Allocator>
1146basic_string<_CharT, _Traits, _Allocator>
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00001147operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001148
1149template <bool>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001150class _LIBCPP_TYPE_VIS_ONLY __basic_string_common
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001151{
1152protected:
1153 void __throw_length_error() const;
1154 void __throw_out_of_range() const;
1155};
1156
1157template <bool __b>
1158void
1159__basic_string_common<__b>::__throw_length_error() const
1160{
1161#ifndef _LIBCPP_NO_EXCEPTIONS
1162 throw length_error("basic_string");
1163#else
1164 assert(!"basic_string length_error");
1165#endif
1166}
1167
1168template <bool __b>
1169void
1170__basic_string_common<__b>::__throw_out_of_range() const
1171{
1172#ifndef _LIBCPP_NO_EXCEPTIONS
1173 throw out_of_range("basic_string");
1174#else
1175 assert(!"basic_string out_of_range");
1176#endif
1177}
1178
Howard Hinnante9df0a52013-08-01 18:17:34 +00001179#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:45 +00001180#pragma warning( push )
1181#pragma warning( disable: 4231 )
Howard Hinnante9df0a52013-08-01 18:17:34 +00001182#endif // _LIBCPP_MSVC
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001183_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS __basic_string_common<true>)
Howard Hinnante9df0a52013-08-01 18:17:34 +00001184#ifdef _LIBCPP_MSVC
Howard Hinnant78b68282011-10-22 20:59:45 +00001185#pragma warning( pop )
Howard Hinnante9df0a52013-08-01 18:17:34 +00001186#endif // _LIBCPP_MSVC
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001187
Howard Hinnant15467182013-04-30 21:44:48 +00001188#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT
1189
1190template <class _CharT, size_t = sizeof(_CharT)>
1191struct __padding
1192{
1193 unsigned char __xx[sizeof(_CharT)-1];
1194};
1195
1196template <class _CharT>
1197struct __padding<_CharT, 1>
1198{
1199};
1200
1201#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT
1202
Howard Hinnant324bb032010-08-22 00:02:43 +00001203template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001204class _LIBCPP_TYPE_VIS_ONLY basic_string
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001205 : private __basic_string_common<true>
1206{
1207public:
1208 typedef basic_string __self;
1209 typedef _Traits traits_type;
1210 typedef typename traits_type::char_type value_type;
1211 typedef _Allocator allocator_type;
Howard Hinnante32b5e22010-11-17 17:55:08 +00001212 typedef allocator_traits<allocator_type> __alloc_traits;
1213 typedef typename __alloc_traits::size_type size_type;
1214 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001215 typedef value_type& reference;
1216 typedef const value_type& const_reference;
Howard Hinnante32b5e22010-11-17 17:55:08 +00001217 typedef typename __alloc_traits::pointer pointer;
1218 typedef typename __alloc_traits::const_pointer const_pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001219
Howard Hinnant499cea12013-08-23 17:37:05 +00001220 static_assert(is_pod<value_type>::value, "Character type of basic_string must be a POD");
1221 static_assert((is_same<_CharT, value_type>::value),
1222 "traits_type::char_type must be the same type as CharT");
1223 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1224 "Allocator::value_type must be same type as value_type");
1225#if defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001226 typedef pointer iterator;
1227 typedef const_pointer const_iterator;
Howard Hinnant324bb032010-08-22 00:02:43 +00001228#else // defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001229 typedef __wrap_iter<pointer> iterator;
1230 typedef __wrap_iter<const_pointer> const_iterator;
Howard Hinnant324bb032010-08-22 00:02:43 +00001231#endif // defined(_LIBCPP_RAW_ITERATORS)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001232 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1233 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001234
1235private:
Howard Hinnant15467182013-04-30 21:44:48 +00001236
1237#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT
1238
1239 struct __long
1240 {
1241 pointer __data_;
1242 size_type __size_;
1243 size_type __cap_;
1244 };
1245
1246#if _LIBCPP_BIG_ENDIAN
1247 enum {__short_mask = 0x01};
1248 enum {__long_mask = 0x1ul};
1249#else // _LIBCPP_BIG_ENDIAN
1250 enum {__short_mask = 0x80};
1251 enum {__long_mask = ~(size_type(~0) >> 1)};
1252#endif // _LIBCPP_BIG_ENDIAN
1253
1254 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1255 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1256
1257 struct __short
1258 {
1259 value_type __data_[__min_cap];
1260 struct
1261 : __padding<value_type>
1262 {
1263 unsigned char __size_;
1264 };
1265 };
1266
1267#else
1268
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001269 struct __long
1270 {
1271 size_type __cap_;
1272 size_type __size_;
1273 pointer __data_;
1274 };
1275
1276#if _LIBCPP_BIG_ENDIAN
1277 enum {__short_mask = 0x80};
1278 enum {__long_mask = ~(size_type(~0) >> 1)};
Howard Hinnant324bb032010-08-22 00:02:43 +00001279#else // _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001280 enum {__short_mask = 0x01};
Howard Hinnantec3773c2011-12-01 20:21:04 +00001281 enum {__long_mask = 0x1ul};
Howard Hinnant324bb032010-08-22 00:02:43 +00001282#endif // _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001283
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001284 enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?
1285 (sizeof(__long) - 1)/sizeof(value_type) : 2};
1286
1287 struct __short
1288 {
1289 union
1290 {
1291 unsigned char __size_;
Howard Hinnant9c0df142012-10-30 19:06:59 +00001292 value_type __lx;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001293 };
1294 value_type __data_[__min_cap];
1295 };
1296
Howard Hinnant15467182013-04-30 21:44:48 +00001297#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT
1298
Howard Hinnant499cea12013-08-23 17:37:05 +00001299 union __ulx{__long __lx; __short __lxx;};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001300
Howard Hinnant499cea12013-08-23 17:37:05 +00001301 enum {__n_words = sizeof(__ulx) / sizeof(size_type)};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001302
1303 struct __raw
1304 {
1305 size_type __words[__n_words];
1306 };
1307
1308 struct __rep
1309 {
1310 union
1311 {
1312 __long __l;
1313 __short __s;
1314 __raw __r;
1315 };
1316 };
1317
1318 __compressed_pair<__rep, allocator_type> __r_;
1319
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001320public:
1321 static const size_type npos = -1;
1322
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001323 _LIBCPP_INLINE_VISIBILITY basic_string()
1324 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Marshall Clow7b193f72015-06-03 19:56:43 +00001325
1326 _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a)
1327#if _LIBCPP_STD_VER <= 14
1328 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
1329#else
1330 _NOEXCEPT;
1331#endif
1332
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001333 basic_string(const basic_string& __str);
1334 basic_string(const basic_string& __str, const allocator_type& __a);
Marshall Clow7b193f72015-06-03 19:56:43 +00001335
Howard Hinnant73d21a42010-09-04 23:28:19 +00001336#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant9f193f22011-01-26 00:06:59 +00001337 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001338 basic_string(basic_string&& __str)
Marshall Clow7b193f72015-06-03 19:56:43 +00001339#if _LIBCPP_STD_VER <= 14
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001340 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clow7b193f72015-06-03 19:56:43 +00001341#else
1342 _NOEXCEPT;
1343#endif
1344
Howard Hinnant9f193f22011-01-26 00:06:59 +00001345 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001346 basic_string(basic_string&& __str, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19 +00001347#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001348 _LIBCPP_INLINE_VISIBILITY basic_string(const value_type* __s);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001349 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001350 basic_string(const value_type* __s, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001351 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001352 basic_string(const value_type* __s, size_type __n);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001353 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001354 basic_string(const value_type* __s, size_type __n, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001355 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001356 basic_string(size_type __n, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001357 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001358 basic_string(size_type __n, value_type __c, const allocator_type& __a);
1359 basic_string(const basic_string& __str, size_type __pos, size_type __n = npos,
1360 const allocator_type& __a = allocator_type());
1361 template<class _InputIterator>
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001362 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001363 basic_string(_InputIterator __first, _InputIterator __last);
1364 template<class _InputIterator>
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001365 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001366 basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +00001367#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001368 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001369 basic_string(initializer_list<value_type> __il);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001370 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001371 basic_string(initializer_list<value_type> __il, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +00001372#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001373
1374 ~basic_string();
1375
Howard Hinnante32b5e22010-11-17 17:55:08 +00001376 basic_string& operator=(const basic_string& __str);
Howard Hinnant73d21a42010-09-04 23:28:19 +00001377#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001378 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001379 basic_string& operator=(basic_string&& __str)
Marshall Clowaf961ed2015-08-18 18:57:00 +00001380 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001381#endif
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001382 _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001383 basic_string& operator=(value_type __c);
Howard Hinnante3e32912011-08-12 21:56:02 +00001384#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001385 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001386 basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001387#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001388
Howard Hinnant499cea12013-08-23 17:37:05 +00001389#if _LIBCPP_DEBUG_LEVEL >= 2
1390 _LIBCPP_INLINE_VISIBILITY
1391 iterator begin() _NOEXCEPT
1392 {return iterator(this, __get_pointer());}
1393 _LIBCPP_INLINE_VISIBILITY
1394 const_iterator begin() const _NOEXCEPT
1395 {return const_iterator(this, __get_pointer());}
1396 _LIBCPP_INLINE_VISIBILITY
1397 iterator end() _NOEXCEPT
1398 {return iterator(this, __get_pointer() + size());}
1399 _LIBCPP_INLINE_VISIBILITY
1400 const_iterator end() const _NOEXCEPT
1401 {return const_iterator(this, __get_pointer() + size());}
1402#else
Howard Hinnanta6119a82011-05-29 19:57:12 +00001403 _LIBCPP_INLINE_VISIBILITY
1404 iterator begin() _NOEXCEPT
1405 {return iterator(__get_pointer());}
1406 _LIBCPP_INLINE_VISIBILITY
1407 const_iterator begin() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001408 {return const_iterator(__get_pointer());}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001409 _LIBCPP_INLINE_VISIBILITY
1410 iterator end() _NOEXCEPT
1411 {return iterator(__get_pointer() + size());}
1412 _LIBCPP_INLINE_VISIBILITY
1413 const_iterator end() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001414 {return const_iterator(__get_pointer() + size());}
Howard Hinnant499cea12013-08-23 17:37:05 +00001415#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnanta6119a82011-05-29 19:57:12 +00001416 _LIBCPP_INLINE_VISIBILITY
1417 reverse_iterator rbegin() _NOEXCEPT
1418 {return reverse_iterator(end());}
1419 _LIBCPP_INLINE_VISIBILITY
1420 const_reverse_iterator rbegin() const _NOEXCEPT
1421 {return const_reverse_iterator(end());}
1422 _LIBCPP_INLINE_VISIBILITY
1423 reverse_iterator rend() _NOEXCEPT
1424 {return reverse_iterator(begin());}
1425 _LIBCPP_INLINE_VISIBILITY
1426 const_reverse_iterator rend() const _NOEXCEPT
1427 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001428
Howard Hinnanta6119a82011-05-29 19:57:12 +00001429 _LIBCPP_INLINE_VISIBILITY
1430 const_iterator cbegin() const _NOEXCEPT
1431 {return begin();}
1432 _LIBCPP_INLINE_VISIBILITY
1433 const_iterator cend() const _NOEXCEPT
1434 {return end();}
1435 _LIBCPP_INLINE_VISIBILITY
1436 const_reverse_iterator crbegin() const _NOEXCEPT
1437 {return rbegin();}
1438 _LIBCPP_INLINE_VISIBILITY
1439 const_reverse_iterator crend() const _NOEXCEPT
1440 {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001441
Howard Hinnanta6119a82011-05-29 19:57:12 +00001442 _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001443 {return __is_long() ? __get_long_size() : __get_short_size();}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001444 _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
1445 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
1446 _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001447 {return (__is_long() ? __get_long_cap() : __min_cap) - 1;}
1448
1449 void resize(size_type __n, value_type __c);
1450 _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
1451
1452 void reserve(size_type res_arg = 0);
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001453 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001454 void shrink_to_fit() _NOEXCEPT {reserve();}
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001456 void clear() _NOEXCEPT;
1457 _LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001458
1459 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const;
1460 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos);
1461
1462 const_reference at(size_type __n) const;
1463 reference at(size_type __n);
1464
1465 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);}
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001466 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const value_type* __s) {return append(__s);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001467 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;}
Howard Hinnante3e32912011-08-12 21:56:02 +00001468#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001469 _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);}
Howard Hinnante3e32912011-08-12 21:56:02 +00001470#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001471
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001472 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001473 basic_string& append(const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:19 +00001474 basic_string& append(const basic_string& __str, size_type __pos, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001475 basic_string& append(const value_type* __s, size_type __n);
1476 basic_string& append(const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001477 basic_string& append(size_type __n, value_type __c);
1478 template<class _InputIterator>
1479 typename enable_if
1480 <
1481 __is_input_iterator <_InputIterator>::value &&
1482 !__is_forward_iterator<_InputIterator>::value,
1483 basic_string&
1484 >::type
1485 append(_InputIterator __first, _InputIterator __last);
1486 template<class _ForwardIterator>
1487 typename enable_if
1488 <
1489 __is_forward_iterator<_ForwardIterator>::value,
1490 basic_string&
1491 >::type
1492 append(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001493#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001494 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001495 basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001496#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001497
1498 void push_back(value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001500 void pop_back();
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001501 _LIBCPP_INLINE_VISIBILITY reference front();
1502 _LIBCPP_INLINE_VISIBILITY const_reference front() const;
1503 _LIBCPP_INLINE_VISIBILITY reference back();
1504 _LIBCPP_INLINE_VISIBILITY const_reference back() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001505
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001506 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001507 basic_string& assign(const basic_string& __str);
Howard Hinnanta6119a82011-05-29 19:57:12 +00001508#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1509 _LIBCPP_INLINE_VISIBILITY
1510 basic_string& assign(basic_string&& str)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001511 {*this = _VSTD::move(str); return *this;}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001512#endif
Marshall Clowa93b5e22014-03-04 19:17:19 +00001513 basic_string& assign(const basic_string& __str, size_type __pos, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001514 basic_string& assign(const value_type* __s, size_type __n);
1515 basic_string& assign(const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001516 basic_string& assign(size_type __n, value_type __c);
1517 template<class _InputIterator>
1518 typename enable_if
1519 <
1520 __is_input_iterator <_InputIterator>::value &&
1521 !__is_forward_iterator<_InputIterator>::value,
1522 basic_string&
1523 >::type
1524 assign(_InputIterator __first, _InputIterator __last);
1525 template<class _ForwardIterator>
1526 typename enable_if
1527 <
1528 __is_forward_iterator<_ForwardIterator>::value,
1529 basic_string&
1530 >::type
1531 assign(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001532#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001534 basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001535#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001536
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001537 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001538 basic_string& insert(size_type __pos1, const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:19 +00001539 basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n=npos);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001540 basic_string& insert(size_type __pos, const value_type* __s, size_type __n);
1541 basic_string& insert(size_type __pos, const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001542 basic_string& insert(size_type __pos, size_type __n, value_type __c);
1543 iterator insert(const_iterator __pos, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001544 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001545 iterator insert(const_iterator __pos, size_type __n, value_type __c);
1546 template<class _InputIterator>
1547 typename enable_if
1548 <
1549 __is_input_iterator <_InputIterator>::value &&
1550 !__is_forward_iterator<_InputIterator>::value,
1551 iterator
1552 >::type
1553 insert(const_iterator __pos, _InputIterator __first, _InputIterator __last);
1554 template<class _ForwardIterator>
1555 typename enable_if
1556 <
1557 __is_forward_iterator<_ForwardIterator>::value,
1558 iterator
1559 >::type
1560 insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00001561#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001563 iterator insert(const_iterator __pos, initializer_list<value_type> __il)
1564 {return insert(__pos, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001565#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001566
1567 basic_string& erase(size_type __pos = 0, size_type __n = npos);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001569 iterator erase(const_iterator __pos);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001570 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001571 iterator erase(const_iterator __first, const_iterator __last);
1572
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001573 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001574 basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str);
Marshall Clowa93b5e22014-03-04 19:17:19 +00001575 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 +00001576 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s, size_type __n2);
1577 basic_string& replace(size_type __pos, size_type __n1, const value_type* __s);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001578 basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001580 basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001581 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001582 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s, size_type __n);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001583 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001584 basic_string& replace(const_iterator __i1, const_iterator __i2, const value_type* __s);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001585 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001586 basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001587 template<class _InputIterator>
1588 typename enable_if
1589 <
1590 __is_input_iterator<_InputIterator>::value,
1591 basic_string&
1592 >::type
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001593 replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2);
Howard Hinnante3e32912011-08-12 21:56:02 +00001594#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8d7a9552010-09-23 17:31:07 +00001595 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7b2cb482010-11-17 21:11:40 +00001596 basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001597 {return replace(__i1, __i2, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001598#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001599
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001600 size_type copy(value_type* __s, size_type __n, size_type __pos = 0) const;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001601 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001602 basic_string substr(size_type __pos = 0, size_type __n = npos) const;
1603
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001604 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001605 void swap(basic_string& __str)
Marshall Clow7d914d12015-07-13 20:04:56 +00001606#if _LIBCPP_STD_VER >= 14
1607 _NOEXCEPT;
1608#else
1609 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1610 __is_nothrow_swappable<allocator_type>::value);
1611#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001612
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001613 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001614 const value_type* c_str() const _NOEXCEPT {return data();}
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001616 const value_type* data() const _NOEXCEPT {return _VSTD::__to_raw_pointer(__get_pointer());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001617
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001618 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001619 allocator_type get_allocator() const _NOEXCEPT {return __alloc();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001620
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001621 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001622 size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001623 size_type find(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001624 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001625 size_type find(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001626 size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001627
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001628 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001629 size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001630 size_type rfind(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001631 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001632 size_type rfind(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001633 size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001634
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001635 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001636 size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001637 size_type find_first_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001638 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001639 size_type find_first_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001640 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001641 size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001642
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001643 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001644 size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001645 size_type find_last_of(const value_type* __s, size_type __pos, size_type __n) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001646 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001647 size_type find_last_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001648 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001649 size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001650
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001651 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001652 size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001653 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 +00001654 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001655 size_type find_first_not_of(const value_type* __s, size_type __pos = 0) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001656 _LIBCPP_INLINE_VISIBILITY
1657 size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT;
1658
1659 _LIBCPP_INLINE_VISIBILITY
1660 size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001661 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 +00001662 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001663 size_type find_last_not_of(const value_type* __s, size_type __pos = npos) const _NOEXCEPT;
Howard Hinnanta6119a82011-05-29 19:57:12 +00001664 _LIBCPP_INLINE_VISIBILITY
1665 size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT;
1666
1667 _LIBCPP_INLINE_VISIBILITY
1668 int compare(const basic_string& __str) const _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001669 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001670 int compare(size_type __pos1, size_type __n1, const basic_string& __str) const;
Marshall Clowa93b5e22014-03-04 19:17:19 +00001671 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 +00001672 int compare(const value_type* __s) const _NOEXCEPT;
1673 int compare(size_type __pos1, size_type __n1, const value_type* __s) const;
1674 int compare(size_type __pos1, size_type __n1, const value_type* __s, size_type __n2) const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001675
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001676 _LIBCPP_INLINE_VISIBILITY bool __invariants() const;
Howard Hinnant08dd2532013-04-22 23:55:13 +00001677
1678 _LIBCPP_INLINE_VISIBILITY
1679 bool __is_long() const _NOEXCEPT
1680 {return bool(__r_.first().__s.__size_ & __short_mask);}
1681
Howard Hinnant499cea12013-08-23 17:37:05 +00001682#if _LIBCPP_DEBUG_LEVEL >= 2
1683
1684 bool __dereferenceable(const const_iterator* __i) const;
1685 bool __decrementable(const const_iterator* __i) const;
1686 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
1687 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
1688
1689#endif // _LIBCPP_DEBUG_LEVEL >= 2
1690
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001691private:
Howard Hinnanta6119a82011-05-29 19:57:12 +00001692 _LIBCPP_INLINE_VISIBILITY
1693 allocator_type& __alloc() _NOEXCEPT
1694 {return __r_.second();}
1695 _LIBCPP_INLINE_VISIBILITY
1696 const allocator_type& __alloc() const _NOEXCEPT
1697 {return __r_.second();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001698
Howard Hinnant15467182013-04-30 21:44:48 +00001699#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT
1700
Howard Hinnanta6119a82011-05-29 19:57:12 +00001701 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta6119a82011-05-29 19:57:12 +00001702 void __set_short_size(size_type __s) _NOEXCEPT
Howard Hinnant15467182013-04-30 21:44:48 +00001703# if _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001704 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
Howard Hinnant15467182013-04-30 21:44:48 +00001705# else
1706 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1707# endif
1708
Howard Hinnanta6119a82011-05-29 19:57:12 +00001709 _LIBCPP_INLINE_VISIBILITY
1710 size_type __get_short_size() const _NOEXCEPT
Howard Hinnant15467182013-04-30 21:44:48 +00001711# if _LIBCPP_BIG_ENDIAN
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001712 {return __r_.first().__s.__size_ >> 1;}
Howard Hinnant15467182013-04-30 21:44:48 +00001713# else
1714 {return __r_.first().__s.__size_;}
1715# endif
1716
1717#else // _LIBCPP_ALTERNATE_STRING_LAYOUT
1718
1719 _LIBCPP_INLINE_VISIBILITY
1720 void __set_short_size(size_type __s) _NOEXCEPT
1721# if _LIBCPP_BIG_ENDIAN
1722 {__r_.first().__s.__size_ = (unsigned char)(__s);}
1723# else
1724 {__r_.first().__s.__size_ = (unsigned char)(__s << 1);}
1725# endif
1726
1727 _LIBCPP_INLINE_VISIBILITY
1728 size_type __get_short_size() const _NOEXCEPT
1729# if _LIBCPP_BIG_ENDIAN
1730 {return __r_.first().__s.__size_;}
1731# else
1732 {return __r_.first().__s.__size_ >> 1;}
1733# endif
1734
1735#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT
1736
Howard Hinnanta6119a82011-05-29 19:57:12 +00001737 _LIBCPP_INLINE_VISIBILITY
1738 void __set_long_size(size_type __s) _NOEXCEPT
1739 {__r_.first().__l.__size_ = __s;}
1740 _LIBCPP_INLINE_VISIBILITY
1741 size_type __get_long_size() const _NOEXCEPT
1742 {return __r_.first().__l.__size_;}
1743 _LIBCPP_INLINE_VISIBILITY
1744 void __set_size(size_type __s) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001745 {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);}
1746
Howard Hinnanta6119a82011-05-29 19:57:12 +00001747 _LIBCPP_INLINE_VISIBILITY
1748 void __set_long_cap(size_type __s) _NOEXCEPT
1749 {__r_.first().__l.__cap_ = __long_mask | __s;}
1750 _LIBCPP_INLINE_VISIBILITY
1751 size_type __get_long_cap() const _NOEXCEPT
Howard Hinnantec3773c2011-12-01 20:21:04 +00001752 {return __r_.first().__l.__cap_ & size_type(~__long_mask);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001753
Howard Hinnanta6119a82011-05-29 19:57:12 +00001754 _LIBCPP_INLINE_VISIBILITY
1755 void __set_long_pointer(pointer __p) _NOEXCEPT
1756 {__r_.first().__l.__data_ = __p;}
1757 _LIBCPP_INLINE_VISIBILITY
1758 pointer __get_long_pointer() _NOEXCEPT
1759 {return __r_.first().__l.__data_;}
1760 _LIBCPP_INLINE_VISIBILITY
1761 const_pointer __get_long_pointer() const _NOEXCEPT
1762 {return __r_.first().__l.__data_;}
1763 _LIBCPP_INLINE_VISIBILITY
1764 pointer __get_short_pointer() _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001765 {return pointer_traits<pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001766 _LIBCPP_INLINE_VISIBILITY
1767 const_pointer __get_short_pointer() const _NOEXCEPT
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001768 {return pointer_traits<const_pointer>::pointer_to(__r_.first().__s.__data_[0]);}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001769 _LIBCPP_INLINE_VISIBILITY
1770 pointer __get_pointer() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001771 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
Howard Hinnanta6119a82011-05-29 19:57:12 +00001772 _LIBCPP_INLINE_VISIBILITY
1773 const_pointer __get_pointer() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001774 {return __is_long() ? __get_long_pointer() : __get_short_pointer();}
1775
Howard Hinnanta6119a82011-05-29 19:57:12 +00001776 _LIBCPP_INLINE_VISIBILITY
1777 void __zero() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001778 {
1779 size_type (&__a)[__n_words] = __r_.first().__r.__words;
1780 for (unsigned __i = 0; __i < __n_words; ++__i)
1781 __a[__i] = 0;
1782 }
1783
1784 template <size_type __a> static
Howard Hinnanta6119a82011-05-29 19:57:12 +00001785 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7f764502013-08-14 18:00:20 +00001786 size_type __align_it(size_type __s) _NOEXCEPT
Howard Hinnanta6119a82011-05-29 19:57:12 +00001787 {return __s + (__a-1) & ~(__a-1);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001788 enum {__alignment = 16};
Howard Hinnanta6119a82011-05-29 19:57:12 +00001789 static _LIBCPP_INLINE_VISIBILITY
1790 size_type __recommend(size_type __s) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001791 {return (__s < __min_cap ? __min_cap :
Howard Hinnant7f764502013-08-14 18:00:20 +00001792 __align_it<sizeof(value_type) < __alignment ?
Howard Hinnanta6119a82011-05-29 19:57:12 +00001793 __alignment/sizeof(value_type) : 1 > (__s+1)) - 1;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001794
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001795 void __init(const value_type* __s, size_type __sz, size_type __reserve);
1796 void __init(const value_type* __s, size_type __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001797 void __init(size_type __n, value_type __c);
Howard Hinnant324bb032010-08-22 00:02:43 +00001798
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001799 template <class _InputIterator>
1800 typename enable_if
1801 <
1802 __is_input_iterator <_InputIterator>::value &&
1803 !__is_forward_iterator<_InputIterator>::value,
1804 void
1805 >::type
1806 __init(_InputIterator __first, _InputIterator __last);
1807
1808 template <class _ForwardIterator>
1809 typename enable_if
1810 <
1811 __is_forward_iterator<_ForwardIterator>::value,
1812 void
1813 >::type
1814 __init(_ForwardIterator __first, _ForwardIterator __last);
1815
1816 void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnant324bb032010-08-22 00:02:43 +00001817 size_type __n_copy, size_type __n_del, size_type __n_add = 0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001818 void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
1819 size_type __n_copy, size_type __n_del,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001820 size_type __n_add, const value_type* __p_new_stuff);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001821
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001822 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001823 void __erase_to_end(size_type __pos);
1824
Howard Hinnante32b5e22010-11-17 17:55:08 +00001825 _LIBCPP_INLINE_VISIBILITY
1826 void __copy_assign_alloc(const basic_string& __str)
1827 {__copy_assign_alloc(__str, integral_constant<bool,
1828 __alloc_traits::propagate_on_container_copy_assignment::value>());}
1829
1830 _LIBCPP_INLINE_VISIBILITY
1831 void __copy_assign_alloc(const basic_string& __str, true_type)
1832 {
1833 if (__alloc() != __str.__alloc())
1834 {
1835 clear();
1836 shrink_to_fit();
1837 }
1838 __alloc() = __str.__alloc();
1839 }
1840
1841 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00001842 void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT
Howard Hinnante32b5e22010-11-17 17:55:08 +00001843 {}
1844
1845#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001846 _LIBCPP_INLINE_VISIBILITY
Marshall Clowaf961ed2015-08-18 18:57:00 +00001847 void __move_assign(basic_string& __str, false_type)
1848 _NOEXCEPT_(__alloc_traits::is_always_equal::value);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001849 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001850 void __move_assign(basic_string& __str, true_type)
Marshall Clowaf961ed2015-08-18 18:57:00 +00001851#if _LIBCPP_STD_VER > 14
1852 _NOEXCEPT;
1853#else
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001854 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnante32b5e22010-11-17 17:55:08 +00001855#endif
Marshall Clowaf961ed2015-08-18 18:57:00 +00001856#endif
Howard Hinnante32b5e22010-11-17 17:55:08 +00001857
1858 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001859 void
Howard Hinnant9cbee432011-09-02 20:42:31 +00001860 __move_assign_alloc(basic_string& __str)
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001861 _NOEXCEPT_(
1862 !__alloc_traits::propagate_on_container_move_assignment::value ||
1863 is_nothrow_move_assignable<allocator_type>::value)
1864 {__move_assign_alloc(__str, integral_constant<bool,
1865 __alloc_traits::propagate_on_container_move_assignment::value>());}
1866
1867 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9cbee432011-09-02 20:42:31 +00001868 void __move_assign_alloc(basic_string& __c, true_type)
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001869 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1870 {
1871 __alloc() = _VSTD::move(__c.__alloc());
1872 }
1873
1874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00001875 void __move_assign_alloc(basic_string&, false_type)
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00001876 _NOEXCEPT
1877 {}
1878
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00001879 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
1880 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001881
1882 friend basic_string operator+<>(const basic_string&, const basic_string&);
1883 friend basic_string operator+<>(const value_type*, const basic_string&);
1884 friend basic_string operator+<>(value_type, const basic_string&);
1885 friend basic_string operator+<>(const basic_string&, const value_type*);
1886 friend basic_string operator+<>(const basic_string&, value_type);
1887};
1888
1889template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001890inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001891void
1892basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators()
1893{
Howard Hinnant499cea12013-08-23 17:37:05 +00001894#if _LIBCPP_DEBUG_LEVEL >= 2
1895 __get_db()->__invalidate_all(this);
1896#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001897}
1898
1899template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001900inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001901void
Howard Hinnantec3773c2011-12-01 20:21:04 +00001902basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type
Howard Hinnant499cea12013-08-23 17:37:05 +00001903#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantec3773c2011-12-01 20:21:04 +00001904 __pos
1905#endif
1906 )
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001907{
Howard Hinnant499cea12013-08-23 17:37:05 +00001908#if _LIBCPP_DEBUG_LEVEL >= 2
1909 __c_node* __c = __get_db()->__find_c_and_lock(this);
1910 if (__c)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001911 {
Howard Hinnant499cea12013-08-23 17:37:05 +00001912 const_pointer __new_last = __get_pointer() + __pos;
1913 for (__i_node** __p = __c->end_; __p != __c->beg_; )
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001914 {
Howard Hinnant499cea12013-08-23 17:37:05 +00001915 --__p;
1916 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
1917 if (__i->base() > __new_last)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001918 {
Howard Hinnant499cea12013-08-23 17:37:05 +00001919 (*__p)->__c_ = nullptr;
1920 if (--__c->end_ != __p)
1921 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001922 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001923 }
Howard Hinnant499cea12013-08-23 17:37:05 +00001924 __get_db()->unlock();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001925 }
Howard Hinnant499cea12013-08-23 17:37:05 +00001926#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001927}
1928
1929template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001930inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00001931basic_string<_CharT, _Traits, _Allocator>::basic_string()
Marshall Clowc912c0c2015-06-04 02:05:41 +00001932 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001933{
Howard Hinnant499cea12013-08-23 17:37:05 +00001934#if _LIBCPP_DEBUG_LEVEL >= 2
1935 __get_db()->__insert_c(this);
1936#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001937 __zero();
1938}
1939
1940template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00001941inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001942basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a)
Eric Fiselier692177d2015-07-18 20:40:46 +00001943#if _LIBCPP_STD_VER <= 14
1944 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
1945#else
1946 _NOEXCEPT
1947#endif
1948: __r_(__a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001949{
Howard Hinnant499cea12013-08-23 17:37:05 +00001950#if _LIBCPP_DEBUG_LEVEL >= 2
1951 __get_db()->__insert_c(this);
1952#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001953 __zero();
1954}
1955
1956template <class _CharT, class _Traits, class _Allocator>
1957void
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001958basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz, size_type __reserve)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001959{
1960 if (__reserve > max_size())
1961 this->__throw_length_error();
1962 pointer __p;
1963 if (__reserve < __min_cap)
1964 {
1965 __set_short_size(__sz);
1966 __p = __get_short_pointer();
1967 }
1968 else
1969 {
1970 size_type __cap = __recommend(__reserve);
Howard Hinnante32b5e22010-11-17 17:55:08 +00001971 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001972 __set_long_pointer(__p);
1973 __set_long_cap(__cap+1);
1974 __set_long_size(__sz);
1975 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001976 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001977 traits_type::assign(__p[__sz], value_type());
1978}
1979
1980template <class _CharT, class _Traits, class _Allocator>
1981void
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00001982basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001983{
1984 if (__sz > max_size())
1985 this->__throw_length_error();
1986 pointer __p;
1987 if (__sz < __min_cap)
1988 {
1989 __set_short_size(__sz);
1990 __p = __get_short_pointer();
1991 }
1992 else
1993 {
1994 size_type __cap = __recommend(__sz);
Howard Hinnante32b5e22010-11-17 17:55:08 +00001995 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001996 __set_long_pointer(__p);
1997 __set_long_cap(__cap+1);
1998 __set_long_size(__sz);
1999 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002000 traits_type::copy(_VSTD::__to_raw_pointer(__p), __s, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002001 traits_type::assign(__p[__sz], value_type());
2002}
2003
2004template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002005inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002006basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002007{
Howard Hinnant499cea12013-08-23 17:37:05 +00002008 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002009 __init(__s, traits_type::length(__s));
Howard Hinnant499cea12013-08-23 17:37:05 +00002010#if _LIBCPP_DEBUG_LEVEL >= 2
2011 __get_db()->__insert_c(this);
2012#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002013}
2014
2015template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002016inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002017basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002018 : __r_(__a)
2019{
Howard Hinnant499cea12013-08-23 17:37:05 +00002020 _LIBCPP_ASSERT(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002021 __init(__s, traits_type::length(__s));
Howard Hinnant499cea12013-08-23 17:37:05 +00002022#if _LIBCPP_DEBUG_LEVEL >= 2
2023 __get_db()->__insert_c(this);
2024#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002025}
2026
2027template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002028inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002029basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002030{
Howard Hinnant499cea12013-08-23 17:37:05 +00002031 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002032 __init(__s, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +00002033#if _LIBCPP_DEBUG_LEVEL >= 2
2034 __get_db()->__insert_c(this);
2035#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002036}
2037
2038template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002039inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002040basic_string<_CharT, _Traits, _Allocator>::basic_string(const value_type* __s, size_type __n, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002041 : __r_(__a)
2042{
Howard Hinnant499cea12013-08-23 17:37:05 +00002043 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002044 __init(__s, __n);
Howard Hinnant499cea12013-08-23 17:37:05 +00002045#if _LIBCPP_DEBUG_LEVEL >= 2
2046 __get_db()->__insert_c(this);
2047#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002048}
2049
2050template <class _CharT, class _Traits, class _Allocator>
2051basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002052 : __r_(__alloc_traits::select_on_container_copy_construction(__str.__alloc()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002053{
2054 if (!__str.__is_long())
2055 __r_.first().__r = __str.__r_.first().__r;
2056 else
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002057 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Howard Hinnant499cea12013-08-23 17:37:05 +00002058#if _LIBCPP_DEBUG_LEVEL >= 2
2059 __get_db()->__insert_c(this);
2060#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002061}
2062
2063template <class _CharT, class _Traits, class _Allocator>
2064basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, const allocator_type& __a)
2065 : __r_(__a)
2066{
2067 if (!__str.__is_long())
2068 __r_.first().__r = __str.__r_.first().__r;
2069 else
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002070 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Howard Hinnant499cea12013-08-23 17:37:05 +00002071#if _LIBCPP_DEBUG_LEVEL >= 2
2072 __get_db()->__insert_c(this);
2073#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002074}
2075
Howard Hinnant73d21a42010-09-04 23:28:19 +00002076#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002077
2078template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002079inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00002080basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str)
Marshall Clow7b193f72015-06-03 19:56:43 +00002081#if _LIBCPP_STD_VER <= 14
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00002082 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clow7b193f72015-06-03 19:56:43 +00002083#else
2084 _NOEXCEPT
2085#endif
Howard Hinnant0949eed2011-06-30 21:18:19 +00002086 : __r_(_VSTD::move(__str.__r_))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002087{
2088 __str.__zero();
Howard Hinnant499cea12013-08-23 17:37:05 +00002089#if _LIBCPP_DEBUG_LEVEL >= 2
2090 __get_db()->__insert_c(this);
2091 if (__is_long())
2092 __get_db()->swap(this, &__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002093#endif
2094}
2095
2096template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002097inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002098basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002099 : __r_(__a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002100{
Marshall Clowd5549cc2014-07-17 15:32:20 +00002101 if (__str.__is_long() && __a != __str.__alloc()) // copy, not move
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002102 __init(_VSTD::__to_raw_pointer(__str.__get_long_pointer()), __str.__get_long_size());
Marshall Clowd5549cc2014-07-17 15:32:20 +00002103 else
2104 {
2105 __r_.first().__r = __str.__r_.first().__r;
2106 __str.__zero();
2107 }
Howard Hinnant499cea12013-08-23 17:37:05 +00002108#if _LIBCPP_DEBUG_LEVEL >= 2
2109 __get_db()->__insert_c(this);
2110 if (__is_long())
2111 __get_db()->swap(this, &__str);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002112#endif
2113}
2114
Howard Hinnant73d21a42010-09-04 23:28:19 +00002115#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002116
2117template <class _CharT, class _Traits, class _Allocator>
2118void
2119basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c)
2120{
2121 if (__n > max_size())
2122 this->__throw_length_error();
2123 pointer __p;
2124 if (__n < __min_cap)
2125 {
2126 __set_short_size(__n);
2127 __p = __get_short_pointer();
2128 }
2129 else
2130 {
2131 size_type __cap = __recommend(__n);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002132 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002133 __set_long_pointer(__p);
2134 __set_long_cap(__cap+1);
2135 __set_long_size(__n);
2136 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002137 traits_type::assign(_VSTD::__to_raw_pointer(__p), __n, __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002138 traits_type::assign(__p[__n], value_type());
2139}
2140
2141template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002142inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002143basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c)
2144{
2145 __init(__n, __c);
Howard Hinnant499cea12013-08-23 17:37:05 +00002146#if _LIBCPP_DEBUG_LEVEL >= 2
2147 __get_db()->__insert_c(this);
2148#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002149}
2150
2151template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002152inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002153basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c, const allocator_type& __a)
2154 : __r_(__a)
2155{
2156 __init(__n, __c);
Howard Hinnant499cea12013-08-23 17:37:05 +00002157#if _LIBCPP_DEBUG_LEVEL >= 2
2158 __get_db()->__insert_c(this);
2159#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002160}
2161
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002162template <class _CharT, class _Traits, class _Allocator>
2163basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, size_type __n,
2164 const allocator_type& __a)
2165 : __r_(__a)
2166{
2167 size_type __str_sz = __str.size();
2168 if (__pos > __str_sz)
2169 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002170 __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos));
Howard Hinnant499cea12013-08-23 17:37:05 +00002171#if _LIBCPP_DEBUG_LEVEL >= 2
2172 __get_db()->__insert_c(this);
2173#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002174}
2175
2176template <class _CharT, class _Traits, class _Allocator>
2177template <class _InputIterator>
2178typename enable_if
2179<
2180 __is_input_iterator <_InputIterator>::value &&
2181 !__is_forward_iterator<_InputIterator>::value,
2182 void
2183>::type
2184basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last)
2185{
2186 __zero();
2187#ifndef _LIBCPP_NO_EXCEPTIONS
2188 try
2189 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002190#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002191 for (; __first != __last; ++__first)
2192 push_back(*__first);
2193#ifndef _LIBCPP_NO_EXCEPTIONS
2194 }
2195 catch (...)
2196 {
2197 if (__is_long())
Howard Hinnante32b5e22010-11-17 17:55:08 +00002198 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002199 throw;
2200 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002201#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002202}
2203
2204template <class _CharT, class _Traits, class _Allocator>
2205template <class _ForwardIterator>
2206typename enable_if
2207<
2208 __is_forward_iterator<_ForwardIterator>::value,
2209 void
2210>::type
2211basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last)
2212{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002213 size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002214 if (__sz > max_size())
2215 this->__throw_length_error();
2216 pointer __p;
2217 if (__sz < __min_cap)
2218 {
2219 __set_short_size(__sz);
2220 __p = __get_short_pointer();
2221 }
2222 else
2223 {
2224 size_type __cap = __recommend(__sz);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002225 __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002226 __set_long_pointer(__p);
2227 __set_long_cap(__cap+1);
2228 __set_long_size(__sz);
2229 }
Eric Fiselierb9919752014-10-27 19:28:20 +00002230 for (; __first != __last; ++__first, (void) ++__p)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002231 traits_type::assign(*__p, *__first);
2232 traits_type::assign(*__p, value_type());
2233}
2234
2235template <class _CharT, class _Traits, class _Allocator>
2236template<class _InputIterator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002237inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002238basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last)
2239{
2240 __init(__first, __last);
Howard Hinnant499cea12013-08-23 17:37:05 +00002241#if _LIBCPP_DEBUG_LEVEL >= 2
2242 __get_db()->__insert_c(this);
2243#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002244}
2245
2246template <class _CharT, class _Traits, class _Allocator>
2247template<class _InputIterator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002248inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002249basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last,
2250 const allocator_type& __a)
2251 : __r_(__a)
2252{
2253 __init(__first, __last);
Howard Hinnant499cea12013-08-23 17:37:05 +00002254#if _LIBCPP_DEBUG_LEVEL >= 2
2255 __get_db()->__insert_c(this);
2256#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002257}
2258
Howard Hinnante3e32912011-08-12 21:56:02 +00002259#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2260
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002261template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002262inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002263basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il)
2264{
2265 __init(__il.begin(), __il.end());
Howard Hinnant499cea12013-08-23 17:37:05 +00002266#if _LIBCPP_DEBUG_LEVEL >= 2
2267 __get_db()->__insert_c(this);
2268#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002269}
2270
2271template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002272inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002273basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il, const allocator_type& __a)
2274 : __r_(__a)
2275{
2276 __init(__il.begin(), __il.end());
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
Howard Hinnante3e32912011-08-12 21:56:02 +00002282#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2283
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002284template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002285basic_string<_CharT, _Traits, _Allocator>::~basic_string()
2286{
Howard Hinnant499cea12013-08-23 17:37:05 +00002287#if _LIBCPP_DEBUG_LEVEL >= 2
2288 __get_db()->__erase_c(this);
2289#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002290 if (__is_long())
Howard Hinnante32b5e22010-11-17 17:55:08 +00002291 __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002292}
2293
2294template <class _CharT, class _Traits, class _Allocator>
2295void
2296basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace
2297 (size_type __old_cap, size_type __delta_cap, size_type __old_sz,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002298 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 +00002299{
2300 size_type __ms = max_size();
2301 if (__delta_cap > __ms - __old_cap - 1)
2302 this->__throw_length_error();
2303 pointer __old_p = __get_pointer();
2304 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Howard Hinnant0949eed2011-06-30 21:18:19 +00002305 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002306 __ms - 1;
Howard Hinnante32b5e22010-11-17 17:55:08 +00002307 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002308 __invalidate_all_iterators();
2309 if (__n_copy != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002310 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2311 _VSTD::__to_raw_pointer(__old_p), __n_copy);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002312 if (__n_add != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002313 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy, __p_new_stuff, __n_add);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002314 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2315 if (__sec_cp_sz != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002316 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2317 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del, __sec_cp_sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002318 if (__old_cap+1 != __min_cap)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002319 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002320 __set_long_pointer(__p);
2321 __set_long_cap(__cap+1);
2322 __old_sz = __n_copy + __n_add + __sec_cp_sz;
2323 __set_long_size(__old_sz);
2324 traits_type::assign(__p[__old_sz], value_type());
2325}
2326
2327template <class _CharT, class _Traits, class _Allocator>
2328void
2329basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz,
2330 size_type __n_copy, size_type __n_del, size_type __n_add)
2331{
2332 size_type __ms = max_size();
Marshall Clowecc8d7b2013-11-06 14:24:38 +00002333 if (__delta_cap > __ms - __old_cap)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002334 this->__throw_length_error();
2335 pointer __old_p = __get_pointer();
2336 size_type __cap = __old_cap < __ms / 2 - __alignment ?
Howard Hinnant0949eed2011-06-30 21:18:19 +00002337 __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) :
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002338 __ms - 1;
Howard Hinnante32b5e22010-11-17 17:55:08 +00002339 pointer __p = __alloc_traits::allocate(__alloc(), __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002340 __invalidate_all_iterators();
2341 if (__n_copy != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002342 traits_type::copy(_VSTD::__to_raw_pointer(__p),
2343 _VSTD::__to_raw_pointer(__old_p), __n_copy);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002344 size_type __sec_cp_sz = __old_sz - __n_del - __n_copy;
2345 if (__sec_cp_sz != 0)
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002346 traits_type::copy(_VSTD::__to_raw_pointer(__p) + __n_copy + __n_add,
2347 _VSTD::__to_raw_pointer(__old_p) + __n_copy + __n_del,
2348 __sec_cp_sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002349 if (__old_cap+1 != __min_cap)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002350 __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002351 __set_long_pointer(__p);
2352 __set_long_cap(__cap+1);
2353}
2354
2355// assign
2356
2357template <class _CharT, class _Traits, class _Allocator>
2358basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002359basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002360{
Alp Tokerec34c482014-05-15 11:27:39 +00002361 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::assign received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002362 size_type __cap = capacity();
2363 if (__cap >= __n)
2364 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002365 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002366 traits_type::move(__p, __s, __n);
2367 traits_type::assign(__p[__n], value_type());
2368 __set_size(__n);
2369 __invalidate_iterators_past(__n);
2370 }
2371 else
2372 {
2373 size_type __sz = size();
2374 __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s);
2375 }
2376 return *this;
2377}
2378
2379template <class _CharT, class _Traits, class _Allocator>
2380basic_string<_CharT, _Traits, _Allocator>&
2381basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c)
2382{
2383 size_type __cap = capacity();
2384 if (__cap < __n)
2385 {
2386 size_type __sz = size();
2387 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2388 }
2389 else
2390 __invalidate_iterators_past(__n);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002391 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002392 traits_type::assign(__p, __n, __c);
2393 traits_type::assign(__p[__n], value_type());
2394 __set_size(__n);
2395 return *this;
2396}
2397
2398template <class _CharT, class _Traits, class _Allocator>
2399basic_string<_CharT, _Traits, _Allocator>&
2400basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c)
2401{
2402 pointer __p;
2403 if (__is_long())
2404 {
2405 __p = __get_long_pointer();
2406 __set_long_size(1);
2407 }
2408 else
2409 {
2410 __p = __get_short_pointer();
2411 __set_short_size(1);
2412 }
2413 traits_type::assign(*__p, __c);
2414 traits_type::assign(*++__p, value_type());
2415 __invalidate_iterators_past(1);
2416 return *this;
2417}
2418
2419template <class _CharT, class _Traits, class _Allocator>
Howard Hinnante32b5e22010-11-17 17:55:08 +00002420basic_string<_CharT, _Traits, _Allocator>&
2421basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str)
2422{
2423 if (this != &__str)
2424 {
2425 __copy_assign_alloc(__str);
2426 assign(__str);
2427 }
2428 return *this;
2429}
2430
2431#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2432
2433template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002434inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:08 +00002435void
2436basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type)
Marshall Clowaf961ed2015-08-18 18:57:00 +00002437 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
Howard Hinnante32b5e22010-11-17 17:55:08 +00002438{
2439 if (__alloc() != __str.__alloc())
2440 assign(__str);
2441 else
2442 __move_assign(__str, true_type());
2443}
2444
2445template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002446inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:08 +00002447void
2448basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type)
Marshall Clowaf961ed2015-08-18 18:57:00 +00002449#if _LIBCPP_STD_VER > 14
2450 _NOEXCEPT
2451#else
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00002452 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Marshall Clowaf961ed2015-08-18 18:57:00 +00002453#endif
Howard Hinnante32b5e22010-11-17 17:55:08 +00002454{
2455 clear();
2456 shrink_to_fit();
Howard Hinnant3fdbbd22011-08-17 20:36:18 +00002457 __r_.first() = __str.__r_.first();
2458 __move_assign_alloc(__str);
Howard Hinnante32b5e22010-11-17 17:55:08 +00002459 __str.__zero();
2460}
2461
2462template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002463inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnante32b5e22010-11-17 17:55:08 +00002464basic_string<_CharT, _Traits, _Allocator>&
2465basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str)
Marshall Clowaf961ed2015-08-18 18:57:00 +00002466 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnante32b5e22010-11-17 17:55:08 +00002467{
2468 __move_assign(__str, integral_constant<bool,
2469 __alloc_traits::propagate_on_container_move_assignment::value>());
2470 return *this;
2471}
2472
2473#endif
2474
2475template <class _CharT, class _Traits, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002476template<class _InputIterator>
2477typename enable_if
2478<
2479 __is_input_iterator <_InputIterator>::value &&
2480 !__is_forward_iterator<_InputIterator>::value,
2481 basic_string<_CharT, _Traits, _Allocator>&
2482>::type
2483basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2484{
2485 clear();
2486 for (; __first != __last; ++__first)
2487 push_back(*__first);
Argyrios Kyrtzidis1dc6f7a2012-10-13 02:03:45 +00002488 return *this;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002489}
2490
2491template <class _CharT, class _Traits, class _Allocator>
2492template<class _ForwardIterator>
2493typename enable_if
2494<
2495 __is_forward_iterator<_ForwardIterator>::value,
2496 basic_string<_CharT, _Traits, _Allocator>&
2497>::type
2498basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2499{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002500 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002501 size_type __cap = capacity();
2502 if (__cap < __n)
2503 {
2504 size_type __sz = size();
2505 __grow_by(__cap, __n - __cap, __sz, 0, __sz);
2506 }
2507 else
2508 __invalidate_iterators_past(__n);
2509 pointer __p = __get_pointer();
2510 for (; __first != __last; ++__first, ++__p)
2511 traits_type::assign(*__p, *__first);
2512 traits_type::assign(*__p, value_type());
2513 __set_size(__n);
2514 return *this;
2515}
2516
2517template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002518inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002519basic_string<_CharT, _Traits, _Allocator>&
2520basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str)
2521{
2522 return assign(__str.data(), __str.size());
2523}
2524
2525template <class _CharT, class _Traits, class _Allocator>
2526basic_string<_CharT, _Traits, _Allocator>&
2527basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n)
2528{
2529 size_type __sz = __str.size();
2530 if (__pos > __sz)
2531 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002532 return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002533}
2534
2535template <class _CharT, class _Traits, class _Allocator>
2536basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002537basic_string<_CharT, _Traits, _Allocator>::assign(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002538{
Alp Tokerec34c482014-05-15 11:27:39 +00002539 _LIBCPP_ASSERT(__s != nullptr, "string::assign received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002540 return assign(__s, traits_type::length(__s));
2541}
2542
2543// append
2544
2545template <class _CharT, class _Traits, class _Allocator>
2546basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002547basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002548{
Alp Tokerec34c482014-05-15 11:27:39 +00002549 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::append received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002550 size_type __cap = capacity();
2551 size_type __sz = size();
2552 if (__cap - __sz >= __n)
2553 {
2554 if (__n)
2555 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002556 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002557 traits_type::copy(__p + __sz, __s, __n);
2558 __sz += __n;
2559 __set_size(__sz);
2560 traits_type::assign(__p[__sz], value_type());
2561 }
2562 }
2563 else
2564 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s);
2565 return *this;
2566}
2567
2568template <class _CharT, class _Traits, class _Allocator>
2569basic_string<_CharT, _Traits, _Allocator>&
2570basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c)
2571{
2572 if (__n)
2573 {
2574 size_type __cap = capacity();
2575 size_type __sz = size();
2576 if (__cap - __sz < __n)
2577 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2578 pointer __p = __get_pointer();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002579 traits_type::assign(_VSTD::__to_raw_pointer(__p) + __sz, __n, __c);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002580 __sz += __n;
2581 __set_size(__sz);
2582 traits_type::assign(__p[__sz], value_type());
2583 }
2584 return *this;
2585}
2586
2587template <class _CharT, class _Traits, class _Allocator>
2588void
2589basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c)
2590{
Howard Hinnant15467182013-04-30 21:44:48 +00002591 bool __is_short = !__is_long();
2592 size_type __cap;
2593 size_type __sz;
2594 if (__is_short)
2595 {
2596 __cap = __min_cap - 1;
2597 __sz = __get_short_size();
2598 }
2599 else
2600 {
2601 __cap = __get_long_cap() - 1;
2602 __sz = __get_long_size();
2603 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002604 if (__sz == __cap)
Howard Hinnant15467182013-04-30 21:44:48 +00002605 {
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002606 __grow_by(__cap, 1, __sz, __sz, 0);
Howard Hinnant15467182013-04-30 21:44:48 +00002607 __is_short = !__is_long();
2608 }
2609 pointer __p;
2610 if (__is_short)
2611 {
2612 __p = __get_short_pointer() + __sz;
2613 __set_short_size(__sz+1);
2614 }
2615 else
2616 {
2617 __p = __get_long_pointer() + __sz;
2618 __set_long_size(__sz+1);
2619 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002620 traits_type::assign(*__p, __c);
2621 traits_type::assign(*++__p, value_type());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002622}
2623
2624template <class _CharT, class _Traits, class _Allocator>
2625template<class _InputIterator>
2626typename enable_if
2627<
2628 __is_input_iterator <_InputIterator>::value &&
2629 !__is_forward_iterator<_InputIterator>::value,
2630 basic_string<_CharT, _Traits, _Allocator>&
2631>::type
2632basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last)
2633{
2634 for (; __first != __last; ++__first)
2635 push_back(*__first);
2636 return *this;
2637}
2638
2639template <class _CharT, class _Traits, class _Allocator>
2640template<class _ForwardIterator>
2641typename enable_if
2642<
2643 __is_forward_iterator<_ForwardIterator>::value,
2644 basic_string<_CharT, _Traits, _Allocator>&
2645>::type
2646basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last)
2647{
2648 size_type __sz = size();
2649 size_type __cap = capacity();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002650 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002651 if (__n)
2652 {
2653 if (__cap - __sz < __n)
2654 __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0);
2655 pointer __p = __get_pointer() + __sz;
2656 for (; __first != __last; ++__p, ++__first)
2657 traits_type::assign(*__p, *__first);
2658 traits_type::assign(*__p, value_type());
2659 __set_size(__sz + __n);
2660 }
2661 return *this;
2662}
2663
2664template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002665inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002666basic_string<_CharT, _Traits, _Allocator>&
2667basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str)
2668{
2669 return append(__str.data(), __str.size());
2670}
2671
2672template <class _CharT, class _Traits, class _Allocator>
2673basic_string<_CharT, _Traits, _Allocator>&
2674basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n)
2675{
2676 size_type __sz = __str.size();
2677 if (__pos > __sz)
2678 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002679 return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002680}
2681
2682template <class _CharT, class _Traits, class _Allocator>
2683basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002684basic_string<_CharT, _Traits, _Allocator>::append(const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002685{
Alp Tokerec34c482014-05-15 11:27:39 +00002686 _LIBCPP_ASSERT(__s != nullptr, "string::append received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002687 return append(__s, traits_type::length(__s));
2688}
2689
2690// insert
2691
2692template <class _CharT, class _Traits, class _Allocator>
2693basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002694basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s, size_type __n)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002695{
Alp Tokerec34c482014-05-15 11:27:39 +00002696 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::insert received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002697 size_type __sz = size();
2698 if (__pos > __sz)
2699 this->__throw_out_of_range();
2700 size_type __cap = capacity();
2701 if (__cap - __sz >= __n)
2702 {
2703 if (__n)
2704 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002705 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002706 size_type __n_move = __sz - __pos;
2707 if (__n_move != 0)
2708 {
2709 if (__p + __pos <= __s && __s < __p + __sz)
2710 __s += __n;
2711 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2712 }
2713 traits_type::move(__p + __pos, __s, __n);
2714 __sz += __n;
2715 __set_size(__sz);
2716 traits_type::assign(__p[__sz], value_type());
2717 }
2718 }
2719 else
2720 __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s);
2721 return *this;
2722}
2723
2724template <class _CharT, class _Traits, class _Allocator>
2725basic_string<_CharT, _Traits, _Allocator>&
2726basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c)
2727{
2728 size_type __sz = size();
2729 if (__pos > __sz)
2730 this->__throw_out_of_range();
2731 if (__n)
2732 {
2733 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002734 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002735 if (__cap - __sz >= __n)
2736 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002737 __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 traits_type::move(__p + __pos + __n, __p + __pos, __n_move);
2741 }
2742 else
2743 {
2744 __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002745 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002746 }
2747 traits_type::assign(__p + __pos, __n, __c);
2748 __sz += __n;
2749 __set_size(__sz);
2750 traits_type::assign(__p[__sz], value_type());
2751 }
2752 return *this;
2753}
2754
2755template <class _CharT, class _Traits, class _Allocator>
2756template<class _InputIterator>
2757typename enable_if
2758<
2759 __is_input_iterator <_InputIterator>::value &&
2760 !__is_forward_iterator<_InputIterator>::value,
2761 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2762>::type
2763basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last)
2764{
Howard Hinnant499cea12013-08-23 17:37:05 +00002765#if _LIBCPP_DEBUG_LEVEL >= 2
2766 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2767 "string::insert(iterator, range) called with an iterator not"
2768 " referring to this string");
2769#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002770 size_type __old_sz = size();
2771 difference_type __ip = __pos - begin();
2772 for (; __first != __last; ++__first)
2773 push_back(*__first);
2774 pointer __p = __get_pointer();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002775 _VSTD::rotate(__p + __ip, __p + __old_sz, __p + size());
Howard Hinnant499cea12013-08-23 17:37:05 +00002776#if _LIBCPP_DEBUG_LEVEL >= 2
2777 return iterator(this, __p + __ip);
2778#else
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002779 return iterator(__p + __ip);
Howard Hinnant499cea12013-08-23 17:37:05 +00002780#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002781}
2782
2783template <class _CharT, class _Traits, class _Allocator>
2784template<class _ForwardIterator>
2785typename enable_if
2786<
2787 __is_forward_iterator<_ForwardIterator>::value,
2788 typename basic_string<_CharT, _Traits, _Allocator>::iterator
2789>::type
2790basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last)
2791{
Howard Hinnant499cea12013-08-23 17:37:05 +00002792#if _LIBCPP_DEBUG_LEVEL >= 2
2793 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2794 "string::insert(iterator, range) called with an iterator not"
2795 " referring to this string");
2796#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002797 size_type __ip = static_cast<size_type>(__pos - begin());
2798 size_type __sz = size();
2799 size_type __cap = capacity();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002800 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002801 if (__n)
2802 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002803 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002804 if (__cap - __sz >= __n)
2805 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002806 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002807 size_type __n_move = __sz - __ip;
2808 if (__n_move != 0)
2809 traits_type::move(__p + __ip + __n, __p + __ip, __n_move);
2810 }
2811 else
2812 {
2813 __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002814 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002815 }
2816 __sz += __n;
2817 __set_size(__sz);
2818 traits_type::assign(__p[__sz], value_type());
2819 for (__p += __ip; __first != __last; ++__p, ++__first)
2820 traits_type::assign(*__p, *__first);
2821 }
2822 return begin() + __ip;
2823}
2824
2825template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002826inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002827basic_string<_CharT, _Traits, _Allocator>&
2828basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str)
2829{
2830 return insert(__pos1, __str.data(), __str.size());
2831}
2832
2833template <class _CharT, class _Traits, class _Allocator>
2834basic_string<_CharT, _Traits, _Allocator>&
2835basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str,
2836 size_type __pos2, size_type __n)
2837{
2838 size_type __str_sz = __str.size();
2839 if (__pos2 > __str_sz)
2840 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002841 return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002842}
2843
2844template <class _CharT, class _Traits, class _Allocator>
2845basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002846basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002847{
Alp Tokerec34c482014-05-15 11:27:39 +00002848 _LIBCPP_ASSERT(__s != nullptr, "string::insert received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002849 return insert(__pos, __s, traits_type::length(__s));
2850}
2851
2852template <class _CharT, class _Traits, class _Allocator>
2853typename basic_string<_CharT, _Traits, _Allocator>::iterator
2854basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c)
2855{
2856 size_type __ip = static_cast<size_type>(__pos - begin());
2857 size_type __sz = size();
2858 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002859 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002860 if (__cap == __sz)
2861 {
2862 __grow_by(__cap, 1, __sz, __ip, 0, 1);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002863 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002864 }
2865 else
2866 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002867 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002868 size_type __n_move = __sz - __ip;
2869 if (__n_move != 0)
2870 traits_type::move(__p + __ip + 1, __p + __ip, __n_move);
2871 }
2872 traits_type::assign(__p[__ip], __c);
2873 traits_type::assign(__p[++__sz], value_type());
2874 __set_size(__sz);
2875 return begin() + static_cast<difference_type>(__ip);
2876}
2877
2878template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00002879inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002880typename basic_string<_CharT, _Traits, _Allocator>::iterator
2881basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c)
2882{
Howard Hinnant499cea12013-08-23 17:37:05 +00002883#if _LIBCPP_DEBUG_LEVEL >= 2
2884 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
2885 "string::insert(iterator, n, value) called with an iterator not"
2886 " referring to this string");
2887#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002888 difference_type __p = __pos - begin();
2889 insert(static_cast<size_type>(__p), __n, __c);
2890 return begin() + __p;
2891}
2892
2893// replace
2894
2895template <class _CharT, class _Traits, class _Allocator>
2896basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002897basic_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 +00002898{
Alp Tokerec34c482014-05-15 11:27:39 +00002899 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::replace received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002900 size_type __sz = size();
2901 if (__pos > __sz)
2902 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002903 __n1 = _VSTD::min(__n1, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002904 size_type __cap = capacity();
2905 if (__cap - __sz + __n1 >= __n2)
2906 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002907 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002908 if (__n1 != __n2)
2909 {
2910 size_type __n_move = __sz - __pos - __n1;
2911 if (__n_move != 0)
2912 {
2913 if (__n1 > __n2)
2914 {
2915 traits_type::move(__p + __pos, __s, __n2);
2916 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2917 goto __finish;
2918 }
2919 if (__p + __pos < __s && __s < __p + __sz)
2920 {
2921 if (__p + __pos + __n1 <= __s)
2922 __s += __n2 - __n1;
2923 else // __p + __pos < __s < __p + __pos + __n1
2924 {
2925 traits_type::move(__p + __pos, __s, __n1);
2926 __pos += __n1;
2927 __s += __n2;
2928 __n2 -= __n1;
2929 __n1 = 0;
2930 }
2931 }
2932 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2933 }
2934 }
2935 traits_type::move(__p + __pos, __s, __n2);
2936__finish:
2937 __sz += __n2 - __n1;
2938 __set_size(__sz);
2939 __invalidate_iterators_past(__sz);
2940 traits_type::assign(__p[__sz], value_type());
2941 }
2942 else
2943 __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s);
2944 return *this;
2945}
2946
2947template <class _CharT, class _Traits, class _Allocator>
2948basic_string<_CharT, _Traits, _Allocator>&
2949basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c)
2950{
2951 size_type __sz = size();
2952 if (__pos > __sz)
2953 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002954 __n1 = _VSTD::min(__n1, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002955 size_type __cap = capacity();
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002956 value_type* __p;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002957 if (__cap - __sz + __n1 >= __n2)
2958 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002959 __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002960 if (__n1 != __n2)
2961 {
2962 size_type __n_move = __sz - __pos - __n1;
2963 if (__n_move != 0)
2964 traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move);
2965 }
2966 }
2967 else
2968 {
2969 __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2);
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00002970 __p = _VSTD::__to_raw_pointer(__get_long_pointer());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002971 }
2972 traits_type::assign(__p + __pos, __n2, __c);
2973 __sz += __n2 - __n1;
2974 __set_size(__sz);
2975 __invalidate_iterators_past(__sz);
2976 traits_type::assign(__p[__sz], value_type());
2977 return *this;
2978}
2979
2980template <class _CharT, class _Traits, class _Allocator>
2981template<class _InputIterator>
2982typename enable_if
2983<
2984 __is_input_iterator<_InputIterator>::value,
2985 basic_string<_CharT, _Traits, _Allocator>&
2986>::type
Howard Hinnant7b2cb482010-11-17 21:11:40 +00002987basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002988 _InputIterator __j1, _InputIterator __j2)
2989{
2990 for (; true; ++__i1, ++__j1)
2991 {
2992 if (__i1 == __i2)
2993 {
2994 if (__j1 != __j2)
2995 insert(__i1, __j1, __j2);
2996 break;
2997 }
2998 if (__j1 == __j2)
2999 {
3000 erase(__i1, __i2);
3001 break;
3002 }
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003003 traits_type::assign(const_cast<value_type&>(*__i1), *__j1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003004 }
3005 return *this;
3006}
3007
3008template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003009inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003010basic_string<_CharT, _Traits, _Allocator>&
3011basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str)
3012{
3013 return replace(__pos1, __n1, __str.data(), __str.size());
3014}
3015
3016template <class _CharT, class _Traits, class _Allocator>
3017basic_string<_CharT, _Traits, _Allocator>&
3018basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str,
3019 size_type __pos2, size_type __n2)
3020{
3021 size_type __str_sz = __str.size();
3022 if (__pos2 > __str_sz)
3023 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003024 return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003025}
3026
3027template <class _CharT, class _Traits, class _Allocator>
3028basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003029basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003030{
Alp Tokerec34c482014-05-15 11:27:39 +00003031 _LIBCPP_ASSERT(__s != nullptr, "string::replace received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003032 return replace(__pos, __n1, __s, traits_type::length(__s));
3033}
3034
3035template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003036inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003037basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003038basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003039{
3040 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1),
3041 __str.data(), __str.size());
3042}
3043
3044template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003045inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003046basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003047basic_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 +00003048{
3049 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n);
3050}
3051
3052template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003053inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003054basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003055basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const value_type* __s)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003056{
3057 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s);
3058}
3059
3060template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003061inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003062basic_string<_CharT, _Traits, _Allocator>&
Howard Hinnant7b2cb482010-11-17 21:11:40 +00003063basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003064{
3065 return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c);
3066}
3067
3068// erase
3069
3070template <class _CharT, class _Traits, class _Allocator>
3071basic_string<_CharT, _Traits, _Allocator>&
3072basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n)
3073{
3074 size_type __sz = size();
3075 if (__pos > __sz)
3076 this->__throw_out_of_range();
3077 if (__n)
3078 {
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003079 value_type* __p = _VSTD::__to_raw_pointer(__get_pointer());
Howard Hinnant0949eed2011-06-30 21:18:19 +00003080 __n = _VSTD::min(__n, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003081 size_type __n_move = __sz - __pos - __n;
3082 if (__n_move != 0)
3083 traits_type::move(__p + __pos, __p + __pos + __n, __n_move);
3084 __sz -= __n;
3085 __set_size(__sz);
3086 __invalidate_iterators_past(__sz);
3087 traits_type::assign(__p[__sz], value_type());
3088 }
3089 return *this;
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 +00003094typename basic_string<_CharT, _Traits, _Allocator>::iterator
3095basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos)
3096{
Howard Hinnant499cea12013-08-23 17:37:05 +00003097#if _LIBCPP_DEBUG_LEVEL >= 2
3098 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__pos) == this,
3099 "string::erase(iterator) called with an iterator not"
3100 " referring to this string");
3101#endif
3102 _LIBCPP_ASSERT(__pos != end(),
3103 "string::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003104 iterator __b = begin();
3105 size_type __r = static_cast<size_type>(__pos - __b);
3106 erase(__r, 1);
Howard Hinnantec3773c2011-12-01 20:21:04 +00003107 return __b + static_cast<difference_type>(__r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003108}
3109
3110template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003111inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003112typename basic_string<_CharT, _Traits, _Allocator>::iterator
3113basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last)
3114{
Howard Hinnant499cea12013-08-23 17:37:05 +00003115#if _LIBCPP_DEBUG_LEVEL >= 2
3116 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
3117 "string::erase(iterator, iterator) called with an iterator not"
3118 " referring to this string");
3119#endif
3120 _LIBCPP_ASSERT(__first <= __last, "string::erase(first, last) called with invalid range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003121 iterator __b = begin();
3122 size_type __r = static_cast<size_type>(__first - __b);
3123 erase(__r, static_cast<size_type>(__last - __first));
Howard Hinnantec3773c2011-12-01 20:21:04 +00003124 return __b + static_cast<difference_type>(__r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003125}
3126
3127template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003128inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003129void
3130basic_string<_CharT, _Traits, _Allocator>::pop_back()
3131{
Howard Hinnant499cea12013-08-23 17:37:05 +00003132 _LIBCPP_ASSERT(!empty(), "string::pop_back(): string is already empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003133 size_type __sz;
3134 if (__is_long())
3135 {
3136 __sz = __get_long_size() - 1;
3137 __set_long_size(__sz);
3138 traits_type::assign(*(__get_long_pointer() + __sz), value_type());
3139 }
3140 else
3141 {
3142 __sz = __get_short_size() - 1;
3143 __set_short_size(__sz);
3144 traits_type::assign(*(__get_short_pointer() + __sz), value_type());
3145 }
3146 __invalidate_iterators_past(__sz);
3147}
3148
3149template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003150inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003151void
Howard Hinnanta6119a82011-05-29 19:57:12 +00003152basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003153{
3154 __invalidate_all_iterators();
3155 if (__is_long())
3156 {
3157 traits_type::assign(*__get_long_pointer(), value_type());
3158 __set_long_size(0);
3159 }
3160 else
3161 {
3162 traits_type::assign(*__get_short_pointer(), value_type());
3163 __set_short_size(0);
3164 }
3165}
3166
3167template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003168inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003169void
3170basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos)
3171{
3172 if (__is_long())
3173 {
3174 traits_type::assign(*(__get_long_pointer() + __pos), value_type());
3175 __set_long_size(__pos);
3176 }
3177 else
3178 {
3179 traits_type::assign(*(__get_short_pointer() + __pos), value_type());
3180 __set_short_size(__pos);
3181 }
3182 __invalidate_iterators_past(__pos);
3183}
3184
3185template <class _CharT, class _Traits, class _Allocator>
3186void
3187basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c)
3188{
3189 size_type __sz = size();
3190 if (__n > __sz)
3191 append(__n - __sz, __c);
3192 else
3193 __erase_to_end(__n);
3194}
3195
3196template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003197inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003198typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003199basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003200{
Howard Hinnante32b5e22010-11-17 17:55:08 +00003201 size_type __m = __alloc_traits::max_size(__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003202#if _LIBCPP_BIG_ENDIAN
Marshall Clow09f85502013-10-31 17:23:08 +00003203 return (__m <= ~__long_mask ? __m : __m/2) - __alignment;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003204#else
Marshall Clow09f85502013-10-31 17:23:08 +00003205 return __m - __alignment;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003206#endif
3207}
3208
3209template <class _CharT, class _Traits, class _Allocator>
3210void
3211basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg)
3212{
3213 if (__res_arg > max_size())
3214 this->__throw_length_error();
3215 size_type __cap = capacity();
3216 size_type __sz = size();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003217 __res_arg = _VSTD::max(__res_arg, __sz);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003218 __res_arg = __recommend(__res_arg);
3219 if (__res_arg != __cap)
3220 {
3221 pointer __new_data, __p;
3222 bool __was_long, __now_long;
3223 if (__res_arg == __min_cap - 1)
3224 {
3225 __was_long = true;
3226 __now_long = false;
3227 __new_data = __get_short_pointer();
3228 __p = __get_long_pointer();
3229 }
3230 else
3231 {
3232 if (__res_arg > __cap)
Howard Hinnante32b5e22010-11-17 17:55:08 +00003233 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003234 else
3235 {
3236 #ifndef _LIBCPP_NO_EXCEPTIONS
3237 try
3238 {
Howard Hinnant324bb032010-08-22 00:02:43 +00003239 #endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante32b5e22010-11-17 17:55:08 +00003240 __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003241 #ifndef _LIBCPP_NO_EXCEPTIONS
3242 }
3243 catch (...)
3244 {
3245 return;
3246 }
Howard Hinnant324bb032010-08-22 00:02:43 +00003247 #else // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003248 if (__new_data == nullptr)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003249 return;
Howard Hinnant324bb032010-08-22 00:02:43 +00003250 #endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003251 }
3252 __now_long = true;
3253 __was_long = __is_long();
3254 __p = __get_pointer();
3255 }
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003256 traits_type::copy(_VSTD::__to_raw_pointer(__new_data),
3257 _VSTD::__to_raw_pointer(__p), size()+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003258 if (__was_long)
Howard Hinnante32b5e22010-11-17 17:55:08 +00003259 __alloc_traits::deallocate(__alloc(), __p, __cap+1);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003260 if (__now_long)
3261 {
3262 __set_long_cap(__res_arg+1);
3263 __set_long_size(__sz);
3264 __set_long_pointer(__new_data);
3265 }
3266 else
3267 __set_short_size(__sz);
3268 __invalidate_all_iterators();
3269 }
3270}
3271
3272template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003273inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003274typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3275basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const
3276{
Howard Hinnant499cea12013-08-23 17:37:05 +00003277 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003278 return *(data() + __pos);
3279}
3280
3281template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003282inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003283typename basic_string<_CharT, _Traits, _Allocator>::reference
3284basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos)
3285{
Howard Hinnant499cea12013-08-23 17:37:05 +00003286 _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003287 return *(__get_pointer() + __pos);
3288}
3289
3290template <class _CharT, class _Traits, class _Allocator>
3291typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3292basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const
3293{
3294 if (__n >= size())
3295 this->__throw_out_of_range();
3296 return (*this)[__n];
3297}
3298
3299template <class _CharT, class _Traits, class _Allocator>
3300typename basic_string<_CharT, _Traits, _Allocator>::reference
3301basic_string<_CharT, _Traits, _Allocator>::at(size_type __n)
3302{
3303 if (__n >= size())
3304 this->__throw_out_of_range();
3305 return (*this)[__n];
3306}
3307
3308template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003309inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003310typename basic_string<_CharT, _Traits, _Allocator>::reference
3311basic_string<_CharT, _Traits, _Allocator>::front()
3312{
Howard Hinnant499cea12013-08-23 17:37:05 +00003313 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003314 return *__get_pointer();
3315}
3316
3317template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003318inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003319typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3320basic_string<_CharT, _Traits, _Allocator>::front() const
3321{
Howard Hinnant499cea12013-08-23 17:37:05 +00003322 _LIBCPP_ASSERT(!empty(), "string::front(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003323 return *data();
3324}
3325
3326template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003327inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003328typename basic_string<_CharT, _Traits, _Allocator>::reference
3329basic_string<_CharT, _Traits, _Allocator>::back()
3330{
Howard Hinnant499cea12013-08-23 17:37:05 +00003331 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003332 return *(__get_pointer() + size() - 1);
3333}
3334
3335template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003336inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003337typename basic_string<_CharT, _Traits, _Allocator>::const_reference
3338basic_string<_CharT, _Traits, _Allocator>::back() const
3339{
Howard Hinnant499cea12013-08-23 17:37:05 +00003340 _LIBCPP_ASSERT(!empty(), "string::back(): string is empty");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003341 return *(data() + size() - 1);
3342}
3343
3344template <class _CharT, class _Traits, class _Allocator>
3345typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003346basic_string<_CharT, _Traits, _Allocator>::copy(value_type* __s, size_type __n, size_type __pos) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003347{
3348 size_type __sz = size();
3349 if (__pos > __sz)
3350 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003351 size_type __rlen = _VSTD::min(__n, __sz - __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003352 traits_type::copy(__s, data() + __pos, __rlen);
3353 return __rlen;
3354}
3355
3356template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003357inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003358basic_string<_CharT, _Traits, _Allocator>
3359basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const
3360{
3361 return basic_string(*this, __pos, __n, __alloc());
3362}
3363
3364template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003365inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003366void
3367basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str)
Marshall Clow7d914d12015-07-13 20:04:56 +00003368#if _LIBCPP_STD_VER >= 14
3369 _NOEXCEPT
3370#else
3371 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3372 __is_nothrow_swappable<allocator_type>::value)
3373#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003374{
Howard Hinnant499cea12013-08-23 17:37:05 +00003375#if _LIBCPP_DEBUG_LEVEL >= 2
3376 if (!__is_long())
3377 __get_db()->__invalidate_all(this);
3378 if (!__str.__is_long())
3379 __get_db()->__invalidate_all(&__str);
3380 __get_db()->swap(this, &__str);
3381#endif
Howard Hinnant0949eed2011-06-30 21:18:19 +00003382 _VSTD::swap(__r_.first(), __str.__r_.first());
Marshall Clow7d914d12015-07-13 20:04:56 +00003383 __swap_allocator(__alloc(), __str.__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003384}
3385
3386// find
3387
3388template <class _Traits>
3389struct _LIBCPP_HIDDEN __traits_eq
3390{
3391 typedef typename _Traits::char_type char_type;
Howard Hinnanta6119a82011-05-29 19:57:12 +00003392 _LIBCPP_INLINE_VISIBILITY
3393 bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT
3394 {return _Traits::eq(__x, __y);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003395};
3396
3397template<class _CharT, class _Traits, class _Allocator>
3398typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003399basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003400 size_type __pos,
3401 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003402{
Alp Tokerec34c482014-05-15 11:27:39 +00003403 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003404 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003405 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003406}
3407
3408template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003409inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003410typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003411basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str,
3412 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003413{
Marshall Clow37025e12014-06-10 18:51:55 +00003414 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003415 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003416}
3417
3418template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003419inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003420typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003421basic_string<_CharT, _Traits, _Allocator>::find(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003422 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003423{
Alp Tokerec34c482014-05-15 11:27:39 +00003424 _LIBCPP_ASSERT(__s != nullptr, "string::find(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003425 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003426 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003427}
3428
3429template<class _CharT, class _Traits, class _Allocator>
3430typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003431basic_string<_CharT, _Traits, _Allocator>::find(value_type __c,
3432 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003433{
Marshall Clow37025e12014-06-10 18:51:55 +00003434 return _VSTD::__str_find<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003435 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003436}
3437
3438// rfind
3439
3440template<class _CharT, class _Traits, class _Allocator>
3441typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003442basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003443 size_type __pos,
3444 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003445{
Alp Tokerec34c482014-05-15 11:27:39 +00003446 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::rfind(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003447 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003448 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003449}
3450
3451template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003452inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003453typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003454basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str,
3455 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003456{
Marshall Clow37025e12014-06-10 18:51:55 +00003457 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003458 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003459}
3460
3461template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003462inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003463typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003464basic_string<_CharT, _Traits, _Allocator>::rfind(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003465 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003466{
Alp Tokerec34c482014-05-15 11:27:39 +00003467 _LIBCPP_ASSERT(__s != nullptr, "string::rfind(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003468 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003469 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003470}
3471
3472template<class _CharT, class _Traits, class _Allocator>
3473typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003474basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c,
3475 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003476{
Marshall Clow37025e12014-06-10 18:51:55 +00003477 return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
Marshall Clow360f3192014-06-02 02:22:49 +00003478 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003479}
3480
3481// find_first_of
3482
3483template<class _CharT, class _Traits, class _Allocator>
3484typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003485basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003486 size_type __pos,
3487 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003488{
Alp Tokerec34c482014-05-15 11:27:39 +00003489 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003490 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003491 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003492}
3493
3494template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003495inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003496typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003497basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str,
3498 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003499{
Marshall Clow37025e12014-06-10 18:51:55 +00003500 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003501 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003502}
3503
3504template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003505inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003506typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003507basic_string<_CharT, _Traits, _Allocator>::find_first_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003508 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003509{
Alp Tokerec34c482014-05-15 11:27:39 +00003510 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003511 return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003512 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003513}
3514
3515template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003516inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003517typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003518basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c,
3519 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003520{
3521 return find(__c, __pos);
3522}
3523
3524// find_last_of
3525
3526template<class _CharT, class _Traits, class _Allocator>
3527typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003528basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003529 size_type __pos,
3530 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003531{
Alp Tokerec34c482014-05-15 11:27:39 +00003532 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003533 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003534 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003535}
3536
3537template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003538inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003539typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003540basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str,
3541 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003542{
Marshall Clow37025e12014-06-10 18:51:55 +00003543 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003544 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003545}
3546
3547template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003548inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003549typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003550basic_string<_CharT, _Traits, _Allocator>::find_last_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003551 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003552{
Alp Tokerec34c482014-05-15 11:27:39 +00003553 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003554 return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003555 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003556}
3557
3558template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003559inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003560typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003561basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c,
3562 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003563{
3564 return rfind(__c, __pos);
3565}
3566
3567// find_first_not_of
3568
3569template<class _CharT, class _Traits, class _Allocator>
3570typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003571basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003572 size_type __pos,
3573 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003574{
Alp Tokerec34c482014-05-15 11:27:39 +00003575 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_first_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003576 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003577 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003578}
3579
3580template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003581inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003582typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003583basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str,
3584 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003585{
Marshall Clow37025e12014-06-10 18:51:55 +00003586 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003587 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003588}
3589
3590template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003591inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003592typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003593basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003594 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003595{
Alp Tokerec34c482014-05-15 11:27:39 +00003596 _LIBCPP_ASSERT(__s != nullptr, "string::find_first_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003597 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003598 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003599}
3600
3601template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003602inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003603typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003604basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c,
3605 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003606{
Marshall Clow37025e12014-06-10 18:51:55 +00003607 return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003608 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003609}
3610
3611// find_last_not_of
3612
3613template<class _CharT, class _Traits, class _Allocator>
3614typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003615basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003616 size_type __pos,
3617 size_type __n) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003618{
Alp Tokerec34c482014-05-15 11:27:39 +00003619 _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string::find_last_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003620 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003621 (data(), size(), __s, __pos, __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003622}
3623
3624template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003625inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003626typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003627basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str,
3628 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003629{
Marshall Clow37025e12014-06-10 18:51:55 +00003630 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003631 (data(), size(), __str.data(), __pos, __str.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003632}
3633
3634template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003635inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003636typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003637basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003638 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003639{
Alp Tokerec34c482014-05-15 11:27:39 +00003640 _LIBCPP_ASSERT(__s != nullptr, "string::find_last_not_of(): received nullptr");
Marshall Clow37025e12014-06-10 18:51:55 +00003641 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003642 (data(), size(), __s, __pos, traits_type::length(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003643}
3644
3645template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003646inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003647typename basic_string<_CharT, _Traits, _Allocator>::size_type
Howard Hinnanta6119a82011-05-29 19:57:12 +00003648basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c,
3649 size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003650{
Marshall Clow37025e12014-06-10 18:51:55 +00003651 return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
Marshall Clow8eb5acc2014-02-16 01:57:26 +00003652 (data(), size(), __c, __pos);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003653}
3654
3655// compare
3656
3657template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003658inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003659int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003660basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003661{
Howard Hinnantfa06d752011-07-24 21:45:06 +00003662 size_t __lhs_sz = size();
3663 size_t __rhs_sz = __str.size();
3664 int __result = traits_type::compare(data(), __str.data(),
3665 _VSTD::min(__lhs_sz, __rhs_sz));
3666 if (__result != 0)
3667 return __result;
3668 if (__lhs_sz < __rhs_sz)
3669 return -1;
3670 if (__lhs_sz > __rhs_sz)
3671 return 1;
3672 return 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003673}
3674
3675template <class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003676inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003677int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003678basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3679 size_type __n1,
3680 const basic_string& __str) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003681{
3682 return compare(__pos1, __n1, __str.data(), __str.size());
3683}
3684
3685template <class _CharT, class _Traits, class _Allocator>
3686int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003687basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3688 size_type __n1,
3689 const basic_string& __str,
3690 size_type __pos2,
3691 size_type __n2) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003692{
3693 size_type __sz = __str.size();
3694 if (__pos2 > __sz)
3695 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003696 return compare(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003697 __sz - __pos2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003698}
3699
3700template <class _CharT, class _Traits, class _Allocator>
3701int
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003702basic_string<_CharT, _Traits, _Allocator>::compare(const value_type* __s) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003703{
Alp Tokerec34c482014-05-15 11:27:39 +00003704 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003705 return compare(0, npos, __s, traits_type::length(__s));
3706}
3707
3708template <class _CharT, class _Traits, class _Allocator>
3709int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003710basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3711 size_type __n1,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003712 const value_type* __s) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003713{
Alp Tokerec34c482014-05-15 11:27:39 +00003714 _LIBCPP_ASSERT(__s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003715 return compare(__pos1, __n1, __s, traits_type::length(__s));
3716}
3717
3718template <class _CharT, class _Traits, class _Allocator>
3719int
Howard Hinnanta6119a82011-05-29 19:57:12 +00003720basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
3721 size_type __n1,
Howard Hinnant9dcdcde2013-06-28 16:59:19 +00003722 const value_type* __s,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003723 size_type __n2) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003724{
Alp Tokerec34c482014-05-15 11:27:39 +00003725 _LIBCPP_ASSERT(__n2 == 0 || __s != nullptr, "string::compare(): received nullptr");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003726 size_type __sz = size();
3727 if (__pos1 > __sz || __n2 == npos)
3728 this->__throw_out_of_range();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003729 size_type __rlen = _VSTD::min(__n1, __sz - __pos1);
3730 int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003731 if (__r == 0)
3732 {
3733 if (__rlen < __n2)
3734 __r = -1;
3735 else if (__rlen > __n2)
3736 __r = 1;
3737 }
3738 return __r;
3739}
3740
3741// __invariants
3742
3743template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003744inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003745bool
3746basic_string<_CharT, _Traits, _Allocator>::__invariants() const
3747{
3748 if (size() > capacity())
3749 return false;
3750 if (capacity() < __min_cap - 1)
3751 return false;
3752 if (data() == 0)
3753 return false;
3754 if (data()[size()] != value_type(0))
3755 return false;
3756 return true;
3757}
3758
3759// operator==
3760
3761template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003762inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003763bool
3764operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003765 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003766{
Howard Hinnant08dd2532013-04-22 23:55:13 +00003767 size_t __lhs_sz = __lhs.size();
3768 return __lhs_sz == __rhs.size() && _Traits::compare(__lhs.data(),
3769 __rhs.data(),
3770 __lhs_sz) == 0;
3771}
3772
3773template<class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003774inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant08dd2532013-04-22 23:55:13 +00003775bool
3776operator==(const basic_string<char, char_traits<char>, _Allocator>& __lhs,
3777 const basic_string<char, char_traits<char>, _Allocator>& __rhs) _NOEXCEPT
3778{
3779 size_t __lhs_sz = __lhs.size();
3780 if (__lhs_sz != __rhs.size())
3781 return false;
3782 const char* __lp = __lhs.data();
3783 const char* __rp = __rhs.data();
3784 if (__lhs.__is_long())
3785 return char_traits<char>::compare(__lp, __rp, __lhs_sz) == 0;
3786 for (; __lhs_sz != 0; --__lhs_sz, ++__lp, ++__rp)
3787 if (*__lp != *__rp)
3788 return false;
3789 return true;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003790}
3791
3792template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003793inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003794bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003795operator==(const _CharT* __lhs,
3796 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003797{
3798 return __rhs.compare(__lhs) == 0;
3799}
3800
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003801template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003802inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003803bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003804operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
3805 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003806{
3807 return __lhs.compare(__rhs) == 0;
3808}
3809
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003810// operator!=
3811
Howard Hinnant324bb032010-08-22 00:02:43 +00003812template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003813inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003814bool
3815operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003816 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003817{
3818 return !(__lhs == __rhs);
3819}
3820
3821template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003822inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003823bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003824operator!=(const _CharT* __lhs,
3825 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003826{
3827 return !(__lhs == __rhs);
3828}
3829
3830template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003831inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003832bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003833operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3834 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003835{
3836 return !(__lhs == __rhs);
3837}
3838
3839// operator<
3840
3841template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003842inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003843bool
3844operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003845 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003846{
Howard Hinnant2644a7b2011-07-24 15:07:21 +00003847 return __lhs.compare(__rhs) < 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003848}
3849
3850template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003851inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003852bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003853operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3854 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003855{
Howard Hinnant2644a7b2011-07-24 15:07:21 +00003856 return __lhs.compare(__rhs) < 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003857}
3858
3859template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003860inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003861bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003862operator< (const _CharT* __lhs,
3863 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003864{
3865 return __rhs.compare(__lhs) > 0;
3866}
3867
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003868// operator>
3869
3870template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003871inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003872bool
3873operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003874 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003875{
3876 return __rhs < __lhs;
3877}
3878
3879template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003880inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003881bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003882operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3883 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003884{
3885 return __rhs < __lhs;
3886}
3887
3888template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003889inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003890bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003891operator> (const _CharT* __lhs,
3892 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003893{
3894 return __rhs < __lhs;
3895}
3896
3897// operator<=
3898
3899template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003900inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003901bool
3902operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003903 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003904{
3905 return !(__rhs < __lhs);
3906}
3907
3908template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003909inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003910bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003911operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3912 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003913{
3914 return !(__rhs < __lhs);
3915}
3916
3917template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003918inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003919bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003920operator<=(const _CharT* __lhs,
3921 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003922{
3923 return !(__rhs < __lhs);
3924}
3925
3926// operator>=
3927
3928template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003929inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003930bool
3931operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnanta6119a82011-05-29 19:57:12 +00003932 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003933{
3934 return !(__lhs < __rhs);
3935}
3936
3937template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003938inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003939bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003940operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3941 const _CharT* __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003942{
3943 return !(__lhs < __rhs);
3944}
3945
3946template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00003947inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003948bool
Howard Hinnanta6119a82011-05-29 19:57:12 +00003949operator>=(const _CharT* __lhs,
3950 const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003951{
3952 return !(__lhs < __rhs);
3953}
3954
3955// operator +
3956
3957template<class _CharT, class _Traits, class _Allocator>
3958basic_string<_CharT, _Traits, _Allocator>
3959operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs,
3960 const basic_string<_CharT, _Traits, _Allocator>& __rhs)
3961{
3962 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
3963 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
3964 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
3965 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
3966 __r.append(__rhs.data(), __rhs_sz);
3967 return __r;
3968}
3969
3970template<class _CharT, class _Traits, class _Allocator>
3971basic_string<_CharT, _Traits, _Allocator>
3972operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs)
3973{
3974 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
3975 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs);
3976 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
3977 __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz);
3978 __r.append(__rhs.data(), __rhs_sz);
3979 return __r;
3980}
3981
3982template<class _CharT, class _Traits, class _Allocator>
3983basic_string<_CharT, _Traits, _Allocator>
3984operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs)
3985{
3986 basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator());
3987 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size();
3988 __r.__init(&__lhs, 1, 1 + __rhs_sz);
3989 __r.append(__rhs.data(), __rhs_sz);
3990 return __r;
3991}
3992
3993template<class _CharT, class _Traits, class _Allocator>
3994basic_string<_CharT, _Traits, _Allocator>
3995operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs)
3996{
3997 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
3998 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
3999 typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs);
4000 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz);
4001 __r.append(__rhs, __rhs_sz);
4002 return __r;
4003}
4004
4005template<class _CharT, class _Traits, class _Allocator>
4006basic_string<_CharT, _Traits, _Allocator>
4007operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs)
4008{
4009 basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator());
4010 typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size();
4011 __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1);
4012 __r.push_back(__rhs);
4013 return __r;
4014}
4015
Howard Hinnant73d21a42010-09-04 23:28:19 +00004016#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004017
4018template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004019inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004020basic_string<_CharT, _Traits, _Allocator>
4021operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs)
4022{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004023 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004024}
4025
4026template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004027inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004028basic_string<_CharT, _Traits, _Allocator>
4029operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4030{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004031 return _VSTD::move(__rhs.insert(0, __lhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004032}
4033
4034template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004035inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004036basic_string<_CharT, _Traits, _Allocator>
4037operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs)
4038{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004039 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004040}
4041
4042template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004043inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004044basic_string<_CharT, _Traits, _Allocator>
4045operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4046{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004047 return _VSTD::move(__rhs.insert(0, __lhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004048}
4049
4050template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004051inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004052basic_string<_CharT, _Traits, _Allocator>
4053operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs)
4054{
4055 __rhs.insert(__rhs.begin(), __lhs);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004056 return _VSTD::move(__rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004057}
4058
4059template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004060inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004061basic_string<_CharT, _Traits, _Allocator>
4062operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs)
4063{
Howard Hinnant0949eed2011-06-30 21:18:19 +00004064 return _VSTD::move(__lhs.append(__rhs));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004065}
4066
4067template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004068inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004069basic_string<_CharT, _Traits, _Allocator>
4070operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs)
4071{
4072 __lhs.push_back(__rhs);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004073 return _VSTD::move(__lhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004074}
4075
Howard Hinnant73d21a42010-09-04 23:28:19 +00004076#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004077
4078// swap
4079
4080template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant1e564242013-10-04 22:09:00 +00004081inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004082void
Howard Hinnanta6119a82011-05-29 19:57:12 +00004083swap(basic_string<_CharT, _Traits, _Allocator>& __lhs,
Howard Hinnant53f7d4c2011-06-03 18:40:47 +00004084 basic_string<_CharT, _Traits, _Allocator>& __rhs)
4085 _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004086{
4087 __lhs.swap(__rhs);
4088}
4089
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004090#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
4091
4092typedef basic_string<char16_t> u16string;
4093typedef basic_string<char32_t> u32string;
4094
Howard Hinnant324bb032010-08-22 00:02:43 +00004095#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004096
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004097_LIBCPP_FUNC_VIS int stoi (const string& __str, size_t* __idx = 0, int __base = 10);
4098_LIBCPP_FUNC_VIS long stol (const string& __str, size_t* __idx = 0, int __base = 10);
4099_LIBCPP_FUNC_VIS unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10);
4100_LIBCPP_FUNC_VIS long long stoll (const string& __str, size_t* __idx = 0, int __base = 10);
4101_LIBCPP_FUNC_VIS unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004102
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004103_LIBCPP_FUNC_VIS float stof (const string& __str, size_t* __idx = 0);
4104_LIBCPP_FUNC_VIS double stod (const string& __str, size_t* __idx = 0);
4105_LIBCPP_FUNC_VIS long double stold(const string& __str, size_t* __idx = 0);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004106
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004107_LIBCPP_FUNC_VIS string to_string(int __val);
4108_LIBCPP_FUNC_VIS string to_string(unsigned __val);
4109_LIBCPP_FUNC_VIS string to_string(long __val);
4110_LIBCPP_FUNC_VIS string to_string(unsigned long __val);
4111_LIBCPP_FUNC_VIS string to_string(long long __val);
4112_LIBCPP_FUNC_VIS string to_string(unsigned long long __val);
4113_LIBCPP_FUNC_VIS string to_string(float __val);
4114_LIBCPP_FUNC_VIS string to_string(double __val);
4115_LIBCPP_FUNC_VIS string to_string(long double __val);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004116
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004117_LIBCPP_FUNC_VIS int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10);
4118_LIBCPP_FUNC_VIS long stol (const wstring& __str, size_t* __idx = 0, int __base = 10);
4119_LIBCPP_FUNC_VIS unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10);
4120_LIBCPP_FUNC_VIS long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10);
4121_LIBCPP_FUNC_VIS unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004122
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004123_LIBCPP_FUNC_VIS float stof (const wstring& __str, size_t* __idx = 0);
4124_LIBCPP_FUNC_VIS double stod (const wstring& __str, size_t* __idx = 0);
4125_LIBCPP_FUNC_VIS long double stold(const wstring& __str, size_t* __idx = 0);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004126
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004127_LIBCPP_FUNC_VIS wstring to_wstring(int __val);
4128_LIBCPP_FUNC_VIS wstring to_wstring(unsigned __val);
4129_LIBCPP_FUNC_VIS wstring to_wstring(long __val);
4130_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long __val);
4131_LIBCPP_FUNC_VIS wstring to_wstring(long long __val);
4132_LIBCPP_FUNC_VIS wstring to_wstring(unsigned long long __val);
4133_LIBCPP_FUNC_VIS wstring to_wstring(float __val);
4134_LIBCPP_FUNC_VIS wstring to_wstring(double __val);
4135_LIBCPP_FUNC_VIS wstring to_wstring(long double __val);
Howard Hinnanta6a062d2010-06-02 18:20:39 +00004136
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004137template<class _CharT, class _Traits, class _Allocator>
4138 const typename basic_string<_CharT, _Traits, _Allocator>::size_type
4139 basic_string<_CharT, _Traits, _Allocator>::npos;
4140
4141template<class _CharT, class _Traits, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004142struct _LIBCPP_TYPE_VIS_ONLY hash<basic_string<_CharT, _Traits, _Allocator> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004143 : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t>
4144{
4145 size_t
Howard Hinnanta6119a82011-05-29 19:57:12 +00004146 operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004147};
4148
4149template<class _CharT, class _Traits, class _Allocator>
4150size_t
4151hash<basic_string<_CharT, _Traits, _Allocator> >::operator()(
Howard Hinnanta6119a82011-05-29 19:57:12 +00004152 const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004153{
Sean Huntaffd9e52011-07-29 23:31:56 +00004154 return __do_string_hash(__val.data(), __val.data() + __val.size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004155}
4156
Howard Hinnant464aa5c2011-07-18 15:51:59 +00004157template<class _CharT, class _Traits, class _Allocator>
4158basic_ostream<_CharT, _Traits>&
4159operator<<(basic_ostream<_CharT, _Traits>& __os,
4160 const basic_string<_CharT, _Traits, _Allocator>& __str);
4161
4162template<class _CharT, class _Traits, class _Allocator>
4163basic_istream<_CharT, _Traits>&
4164operator>>(basic_istream<_CharT, _Traits>& __is,
4165 basic_string<_CharT, _Traits, _Allocator>& __str);
4166
4167template<class _CharT, class _Traits, class _Allocator>
4168basic_istream<_CharT, _Traits>&
4169getline(basic_istream<_CharT, _Traits>& __is,
4170 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4171
4172template<class _CharT, class _Traits, class _Allocator>
4173inline _LIBCPP_INLINE_VISIBILITY
4174basic_istream<_CharT, _Traits>&
4175getline(basic_istream<_CharT, _Traits>& __is,
4176 basic_string<_CharT, _Traits, _Allocator>& __str);
4177
4178#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
4179
4180template<class _CharT, class _Traits, class _Allocator>
4181inline _LIBCPP_INLINE_VISIBILITY
4182basic_istream<_CharT, _Traits>&
4183getline(basic_istream<_CharT, _Traits>&& __is,
4184 basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm);
4185
4186template<class _CharT, class _Traits, class _Allocator>
4187inline _LIBCPP_INLINE_VISIBILITY
4188basic_istream<_CharT, _Traits>&
4189getline(basic_istream<_CharT, _Traits>&& __is,
4190 basic_string<_CharT, _Traits, _Allocator>& __str);
4191
4192#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4193
Howard Hinnant499cea12013-08-23 17:37:05 +00004194#if _LIBCPP_DEBUG_LEVEL >= 2
4195
4196template<class _CharT, class _Traits, class _Allocator>
4197bool
4198basic_string<_CharT, _Traits, _Allocator>::__dereferenceable(const const_iterator* __i) const
4199{
4200 return this->data() <= _VSTD::__to_raw_pointer(__i->base()) &&
4201 _VSTD::__to_raw_pointer(__i->base()) < this->data() + this->size();
4202}
4203
4204template<class _CharT, class _Traits, class _Allocator>
4205bool
4206basic_string<_CharT, _Traits, _Allocator>::__decrementable(const const_iterator* __i) const
4207{
4208 return this->data() < _VSTD::__to_raw_pointer(__i->base()) &&
4209 _VSTD::__to_raw_pointer(__i->base()) <= this->data() + this->size();
4210}
4211
4212template<class _CharT, class _Traits, class _Allocator>
4213bool
4214basic_string<_CharT, _Traits, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
4215{
4216 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4217 return this->data() <= __p && __p <= this->data() + this->size();
4218}
4219
4220template<class _CharT, class _Traits, class _Allocator>
4221bool
4222basic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
4223{
4224 const value_type* __p = _VSTD::__to_raw_pointer(__i->base()) + __n;
4225 return this->data() <= __p && __p < this->data() + this->size();
4226}
4227
4228#endif // _LIBCPP_DEBUG_LEVEL >= 2
4229
Marshall Clow15234322013-07-23 17:05:24 +00004230#if _LIBCPP_STD_VER > 11
4231// Literal suffixes for basic_string [basic.string.literals]
Marshall Clow8d9dd7a2013-10-05 21:18:32 +00004232inline namespace literals
Marshall Clow15234322013-07-23 17:05:24 +00004233{
4234 inline namespace string_literals
4235 {
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004236 inline _LIBCPP_INLINE_VISIBILITY
4237 basic_string<char> operator "" s( const char *__str, size_t __len )
4238 {
4239 return basic_string<char> (__str, __len);
4240 }
Marshall Clow15234322013-07-23 17:05:24 +00004241
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004242 inline _LIBCPP_INLINE_VISIBILITY
4243 basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
4244 {
4245 return basic_string<wchar_t> (__str, __len);
4246 }
Marshall Clow15234322013-07-23 17:05:24 +00004247
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004248 inline _LIBCPP_INLINE_VISIBILITY
4249 basic_string<char16_t> operator "" s( const char16_t *__str, size_t __len )
4250 {
4251 return basic_string<char16_t> (__str, __len);
4252 }
Marshall Clow15234322013-07-23 17:05:24 +00004253
Howard Hinnantab61b2c2013-08-07 19:39:48 +00004254 inline _LIBCPP_INLINE_VISIBILITY
4255 basic_string<char32_t> operator "" s( const char32_t *__str, size_t __len )
4256 {
4257 return basic_string<char32_t> (__str, __len);
4258 }
Marshall Clow15234322013-07-23 17:05:24 +00004259 }
4260}
4261#endif
4262
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004263_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<char>)
4264_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<wchar_t>)
Howard Hinnant499cea12013-08-23 17:37:05 +00004265_LIBCPP_EXTERN_TEMPLATE(string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004266
4267_LIBCPP_END_NAMESPACE_STD
4268
4269#endif // _LIBCPP_STRING