blob: be4894a89e2fea777022a27eb7eec887867d96fb [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{
Eric Fiselier909fe962019-09-13 16:09:33 +0000950
Marshall Clow2cd9d372014-05-08 14:14:06 +0000951 __annotate_delete();
Eric Fiselier909fe962019-09-13 16:09:33 +0000952 __alloc_traits::__construct_backward_with_exception_guarantees(
953 this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000954 _VSTD::swap(this->__begin_, __v.__begin_);
955 _VSTD::swap(this->__end_, __v.__end_);
956 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000957 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000958 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000959 __invalidate_all_iterators();
960}
961
962template <class _Tp, class _Allocator>
963typename vector<_Tp, _Allocator>::pointer
964vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
965{
Marshall Clow2cd9d372014-05-08 14:14:06 +0000966 __annotate_delete();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000967 pointer __r = __v.__begin_;
Eric Fiselier909fe962019-09-13 16:09:33 +0000968 __alloc_traits::__construct_backward_with_exception_guarantees(
969 this->__alloc(), this->__begin_, __p, __v.__begin_);
970 __alloc_traits::__construct_forward_with_exception_guarantees(
971 this->__alloc(), __p, this->__end_, __v.__end_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000972 _VSTD::swap(this->__begin_, __v.__begin_);
973 _VSTD::swap(this->__end_, __v.__end_);
974 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000975 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000976 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000977 __invalidate_all_iterators();
978 return __r;
979}
980
981// Allocate space for __n objects
982// throws length_error if __n > max_size()
983// throws (probably bad_alloc) if memory run out
984// Precondition: __begin_ == __end_ == __end_cap() == 0
985// Precondition: __n > 0
986// Postcondition: capacity() == __n
987// Postcondition: size() == 0
988template <class _Tp, class _Allocator>
989void
Marshall Clow3ff48e02018-05-22 16:20:28 +0000990vector<_Tp, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000991{
992 if (__n > max_size())
993 this->__throw_length_error();
994 this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
995 this->__end_cap() = this->__begin_ + __n;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000996 __annotate_new(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000997}
998
999template <class _Tp, class _Allocator>
1000void
Marshall Clow3ff48e02018-05-22 16:20:28 +00001001vector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001002{
Howard Hinnant76053d72013-06-27 19:35:32 +00001003 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001004 {
1005 clear();
1006 __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
Howard Hinnant76053d72013-06-27 19:35:32 +00001007 this->__begin_ = this->__end_ = this->__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001008 }
1009}
1010
1011template <class _Tp, class _Allocator>
1012typename vector<_Tp, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +00001013vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001014{
Eric Fiselierb5d9f442016-11-23 01:18:56 +00001015 return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()),
1016 numeric_limits<difference_type>::max());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001017}
1018
1019// Precondition: __new_size > capacity()
1020template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001021inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001022typename vector<_Tp, _Allocator>::size_type
1023vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
1024{
1025 const size_type __ms = max_size();
1026 if (__new_size > __ms)
1027 this->__throw_length_error();
1028 const size_type __cap = capacity();
1029 if (__cap >= __ms / 2)
1030 return __ms;
Alexis Hunt991d29b2011-07-29 23:31:58 +00001031 return _VSTD::max<size_type>(2*__cap, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001032}
1033
1034// Default constructs __n objects starting at __end_
1035// throws if construction throws
1036// Precondition: __n > 0
1037// Precondition: size() + __n <= capacity()
1038// Postcondition: size() == size() + __n
1039template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001040void
1041vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
1042{
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001043 _ConstructTransaction __tx(*this, __n);
1044 for (; __tx.__pos_ != __tx.__new_end_; ++__tx.__pos_) {
1045 __alloc_traits::construct(this->__alloc(), _VSTD::__to_raw_pointer(__tx.__pos_));
1046 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001047}
1048
Howard Hinnantc51e1022010-05-11 19:42:16 +00001049// Copy constructs __n objects starting at __end_ from __x
1050// throws if construction throws
1051// Precondition: __n > 0
1052// Precondition: size() + __n <= capacity()
1053// Postcondition: size() == old size() + __n
1054// Postcondition: [i] == __x for all i in [size() - __n, __n)
1055template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001056inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001057void
1058vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
1059{
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001060 _ConstructTransaction __tx(*this, __n);
1061 for (; __tx.__pos_ != __tx.__new_end_; ++__tx.__pos_) {
1062 __alloc_traits::construct(this->__alloc(), _VSTD::__to_raw_pointer(__tx.__pos_), __x);
1063 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001064}
1065
1066template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001067template <class _ForwardIterator>
1068typename enable_if
1069<
1070 __is_forward_iterator<_ForwardIterator>::value,
1071 void
1072>::type
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001073vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001074{
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001075 _ConstructTransaction __tx(*this, __n);
1076 __alloc_traits::__construct_range_forward(this->__alloc(), __first, __last, __tx.__pos_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001077}
1078
1079// Default constructs __n objects starting at __end_
1080// throws if construction throws
1081// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001082// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001083template <class _Tp, class _Allocator>
1084void
1085vector<_Tp, _Allocator>::__append(size_type __n)
1086{
1087 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1088 this->__construct_at_end(__n);
1089 else
1090 {
1091 allocator_type& __a = this->__alloc();
1092 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1093 __v.__construct_at_end(__n);
1094 __swap_out_circular_buffer(__v);
1095 }
1096}
1097
1098// Default constructs __n objects starting at __end_
1099// throws if construction throws
1100// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001101// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001102template <class _Tp, class _Allocator>
1103void
1104vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
1105{
1106 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1107 this->__construct_at_end(__n, __x);
1108 else
1109 {
1110 allocator_type& __a = this->__alloc();
1111 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1112 __v.__construct_at_end(__n, __x);
1113 __swap_out_circular_buffer(__v);
1114 }
1115}
1116
1117template <class _Tp, class _Allocator>
1118vector<_Tp, _Allocator>::vector(size_type __n)
1119{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001120#if _LIBCPP_DEBUG_LEVEL >= 2
1121 __get_db()->__insert_c(this);
1122#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001123 if (__n > 0)
1124 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001125 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001126 __construct_at_end(__n);
1127 }
1128}
1129
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001130#if _LIBCPP_STD_VER > 11
1131template <class _Tp, class _Allocator>
1132vector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a)
1133 : __base(__a)
1134{
1135#if _LIBCPP_DEBUG_LEVEL >= 2
1136 __get_db()->__insert_c(this);
1137#endif
1138 if (__n > 0)
1139 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001140 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001141 __construct_at_end(__n);
1142 }
1143}
1144#endif
1145
Howard Hinnantc51e1022010-05-11 19:42:16 +00001146template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001147vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001148{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001149#if _LIBCPP_DEBUG_LEVEL >= 2
1150 __get_db()->__insert_c(this);
1151#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001152 if (__n > 0)
1153 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001154 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001155 __construct_at_end(__n, __x);
1156 }
1157}
1158
1159template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001160vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001161 : __base(__a)
1162{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001163#if _LIBCPP_DEBUG_LEVEL >= 2
1164 __get_db()->__insert_c(this);
1165#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001166 if (__n > 0)
1167 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001168 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001169 __construct_at_end(__n, __x);
1170 }
1171}
1172
1173template <class _Tp, class _Allocator>
1174template <class _InputIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001175vector<_Tp, _Allocator>::vector(_InputIterator __first,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001176 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001177 !__is_forward_iterator<_InputIterator>::value &&
1178 is_constructible<
1179 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001180 typename iterator_traits<_InputIterator>::reference>::value,
1181 _InputIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001182{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001183#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001184 __get_db()->__insert_c(this);
1185#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001186 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001187 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001188}
1189
1190template <class _Tp, class _Allocator>
1191template <class _InputIterator>
1192vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
1193 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001194 !__is_forward_iterator<_InputIterator>::value &&
1195 is_constructible<
1196 value_type,
1197 typename iterator_traits<_InputIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001198 : __base(__a)
1199{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001200#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001201 __get_db()->__insert_c(this);
1202#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001203 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001204 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001205}
1206
1207template <class _Tp, class _Allocator>
1208template <class _ForwardIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001209vector<_Tp, _Allocator>::vector(_ForwardIterator __first,
Howard Hinnant88010252013-03-28 17:44:32 +00001210 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1211 is_constructible<
1212 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001213 typename iterator_traits<_ForwardIterator>::reference>::value,
1214 _ForwardIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001215{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001216#if _LIBCPP_DEBUG_LEVEL >= 2
1217 __get_db()->__insert_c(this);
1218#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001219 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001220 if (__n > 0)
1221 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001222 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001223 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001224 }
1225}
1226
1227template <class _Tp, class _Allocator>
1228template <class _ForwardIterator>
1229vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant88010252013-03-28 17:44:32 +00001230 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1231 is_constructible<
1232 value_type,
1233 typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001234 : __base(__a)
1235{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001236#if _LIBCPP_DEBUG_LEVEL >= 2
1237 __get_db()->__insert_c(this);
1238#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001239 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001240 if (__n > 0)
1241 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001242 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001243 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001244 }
1245}
1246
1247template <class _Tp, class _Allocator>
1248vector<_Tp, _Allocator>::vector(const vector& __x)
1249 : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
1250{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001251#if _LIBCPP_DEBUG_LEVEL >= 2
1252 __get_db()->__insert_c(this);
1253#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001254 size_type __n = __x.size();
1255 if (__n > 0)
1256 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001257 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001258 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001259 }
1260}
1261
1262template <class _Tp, class _Allocator>
1263vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a)
1264 : __base(__a)
1265{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001266#if _LIBCPP_DEBUG_LEVEL >= 2
1267 __get_db()->__insert_c(this);
1268#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001269 size_type __n = __x.size();
1270 if (__n > 0)
1271 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001272 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001273 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001274 }
1275}
1276
Eric Fiseliered9e9362017-04-16 02:40:45 +00001277#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001278
1279template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001280inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001281vector<_Tp, _Allocator>::vector(vector&& __x)
Marshall Clowe5108202015-07-14 14:46:32 +00001282#if _LIBCPP_STD_VER > 14
1283 _NOEXCEPT
1284#else
Howard Hinnant1c936782011-06-03 19:40:40 +00001285 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00001286#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001287 : __base(_VSTD::move(__x.__alloc()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001288{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001289#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001290 __get_db()->__insert_c(this);
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001291 __get_db()->swap(this, &__x);
Howard Hinnant27e0e772011-09-14 18:33:51 +00001292#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001293 this->__begin_ = __x.__begin_;
1294 this->__end_ = __x.__end_;
1295 this->__end_cap() = __x.__end_cap();
Howard Hinnant76053d72013-06-27 19:35:32 +00001296 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001297}
1298
1299template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001300inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001301vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a)
1302 : __base(__a)
1303{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001304#if _LIBCPP_DEBUG_LEVEL >= 2
1305 __get_db()->__insert_c(this);
1306#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001307 if (__a == __x.__alloc())
1308 {
1309 this->__begin_ = __x.__begin_;
1310 this->__end_ = __x.__end_;
1311 this->__end_cap() = __x.__end_cap();
1312 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001313#if _LIBCPP_DEBUG_LEVEL >= 2
1314 __get_db()->swap(this, &__x);
1315#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001316 }
1317 else
1318 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001319 typedef move_iterator<iterator> _Ip;
1320 assign(_Ip(__x.begin()), _Ip(__x.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001321 }
1322}
1323
1324template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001325inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001326vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
1327{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001328#if _LIBCPP_DEBUG_LEVEL >= 2
1329 __get_db()->__insert_c(this);
1330#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001331 if (__il.size() > 0)
1332 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001333 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001334 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001335 }
1336}
1337
1338template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001339inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001340vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
1341 : __base(__a)
1342{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001343#if _LIBCPP_DEBUG_LEVEL >= 2
1344 __get_db()->__insert_c(this);
1345#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001346 if (__il.size() > 0)
1347 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001348 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001349 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001350 }
1351}
1352
1353template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001354inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001355vector<_Tp, _Allocator>&
1356vector<_Tp, _Allocator>::operator=(vector&& __x)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001357 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001358{
1359 __move_assign(__x, integral_constant<bool,
1360 __alloc_traits::propagate_on_container_move_assignment::value>());
1361 return *this;
1362}
1363
1364template <class _Tp, class _Allocator>
1365void
1366vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001367 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001368{
1369 if (__base::__alloc() != __c.__alloc())
1370 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001371 typedef move_iterator<iterator> _Ip;
1372 assign(_Ip(__c.begin()), _Ip(__c.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001373 }
1374 else
1375 __move_assign(__c, true_type());
1376}
1377
1378template <class _Tp, class _Allocator>
1379void
1380vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00001381 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001382{
Marshall Clow3ff48e02018-05-22 16:20:28 +00001383 __vdeallocate();
Marshall Clow136d45c2014-07-21 15:11:13 +00001384 __base::__move_assign_alloc(__c); // this can throw
Howard Hinnantc51e1022010-05-11 19:42:16 +00001385 this->__begin_ = __c.__begin_;
1386 this->__end_ = __c.__end_;
1387 this->__end_cap() = __c.__end_cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001388 __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001389#if _LIBCPP_DEBUG_LEVEL >= 2
1390 __get_db()->swap(this, &__c);
1391#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001392}
1393
Eric Fiseliered9e9362017-04-16 02:40:45 +00001394#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001395
1396template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001397inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001398vector<_Tp, _Allocator>&
1399vector<_Tp, _Allocator>::operator=(const vector& __x)
1400{
1401 if (this != &__x)
1402 {
1403 __base::__copy_assign_alloc(__x);
1404 assign(__x.__begin_, __x.__end_);
1405 }
1406 return *this;
1407}
1408
1409template <class _Tp, class _Allocator>
1410template <class _InputIterator>
1411typename enable_if
1412<
1413 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001414 !__is_forward_iterator<_InputIterator>::value &&
1415 is_constructible<
1416 _Tp,
1417 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001418 void
1419>::type
1420vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1421{
1422 clear();
1423 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001424 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001425}
1426
1427template <class _Tp, class _Allocator>
1428template <class _ForwardIterator>
1429typename enable_if
1430<
Howard Hinnant88010252013-03-28 17:44:32 +00001431 __is_forward_iterator<_ForwardIterator>::value &&
1432 is_constructible<
1433 _Tp,
1434 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001435 void
1436>::type
1437vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
1438{
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001439 size_type __new_size = static_cast<size_type>(_VSTD::distance(__first, __last));
1440 if (__new_size <= capacity())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001441 {
1442 _ForwardIterator __mid = __last;
1443 bool __growing = false;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001444 if (__new_size > size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001445 {
1446 __growing = true;
1447 __mid = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001448 _VSTD::advance(__mid, size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001449 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001450 pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001451 if (__growing)
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001452 __construct_at_end(__mid, __last, __new_size - size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001453 else
1454 this->__destruct_at_end(__m);
1455 }
1456 else
1457 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001458 __vdeallocate();
1459 __vallocate(__recommend(__new_size));
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001460 __construct_at_end(__first, __last, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001461 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001462 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001463}
1464
1465template <class _Tp, class _Allocator>
1466void
1467vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
1468{
1469 if (__n <= capacity())
1470 {
1471 size_type __s = size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001472 _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001473 if (__n > __s)
1474 __construct_at_end(__n - __s, __u);
1475 else
Howard Hinnant155c2af2010-05-24 17:49:41 +00001476 this->__destruct_at_end(this->__begin_ + __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001477 }
1478 else
1479 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001480 __vdeallocate();
1481 __vallocate(__recommend(static_cast<size_type>(__n)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001482 __construct_at_end(__n, __u);
1483 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001484 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001485}
1486
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001487template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001488inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001489typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001490vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001491{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001492#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001493 return iterator(this, __p);
1494#else
1495 return iterator(__p);
1496#endif
1497}
1498
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001499template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001500inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001501typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001502vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001503{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001504#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001505 return const_iterator(this, __p);
1506#else
1507 return const_iterator(__p);
1508#endif
1509}
1510
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001511template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001512inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001513typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001514vector<_Tp, _Allocator>::begin() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001515{
1516 return __make_iter(this->__begin_);
1517}
1518
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001519template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001520inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001521typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001522vector<_Tp, _Allocator>::begin() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001523{
1524 return __make_iter(this->__begin_);
1525}
1526
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001527template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001528inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001529typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001530vector<_Tp, _Allocator>::end() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001531{
1532 return __make_iter(this->__end_);
1533}
1534
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001535template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001536inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001537typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001538vector<_Tp, _Allocator>::end() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001539{
1540 return __make_iter(this->__end_);
1541}
1542
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001543template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001544inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001545typename vector<_Tp, _Allocator>::reference
Marshall Clowd6470492019-03-15 00:29:35 +00001546vector<_Tp, _Allocator>::operator[](size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001548 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001549 return this->__begin_[__n];
1550}
1551
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001552template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001553inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001554typename vector<_Tp, _Allocator>::const_reference
Marshall Clowd6470492019-03-15 00:29:35 +00001555vector<_Tp, _Allocator>::operator[](size_type __n) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001556{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001557 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001558 return this->__begin_[__n];
1559}
1560
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001561template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001562typename vector<_Tp, _Allocator>::reference
1563vector<_Tp, _Allocator>::at(size_type __n)
1564{
1565 if (__n >= size())
1566 this->__throw_out_of_range();
1567 return this->__begin_[__n];
1568}
1569
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001570template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001571typename vector<_Tp, _Allocator>::const_reference
1572vector<_Tp, _Allocator>::at(size_type __n) const
1573{
1574 if (__n >= size())
1575 this->__throw_out_of_range();
1576 return this->__begin_[__n];
1577}
1578
1579template <class _Tp, class _Allocator>
1580void
1581vector<_Tp, _Allocator>::reserve(size_type __n)
1582{
1583 if (__n > capacity())
1584 {
1585 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001586 __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001587 __swap_out_circular_buffer(__v);
1588 }
1589}
1590
1591template <class _Tp, class _Allocator>
1592void
Howard Hinnant1c936782011-06-03 19:40:40 +00001593vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001594{
1595 if (capacity() > size())
1596 {
1597#ifndef _LIBCPP_NO_EXCEPTIONS
1598 try
1599 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001600#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001601 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001602 __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001603 __swap_out_circular_buffer(__v);
1604#ifndef _LIBCPP_NO_EXCEPTIONS
1605 }
1606 catch (...)
1607 {
1608 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001609#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001610 }
1611}
1612
1613template <class _Tp, class _Allocator>
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001614template <class _Up>
1615void
Eric Fiseliered9e9362017-04-16 02:40:45 +00001616#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001617vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
1618#else
1619vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
1620#endif
1621{
1622 allocator_type& __a = this->__alloc();
1623 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1624 // __v.push_back(_VSTD::forward<_Up>(__x));
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001625 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Up>(__x));
1626 __v.__end_++;
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001627 __swap_out_circular_buffer(__v);
1628}
1629
1630template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001631inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001632void
1633vector<_Tp, _Allocator>::push_back(const_reference __x)
1634{
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001635 if (this->__end_ != this->__end_cap())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001636 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001637 __construct_one_at_end(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001638 }
1639 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001640 __push_back_slow_path(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001641}
1642
Eric Fiseliered9e9362017-04-16 02:40:45 +00001643#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001644
1645template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001646inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001647void
1648vector<_Tp, _Allocator>::push_back(value_type&& __x)
1649{
1650 if (this->__end_ < this->__end_cap())
1651 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001652 __construct_one_at_end(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001653 }
1654 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001655 __push_back_slow_path(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001656}
1657
1658template <class _Tp, class _Allocator>
1659template <class... _Args>
1660void
Howard Hinnantb6c49562012-02-26 15:30:12 +00001661vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1662{
1663 allocator_type& __a = this->__alloc();
1664 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1665// __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001666 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Args>(__args)...);
1667 __v.__end_++;
Howard Hinnantb6c49562012-02-26 15:30:12 +00001668 __swap_out_circular_buffer(__v);
1669}
1670
1671template <class _Tp, class _Allocator>
1672template <class... _Args>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001673inline
Marshall Clowea52cc42017-01-24 23:09:12 +00001674#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001675typename vector<_Tp, _Allocator>::reference
Marshall Clowea52cc42017-01-24 23:09:12 +00001676#else
1677void
1678#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001679vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1680{
1681 if (this->__end_ < this->__end_cap())
1682 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001683 __construct_one_at_end(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001684 }
1685 else
Howard Hinnantb6c49562012-02-26 15:30:12 +00001686 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
Marshall Clowea52cc42017-01-24 23:09:12 +00001687#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001688 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00001689#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001690}
1691
Eric Fiseliered9e9362017-04-16 02:40:45 +00001692#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001693
1694template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001695inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001696void
1697vector<_Tp, _Allocator>::pop_back()
1698{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001699 _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001700 this->__destruct_at_end(this->__end_ - 1);
1701}
1702
1703template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001704inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001705typename vector<_Tp, _Allocator>::iterator
1706vector<_Tp, _Allocator>::erase(const_iterator __position)
1707{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001708#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001709 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1710 "vector::erase(iterator) called with an iterator not"
1711 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001712#endif
Howard Hinnant58d52d52013-03-25 22:12:26 +00001713 _LIBCPP_ASSERT(__position != end(),
1714 "vector::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnant76053d72013-06-27 19:35:32 +00001715 difference_type __ps = __position - cbegin();
1716 pointer __p = this->__begin_ + __ps;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001717 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001718 this->__invalidate_iterators_past(__p-1);
1719 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001720 return __r;
1721}
1722
1723template <class _Tp, class _Allocator>
1724typename vector<_Tp, _Allocator>::iterator
1725vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1726{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001727#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001728 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
1729 "vector::erase(iterator, iterator) called with an iterator not"
1730 " referring to this vector");
Eric Fiselier69c51982016-12-28 06:06:09 +00001731 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this,
1732 "vector::erase(iterator, iterator) called with an iterator not"
1733 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001734#endif
Howard Hinnant27e0e772011-09-14 18:33:51 +00001735 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001736 pointer __p = this->__begin_ + (__first - begin());
Eric Fiselier69c51982016-12-28 06:06:09 +00001737 if (__first != __last) {
Howard Hinnantc580cc32013-04-18 15:02:57 +00001738 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001739 this->__invalidate_iterators_past(__p - 1);
1740 }
1741 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001742 return __r;
1743}
1744
1745template <class _Tp, class _Allocator>
1746void
1747vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1748{
1749 pointer __old_last = this->__end_;
1750 difference_type __n = __old_last - __to;
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001751 {
1752 pointer __i = __from_s + __n;
1753 _ConstructTransaction __tx(*this, __from_e - __i);
1754 for (; __i < __from_e; ++__i, ++__tx.__pos_) {
1755 __alloc_traits::construct(this->__alloc(),
1756 _VSTD::__to_raw_pointer(__tx.__pos_),
1757 _VSTD::move(*__i));
1758 }
1759 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001760 _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001761}
1762
1763template <class _Tp, class _Allocator>
1764typename vector<_Tp, _Allocator>::iterator
1765vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1766{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001767#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001768 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1769 "vector::insert(iterator, x) called with an iterator not"
1770 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001771#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001772 pointer __p = this->__begin_ + (__position - begin());
1773 if (this->__end_ < this->__end_cap())
1774 {
1775 if (__p == this->__end_)
1776 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001777 __construct_one_at_end(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001778 }
1779 else
1780 {
1781 __move_range(__p, this->__end_, __p + 1);
1782 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1783 if (__p <= __xr && __xr < this->__end_)
1784 ++__xr;
1785 *__p = *__xr;
1786 }
1787 }
1788 else
1789 {
1790 allocator_type& __a = this->__alloc();
1791 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1792 __v.push_back(__x);
1793 __p = __swap_out_circular_buffer(__v, __p);
1794 }
1795 return __make_iter(__p);
1796}
1797
Eric Fiseliered9e9362017-04-16 02:40:45 +00001798#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001799
1800template <class _Tp, class _Allocator>
1801typename vector<_Tp, _Allocator>::iterator
1802vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1803{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001804#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001805 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1806 "vector::insert(iterator, x) called with an iterator not"
1807 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001808#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001809 pointer __p = this->__begin_ + (__position - begin());
1810 if (this->__end_ < this->__end_cap())
1811 {
1812 if (__p == this->__end_)
1813 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001814 __construct_one_at_end(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001815 }
1816 else
1817 {
1818 __move_range(__p, this->__end_, __p + 1);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001819 *__p = _VSTD::move(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001820 }
1821 }
1822 else
1823 {
1824 allocator_type& __a = this->__alloc();
1825 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001826 __v.push_back(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001827 __p = __swap_out_circular_buffer(__v, __p);
1828 }
1829 return __make_iter(__p);
1830}
1831
1832template <class _Tp, class _Allocator>
1833template <class... _Args>
1834typename vector<_Tp, _Allocator>::iterator
1835vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1836{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001837#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001838 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1839 "vector::emplace(iterator, x) called with an iterator not"
1840 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001841#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001842 pointer __p = this->__begin_ + (__position - begin());
1843 if (this->__end_ < this->__end_cap())
1844 {
1845 if (__p == this->__end_)
1846 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001847 __construct_one_at_end(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001848 }
1849 else
1850 {
Marshall Clowa591b9a2016-07-11 21:38:08 +00001851 __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001852 __move_range(__p, this->__end_, __p + 1);
Marshall Clowa591b9a2016-07-11 21:38:08 +00001853 *__p = _VSTD::move(__tmp.get());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001854 }
1855 }
1856 else
1857 {
1858 allocator_type& __a = this->__alloc();
1859 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001860 __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001861 __p = __swap_out_circular_buffer(__v, __p);
1862 }
1863 return __make_iter(__p);
1864}
1865
Eric Fiseliered9e9362017-04-16 02:40:45 +00001866#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001867
1868template <class _Tp, class _Allocator>
1869typename vector<_Tp, _Allocator>::iterator
1870vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1871{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001872#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001873 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1874 "vector::insert(iterator, n, x) called with an iterator not"
1875 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001876#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001877 pointer __p = this->__begin_ + (__position - begin());
1878 if (__n > 0)
1879 {
1880 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1881 {
1882 size_type __old_n = __n;
1883 pointer __old_last = this->__end_;
1884 if (__n > static_cast<size_type>(this->__end_ - __p))
1885 {
1886 size_type __cx = __n - (this->__end_ - __p);
1887 __construct_at_end(__cx, __x);
1888 __n -= __cx;
1889 }
1890 if (__n > 0)
1891 {
1892 __move_range(__p, __old_last, __p + __old_n);
1893 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1894 if (__p <= __xr && __xr < this->__end_)
1895 __xr += __old_n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001896 _VSTD::fill_n(__p, __n, *__xr);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001897 }
1898 }
1899 else
1900 {
1901 allocator_type& __a = this->__alloc();
1902 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1903 __v.__construct_at_end(__n, __x);
1904 __p = __swap_out_circular_buffer(__v, __p);
1905 }
1906 }
1907 return __make_iter(__p);
1908}
1909
1910template <class _Tp, class _Allocator>
1911template <class _InputIterator>
1912typename enable_if
1913<
1914 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001915 !__is_forward_iterator<_InputIterator>::value &&
1916 is_constructible<
1917 _Tp,
1918 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001919 typename vector<_Tp, _Allocator>::iterator
1920>::type
1921vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1922{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001923#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001924 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1925 "vector::insert(iterator, range) called with an iterator not"
1926 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001927#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001928 difference_type __off = __position - begin();
1929 pointer __p = this->__begin_ + __off;
1930 allocator_type& __a = this->__alloc();
1931 pointer __old_last = this->__end_;
1932 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1933 {
Eric Fiseliere7afbd32019-07-28 04:37:02 +00001934 __construct_one_at_end(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001935 }
1936 __split_buffer<value_type, allocator_type&> __v(__a);
1937 if (__first != __last)
1938 {
1939#ifndef _LIBCPP_NO_EXCEPTIONS
1940 try
1941 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001942#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001943 __v.__construct_at_end(__first, __last);
1944 difference_type __old_size = __old_last - this->__begin_;
1945 difference_type __old_p = __p - this->__begin_;
1946 reserve(__recommend(size() + __v.size()));
1947 __p = this->__begin_ + __old_p;
1948 __old_last = this->__begin_ + __old_size;
1949#ifndef _LIBCPP_NO_EXCEPTIONS
1950 }
1951 catch (...)
1952 {
1953 erase(__make_iter(__old_last), end());
1954 throw;
1955 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001956#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001957 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001958 __p = _VSTD::rotate(__p, __old_last, this->__end_);
Howard Hinnant9cd22302011-09-16 18:41:29 +00001959 insert(__make_iter(__p), make_move_iterator(__v.begin()),
1960 make_move_iterator(__v.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001961 return begin() + __off;
1962}
1963
1964template <class _Tp, class _Allocator>
1965template <class _ForwardIterator>
1966typename enable_if
1967<
Howard Hinnant88010252013-03-28 17:44:32 +00001968 __is_forward_iterator<_ForwardIterator>::value &&
1969 is_constructible<
1970 _Tp,
1971 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001972 typename vector<_Tp, _Allocator>::iterator
1973>::type
1974vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1975{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001976#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001977 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1978 "vector::insert(iterator, range) called with an iterator not"
1979 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001980#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001981 pointer __p = this->__begin_ + (__position - begin());
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001982 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001983 if (__n > 0)
1984 {
1985 if (__n <= this->__end_cap() - this->__end_)
1986 {
1987 size_type __old_n = __n;
1988 pointer __old_last = this->__end_;
1989 _ForwardIterator __m = __last;
1990 difference_type __dx = this->__end_ - __p;
1991 if (__n > __dx)
1992 {
1993 __m = __first;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001994 difference_type __diff = this->__end_ - __p;
1995 _VSTD::advance(__m, __diff);
1996 __construct_at_end(__m, __last, __n - __diff);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001997 __n = __dx;
1998 }
1999 if (__n > 0)
2000 {
2001 __move_range(__p, __old_last, __p + __old_n);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002002 _VSTD::copy(__first, __m, __p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002003 }
2004 }
2005 else
2006 {
2007 allocator_type& __a = this->__alloc();
2008 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
2009 __v.__construct_at_end(__first, __last);
2010 __p = __swap_out_circular_buffer(__v, __p);
2011 }
2012 }
2013 return __make_iter(__p);
2014}
2015
2016template <class _Tp, class _Allocator>
2017void
2018vector<_Tp, _Allocator>::resize(size_type __sz)
2019{
2020 size_type __cs = size();
2021 if (__cs < __sz)
2022 this->__append(__sz - __cs);
2023 else if (__cs > __sz)
2024 this->__destruct_at_end(this->__begin_ + __sz);
2025}
2026
2027template <class _Tp, class _Allocator>
2028void
2029vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
2030{
2031 size_type __cs = size();
2032 if (__cs < __sz)
2033 this->__append(__sz - __cs, __x);
2034 else if (__cs > __sz)
2035 this->__destruct_at_end(this->__begin_ + __sz);
2036}
2037
2038template <class _Tp, class _Allocator>
2039void
2040vector<_Tp, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002041#if _LIBCPP_STD_VER >= 14
Eric Fiselier873b8d32019-03-18 21:50:12 +00002042 _NOEXCEPT
Marshall Clow8982dcd2015-07-13 20:04:56 +00002043#else
Eric Fiselier873b8d32019-03-18 21:50:12 +00002044 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002045 __is_nothrow_swappable<allocator_type>::value)
2046#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002047{
Howard Hinnant27e0e772011-09-14 18:33:51 +00002048 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
2049 this->__alloc() == __x.__alloc(),
2050 "vector::swap: Either propagate_on_container_swap must be true"
2051 " or the allocators must compare equal");
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002052 _VSTD::swap(this->__begin_, __x.__begin_);
2053 _VSTD::swap(this->__end_, __x.__end_);
2054 _VSTD::swap(this->__end_cap(), __x.__end_cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00002055 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00002056 integral_constant<bool,__alloc_traits::propagate_on_container_swap::value>());
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002057#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002058 __get_db()->swap(this, &__x);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002059#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002060}
2061
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002062template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002063bool
2064vector<_Tp, _Allocator>::__invariants() const
2065{
Howard Hinnant76053d72013-06-27 19:35:32 +00002066 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002067 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002068 if (this->__end_ != nullptr || this->__end_cap() != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002069 return false;
2070 }
2071 else
2072 {
2073 if (this->__begin_ > this->__end_)
2074 return false;
2075 if (this->__begin_ == this->__end_cap())
2076 return false;
2077 if (this->__end_ > this->__end_cap())
2078 return false;
2079 }
2080 return true;
2081}
2082
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002083#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002084
Howard Hinnantc51e1022010-05-11 19:42:16 +00002085template <class _Tp, class _Allocator>
Howard Hinnant27e0e772011-09-14 18:33:51 +00002086bool
2087vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
2088{
2089 return this->__begin_ <= __i->base() && __i->base() < this->__end_;
2090}
2091
2092template <class _Tp, class _Allocator>
2093bool
2094vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
2095{
2096 return this->__begin_ < __i->base() && __i->base() <= this->__end_;
2097}
2098
2099template <class _Tp, class _Allocator>
2100bool
2101vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
2102{
2103 const_pointer __p = __i->base() + __n;
2104 return this->__begin_ <= __p && __p <= this->__end_;
2105}
2106
2107template <class _Tp, class _Allocator>
2108bool
2109vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2110{
2111 const_pointer __p = __i->base() + __n;
2112 return this->__begin_ <= __p && __p < this->__end_;
2113}
2114
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002115#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002116
2117template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002118inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002119void
2120vector<_Tp, _Allocator>::__invalidate_all_iterators()
2121{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002122#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002123 __get_db()->__invalidate_all(this);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002124#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002125}
2126
Eric Fiselier69c51982016-12-28 06:06:09 +00002127
2128template <class _Tp, class _Allocator>
2129inline _LIBCPP_INLINE_VISIBILITY
2130void
2131vector<_Tp, _Allocator>::__invalidate_iterators_past(pointer __new_last) {
2132#if _LIBCPP_DEBUG_LEVEL >= 2
2133 __c_node* __c = __get_db()->__find_c_and_lock(this);
2134 for (__i_node** __p = __c->end_; __p != __c->beg_; ) {
2135 --__p;
2136 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
2137 if (__i->base() > __new_last) {
2138 (*__p)->__c_ = nullptr;
2139 if (--__c->end_ != __p)
2140 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
2141 }
2142 }
2143 __get_db()->unlock();
2144#else
2145 ((void)__new_last);
2146#endif
2147}
2148
Howard Hinnantc51e1022010-05-11 19:42:16 +00002149// vector<bool>
2150
2151template <class _Allocator> class vector<bool, _Allocator>;
2152
2153template <class _Allocator> struct hash<vector<bool, _Allocator> >;
2154
2155template <class _Allocator>
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002156struct __has_storage_type<vector<bool, _Allocator> >
2157{
2158 static const bool value = true;
2159};
2160
2161template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002162class _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002163 : private __vector_base_common<true>
2164{
2165public:
2166 typedef vector __self;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002167 typedef bool value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002168 typedef _Allocator allocator_type;
2169 typedef allocator_traits<allocator_type> __alloc_traits;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002170 typedef typename __alloc_traits::size_type size_type;
2171 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant896b7622012-05-07 16:50:38 +00002172 typedef size_type __storage_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002173 typedef __bit_iterator<vector, false> pointer;
2174 typedef __bit_iterator<vector, true> const_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002175 typedef pointer iterator;
2176 typedef const_pointer const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002177 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
2178 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002179
2180private:
Marshall Clow940e01c2015-04-07 05:21:38 +00002181 typedef typename __rebind_alloc_helper<__alloc_traits, __storage_type>::type __storage_allocator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002182 typedef allocator_traits<__storage_allocator> __storage_traits;
2183 typedef typename __storage_traits::pointer __storage_pointer;
2184 typedef typename __storage_traits::const_pointer __const_storage_pointer;
2185
2186 __storage_pointer __begin_;
2187 size_type __size_;
2188 __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002189public:
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002190 typedef __bit_reference<vector> reference;
2191 typedef __bit_const_reference<vector> const_reference;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002192private:
Howard Hinnant1c936782011-06-03 19:40:40 +00002193 _LIBCPP_INLINE_VISIBILITY
2194 size_type& __cap() _NOEXCEPT
2195 {return __cap_alloc_.first();}
2196 _LIBCPP_INLINE_VISIBILITY
2197 const size_type& __cap() const _NOEXCEPT
2198 {return __cap_alloc_.first();}
2199 _LIBCPP_INLINE_VISIBILITY
2200 __storage_allocator& __alloc() _NOEXCEPT
2201 {return __cap_alloc_.second();}
2202 _LIBCPP_INLINE_VISIBILITY
2203 const __storage_allocator& __alloc() const _NOEXCEPT
2204 {return __cap_alloc_.second();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002205
2206 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2207
Howard Hinnant1c936782011-06-03 19:40:40 +00002208 _LIBCPP_INLINE_VISIBILITY
2209 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002210 {return __n * __bits_per_word;}
Howard Hinnant1c936782011-06-03 19:40:40 +00002211 _LIBCPP_INLINE_VISIBILITY
2212 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002213 {return (__n - 1) / __bits_per_word + 1;}
2214
2215public:
Howard Hinnant1c936782011-06-03 19:40:40 +00002216 _LIBCPP_INLINE_VISIBILITY
Marshall Clowe546cbb2015-06-04 02:05:41 +00002217 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Marshall Clow8f282f42015-06-04 00:10:20 +00002218
2219 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
2220#if _LIBCPP_STD_VER <= 14
2221 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
2222#else
2223 _NOEXCEPT;
2224#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002225 ~vector();
2226 explicit vector(size_type __n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002227#if _LIBCPP_STD_VER > 11
2228 explicit vector(size_type __n, const allocator_type& __a);
2229#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002230 vector(size_type __n, const value_type& __v);
2231 vector(size_type __n, const value_type& __v, const allocator_type& __a);
2232 template <class _InputIterator>
2233 vector(_InputIterator __first, _InputIterator __last,
2234 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2235 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2236 template <class _InputIterator>
2237 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2238 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2239 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2240 template <class _ForwardIterator>
2241 vector(_ForwardIterator __first, _ForwardIterator __last,
2242 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2243 template <class _ForwardIterator>
2244 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2245 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2246
2247 vector(const vector& __v);
2248 vector(const vector& __v, const allocator_type& __a);
2249 vector& operator=(const vector& __v);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002250
2251#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002252 vector(initializer_list<value_type> __il);
2253 vector(initializer_list<value_type> __il, const allocator_type& __a);
2254
Howard Hinnant1c936782011-06-03 19:40:40 +00002255 _LIBCPP_INLINE_VISIBILITY
2256 vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002257#if _LIBCPP_STD_VER > 14
2258 _NOEXCEPT;
2259#else
Howard Hinnant1c936782011-06-03 19:40:40 +00002260 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clowe5108202015-07-14 14:46:32 +00002261#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002262 vector(vector&& __v, const allocator_type& __a);
Howard Hinnant1c936782011-06-03 19:40:40 +00002263 _LIBCPP_INLINE_VISIBILITY
2264 vector& operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002265 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Eric Fiseliered9e9362017-04-16 02:40:45 +00002266
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002267 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002268 vector& operator=(initializer_list<value_type> __il)
2269 {assign(__il.begin(), __il.end()); return *this;}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002270
2271#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002272
2273 template <class _InputIterator>
2274 typename enable_if
2275 <
2276 __is_input_iterator<_InputIterator>::value &&
2277 !__is_forward_iterator<_InputIterator>::value,
2278 void
2279 >::type
2280 assign(_InputIterator __first, _InputIterator __last);
2281 template <class _ForwardIterator>
2282 typename enable_if
2283 <
2284 __is_forward_iterator<_ForwardIterator>::value,
2285 void
2286 >::type
2287 assign(_ForwardIterator __first, _ForwardIterator __last);
2288
2289 void assign(size_type __n, const value_type& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002290
2291#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002292 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002293 void assign(initializer_list<value_type> __il)
2294 {assign(__il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002295#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002296
Howard Hinnant1c936782011-06-03 19:40:40 +00002297 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002298 {return allocator_type(this->__alloc());}
2299
Howard Hinnant1c936782011-06-03 19:40:40 +00002300 size_type max_size() const _NOEXCEPT;
2301 _LIBCPP_INLINE_VISIBILITY
2302 size_type capacity() const _NOEXCEPT
2303 {return __internal_cap_to_external(__cap());}
2304 _LIBCPP_INLINE_VISIBILITY
2305 size_type size() const _NOEXCEPT
2306 {return __size_;}
Marshall Clow425f5752017-11-15 05:51:26 +00002307 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00002308 bool empty() const _NOEXCEPT
2309 {return __size_ == 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002310 void reserve(size_type __n);
Howard Hinnant1c936782011-06-03 19:40:40 +00002311 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002312
Howard Hinnant1c936782011-06-03 19:40:40 +00002313 _LIBCPP_INLINE_VISIBILITY
2314 iterator begin() _NOEXCEPT
2315 {return __make_iter(0);}
2316 _LIBCPP_INLINE_VISIBILITY
2317 const_iterator begin() const _NOEXCEPT
2318 {return __make_iter(0);}
2319 _LIBCPP_INLINE_VISIBILITY
2320 iterator end() _NOEXCEPT
2321 {return __make_iter(__size_);}
2322 _LIBCPP_INLINE_VISIBILITY
2323 const_iterator end() const _NOEXCEPT
2324 {return __make_iter(__size_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002325
Howard Hinnant1c936782011-06-03 19:40:40 +00002326 _LIBCPP_INLINE_VISIBILITY
2327 reverse_iterator rbegin() _NOEXCEPT
2328 {return reverse_iterator(end());}
2329 _LIBCPP_INLINE_VISIBILITY
2330 const_reverse_iterator rbegin() const _NOEXCEPT
2331 {return const_reverse_iterator(end());}
2332 _LIBCPP_INLINE_VISIBILITY
2333 reverse_iterator rend() _NOEXCEPT
2334 {return reverse_iterator(begin());}
2335 _LIBCPP_INLINE_VISIBILITY
2336 const_reverse_iterator rend() const _NOEXCEPT
2337 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002338
Howard Hinnant1c936782011-06-03 19:40:40 +00002339 _LIBCPP_INLINE_VISIBILITY
2340 const_iterator cbegin() const _NOEXCEPT
2341 {return __make_iter(0);}
2342 _LIBCPP_INLINE_VISIBILITY
2343 const_iterator cend() const _NOEXCEPT
2344 {return __make_iter(__size_);}
2345 _LIBCPP_INLINE_VISIBILITY
2346 const_reverse_iterator crbegin() const _NOEXCEPT
2347 {return rbegin();}
2348 _LIBCPP_INLINE_VISIBILITY
2349 const_reverse_iterator crend() const _NOEXCEPT
2350 {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002351
2352 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
2353 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2354 reference at(size_type __n);
2355 const_reference at(size_type __n) const;
2356
2357 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
2358 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2359 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
2360 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
2361
2362 void push_back(const value_type& __x);
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002363#if _LIBCPP_STD_VER > 11
2364 template <class... _Args>
Marshall Clowea52cc42017-01-24 23:09:12 +00002365#if _LIBCPP_STD_VER > 14
2366 _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args)
2367#else
2368 _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args)
2369#endif
2370 {
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002371 push_back ( value_type ( _VSTD::forward<_Args>(__args)... ));
Marshall Clowea52cc42017-01-24 23:09:12 +00002372#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002373 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00002374#endif
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002375 }
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002376#endif
2377
Howard Hinnantc51e1022010-05-11 19:42:16 +00002378 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2379
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002380#if _LIBCPP_STD_VER > 11
2381 template <class... _Args>
2382 _LIBCPP_INLINE_VISIBILITY iterator emplace(const_iterator position, _Args&&... __args)
2383 { return insert ( position, value_type ( _VSTD::forward<_Args>(__args)... )); }
2384#endif
2385
Howard Hinnantc51e1022010-05-11 19:42:16 +00002386 iterator insert(const_iterator __position, const value_type& __x);
2387 iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2388 iterator insert(const_iterator __position, size_type __n, const_reference __x);
2389 template <class _InputIterator>
2390 typename enable_if
2391 <
2392 __is_input_iterator <_InputIterator>::value &&
2393 !__is_forward_iterator<_InputIterator>::value,
2394 iterator
2395 >::type
2396 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2397 template <class _ForwardIterator>
2398 typename enable_if
2399 <
2400 __is_forward_iterator<_ForwardIterator>::value,
2401 iterator
2402 >::type
2403 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002404
2405#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002406 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002407 iterator insert(const_iterator __position, initializer_list<value_type> __il)
2408 {return insert(__position, __il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002409#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002410
Howard Hinnantcf823322010-12-17 14:46:43 +00002411 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002412 iterator erase(const_iterator __first, const_iterator __last);
2413
Howard Hinnant1c936782011-06-03 19:40:40 +00002414 _LIBCPP_INLINE_VISIBILITY
2415 void clear() _NOEXCEPT {__size_ = 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002416
Howard Hinnant1c936782011-06-03 19:40:40 +00002417 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002418#if _LIBCPP_STD_VER >= 14
2419 _NOEXCEPT;
2420#else
Eric Fiselier69c51982016-12-28 06:06:09 +00002421 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002422 __is_nothrow_swappable<allocator_type>::value);
2423#endif
Marshall Clow89eb3822016-04-07 14:20:31 +00002424 static void swap(reference __x, reference __y) _NOEXCEPT { _VSTD::swap(__x, __y); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002425
2426 void resize(size_type __sz, value_type __x = false);
Howard Hinnant1c936782011-06-03 19:40:40 +00002427 void flip() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002428
2429 bool __invariants() const;
2430
2431private:
Howard Hinnantcf823322010-12-17 14:46:43 +00002432 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Marshall Clow3ff48e02018-05-22 16:20:28 +00002433 void __vallocate(size_type __n);
2434 void __vdeallocate() _NOEXCEPT;
Howard Hinnant1c936782011-06-03 19:40:40 +00002435 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantea382952013-08-14 18:00:20 +00002436 static size_type __align_it(size_type __new_size) _NOEXCEPT
Eric Fiselierb41db9a2018-10-01 01:59:37 +00002437 {return __new_size + (__bits_per_word-1) & ~((size_type)__bits_per_word-1);}
Howard Hinnantcf823322010-12-17 14:46:43 +00002438 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
2439 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002440 template <class _ForwardIterator>
2441 typename enable_if
2442 <
2443 __is_forward_iterator<_ForwardIterator>::value,
2444 void
2445 >::type
2446 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2447 void __append(size_type __n, const_reference __x);
Howard Hinnant1c936782011-06-03 19:40:40 +00002448 _LIBCPP_INLINE_VISIBILITY
2449 reference __make_ref(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002450 {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnant1c936782011-06-03 19:40:40 +00002451 _LIBCPP_INLINE_VISIBILITY
2452 const_reference __make_ref(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002453 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnant1c936782011-06-03 19:40:40 +00002454 _LIBCPP_INLINE_VISIBILITY
2455 iterator __make_iter(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002456 {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnant1c936782011-06-03 19:40:40 +00002457 _LIBCPP_INLINE_VISIBILITY
2458 const_iterator __make_iter(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002459 {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnant1c936782011-06-03 19:40:40 +00002460 _LIBCPP_INLINE_VISIBILITY
2461 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
Howard Hinnant76053d72013-06-27 19:35:32 +00002462 {return begin() + (__p - cbegin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002463
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002465 void __copy_assign_alloc(const vector& __v)
2466 {__copy_assign_alloc(__v, integral_constant<bool,
2467 __storage_traits::propagate_on_container_copy_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002468 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002469 void __copy_assign_alloc(const vector& __c, true_type)
2470 {
2471 if (__alloc() != __c.__alloc())
Marshall Clow3ff48e02018-05-22 16:20:28 +00002472 __vdeallocate();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002473 __alloc() = __c.__alloc();
2474 }
2475
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002476 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002477 void __copy_assign_alloc(const vector&, false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002478 {}
2479
2480 void __move_assign(vector& __c, false_type);
Howard Hinnant1c936782011-06-03 19:40:40 +00002481 void __move_assign(vector& __c, true_type)
2482 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002483 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002484 void __move_assign_alloc(vector& __c)
Howard Hinnant1c936782011-06-03 19:40:40 +00002485 _NOEXCEPT_(
2486 !__storage_traits::propagate_on_container_move_assignment::value ||
2487 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002488 {__move_assign_alloc(__c, integral_constant<bool,
2489 __storage_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc2734962011-09-02 20:42:31 +00002491 void __move_assign_alloc(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002492 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002493 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002494 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002495 }
2496
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002497 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002498 void __move_assign_alloc(vector&, false_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002499 _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002500 {}
2501
Howard Hinnant1c936782011-06-03 19:40:40 +00002502 size_t __hash_code() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002503
2504 friend class __bit_reference<vector>;
2505 friend class __bit_const_reference<vector>;
2506 friend class __bit_iterator<vector, false>;
2507 friend class __bit_iterator<vector, true>;
Howard Hinnant4210a0f2012-08-17 17:10:18 +00002508 friend struct __bit_array<vector>;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002509 friend struct _LIBCPP_TEMPLATE_VIS hash<vector>;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002510};
2511
2512template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002513inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002514void
2515vector<bool, _Allocator>::__invalidate_all_iterators()
2516{
Howard Hinnantc51e1022010-05-11 19:42:16 +00002517}
2518
2519// Allocate space for __n objects
2520// throws length_error if __n > max_size()
2521// throws (probably bad_alloc) if memory run out
2522// Precondition: __begin_ == __end_ == __cap() == 0
2523// Precondition: __n > 0
2524// Postcondition: capacity() == __n
2525// Postcondition: size() == 0
2526template <class _Allocator>
2527void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002528vector<bool, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002529{
2530 if (__n > max_size())
2531 this->__throw_length_error();
2532 __n = __external_cap_to_internal(__n);
2533 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2534 this->__size_ = 0;
2535 this->__cap() = __n;
2536}
2537
2538template <class _Allocator>
2539void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002540vector<bool, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002541{
Howard Hinnant76053d72013-06-27 19:35:32 +00002542 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002543 {
2544 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2545 __invalidate_all_iterators();
Howard Hinnant76053d72013-06-27 19:35:32 +00002546 this->__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002547 this->__size_ = this->__cap() = 0;
2548 }
2549}
2550
2551template <class _Allocator>
2552typename vector<bool, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +00002553vector<bool, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002554{
2555 size_type __amax = __storage_traits::max_size(__alloc());
2556 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
2557 if (__nmax / __bits_per_word <= __amax)
2558 return __nmax;
2559 return __internal_cap_to_external(__amax);
2560}
2561
2562// Precondition: __new_size > capacity()
2563template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002564inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002565typename vector<bool, _Allocator>::size_type
2566vector<bool, _Allocator>::__recommend(size_type __new_size) const
2567{
2568 const size_type __ms = max_size();
2569 if (__new_size > __ms)
2570 this->__throw_length_error();
2571 const size_type __cap = capacity();
2572 if (__cap >= __ms / 2)
2573 return __ms;
Howard Hinnantea382952013-08-14 18:00:20 +00002574 return _VSTD::max(2*__cap, __align_it(__new_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002575}
2576
2577// Default constructs __n objects starting at __end_
2578// Precondition: __n > 0
2579// Precondition: size() + __n <= capacity()
2580// Postcondition: size() == size() + __n
2581template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002582inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002583void
2584vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2585{
2586 size_type __old_size = this->__size_;
2587 this->__size_ += __n;
Marshall Clow1893ec72018-10-23 20:07:45 +00002588 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2589 {
2590 if (this->__size_ <= __bits_per_word)
2591 this->__begin_[0] = __storage_type(0);
2592 else
2593 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2594 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002595 _VSTD::fill_n(__make_iter(__old_size), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002596}
2597
2598template <class _Allocator>
2599template <class _ForwardIterator>
2600typename enable_if
2601<
2602 __is_forward_iterator<_ForwardIterator>::value,
2603 void
2604>::type
2605vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2606{
2607 size_type __old_size = this->__size_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002608 this->__size_ += _VSTD::distance(__first, __last);
Marshall Clow1893ec72018-10-23 20:07:45 +00002609 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2610 {
2611 if (this->__size_ <= __bits_per_word)
2612 this->__begin_[0] = __storage_type(0);
2613 else
2614 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2615 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002616 _VSTD::copy(__first, __last, __make_iter(__old_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002617}
2618
2619template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002620inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002621vector<bool, _Allocator>::vector()
Marshall Clowe546cbb2015-06-04 02:05:41 +00002622 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant76053d72013-06-27 19:35:32 +00002623 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002624 __size_(0),
2625 __cap_alloc_(0)
2626{
2627}
2628
2629template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002630inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002631vector<bool, _Allocator>::vector(const allocator_type& __a)
Marshall Clow8f282f42015-06-04 00:10:20 +00002632#if _LIBCPP_STD_VER <= 14
2633 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
2634#else
2635 _NOEXCEPT
2636#endif
Howard Hinnant76053d72013-06-27 19:35:32 +00002637 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002638 __size_(0),
2639 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2640{
2641}
2642
2643template <class _Allocator>
2644vector<bool, _Allocator>::vector(size_type __n)
Howard Hinnant76053d72013-06-27 19:35:32 +00002645 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002646 __size_(0),
2647 __cap_alloc_(0)
2648{
2649 if (__n > 0)
2650 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002651 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002652 __construct_at_end(__n, false);
2653 }
2654}
2655
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002656#if _LIBCPP_STD_VER > 11
2657template <class _Allocator>
2658vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a)
2659 : __begin_(nullptr),
2660 __size_(0),
2661 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2662{
2663 if (__n > 0)
2664 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002665 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002666 __construct_at_end(__n, false);
2667 }
2668}
2669#endif
2670
Howard Hinnantc51e1022010-05-11 19:42:16 +00002671template <class _Allocator>
2672vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnant76053d72013-06-27 19:35:32 +00002673 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002674 __size_(0),
2675 __cap_alloc_(0)
2676{
2677 if (__n > 0)
2678 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002679 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002680 __construct_at_end(__n, __x);
2681 }
2682}
2683
2684template <class _Allocator>
2685vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002686 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002687 __size_(0),
2688 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2689{
2690 if (__n > 0)
2691 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002692 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002693 __construct_at_end(__n, __x);
2694 }
2695}
2696
2697template <class _Allocator>
2698template <class _InputIterator>
2699vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2700 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2701 !__is_forward_iterator<_InputIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002702 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002703 __size_(0),
2704 __cap_alloc_(0)
2705{
2706#ifndef _LIBCPP_NO_EXCEPTIONS
2707 try
2708 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002709#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002710 for (; __first != __last; ++__first)
2711 push_back(*__first);
2712#ifndef _LIBCPP_NO_EXCEPTIONS
2713 }
2714 catch (...)
2715 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002716 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002717 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2718 __invalidate_all_iterators();
2719 throw;
2720 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002721#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002722}
2723
2724template <class _Allocator>
2725template <class _InputIterator>
2726vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2727 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2728 !__is_forward_iterator<_InputIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002729 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002730 __size_(0),
2731 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2732{
2733#ifndef _LIBCPP_NO_EXCEPTIONS
2734 try
2735 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002736#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002737 for (; __first != __last; ++__first)
2738 push_back(*__first);
2739#ifndef _LIBCPP_NO_EXCEPTIONS
2740 }
2741 catch (...)
2742 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002743 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002744 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2745 __invalidate_all_iterators();
2746 throw;
2747 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002748#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002749}
2750
2751template <class _Allocator>
2752template <class _ForwardIterator>
2753vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2754 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002755 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002756 __size_(0),
2757 __cap_alloc_(0)
2758{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002759 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002760 if (__n > 0)
2761 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002762 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002763 __construct_at_end(__first, __last);
2764 }
2765}
2766
2767template <class _Allocator>
2768template <class _ForwardIterator>
2769vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2770 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002771 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002772 __size_(0),
2773 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2774{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002775 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002776 if (__n > 0)
2777 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002778 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002779 __construct_at_end(__first, __last);
2780 }
2781}
2782
Eric Fiseliered9e9362017-04-16 02:40:45 +00002783#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002784
Howard Hinnantc51e1022010-05-11 19:42:16 +00002785template <class _Allocator>
2786vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
Howard Hinnant76053d72013-06-27 19:35:32 +00002787 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002788 __size_(0),
2789 __cap_alloc_(0)
2790{
2791 size_type __n = static_cast<size_type>(__il.size());
2792 if (__n > 0)
2793 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002794 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002795 __construct_at_end(__il.begin(), __il.end());
2796 }
2797}
2798
2799template <class _Allocator>
2800vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002801 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002802 __size_(0),
2803 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2804{
2805 size_type __n = static_cast<size_type>(__il.size());
2806 if (__n > 0)
2807 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002808 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002809 __construct_at_end(__il.begin(), __il.end());
2810 }
2811}
2812
Eric Fiseliered9e9362017-04-16 02:40:45 +00002813#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002814
Howard Hinnantc51e1022010-05-11 19:42:16 +00002815template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002816vector<bool, _Allocator>::~vector()
2817{
Howard Hinnant76053d72013-06-27 19:35:32 +00002818 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002819 __storage_traits::deallocate(__alloc(), __begin_, __cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002820 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002821}
2822
2823template <class _Allocator>
2824vector<bool, _Allocator>::vector(const vector& __v)
Howard Hinnant76053d72013-06-27 19:35:32 +00002825 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002826 __size_(0),
2827 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2828{
2829 if (__v.size() > 0)
2830 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002831 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002832 __construct_at_end(__v.begin(), __v.end());
2833 }
2834}
2835
2836template <class _Allocator>
2837vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002838 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002839 __size_(0),
2840 __cap_alloc_(0, __a)
2841{
2842 if (__v.size() > 0)
2843 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002844 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002845 __construct_at_end(__v.begin(), __v.end());
2846 }
2847}
2848
2849template <class _Allocator>
2850vector<bool, _Allocator>&
2851vector<bool, _Allocator>::operator=(const vector& __v)
2852{
2853 if (this != &__v)
2854 {
2855 __copy_assign_alloc(__v);
2856 if (__v.__size_)
2857 {
2858 if (__v.__size_ > capacity())
2859 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002860 __vdeallocate();
2861 __vallocate(__v.__size_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002862 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002863 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002864 }
2865 __size_ = __v.__size_;
2866 }
2867 return *this;
2868}
2869
Eric Fiseliered9e9362017-04-16 02:40:45 +00002870#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant74279a52010-09-04 23:28:19 +00002871
Howard Hinnantc51e1022010-05-11 19:42:16 +00002872template <class _Allocator>
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002873inline _LIBCPP_INLINE_VISIBILITY vector<bool, _Allocator>::vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002874#if _LIBCPP_STD_VER > 14
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002875 _NOEXCEPT
Marshall Clowe5108202015-07-14 14:46:32 +00002876#else
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002877 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00002878#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002879 : __begin_(__v.__begin_),
2880 __size_(__v.__size_),
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002881 __cap_alloc_(std::move(__v.__cap_alloc_)) {
Howard Hinnant76053d72013-06-27 19:35:32 +00002882 __v.__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002883 __v.__size_ = 0;
2884 __v.__cap() = 0;
2885}
2886
2887template <class _Allocator>
2888vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002889 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002890 __size_(0),
2891 __cap_alloc_(0, __a)
2892{
2893 if (__a == allocator_type(__v.__alloc()))
2894 {
2895 this->__begin_ = __v.__begin_;
2896 this->__size_ = __v.__size_;
2897 this->__cap() = __v.__cap();
2898 __v.__begin_ = nullptr;
2899 __v.__cap() = __v.__size_ = 0;
2900 }
2901 else if (__v.size() > 0)
2902 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002903 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002904 __construct_at_end(__v.begin(), __v.end());
2905 }
2906}
2907
2908template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002909inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002910vector<bool, _Allocator>&
2911vector<bool, _Allocator>::operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002912 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002913{
2914 __move_assign(__v, integral_constant<bool,
2915 __storage_traits::propagate_on_container_move_assignment::value>());
Argyrios Kyrtzidisaf904652012-10-13 02:03:45 +00002916 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002917}
2918
2919template <class _Allocator>
2920void
2921vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2922{
2923 if (__alloc() != __c.__alloc())
2924 assign(__c.begin(), __c.end());
2925 else
2926 __move_assign(__c, true_type());
2927}
2928
2929template <class _Allocator>
2930void
2931vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002932 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002933{
Marshall Clow3ff48e02018-05-22 16:20:28 +00002934 __vdeallocate();
Marshall Clowb4871fa2014-07-21 15:15:15 +00002935 __move_assign_alloc(__c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002936 this->__begin_ = __c.__begin_;
2937 this->__size_ = __c.__size_;
2938 this->__cap() = __c.__cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002939 __c.__begin_ = nullptr;
2940 __c.__cap() = __c.__size_ = 0;
2941}
Howard Hinnant74279a52010-09-04 23:28:19 +00002942
Eric Fiseliered9e9362017-04-16 02:40:45 +00002943#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002944
2945template <class _Allocator>
2946void
2947vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2948{
2949 __size_ = 0;
2950 if (__n > 0)
2951 {
2952 size_type __c = capacity();
2953 if (__n <= __c)
2954 __size_ = __n;
2955 else
2956 {
2957 vector __v(__alloc());
2958 __v.reserve(__recommend(__n));
2959 __v.__size_ = __n;
2960 swap(__v);
2961 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002962 _VSTD::fill_n(begin(), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002963 }
Eric Fiselier69c51982016-12-28 06:06:09 +00002964 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002965}
2966
2967template <class _Allocator>
2968template <class _InputIterator>
2969typename enable_if
2970<
2971 __is_input_iterator<_InputIterator>::value &&
2972 !__is_forward_iterator<_InputIterator>::value,
2973 void
2974>::type
2975vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2976{
2977 clear();
2978 for (; __first != __last; ++__first)
2979 push_back(*__first);
2980}
2981
2982template <class _Allocator>
2983template <class _ForwardIterator>
2984typename enable_if
2985<
2986 __is_forward_iterator<_ForwardIterator>::value,
2987 void
2988>::type
2989vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2990{
2991 clear();
Eric Fiselier6003c772016-12-23 23:37:52 +00002992 difference_type __ns = _VSTD::distance(__first, __last);
2993 _LIBCPP_ASSERT(__ns >= 0, "invalid range specified");
2994 const size_t __n = static_cast<size_type>(__ns);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002995 if (__n)
2996 {
2997 if (__n > capacity())
2998 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002999 __vdeallocate();
3000 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003001 }
3002 __construct_at_end(__first, __last);
3003 }
3004}
3005
3006template <class _Allocator>
3007void
3008vector<bool, _Allocator>::reserve(size_type __n)
3009{
3010 if (__n > capacity())
3011 {
3012 vector __v(this->__alloc());
Marshall Clow3ff48e02018-05-22 16:20:28 +00003013 __v.__vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003014 __v.__construct_at_end(this->begin(), this->end());
3015 swap(__v);
3016 __invalidate_all_iterators();
3017 }
3018}
3019
3020template <class _Allocator>
3021void
Howard Hinnant1c936782011-06-03 19:40:40 +00003022vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003023{
3024 if (__external_cap_to_internal(size()) > __cap())
3025 {
3026#ifndef _LIBCPP_NO_EXCEPTIONS
3027 try
3028 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003029#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003030 vector(*this, allocator_type(__alloc())).swap(*this);
3031#ifndef _LIBCPP_NO_EXCEPTIONS
3032 }
3033 catch (...)
3034 {
3035 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003036#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003037 }
3038}
3039
3040template <class _Allocator>
3041typename vector<bool, _Allocator>::reference
3042vector<bool, _Allocator>::at(size_type __n)
3043{
3044 if (__n >= size())
3045 this->__throw_out_of_range();
3046 return (*this)[__n];
3047}
3048
3049template <class _Allocator>
3050typename vector<bool, _Allocator>::const_reference
3051vector<bool, _Allocator>::at(size_type __n) const
3052{
3053 if (__n >= size())
3054 this->__throw_out_of_range();
3055 return (*this)[__n];
3056}
3057
3058template <class _Allocator>
3059void
3060vector<bool, _Allocator>::push_back(const value_type& __x)
3061{
3062 if (this->__size_ == this->capacity())
3063 reserve(__recommend(this->__size_ + 1));
3064 ++this->__size_;
3065 back() = __x;
3066}
3067
3068template <class _Allocator>
3069typename vector<bool, _Allocator>::iterator
3070vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
3071{
3072 iterator __r;
3073 if (size() < capacity())
3074 {
3075 const_iterator __old_end = end();
3076 ++__size_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003077 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003078 __r = __const_iterator_cast(__position);
3079 }
3080 else
3081 {
3082 vector __v(__alloc());
3083 __v.reserve(__recommend(__size_ + 1));
3084 __v.__size_ = __size_ + 1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003085 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3086 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003087 swap(__v);
3088 }
3089 *__r = __x;
3090 return __r;
3091}
3092
3093template <class _Allocator>
3094typename vector<bool, _Allocator>::iterator
3095vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
3096{
3097 iterator __r;
3098 size_type __c = capacity();
3099 if (__n <= __c && size() <= __c - __n)
3100 {
3101 const_iterator __old_end = end();
3102 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003103 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003104 __r = __const_iterator_cast(__position);
3105 }
3106 else
3107 {
3108 vector __v(__alloc());
3109 __v.reserve(__recommend(__size_ + __n));
3110 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003111 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3112 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003113 swap(__v);
3114 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003115 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003116 return __r;
3117}
3118
3119template <class _Allocator>
3120template <class _InputIterator>
3121typename enable_if
3122<
3123 __is_input_iterator <_InputIterator>::value &&
3124 !__is_forward_iterator<_InputIterator>::value,
3125 typename vector<bool, _Allocator>::iterator
3126>::type
3127vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
3128{
3129 difference_type __off = __position - begin();
3130 iterator __p = __const_iterator_cast(__position);
3131 iterator __old_end = end();
3132 for (; size() != capacity() && __first != __last; ++__first)
3133 {
3134 ++this->__size_;
3135 back() = *__first;
3136 }
3137 vector __v(__alloc());
3138 if (__first != __last)
3139 {
3140#ifndef _LIBCPP_NO_EXCEPTIONS
3141 try
3142 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003143#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003144 __v.assign(__first, __last);
3145 difference_type __old_size = static_cast<difference_type>(__old_end - begin());
3146 difference_type __old_p = __p - begin();
3147 reserve(__recommend(size() + __v.size()));
3148 __p = begin() + __old_p;
3149 __old_end = begin() + __old_size;
3150#ifndef _LIBCPP_NO_EXCEPTIONS
3151 }
3152 catch (...)
3153 {
3154 erase(__old_end, end());
3155 throw;
3156 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003157#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003158 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003159 __p = _VSTD::rotate(__p, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003160 insert(__p, __v.begin(), __v.end());
3161 return begin() + __off;
3162}
3163
3164template <class _Allocator>
3165template <class _ForwardIterator>
3166typename enable_if
3167<
3168 __is_forward_iterator<_ForwardIterator>::value,
3169 typename vector<bool, _Allocator>::iterator
3170>::type
3171vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
3172{
Eric Fiselier654dd332016-12-11 05:31:00 +00003173 const difference_type __n_signed = _VSTD::distance(__first, __last);
3174 _LIBCPP_ASSERT(__n_signed >= 0, "invalid range specified");
3175 const size_type __n = static_cast<size_type>(__n_signed);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003176 iterator __r;
3177 size_type __c = capacity();
3178 if (__n <= __c && size() <= __c - __n)
3179 {
3180 const_iterator __old_end = end();
3181 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003182 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003183 __r = __const_iterator_cast(__position);
3184 }
3185 else
3186 {
3187 vector __v(__alloc());
3188 __v.reserve(__recommend(__size_ + __n));
3189 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003190 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3191 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003192 swap(__v);
3193 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003194 _VSTD::copy(__first, __last, __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003195 return __r;
3196}
3197
3198template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003199inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003200typename vector<bool, _Allocator>::iterator
3201vector<bool, _Allocator>::erase(const_iterator __position)
3202{
3203 iterator __r = __const_iterator_cast(__position);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003204 _VSTD::copy(__position + 1, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003205 --__size_;
3206 return __r;
3207}
3208
3209template <class _Allocator>
3210typename vector<bool, _Allocator>::iterator
3211vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
3212{
3213 iterator __r = __const_iterator_cast(__first);
3214 difference_type __d = __last - __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003215 _VSTD::copy(__last, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003216 __size_ -= __d;
3217 return __r;
3218}
3219
3220template <class _Allocator>
3221void
3222vector<bool, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00003223#if _LIBCPP_STD_VER >= 14
3224 _NOEXCEPT
3225#else
Eric Fiselier69c51982016-12-28 06:06:09 +00003226 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00003227 __is_nothrow_swappable<allocator_type>::value)
3228#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00003229{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003230 _VSTD::swap(this->__begin_, __x.__begin_);
3231 _VSTD::swap(this->__size_, __x.__size_);
3232 _VSTD::swap(this->__cap(), __x.__cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00003233 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00003234 integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003235}
3236
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003237template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003238void
3239vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3240{
3241 size_type __cs = size();
3242 if (__cs < __sz)
3243 {
3244 iterator __r;
3245 size_type __c = capacity();
3246 size_type __n = __sz - __cs;
3247 if (__n <= __c && __cs <= __c - __n)
3248 {
3249 __r = end();
3250 __size_ += __n;
3251 }
3252 else
3253 {
3254 vector __v(__alloc());
3255 __v.reserve(__recommend(__size_ + __n));
3256 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003257 __r = _VSTD::copy(cbegin(), cend(), __v.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003258 swap(__v);
3259 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003260 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003261 }
3262 else
3263 __size_ = __sz;
3264}
3265
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003266template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003267void
Howard Hinnant1c936782011-06-03 19:40:40 +00003268vector<bool, _Allocator>::flip() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003269{
3270 // do middle whole words
3271 size_type __n = __size_;
3272 __storage_pointer __p = __begin_;
3273 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3274 *__p = ~*__p;
3275 // do last partial word
3276 if (__n > 0)
3277 {
3278 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3279 __storage_type __b = *__p & __m;
3280 *__p &= ~__m;
3281 *__p |= ~__b & __m;
3282 }
3283}
3284
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003285template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003286bool
3287vector<bool, _Allocator>::__invariants() const
3288{
Howard Hinnant76053d72013-06-27 19:35:32 +00003289 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003290 {
3291 if (this->__size_ != 0 || this->__cap() != 0)
3292 return false;
3293 }
3294 else
3295 {
3296 if (this->__cap() == 0)
3297 return false;
3298 if (this->__size_ > this->capacity())
3299 return false;
3300 }
3301 return true;
3302}
3303
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003304template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003305size_t
Howard Hinnant1c936782011-06-03 19:40:40 +00003306vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003307{
3308 size_t __h = 0;
3309 // do middle whole words
3310 size_type __n = __size_;
3311 __storage_pointer __p = __begin_;
3312 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3313 __h ^= *__p;
3314 // do last partial word
3315 if (__n > 0)
3316 {
3317 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3318 __h ^= *__p & __m;
3319 }
3320 return __h;
3321}
3322
3323template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00003324struct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003325 : public unary_function<vector<bool, _Allocator>, size_t>
3326{
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003327 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00003328 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003329 {return __vec.__hash_code();}
3330};
3331
3332template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003333inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003334bool
3335operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3336{
3337 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003338 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003339}
3340
3341template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003342inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003343bool
3344operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3345{
3346 return !(__x == __y);
3347}
3348
3349template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003350inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003351bool
3352operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3353{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003354 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003355}
3356
3357template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003358inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003359bool
3360operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3361{
3362 return __y < __x;
3363}
3364
3365template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003366inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003367bool
3368operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3369{
3370 return !(__x < __y);
3371}
3372
3373template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003374inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003375bool
3376operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3377{
3378 return !(__y < __x);
3379}
3380
3381template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003382inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003383void
3384swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
Howard Hinnant1c936782011-06-03 19:40:40 +00003385 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00003386{
3387 __x.swap(__y);
3388}
3389
Marshall Clow29b53f22018-12-14 18:49:35 +00003390#if _LIBCPP_STD_VER > 17
3391template <class _Tp, class _Allocator, class _Up>
3392inline _LIBCPP_INLINE_VISIBILITY
3393void erase(vector<_Tp, _Allocator>& __c, const _Up& __v)
3394{ __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end()); }
3395
3396template <class _Tp, class _Allocator, class _Predicate>
3397inline _LIBCPP_INLINE_VISIBILITY
3398void erase_if(vector<_Tp, _Allocator>& __c, _Predicate __pred)
3399{ __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end()); }
3400#endif
3401
Howard Hinnantc51e1022010-05-11 19:42:16 +00003402_LIBCPP_END_NAMESPACE_STD
3403
Eric Fiselierf4433a32017-05-31 22:07:49 +00003404_LIBCPP_POP_MACROS
3405
Howard Hinnantc51e1022010-05-11 19:42:16 +00003406#endif // _LIBCPP_VECTOR