blob: a07243a13455d5b16ad93c5f273c568a38c83087 [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>
Louis Dionne53dca682019-08-28 18:10:39 +0000300class _LIBCPP_TEMPLATE_VIS __vector_base_common
Howard Hinnantc51e1022010-05-11 19:42:16 +0000301{
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();
Eric Fiselier84de91c2019-08-30 19:01:03 +0000951 __alloc_traits::__construct_backward_with_exception_guarantees(
952 this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000953 _VSTD::swap(this->__begin_, __v.__begin_);
954 _VSTD::swap(this->__end_, __v.__end_);
955 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000956 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000957 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000958 __invalidate_all_iterators();
959}
960
961template <class _Tp, class _Allocator>
962typename vector<_Tp, _Allocator>::pointer
963vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
964{
Marshall Clow2cd9d372014-05-08 14:14:06 +0000965 __annotate_delete();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000966 pointer __r = __v.__begin_;
Eric Fiselier84de91c2019-08-30 19:01:03 +0000967 __alloc_traits::__construct_backward_with_exception_guarantees(
968 this->__alloc(), this->__begin_, __p, __v.__begin_);
969 __alloc_traits::__construct_forward_with_exception_guarantees(
970 this->__alloc(), __p, this->__end_, __v.__end_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000971 _VSTD::swap(this->__begin_, __v.__begin_);
972 _VSTD::swap(this->__end_, __v.__end_);
973 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000974 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000975 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000976 __invalidate_all_iterators();
977 return __r;
978}
979
980// Allocate space for __n objects
981// throws length_error if __n > max_size()
982// throws (probably bad_alloc) if memory run out
983// Precondition: __begin_ == __end_ == __end_cap() == 0
984// Precondition: __n > 0
985// Postcondition: capacity() == __n
986// Postcondition: size() == 0
987template <class _Tp, class _Allocator>
988void
Marshall Clow3ff48e02018-05-22 16:20:28 +0000989vector<_Tp, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000990{
991 if (__n > max_size())
992 this->__throw_length_error();
993 this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
994 this->__end_cap() = this->__begin_ + __n;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000995 __annotate_new(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000996}
997
998template <class _Tp, class _Allocator>
999void
Marshall Clow3ff48e02018-05-22 16:20:28 +00001000vector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001001{
Howard Hinnant76053d72013-06-27 19:35:32 +00001002 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001003 {
1004 clear();
1005 __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
Howard Hinnant76053d72013-06-27 19:35:32 +00001006 this->__begin_ = this->__end_ = this->__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001007 }
1008}
1009
1010template <class _Tp, class _Allocator>
1011typename vector<_Tp, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +00001012vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001013{
Eric Fiselierb5d9f442016-11-23 01:18:56 +00001014 return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()),
1015 numeric_limits<difference_type>::max());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001016}
1017
1018// Precondition: __new_size > capacity()
1019template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001020inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001021typename vector<_Tp, _Allocator>::size_type
1022vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
1023{
1024 const size_type __ms = max_size();
1025 if (__new_size > __ms)
1026 this->__throw_length_error();
1027 const size_type __cap = capacity();
1028 if (__cap >= __ms / 2)
1029 return __ms;
Alexis Hunt991d29b2011-07-29 23:31:58 +00001030 return _VSTD::max<size_type>(2*__cap, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001031}
1032
1033// Default constructs __n objects starting at __end_
1034// throws if construction throws
1035// Precondition: __n > 0
1036// Precondition: size() + __n <= capacity()
1037// Postcondition: size() == size() + __n
1038template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001039void
1040vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
1041{
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001042 _ConstructTransaction __tx(*this, __n);
1043 for (; __tx.__pos_ != __tx.__new_end_; ++__tx.__pos_) {
1044 __alloc_traits::construct(this->__alloc(), _VSTD::__to_raw_pointer(__tx.__pos_));
1045 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001046}
1047
Howard Hinnantc51e1022010-05-11 19:42:16 +00001048// Copy constructs __n objects starting at __end_ from __x
1049// throws if construction throws
1050// Precondition: __n > 0
1051// Precondition: size() + __n <= capacity()
1052// Postcondition: size() == old size() + __n
1053// Postcondition: [i] == __x for all i in [size() - __n, __n)
1054template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001055inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001056void
1057vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
1058{
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001059 _ConstructTransaction __tx(*this, __n);
1060 for (; __tx.__pos_ != __tx.__new_end_; ++__tx.__pos_) {
1061 __alloc_traits::construct(this->__alloc(), _VSTD::__to_raw_pointer(__tx.__pos_), __x);
1062 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001063}
1064
1065template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001066template <class _ForwardIterator>
1067typename enable_if
1068<
1069 __is_forward_iterator<_ForwardIterator>::value,
1070 void
1071>::type
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001072vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001073{
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001074 _ConstructTransaction __tx(*this, __n);
1075 __alloc_traits::__construct_range_forward(this->__alloc(), __first, __last, __tx.__pos_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001076}
1077
1078// Default constructs __n objects starting at __end_
1079// throws if construction throws
1080// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001081// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001082template <class _Tp, class _Allocator>
1083void
1084vector<_Tp, _Allocator>::__append(size_type __n)
1085{
1086 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1087 this->__construct_at_end(__n);
1088 else
1089 {
1090 allocator_type& __a = this->__alloc();
1091 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1092 __v.__construct_at_end(__n);
1093 __swap_out_circular_buffer(__v);
1094 }
1095}
1096
1097// Default constructs __n objects starting at __end_
1098// throws if construction throws
1099// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001100// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001101template <class _Tp, class _Allocator>
1102void
1103vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
1104{
1105 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1106 this->__construct_at_end(__n, __x);
1107 else
1108 {
1109 allocator_type& __a = this->__alloc();
1110 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1111 __v.__construct_at_end(__n, __x);
1112 __swap_out_circular_buffer(__v);
1113 }
1114}
1115
1116template <class _Tp, class _Allocator>
1117vector<_Tp, _Allocator>::vector(size_type __n)
1118{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001119#if _LIBCPP_DEBUG_LEVEL >= 2
1120 __get_db()->__insert_c(this);
1121#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001122 if (__n > 0)
1123 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001124 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001125 __construct_at_end(__n);
1126 }
1127}
1128
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001129#if _LIBCPP_STD_VER > 11
1130template <class _Tp, class _Allocator>
1131vector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a)
1132 : __base(__a)
1133{
1134#if _LIBCPP_DEBUG_LEVEL >= 2
1135 __get_db()->__insert_c(this);
1136#endif
1137 if (__n > 0)
1138 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001139 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001140 __construct_at_end(__n);
1141 }
1142}
1143#endif
1144
Howard Hinnantc51e1022010-05-11 19:42:16 +00001145template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001146vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001147{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001148#if _LIBCPP_DEBUG_LEVEL >= 2
1149 __get_db()->__insert_c(this);
1150#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001151 if (__n > 0)
1152 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001153 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001154 __construct_at_end(__n, __x);
1155 }
1156}
1157
1158template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001159vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001160 : __base(__a)
1161{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001162#if _LIBCPP_DEBUG_LEVEL >= 2
1163 __get_db()->__insert_c(this);
1164#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001165 if (__n > 0)
1166 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001167 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001168 __construct_at_end(__n, __x);
1169 }
1170}
1171
1172template <class _Tp, class _Allocator>
1173template <class _InputIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001174vector<_Tp, _Allocator>::vector(_InputIterator __first,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001175 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001176 !__is_forward_iterator<_InputIterator>::value &&
1177 is_constructible<
1178 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001179 typename iterator_traits<_InputIterator>::reference>::value,
1180 _InputIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001181{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001182#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001183 __get_db()->__insert_c(this);
1184#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001185 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001186 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001187}
1188
1189template <class _Tp, class _Allocator>
1190template <class _InputIterator>
1191vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
1192 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001193 !__is_forward_iterator<_InputIterator>::value &&
1194 is_constructible<
1195 value_type,
1196 typename iterator_traits<_InputIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001197 : __base(__a)
1198{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001199#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001200 __get_db()->__insert_c(this);
1201#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001202 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001203 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001204}
1205
1206template <class _Tp, class _Allocator>
1207template <class _ForwardIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001208vector<_Tp, _Allocator>::vector(_ForwardIterator __first,
Howard Hinnant88010252013-03-28 17:44:32 +00001209 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1210 is_constructible<
1211 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001212 typename iterator_traits<_ForwardIterator>::reference>::value,
1213 _ForwardIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001214{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001215#if _LIBCPP_DEBUG_LEVEL >= 2
1216 __get_db()->__insert_c(this);
1217#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001218 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001219 if (__n > 0)
1220 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001221 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001222 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001223 }
1224}
1225
1226template <class _Tp, class _Allocator>
1227template <class _ForwardIterator>
1228vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant88010252013-03-28 17:44:32 +00001229 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1230 is_constructible<
1231 value_type,
1232 typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001233 : __base(__a)
1234{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001235#if _LIBCPP_DEBUG_LEVEL >= 2
1236 __get_db()->__insert_c(this);
1237#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001238 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001239 if (__n > 0)
1240 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001241 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001242 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001243 }
1244}
1245
1246template <class _Tp, class _Allocator>
1247vector<_Tp, _Allocator>::vector(const vector& __x)
1248 : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
1249{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001250#if _LIBCPP_DEBUG_LEVEL >= 2
1251 __get_db()->__insert_c(this);
1252#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001253 size_type __n = __x.size();
1254 if (__n > 0)
1255 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001256 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001257 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001258 }
1259}
1260
1261template <class _Tp, class _Allocator>
1262vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a)
1263 : __base(__a)
1264{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001265#if _LIBCPP_DEBUG_LEVEL >= 2
1266 __get_db()->__insert_c(this);
1267#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001268 size_type __n = __x.size();
1269 if (__n > 0)
1270 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001271 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001272 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001273 }
1274}
1275
Eric Fiseliered9e9362017-04-16 02:40:45 +00001276#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001277
1278template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001279inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001280vector<_Tp, _Allocator>::vector(vector&& __x)
Marshall Clowe5108202015-07-14 14:46:32 +00001281#if _LIBCPP_STD_VER > 14
1282 _NOEXCEPT
1283#else
Howard Hinnant1c936782011-06-03 19:40:40 +00001284 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00001285#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001286 : __base(_VSTD::move(__x.__alloc()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001287{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001288#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001289 __get_db()->__insert_c(this);
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001290 __get_db()->swap(this, &__x);
Howard Hinnant27e0e772011-09-14 18:33:51 +00001291#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001292 this->__begin_ = __x.__begin_;
1293 this->__end_ = __x.__end_;
1294 this->__end_cap() = __x.__end_cap();
Howard Hinnant76053d72013-06-27 19:35:32 +00001295 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001296}
1297
1298template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001299inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001300vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a)
1301 : __base(__a)
1302{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001303#if _LIBCPP_DEBUG_LEVEL >= 2
1304 __get_db()->__insert_c(this);
1305#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001306 if (__a == __x.__alloc())
1307 {
1308 this->__begin_ = __x.__begin_;
1309 this->__end_ = __x.__end_;
1310 this->__end_cap() = __x.__end_cap();
1311 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001312#if _LIBCPP_DEBUG_LEVEL >= 2
1313 __get_db()->swap(this, &__x);
1314#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001315 }
1316 else
1317 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001318 typedef move_iterator<iterator> _Ip;
1319 assign(_Ip(__x.begin()), _Ip(__x.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001320 }
1321}
1322
1323template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001324inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001325vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
1326{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001327#if _LIBCPP_DEBUG_LEVEL >= 2
1328 __get_db()->__insert_c(this);
1329#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001330 if (__il.size() > 0)
1331 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001332 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001333 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001334 }
1335}
1336
1337template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001338inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001339vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
1340 : __base(__a)
1341{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001342#if _LIBCPP_DEBUG_LEVEL >= 2
1343 __get_db()->__insert_c(this);
1344#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001345 if (__il.size() > 0)
1346 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001347 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001348 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001349 }
1350}
1351
1352template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001353inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001354vector<_Tp, _Allocator>&
1355vector<_Tp, _Allocator>::operator=(vector&& __x)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001356 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001357{
1358 __move_assign(__x, integral_constant<bool,
1359 __alloc_traits::propagate_on_container_move_assignment::value>());
1360 return *this;
1361}
1362
1363template <class _Tp, class _Allocator>
1364void
1365vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001366 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001367{
1368 if (__base::__alloc() != __c.__alloc())
1369 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001370 typedef move_iterator<iterator> _Ip;
1371 assign(_Ip(__c.begin()), _Ip(__c.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001372 }
1373 else
1374 __move_assign(__c, true_type());
1375}
1376
1377template <class _Tp, class _Allocator>
1378void
1379vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00001380 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001381{
Marshall Clow3ff48e02018-05-22 16:20:28 +00001382 __vdeallocate();
Marshall Clow136d45c2014-07-21 15:11:13 +00001383 __base::__move_assign_alloc(__c); // this can throw
Howard Hinnantc51e1022010-05-11 19:42:16 +00001384 this->__begin_ = __c.__begin_;
1385 this->__end_ = __c.__end_;
1386 this->__end_cap() = __c.__end_cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001387 __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001388#if _LIBCPP_DEBUG_LEVEL >= 2
1389 __get_db()->swap(this, &__c);
1390#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001391}
1392
Eric Fiseliered9e9362017-04-16 02:40:45 +00001393#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001394
1395template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001396inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001397vector<_Tp, _Allocator>&
1398vector<_Tp, _Allocator>::operator=(const vector& __x)
1399{
1400 if (this != &__x)
1401 {
1402 __base::__copy_assign_alloc(__x);
1403 assign(__x.__begin_, __x.__end_);
1404 }
1405 return *this;
1406}
1407
1408template <class _Tp, class _Allocator>
1409template <class _InputIterator>
1410typename enable_if
1411<
1412 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001413 !__is_forward_iterator<_InputIterator>::value &&
1414 is_constructible<
1415 _Tp,
1416 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001417 void
1418>::type
1419vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1420{
1421 clear();
1422 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001423 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001424}
1425
1426template <class _Tp, class _Allocator>
1427template <class _ForwardIterator>
1428typename enable_if
1429<
Howard Hinnant88010252013-03-28 17:44:32 +00001430 __is_forward_iterator<_ForwardIterator>::value &&
1431 is_constructible<
1432 _Tp,
1433 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001434 void
1435>::type
1436vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
1437{
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001438 size_type __new_size = static_cast<size_type>(_VSTD::distance(__first, __last));
1439 if (__new_size <= capacity())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001440 {
1441 _ForwardIterator __mid = __last;
1442 bool __growing = false;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001443 if (__new_size > size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001444 {
1445 __growing = true;
1446 __mid = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001447 _VSTD::advance(__mid, size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001448 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001449 pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001450 if (__growing)
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001451 __construct_at_end(__mid, __last, __new_size - size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001452 else
1453 this->__destruct_at_end(__m);
1454 }
1455 else
1456 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001457 __vdeallocate();
1458 __vallocate(__recommend(__new_size));
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001459 __construct_at_end(__first, __last, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001460 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001461 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001462}
1463
1464template <class _Tp, class _Allocator>
1465void
1466vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
1467{
1468 if (__n <= capacity())
1469 {
1470 size_type __s = size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001471 _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001472 if (__n > __s)
1473 __construct_at_end(__n - __s, __u);
1474 else
Howard Hinnant155c2af2010-05-24 17:49:41 +00001475 this->__destruct_at_end(this->__begin_ + __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001476 }
1477 else
1478 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001479 __vdeallocate();
1480 __vallocate(__recommend(static_cast<size_type>(__n)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001481 __construct_at_end(__n, __u);
1482 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001483 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001484}
1485
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001486template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001487inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001488typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001489vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001490{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001491#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001492 return iterator(this, __p);
1493#else
1494 return iterator(__p);
1495#endif
1496}
1497
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001498template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001499inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001500typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001501vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001502{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001503#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001504 return const_iterator(this, __p);
1505#else
1506 return const_iterator(__p);
1507#endif
1508}
1509
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001510template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001511inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001512typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001513vector<_Tp, _Allocator>::begin() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001514{
1515 return __make_iter(this->__begin_);
1516}
1517
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001518template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001519inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001520typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001521vector<_Tp, _Allocator>::begin() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001522{
1523 return __make_iter(this->__begin_);
1524}
1525
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001526template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001527inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001528typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001529vector<_Tp, _Allocator>::end() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001530{
1531 return __make_iter(this->__end_);
1532}
1533
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001534template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001535inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001536typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001537vector<_Tp, _Allocator>::end() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001538{
1539 return __make_iter(this->__end_);
1540}
1541
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001542template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001543inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001544typename vector<_Tp, _Allocator>::reference
Marshall Clowd6470492019-03-15 00:29:35 +00001545vector<_Tp, _Allocator>::operator[](size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001546{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001547 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001548 return this->__begin_[__n];
1549}
1550
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001551template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001552inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001553typename vector<_Tp, _Allocator>::const_reference
Marshall Clowd6470492019-03-15 00:29:35 +00001554vector<_Tp, _Allocator>::operator[](size_type __n) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001555{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001556 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001557 return this->__begin_[__n];
1558}
1559
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001560template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001561typename vector<_Tp, _Allocator>::reference
1562vector<_Tp, _Allocator>::at(size_type __n)
1563{
1564 if (__n >= size())
1565 this->__throw_out_of_range();
1566 return this->__begin_[__n];
1567}
1568
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001569template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001570typename vector<_Tp, _Allocator>::const_reference
1571vector<_Tp, _Allocator>::at(size_type __n) const
1572{
1573 if (__n >= size())
1574 this->__throw_out_of_range();
1575 return this->__begin_[__n];
1576}
1577
1578template <class _Tp, class _Allocator>
1579void
1580vector<_Tp, _Allocator>::reserve(size_type __n)
1581{
1582 if (__n > capacity())
1583 {
1584 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001585 __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001586 __swap_out_circular_buffer(__v);
1587 }
1588}
1589
1590template <class _Tp, class _Allocator>
1591void
Howard Hinnant1c936782011-06-03 19:40:40 +00001592vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001593{
1594 if (capacity() > size())
1595 {
1596#ifndef _LIBCPP_NO_EXCEPTIONS
1597 try
1598 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001599#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001600 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001601 __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001602 __swap_out_circular_buffer(__v);
1603#ifndef _LIBCPP_NO_EXCEPTIONS
1604 }
1605 catch (...)
1606 {
1607 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001608#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001609 }
1610}
1611
1612template <class _Tp, class _Allocator>
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001613template <class _Up>
1614void
Eric Fiseliered9e9362017-04-16 02:40:45 +00001615#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001616vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
1617#else
1618vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
1619#endif
1620{
1621 allocator_type& __a = this->__alloc();
1622 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1623 // __v.push_back(_VSTD::forward<_Up>(__x));
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001624 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Up>(__x));
1625 __v.__end_++;
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001626 __swap_out_circular_buffer(__v);
1627}
1628
1629template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001630inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001631void
1632vector<_Tp, _Allocator>::push_back(const_reference __x)
1633{
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001634 if (this->__end_ != this->__end_cap())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001635 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001636 __construct_one_at_end(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001637 }
1638 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001639 __push_back_slow_path(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001640}
1641
Eric Fiseliered9e9362017-04-16 02:40:45 +00001642#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001643
1644template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001645inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001646void
1647vector<_Tp, _Allocator>::push_back(value_type&& __x)
1648{
1649 if (this->__end_ < this->__end_cap())
1650 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001651 __construct_one_at_end(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001652 }
1653 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001654 __push_back_slow_path(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001655}
1656
1657template <class _Tp, class _Allocator>
1658template <class... _Args>
1659void
Howard Hinnantb6c49562012-02-26 15:30:12 +00001660vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1661{
1662 allocator_type& __a = this->__alloc();
1663 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1664// __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001665 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Args>(__args)...);
1666 __v.__end_++;
Howard Hinnantb6c49562012-02-26 15:30:12 +00001667 __swap_out_circular_buffer(__v);
1668}
1669
1670template <class _Tp, class _Allocator>
1671template <class... _Args>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001672inline
Marshall Clowea52cc42017-01-24 23:09:12 +00001673#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001674typename vector<_Tp, _Allocator>::reference
Marshall Clowea52cc42017-01-24 23:09:12 +00001675#else
1676void
1677#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001678vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1679{
1680 if (this->__end_ < this->__end_cap())
1681 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001682 __construct_one_at_end(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001683 }
1684 else
Howard Hinnantb6c49562012-02-26 15:30:12 +00001685 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
Marshall Clowea52cc42017-01-24 23:09:12 +00001686#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001687 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00001688#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001689}
1690
Eric Fiseliered9e9362017-04-16 02:40:45 +00001691#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001692
1693template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001694inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001695void
1696vector<_Tp, _Allocator>::pop_back()
1697{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001698 _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001699 this->__destruct_at_end(this->__end_ - 1);
1700}
1701
1702template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001703inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001704typename vector<_Tp, _Allocator>::iterator
1705vector<_Tp, _Allocator>::erase(const_iterator __position)
1706{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001707#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001708 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1709 "vector::erase(iterator) called with an iterator not"
1710 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001711#endif
Howard Hinnant58d52d52013-03-25 22:12:26 +00001712 _LIBCPP_ASSERT(__position != end(),
1713 "vector::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnant76053d72013-06-27 19:35:32 +00001714 difference_type __ps = __position - cbegin();
1715 pointer __p = this->__begin_ + __ps;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001716 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001717 this->__invalidate_iterators_past(__p-1);
1718 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001719 return __r;
1720}
1721
1722template <class _Tp, class _Allocator>
1723typename vector<_Tp, _Allocator>::iterator
1724vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1725{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001726#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001727 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
1728 "vector::erase(iterator, iterator) called with an iterator not"
1729 " referring to this vector");
Eric Fiselier69c51982016-12-28 06:06:09 +00001730 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this,
1731 "vector::erase(iterator, iterator) called with an iterator not"
1732 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001733#endif
Howard Hinnant27e0e772011-09-14 18:33:51 +00001734 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001735 pointer __p = this->__begin_ + (__first - begin());
Eric Fiselier69c51982016-12-28 06:06:09 +00001736 if (__first != __last) {
Howard Hinnantc580cc32013-04-18 15:02:57 +00001737 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001738 this->__invalidate_iterators_past(__p - 1);
1739 }
1740 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001741 return __r;
1742}
1743
1744template <class _Tp, class _Allocator>
1745void
1746vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1747{
1748 pointer __old_last = this->__end_;
1749 difference_type __n = __old_last - __to;
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001750 {
1751 pointer __i = __from_s + __n;
1752 _ConstructTransaction __tx(*this, __from_e - __i);
1753 for (; __i < __from_e; ++__i, ++__tx.__pos_) {
1754 __alloc_traits::construct(this->__alloc(),
1755 _VSTD::__to_raw_pointer(__tx.__pos_),
1756 _VSTD::move(*__i));
1757 }
1758 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001759 _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001760}
1761
1762template <class _Tp, class _Allocator>
1763typename vector<_Tp, _Allocator>::iterator
1764vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1765{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001766#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001767 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1768 "vector::insert(iterator, x) called with an iterator not"
1769 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001770#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001771 pointer __p = this->__begin_ + (__position - begin());
1772 if (this->__end_ < this->__end_cap())
1773 {
1774 if (__p == this->__end_)
1775 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001776 __construct_one_at_end(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001777 }
1778 else
1779 {
1780 __move_range(__p, this->__end_, __p + 1);
1781 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1782 if (__p <= __xr && __xr < this->__end_)
1783 ++__xr;
1784 *__p = *__xr;
1785 }
1786 }
1787 else
1788 {
1789 allocator_type& __a = this->__alloc();
1790 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1791 __v.push_back(__x);
1792 __p = __swap_out_circular_buffer(__v, __p);
1793 }
1794 return __make_iter(__p);
1795}
1796
Eric Fiseliered9e9362017-04-16 02:40:45 +00001797#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001798
1799template <class _Tp, class _Allocator>
1800typename vector<_Tp, _Allocator>::iterator
1801vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1802{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001803#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001804 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1805 "vector::insert(iterator, x) called with an iterator not"
1806 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001807#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001808 pointer __p = this->__begin_ + (__position - begin());
1809 if (this->__end_ < this->__end_cap())
1810 {
1811 if (__p == this->__end_)
1812 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001813 __construct_one_at_end(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001814 }
1815 else
1816 {
1817 __move_range(__p, this->__end_, __p + 1);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001818 *__p = _VSTD::move(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001819 }
1820 }
1821 else
1822 {
1823 allocator_type& __a = this->__alloc();
1824 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001825 __v.push_back(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001826 __p = __swap_out_circular_buffer(__v, __p);
1827 }
1828 return __make_iter(__p);
1829}
1830
1831template <class _Tp, class _Allocator>
1832template <class... _Args>
1833typename vector<_Tp, _Allocator>::iterator
1834vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1835{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001836#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001837 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1838 "vector::emplace(iterator, x) called with an iterator not"
1839 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001840#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001841 pointer __p = this->__begin_ + (__position - begin());
1842 if (this->__end_ < this->__end_cap())
1843 {
1844 if (__p == this->__end_)
1845 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001846 __construct_one_at_end(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001847 }
1848 else
1849 {
Marshall Clowa591b9a2016-07-11 21:38:08 +00001850 __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001851 __move_range(__p, this->__end_, __p + 1);
Marshall Clowa591b9a2016-07-11 21:38:08 +00001852 *__p = _VSTD::move(__tmp.get());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001853 }
1854 }
1855 else
1856 {
1857 allocator_type& __a = this->__alloc();
1858 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001859 __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001860 __p = __swap_out_circular_buffer(__v, __p);
1861 }
1862 return __make_iter(__p);
1863}
1864
Eric Fiseliered9e9362017-04-16 02:40:45 +00001865#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001866
1867template <class _Tp, class _Allocator>
1868typename vector<_Tp, _Allocator>::iterator
1869vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1870{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001871#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001872 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1873 "vector::insert(iterator, n, x) called with an iterator not"
1874 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001875#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001876 pointer __p = this->__begin_ + (__position - begin());
1877 if (__n > 0)
1878 {
1879 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1880 {
1881 size_type __old_n = __n;
1882 pointer __old_last = this->__end_;
1883 if (__n > static_cast<size_type>(this->__end_ - __p))
1884 {
1885 size_type __cx = __n - (this->__end_ - __p);
1886 __construct_at_end(__cx, __x);
1887 __n -= __cx;
1888 }
1889 if (__n > 0)
1890 {
1891 __move_range(__p, __old_last, __p + __old_n);
1892 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1893 if (__p <= __xr && __xr < this->__end_)
1894 __xr += __old_n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001895 _VSTD::fill_n(__p, __n, *__xr);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001896 }
1897 }
1898 else
1899 {
1900 allocator_type& __a = this->__alloc();
1901 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1902 __v.__construct_at_end(__n, __x);
1903 __p = __swap_out_circular_buffer(__v, __p);
1904 }
1905 }
1906 return __make_iter(__p);
1907}
1908
1909template <class _Tp, class _Allocator>
1910template <class _InputIterator>
1911typename enable_if
1912<
1913 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001914 !__is_forward_iterator<_InputIterator>::value &&
1915 is_constructible<
1916 _Tp,
1917 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001918 typename vector<_Tp, _Allocator>::iterator
1919>::type
1920vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1921{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001922#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001923 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1924 "vector::insert(iterator, range) called with an iterator not"
1925 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001926#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001927 difference_type __off = __position - begin();
1928 pointer __p = this->__begin_ + __off;
1929 allocator_type& __a = this->__alloc();
1930 pointer __old_last = this->__end_;
1931 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1932 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001933 __construct_one_at_end(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001934 }
1935 __split_buffer<value_type, allocator_type&> __v(__a);
1936 if (__first != __last)
1937 {
1938#ifndef _LIBCPP_NO_EXCEPTIONS
1939 try
1940 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001941#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001942 __v.__construct_at_end(__first, __last);
1943 difference_type __old_size = __old_last - this->__begin_;
1944 difference_type __old_p = __p - this->__begin_;
1945 reserve(__recommend(size() + __v.size()));
1946 __p = this->__begin_ + __old_p;
1947 __old_last = this->__begin_ + __old_size;
1948#ifndef _LIBCPP_NO_EXCEPTIONS
1949 }
1950 catch (...)
1951 {
1952 erase(__make_iter(__old_last), end());
1953 throw;
1954 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001955#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001956 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001957 __p = _VSTD::rotate(__p, __old_last, this->__end_);
Howard Hinnant9cd22302011-09-16 18:41:29 +00001958 insert(__make_iter(__p), make_move_iterator(__v.begin()),
1959 make_move_iterator(__v.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001960 return begin() + __off;
1961}
1962
1963template <class _Tp, class _Allocator>
1964template <class _ForwardIterator>
1965typename enable_if
1966<
Howard Hinnant88010252013-03-28 17:44:32 +00001967 __is_forward_iterator<_ForwardIterator>::value &&
1968 is_constructible<
1969 _Tp,
1970 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001971 typename vector<_Tp, _Allocator>::iterator
1972>::type
1973vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1974{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001975#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001976 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1977 "vector::insert(iterator, range) called with an iterator not"
1978 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001979#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001980 pointer __p = this->__begin_ + (__position - begin());
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001981 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001982 if (__n > 0)
1983 {
1984 if (__n <= this->__end_cap() - this->__end_)
1985 {
1986 size_type __old_n = __n;
1987 pointer __old_last = this->__end_;
1988 _ForwardIterator __m = __last;
1989 difference_type __dx = this->__end_ - __p;
1990 if (__n > __dx)
1991 {
1992 __m = __first;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001993 difference_type __diff = this->__end_ - __p;
1994 _VSTD::advance(__m, __diff);
1995 __construct_at_end(__m, __last, __n - __diff);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001996 __n = __dx;
1997 }
1998 if (__n > 0)
1999 {
2000 __move_range(__p, __old_last, __p + __old_n);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002001 _VSTD::copy(__first, __m, __p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002002 }
2003 }
2004 else
2005 {
2006 allocator_type& __a = this->__alloc();
2007 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
2008 __v.__construct_at_end(__first, __last);
2009 __p = __swap_out_circular_buffer(__v, __p);
2010 }
2011 }
2012 return __make_iter(__p);
2013}
2014
2015template <class _Tp, class _Allocator>
2016void
2017vector<_Tp, _Allocator>::resize(size_type __sz)
2018{
2019 size_type __cs = size();
2020 if (__cs < __sz)
2021 this->__append(__sz - __cs);
2022 else if (__cs > __sz)
2023 this->__destruct_at_end(this->__begin_ + __sz);
2024}
2025
2026template <class _Tp, class _Allocator>
2027void
2028vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
2029{
2030 size_type __cs = size();
2031 if (__cs < __sz)
2032 this->__append(__sz - __cs, __x);
2033 else if (__cs > __sz)
2034 this->__destruct_at_end(this->__begin_ + __sz);
2035}
2036
2037template <class _Tp, class _Allocator>
2038void
2039vector<_Tp, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002040#if _LIBCPP_STD_VER >= 14
Eric Fiselier873b8d32019-03-18 21:50:12 +00002041 _NOEXCEPT
Marshall Clow8982dcd2015-07-13 20:04:56 +00002042#else
Eric Fiselier873b8d32019-03-18 21:50:12 +00002043 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002044 __is_nothrow_swappable<allocator_type>::value)
2045#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002046{
Howard Hinnant27e0e772011-09-14 18:33:51 +00002047 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
2048 this->__alloc() == __x.__alloc(),
2049 "vector::swap: Either propagate_on_container_swap must be true"
2050 " or the allocators must compare equal");
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002051 _VSTD::swap(this->__begin_, __x.__begin_);
2052 _VSTD::swap(this->__end_, __x.__end_);
2053 _VSTD::swap(this->__end_cap(), __x.__end_cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00002054 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00002055 integral_constant<bool,__alloc_traits::propagate_on_container_swap::value>());
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002056#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002057 __get_db()->swap(this, &__x);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002058#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002059}
2060
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002061template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002062bool
2063vector<_Tp, _Allocator>::__invariants() const
2064{
Howard Hinnant76053d72013-06-27 19:35:32 +00002065 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002066 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002067 if (this->__end_ != nullptr || this->__end_cap() != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002068 return false;
2069 }
2070 else
2071 {
2072 if (this->__begin_ > this->__end_)
2073 return false;
2074 if (this->__begin_ == this->__end_cap())
2075 return false;
2076 if (this->__end_ > this->__end_cap())
2077 return false;
2078 }
2079 return true;
2080}
2081
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002082#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002083
Howard Hinnantc51e1022010-05-11 19:42:16 +00002084template <class _Tp, class _Allocator>
Howard Hinnant27e0e772011-09-14 18:33:51 +00002085bool
2086vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
2087{
2088 return this->__begin_ <= __i->base() && __i->base() < this->__end_;
2089}
2090
2091template <class _Tp, class _Allocator>
2092bool
2093vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
2094{
2095 return this->__begin_ < __i->base() && __i->base() <= this->__end_;
2096}
2097
2098template <class _Tp, class _Allocator>
2099bool
2100vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
2101{
2102 const_pointer __p = __i->base() + __n;
2103 return this->__begin_ <= __p && __p <= this->__end_;
2104}
2105
2106template <class _Tp, class _Allocator>
2107bool
2108vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2109{
2110 const_pointer __p = __i->base() + __n;
2111 return this->__begin_ <= __p && __p < this->__end_;
2112}
2113
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002114#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002115
2116template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002117inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002118void
2119vector<_Tp, _Allocator>::__invalidate_all_iterators()
2120{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002121#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002122 __get_db()->__invalidate_all(this);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002123#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002124}
2125
Eric Fiselier69c51982016-12-28 06:06:09 +00002126
2127template <class _Tp, class _Allocator>
2128inline _LIBCPP_INLINE_VISIBILITY
2129void
2130vector<_Tp, _Allocator>::__invalidate_iterators_past(pointer __new_last) {
2131#if _LIBCPP_DEBUG_LEVEL >= 2
2132 __c_node* __c = __get_db()->__find_c_and_lock(this);
2133 for (__i_node** __p = __c->end_; __p != __c->beg_; ) {
2134 --__p;
2135 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
2136 if (__i->base() > __new_last) {
2137 (*__p)->__c_ = nullptr;
2138 if (--__c->end_ != __p)
2139 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
2140 }
2141 }
2142 __get_db()->unlock();
2143#else
2144 ((void)__new_last);
2145#endif
2146}
2147
Howard Hinnantc51e1022010-05-11 19:42:16 +00002148// vector<bool>
2149
2150template <class _Allocator> class vector<bool, _Allocator>;
2151
2152template <class _Allocator> struct hash<vector<bool, _Allocator> >;
2153
2154template <class _Allocator>
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002155struct __has_storage_type<vector<bool, _Allocator> >
2156{
2157 static const bool value = true;
2158};
2159
2160template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002161class _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002162 : private __vector_base_common<true>
2163{
2164public:
2165 typedef vector __self;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002166 typedef bool value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002167 typedef _Allocator allocator_type;
2168 typedef allocator_traits<allocator_type> __alloc_traits;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002169 typedef typename __alloc_traits::size_type size_type;
2170 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant896b7622012-05-07 16:50:38 +00002171 typedef size_type __storage_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002172 typedef __bit_iterator<vector, false> pointer;
2173 typedef __bit_iterator<vector, true> const_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002174 typedef pointer iterator;
2175 typedef const_pointer const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002176 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
2177 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002178
2179private:
Marshall Clow940e01c2015-04-07 05:21:38 +00002180 typedef typename __rebind_alloc_helper<__alloc_traits, __storage_type>::type __storage_allocator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002181 typedef allocator_traits<__storage_allocator> __storage_traits;
2182 typedef typename __storage_traits::pointer __storage_pointer;
2183 typedef typename __storage_traits::const_pointer __const_storage_pointer;
2184
2185 __storage_pointer __begin_;
2186 size_type __size_;
2187 __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002188public:
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002189 typedef __bit_reference<vector> reference;
2190 typedef __bit_const_reference<vector> const_reference;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002191private:
Howard Hinnant1c936782011-06-03 19:40:40 +00002192 _LIBCPP_INLINE_VISIBILITY
2193 size_type& __cap() _NOEXCEPT
2194 {return __cap_alloc_.first();}
2195 _LIBCPP_INLINE_VISIBILITY
2196 const size_type& __cap() const _NOEXCEPT
2197 {return __cap_alloc_.first();}
2198 _LIBCPP_INLINE_VISIBILITY
2199 __storage_allocator& __alloc() _NOEXCEPT
2200 {return __cap_alloc_.second();}
2201 _LIBCPP_INLINE_VISIBILITY
2202 const __storage_allocator& __alloc() const _NOEXCEPT
2203 {return __cap_alloc_.second();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002204
2205 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2206
Howard Hinnant1c936782011-06-03 19:40:40 +00002207 _LIBCPP_INLINE_VISIBILITY
2208 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002209 {return __n * __bits_per_word;}
Howard Hinnant1c936782011-06-03 19:40:40 +00002210 _LIBCPP_INLINE_VISIBILITY
2211 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002212 {return (__n - 1) / __bits_per_word + 1;}
2213
2214public:
Howard Hinnant1c936782011-06-03 19:40:40 +00002215 _LIBCPP_INLINE_VISIBILITY
Marshall Clowe546cbb2015-06-04 02:05:41 +00002216 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Marshall Clow8f282f42015-06-04 00:10:20 +00002217
2218 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
2219#if _LIBCPP_STD_VER <= 14
2220 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
2221#else
2222 _NOEXCEPT;
2223#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002224 ~vector();
2225 explicit vector(size_type __n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002226#if _LIBCPP_STD_VER > 11
2227 explicit vector(size_type __n, const allocator_type& __a);
2228#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002229 vector(size_type __n, const value_type& __v);
2230 vector(size_type __n, const value_type& __v, const allocator_type& __a);
2231 template <class _InputIterator>
2232 vector(_InputIterator __first, _InputIterator __last,
2233 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2234 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2235 template <class _InputIterator>
2236 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2237 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2238 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2239 template <class _ForwardIterator>
2240 vector(_ForwardIterator __first, _ForwardIterator __last,
2241 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2242 template <class _ForwardIterator>
2243 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2244 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2245
2246 vector(const vector& __v);
2247 vector(const vector& __v, const allocator_type& __a);
2248 vector& operator=(const vector& __v);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002249
2250#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002251 vector(initializer_list<value_type> __il);
2252 vector(initializer_list<value_type> __il, const allocator_type& __a);
2253
Howard Hinnant1c936782011-06-03 19:40:40 +00002254 _LIBCPP_INLINE_VISIBILITY
2255 vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002256#if _LIBCPP_STD_VER > 14
2257 _NOEXCEPT;
2258#else
Howard Hinnant1c936782011-06-03 19:40:40 +00002259 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clowe5108202015-07-14 14:46:32 +00002260#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002261 vector(vector&& __v, const allocator_type& __a);
Howard Hinnant1c936782011-06-03 19:40:40 +00002262 _LIBCPP_INLINE_VISIBILITY
2263 vector& operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002264 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Eric Fiseliered9e9362017-04-16 02:40:45 +00002265
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002266 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002267 vector& operator=(initializer_list<value_type> __il)
2268 {assign(__il.begin(), __il.end()); return *this;}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002269
2270#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002271
2272 template <class _InputIterator>
2273 typename enable_if
2274 <
2275 __is_input_iterator<_InputIterator>::value &&
2276 !__is_forward_iterator<_InputIterator>::value,
2277 void
2278 >::type
2279 assign(_InputIterator __first, _InputIterator __last);
2280 template <class _ForwardIterator>
2281 typename enable_if
2282 <
2283 __is_forward_iterator<_ForwardIterator>::value,
2284 void
2285 >::type
2286 assign(_ForwardIterator __first, _ForwardIterator __last);
2287
2288 void assign(size_type __n, const value_type& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002289
2290#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002291 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002292 void assign(initializer_list<value_type> __il)
2293 {assign(__il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002294#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002295
Howard Hinnant1c936782011-06-03 19:40:40 +00002296 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002297 {return allocator_type(this->__alloc());}
2298
Howard Hinnant1c936782011-06-03 19:40:40 +00002299 size_type max_size() const _NOEXCEPT;
2300 _LIBCPP_INLINE_VISIBILITY
2301 size_type capacity() const _NOEXCEPT
2302 {return __internal_cap_to_external(__cap());}
2303 _LIBCPP_INLINE_VISIBILITY
2304 size_type size() const _NOEXCEPT
2305 {return __size_;}
Marshall Clow425f5752017-11-15 05:51:26 +00002306 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00002307 bool empty() const _NOEXCEPT
2308 {return __size_ == 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002309 void reserve(size_type __n);
Howard Hinnant1c936782011-06-03 19:40:40 +00002310 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002311
Howard Hinnant1c936782011-06-03 19:40:40 +00002312 _LIBCPP_INLINE_VISIBILITY
2313 iterator begin() _NOEXCEPT
2314 {return __make_iter(0);}
2315 _LIBCPP_INLINE_VISIBILITY
2316 const_iterator begin() const _NOEXCEPT
2317 {return __make_iter(0);}
2318 _LIBCPP_INLINE_VISIBILITY
2319 iterator end() _NOEXCEPT
2320 {return __make_iter(__size_);}
2321 _LIBCPP_INLINE_VISIBILITY
2322 const_iterator end() const _NOEXCEPT
2323 {return __make_iter(__size_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002324
Howard Hinnant1c936782011-06-03 19:40:40 +00002325 _LIBCPP_INLINE_VISIBILITY
2326 reverse_iterator rbegin() _NOEXCEPT
2327 {return reverse_iterator(end());}
2328 _LIBCPP_INLINE_VISIBILITY
2329 const_reverse_iterator rbegin() const _NOEXCEPT
2330 {return const_reverse_iterator(end());}
2331 _LIBCPP_INLINE_VISIBILITY
2332 reverse_iterator rend() _NOEXCEPT
2333 {return reverse_iterator(begin());}
2334 _LIBCPP_INLINE_VISIBILITY
2335 const_reverse_iterator rend() const _NOEXCEPT
2336 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002337
Howard Hinnant1c936782011-06-03 19:40:40 +00002338 _LIBCPP_INLINE_VISIBILITY
2339 const_iterator cbegin() const _NOEXCEPT
2340 {return __make_iter(0);}
2341 _LIBCPP_INLINE_VISIBILITY
2342 const_iterator cend() const _NOEXCEPT
2343 {return __make_iter(__size_);}
2344 _LIBCPP_INLINE_VISIBILITY
2345 const_reverse_iterator crbegin() const _NOEXCEPT
2346 {return rbegin();}
2347 _LIBCPP_INLINE_VISIBILITY
2348 const_reverse_iterator crend() const _NOEXCEPT
2349 {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002350
2351 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
2352 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2353 reference at(size_type __n);
2354 const_reference at(size_type __n) const;
2355
2356 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
2357 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2358 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
2359 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
2360
2361 void push_back(const value_type& __x);
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002362#if _LIBCPP_STD_VER > 11
2363 template <class... _Args>
Marshall Clowea52cc42017-01-24 23:09:12 +00002364#if _LIBCPP_STD_VER > 14
2365 _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args)
2366#else
2367 _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args)
2368#endif
2369 {
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002370 push_back ( value_type ( _VSTD::forward<_Args>(__args)... ));
Marshall Clowea52cc42017-01-24 23:09:12 +00002371#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002372 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00002373#endif
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002374 }
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002375#endif
2376
Howard Hinnantc51e1022010-05-11 19:42:16 +00002377 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2378
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002379#if _LIBCPP_STD_VER > 11
2380 template <class... _Args>
2381 _LIBCPP_INLINE_VISIBILITY iterator emplace(const_iterator position, _Args&&... __args)
2382 { return insert ( position, value_type ( _VSTD::forward<_Args>(__args)... )); }
2383#endif
2384
Howard Hinnantc51e1022010-05-11 19:42:16 +00002385 iterator insert(const_iterator __position, const value_type& __x);
2386 iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2387 iterator insert(const_iterator __position, size_type __n, const_reference __x);
2388 template <class _InputIterator>
2389 typename enable_if
2390 <
2391 __is_input_iterator <_InputIterator>::value &&
2392 !__is_forward_iterator<_InputIterator>::value,
2393 iterator
2394 >::type
2395 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2396 template <class _ForwardIterator>
2397 typename enable_if
2398 <
2399 __is_forward_iterator<_ForwardIterator>::value,
2400 iterator
2401 >::type
2402 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002403
2404#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002405 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002406 iterator insert(const_iterator __position, initializer_list<value_type> __il)
2407 {return insert(__position, __il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002408#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002409
Howard Hinnantcf823322010-12-17 14:46:43 +00002410 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002411 iterator erase(const_iterator __first, const_iterator __last);
2412
Howard Hinnant1c936782011-06-03 19:40:40 +00002413 _LIBCPP_INLINE_VISIBILITY
2414 void clear() _NOEXCEPT {__size_ = 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002415
Howard Hinnant1c936782011-06-03 19:40:40 +00002416 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002417#if _LIBCPP_STD_VER >= 14
2418 _NOEXCEPT;
2419#else
Eric Fiselier69c51982016-12-28 06:06:09 +00002420 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002421 __is_nothrow_swappable<allocator_type>::value);
2422#endif
Marshall Clow89eb3822016-04-07 14:20:31 +00002423 static void swap(reference __x, reference __y) _NOEXCEPT { _VSTD::swap(__x, __y); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002424
2425 void resize(size_type __sz, value_type __x = false);
Howard Hinnant1c936782011-06-03 19:40:40 +00002426 void flip() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002427
2428 bool __invariants() const;
2429
2430private:
Howard Hinnantcf823322010-12-17 14:46:43 +00002431 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Marshall Clow3ff48e02018-05-22 16:20:28 +00002432 void __vallocate(size_type __n);
2433 void __vdeallocate() _NOEXCEPT;
Howard Hinnant1c936782011-06-03 19:40:40 +00002434 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantea382952013-08-14 18:00:20 +00002435 static size_type __align_it(size_type __new_size) _NOEXCEPT
Eric Fiselierb41db9a2018-10-01 01:59:37 +00002436 {return __new_size + (__bits_per_word-1) & ~((size_type)__bits_per_word-1);}
Howard Hinnantcf823322010-12-17 14:46:43 +00002437 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
2438 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002439 template <class _ForwardIterator>
2440 typename enable_if
2441 <
2442 __is_forward_iterator<_ForwardIterator>::value,
2443 void
2444 >::type
2445 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2446 void __append(size_type __n, const_reference __x);
Howard Hinnant1c936782011-06-03 19:40:40 +00002447 _LIBCPP_INLINE_VISIBILITY
2448 reference __make_ref(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002449 {return 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 const_reference __make_ref(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002452 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnant1c936782011-06-03 19:40:40 +00002453 _LIBCPP_INLINE_VISIBILITY
2454 iterator __make_iter(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002455 {return 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 const_iterator __make_iter(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002458 {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnant1c936782011-06-03 19:40:40 +00002459 _LIBCPP_INLINE_VISIBILITY
2460 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
Howard Hinnant76053d72013-06-27 19:35:32 +00002461 {return begin() + (__p - cbegin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002462
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002463 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002464 void __copy_assign_alloc(const vector& __v)
2465 {__copy_assign_alloc(__v, integral_constant<bool,
2466 __storage_traits::propagate_on_container_copy_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002467 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002468 void __copy_assign_alloc(const vector& __c, true_type)
2469 {
2470 if (__alloc() != __c.__alloc())
Marshall Clow3ff48e02018-05-22 16:20:28 +00002471 __vdeallocate();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002472 __alloc() = __c.__alloc();
2473 }
2474
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002475 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002476 void __copy_assign_alloc(const vector&, false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002477 {}
2478
2479 void __move_assign(vector& __c, false_type);
Howard Hinnant1c936782011-06-03 19:40:40 +00002480 void __move_assign(vector& __c, true_type)
2481 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002482 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002483 void __move_assign_alloc(vector& __c)
Howard Hinnant1c936782011-06-03 19:40:40 +00002484 _NOEXCEPT_(
2485 !__storage_traits::propagate_on_container_move_assignment::value ||
2486 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002487 {__move_assign_alloc(__c, integral_constant<bool,
2488 __storage_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002489 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc2734962011-09-02 20:42:31 +00002490 void __move_assign_alloc(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002491 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002492 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002493 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002494 }
2495
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002497 void __move_assign_alloc(vector&, false_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002498 _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002499 {}
2500
Howard Hinnant1c936782011-06-03 19:40:40 +00002501 size_t __hash_code() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002502
2503 friend class __bit_reference<vector>;
2504 friend class __bit_const_reference<vector>;
2505 friend class __bit_iterator<vector, false>;
2506 friend class __bit_iterator<vector, true>;
Howard Hinnant4210a0f2012-08-17 17:10:18 +00002507 friend struct __bit_array<vector>;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002508 friend struct _LIBCPP_TEMPLATE_VIS hash<vector>;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002509};
2510
2511template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002512inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002513void
2514vector<bool, _Allocator>::__invalidate_all_iterators()
2515{
Howard Hinnantc51e1022010-05-11 19:42:16 +00002516}
2517
2518// Allocate space for __n objects
2519// throws length_error if __n > max_size()
2520// throws (probably bad_alloc) if memory run out
2521// Precondition: __begin_ == __end_ == __cap() == 0
2522// Precondition: __n > 0
2523// Postcondition: capacity() == __n
2524// Postcondition: size() == 0
2525template <class _Allocator>
2526void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002527vector<bool, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002528{
2529 if (__n > max_size())
2530 this->__throw_length_error();
2531 __n = __external_cap_to_internal(__n);
2532 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2533 this->__size_ = 0;
2534 this->__cap() = __n;
2535}
2536
2537template <class _Allocator>
2538void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002539vector<bool, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002540{
Howard Hinnant76053d72013-06-27 19:35:32 +00002541 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002542 {
2543 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2544 __invalidate_all_iterators();
Howard Hinnant76053d72013-06-27 19:35:32 +00002545 this->__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002546 this->__size_ = this->__cap() = 0;
2547 }
2548}
2549
2550template <class _Allocator>
2551typename vector<bool, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +00002552vector<bool, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002553{
2554 size_type __amax = __storage_traits::max_size(__alloc());
2555 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
2556 if (__nmax / __bits_per_word <= __amax)
2557 return __nmax;
2558 return __internal_cap_to_external(__amax);
2559}
2560
2561// Precondition: __new_size > capacity()
2562template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002563inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002564typename vector<bool, _Allocator>::size_type
2565vector<bool, _Allocator>::__recommend(size_type __new_size) const
2566{
2567 const size_type __ms = max_size();
2568 if (__new_size > __ms)
2569 this->__throw_length_error();
2570 const size_type __cap = capacity();
2571 if (__cap >= __ms / 2)
2572 return __ms;
Howard Hinnantea382952013-08-14 18:00:20 +00002573 return _VSTD::max(2*__cap, __align_it(__new_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002574}
2575
2576// Default constructs __n objects starting at __end_
2577// Precondition: __n > 0
2578// Precondition: size() + __n <= capacity()
2579// Postcondition: size() == size() + __n
2580template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002581inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002582void
2583vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2584{
2585 size_type __old_size = this->__size_;
2586 this->__size_ += __n;
Marshall Clow1893ec72018-10-23 20:07:45 +00002587 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2588 {
2589 if (this->__size_ <= __bits_per_word)
2590 this->__begin_[0] = __storage_type(0);
2591 else
2592 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2593 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002594 _VSTD::fill_n(__make_iter(__old_size), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002595}
2596
2597template <class _Allocator>
2598template <class _ForwardIterator>
2599typename enable_if
2600<
2601 __is_forward_iterator<_ForwardIterator>::value,
2602 void
2603>::type
2604vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2605{
2606 size_type __old_size = this->__size_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002607 this->__size_ += _VSTD::distance(__first, __last);
Marshall Clow1893ec72018-10-23 20:07:45 +00002608 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2609 {
2610 if (this->__size_ <= __bits_per_word)
2611 this->__begin_[0] = __storage_type(0);
2612 else
2613 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2614 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002615 _VSTD::copy(__first, __last, __make_iter(__old_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002616}
2617
2618template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002619inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002620vector<bool, _Allocator>::vector()
Marshall Clowe546cbb2015-06-04 02:05:41 +00002621 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant76053d72013-06-27 19:35:32 +00002622 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002623 __size_(0),
2624 __cap_alloc_(0)
2625{
2626}
2627
2628template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002629inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002630vector<bool, _Allocator>::vector(const allocator_type& __a)
Marshall Clow8f282f42015-06-04 00:10:20 +00002631#if _LIBCPP_STD_VER <= 14
2632 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
2633#else
2634 _NOEXCEPT
2635#endif
Howard Hinnant76053d72013-06-27 19:35:32 +00002636 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002637 __size_(0),
2638 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2639{
2640}
2641
2642template <class _Allocator>
2643vector<bool, _Allocator>::vector(size_type __n)
Howard Hinnant76053d72013-06-27 19:35:32 +00002644 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002645 __size_(0),
2646 __cap_alloc_(0)
2647{
2648 if (__n > 0)
2649 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002650 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002651 __construct_at_end(__n, false);
2652 }
2653}
2654
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002655#if _LIBCPP_STD_VER > 11
2656template <class _Allocator>
2657vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a)
2658 : __begin_(nullptr),
2659 __size_(0),
2660 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2661{
2662 if (__n > 0)
2663 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002664 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002665 __construct_at_end(__n, false);
2666 }
2667}
2668#endif
2669
Howard Hinnantc51e1022010-05-11 19:42:16 +00002670template <class _Allocator>
2671vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnant76053d72013-06-27 19:35:32 +00002672 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002673 __size_(0),
2674 __cap_alloc_(0)
2675{
2676 if (__n > 0)
2677 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002678 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002679 __construct_at_end(__n, __x);
2680 }
2681}
2682
2683template <class _Allocator>
2684vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002685 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002686 __size_(0),
2687 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2688{
2689 if (__n > 0)
2690 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002691 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002692 __construct_at_end(__n, __x);
2693 }
2694}
2695
2696template <class _Allocator>
2697template <class _InputIterator>
2698vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2699 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2700 !__is_forward_iterator<_InputIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002701 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002702 __size_(0),
2703 __cap_alloc_(0)
2704{
2705#ifndef _LIBCPP_NO_EXCEPTIONS
2706 try
2707 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002708#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002709 for (; __first != __last; ++__first)
2710 push_back(*__first);
2711#ifndef _LIBCPP_NO_EXCEPTIONS
2712 }
2713 catch (...)
2714 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002715 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002716 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2717 __invalidate_all_iterators();
2718 throw;
2719 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002720#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002721}
2722
2723template <class _Allocator>
2724template <class _InputIterator>
2725vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2726 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2727 !__is_forward_iterator<_InputIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002728 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002729 __size_(0),
2730 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2731{
2732#ifndef _LIBCPP_NO_EXCEPTIONS
2733 try
2734 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002735#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002736 for (; __first != __last; ++__first)
2737 push_back(*__first);
2738#ifndef _LIBCPP_NO_EXCEPTIONS
2739 }
2740 catch (...)
2741 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002742 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002743 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2744 __invalidate_all_iterators();
2745 throw;
2746 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002747#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002748}
2749
2750template <class _Allocator>
2751template <class _ForwardIterator>
2752vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2753 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002754 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002755 __size_(0),
2756 __cap_alloc_(0)
2757{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002758 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002759 if (__n > 0)
2760 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002761 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002762 __construct_at_end(__first, __last);
2763 }
2764}
2765
2766template <class _Allocator>
2767template <class _ForwardIterator>
2768vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2769 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002770 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002771 __size_(0),
2772 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2773{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002774 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002775 if (__n > 0)
2776 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002777 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002778 __construct_at_end(__first, __last);
2779 }
2780}
2781
Eric Fiseliered9e9362017-04-16 02:40:45 +00002782#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002783
Howard Hinnantc51e1022010-05-11 19:42:16 +00002784template <class _Allocator>
2785vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
Howard Hinnant76053d72013-06-27 19:35:32 +00002786 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002787 __size_(0),
2788 __cap_alloc_(0)
2789{
2790 size_type __n = static_cast<size_type>(__il.size());
2791 if (__n > 0)
2792 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002793 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002794 __construct_at_end(__il.begin(), __il.end());
2795 }
2796}
2797
2798template <class _Allocator>
2799vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002800 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002801 __size_(0),
2802 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2803{
2804 size_type __n = static_cast<size_type>(__il.size());
2805 if (__n > 0)
2806 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002807 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002808 __construct_at_end(__il.begin(), __il.end());
2809 }
2810}
2811
Eric Fiseliered9e9362017-04-16 02:40:45 +00002812#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002813
Howard Hinnantc51e1022010-05-11 19:42:16 +00002814template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002815vector<bool, _Allocator>::~vector()
2816{
Howard Hinnant76053d72013-06-27 19:35:32 +00002817 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002818 __storage_traits::deallocate(__alloc(), __begin_, __cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002819 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002820}
2821
2822template <class _Allocator>
2823vector<bool, _Allocator>::vector(const vector& __v)
Howard Hinnant76053d72013-06-27 19:35:32 +00002824 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002825 __size_(0),
2826 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2827{
2828 if (__v.size() > 0)
2829 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002830 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002831 __construct_at_end(__v.begin(), __v.end());
2832 }
2833}
2834
2835template <class _Allocator>
2836vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002837 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002838 __size_(0),
2839 __cap_alloc_(0, __a)
2840{
2841 if (__v.size() > 0)
2842 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002843 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002844 __construct_at_end(__v.begin(), __v.end());
2845 }
2846}
2847
2848template <class _Allocator>
2849vector<bool, _Allocator>&
2850vector<bool, _Allocator>::operator=(const vector& __v)
2851{
2852 if (this != &__v)
2853 {
2854 __copy_assign_alloc(__v);
2855 if (__v.__size_)
2856 {
2857 if (__v.__size_ > capacity())
2858 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002859 __vdeallocate();
2860 __vallocate(__v.__size_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002861 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002862 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002863 }
2864 __size_ = __v.__size_;
2865 }
2866 return *this;
2867}
2868
Eric Fiseliered9e9362017-04-16 02:40:45 +00002869#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant74279a52010-09-04 23:28:19 +00002870
Howard Hinnantc51e1022010-05-11 19:42:16 +00002871template <class _Allocator>
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002872inline _LIBCPP_INLINE_VISIBILITY vector<bool, _Allocator>::vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002873#if _LIBCPP_STD_VER > 14
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002874 _NOEXCEPT
Marshall Clowe5108202015-07-14 14:46:32 +00002875#else
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002876 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00002877#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002878 : __begin_(__v.__begin_),
2879 __size_(__v.__size_),
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002880 __cap_alloc_(std::move(__v.__cap_alloc_)) {
Howard Hinnant76053d72013-06-27 19:35:32 +00002881 __v.__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002882 __v.__size_ = 0;
2883 __v.__cap() = 0;
2884}
2885
2886template <class _Allocator>
2887vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002888 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002889 __size_(0),
2890 __cap_alloc_(0, __a)
2891{
2892 if (__a == allocator_type(__v.__alloc()))
2893 {
2894 this->__begin_ = __v.__begin_;
2895 this->__size_ = __v.__size_;
2896 this->__cap() = __v.__cap();
2897 __v.__begin_ = nullptr;
2898 __v.__cap() = __v.__size_ = 0;
2899 }
2900 else if (__v.size() > 0)
2901 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002902 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002903 __construct_at_end(__v.begin(), __v.end());
2904 }
2905}
2906
2907template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002908inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002909vector<bool, _Allocator>&
2910vector<bool, _Allocator>::operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002911 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002912{
2913 __move_assign(__v, integral_constant<bool,
2914 __storage_traits::propagate_on_container_move_assignment::value>());
Argyrios Kyrtzidisaf904652012-10-13 02:03:45 +00002915 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002916}
2917
2918template <class _Allocator>
2919void
2920vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2921{
2922 if (__alloc() != __c.__alloc())
2923 assign(__c.begin(), __c.end());
2924 else
2925 __move_assign(__c, true_type());
2926}
2927
2928template <class _Allocator>
2929void
2930vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002931 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002932{
Marshall Clow3ff48e02018-05-22 16:20:28 +00002933 __vdeallocate();
Marshall Clowb4871fa2014-07-21 15:15:15 +00002934 __move_assign_alloc(__c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002935 this->__begin_ = __c.__begin_;
2936 this->__size_ = __c.__size_;
2937 this->__cap() = __c.__cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002938 __c.__begin_ = nullptr;
2939 __c.__cap() = __c.__size_ = 0;
2940}
Howard Hinnant74279a52010-09-04 23:28:19 +00002941
Eric Fiseliered9e9362017-04-16 02:40:45 +00002942#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002943
2944template <class _Allocator>
2945void
2946vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2947{
2948 __size_ = 0;
2949 if (__n > 0)
2950 {
2951 size_type __c = capacity();
2952 if (__n <= __c)
2953 __size_ = __n;
2954 else
2955 {
2956 vector __v(__alloc());
2957 __v.reserve(__recommend(__n));
2958 __v.__size_ = __n;
2959 swap(__v);
2960 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002961 _VSTD::fill_n(begin(), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002962 }
Eric Fiselier69c51982016-12-28 06:06:09 +00002963 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002964}
2965
2966template <class _Allocator>
2967template <class _InputIterator>
2968typename enable_if
2969<
2970 __is_input_iterator<_InputIterator>::value &&
2971 !__is_forward_iterator<_InputIterator>::value,
2972 void
2973>::type
2974vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2975{
2976 clear();
2977 for (; __first != __last; ++__first)
2978 push_back(*__first);
2979}
2980
2981template <class _Allocator>
2982template <class _ForwardIterator>
2983typename enable_if
2984<
2985 __is_forward_iterator<_ForwardIterator>::value,
2986 void
2987>::type
2988vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2989{
2990 clear();
Eric Fiselier6003c772016-12-23 23:37:52 +00002991 difference_type __ns = _VSTD::distance(__first, __last);
2992 _LIBCPP_ASSERT(__ns >= 0, "invalid range specified");
2993 const size_t __n = static_cast<size_type>(__ns);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002994 if (__n)
2995 {
2996 if (__n > capacity())
2997 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002998 __vdeallocate();
2999 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003000 }
3001 __construct_at_end(__first, __last);
3002 }
3003}
3004
3005template <class _Allocator>
3006void
3007vector<bool, _Allocator>::reserve(size_type __n)
3008{
3009 if (__n > capacity())
3010 {
3011 vector __v(this->__alloc());
Marshall Clow3ff48e02018-05-22 16:20:28 +00003012 __v.__vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003013 __v.__construct_at_end(this->begin(), this->end());
3014 swap(__v);
3015 __invalidate_all_iterators();
3016 }
3017}
3018
3019template <class _Allocator>
3020void
Howard Hinnant1c936782011-06-03 19:40:40 +00003021vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003022{
3023 if (__external_cap_to_internal(size()) > __cap())
3024 {
3025#ifndef _LIBCPP_NO_EXCEPTIONS
3026 try
3027 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003028#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003029 vector(*this, allocator_type(__alloc())).swap(*this);
3030#ifndef _LIBCPP_NO_EXCEPTIONS
3031 }
3032 catch (...)
3033 {
3034 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003035#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003036 }
3037}
3038
3039template <class _Allocator>
3040typename vector<bool, _Allocator>::reference
3041vector<bool, _Allocator>::at(size_type __n)
3042{
3043 if (__n >= size())
3044 this->__throw_out_of_range();
3045 return (*this)[__n];
3046}
3047
3048template <class _Allocator>
3049typename vector<bool, _Allocator>::const_reference
3050vector<bool, _Allocator>::at(size_type __n) const
3051{
3052 if (__n >= size())
3053 this->__throw_out_of_range();
3054 return (*this)[__n];
3055}
3056
3057template <class _Allocator>
3058void
3059vector<bool, _Allocator>::push_back(const value_type& __x)
3060{
3061 if (this->__size_ == this->capacity())
3062 reserve(__recommend(this->__size_ + 1));
3063 ++this->__size_;
3064 back() = __x;
3065}
3066
3067template <class _Allocator>
3068typename vector<bool, _Allocator>::iterator
3069vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
3070{
3071 iterator __r;
3072 if (size() < capacity())
3073 {
3074 const_iterator __old_end = end();
3075 ++__size_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003076 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003077 __r = __const_iterator_cast(__position);
3078 }
3079 else
3080 {
3081 vector __v(__alloc());
3082 __v.reserve(__recommend(__size_ + 1));
3083 __v.__size_ = __size_ + 1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003084 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3085 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003086 swap(__v);
3087 }
3088 *__r = __x;
3089 return __r;
3090}
3091
3092template <class _Allocator>
3093typename vector<bool, _Allocator>::iterator
3094vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
3095{
3096 iterator __r;
3097 size_type __c = capacity();
3098 if (__n <= __c && size() <= __c - __n)
3099 {
3100 const_iterator __old_end = end();
3101 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003102 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003103 __r = __const_iterator_cast(__position);
3104 }
3105 else
3106 {
3107 vector __v(__alloc());
3108 __v.reserve(__recommend(__size_ + __n));
3109 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003110 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3111 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003112 swap(__v);
3113 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003114 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003115 return __r;
3116}
3117
3118template <class _Allocator>
3119template <class _InputIterator>
3120typename enable_if
3121<
3122 __is_input_iterator <_InputIterator>::value &&
3123 !__is_forward_iterator<_InputIterator>::value,
3124 typename vector<bool, _Allocator>::iterator
3125>::type
3126vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
3127{
3128 difference_type __off = __position - begin();
3129 iterator __p = __const_iterator_cast(__position);
3130 iterator __old_end = end();
3131 for (; size() != capacity() && __first != __last; ++__first)
3132 {
3133 ++this->__size_;
3134 back() = *__first;
3135 }
3136 vector __v(__alloc());
3137 if (__first != __last)
3138 {
3139#ifndef _LIBCPP_NO_EXCEPTIONS
3140 try
3141 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003142#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003143 __v.assign(__first, __last);
3144 difference_type __old_size = static_cast<difference_type>(__old_end - begin());
3145 difference_type __old_p = __p - begin();
3146 reserve(__recommend(size() + __v.size()));
3147 __p = begin() + __old_p;
3148 __old_end = begin() + __old_size;
3149#ifndef _LIBCPP_NO_EXCEPTIONS
3150 }
3151 catch (...)
3152 {
3153 erase(__old_end, end());
3154 throw;
3155 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003156#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003157 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003158 __p = _VSTD::rotate(__p, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003159 insert(__p, __v.begin(), __v.end());
3160 return begin() + __off;
3161}
3162
3163template <class _Allocator>
3164template <class _ForwardIterator>
3165typename enable_if
3166<
3167 __is_forward_iterator<_ForwardIterator>::value,
3168 typename vector<bool, _Allocator>::iterator
3169>::type
3170vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
3171{
Eric Fiselier654dd332016-12-11 05:31:00 +00003172 const difference_type __n_signed = _VSTD::distance(__first, __last);
3173 _LIBCPP_ASSERT(__n_signed >= 0, "invalid range specified");
3174 const size_type __n = static_cast<size_type>(__n_signed);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003175 iterator __r;
3176 size_type __c = capacity();
3177 if (__n <= __c && size() <= __c - __n)
3178 {
3179 const_iterator __old_end = end();
3180 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003181 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003182 __r = __const_iterator_cast(__position);
3183 }
3184 else
3185 {
3186 vector __v(__alloc());
3187 __v.reserve(__recommend(__size_ + __n));
3188 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003189 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3190 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003191 swap(__v);
3192 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003193 _VSTD::copy(__first, __last, __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003194 return __r;
3195}
3196
3197template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003198inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003199typename vector<bool, _Allocator>::iterator
3200vector<bool, _Allocator>::erase(const_iterator __position)
3201{
3202 iterator __r = __const_iterator_cast(__position);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003203 _VSTD::copy(__position + 1, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003204 --__size_;
3205 return __r;
3206}
3207
3208template <class _Allocator>
3209typename vector<bool, _Allocator>::iterator
3210vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
3211{
3212 iterator __r = __const_iterator_cast(__first);
3213 difference_type __d = __last - __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003214 _VSTD::copy(__last, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003215 __size_ -= __d;
3216 return __r;
3217}
3218
3219template <class _Allocator>
3220void
3221vector<bool, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00003222#if _LIBCPP_STD_VER >= 14
3223 _NOEXCEPT
3224#else
Eric Fiselier69c51982016-12-28 06:06:09 +00003225 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00003226 __is_nothrow_swappable<allocator_type>::value)
3227#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00003228{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003229 _VSTD::swap(this->__begin_, __x.__begin_);
3230 _VSTD::swap(this->__size_, __x.__size_);
3231 _VSTD::swap(this->__cap(), __x.__cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00003232 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00003233 integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003234}
3235
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003236template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003237void
3238vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3239{
3240 size_type __cs = size();
3241 if (__cs < __sz)
3242 {
3243 iterator __r;
3244 size_type __c = capacity();
3245 size_type __n = __sz - __cs;
3246 if (__n <= __c && __cs <= __c - __n)
3247 {
3248 __r = end();
3249 __size_ += __n;
3250 }
3251 else
3252 {
3253 vector __v(__alloc());
3254 __v.reserve(__recommend(__size_ + __n));
3255 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003256 __r = _VSTD::copy(cbegin(), cend(), __v.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003257 swap(__v);
3258 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003259 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003260 }
3261 else
3262 __size_ = __sz;
3263}
3264
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003265template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003266void
Howard Hinnant1c936782011-06-03 19:40:40 +00003267vector<bool, _Allocator>::flip() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003268{
3269 // do middle whole words
3270 size_type __n = __size_;
3271 __storage_pointer __p = __begin_;
3272 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3273 *__p = ~*__p;
3274 // do last partial word
3275 if (__n > 0)
3276 {
3277 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3278 __storage_type __b = *__p & __m;
3279 *__p &= ~__m;
3280 *__p |= ~__b & __m;
3281 }
3282}
3283
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003284template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003285bool
3286vector<bool, _Allocator>::__invariants() const
3287{
Howard Hinnant76053d72013-06-27 19:35:32 +00003288 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003289 {
3290 if (this->__size_ != 0 || this->__cap() != 0)
3291 return false;
3292 }
3293 else
3294 {
3295 if (this->__cap() == 0)
3296 return false;
3297 if (this->__size_ > this->capacity())
3298 return false;
3299 }
3300 return true;
3301}
3302
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003303template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003304size_t
Howard Hinnant1c936782011-06-03 19:40:40 +00003305vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003306{
3307 size_t __h = 0;
3308 // do middle whole words
3309 size_type __n = __size_;
3310 __storage_pointer __p = __begin_;
3311 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3312 __h ^= *__p;
3313 // do last partial word
3314 if (__n > 0)
3315 {
3316 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3317 __h ^= *__p & __m;
3318 }
3319 return __h;
3320}
3321
3322template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00003323struct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003324 : public unary_function<vector<bool, _Allocator>, size_t>
3325{
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003326 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00003327 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003328 {return __vec.__hash_code();}
3329};
3330
3331template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003332inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003333bool
3334operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3335{
3336 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003337 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003338}
3339
3340template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003341inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003342bool
3343operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3344{
3345 return !(__x == __y);
3346}
3347
3348template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003349inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003350bool
3351operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3352{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003353 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003354}
3355
3356template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003357inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003358bool
3359operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3360{
3361 return __y < __x;
3362}
3363
3364template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003365inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003366bool
3367operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3368{
3369 return !(__x < __y);
3370}
3371
3372template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003373inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003374bool
3375operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3376{
3377 return !(__y < __x);
3378}
3379
3380template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003381inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003382void
3383swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
Howard Hinnant1c936782011-06-03 19:40:40 +00003384 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00003385{
3386 __x.swap(__y);
3387}
3388
Marshall Clow29b53f22018-12-14 18:49:35 +00003389#if _LIBCPP_STD_VER > 17
3390template <class _Tp, class _Allocator, class _Up>
3391inline _LIBCPP_INLINE_VISIBILITY
3392void erase(vector<_Tp, _Allocator>& __c, const _Up& __v)
3393{ __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end()); }
3394
3395template <class _Tp, class _Allocator, class _Predicate>
3396inline _LIBCPP_INLINE_VISIBILITY
3397void erase_if(vector<_Tp, _Allocator>& __c, _Predicate __pred)
3398{ __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end()); }
3399#endif
3400
Howard Hinnantc51e1022010-05-11 19:42:16 +00003401_LIBCPP_END_NAMESPACE_STD
3402
Eric Fiselierf4433a32017-05-31 22:07:49 +00003403_LIBCPP_POP_MACROS
3404
Howard Hinnantc51e1022010-05-11 19:42:16 +00003405#endif // _LIBCPP_VECTOR