blob: 5481b2ff895bc510658e869815230871e0c3bbc8 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===------------------------------ vector --------------------------------===//
3//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_VECTOR
11#define _LIBCPP_VECTOR
12
13/*
14 vector synopsis
15
16namespace std
17{
18
Howard Hinnant3b6579a2010-08-22 00:02:43 +000019template <class T, class Allocator = allocator<T> >
Howard Hinnantc51e1022010-05-11 19:42:16 +000020class vector
Howard Hinnant3b6579a2010-08-22 00:02:43 +000021{
22public:
23 typedef T value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +000024 typedef Allocator allocator_type;
25 typedef typename allocator_type::reference reference;
26 typedef typename allocator_type::const_reference const_reference;
27 typedef implementation-defined iterator;
28 typedef implementation-defined const_iterator;
29 typedef typename allocator_type::size_type size_type;
30 typedef typename allocator_type::difference_type difference_type;
31 typedef typename allocator_type::pointer pointer;
32 typedef typename allocator_type::const_pointer const_pointer;
33 typedef std::reverse_iterator<iterator> reverse_iterator;
34 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
35
Howard Hinnant1c936782011-06-03 19:40:40 +000036 vector()
37 noexcept(is_nothrow_default_constructible<allocator_type>::value);
38 explicit vector(const allocator_type&);
Howard Hinnantc51e1022010-05-11 19:42:16 +000039 explicit vector(size_type n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +000040 explicit vector(size_type n, const allocator_type&); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000041 vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
42 template <class InputIterator>
43 vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
44 vector(const vector& x);
Howard Hinnant1c936782011-06-03 19:40:40 +000045 vector(vector&& x)
46 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000047 vector(initializer_list<value_type> il);
48 vector(initializer_list<value_type> il, const allocator_type& a);
49 ~vector();
50 vector& operator=(const vector& x);
Howard Hinnant1c936782011-06-03 19:40:40 +000051 vector& operator=(vector&& x)
52 noexcept(
Marshall Clow2fe8a8d2015-08-18 18:57:00 +000053 allocator_type::propagate_on_container_move_assignment::value ||
54 allocator_type::is_always_equal::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +000055 vector& operator=(initializer_list<value_type> il);
56 template <class InputIterator>
57 void assign(InputIterator first, InputIterator last);
58 void assign(size_type n, const value_type& u);
59 void assign(initializer_list<value_type> il);
60
Howard Hinnant1c936782011-06-03 19:40:40 +000061 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000062
Howard Hinnant1c936782011-06-03 19:40:40 +000063 iterator begin() noexcept;
64 const_iterator begin() const noexcept;
65 iterator end() noexcept;
66 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000067
Howard Hinnant1c936782011-06-03 19:40:40 +000068 reverse_iterator rbegin() noexcept;
69 const_reverse_iterator rbegin() const noexcept;
70 reverse_iterator rend() noexcept;
71 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000072
Howard Hinnant1c936782011-06-03 19:40:40 +000073 const_iterator cbegin() const noexcept;
74 const_iterator cend() const noexcept;
75 const_reverse_iterator crbegin() const noexcept;
76 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000077
Howard Hinnant1c936782011-06-03 19:40:40 +000078 size_type size() const noexcept;
79 size_type max_size() const noexcept;
80 size_type capacity() const noexcept;
81 bool empty() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000082 void reserve(size_type n);
Howard Hinnant1c936782011-06-03 19:40:40 +000083 void shrink_to_fit() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000084
85 reference operator[](size_type n);
86 const_reference operator[](size_type n) const;
87 reference at(size_type n);
88 const_reference at(size_type n) const;
89
90 reference front();
91 const_reference front() const;
92 reference back();
93 const_reference back() const;
94
Howard Hinnant1c936782011-06-03 19:40:40 +000095 value_type* data() noexcept;
96 const value_type* data() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000097
98 void push_back(const value_type& x);
99 void push_back(value_type&& x);
100 template <class... Args>
Marshall Clowea52cc42017-01-24 23:09:12 +0000101 reference emplace_back(Args&&... args); // reference in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000102 void pop_back();
103
104 template <class... Args> iterator emplace(const_iterator position, Args&&... args);
105 iterator insert(const_iterator position, const value_type& x);
106 iterator insert(const_iterator position, value_type&& x);
107 iterator insert(const_iterator position, size_type n, const value_type& x);
108 template <class InputIterator>
109 iterator insert(const_iterator position, InputIterator first, InputIterator last);
110 iterator insert(const_iterator position, initializer_list<value_type> il);
111
112 iterator erase(const_iterator position);
113 iterator erase(const_iterator first, const_iterator last);
114
Howard Hinnant1c936782011-06-03 19:40:40 +0000115 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000116
117 void resize(size_type sz);
118 void resize(size_type sz, const value_type& c);
119
Howard Hinnant1c936782011-06-03 19:40:40 +0000120 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000121 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
122 allocator_traits<allocator_type>::is_always_equal::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000123
124 bool __invariants() const;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000125};
Howard Hinnantc51e1022010-05-11 19:42:16 +0000126
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000127template <class Allocator = allocator<T> >
Howard Hinnantc51e1022010-05-11 19:42:16 +0000128class vector<bool, Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000129{
130public:
131 typedef bool value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000132 typedef Allocator allocator_type;
133 typedef implementation-defined iterator;
134 typedef implementation-defined const_iterator;
135 typedef typename allocator_type::size_type size_type;
136 typedef typename allocator_type::difference_type difference_type;
137 typedef iterator pointer;
138 typedef const_iterator const_pointer;
139 typedef std::reverse_iterator<iterator> reverse_iterator;
140 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
141
142 class reference
143 {
144 public:
Howard Hinnant1c936782011-06-03 19:40:40 +0000145 reference(const reference&) noexcept;
146 operator bool() const noexcept;
147 reference& operator=(const bool x) noexcept;
148 reference& operator=(const reference& x) noexcept;
149 iterator operator&() const noexcept;
150 void flip() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000151 };
152
153 class const_reference
154 {
155 public:
Howard Hinnant1c936782011-06-03 19:40:40 +0000156 const_reference(const reference&) noexcept;
157 operator bool() const noexcept;
158 const_iterator operator&() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000159 };
160
Howard Hinnant1c936782011-06-03 19:40:40 +0000161 vector()
162 noexcept(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnantc2734962011-09-02 20:42:31 +0000163 explicit vector(const allocator_type&);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +0000164 explicit vector(size_type n, const allocator_type& a = allocator_type()); // C++14
165 vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000166 template <class InputIterator>
167 vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
168 vector(const vector& x);
Howard Hinnant1c936782011-06-03 19:40:40 +0000169 vector(vector&& x)
170 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000171 vector(initializer_list<value_type> il);
172 vector(initializer_list<value_type> il, const allocator_type& a);
173 ~vector();
174 vector& operator=(const vector& x);
Howard Hinnant1c936782011-06-03 19:40:40 +0000175 vector& operator=(vector&& x)
176 noexcept(
Marshall Clow2fe8a8d2015-08-18 18:57:00 +0000177 allocator_type::propagate_on_container_move_assignment::value ||
178 allocator_type::is_always_equal::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000179 vector& operator=(initializer_list<value_type> il);
180 template <class InputIterator>
181 void assign(InputIterator first, InputIterator last);
182 void assign(size_type n, const value_type& u);
183 void assign(initializer_list<value_type> il);
184
Howard Hinnant1c936782011-06-03 19:40:40 +0000185 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000186
Howard Hinnant1c936782011-06-03 19:40:40 +0000187 iterator begin() noexcept;
188 const_iterator begin() const noexcept;
189 iterator end() noexcept;
190 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000191
Howard Hinnant1c936782011-06-03 19:40:40 +0000192 reverse_iterator rbegin() noexcept;
193 const_reverse_iterator rbegin() const noexcept;
194 reverse_iterator rend() noexcept;
195 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000196
Howard Hinnant1c936782011-06-03 19:40:40 +0000197 const_iterator cbegin() const noexcept;
198 const_iterator cend() const noexcept;
199 const_reverse_iterator crbegin() const noexcept;
200 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000201
Howard Hinnant1c936782011-06-03 19:40:40 +0000202 size_type size() const noexcept;
203 size_type max_size() const noexcept;
204 size_type capacity() const noexcept;
205 bool empty() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000206 void reserve(size_type n);
Howard Hinnant1c936782011-06-03 19:40:40 +0000207 void shrink_to_fit() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000208
209 reference operator[](size_type n);
210 const_reference operator[](size_type n) const;
211 reference at(size_type n);
212 const_reference at(size_type n) const;
213
214 reference front();
215 const_reference front() const;
216 reference back();
217 const_reference back() const;
218
219 void push_back(const value_type& x);
Marshall Clowea52cc42017-01-24 23:09:12 +0000220 template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000221 void pop_back();
222
Marshall Clowc46bb8e2013-08-13 23:54:12 +0000223 template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000224 iterator insert(const_iterator position, const value_type& x);
225 iterator insert(const_iterator position, size_type n, const value_type& x);
226 template <class InputIterator>
227 iterator insert(const_iterator position, InputIterator first, InputIterator last);
228 iterator insert(const_iterator position, initializer_list<value_type> il);
229
230 iterator erase(const_iterator position);
231 iterator erase(const_iterator first, const_iterator last);
232
Howard Hinnant1c936782011-06-03 19:40:40 +0000233 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000234
235 void resize(size_type sz);
236 void resize(size_type sz, value_type x);
237
Howard Hinnant1c936782011-06-03 19:40:40 +0000238 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000239 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
240 allocator_traits<allocator_type>::is_always_equal::value); // C++17
Howard Hinnant1c936782011-06-03 19:40:40 +0000241 void flip() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000242
243 bool __invariants() const;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000244};
Howard Hinnantc51e1022010-05-11 19:42:16 +0000245
Marshall Clowf0ca1492018-05-21 21:30:12 +0000246template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
247 vector(InputIterator, InputIterator, Allocator = Allocator())
248 -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>;
249
Howard Hinnantc51e1022010-05-11 19:42:16 +0000250template <class Allocator> struct hash<std::vector<bool, Allocator>>;
251
252template <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
253template <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
254template <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
255template <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
256template <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
257template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
258
Howard Hinnant1c936782011-06-03 19:40:40 +0000259template <class T, class Allocator>
260void swap(vector<T,Allocator>& x, vector<T,Allocator>& y)
261 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000262
Marshall Clow29b53f22018-12-14 18:49:35 +0000263template <class T, class Allocator, class U>
264 void erase(vector<T, Allocator>& c, const U& value); // C++20
265template <class T, class Allocator, class Predicate>
266 void erase_if(vector<T, Allocator>& c, Predicate pred); // C++20
267
Howard Hinnantc51e1022010-05-11 19:42:16 +0000268} // std
269
270*/
271
272#include <__config>
Eric Fiselier876c6862016-02-20 00:19:45 +0000273#include <iosfwd> // for forward declaration of vector
Howard Hinnantc51e1022010-05-11 19:42:16 +0000274#include <__bit_reference>
275#include <type_traits>
276#include <climits>
277#include <limits>
278#include <initializer_list>
279#include <memory>
280#include <stdexcept>
281#include <algorithm>
282#include <cstring>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000283#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000284#include <__split_buffer>
285#include <__functional_base>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000286
Eric Fiselier14b6de92014-08-10 23:53:08 +0000287#include <__debug>
Howard Hinnante6ff0b62013-08-02 00:26:35 +0000288
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000289#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000290#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000291#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000292
Eric Fiselierf4433a32017-05-31 22:07:49 +0000293_LIBCPP_PUSH_MACROS
294#include <__undef_macros>
295
296
Howard Hinnantc51e1022010-05-11 19:42:16 +0000297_LIBCPP_BEGIN_NAMESPACE_STD
298
299template <bool>
300class __vector_base_common
301{
302protected:
Louis Dionne16fe2952018-07-11 23:14:33 +0000303 _LIBCPP_INLINE_VISIBILITY __vector_base_common() {}
Marshall Clow8fea1612016-08-25 15:09:01 +0000304 _LIBCPP_NORETURN void __throw_length_error() const;
305 _LIBCPP_NORETURN void __throw_out_of_range() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306};
307
308template <bool __b>
309void
310__vector_base_common<__b>::__throw_length_error() const
311{
Marshall Clow8fea1612016-08-25 15:09:01 +0000312 _VSTD::__throw_length_error("vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +0000313}
314
315template <bool __b>
316void
317__vector_base_common<__b>::__throw_out_of_range() const
318{
Marshall Clow8fea1612016-08-25 15:09:01 +0000319 _VSTD::__throw_out_of_range("vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320}
321
Eric Fiselier1b57fa82016-09-15 22:27:07 +0000322_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __vector_base_common<true>)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000323
324template <class _Tp, class _Allocator>
325class __vector_base
326 : protected __vector_base_common<true>
327{
Marshall Clowf0ca1492018-05-21 21:30:12 +0000328public:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000329 typedef _Allocator allocator_type;
330 typedef allocator_traits<allocator_type> __alloc_traits;
Marshall Clowf0ca1492018-05-21 21:30:12 +0000331 typedef typename __alloc_traits::size_type size_type;
332protected:
333 typedef _Tp value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000334 typedef value_type& reference;
335 typedef const value_type& const_reference;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000336 typedef typename __alloc_traits::difference_type difference_type;
337 typedef typename __alloc_traits::pointer pointer;
338 typedef typename __alloc_traits::const_pointer const_pointer;
339 typedef pointer iterator;
340 typedef const_pointer const_iterator;
341
342 pointer __begin_;
343 pointer __end_;
344 __compressed_pair<pointer, allocator_type> __end_cap_;
345
Howard Hinnant1c936782011-06-03 19:40:40 +0000346 _LIBCPP_INLINE_VISIBILITY
347 allocator_type& __alloc() _NOEXCEPT
348 {return __end_cap_.second();}
349 _LIBCPP_INLINE_VISIBILITY
350 const allocator_type& __alloc() const _NOEXCEPT
351 {return __end_cap_.second();}
352 _LIBCPP_INLINE_VISIBILITY
353 pointer& __end_cap() _NOEXCEPT
354 {return __end_cap_.first();}
355 _LIBCPP_INLINE_VISIBILITY
356 const pointer& __end_cap() const _NOEXCEPT
357 {return __end_cap_.first();}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000358
Howard Hinnant1c936782011-06-03 19:40:40 +0000359 _LIBCPP_INLINE_VISIBILITY
360 __vector_base()
361 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnantcf823322010-12-17 14:46:43 +0000362 _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a);
Eric Fiselier4f1534c2018-06-05 22:32:52 +0000363#ifndef _LIBCPP_CXX03_LANG
364 _LIBCPP_INLINE_VISIBILITY __vector_base(allocator_type&& __a) _NOEXCEPT;
365#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000366 ~__vector_base();
367
Howard Hinnant1c936782011-06-03 19:40:40 +0000368 _LIBCPP_INLINE_VISIBILITY
369 void clear() _NOEXCEPT {__destruct_at_end(__begin_);}
370 _LIBCPP_INLINE_VISIBILITY
371 size_type capacity() const _NOEXCEPT
372 {return static_cast<size_type>(__end_cap() - __begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373
Howard Hinnant1c936782011-06-03 19:40:40 +0000374 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant76053d72013-06-27 19:35:32 +0000375 void __destruct_at_end(pointer __new_last) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000376
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000377 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378 void __copy_assign_alloc(const __vector_base& __c)
379 {__copy_assign_alloc(__c, integral_constant<bool,
380 __alloc_traits::propagate_on_container_copy_assignment::value>());}
381
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000382 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000383 void __move_assign_alloc(__vector_base& __c)
Howard Hinnant1c936782011-06-03 19:40:40 +0000384 _NOEXCEPT_(
385 !__alloc_traits::propagate_on_container_move_assignment::value ||
386 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000387 {__move_assign_alloc(__c, integral_constant<bool,
388 __alloc_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000389private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000390 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391 void __copy_assign_alloc(const __vector_base& __c, true_type)
392 {
393 if (__alloc() != __c.__alloc())
394 {
395 clear();
396 __alloc_traits::deallocate(__alloc(), __begin_, capacity());
397 __begin_ = __end_ = __end_cap() = nullptr;
398 }
399 __alloc() = __c.__alloc();
400 }
401
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000402 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +0000403 void __copy_assign_alloc(const __vector_base&, false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404 {}
405
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000406 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc2734962011-09-02 20:42:31 +0000407 void __move_assign_alloc(__vector_base& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +0000408 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000409 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000410 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411 }
412
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000413 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +0000414 void __move_assign_alloc(__vector_base&, false_type)
Howard Hinnant1c936782011-06-03 19:40:40 +0000415 _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000416 {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000417};
418
419template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000420inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000421void
Howard Hinnant76053d72013-06-27 19:35:32 +0000422__vector_base<_Tp, _Allocator>::__destruct_at_end(pointer __new_last) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423{
Bruce Mitchener405fdcd2017-03-23 14:39:23 +0000424 pointer __soon_to_be_end = __end_;
425 while (__new_last != __soon_to_be_end)
426 __alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(--__soon_to_be_end));
427 __end_ = __new_last;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000428}
429
430template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000431inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432__vector_base<_Tp, _Allocator>::__vector_base()
Howard Hinnant1c936782011-06-03 19:40:40 +0000433 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant76053d72013-06-27 19:35:32 +0000434 : __begin_(nullptr),
435 __end_(nullptr),
436 __end_cap_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000437{
438}
439
440template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000441inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000442__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +0000443 : __begin_(nullptr),
444 __end_(nullptr),
445 __end_cap_(nullptr, __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000446{
447}
448
Eric Fiselier4f1534c2018-06-05 22:32:52 +0000449#ifndef _LIBCPP_CXX03_LANG
450template <class _Tp, class _Allocator>
451inline _LIBCPP_INLINE_VISIBILITY
452__vector_base<_Tp, _Allocator>::__vector_base(allocator_type&& __a) _NOEXCEPT
453 : __begin_(nullptr),
454 __end_(nullptr),
455 __end_cap_(nullptr, std::move(__a)) {}
456#endif
457
Howard Hinnantc51e1022010-05-11 19:42:16 +0000458template <class _Tp, class _Allocator>
459__vector_base<_Tp, _Allocator>::~__vector_base()
460{
Howard Hinnant76053d72013-06-27 19:35:32 +0000461 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000462 {
463 clear();
464 __alloc_traits::deallocate(__alloc(), __begin_, capacity());
465 }
466}
467
Eric Fiselier876c6862016-02-20 00:19:45 +0000468template <class _Tp, class _Allocator /* = allocator<_Tp> */>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000469class _LIBCPP_TEMPLATE_VIS vector
Howard Hinnantc51e1022010-05-11 19:42:16 +0000470 : private __vector_base<_Tp, _Allocator>
471{
472private:
473 typedef __vector_base<_Tp, _Allocator> __base;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000474 typedef allocator<_Tp> __default_allocator_type;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000475public:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000476 typedef vector __self;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000477 typedef _Tp value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000478 typedef _Allocator allocator_type;
479 typedef typename __base::__alloc_traits __alloc_traits;
480 typedef typename __base::reference reference;
481 typedef typename __base::const_reference const_reference;
482 typedef typename __base::size_type size_type;
483 typedef typename __base::difference_type difference_type;
484 typedef typename __base::pointer pointer;
485 typedef typename __base::const_pointer const_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000486 typedef __wrap_iter<pointer> iterator;
487 typedef __wrap_iter<const_pointer> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000488 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
489 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000490
Howard Hinnanta416ff02013-03-26 19:04:56 +0000491 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
492 "Allocator::value_type must be same type as value_type");
493
Howard Hinnant1c936782011-06-03 19:40:40 +0000494 _LIBCPP_INLINE_VISIBILITY
Marshall Clowe546cbb2015-06-04 02:05:41 +0000495 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant27e0e772011-09-14 18:33:51 +0000496 {
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000497#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000498 __get_db()->__insert_c(this);
499#endif
500 }
501 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
Marshall Clow8f282f42015-06-04 00:10:20 +0000502#if _LIBCPP_STD_VER <= 14
503 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
504#else
505 _NOEXCEPT
506#endif
Howard Hinnant27e0e772011-09-14 18:33:51 +0000507 : __base(__a)
508 {
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000509#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000510 __get_db()->__insert_c(this);
511#endif
512 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000513 explicit vector(size_type __n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +0000514#if _LIBCPP_STD_VER > 11
515 explicit vector(size_type __n, const allocator_type& __a);
516#endif
Marshall Clowf0ca1492018-05-21 21:30:12 +0000517 vector(size_type __n, const value_type& __x);
518 vector(size_type __n, const value_type& __x, const allocator_type& __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000519 template <class _InputIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +0000520 vector(_InputIterator __first,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000521 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000522 !__is_forward_iterator<_InputIterator>::value &&
523 is_constructible<
524 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +0000525 typename iterator_traits<_InputIterator>::reference>::value,
526 _InputIterator>::type __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000527 template <class _InputIterator>
528 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
529 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000530 !__is_forward_iterator<_InputIterator>::value &&
531 is_constructible<
532 value_type,
533 typename iterator_traits<_InputIterator>::reference>::value>::type* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534 template <class _ForwardIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +0000535 vector(_ForwardIterator __first,
Howard Hinnant88010252013-03-28 17:44:32 +0000536 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
537 is_constructible<
538 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +0000539 typename iterator_traits<_ForwardIterator>::reference>::value,
540 _ForwardIterator>::type __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000541 template <class _ForwardIterator>
542 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant88010252013-03-28 17:44:32 +0000543 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
544 is_constructible<
545 value_type,
546 typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000547
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000548 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant27e0e772011-09-14 18:33:51 +0000549 ~vector()
550 {
Marshall Clow68af4f32018-09-07 15:47:59 +0000551 __annotate_delete();
552#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000553 __get_db()->__erase_c(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000554#endif
Marshall Clow68af4f32018-09-07 15:47:59 +0000555 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000556
557 vector(const vector& __x);
558 vector(const vector& __x, const allocator_type& __a);
Howard Hinnantcf823322010-12-17 14:46:43 +0000559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000560 vector& operator=(const vector& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000561
562#ifndef _LIBCPP_CXX03_LANG
563 _LIBCPP_INLINE_VISIBILITY
564 vector(initializer_list<value_type> __il);
565
566 _LIBCPP_INLINE_VISIBILITY
567 vector(initializer_list<value_type> __il, const allocator_type& __a);
568
Howard Hinnantcf823322010-12-17 14:46:43 +0000569 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000570 vector(vector&& __x)
Marshall Clowe5108202015-07-14 14:46:32 +0000571#if _LIBCPP_STD_VER > 14
572 _NOEXCEPT;
573#else
Howard Hinnant1c936782011-06-03 19:40:40 +0000574 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clowe5108202015-07-14 14:46:32 +0000575#endif
Eric Fiseliered9e9362017-04-16 02:40:45 +0000576
Howard Hinnantcf823322010-12-17 14:46:43 +0000577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000578 vector(vector&& __x, const allocator_type& __a);
Howard Hinnantcf823322010-12-17 14:46:43 +0000579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000580 vector& operator=(vector&& __x)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +0000581 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Eric Fiseliered9e9362017-04-16 02:40:45 +0000582
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000583 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000584 vector& operator=(initializer_list<value_type> __il)
585 {assign(__il.begin(), __il.end()); return *this;}
Eric Fiseliered9e9362017-04-16 02:40:45 +0000586
587#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000588
589 template <class _InputIterator>
590 typename enable_if
591 <
592 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000593 !__is_forward_iterator<_InputIterator>::value &&
594 is_constructible<
595 value_type,
596 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000597 void
598 >::type
599 assign(_InputIterator __first, _InputIterator __last);
600 template <class _ForwardIterator>
601 typename enable_if
602 <
Howard Hinnant88010252013-03-28 17:44:32 +0000603 __is_forward_iterator<_ForwardIterator>::value &&
604 is_constructible<
605 value_type,
606 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000607 void
608 >::type
609 assign(_ForwardIterator __first, _ForwardIterator __last);
610
611 void assign(size_type __n, const_reference __u);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000612
613#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000614 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000615 void assign(initializer_list<value_type> __il)
616 {assign(__il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +0000617#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000618
Howard Hinnant1c936782011-06-03 19:40:40 +0000619 _LIBCPP_INLINE_VISIBILITY
620 allocator_type get_allocator() const _NOEXCEPT
621 {return this->__alloc();}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622
Howard Hinnant1c936782011-06-03 19:40:40 +0000623 _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT;
624 _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT;
625 _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT;
626 _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000627
Howard Hinnant1c936782011-06-03 19:40:40 +0000628 _LIBCPP_INLINE_VISIBILITY
629 reverse_iterator rbegin() _NOEXCEPT
630 {return reverse_iterator(end());}
631 _LIBCPP_INLINE_VISIBILITY
632 const_reverse_iterator rbegin() const _NOEXCEPT
633 {return const_reverse_iterator(end());}
634 _LIBCPP_INLINE_VISIBILITY
635 reverse_iterator rend() _NOEXCEPT
636 {return reverse_iterator(begin());}
637 _LIBCPP_INLINE_VISIBILITY
638 const_reverse_iterator rend() const _NOEXCEPT
639 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000640
Howard Hinnant1c936782011-06-03 19:40:40 +0000641 _LIBCPP_INLINE_VISIBILITY
642 const_iterator cbegin() const _NOEXCEPT
643 {return begin();}
644 _LIBCPP_INLINE_VISIBILITY
645 const_iterator cend() const _NOEXCEPT
646 {return end();}
647 _LIBCPP_INLINE_VISIBILITY
648 const_reverse_iterator crbegin() const _NOEXCEPT
649 {return rbegin();}
650 _LIBCPP_INLINE_VISIBILITY
651 const_reverse_iterator crend() const _NOEXCEPT
652 {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000653
Howard Hinnant1c936782011-06-03 19:40:40 +0000654 _LIBCPP_INLINE_VISIBILITY
655 size_type size() const _NOEXCEPT
656 {return static_cast<size_type>(this->__end_ - this->__begin_);}
657 _LIBCPP_INLINE_VISIBILITY
658 size_type capacity() const _NOEXCEPT
659 {return __base::capacity();}
Marshall Clow425f5752017-11-15 05:51:26 +0000660 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000661 bool empty() const _NOEXCEPT
662 {return this->__begin_ == this->__end_;}
663 size_type max_size() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000664 void reserve(size_type __n);
Howard Hinnant1c936782011-06-03 19:40:40 +0000665 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000666
Marshall Clowd6470492019-03-15 00:29:35 +0000667 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) _NOEXCEPT;
668 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000669 reference at(size_type __n);
670 const_reference at(size_type __n) const;
671
Marshall Clowd6470492019-03-15 00:29:35 +0000672 _LIBCPP_INLINE_VISIBILITY reference front() _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000673 {
674 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
675 return *this->__begin_;
676 }
Marshall Clowd6470492019-03-15 00:29:35 +0000677 _LIBCPP_INLINE_VISIBILITY const_reference front() const _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000678 {
679 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
680 return *this->__begin_;
681 }
Marshall Clowd6470492019-03-15 00:29:35 +0000682 _LIBCPP_INLINE_VISIBILITY reference back() _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000683 {
684 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
685 return *(this->__end_ - 1);
686 }
Marshall Clowd6470492019-03-15 00:29:35 +0000687 _LIBCPP_INLINE_VISIBILITY const_reference back() const _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000688 {
689 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
690 return *(this->__end_ - 1);
691 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000692
Howard Hinnant1c936782011-06-03 19:40:40 +0000693 _LIBCPP_INLINE_VISIBILITY
694 value_type* data() _NOEXCEPT
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000695 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnant1c936782011-06-03 19:40:40 +0000696 _LIBCPP_INLINE_VISIBILITY
697 const value_type* data() const _NOEXCEPT
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000698 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000699
Eric Fiselier96919722017-10-17 13:03:17 +0000700#ifdef _LIBCPP_CXX03_LANG
701 _LIBCPP_INLINE_VISIBILITY
702 void __emplace_back(const value_type& __x) { push_back(__x); }
703#else
704 template <class _Arg>
705 _LIBCPP_INLINE_VISIBILITY
706 void __emplace_back(_Arg&& __arg) {
707 emplace_back(_VSTD::forward<_Arg>(__arg));
708 }
709#endif
710
Howard Hinnantcf823322010-12-17 14:46:43 +0000711 _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000712
713#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd2cab2f2012-02-15 00:41:34 +0000714 _LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000715
Howard Hinnantc51e1022010-05-11 19:42:16 +0000716 template <class... _Args>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000717 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000718#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000719 reference emplace_back(_Args&&... __args);
Marshall Clowea52cc42017-01-24 23:09:12 +0000720#else
721 void emplace_back(_Args&&... __args);
722#endif
Eric Fiseliered9e9362017-04-16 02:40:45 +0000723#endif // !_LIBCPP_CXX03_LANG
724
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000725 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000726 void pop_back();
727
728 iterator insert(const_iterator __position, const_reference __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000729
730#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000731 iterator insert(const_iterator __position, value_type&& __x);
732 template <class... _Args>
733 iterator emplace(const_iterator __position, _Args&&... __args);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000734#endif // !_LIBCPP_CXX03_LANG
735
Howard Hinnantc51e1022010-05-11 19:42:16 +0000736 iterator insert(const_iterator __position, size_type __n, const_reference __x);
737 template <class _InputIterator>
738 typename enable_if
739 <
740 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000741 !__is_forward_iterator<_InputIterator>::value &&
742 is_constructible<
743 value_type,
744 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000745 iterator
746 >::type
747 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
748 template <class _ForwardIterator>
749 typename enable_if
750 <
Howard Hinnant88010252013-03-28 17:44:32 +0000751 __is_forward_iterator<_ForwardIterator>::value &&
752 is_constructible<
753 value_type,
754 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000755 iterator
756 >::type
757 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000758
759#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000760 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000761 iterator insert(const_iterator __position, initializer_list<value_type> __il)
762 {return insert(__position, __il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +0000763#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000764
Howard Hinnantcf823322010-12-17 14:46:43 +0000765 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000766 iterator erase(const_iterator __first, const_iterator __last);
767
Howard Hinnant1c936782011-06-03 19:40:40 +0000768 _LIBCPP_INLINE_VISIBILITY
769 void clear() _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000770 {
Marshall Clow2cd9d372014-05-08 14:14:06 +0000771 size_type __old_size = size();
Howard Hinnant27e0e772011-09-14 18:33:51 +0000772 __base::clear();
Marshall Clow2cd9d372014-05-08 14:14:06 +0000773 __annotate_shrink(__old_size);
Howard Hinnant27e0e772011-09-14 18:33:51 +0000774 __invalidate_all_iterators();
775 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000776
777 void resize(size_type __sz);
778 void resize(size_type __sz, const_reference __x);
779
Howard Hinnant1c936782011-06-03 19:40:40 +0000780 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000781#if _LIBCPP_STD_VER >= 14
Eric Fiselier873b8d32019-03-18 21:50:12 +0000782 _NOEXCEPT;
Marshall Clow8982dcd2015-07-13 20:04:56 +0000783#else
Eric Fiselier873b8d32019-03-18 21:50:12 +0000784 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +0000785 __is_nothrow_swappable<allocator_type>::value);
786#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000787
788 bool __invariants() const;
789
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000790#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000791
792 bool __dereferenceable(const const_iterator* __i) const;
793 bool __decrementable(const const_iterator* __i) const;
794 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
795 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
796
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000797#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000798
Howard Hinnantc51e1022010-05-11 19:42:16 +0000799private:
Howard Hinnantcf823322010-12-17 14:46:43 +0000800 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Eric Fiselier69c51982016-12-28 06:06:09 +0000801 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(pointer __new_last);
Marshall Clow3ff48e02018-05-22 16:20:28 +0000802 void __vallocate(size_type __n);
803 void __vdeallocate() _NOEXCEPT;
Howard Hinnantcf823322010-12-17 14:46:43 +0000804 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
Howard Hinnanta5589382011-01-04 19:53:31 +0000805 void __construct_at_end(size_type __n);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000806 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000807 void __construct_at_end(size_type __n, const_reference __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000808 template <class _ForwardIterator>
809 typename enable_if
810 <
811 __is_forward_iterator<_ForwardIterator>::value,
812 void
813 >::type
Eric Fiselieracfe6f02015-03-31 16:54:19 +0000814 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000815 void __append(size_type __n);
816 void __append(size_type __n, const_reference __x);
Howard Hinnantcf823322010-12-17 14:46:43 +0000817 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000818 iterator __make_iter(pointer __p) _NOEXCEPT;
Howard Hinnantcf823322010-12-17 14:46:43 +0000819 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000820 const_iterator __make_iter(const_pointer __p) const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000821 void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v);
822 pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p);
823 void __move_range(pointer __from_s, pointer __from_e, pointer __to);
Howard Hinnant1c936782011-06-03 19:40:40 +0000824 void __move_assign(vector& __c, true_type)
825 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Marshall Clow2fe8a8d2015-08-18 18:57:00 +0000826 void __move_assign(vector& __c, false_type)
827 _NOEXCEPT_(__alloc_traits::is_always_equal::value);
Howard Hinnant27e0e772011-09-14 18:33:51 +0000828 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant76053d72013-06-27 19:35:32 +0000829 void __destruct_at_end(pointer __new_last) _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000830 {
Eric Fiselier69c51982016-12-28 06:06:09 +0000831 __invalidate_iterators_past(__new_last);
Marshall Clow2cd9d372014-05-08 14:14:06 +0000832 size_type __old_size = size();
Howard Hinnant27e0e772011-09-14 18:33:51 +0000833 __base::__destruct_at_end(__new_last);
Marshall Clow2cd9d372014-05-08 14:14:06 +0000834 __annotate_shrink(__old_size);
Howard Hinnant27e0e772011-09-14 18:33:51 +0000835 }
Eric Fiseliered9e9362017-04-16 02:40:45 +0000836
837#ifndef _LIBCPP_CXX03_LANG
Eric Fiselier7110f442019-03-19 19:19:44 +0000838 template <class _Up>
839 _LIBCPP_INLINE_VISIBILITY
840 inline void __push_back_slow_path(_Up&& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000841
Howard Hinnantb6c49562012-02-26 15:30:12 +0000842 template <class... _Args>
Eric Fiselier7110f442019-03-19 19:19:44 +0000843 _LIBCPP_INLINE_VISIBILITY
844 inline void __emplace_back_slow_path(_Args&&... __args);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000845#else
Eric Fiselier7110f442019-03-19 19:19:44 +0000846 template <class _Up>
847 _LIBCPP_INLINE_VISIBILITY
848 inline void __push_back_slow_path(_Up& __x);
Howard Hinnantb6c49562012-02-26 15:30:12 +0000849#endif
Eric Fiseliered9e9362017-04-16 02:40:45 +0000850
Marshall Clow2cd9d372014-05-08 14:14:06 +0000851 // The following functions are no-ops outside of AddressSanitizer mode.
852 // We call annotatations only for the default Allocator because other allocators
853 // may not meet the AddressSanitizer alignment constraints.
854 // See the documentation for __sanitizer_annotate_contiguous_container for more details.
Marshall Clow2cd9d372014-05-08 14:14:06 +0000855#ifndef _LIBCPP_HAS_NO_ASAN
Eric Fiselier6003c772016-12-23 23:37:52 +0000856 void __annotate_contiguous_container(const void *__beg, const void *__end,
857 const void *__old_mid,
858 const void *__new_mid) const
859 {
860
Marshall Clow2cd9d372014-05-08 14:14:06 +0000861 if (__beg && is_same<allocator_type, __default_allocator_type>::value)
862 __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid);
Marshall Clow2cd9d372014-05-08 14:14:06 +0000863 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000864#else
865 _LIBCPP_INLINE_VISIBILITY
866 void __annotate_contiguous_container(const void*, const void*, const void*,
Eric Fiseliere7afbd32019-07-28 04:37:02 +0000867 const void*) const _NOEXCEPT {}
Eric Fiselier6003c772016-12-23 23:37:52 +0000868#endif
869 _LIBCPP_INLINE_VISIBILITY
Eric Fiseliere7afbd32019-07-28 04:37:02 +0000870 void __annotate_new(size_type __current_size) const _NOEXCEPT {
Marshall Clow2cd9d372014-05-08 14:14:06 +0000871 __annotate_contiguous_container(data(), data() + capacity(),
872 data() + capacity(), data() + __current_size);
873 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000874
875 _LIBCPP_INLINE_VISIBILITY
Eric Fiseliere7afbd32019-07-28 04:37:02 +0000876 void __annotate_delete() const _NOEXCEPT {
Marshall Clow2cd9d372014-05-08 14:14:06 +0000877 __annotate_contiguous_container(data(), data() + capacity(),
878 data() + size(), data() + capacity());
879 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000880
881 _LIBCPP_INLINE_VISIBILITY
Eric Fiseliere7afbd32019-07-28 04:37:02 +0000882 void __annotate_increase(size_type __n) const _NOEXCEPT
Marshall Clow2cd9d372014-05-08 14:14:06 +0000883 {
884 __annotate_contiguous_container(data(), data() + capacity(),
885 data() + size(), data() + size() + __n);
886 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000887
888 _LIBCPP_INLINE_VISIBILITY
Eric Fiseliere7afbd32019-07-28 04:37:02 +0000889 void __annotate_shrink(size_type __old_size) const _NOEXCEPT
Marshall Clow2cd9d372014-05-08 14:14:06 +0000890 {
891 __annotate_contiguous_container(data(), data() + capacity(),
892 data() + __old_size, data() + size());
893 }
Marshall Clowc78ffa52014-09-03 21:37:43 +0000894
Eric Fiseliere7afbd32019-07-28 04:37:02 +0000895 struct _ConstructTransaction {
896 explicit _ConstructTransaction(vector &__v, size_type __n)
897 : __v_(__v), __pos_(__v.__end_), __new_end_(__v.__end_ + __n) {
898#ifndef _LIBCPP_HAS_NO_ASAN
899 __v_.__annotate_increase(__n);
900#endif
901 }
902 ~_ConstructTransaction() {
903 __v_.__end_ = __pos_;
904#ifndef _LIBCPP_HAS_NO_ASAN
905 if (__pos_ != __new_end_) {
906 __v_.__annotate_shrink(__new_end_ - __v_.__begin_);
907 }
908#endif
909 }
910
911 vector &__v_;
912 pointer __pos_;
913 const_pointer const __new_end_;
914
915 private:
916 _ConstructTransaction(_ConstructTransaction const&) = delete;
917 _ConstructTransaction& operator=(_ConstructTransaction const&) = delete;
918 };
919
920 template <class ..._Args>
921 _LIBCPP_INLINE_VISIBILITY
922 void __construct_one_at_end(_Args&& ...__args) {
923 _ConstructTransaction __tx(*this, 1);
924 __alloc_traits::construct(this->__alloc(), _VSTD::__to_raw_pointer(__tx.__pos_),
925 _VSTD::forward<_Args>(__args)...);
926 ++__tx.__pos_;
927 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000928};
929
Marshall Clowf0ca1492018-05-21 21:30:12 +0000930#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
931template<class _InputIterator,
932 class _Alloc = typename std::allocator<typename iterator_traits<_InputIterator>::value_type>,
933 class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
934 >
935vector(_InputIterator, _InputIterator)
936 -> vector<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
937
938template<class _InputIterator,
939 class _Alloc,
940 class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
941 >
942vector(_InputIterator, _InputIterator, _Alloc)
943 -> vector<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
944#endif
945
Howard Hinnantc51e1022010-05-11 19:42:16 +0000946template <class _Tp, class _Allocator>
947void
948vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)
949{
Marshall Clow2cd9d372014-05-08 14:14:06 +0000950 __annotate_delete();
Howard Hinnantd2cab2f2012-02-15 00:41:34 +0000951 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000952 _VSTD::swap(this->__begin_, __v.__begin_);
953 _VSTD::swap(this->__end_, __v.__end_);
954 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000955 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000956 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000957 __invalidate_all_iterators();
958}
959
960template <class _Tp, class _Allocator>
961typename vector<_Tp, _Allocator>::pointer
962vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
963{
Marshall Clow2cd9d372014-05-08 14:14:06 +0000964 __annotate_delete();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000965 pointer __r = __v.__begin_;
Howard Hinnantd2cab2f2012-02-15 00:41:34 +0000966 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, __p, __v.__begin_);
967 __alloc_traits::__construct_forward(this->__alloc(), __p, this->__end_, __v.__end_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000968 _VSTD::swap(this->__begin_, __v.__begin_);
969 _VSTD::swap(this->__end_, __v.__end_);
970 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000971 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000972 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000973 __invalidate_all_iterators();
974 return __r;
975}
976
977// Allocate space for __n objects
978// throws length_error if __n > max_size()
979// throws (probably bad_alloc) if memory run out
980// Precondition: __begin_ == __end_ == __end_cap() == 0
981// Precondition: __n > 0
982// Postcondition: capacity() == __n
983// Postcondition: size() == 0
984template <class _Tp, class _Allocator>
985void
Marshall Clow3ff48e02018-05-22 16:20:28 +0000986vector<_Tp, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000987{
988 if (__n > max_size())
989 this->__throw_length_error();
990 this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
991 this->__end_cap() = this->__begin_ + __n;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000992 __annotate_new(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000993}
994
995template <class _Tp, class _Allocator>
996void
Marshall Clow3ff48e02018-05-22 16:20:28 +0000997vector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000998{
Howard Hinnant76053d72013-06-27 19:35:32 +0000999 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001000 {
1001 clear();
1002 __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
Howard Hinnant76053d72013-06-27 19:35:32 +00001003 this->__begin_ = this->__end_ = this->__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001004 }
1005}
1006
1007template <class _Tp, class _Allocator>
1008typename vector<_Tp, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +00001009vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001010{
Eric Fiselierb5d9f442016-11-23 01:18:56 +00001011 return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()),
1012 numeric_limits<difference_type>::max());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001013}
1014
1015// Precondition: __new_size > capacity()
1016template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001017inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001018typename vector<_Tp, _Allocator>::size_type
1019vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
1020{
1021 const size_type __ms = max_size();
1022 if (__new_size > __ms)
1023 this->__throw_length_error();
1024 const size_type __cap = capacity();
1025 if (__cap >= __ms / 2)
1026 return __ms;
Alexis Hunt991d29b2011-07-29 23:31:58 +00001027 return _VSTD::max<size_type>(2*__cap, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001028}
1029
1030// Default constructs __n objects starting at __end_
1031// throws if construction throws
1032// Precondition: __n > 0
1033// Precondition: size() + __n <= capacity()
1034// Postcondition: size() == size() + __n
1035template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001036void
1037vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
1038{
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001039 _ConstructTransaction __tx(*this, __n);
1040 for (; __tx.__pos_ != __tx.__new_end_; ++__tx.__pos_) {
1041 __alloc_traits::construct(this->__alloc(), _VSTD::__to_raw_pointer(__tx.__pos_));
1042 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001043}
1044
Howard Hinnantc51e1022010-05-11 19:42:16 +00001045// Copy constructs __n objects starting at __end_ from __x
1046// throws if construction throws
1047// Precondition: __n > 0
1048// Precondition: size() + __n <= capacity()
1049// Postcondition: size() == old size() + __n
1050// Postcondition: [i] == __x for all i in [size() - __n, __n)
1051template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001052inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001053void
1054vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
1055{
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001056 _ConstructTransaction __tx(*this, __n);
1057 for (; __tx.__pos_ != __tx.__new_end_; ++__tx.__pos_) {
1058 __alloc_traits::construct(this->__alloc(), _VSTD::__to_raw_pointer(__tx.__pos_), __x);
1059 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001060}
1061
1062template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001063template <class _ForwardIterator>
1064typename enable_if
1065<
1066 __is_forward_iterator<_ForwardIterator>::value,
1067 void
1068>::type
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001069vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001070{
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001071 _ConstructTransaction __tx(*this, __n);
1072 __alloc_traits::__construct_range_forward(this->__alloc(), __first, __last, __tx.__pos_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001073}
1074
1075// Default constructs __n objects starting at __end_
1076// throws if construction throws
1077// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001078// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001079template <class _Tp, class _Allocator>
1080void
1081vector<_Tp, _Allocator>::__append(size_type __n)
1082{
1083 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1084 this->__construct_at_end(__n);
1085 else
1086 {
1087 allocator_type& __a = this->__alloc();
1088 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1089 __v.__construct_at_end(__n);
1090 __swap_out_circular_buffer(__v);
1091 }
1092}
1093
1094// Default constructs __n objects starting at __end_
1095// throws if construction throws
1096// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001097// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001098template <class _Tp, class _Allocator>
1099void
1100vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
1101{
1102 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1103 this->__construct_at_end(__n, __x);
1104 else
1105 {
1106 allocator_type& __a = this->__alloc();
1107 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1108 __v.__construct_at_end(__n, __x);
1109 __swap_out_circular_buffer(__v);
1110 }
1111}
1112
1113template <class _Tp, class _Allocator>
1114vector<_Tp, _Allocator>::vector(size_type __n)
1115{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001116#if _LIBCPP_DEBUG_LEVEL >= 2
1117 __get_db()->__insert_c(this);
1118#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001119 if (__n > 0)
1120 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001121 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001122 __construct_at_end(__n);
1123 }
1124}
1125
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001126#if _LIBCPP_STD_VER > 11
1127template <class _Tp, class _Allocator>
1128vector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a)
1129 : __base(__a)
1130{
1131#if _LIBCPP_DEBUG_LEVEL >= 2
1132 __get_db()->__insert_c(this);
1133#endif
1134 if (__n > 0)
1135 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001136 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001137 __construct_at_end(__n);
1138 }
1139}
1140#endif
1141
Howard Hinnantc51e1022010-05-11 19:42:16 +00001142template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001143vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001144{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001145#if _LIBCPP_DEBUG_LEVEL >= 2
1146 __get_db()->__insert_c(this);
1147#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001148 if (__n > 0)
1149 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001150 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001151 __construct_at_end(__n, __x);
1152 }
1153}
1154
1155template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001156vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001157 : __base(__a)
1158{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001159#if _LIBCPP_DEBUG_LEVEL >= 2
1160 __get_db()->__insert_c(this);
1161#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001162 if (__n > 0)
1163 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001164 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001165 __construct_at_end(__n, __x);
1166 }
1167}
1168
1169template <class _Tp, class _Allocator>
1170template <class _InputIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001171vector<_Tp, _Allocator>::vector(_InputIterator __first,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001172 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001173 !__is_forward_iterator<_InputIterator>::value &&
1174 is_constructible<
1175 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001176 typename iterator_traits<_InputIterator>::reference>::value,
1177 _InputIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001178{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001179#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001180 __get_db()->__insert_c(this);
1181#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001182 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001183 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001184}
1185
1186template <class _Tp, class _Allocator>
1187template <class _InputIterator>
1188vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
1189 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001190 !__is_forward_iterator<_InputIterator>::value &&
1191 is_constructible<
1192 value_type,
1193 typename iterator_traits<_InputIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001194 : __base(__a)
1195{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001196#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001197 __get_db()->__insert_c(this);
1198#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001199 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001200 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001201}
1202
1203template <class _Tp, class _Allocator>
1204template <class _ForwardIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001205vector<_Tp, _Allocator>::vector(_ForwardIterator __first,
Howard Hinnant88010252013-03-28 17:44:32 +00001206 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1207 is_constructible<
1208 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001209 typename iterator_traits<_ForwardIterator>::reference>::value,
1210 _ForwardIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001211{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001212#if _LIBCPP_DEBUG_LEVEL >= 2
1213 __get_db()->__insert_c(this);
1214#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001215 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001216 if (__n > 0)
1217 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001218 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001219 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001220 }
1221}
1222
1223template <class _Tp, class _Allocator>
1224template <class _ForwardIterator>
1225vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant88010252013-03-28 17:44:32 +00001226 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1227 is_constructible<
1228 value_type,
1229 typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001230 : __base(__a)
1231{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001232#if _LIBCPP_DEBUG_LEVEL >= 2
1233 __get_db()->__insert_c(this);
1234#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001235 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001236 if (__n > 0)
1237 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001238 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001239 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001240 }
1241}
1242
1243template <class _Tp, class _Allocator>
1244vector<_Tp, _Allocator>::vector(const vector& __x)
1245 : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
1246{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001247#if _LIBCPP_DEBUG_LEVEL >= 2
1248 __get_db()->__insert_c(this);
1249#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001250 size_type __n = __x.size();
1251 if (__n > 0)
1252 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001253 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001254 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001255 }
1256}
1257
1258template <class _Tp, class _Allocator>
1259vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a)
1260 : __base(__a)
1261{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001262#if _LIBCPP_DEBUG_LEVEL >= 2
1263 __get_db()->__insert_c(this);
1264#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001265 size_type __n = __x.size();
1266 if (__n > 0)
1267 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001268 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001269 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001270 }
1271}
1272
Eric Fiseliered9e9362017-04-16 02:40:45 +00001273#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001274
1275template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001276inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001277vector<_Tp, _Allocator>::vector(vector&& __x)
Marshall Clowe5108202015-07-14 14:46:32 +00001278#if _LIBCPP_STD_VER > 14
1279 _NOEXCEPT
1280#else
Howard Hinnant1c936782011-06-03 19:40:40 +00001281 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00001282#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001283 : __base(_VSTD::move(__x.__alloc()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001284{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001285#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001286 __get_db()->__insert_c(this);
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001287 __get_db()->swap(this, &__x);
Howard Hinnant27e0e772011-09-14 18:33:51 +00001288#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001289 this->__begin_ = __x.__begin_;
1290 this->__end_ = __x.__end_;
1291 this->__end_cap() = __x.__end_cap();
Howard Hinnant76053d72013-06-27 19:35:32 +00001292 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001293}
1294
1295template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001296inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001297vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a)
1298 : __base(__a)
1299{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001300#if _LIBCPP_DEBUG_LEVEL >= 2
1301 __get_db()->__insert_c(this);
1302#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001303 if (__a == __x.__alloc())
1304 {
1305 this->__begin_ = __x.__begin_;
1306 this->__end_ = __x.__end_;
1307 this->__end_cap() = __x.__end_cap();
1308 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001309#if _LIBCPP_DEBUG_LEVEL >= 2
1310 __get_db()->swap(this, &__x);
1311#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001312 }
1313 else
1314 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001315 typedef move_iterator<iterator> _Ip;
1316 assign(_Ip(__x.begin()), _Ip(__x.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001317 }
1318}
1319
1320template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001321inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001322vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
1323{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001324#if _LIBCPP_DEBUG_LEVEL >= 2
1325 __get_db()->__insert_c(this);
1326#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001327 if (__il.size() > 0)
1328 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001329 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001330 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001331 }
1332}
1333
1334template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001335inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001336vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
1337 : __base(__a)
1338{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001339#if _LIBCPP_DEBUG_LEVEL >= 2
1340 __get_db()->__insert_c(this);
1341#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001342 if (__il.size() > 0)
1343 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001344 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001345 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001346 }
1347}
1348
1349template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001350inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001351vector<_Tp, _Allocator>&
1352vector<_Tp, _Allocator>::operator=(vector&& __x)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001353 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001354{
1355 __move_assign(__x, integral_constant<bool,
1356 __alloc_traits::propagate_on_container_move_assignment::value>());
1357 return *this;
1358}
1359
1360template <class _Tp, class _Allocator>
1361void
1362vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001363 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001364{
1365 if (__base::__alloc() != __c.__alloc())
1366 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001367 typedef move_iterator<iterator> _Ip;
1368 assign(_Ip(__c.begin()), _Ip(__c.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001369 }
1370 else
1371 __move_assign(__c, true_type());
1372}
1373
1374template <class _Tp, class _Allocator>
1375void
1376vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00001377 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001378{
Marshall Clow3ff48e02018-05-22 16:20:28 +00001379 __vdeallocate();
Marshall Clow136d45c2014-07-21 15:11:13 +00001380 __base::__move_assign_alloc(__c); // this can throw
Howard Hinnantc51e1022010-05-11 19:42:16 +00001381 this->__begin_ = __c.__begin_;
1382 this->__end_ = __c.__end_;
1383 this->__end_cap() = __c.__end_cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001384 __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001385#if _LIBCPP_DEBUG_LEVEL >= 2
1386 __get_db()->swap(this, &__c);
1387#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001388}
1389
Eric Fiseliered9e9362017-04-16 02:40:45 +00001390#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001391
1392template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001393inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001394vector<_Tp, _Allocator>&
1395vector<_Tp, _Allocator>::operator=(const vector& __x)
1396{
1397 if (this != &__x)
1398 {
1399 __base::__copy_assign_alloc(__x);
1400 assign(__x.__begin_, __x.__end_);
1401 }
1402 return *this;
1403}
1404
1405template <class _Tp, class _Allocator>
1406template <class _InputIterator>
1407typename enable_if
1408<
1409 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001410 !__is_forward_iterator<_InputIterator>::value &&
1411 is_constructible<
1412 _Tp,
1413 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001414 void
1415>::type
1416vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1417{
1418 clear();
1419 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001420 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001421}
1422
1423template <class _Tp, class _Allocator>
1424template <class _ForwardIterator>
1425typename enable_if
1426<
Howard Hinnant88010252013-03-28 17:44:32 +00001427 __is_forward_iterator<_ForwardIterator>::value &&
1428 is_constructible<
1429 _Tp,
1430 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001431 void
1432>::type
1433vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
1434{
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001435 size_type __new_size = static_cast<size_type>(_VSTD::distance(__first, __last));
1436 if (__new_size <= capacity())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001437 {
1438 _ForwardIterator __mid = __last;
1439 bool __growing = false;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001440 if (__new_size > size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001441 {
1442 __growing = true;
1443 __mid = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001444 _VSTD::advance(__mid, size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001445 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001446 pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001447 if (__growing)
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001448 __construct_at_end(__mid, __last, __new_size - size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001449 else
1450 this->__destruct_at_end(__m);
1451 }
1452 else
1453 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001454 __vdeallocate();
1455 __vallocate(__recommend(__new_size));
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001456 __construct_at_end(__first, __last, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001457 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001458 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001459}
1460
1461template <class _Tp, class _Allocator>
1462void
1463vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
1464{
1465 if (__n <= capacity())
1466 {
1467 size_type __s = size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001468 _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001469 if (__n > __s)
1470 __construct_at_end(__n - __s, __u);
1471 else
Howard Hinnant155c2af2010-05-24 17:49:41 +00001472 this->__destruct_at_end(this->__begin_ + __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001473 }
1474 else
1475 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001476 __vdeallocate();
1477 __vallocate(__recommend(static_cast<size_type>(__n)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001478 __construct_at_end(__n, __u);
1479 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001480 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001481}
1482
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001483template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001484inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001485typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001486vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001487{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001488#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001489 return iterator(this, __p);
1490#else
1491 return iterator(__p);
1492#endif
1493}
1494
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001495template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001496inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001497typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001498vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001499{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001500#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001501 return const_iterator(this, __p);
1502#else
1503 return const_iterator(__p);
1504#endif
1505}
1506
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001507template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001508inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001509typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001510vector<_Tp, _Allocator>::begin() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001511{
1512 return __make_iter(this->__begin_);
1513}
1514
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001515template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001516inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001517typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001518vector<_Tp, _Allocator>::begin() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001519{
1520 return __make_iter(this->__begin_);
1521}
1522
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001523template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001524inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001525typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001526vector<_Tp, _Allocator>::end() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001527{
1528 return __make_iter(this->__end_);
1529}
1530
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001531template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001532inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001533typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001534vector<_Tp, _Allocator>::end() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001535{
1536 return __make_iter(this->__end_);
1537}
1538
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001539template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001540inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001541typename vector<_Tp, _Allocator>::reference
Marshall Clowd6470492019-03-15 00:29:35 +00001542vector<_Tp, _Allocator>::operator[](size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001543{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001544 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001545 return this->__begin_[__n];
1546}
1547
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001548template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001549inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001550typename vector<_Tp, _Allocator>::const_reference
Marshall Clowd6470492019-03-15 00:29:35 +00001551vector<_Tp, _Allocator>::operator[](size_type __n) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001552{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001553 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001554 return this->__begin_[__n];
1555}
1556
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001557template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001558typename vector<_Tp, _Allocator>::reference
1559vector<_Tp, _Allocator>::at(size_type __n)
1560{
1561 if (__n >= size())
1562 this->__throw_out_of_range();
1563 return this->__begin_[__n];
1564}
1565
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001566template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001567typename vector<_Tp, _Allocator>::const_reference
1568vector<_Tp, _Allocator>::at(size_type __n) const
1569{
1570 if (__n >= size())
1571 this->__throw_out_of_range();
1572 return this->__begin_[__n];
1573}
1574
1575template <class _Tp, class _Allocator>
1576void
1577vector<_Tp, _Allocator>::reserve(size_type __n)
1578{
1579 if (__n > capacity())
1580 {
1581 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001582 __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001583 __swap_out_circular_buffer(__v);
1584 }
1585}
1586
1587template <class _Tp, class _Allocator>
1588void
Howard Hinnant1c936782011-06-03 19:40:40 +00001589vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001590{
1591 if (capacity() > size())
1592 {
1593#ifndef _LIBCPP_NO_EXCEPTIONS
1594 try
1595 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001596#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001597 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001598 __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001599 __swap_out_circular_buffer(__v);
1600#ifndef _LIBCPP_NO_EXCEPTIONS
1601 }
1602 catch (...)
1603 {
1604 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001605#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001606 }
1607}
1608
1609template <class _Tp, class _Allocator>
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001610template <class _Up>
1611void
Eric Fiseliered9e9362017-04-16 02:40:45 +00001612#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001613vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
1614#else
1615vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
1616#endif
1617{
1618 allocator_type& __a = this->__alloc();
1619 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1620 // __v.push_back(_VSTD::forward<_Up>(__x));
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001621 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Up>(__x));
1622 __v.__end_++;
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001623 __swap_out_circular_buffer(__v);
1624}
1625
1626template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001627inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001628void
1629vector<_Tp, _Allocator>::push_back(const_reference __x)
1630{
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001631 if (this->__end_ != this->__end_cap())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001632 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001633 __construct_one_at_end(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001634 }
1635 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001636 __push_back_slow_path(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001637}
1638
Eric Fiseliered9e9362017-04-16 02:40:45 +00001639#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001640
1641template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001642inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001643void
1644vector<_Tp, _Allocator>::push_back(value_type&& __x)
1645{
1646 if (this->__end_ < this->__end_cap())
1647 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001648 __construct_one_at_end(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001649 }
1650 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001651 __push_back_slow_path(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001652}
1653
1654template <class _Tp, class _Allocator>
1655template <class... _Args>
1656void
Howard Hinnantb6c49562012-02-26 15:30:12 +00001657vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1658{
1659 allocator_type& __a = this->__alloc();
1660 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1661// __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001662 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Args>(__args)...);
1663 __v.__end_++;
Howard Hinnantb6c49562012-02-26 15:30:12 +00001664 __swap_out_circular_buffer(__v);
1665}
1666
1667template <class _Tp, class _Allocator>
1668template <class... _Args>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001669inline
Marshall Clowea52cc42017-01-24 23:09:12 +00001670#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001671typename vector<_Tp, _Allocator>::reference
Marshall Clowea52cc42017-01-24 23:09:12 +00001672#else
1673void
1674#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001675vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1676{
1677 if (this->__end_ < this->__end_cap())
1678 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001679 __construct_one_at_end(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001680 }
1681 else
Howard Hinnantb6c49562012-02-26 15:30:12 +00001682 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
Marshall Clowea52cc42017-01-24 23:09:12 +00001683#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001684 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00001685#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001686}
1687
Eric Fiseliered9e9362017-04-16 02:40:45 +00001688#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001689
1690template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001691inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001692void
1693vector<_Tp, _Allocator>::pop_back()
1694{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001695 _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001696 this->__destruct_at_end(this->__end_ - 1);
1697}
1698
1699template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001700inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001701typename vector<_Tp, _Allocator>::iterator
1702vector<_Tp, _Allocator>::erase(const_iterator __position)
1703{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001704#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001705 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1706 "vector::erase(iterator) called with an iterator not"
1707 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001708#endif
Howard Hinnant58d52d52013-03-25 22:12:26 +00001709 _LIBCPP_ASSERT(__position != end(),
1710 "vector::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnant76053d72013-06-27 19:35:32 +00001711 difference_type __ps = __position - cbegin();
1712 pointer __p = this->__begin_ + __ps;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001713 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001714 this->__invalidate_iterators_past(__p-1);
1715 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001716 return __r;
1717}
1718
1719template <class _Tp, class _Allocator>
1720typename vector<_Tp, _Allocator>::iterator
1721vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1722{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001723#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001724 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
1725 "vector::erase(iterator, iterator) called with an iterator not"
1726 " referring to this vector");
Eric Fiselier69c51982016-12-28 06:06:09 +00001727 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this,
1728 "vector::erase(iterator, iterator) called with an iterator not"
1729 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001730#endif
Howard Hinnant27e0e772011-09-14 18:33:51 +00001731 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001732 pointer __p = this->__begin_ + (__first - begin());
Eric Fiselier69c51982016-12-28 06:06:09 +00001733 if (__first != __last) {
Howard Hinnantc580cc32013-04-18 15:02:57 +00001734 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001735 this->__invalidate_iterators_past(__p - 1);
1736 }
1737 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001738 return __r;
1739}
1740
1741template <class _Tp, class _Allocator>
1742void
1743vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1744{
1745 pointer __old_last = this->__end_;
1746 difference_type __n = __old_last - __to;
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001747 {
1748 pointer __i = __from_s + __n;
1749 _ConstructTransaction __tx(*this, __from_e - __i);
1750 for (; __i < __from_e; ++__i, ++__tx.__pos_) {
1751 __alloc_traits::construct(this->__alloc(),
1752 _VSTD::__to_raw_pointer(__tx.__pos_),
1753 _VSTD::move(*__i));
1754 }
1755 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001756 _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001757}
1758
1759template <class _Tp, class _Allocator>
1760typename vector<_Tp, _Allocator>::iterator
1761vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1762{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001763#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001764 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1765 "vector::insert(iterator, x) called with an iterator not"
1766 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001767#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001768 pointer __p = this->__begin_ + (__position - begin());
1769 if (this->__end_ < this->__end_cap())
1770 {
1771 if (__p == this->__end_)
1772 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001773 __construct_one_at_end(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001774 }
1775 else
1776 {
1777 __move_range(__p, this->__end_, __p + 1);
1778 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1779 if (__p <= __xr && __xr < this->__end_)
1780 ++__xr;
1781 *__p = *__xr;
1782 }
1783 }
1784 else
1785 {
1786 allocator_type& __a = this->__alloc();
1787 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1788 __v.push_back(__x);
1789 __p = __swap_out_circular_buffer(__v, __p);
1790 }
1791 return __make_iter(__p);
1792}
1793
Eric Fiseliered9e9362017-04-16 02:40:45 +00001794#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001795
1796template <class _Tp, class _Allocator>
1797typename vector<_Tp, _Allocator>::iterator
1798vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1799{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001800#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001801 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1802 "vector::insert(iterator, x) called with an iterator not"
1803 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001804#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001805 pointer __p = this->__begin_ + (__position - begin());
1806 if (this->__end_ < this->__end_cap())
1807 {
1808 if (__p == this->__end_)
1809 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001810 __construct_one_at_end(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001811 }
1812 else
1813 {
1814 __move_range(__p, this->__end_, __p + 1);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001815 *__p = _VSTD::move(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001816 }
1817 }
1818 else
1819 {
1820 allocator_type& __a = this->__alloc();
1821 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001822 __v.push_back(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001823 __p = __swap_out_circular_buffer(__v, __p);
1824 }
1825 return __make_iter(__p);
1826}
1827
1828template <class _Tp, class _Allocator>
1829template <class... _Args>
1830typename vector<_Tp, _Allocator>::iterator
1831vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1832{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001833#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001834 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1835 "vector::emplace(iterator, x) called with an iterator not"
1836 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001837#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001838 pointer __p = this->__begin_ + (__position - begin());
1839 if (this->__end_ < this->__end_cap())
1840 {
1841 if (__p == this->__end_)
1842 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001843 __construct_one_at_end(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001844 }
1845 else
1846 {
Marshall Clowa591b9a2016-07-11 21:38:08 +00001847 __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001848 __move_range(__p, this->__end_, __p + 1);
Marshall Clowa591b9a2016-07-11 21:38:08 +00001849 *__p = _VSTD::move(__tmp.get());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001850 }
1851 }
1852 else
1853 {
1854 allocator_type& __a = this->__alloc();
1855 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001856 __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001857 __p = __swap_out_circular_buffer(__v, __p);
1858 }
1859 return __make_iter(__p);
1860}
1861
Eric Fiseliered9e9362017-04-16 02:40:45 +00001862#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001863
1864template <class _Tp, class _Allocator>
1865typename vector<_Tp, _Allocator>::iterator
1866vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1867{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001868#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001869 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1870 "vector::insert(iterator, n, x) called with an iterator not"
1871 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001872#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001873 pointer __p = this->__begin_ + (__position - begin());
1874 if (__n > 0)
1875 {
1876 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1877 {
1878 size_type __old_n = __n;
1879 pointer __old_last = this->__end_;
1880 if (__n > static_cast<size_type>(this->__end_ - __p))
1881 {
1882 size_type __cx = __n - (this->__end_ - __p);
1883 __construct_at_end(__cx, __x);
1884 __n -= __cx;
1885 }
1886 if (__n > 0)
1887 {
1888 __move_range(__p, __old_last, __p + __old_n);
1889 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1890 if (__p <= __xr && __xr < this->__end_)
1891 __xr += __old_n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001892 _VSTD::fill_n(__p, __n, *__xr);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001893 }
1894 }
1895 else
1896 {
1897 allocator_type& __a = this->__alloc();
1898 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1899 __v.__construct_at_end(__n, __x);
1900 __p = __swap_out_circular_buffer(__v, __p);
1901 }
1902 }
1903 return __make_iter(__p);
1904}
1905
1906template <class _Tp, class _Allocator>
1907template <class _InputIterator>
1908typename enable_if
1909<
1910 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001911 !__is_forward_iterator<_InputIterator>::value &&
1912 is_constructible<
1913 _Tp,
1914 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001915 typename vector<_Tp, _Allocator>::iterator
1916>::type
1917vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1918{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001919#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001920 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1921 "vector::insert(iterator, range) called with an iterator not"
1922 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001923#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001924 difference_type __off = __position - begin();
1925 pointer __p = this->__begin_ + __off;
1926 allocator_type& __a = this->__alloc();
1927 pointer __old_last = this->__end_;
1928 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1929 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001930 __construct_one_at_end(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001931 }
1932 __split_buffer<value_type, allocator_type&> __v(__a);
1933 if (__first != __last)
1934 {
1935#ifndef _LIBCPP_NO_EXCEPTIONS
1936 try
1937 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001938#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001939 __v.__construct_at_end(__first, __last);
1940 difference_type __old_size = __old_last - this->__begin_;
1941 difference_type __old_p = __p - this->__begin_;
1942 reserve(__recommend(size() + __v.size()));
1943 __p = this->__begin_ + __old_p;
1944 __old_last = this->__begin_ + __old_size;
1945#ifndef _LIBCPP_NO_EXCEPTIONS
1946 }
1947 catch (...)
1948 {
1949 erase(__make_iter(__old_last), end());
1950 throw;
1951 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001952#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001953 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001954 __p = _VSTD::rotate(__p, __old_last, this->__end_);
Howard Hinnant9cd22302011-09-16 18:41:29 +00001955 insert(__make_iter(__p), make_move_iterator(__v.begin()),
1956 make_move_iterator(__v.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001957 return begin() + __off;
1958}
1959
1960template <class _Tp, class _Allocator>
1961template <class _ForwardIterator>
1962typename enable_if
1963<
Howard Hinnant88010252013-03-28 17:44:32 +00001964 __is_forward_iterator<_ForwardIterator>::value &&
1965 is_constructible<
1966 _Tp,
1967 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001968 typename vector<_Tp, _Allocator>::iterator
1969>::type
1970vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1971{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001972#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001973 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1974 "vector::insert(iterator, range) called with an iterator not"
1975 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001976#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001977 pointer __p = this->__begin_ + (__position - begin());
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001978 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001979 if (__n > 0)
1980 {
1981 if (__n <= this->__end_cap() - this->__end_)
1982 {
1983 size_type __old_n = __n;
1984 pointer __old_last = this->__end_;
1985 _ForwardIterator __m = __last;
1986 difference_type __dx = this->__end_ - __p;
1987 if (__n > __dx)
1988 {
1989 __m = __first;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001990 difference_type __diff = this->__end_ - __p;
1991 _VSTD::advance(__m, __diff);
1992 __construct_at_end(__m, __last, __n - __diff);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001993 __n = __dx;
1994 }
1995 if (__n > 0)
1996 {
1997 __move_range(__p, __old_last, __p + __old_n);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001998 _VSTD::copy(__first, __m, __p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001999 }
2000 }
2001 else
2002 {
2003 allocator_type& __a = this->__alloc();
2004 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
2005 __v.__construct_at_end(__first, __last);
2006 __p = __swap_out_circular_buffer(__v, __p);
2007 }
2008 }
2009 return __make_iter(__p);
2010}
2011
2012template <class _Tp, class _Allocator>
2013void
2014vector<_Tp, _Allocator>::resize(size_type __sz)
2015{
2016 size_type __cs = size();
2017 if (__cs < __sz)
2018 this->__append(__sz - __cs);
2019 else if (__cs > __sz)
2020 this->__destruct_at_end(this->__begin_ + __sz);
2021}
2022
2023template <class _Tp, class _Allocator>
2024void
2025vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
2026{
2027 size_type __cs = size();
2028 if (__cs < __sz)
2029 this->__append(__sz - __cs, __x);
2030 else if (__cs > __sz)
2031 this->__destruct_at_end(this->__begin_ + __sz);
2032}
2033
2034template <class _Tp, class _Allocator>
2035void
2036vector<_Tp, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002037#if _LIBCPP_STD_VER >= 14
Eric Fiselier873b8d32019-03-18 21:50:12 +00002038 _NOEXCEPT
Marshall Clow8982dcd2015-07-13 20:04:56 +00002039#else
Eric Fiselier873b8d32019-03-18 21:50:12 +00002040 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002041 __is_nothrow_swappable<allocator_type>::value)
2042#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002043{
Howard Hinnant27e0e772011-09-14 18:33:51 +00002044 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
2045 this->__alloc() == __x.__alloc(),
2046 "vector::swap: Either propagate_on_container_swap must be true"
2047 " or the allocators must compare equal");
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002048 _VSTD::swap(this->__begin_, __x.__begin_);
2049 _VSTD::swap(this->__end_, __x.__end_);
2050 _VSTD::swap(this->__end_cap(), __x.__end_cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00002051 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00002052 integral_constant<bool,__alloc_traits::propagate_on_container_swap::value>());
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002053#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002054 __get_db()->swap(this, &__x);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002055#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002056}
2057
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002058template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002059bool
2060vector<_Tp, _Allocator>::__invariants() const
2061{
Howard Hinnant76053d72013-06-27 19:35:32 +00002062 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002063 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002064 if (this->__end_ != nullptr || this->__end_cap() != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002065 return false;
2066 }
2067 else
2068 {
2069 if (this->__begin_ > this->__end_)
2070 return false;
2071 if (this->__begin_ == this->__end_cap())
2072 return false;
2073 if (this->__end_ > this->__end_cap())
2074 return false;
2075 }
2076 return true;
2077}
2078
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002079#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002080
Howard Hinnantc51e1022010-05-11 19:42:16 +00002081template <class _Tp, class _Allocator>
Howard Hinnant27e0e772011-09-14 18:33:51 +00002082bool
2083vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
2084{
2085 return this->__begin_ <= __i->base() && __i->base() < this->__end_;
2086}
2087
2088template <class _Tp, class _Allocator>
2089bool
2090vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
2091{
2092 return this->__begin_ < __i->base() && __i->base() <= this->__end_;
2093}
2094
2095template <class _Tp, class _Allocator>
2096bool
2097vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
2098{
2099 const_pointer __p = __i->base() + __n;
2100 return this->__begin_ <= __p && __p <= this->__end_;
2101}
2102
2103template <class _Tp, class _Allocator>
2104bool
2105vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2106{
2107 const_pointer __p = __i->base() + __n;
2108 return this->__begin_ <= __p && __p < this->__end_;
2109}
2110
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002111#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002112
2113template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002114inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002115void
2116vector<_Tp, _Allocator>::__invalidate_all_iterators()
2117{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002118#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002119 __get_db()->__invalidate_all(this);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002120#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002121}
2122
Eric Fiselier69c51982016-12-28 06:06:09 +00002123
2124template <class _Tp, class _Allocator>
2125inline _LIBCPP_INLINE_VISIBILITY
2126void
2127vector<_Tp, _Allocator>::__invalidate_iterators_past(pointer __new_last) {
2128#if _LIBCPP_DEBUG_LEVEL >= 2
2129 __c_node* __c = __get_db()->__find_c_and_lock(this);
2130 for (__i_node** __p = __c->end_; __p != __c->beg_; ) {
2131 --__p;
2132 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
2133 if (__i->base() > __new_last) {
2134 (*__p)->__c_ = nullptr;
2135 if (--__c->end_ != __p)
2136 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
2137 }
2138 }
2139 __get_db()->unlock();
2140#else
2141 ((void)__new_last);
2142#endif
2143}
2144
Howard Hinnantc51e1022010-05-11 19:42:16 +00002145// vector<bool>
2146
2147template <class _Allocator> class vector<bool, _Allocator>;
2148
2149template <class _Allocator> struct hash<vector<bool, _Allocator> >;
2150
2151template <class _Allocator>
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002152struct __has_storage_type<vector<bool, _Allocator> >
2153{
2154 static const bool value = true;
2155};
2156
2157template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002158class _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002159 : private __vector_base_common<true>
2160{
2161public:
2162 typedef vector __self;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002163 typedef bool value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002164 typedef _Allocator allocator_type;
2165 typedef allocator_traits<allocator_type> __alloc_traits;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002166 typedef typename __alloc_traits::size_type size_type;
2167 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant896b7622012-05-07 16:50:38 +00002168 typedef size_type __storage_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002169 typedef __bit_iterator<vector, false> pointer;
2170 typedef __bit_iterator<vector, true> const_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002171 typedef pointer iterator;
2172 typedef const_pointer const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002173 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
2174 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002175
2176private:
Marshall Clow940e01c2015-04-07 05:21:38 +00002177 typedef typename __rebind_alloc_helper<__alloc_traits, __storage_type>::type __storage_allocator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002178 typedef allocator_traits<__storage_allocator> __storage_traits;
2179 typedef typename __storage_traits::pointer __storage_pointer;
2180 typedef typename __storage_traits::const_pointer __const_storage_pointer;
2181
2182 __storage_pointer __begin_;
2183 size_type __size_;
2184 __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002185public:
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002186 typedef __bit_reference<vector> reference;
2187 typedef __bit_const_reference<vector> const_reference;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002188private:
Howard Hinnant1c936782011-06-03 19:40:40 +00002189 _LIBCPP_INLINE_VISIBILITY
2190 size_type& __cap() _NOEXCEPT
2191 {return __cap_alloc_.first();}
2192 _LIBCPP_INLINE_VISIBILITY
2193 const size_type& __cap() const _NOEXCEPT
2194 {return __cap_alloc_.first();}
2195 _LIBCPP_INLINE_VISIBILITY
2196 __storage_allocator& __alloc() _NOEXCEPT
2197 {return __cap_alloc_.second();}
2198 _LIBCPP_INLINE_VISIBILITY
2199 const __storage_allocator& __alloc() const _NOEXCEPT
2200 {return __cap_alloc_.second();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002201
2202 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2203
Howard Hinnant1c936782011-06-03 19:40:40 +00002204 _LIBCPP_INLINE_VISIBILITY
2205 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002206 {return __n * __bits_per_word;}
Howard Hinnant1c936782011-06-03 19:40:40 +00002207 _LIBCPP_INLINE_VISIBILITY
2208 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002209 {return (__n - 1) / __bits_per_word + 1;}
2210
2211public:
Howard Hinnant1c936782011-06-03 19:40:40 +00002212 _LIBCPP_INLINE_VISIBILITY
Marshall Clowe546cbb2015-06-04 02:05:41 +00002213 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Marshall Clow8f282f42015-06-04 00:10:20 +00002214
2215 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
2216#if _LIBCPP_STD_VER <= 14
2217 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
2218#else
2219 _NOEXCEPT;
2220#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002221 ~vector();
2222 explicit vector(size_type __n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002223#if _LIBCPP_STD_VER > 11
2224 explicit vector(size_type __n, const allocator_type& __a);
2225#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002226 vector(size_type __n, const value_type& __v);
2227 vector(size_type __n, const value_type& __v, const allocator_type& __a);
2228 template <class _InputIterator>
2229 vector(_InputIterator __first, _InputIterator __last,
2230 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2231 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2232 template <class _InputIterator>
2233 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2234 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2235 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2236 template <class _ForwardIterator>
2237 vector(_ForwardIterator __first, _ForwardIterator __last,
2238 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2239 template <class _ForwardIterator>
2240 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2241 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2242
2243 vector(const vector& __v);
2244 vector(const vector& __v, const allocator_type& __a);
2245 vector& operator=(const vector& __v);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002246
2247#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002248 vector(initializer_list<value_type> __il);
2249 vector(initializer_list<value_type> __il, const allocator_type& __a);
2250
Howard Hinnant1c936782011-06-03 19:40:40 +00002251 _LIBCPP_INLINE_VISIBILITY
2252 vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002253#if _LIBCPP_STD_VER > 14
2254 _NOEXCEPT;
2255#else
Howard Hinnant1c936782011-06-03 19:40:40 +00002256 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clowe5108202015-07-14 14:46:32 +00002257#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002258 vector(vector&& __v, const allocator_type& __a);
Howard Hinnant1c936782011-06-03 19:40:40 +00002259 _LIBCPP_INLINE_VISIBILITY
2260 vector& operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002261 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Eric Fiseliered9e9362017-04-16 02:40:45 +00002262
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002263 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002264 vector& operator=(initializer_list<value_type> __il)
2265 {assign(__il.begin(), __il.end()); return *this;}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002266
2267#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002268
2269 template <class _InputIterator>
2270 typename enable_if
2271 <
2272 __is_input_iterator<_InputIterator>::value &&
2273 !__is_forward_iterator<_InputIterator>::value,
2274 void
2275 >::type
2276 assign(_InputIterator __first, _InputIterator __last);
2277 template <class _ForwardIterator>
2278 typename enable_if
2279 <
2280 __is_forward_iterator<_ForwardIterator>::value,
2281 void
2282 >::type
2283 assign(_ForwardIterator __first, _ForwardIterator __last);
2284
2285 void assign(size_type __n, const value_type& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002286
2287#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002288 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002289 void assign(initializer_list<value_type> __il)
2290 {assign(__il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002291#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002292
Howard Hinnant1c936782011-06-03 19:40:40 +00002293 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002294 {return allocator_type(this->__alloc());}
2295
Howard Hinnant1c936782011-06-03 19:40:40 +00002296 size_type max_size() const _NOEXCEPT;
2297 _LIBCPP_INLINE_VISIBILITY
2298 size_type capacity() const _NOEXCEPT
2299 {return __internal_cap_to_external(__cap());}
2300 _LIBCPP_INLINE_VISIBILITY
2301 size_type size() const _NOEXCEPT
2302 {return __size_;}
Marshall Clow425f5752017-11-15 05:51:26 +00002303 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00002304 bool empty() const _NOEXCEPT
2305 {return __size_ == 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002306 void reserve(size_type __n);
Howard Hinnant1c936782011-06-03 19:40:40 +00002307 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002308
Howard Hinnant1c936782011-06-03 19:40:40 +00002309 _LIBCPP_INLINE_VISIBILITY
2310 iterator begin() _NOEXCEPT
2311 {return __make_iter(0);}
2312 _LIBCPP_INLINE_VISIBILITY
2313 const_iterator begin() const _NOEXCEPT
2314 {return __make_iter(0);}
2315 _LIBCPP_INLINE_VISIBILITY
2316 iterator end() _NOEXCEPT
2317 {return __make_iter(__size_);}
2318 _LIBCPP_INLINE_VISIBILITY
2319 const_iterator end() const _NOEXCEPT
2320 {return __make_iter(__size_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002321
Howard Hinnant1c936782011-06-03 19:40:40 +00002322 _LIBCPP_INLINE_VISIBILITY
2323 reverse_iterator rbegin() _NOEXCEPT
2324 {return reverse_iterator(end());}
2325 _LIBCPP_INLINE_VISIBILITY
2326 const_reverse_iterator rbegin() const _NOEXCEPT
2327 {return const_reverse_iterator(end());}
2328 _LIBCPP_INLINE_VISIBILITY
2329 reverse_iterator rend() _NOEXCEPT
2330 {return reverse_iterator(begin());}
2331 _LIBCPP_INLINE_VISIBILITY
2332 const_reverse_iterator rend() const _NOEXCEPT
2333 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002334
Howard Hinnant1c936782011-06-03 19:40:40 +00002335 _LIBCPP_INLINE_VISIBILITY
2336 const_iterator cbegin() const _NOEXCEPT
2337 {return __make_iter(0);}
2338 _LIBCPP_INLINE_VISIBILITY
2339 const_iterator cend() const _NOEXCEPT
2340 {return __make_iter(__size_);}
2341 _LIBCPP_INLINE_VISIBILITY
2342 const_reverse_iterator crbegin() const _NOEXCEPT
2343 {return rbegin();}
2344 _LIBCPP_INLINE_VISIBILITY
2345 const_reverse_iterator crend() const _NOEXCEPT
2346 {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002347
2348 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
2349 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2350 reference at(size_type __n);
2351 const_reference at(size_type __n) const;
2352
2353 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
2354 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2355 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
2356 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
2357
2358 void push_back(const value_type& __x);
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002359#if _LIBCPP_STD_VER > 11
2360 template <class... _Args>
Marshall Clowea52cc42017-01-24 23:09:12 +00002361#if _LIBCPP_STD_VER > 14
2362 _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args)
2363#else
2364 _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args)
2365#endif
2366 {
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002367 push_back ( value_type ( _VSTD::forward<_Args>(__args)... ));
Marshall Clowea52cc42017-01-24 23:09:12 +00002368#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002369 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00002370#endif
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002371 }
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002372#endif
2373
Howard Hinnantc51e1022010-05-11 19:42:16 +00002374 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2375
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002376#if _LIBCPP_STD_VER > 11
2377 template <class... _Args>
2378 _LIBCPP_INLINE_VISIBILITY iterator emplace(const_iterator position, _Args&&... __args)
2379 { return insert ( position, value_type ( _VSTD::forward<_Args>(__args)... )); }
2380#endif
2381
Howard Hinnantc51e1022010-05-11 19:42:16 +00002382 iterator insert(const_iterator __position, const value_type& __x);
2383 iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2384 iterator insert(const_iterator __position, size_type __n, const_reference __x);
2385 template <class _InputIterator>
2386 typename enable_if
2387 <
2388 __is_input_iterator <_InputIterator>::value &&
2389 !__is_forward_iterator<_InputIterator>::value,
2390 iterator
2391 >::type
2392 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2393 template <class _ForwardIterator>
2394 typename enable_if
2395 <
2396 __is_forward_iterator<_ForwardIterator>::value,
2397 iterator
2398 >::type
2399 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002400
2401#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002402 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002403 iterator insert(const_iterator __position, initializer_list<value_type> __il)
2404 {return insert(__position, __il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002405#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002406
Howard Hinnantcf823322010-12-17 14:46:43 +00002407 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002408 iterator erase(const_iterator __first, const_iterator __last);
2409
Howard Hinnant1c936782011-06-03 19:40:40 +00002410 _LIBCPP_INLINE_VISIBILITY
2411 void clear() _NOEXCEPT {__size_ = 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002412
Howard Hinnant1c936782011-06-03 19:40:40 +00002413 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002414#if _LIBCPP_STD_VER >= 14
2415 _NOEXCEPT;
2416#else
Eric Fiselier69c51982016-12-28 06:06:09 +00002417 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002418 __is_nothrow_swappable<allocator_type>::value);
2419#endif
Marshall Clow89eb3822016-04-07 14:20:31 +00002420 static void swap(reference __x, reference __y) _NOEXCEPT { _VSTD::swap(__x, __y); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002421
2422 void resize(size_type __sz, value_type __x = false);
Howard Hinnant1c936782011-06-03 19:40:40 +00002423 void flip() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002424
2425 bool __invariants() const;
2426
2427private:
Howard Hinnantcf823322010-12-17 14:46:43 +00002428 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Marshall Clow3ff48e02018-05-22 16:20:28 +00002429 void __vallocate(size_type __n);
2430 void __vdeallocate() _NOEXCEPT;
Howard Hinnant1c936782011-06-03 19:40:40 +00002431 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantea382952013-08-14 18:00:20 +00002432 static size_type __align_it(size_type __new_size) _NOEXCEPT
Eric Fiselierb41db9a2018-10-01 01:59:37 +00002433 {return __new_size + (__bits_per_word-1) & ~((size_type)__bits_per_word-1);}
Howard Hinnantcf823322010-12-17 14:46:43 +00002434 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
2435 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002436 template <class _ForwardIterator>
2437 typename enable_if
2438 <
2439 __is_forward_iterator<_ForwardIterator>::value,
2440 void
2441 >::type
2442 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2443 void __append(size_type __n, const_reference __x);
Howard Hinnant1c936782011-06-03 19:40:40 +00002444 _LIBCPP_INLINE_VISIBILITY
2445 reference __make_ref(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002446 {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnant1c936782011-06-03 19:40:40 +00002447 _LIBCPP_INLINE_VISIBILITY
2448 const_reference __make_ref(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002449 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnant1c936782011-06-03 19:40:40 +00002450 _LIBCPP_INLINE_VISIBILITY
2451 iterator __make_iter(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002452 {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnant1c936782011-06-03 19:40:40 +00002453 _LIBCPP_INLINE_VISIBILITY
2454 const_iterator __make_iter(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002455 {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnant1c936782011-06-03 19:40:40 +00002456 _LIBCPP_INLINE_VISIBILITY
2457 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
Howard Hinnant76053d72013-06-27 19:35:32 +00002458 {return begin() + (__p - cbegin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002459
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002460 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002461 void __copy_assign_alloc(const vector& __v)
2462 {__copy_assign_alloc(__v, integral_constant<bool,
2463 __storage_traits::propagate_on_container_copy_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002465 void __copy_assign_alloc(const vector& __c, true_type)
2466 {
2467 if (__alloc() != __c.__alloc())
Marshall Clow3ff48e02018-05-22 16:20:28 +00002468 __vdeallocate();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002469 __alloc() = __c.__alloc();
2470 }
2471
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002472 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002473 void __copy_assign_alloc(const vector&, false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002474 {}
2475
2476 void __move_assign(vector& __c, false_type);
Howard Hinnant1c936782011-06-03 19:40:40 +00002477 void __move_assign(vector& __c, true_type)
2478 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002479 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002480 void __move_assign_alloc(vector& __c)
Howard Hinnant1c936782011-06-03 19:40:40 +00002481 _NOEXCEPT_(
2482 !__storage_traits::propagate_on_container_move_assignment::value ||
2483 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002484 {__move_assign_alloc(__c, integral_constant<bool,
2485 __storage_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002486 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc2734962011-09-02 20:42:31 +00002487 void __move_assign_alloc(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002488 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002489 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002490 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002491 }
2492
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002493 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002494 void __move_assign_alloc(vector&, false_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002495 _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002496 {}
2497
Howard Hinnant1c936782011-06-03 19:40:40 +00002498 size_t __hash_code() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002499
2500 friend class __bit_reference<vector>;
2501 friend class __bit_const_reference<vector>;
2502 friend class __bit_iterator<vector, false>;
2503 friend class __bit_iterator<vector, true>;
Howard Hinnant4210a0f2012-08-17 17:10:18 +00002504 friend struct __bit_array<vector>;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002505 friend struct _LIBCPP_TEMPLATE_VIS hash<vector>;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002506};
2507
2508template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002509inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002510void
2511vector<bool, _Allocator>::__invalidate_all_iterators()
2512{
Howard Hinnantc51e1022010-05-11 19:42:16 +00002513}
2514
2515// Allocate space for __n objects
2516// throws length_error if __n > max_size()
2517// throws (probably bad_alloc) if memory run out
2518// Precondition: __begin_ == __end_ == __cap() == 0
2519// Precondition: __n > 0
2520// Postcondition: capacity() == __n
2521// Postcondition: size() == 0
2522template <class _Allocator>
2523void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002524vector<bool, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002525{
2526 if (__n > max_size())
2527 this->__throw_length_error();
2528 __n = __external_cap_to_internal(__n);
2529 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2530 this->__size_ = 0;
2531 this->__cap() = __n;
2532}
2533
2534template <class _Allocator>
2535void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002536vector<bool, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002537{
Howard Hinnant76053d72013-06-27 19:35:32 +00002538 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002539 {
2540 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2541 __invalidate_all_iterators();
Howard Hinnant76053d72013-06-27 19:35:32 +00002542 this->__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002543 this->__size_ = this->__cap() = 0;
2544 }
2545}
2546
2547template <class _Allocator>
2548typename vector<bool, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +00002549vector<bool, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002550{
2551 size_type __amax = __storage_traits::max_size(__alloc());
2552 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
2553 if (__nmax / __bits_per_word <= __amax)
2554 return __nmax;
2555 return __internal_cap_to_external(__amax);
2556}
2557
2558// Precondition: __new_size > capacity()
2559template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002560inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002561typename vector<bool, _Allocator>::size_type
2562vector<bool, _Allocator>::__recommend(size_type __new_size) const
2563{
2564 const size_type __ms = max_size();
2565 if (__new_size > __ms)
2566 this->__throw_length_error();
2567 const size_type __cap = capacity();
2568 if (__cap >= __ms / 2)
2569 return __ms;
Howard Hinnantea382952013-08-14 18:00:20 +00002570 return _VSTD::max(2*__cap, __align_it(__new_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002571}
2572
2573// Default constructs __n objects starting at __end_
2574// Precondition: __n > 0
2575// Precondition: size() + __n <= capacity()
2576// Postcondition: size() == size() + __n
2577template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002578inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002579void
2580vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2581{
2582 size_type __old_size = this->__size_;
2583 this->__size_ += __n;
Marshall Clow1893ec72018-10-23 20:07:45 +00002584 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2585 {
2586 if (this->__size_ <= __bits_per_word)
2587 this->__begin_[0] = __storage_type(0);
2588 else
2589 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2590 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002591 _VSTD::fill_n(__make_iter(__old_size), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002592}
2593
2594template <class _Allocator>
2595template <class _ForwardIterator>
2596typename enable_if
2597<
2598 __is_forward_iterator<_ForwardIterator>::value,
2599 void
2600>::type
2601vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2602{
2603 size_type __old_size = this->__size_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002604 this->__size_ += _VSTD::distance(__first, __last);
Marshall Clow1893ec72018-10-23 20:07:45 +00002605 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2606 {
2607 if (this->__size_ <= __bits_per_word)
2608 this->__begin_[0] = __storage_type(0);
2609 else
2610 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2611 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002612 _VSTD::copy(__first, __last, __make_iter(__old_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002613}
2614
2615template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002616inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002617vector<bool, _Allocator>::vector()
Marshall Clowe546cbb2015-06-04 02:05:41 +00002618 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant76053d72013-06-27 19:35:32 +00002619 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002620 __size_(0),
2621 __cap_alloc_(0)
2622{
2623}
2624
2625template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002626inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002627vector<bool, _Allocator>::vector(const allocator_type& __a)
Marshall Clow8f282f42015-06-04 00:10:20 +00002628#if _LIBCPP_STD_VER <= 14
2629 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
2630#else
2631 _NOEXCEPT
2632#endif
Howard Hinnant76053d72013-06-27 19:35:32 +00002633 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002634 __size_(0),
2635 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2636{
2637}
2638
2639template <class _Allocator>
2640vector<bool, _Allocator>::vector(size_type __n)
Howard Hinnant76053d72013-06-27 19:35:32 +00002641 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002642 __size_(0),
2643 __cap_alloc_(0)
2644{
2645 if (__n > 0)
2646 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002647 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002648 __construct_at_end(__n, false);
2649 }
2650}
2651
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002652#if _LIBCPP_STD_VER > 11
2653template <class _Allocator>
2654vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a)
2655 : __begin_(nullptr),
2656 __size_(0),
2657 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2658{
2659 if (__n > 0)
2660 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002661 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002662 __construct_at_end(__n, false);
2663 }
2664}
2665#endif
2666
Howard Hinnantc51e1022010-05-11 19:42:16 +00002667template <class _Allocator>
2668vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnant76053d72013-06-27 19:35:32 +00002669 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002670 __size_(0),
2671 __cap_alloc_(0)
2672{
2673 if (__n > 0)
2674 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002675 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002676 __construct_at_end(__n, __x);
2677 }
2678}
2679
2680template <class _Allocator>
2681vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002682 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002683 __size_(0),
2684 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2685{
2686 if (__n > 0)
2687 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002688 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002689 __construct_at_end(__n, __x);
2690 }
2691}
2692
2693template <class _Allocator>
2694template <class _InputIterator>
2695vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2696 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2697 !__is_forward_iterator<_InputIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002698 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002699 __size_(0),
2700 __cap_alloc_(0)
2701{
2702#ifndef _LIBCPP_NO_EXCEPTIONS
2703 try
2704 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002705#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002706 for (; __first != __last; ++__first)
2707 push_back(*__first);
2708#ifndef _LIBCPP_NO_EXCEPTIONS
2709 }
2710 catch (...)
2711 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002712 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002713 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2714 __invalidate_all_iterators();
2715 throw;
2716 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002717#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002718}
2719
2720template <class _Allocator>
2721template <class _InputIterator>
2722vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2723 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2724 !__is_forward_iterator<_InputIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002725 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002726 __size_(0),
2727 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2728{
2729#ifndef _LIBCPP_NO_EXCEPTIONS
2730 try
2731 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002732#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002733 for (; __first != __last; ++__first)
2734 push_back(*__first);
2735#ifndef _LIBCPP_NO_EXCEPTIONS
2736 }
2737 catch (...)
2738 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002739 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002740 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2741 __invalidate_all_iterators();
2742 throw;
2743 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002744#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002745}
2746
2747template <class _Allocator>
2748template <class _ForwardIterator>
2749vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2750 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002751 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002752 __size_(0),
2753 __cap_alloc_(0)
2754{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002755 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002756 if (__n > 0)
2757 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002758 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002759 __construct_at_end(__first, __last);
2760 }
2761}
2762
2763template <class _Allocator>
2764template <class _ForwardIterator>
2765vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2766 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002767 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002768 __size_(0),
2769 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2770{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002771 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002772 if (__n > 0)
2773 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002774 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002775 __construct_at_end(__first, __last);
2776 }
2777}
2778
Eric Fiseliered9e9362017-04-16 02:40:45 +00002779#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002780
Howard Hinnantc51e1022010-05-11 19:42:16 +00002781template <class _Allocator>
2782vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
Howard Hinnant76053d72013-06-27 19:35:32 +00002783 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002784 __size_(0),
2785 __cap_alloc_(0)
2786{
2787 size_type __n = static_cast<size_type>(__il.size());
2788 if (__n > 0)
2789 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002790 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002791 __construct_at_end(__il.begin(), __il.end());
2792 }
2793}
2794
2795template <class _Allocator>
2796vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002797 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002798 __size_(0),
2799 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2800{
2801 size_type __n = static_cast<size_type>(__il.size());
2802 if (__n > 0)
2803 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002804 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002805 __construct_at_end(__il.begin(), __il.end());
2806 }
2807}
2808
Eric Fiseliered9e9362017-04-16 02:40:45 +00002809#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002810
Howard Hinnantc51e1022010-05-11 19:42:16 +00002811template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002812vector<bool, _Allocator>::~vector()
2813{
Howard Hinnant76053d72013-06-27 19:35:32 +00002814 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002815 __storage_traits::deallocate(__alloc(), __begin_, __cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002816 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002817}
2818
2819template <class _Allocator>
2820vector<bool, _Allocator>::vector(const vector& __v)
Howard Hinnant76053d72013-06-27 19:35:32 +00002821 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002822 __size_(0),
2823 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2824{
2825 if (__v.size() > 0)
2826 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002827 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002828 __construct_at_end(__v.begin(), __v.end());
2829 }
2830}
2831
2832template <class _Allocator>
2833vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002834 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002835 __size_(0),
2836 __cap_alloc_(0, __a)
2837{
2838 if (__v.size() > 0)
2839 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002840 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002841 __construct_at_end(__v.begin(), __v.end());
2842 }
2843}
2844
2845template <class _Allocator>
2846vector<bool, _Allocator>&
2847vector<bool, _Allocator>::operator=(const vector& __v)
2848{
2849 if (this != &__v)
2850 {
2851 __copy_assign_alloc(__v);
2852 if (__v.__size_)
2853 {
2854 if (__v.__size_ > capacity())
2855 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002856 __vdeallocate();
2857 __vallocate(__v.__size_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002858 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002859 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002860 }
2861 __size_ = __v.__size_;
2862 }
2863 return *this;
2864}
2865
Eric Fiseliered9e9362017-04-16 02:40:45 +00002866#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant74279a52010-09-04 23:28:19 +00002867
Howard Hinnantc51e1022010-05-11 19:42:16 +00002868template <class _Allocator>
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002869inline _LIBCPP_INLINE_VISIBILITY vector<bool, _Allocator>::vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002870#if _LIBCPP_STD_VER > 14
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002871 _NOEXCEPT
Marshall Clowe5108202015-07-14 14:46:32 +00002872#else
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002873 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00002874#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002875 : __begin_(__v.__begin_),
2876 __size_(__v.__size_),
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002877 __cap_alloc_(std::move(__v.__cap_alloc_)) {
Howard Hinnant76053d72013-06-27 19:35:32 +00002878 __v.__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002879 __v.__size_ = 0;
2880 __v.__cap() = 0;
2881}
2882
2883template <class _Allocator>
2884vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002885 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002886 __size_(0),
2887 __cap_alloc_(0, __a)
2888{
2889 if (__a == allocator_type(__v.__alloc()))
2890 {
2891 this->__begin_ = __v.__begin_;
2892 this->__size_ = __v.__size_;
2893 this->__cap() = __v.__cap();
2894 __v.__begin_ = nullptr;
2895 __v.__cap() = __v.__size_ = 0;
2896 }
2897 else if (__v.size() > 0)
2898 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002899 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002900 __construct_at_end(__v.begin(), __v.end());
2901 }
2902}
2903
2904template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002905inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002906vector<bool, _Allocator>&
2907vector<bool, _Allocator>::operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002908 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002909{
2910 __move_assign(__v, integral_constant<bool,
2911 __storage_traits::propagate_on_container_move_assignment::value>());
Argyrios Kyrtzidisaf904652012-10-13 02:03:45 +00002912 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002913}
2914
2915template <class _Allocator>
2916void
2917vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2918{
2919 if (__alloc() != __c.__alloc())
2920 assign(__c.begin(), __c.end());
2921 else
2922 __move_assign(__c, true_type());
2923}
2924
2925template <class _Allocator>
2926void
2927vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002928 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002929{
Marshall Clow3ff48e02018-05-22 16:20:28 +00002930 __vdeallocate();
Marshall Clowb4871fa2014-07-21 15:15:15 +00002931 __move_assign_alloc(__c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002932 this->__begin_ = __c.__begin_;
2933 this->__size_ = __c.__size_;
2934 this->__cap() = __c.__cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002935 __c.__begin_ = nullptr;
2936 __c.__cap() = __c.__size_ = 0;
2937}
Howard Hinnant74279a52010-09-04 23:28:19 +00002938
Eric Fiseliered9e9362017-04-16 02:40:45 +00002939#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002940
2941template <class _Allocator>
2942void
2943vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2944{
2945 __size_ = 0;
2946 if (__n > 0)
2947 {
2948 size_type __c = capacity();
2949 if (__n <= __c)
2950 __size_ = __n;
2951 else
2952 {
2953 vector __v(__alloc());
2954 __v.reserve(__recommend(__n));
2955 __v.__size_ = __n;
2956 swap(__v);
2957 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002958 _VSTD::fill_n(begin(), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002959 }
Eric Fiselier69c51982016-12-28 06:06:09 +00002960 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002961}
2962
2963template <class _Allocator>
2964template <class _InputIterator>
2965typename enable_if
2966<
2967 __is_input_iterator<_InputIterator>::value &&
2968 !__is_forward_iterator<_InputIterator>::value,
2969 void
2970>::type
2971vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2972{
2973 clear();
2974 for (; __first != __last; ++__first)
2975 push_back(*__first);
2976}
2977
2978template <class _Allocator>
2979template <class _ForwardIterator>
2980typename enable_if
2981<
2982 __is_forward_iterator<_ForwardIterator>::value,
2983 void
2984>::type
2985vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2986{
2987 clear();
Eric Fiselier6003c772016-12-23 23:37:52 +00002988 difference_type __ns = _VSTD::distance(__first, __last);
2989 _LIBCPP_ASSERT(__ns >= 0, "invalid range specified");
2990 const size_t __n = static_cast<size_type>(__ns);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002991 if (__n)
2992 {
2993 if (__n > capacity())
2994 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002995 __vdeallocate();
2996 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002997 }
2998 __construct_at_end(__first, __last);
2999 }
3000}
3001
3002template <class _Allocator>
3003void
3004vector<bool, _Allocator>::reserve(size_type __n)
3005{
3006 if (__n > capacity())
3007 {
3008 vector __v(this->__alloc());
Marshall Clow3ff48e02018-05-22 16:20:28 +00003009 __v.__vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003010 __v.__construct_at_end(this->begin(), this->end());
3011 swap(__v);
3012 __invalidate_all_iterators();
3013 }
3014}
3015
3016template <class _Allocator>
3017void
Howard Hinnant1c936782011-06-03 19:40:40 +00003018vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003019{
3020 if (__external_cap_to_internal(size()) > __cap())
3021 {
3022#ifndef _LIBCPP_NO_EXCEPTIONS
3023 try
3024 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003025#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003026 vector(*this, allocator_type(__alloc())).swap(*this);
3027#ifndef _LIBCPP_NO_EXCEPTIONS
3028 }
3029 catch (...)
3030 {
3031 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003032#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003033 }
3034}
3035
3036template <class _Allocator>
3037typename vector<bool, _Allocator>::reference
3038vector<bool, _Allocator>::at(size_type __n)
3039{
3040 if (__n >= size())
3041 this->__throw_out_of_range();
3042 return (*this)[__n];
3043}
3044
3045template <class _Allocator>
3046typename vector<bool, _Allocator>::const_reference
3047vector<bool, _Allocator>::at(size_type __n) const
3048{
3049 if (__n >= size())
3050 this->__throw_out_of_range();
3051 return (*this)[__n];
3052}
3053
3054template <class _Allocator>
3055void
3056vector<bool, _Allocator>::push_back(const value_type& __x)
3057{
3058 if (this->__size_ == this->capacity())
3059 reserve(__recommend(this->__size_ + 1));
3060 ++this->__size_;
3061 back() = __x;
3062}
3063
3064template <class _Allocator>
3065typename vector<bool, _Allocator>::iterator
3066vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
3067{
3068 iterator __r;
3069 if (size() < capacity())
3070 {
3071 const_iterator __old_end = end();
3072 ++__size_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003073 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003074 __r = __const_iterator_cast(__position);
3075 }
3076 else
3077 {
3078 vector __v(__alloc());
3079 __v.reserve(__recommend(__size_ + 1));
3080 __v.__size_ = __size_ + 1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003081 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3082 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003083 swap(__v);
3084 }
3085 *__r = __x;
3086 return __r;
3087}
3088
3089template <class _Allocator>
3090typename vector<bool, _Allocator>::iterator
3091vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
3092{
3093 iterator __r;
3094 size_type __c = capacity();
3095 if (__n <= __c && size() <= __c - __n)
3096 {
3097 const_iterator __old_end = end();
3098 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003099 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003100 __r = __const_iterator_cast(__position);
3101 }
3102 else
3103 {
3104 vector __v(__alloc());
3105 __v.reserve(__recommend(__size_ + __n));
3106 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003107 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3108 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003109 swap(__v);
3110 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003111 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003112 return __r;
3113}
3114
3115template <class _Allocator>
3116template <class _InputIterator>
3117typename enable_if
3118<
3119 __is_input_iterator <_InputIterator>::value &&
3120 !__is_forward_iterator<_InputIterator>::value,
3121 typename vector<bool, _Allocator>::iterator
3122>::type
3123vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
3124{
3125 difference_type __off = __position - begin();
3126 iterator __p = __const_iterator_cast(__position);
3127 iterator __old_end = end();
3128 for (; size() != capacity() && __first != __last; ++__first)
3129 {
3130 ++this->__size_;
3131 back() = *__first;
3132 }
3133 vector __v(__alloc());
3134 if (__first != __last)
3135 {
3136#ifndef _LIBCPP_NO_EXCEPTIONS
3137 try
3138 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003139#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003140 __v.assign(__first, __last);
3141 difference_type __old_size = static_cast<difference_type>(__old_end - begin());
3142 difference_type __old_p = __p - begin();
3143 reserve(__recommend(size() + __v.size()));
3144 __p = begin() + __old_p;
3145 __old_end = begin() + __old_size;
3146#ifndef _LIBCPP_NO_EXCEPTIONS
3147 }
3148 catch (...)
3149 {
3150 erase(__old_end, end());
3151 throw;
3152 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003153#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003154 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003155 __p = _VSTD::rotate(__p, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003156 insert(__p, __v.begin(), __v.end());
3157 return begin() + __off;
3158}
3159
3160template <class _Allocator>
3161template <class _ForwardIterator>
3162typename enable_if
3163<
3164 __is_forward_iterator<_ForwardIterator>::value,
3165 typename vector<bool, _Allocator>::iterator
3166>::type
3167vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
3168{
Eric Fiselier654dd332016-12-11 05:31:00 +00003169 const difference_type __n_signed = _VSTD::distance(__first, __last);
3170 _LIBCPP_ASSERT(__n_signed >= 0, "invalid range specified");
3171 const size_type __n = static_cast<size_type>(__n_signed);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003172 iterator __r;
3173 size_type __c = capacity();
3174 if (__n <= __c && size() <= __c - __n)
3175 {
3176 const_iterator __old_end = end();
3177 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003178 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003179 __r = __const_iterator_cast(__position);
3180 }
3181 else
3182 {
3183 vector __v(__alloc());
3184 __v.reserve(__recommend(__size_ + __n));
3185 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003186 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3187 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003188 swap(__v);
3189 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003190 _VSTD::copy(__first, __last, __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003191 return __r;
3192}
3193
3194template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003195inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003196typename vector<bool, _Allocator>::iterator
3197vector<bool, _Allocator>::erase(const_iterator __position)
3198{
3199 iterator __r = __const_iterator_cast(__position);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003200 _VSTD::copy(__position + 1, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003201 --__size_;
3202 return __r;
3203}
3204
3205template <class _Allocator>
3206typename vector<bool, _Allocator>::iterator
3207vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
3208{
3209 iterator __r = __const_iterator_cast(__first);
3210 difference_type __d = __last - __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003211 _VSTD::copy(__last, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003212 __size_ -= __d;
3213 return __r;
3214}
3215
3216template <class _Allocator>
3217void
3218vector<bool, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00003219#if _LIBCPP_STD_VER >= 14
3220 _NOEXCEPT
3221#else
Eric Fiselier69c51982016-12-28 06:06:09 +00003222 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00003223 __is_nothrow_swappable<allocator_type>::value)
3224#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00003225{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003226 _VSTD::swap(this->__begin_, __x.__begin_);
3227 _VSTD::swap(this->__size_, __x.__size_);
3228 _VSTD::swap(this->__cap(), __x.__cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00003229 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00003230 integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003231}
3232
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003233template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003234void
3235vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3236{
3237 size_type __cs = size();
3238 if (__cs < __sz)
3239 {
3240 iterator __r;
3241 size_type __c = capacity();
3242 size_type __n = __sz - __cs;
3243 if (__n <= __c && __cs <= __c - __n)
3244 {
3245 __r = end();
3246 __size_ += __n;
3247 }
3248 else
3249 {
3250 vector __v(__alloc());
3251 __v.reserve(__recommend(__size_ + __n));
3252 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003253 __r = _VSTD::copy(cbegin(), cend(), __v.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003254 swap(__v);
3255 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003256 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003257 }
3258 else
3259 __size_ = __sz;
3260}
3261
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003262template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003263void
Howard Hinnant1c936782011-06-03 19:40:40 +00003264vector<bool, _Allocator>::flip() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003265{
3266 // do middle whole words
3267 size_type __n = __size_;
3268 __storage_pointer __p = __begin_;
3269 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3270 *__p = ~*__p;
3271 // do last partial word
3272 if (__n > 0)
3273 {
3274 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3275 __storage_type __b = *__p & __m;
3276 *__p &= ~__m;
3277 *__p |= ~__b & __m;
3278 }
3279}
3280
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003281template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003282bool
3283vector<bool, _Allocator>::__invariants() const
3284{
Howard Hinnant76053d72013-06-27 19:35:32 +00003285 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003286 {
3287 if (this->__size_ != 0 || this->__cap() != 0)
3288 return false;
3289 }
3290 else
3291 {
3292 if (this->__cap() == 0)
3293 return false;
3294 if (this->__size_ > this->capacity())
3295 return false;
3296 }
3297 return true;
3298}
3299
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003300template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003301size_t
Howard Hinnant1c936782011-06-03 19:40:40 +00003302vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003303{
3304 size_t __h = 0;
3305 // do middle whole words
3306 size_type __n = __size_;
3307 __storage_pointer __p = __begin_;
3308 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3309 __h ^= *__p;
3310 // do last partial word
3311 if (__n > 0)
3312 {
3313 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3314 __h ^= *__p & __m;
3315 }
3316 return __h;
3317}
3318
3319template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00003320struct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003321 : public unary_function<vector<bool, _Allocator>, size_t>
3322{
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003323 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00003324 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003325 {return __vec.__hash_code();}
3326};
3327
3328template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003329inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003330bool
3331operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3332{
3333 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003334 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003335}
3336
3337template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003338inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003339bool
3340operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3341{
3342 return !(__x == __y);
3343}
3344
3345template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003346inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003347bool
3348operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3349{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003350 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003351}
3352
3353template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003354inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003355bool
3356operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3357{
3358 return __y < __x;
3359}
3360
3361template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003362inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003363bool
3364operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3365{
3366 return !(__x < __y);
3367}
3368
3369template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003370inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003371bool
3372operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3373{
3374 return !(__y < __x);
3375}
3376
3377template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003378inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003379void
3380swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
Howard Hinnant1c936782011-06-03 19:40:40 +00003381 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00003382{
3383 __x.swap(__y);
3384}
3385
Marshall Clow29b53f22018-12-14 18:49:35 +00003386#if _LIBCPP_STD_VER > 17
3387template <class _Tp, class _Allocator, class _Up>
3388inline _LIBCPP_INLINE_VISIBILITY
3389void erase(vector<_Tp, _Allocator>& __c, const _Up& __v)
3390{ __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end()); }
3391
3392template <class _Tp, class _Allocator, class _Predicate>
3393inline _LIBCPP_INLINE_VISIBILITY
3394void erase_if(vector<_Tp, _Allocator>& __c, _Predicate __pred)
3395{ __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end()); }
3396#endif
3397
Howard Hinnantc51e1022010-05-11 19:42:16 +00003398_LIBCPP_END_NAMESPACE_STD
3399
Eric Fiselierf4433a32017-05-31 22:07:49 +00003400_LIBCPP_POP_MACROS
3401
Howard Hinnantc51e1022010-05-11 19:42:16 +00003402#endif // _LIBCPP_VECTOR