blob: edb6d3e09f5faf586a0121e8041684c5bd469838 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===------------------------------ vector --------------------------------===//
3//
Howard Hinnantc566dc32010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00005//
Howard Hinnantee11c312010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_VECTOR
12#define _LIBCPP_VECTOR
13
14/*
15 vector synopsis
16
17namespace std
18{
19
Howard Hinnant3b6579a2010-08-22 00:02:43 +000020template <class T, class Allocator = allocator<T> >
Howard Hinnantc51e1022010-05-11 19:42:16 +000021class vector
Howard Hinnant3b6579a2010-08-22 00:02:43 +000022{
23public:
24 typedef T value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +000025 typedef Allocator allocator_type;
26 typedef typename allocator_type::reference reference;
27 typedef typename allocator_type::const_reference const_reference;
28 typedef implementation-defined iterator;
29 typedef implementation-defined const_iterator;
30 typedef typename allocator_type::size_type size_type;
31 typedef typename allocator_type::difference_type difference_type;
32 typedef typename allocator_type::pointer pointer;
33 typedef typename allocator_type::const_pointer const_pointer;
34 typedef std::reverse_iterator<iterator> reverse_iterator;
35 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
36
Howard Hinnant1c936782011-06-03 19:40:40 +000037 vector()
38 noexcept(is_nothrow_default_constructible<allocator_type>::value);
39 explicit vector(const allocator_type&);
Howard Hinnantc51e1022010-05-11 19:42:16 +000040 explicit vector(size_type n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +000041 explicit vector(size_type n, const allocator_type&); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +000042 vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
43 template <class InputIterator>
44 vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
45 vector(const vector& x);
Howard Hinnant1c936782011-06-03 19:40:40 +000046 vector(vector&& x)
47 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000048 vector(initializer_list<value_type> il);
49 vector(initializer_list<value_type> il, const allocator_type& a);
50 ~vector();
51 vector& operator=(const vector& x);
Howard Hinnant1c936782011-06-03 19:40:40 +000052 vector& operator=(vector&& x)
53 noexcept(
Marshall Clow2fe8a8d2015-08-18 18:57:00 +000054 allocator_type::propagate_on_container_move_assignment::value ||
55 allocator_type::is_always_equal::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +000056 vector& operator=(initializer_list<value_type> il);
57 template <class InputIterator>
58 void assign(InputIterator first, InputIterator last);
59 void assign(size_type n, const value_type& u);
60 void assign(initializer_list<value_type> il);
61
Howard Hinnant1c936782011-06-03 19:40:40 +000062 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000063
Howard Hinnant1c936782011-06-03 19:40:40 +000064 iterator begin() noexcept;
65 const_iterator begin() const noexcept;
66 iterator end() noexcept;
67 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000068
Howard Hinnant1c936782011-06-03 19:40:40 +000069 reverse_iterator rbegin() noexcept;
70 const_reverse_iterator rbegin() const noexcept;
71 reverse_iterator rend() noexcept;
72 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000073
Howard Hinnant1c936782011-06-03 19:40:40 +000074 const_iterator cbegin() const noexcept;
75 const_iterator cend() const noexcept;
76 const_reverse_iterator crbegin() const noexcept;
77 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000078
Howard Hinnant1c936782011-06-03 19:40:40 +000079 size_type size() const noexcept;
80 size_type max_size() const noexcept;
81 size_type capacity() const noexcept;
82 bool empty() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000083 void reserve(size_type n);
Howard Hinnant1c936782011-06-03 19:40:40 +000084 void shrink_to_fit() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000085
86 reference operator[](size_type n);
87 const_reference operator[](size_type n) const;
88 reference at(size_type n);
89 const_reference at(size_type n) const;
90
91 reference front();
92 const_reference front() const;
93 reference back();
94 const_reference back() const;
95
Howard Hinnant1c936782011-06-03 19:40:40 +000096 value_type* data() noexcept;
97 const value_type* data() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000098
99 void push_back(const value_type& x);
100 void push_back(value_type&& x);
101 template <class... Args>
Marshall Clowea52cc42017-01-24 23:09:12 +0000102 reference emplace_back(Args&&... args); // reference in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000103 void pop_back();
104
105 template <class... Args> iterator emplace(const_iterator position, Args&&... args);
106 iterator insert(const_iterator position, const value_type& x);
107 iterator insert(const_iterator position, value_type&& x);
108 iterator insert(const_iterator position, size_type n, const value_type& x);
109 template <class InputIterator>
110 iterator insert(const_iterator position, InputIterator first, InputIterator last);
111 iterator insert(const_iterator position, initializer_list<value_type> il);
112
113 iterator erase(const_iterator position);
114 iterator erase(const_iterator first, const_iterator last);
115
Howard Hinnant1c936782011-06-03 19:40:40 +0000116 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000117
118 void resize(size_type sz);
119 void resize(size_type sz, const value_type& c);
120
Howard Hinnant1c936782011-06-03 19:40:40 +0000121 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000122 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
123 allocator_traits<allocator_type>::is_always_equal::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000124
125 bool __invariants() const;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000126};
Howard Hinnantc51e1022010-05-11 19:42:16 +0000127
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000128template <class Allocator = allocator<T> >
Howard Hinnantc51e1022010-05-11 19:42:16 +0000129class vector<bool, Allocator>
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000130{
131public:
132 typedef bool value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000133 typedef Allocator allocator_type;
134 typedef implementation-defined iterator;
135 typedef implementation-defined const_iterator;
136 typedef typename allocator_type::size_type size_type;
137 typedef typename allocator_type::difference_type difference_type;
138 typedef iterator pointer;
139 typedef const_iterator const_pointer;
140 typedef std::reverse_iterator<iterator> reverse_iterator;
141 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
142
143 class reference
144 {
145 public:
Howard Hinnant1c936782011-06-03 19:40:40 +0000146 reference(const reference&) noexcept;
147 operator bool() const noexcept;
148 reference& operator=(const bool x) noexcept;
149 reference& operator=(const reference& x) noexcept;
150 iterator operator&() const noexcept;
151 void flip() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000152 };
153
154 class const_reference
155 {
156 public:
Howard Hinnant1c936782011-06-03 19:40:40 +0000157 const_reference(const reference&) noexcept;
158 operator bool() const noexcept;
159 const_iterator operator&() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000160 };
161
Howard Hinnant1c936782011-06-03 19:40:40 +0000162 vector()
163 noexcept(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnantc2734962011-09-02 20:42:31 +0000164 explicit vector(const allocator_type&);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +0000165 explicit vector(size_type n, const allocator_type& a = allocator_type()); // C++14
166 vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000167 template <class InputIterator>
168 vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
169 vector(const vector& x);
Howard Hinnant1c936782011-06-03 19:40:40 +0000170 vector(vector&& x)
171 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000172 vector(initializer_list<value_type> il);
173 vector(initializer_list<value_type> il, const allocator_type& a);
174 ~vector();
175 vector& operator=(const vector& x);
Howard Hinnant1c936782011-06-03 19:40:40 +0000176 vector& operator=(vector&& x)
177 noexcept(
Marshall Clow2fe8a8d2015-08-18 18:57:00 +0000178 allocator_type::propagate_on_container_move_assignment::value ||
179 allocator_type::is_always_equal::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000180 vector& operator=(initializer_list<value_type> il);
181 template <class InputIterator>
182 void assign(InputIterator first, InputIterator last);
183 void assign(size_type n, const value_type& u);
184 void assign(initializer_list<value_type> il);
185
Howard Hinnant1c936782011-06-03 19:40:40 +0000186 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000187
Howard Hinnant1c936782011-06-03 19:40:40 +0000188 iterator begin() noexcept;
189 const_iterator begin() const noexcept;
190 iterator end() noexcept;
191 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000192
Howard Hinnant1c936782011-06-03 19:40:40 +0000193 reverse_iterator rbegin() noexcept;
194 const_reverse_iterator rbegin() const noexcept;
195 reverse_iterator rend() noexcept;
196 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000197
Howard Hinnant1c936782011-06-03 19:40:40 +0000198 const_iterator cbegin() const noexcept;
199 const_iterator cend() const noexcept;
200 const_reverse_iterator crbegin() const noexcept;
201 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000202
Howard Hinnant1c936782011-06-03 19:40:40 +0000203 size_type size() const noexcept;
204 size_type max_size() const noexcept;
205 size_type capacity() const noexcept;
206 bool empty() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000207 void reserve(size_type n);
Howard Hinnant1c936782011-06-03 19:40:40 +0000208 void shrink_to_fit() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000209
210 reference operator[](size_type n);
211 const_reference operator[](size_type n) const;
212 reference at(size_type n);
213 const_reference at(size_type n) const;
214
215 reference front();
216 const_reference front() const;
217 reference back();
218 const_reference back() const;
219
220 void push_back(const value_type& x);
Marshall Clowea52cc42017-01-24 23:09:12 +0000221 template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000222 void pop_back();
223
Marshall Clowc46bb8e2013-08-13 23:54:12 +0000224 template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000225 iterator insert(const_iterator position, const value_type& x);
226 iterator insert(const_iterator position, size_type n, const value_type& x);
227 template <class InputIterator>
228 iterator insert(const_iterator position, InputIterator first, InputIterator last);
229 iterator insert(const_iterator position, initializer_list<value_type> il);
230
231 iterator erase(const_iterator position);
232 iterator erase(const_iterator first, const_iterator last);
233
Howard Hinnant1c936782011-06-03 19:40:40 +0000234 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000235
236 void resize(size_type sz);
237 void resize(size_type sz, value_type x);
238
Howard Hinnant1c936782011-06-03 19:40:40 +0000239 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000240 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
241 allocator_traits<allocator_type>::is_always_equal::value); // C++17
Howard Hinnant1c936782011-06-03 19:40:40 +0000242 void flip() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000243
244 bool __invariants() const;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000245};
Howard Hinnantc51e1022010-05-11 19:42:16 +0000246
Marshall Clowf0ca1492018-05-21 21:30:12 +0000247template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
248 vector(InputIterator, InputIterator, Allocator = Allocator())
249 -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>;
250
Howard Hinnantc51e1022010-05-11 19:42:16 +0000251template <class Allocator> struct hash<std::vector<bool, Allocator>>;
252
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);
258template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
259
Howard Hinnant1c936782011-06-03 19:40:40 +0000260template <class T, class Allocator>
261void swap(vector<T,Allocator>& x, vector<T,Allocator>& y)
262 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000263
Marshall Clow29b53f22018-12-14 18:49:35 +0000264template <class T, class Allocator, class U>
265 void erase(vector<T, Allocator>& c, const U& value); // C++20
266template <class T, class Allocator, class Predicate>
267 void erase_if(vector<T, Allocator>& c, Predicate pred); // C++20
268
Howard Hinnantc51e1022010-05-11 19:42:16 +0000269} // std
270
271*/
272
273#include <__config>
Eric Fiselier876c6862016-02-20 00:19:45 +0000274#include <iosfwd> // for forward declaration of vector
Howard Hinnantc51e1022010-05-11 19:42:16 +0000275#include <__bit_reference>
276#include <type_traits>
277#include <climits>
278#include <limits>
279#include <initializer_list>
280#include <memory>
281#include <stdexcept>
282#include <algorithm>
283#include <cstring>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000284#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000285#include <__split_buffer>
286#include <__functional_base>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000287
Eric Fiselier14b6de92014-08-10 23:53:08 +0000288#include <__debug>
Howard Hinnante6ff0b62013-08-02 00:26:35 +0000289
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000290#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000291#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000292#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000293
Eric Fiselierf4433a32017-05-31 22:07:49 +0000294_LIBCPP_PUSH_MACROS
295#include <__undef_macros>
296
297
Howard Hinnantc51e1022010-05-11 19:42:16 +0000298_LIBCPP_BEGIN_NAMESPACE_STD
299
300template <bool>
301class __vector_base_common
302{
303protected:
Louis Dionne16fe2952018-07-11 23:14:33 +0000304 _LIBCPP_INLINE_VISIBILITY __vector_base_common() {}
Marshall Clow8fea1612016-08-25 15:09:01 +0000305 _LIBCPP_NORETURN void __throw_length_error() const;
306 _LIBCPP_NORETURN void __throw_out_of_range() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000307};
308
309template <bool __b>
310void
311__vector_base_common<__b>::__throw_length_error() const
312{
Marshall Clow8fea1612016-08-25 15:09:01 +0000313 _VSTD::__throw_length_error("vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +0000314}
315
316template <bool __b>
317void
318__vector_base_common<__b>::__throw_out_of_range() const
319{
Marshall Clow8fea1612016-08-25 15:09:01 +0000320 _VSTD::__throw_out_of_range("vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321}
322
Eric Fiselier1b57fa82016-09-15 22:27:07 +0000323_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __vector_base_common<true>)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324
325template <class _Tp, class _Allocator>
326class __vector_base
327 : protected __vector_base_common<true>
328{
Marshall Clowf0ca1492018-05-21 21:30:12 +0000329public:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000330 typedef _Allocator allocator_type;
331 typedef allocator_traits<allocator_type> __alloc_traits;
Marshall Clowf0ca1492018-05-21 21:30:12 +0000332 typedef typename __alloc_traits::size_type size_type;
333protected:
334 typedef _Tp value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000335 typedef value_type& reference;
336 typedef const value_type& const_reference;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337 typedef typename __alloc_traits::difference_type difference_type;
338 typedef typename __alloc_traits::pointer pointer;
339 typedef typename __alloc_traits::const_pointer const_pointer;
340 typedef pointer iterator;
341 typedef const_pointer const_iterator;
342
343 pointer __begin_;
344 pointer __end_;
345 __compressed_pair<pointer, allocator_type> __end_cap_;
346
Howard Hinnant1c936782011-06-03 19:40:40 +0000347 _LIBCPP_INLINE_VISIBILITY
348 allocator_type& __alloc() _NOEXCEPT
349 {return __end_cap_.second();}
350 _LIBCPP_INLINE_VISIBILITY
351 const allocator_type& __alloc() const _NOEXCEPT
352 {return __end_cap_.second();}
353 _LIBCPP_INLINE_VISIBILITY
354 pointer& __end_cap() _NOEXCEPT
355 {return __end_cap_.first();}
356 _LIBCPP_INLINE_VISIBILITY
357 const pointer& __end_cap() const _NOEXCEPT
358 {return __end_cap_.first();}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000359
Howard Hinnant1c936782011-06-03 19:40:40 +0000360 _LIBCPP_INLINE_VISIBILITY
361 __vector_base()
362 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnantcf823322010-12-17 14:46:43 +0000363 _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a);
Eric Fiselier4f1534c2018-06-05 22:32:52 +0000364#ifndef _LIBCPP_CXX03_LANG
365 _LIBCPP_INLINE_VISIBILITY __vector_base(allocator_type&& __a) _NOEXCEPT;
366#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367 ~__vector_base();
368
Howard Hinnant1c936782011-06-03 19:40:40 +0000369 _LIBCPP_INLINE_VISIBILITY
370 void clear() _NOEXCEPT {__destruct_at_end(__begin_);}
371 _LIBCPP_INLINE_VISIBILITY
372 size_type capacity() const _NOEXCEPT
373 {return static_cast<size_type>(__end_cap() - __begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374
Howard Hinnant1c936782011-06-03 19:40:40 +0000375 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant76053d72013-06-27 19:35:32 +0000376 void __destruct_at_end(pointer __new_last) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000378 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000379 void __copy_assign_alloc(const __vector_base& __c)
380 {__copy_assign_alloc(__c, integral_constant<bool,
381 __alloc_traits::propagate_on_container_copy_assignment::value>());}
382
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000383 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384 void __move_assign_alloc(__vector_base& __c)
Howard Hinnant1c936782011-06-03 19:40:40 +0000385 _NOEXCEPT_(
386 !__alloc_traits::propagate_on_container_move_assignment::value ||
387 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000388 {__move_assign_alloc(__c, integral_constant<bool,
389 __alloc_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000391 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000392 void __copy_assign_alloc(const __vector_base& __c, true_type)
393 {
394 if (__alloc() != __c.__alloc())
395 {
396 clear();
397 __alloc_traits::deallocate(__alloc(), __begin_, capacity());
398 __begin_ = __end_ = __end_cap() = nullptr;
399 }
400 __alloc() = __c.__alloc();
401 }
402
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000403 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +0000404 void __copy_assign_alloc(const __vector_base&, false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405 {}
406
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000407 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc2734962011-09-02 20:42:31 +0000408 void __move_assign_alloc(__vector_base& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +0000409 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000410 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000411 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412 }
413
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000414 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +0000415 void __move_assign_alloc(__vector_base&, false_type)
Howard Hinnant1c936782011-06-03 19:40:40 +0000416 _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000417 {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000418};
419
420template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000421inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000422void
Howard Hinnant76053d72013-06-27 19:35:32 +0000423__vector_base<_Tp, _Allocator>::__destruct_at_end(pointer __new_last) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000424{
Bruce Mitchener405fdcd2017-03-23 14:39:23 +0000425 pointer __soon_to_be_end = __end_;
426 while (__new_last != __soon_to_be_end)
427 __alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(--__soon_to_be_end));
428 __end_ = __new_last;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000429}
430
431template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000432inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000433__vector_base<_Tp, _Allocator>::__vector_base()
Howard Hinnant1c936782011-06-03 19:40:40 +0000434 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant76053d72013-06-27 19:35:32 +0000435 : __begin_(nullptr),
436 __end_(nullptr),
437 __end_cap_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000438{
439}
440
441template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000442inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000443__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +0000444 : __begin_(nullptr),
445 __end_(nullptr),
446 __end_cap_(nullptr, __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000447{
448}
449
Eric Fiselier4f1534c2018-06-05 22:32:52 +0000450#ifndef _LIBCPP_CXX03_LANG
451template <class _Tp, class _Allocator>
452inline _LIBCPP_INLINE_VISIBILITY
453__vector_base<_Tp, _Allocator>::__vector_base(allocator_type&& __a) _NOEXCEPT
454 : __begin_(nullptr),
455 __end_(nullptr),
456 __end_cap_(nullptr, std::move(__a)) {}
457#endif
458
Howard Hinnantc51e1022010-05-11 19:42:16 +0000459template <class _Tp, class _Allocator>
460__vector_base<_Tp, _Allocator>::~__vector_base()
461{
Howard Hinnant76053d72013-06-27 19:35:32 +0000462 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000463 {
464 clear();
465 __alloc_traits::deallocate(__alloc(), __begin_, capacity());
466 }
467}
468
Eric Fiselier876c6862016-02-20 00:19:45 +0000469template <class _Tp, class _Allocator /* = allocator<_Tp> */>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000470class _LIBCPP_TEMPLATE_VIS vector
Howard Hinnantc51e1022010-05-11 19:42:16 +0000471 : private __vector_base<_Tp, _Allocator>
472{
473private:
474 typedef __vector_base<_Tp, _Allocator> __base;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000475 typedef allocator<_Tp> __default_allocator_type;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000476public:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000477 typedef vector __self;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000478 typedef _Tp value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479 typedef _Allocator allocator_type;
480 typedef typename __base::__alloc_traits __alloc_traits;
481 typedef typename __base::reference reference;
482 typedef typename __base::const_reference const_reference;
483 typedef typename __base::size_type size_type;
484 typedef typename __base::difference_type difference_type;
485 typedef typename __base::pointer pointer;
486 typedef typename __base::const_pointer const_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000487 typedef __wrap_iter<pointer> iterator;
488 typedef __wrap_iter<const_pointer> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000489 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
490 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000491
Howard Hinnanta416ff02013-03-26 19:04:56 +0000492 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
493 "Allocator::value_type must be same type as value_type");
494
Howard Hinnant1c936782011-06-03 19:40:40 +0000495 _LIBCPP_INLINE_VISIBILITY
Marshall Clowe546cbb2015-06-04 02:05:41 +0000496 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant27e0e772011-09-14 18:33:51 +0000497 {
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000498#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000499 __get_db()->__insert_c(this);
500#endif
501 }
502 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
Marshall Clow8f282f42015-06-04 00:10:20 +0000503#if _LIBCPP_STD_VER <= 14
504 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
505#else
506 _NOEXCEPT
507#endif
Howard Hinnant27e0e772011-09-14 18:33:51 +0000508 : __base(__a)
509 {
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000510#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000511 __get_db()->__insert_c(this);
512#endif
513 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000514 explicit vector(size_type __n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +0000515#if _LIBCPP_STD_VER > 11
516 explicit vector(size_type __n, const allocator_type& __a);
517#endif
Marshall Clowf0ca1492018-05-21 21:30:12 +0000518 vector(size_type __n, const value_type& __x);
519 vector(size_type __n, const value_type& __x, const allocator_type& __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000520 template <class _InputIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +0000521 vector(_InputIterator __first,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000523 !__is_forward_iterator<_InputIterator>::value &&
524 is_constructible<
525 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +0000526 typename iterator_traits<_InputIterator>::reference>::value,
527 _InputIterator>::type __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528 template <class _InputIterator>
529 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
530 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000531 !__is_forward_iterator<_InputIterator>::value &&
532 is_constructible<
533 value_type,
534 typename iterator_traits<_InputIterator>::reference>::value>::type* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535 template <class _ForwardIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +0000536 vector(_ForwardIterator __first,
Howard Hinnant88010252013-03-28 17:44:32 +0000537 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
538 is_constructible<
539 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +0000540 typename iterator_traits<_ForwardIterator>::reference>::value,
541 _ForwardIterator>::type __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542 template <class _ForwardIterator>
543 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant88010252013-03-28 17:44:32 +0000544 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
545 is_constructible<
546 value_type,
547 typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000548
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000549 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant27e0e772011-09-14 18:33:51 +0000550 ~vector()
551 {
Marshall Clow68af4f32018-09-07 15:47:59 +0000552 __annotate_delete();
553#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000554 __get_db()->__erase_c(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000555#endif
Marshall Clow68af4f32018-09-07 15:47:59 +0000556 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000557
558 vector(const vector& __x);
559 vector(const vector& __x, const allocator_type& __a);
Howard Hinnantcf823322010-12-17 14:46:43 +0000560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000561 vector& operator=(const vector& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000562
563#ifndef _LIBCPP_CXX03_LANG
564 _LIBCPP_INLINE_VISIBILITY
565 vector(initializer_list<value_type> __il);
566
567 _LIBCPP_INLINE_VISIBILITY
568 vector(initializer_list<value_type> __il, const allocator_type& __a);
569
Howard Hinnantcf823322010-12-17 14:46:43 +0000570 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000571 vector(vector&& __x)
Marshall Clowe5108202015-07-14 14:46:32 +0000572#if _LIBCPP_STD_VER > 14
573 _NOEXCEPT;
574#else
Howard Hinnant1c936782011-06-03 19:40:40 +0000575 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clowe5108202015-07-14 14:46:32 +0000576#endif
Eric Fiseliered9e9362017-04-16 02:40:45 +0000577
Howard Hinnantcf823322010-12-17 14:46:43 +0000578 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000579 vector(vector&& __x, const allocator_type& __a);
Howard Hinnantcf823322010-12-17 14:46:43 +0000580 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000581 vector& operator=(vector&& __x)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +0000582 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Eric Fiseliered9e9362017-04-16 02:40:45 +0000583
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000584 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000585 vector& operator=(initializer_list<value_type> __il)
586 {assign(__il.begin(), __il.end()); return *this;}
Eric Fiseliered9e9362017-04-16 02:40:45 +0000587
588#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000589
590 template <class _InputIterator>
591 typename enable_if
592 <
593 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000594 !__is_forward_iterator<_InputIterator>::value &&
595 is_constructible<
596 value_type,
597 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000598 void
599 >::type
600 assign(_InputIterator __first, _InputIterator __last);
601 template <class _ForwardIterator>
602 typename enable_if
603 <
Howard Hinnant88010252013-03-28 17:44:32 +0000604 __is_forward_iterator<_ForwardIterator>::value &&
605 is_constructible<
606 value_type,
607 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000608 void
609 >::type
610 assign(_ForwardIterator __first, _ForwardIterator __last);
611
612 void assign(size_type __n, const_reference __u);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000613
614#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 void assign(initializer_list<value_type> __il)
617 {assign(__il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +0000618#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000619
Howard Hinnant1c936782011-06-03 19:40:40 +0000620 _LIBCPP_INLINE_VISIBILITY
621 allocator_type get_allocator() const _NOEXCEPT
622 {return this->__alloc();}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000623
Howard Hinnant1c936782011-06-03 19:40:40 +0000624 _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT;
625 _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT;
626 _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT;
627 _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000628
Howard Hinnant1c936782011-06-03 19:40:40 +0000629 _LIBCPP_INLINE_VISIBILITY
630 reverse_iterator rbegin() _NOEXCEPT
631 {return reverse_iterator(end());}
632 _LIBCPP_INLINE_VISIBILITY
633 const_reverse_iterator rbegin() const _NOEXCEPT
634 {return const_reverse_iterator(end());}
635 _LIBCPP_INLINE_VISIBILITY
636 reverse_iterator rend() _NOEXCEPT
637 {return reverse_iterator(begin());}
638 _LIBCPP_INLINE_VISIBILITY
639 const_reverse_iterator rend() const _NOEXCEPT
640 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000641
Howard Hinnant1c936782011-06-03 19:40:40 +0000642 _LIBCPP_INLINE_VISIBILITY
643 const_iterator cbegin() const _NOEXCEPT
644 {return begin();}
645 _LIBCPP_INLINE_VISIBILITY
646 const_iterator cend() const _NOEXCEPT
647 {return end();}
648 _LIBCPP_INLINE_VISIBILITY
649 const_reverse_iterator crbegin() const _NOEXCEPT
650 {return rbegin();}
651 _LIBCPP_INLINE_VISIBILITY
652 const_reverse_iterator crend() const _NOEXCEPT
653 {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000654
Howard Hinnant1c936782011-06-03 19:40:40 +0000655 _LIBCPP_INLINE_VISIBILITY
656 size_type size() const _NOEXCEPT
657 {return static_cast<size_type>(this->__end_ - this->__begin_);}
658 _LIBCPP_INLINE_VISIBILITY
659 size_type capacity() const _NOEXCEPT
660 {return __base::capacity();}
Marshall Clow425f5752017-11-15 05:51:26 +0000661 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000662 bool empty() const _NOEXCEPT
663 {return this->__begin_ == this->__end_;}
664 size_type max_size() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000665 void reserve(size_type __n);
Howard Hinnant1c936782011-06-03 19:40:40 +0000666 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000667
668 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n);
669 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const;
670 reference at(size_type __n);
671 const_reference at(size_type __n) const;
672
Howard Hinnant27e0e772011-09-14 18:33:51 +0000673 _LIBCPP_INLINE_VISIBILITY reference front()
674 {
675 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
676 return *this->__begin_;
677 }
678 _LIBCPP_INLINE_VISIBILITY const_reference front() const
679 {
680 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
681 return *this->__begin_;
682 }
683 _LIBCPP_INLINE_VISIBILITY reference back()
684 {
685 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
686 return *(this->__end_ - 1);
687 }
688 _LIBCPP_INLINE_VISIBILITY const_reference back() const
689 {
690 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
691 return *(this->__end_ - 1);
692 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000693
Howard Hinnant1c936782011-06-03 19:40:40 +0000694 _LIBCPP_INLINE_VISIBILITY
695 value_type* data() _NOEXCEPT
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000696 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnant1c936782011-06-03 19:40:40 +0000697 _LIBCPP_INLINE_VISIBILITY
698 const value_type* data() const _NOEXCEPT
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000699 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000700
Eric Fiselier96919722017-10-17 13:03:17 +0000701#ifdef _LIBCPP_CXX03_LANG
702 _LIBCPP_INLINE_VISIBILITY
703 void __emplace_back(const value_type& __x) { push_back(__x); }
704#else
705 template <class _Arg>
706 _LIBCPP_INLINE_VISIBILITY
707 void __emplace_back(_Arg&& __arg) {
708 emplace_back(_VSTD::forward<_Arg>(__arg));
709 }
710#endif
711
Howard Hinnantcf823322010-12-17 14:46:43 +0000712 _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000713
714#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd2cab2f2012-02-15 00:41:34 +0000715 _LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000716
Howard Hinnantc51e1022010-05-11 19:42:16 +0000717 template <class... _Args>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000718 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000719#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000720 reference emplace_back(_Args&&... __args);
Marshall Clowea52cc42017-01-24 23:09:12 +0000721#else
722 void emplace_back(_Args&&... __args);
723#endif
Eric Fiseliered9e9362017-04-16 02:40:45 +0000724#endif // !_LIBCPP_CXX03_LANG
725
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000726 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000727 void pop_back();
728
729 iterator insert(const_iterator __position, const_reference __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000730
731#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000732 iterator insert(const_iterator __position, value_type&& __x);
733 template <class... _Args>
734 iterator emplace(const_iterator __position, _Args&&... __args);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000735#endif // !_LIBCPP_CXX03_LANG
736
Howard Hinnantc51e1022010-05-11 19:42:16 +0000737 iterator insert(const_iterator __position, size_type __n, const_reference __x);
738 template <class _InputIterator>
739 typename enable_if
740 <
741 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000742 !__is_forward_iterator<_InputIterator>::value &&
743 is_constructible<
744 value_type,
745 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000746 iterator
747 >::type
748 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
749 template <class _ForwardIterator>
750 typename enable_if
751 <
Howard Hinnant88010252013-03-28 17:44:32 +0000752 __is_forward_iterator<_ForwardIterator>::value &&
753 is_constructible<
754 value_type,
755 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000756 iterator
757 >::type
758 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000759
760#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000761 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000762 iterator insert(const_iterator __position, initializer_list<value_type> __il)
763 {return insert(__position, __il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +0000764#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000765
Howard Hinnantcf823322010-12-17 14:46:43 +0000766 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767 iterator erase(const_iterator __first, const_iterator __last);
768
Howard Hinnant1c936782011-06-03 19:40:40 +0000769 _LIBCPP_INLINE_VISIBILITY
770 void clear() _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000771 {
Marshall Clow2cd9d372014-05-08 14:14:06 +0000772 size_type __old_size = size();
Howard Hinnant27e0e772011-09-14 18:33:51 +0000773 __base::clear();
Marshall Clow2cd9d372014-05-08 14:14:06 +0000774 __annotate_shrink(__old_size);
Howard Hinnant27e0e772011-09-14 18:33:51 +0000775 __invalidate_all_iterators();
776 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000777
778 void resize(size_type __sz);
779 void resize(size_type __sz, const_reference __x);
780
Howard Hinnant1c936782011-06-03 19:40:40 +0000781 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000782#if _LIBCPP_STD_VER >= 14
Eric Fiselier69c51982016-12-28 06:06:09 +0000783 _NOEXCEPT_DEBUG;
Marshall Clow8982dcd2015-07-13 20:04:56 +0000784#else
Eric Fiselier69c51982016-12-28 06:06:09 +0000785 _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +0000786 __is_nothrow_swappable<allocator_type>::value);
787#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000788
789 bool __invariants() const;
790
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000791#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000792
793 bool __dereferenceable(const const_iterator* __i) const;
794 bool __decrementable(const const_iterator* __i) const;
795 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
796 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
797
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000798#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000799
Howard Hinnantc51e1022010-05-11 19:42:16 +0000800private:
Howard Hinnantcf823322010-12-17 14:46:43 +0000801 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Eric Fiselier69c51982016-12-28 06:06:09 +0000802 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(pointer __new_last);
Marshall Clow3ff48e02018-05-22 16:20:28 +0000803 void __vallocate(size_type __n);
804 void __vdeallocate() _NOEXCEPT;
Howard Hinnantcf823322010-12-17 14:46:43 +0000805 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
Howard Hinnanta5589382011-01-04 19:53:31 +0000806 void __construct_at_end(size_type __n);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000807 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000808 void __construct_at_end(size_type __n, const_reference __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000809 template <class _ForwardIterator>
810 typename enable_if
811 <
812 __is_forward_iterator<_ForwardIterator>::value,
813 void
814 >::type
Eric Fiselieracfe6f02015-03-31 16:54:19 +0000815 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000816 void __append(size_type __n);
817 void __append(size_type __n, const_reference __x);
Howard Hinnantcf823322010-12-17 14:46:43 +0000818 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000819 iterator __make_iter(pointer __p) _NOEXCEPT;
Howard Hinnantcf823322010-12-17 14:46:43 +0000820 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000821 const_iterator __make_iter(const_pointer __p) const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000822 void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v);
823 pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p);
824 void __move_range(pointer __from_s, pointer __from_e, pointer __to);
Howard Hinnant1c936782011-06-03 19:40:40 +0000825 void __move_assign(vector& __c, true_type)
826 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Marshall Clow2fe8a8d2015-08-18 18:57:00 +0000827 void __move_assign(vector& __c, false_type)
828 _NOEXCEPT_(__alloc_traits::is_always_equal::value);
Howard Hinnant27e0e772011-09-14 18:33:51 +0000829 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant76053d72013-06-27 19:35:32 +0000830 void __destruct_at_end(pointer __new_last) _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000831 {
Eric Fiselier69c51982016-12-28 06:06:09 +0000832 __invalidate_iterators_past(__new_last);
Marshall Clow2cd9d372014-05-08 14:14:06 +0000833 size_type __old_size = size();
Howard Hinnant27e0e772011-09-14 18:33:51 +0000834 __base::__destruct_at_end(__new_last);
Marshall Clow2cd9d372014-05-08 14:14:06 +0000835 __annotate_shrink(__old_size);
Howard Hinnant27e0e772011-09-14 18:33:51 +0000836 }
Eric Fiseliered9e9362017-04-16 02:40:45 +0000837
838#ifndef _LIBCPP_CXX03_LANG
839 template <class _Up> void __push_back_slow_path(_Up&& __x);
840
Howard Hinnantb6c49562012-02-26 15:30:12 +0000841 template <class... _Args>
Eric Fiseliered9e9362017-04-16 02:40:45 +0000842 void __emplace_back_slow_path(_Args&&... __args);
843#else
844 template <class _Up> void __push_back_slow_path(_Up& __x);
Howard Hinnantb6c49562012-02-26 15:30:12 +0000845#endif
Eric Fiseliered9e9362017-04-16 02:40:45 +0000846
Marshall Clow2cd9d372014-05-08 14:14:06 +0000847 // The following functions are no-ops outside of AddressSanitizer mode.
848 // We call annotatations only for the default Allocator because other allocators
849 // may not meet the AddressSanitizer alignment constraints.
850 // See the documentation for __sanitizer_annotate_contiguous_container for more details.
Marshall Clow2cd9d372014-05-08 14:14:06 +0000851#ifndef _LIBCPP_HAS_NO_ASAN
Eric Fiselier6003c772016-12-23 23:37:52 +0000852 void __annotate_contiguous_container(const void *__beg, const void *__end,
853 const void *__old_mid,
854 const void *__new_mid) const
855 {
856
Marshall Clow2cd9d372014-05-08 14:14:06 +0000857 if (__beg && is_same<allocator_type, __default_allocator_type>::value)
858 __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid);
Marshall Clow2cd9d372014-05-08 14:14:06 +0000859 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000860#else
861 _LIBCPP_INLINE_VISIBILITY
862 void __annotate_contiguous_container(const void*, const void*, const void*,
863 const void*) const {}
864#endif
865 _LIBCPP_INLINE_VISIBILITY
866 void __annotate_new(size_type __current_size) const {
Marshall Clow2cd9d372014-05-08 14:14:06 +0000867 __annotate_contiguous_container(data(), data() + capacity(),
868 data() + capacity(), data() + __current_size);
869 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000870
871 _LIBCPP_INLINE_VISIBILITY
872 void __annotate_delete() const {
Marshall Clow2cd9d372014-05-08 14:14:06 +0000873 __annotate_contiguous_container(data(), data() + capacity(),
874 data() + size(), data() + capacity());
875 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000876
877 _LIBCPP_INLINE_VISIBILITY
Kostya Serebryany4963c252014-09-02 23:43:38 +0000878 void __annotate_increase(size_type __n) const
Marshall Clow2cd9d372014-05-08 14:14:06 +0000879 {
880 __annotate_contiguous_container(data(), data() + capacity(),
881 data() + size(), data() + size() + __n);
882 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000883
884 _LIBCPP_INLINE_VISIBILITY
Kostya Serebryany4963c252014-09-02 23:43:38 +0000885 void __annotate_shrink(size_type __old_size) const
Marshall Clow2cd9d372014-05-08 14:14:06 +0000886 {
887 __annotate_contiguous_container(data(), data() + capacity(),
888 data() + __old_size, data() + size());
889 }
Marshall Clowc78ffa52014-09-03 21:37:43 +0000890#ifndef _LIBCPP_HAS_NO_ASAN
Kostya Serebryany4963c252014-09-02 23:43:38 +0000891 // The annotation for size increase should happen before the actual increase,
892 // but if an exception is thrown after that the annotation has to be undone.
893 struct __RAII_IncreaseAnnotator {
894 __RAII_IncreaseAnnotator(const vector &__v, size_type __n = 1)
Eric Fiseliera7c043e2015-03-10 00:25:20 +0000895 : __commit(false), __v(__v), __old_size(__v.size() + __n) {
Kostya Serebryany4963c252014-09-02 23:43:38 +0000896 __v.__annotate_increase(__n);
897 }
898 void __done() { __commit = true; }
899 ~__RAII_IncreaseAnnotator() {
900 if (__commit) return;
Eric Fiseliera7c043e2015-03-10 00:25:20 +0000901 __v.__annotate_shrink(__old_size);
Kostya Serebryany4963c252014-09-02 23:43:38 +0000902 }
903 bool __commit;
Kostya Serebryany4963c252014-09-02 23:43:38 +0000904 const vector &__v;
Eric Fiseliera7c043e2015-03-10 00:25:20 +0000905 size_type __old_size;
Kostya Serebryany4963c252014-09-02 23:43:38 +0000906 };
Marshall Clowc78ffa52014-09-03 21:37:43 +0000907#else
908 struct __RAII_IncreaseAnnotator {
Eric Fiselier6003c772016-12-23 23:37:52 +0000909 _LIBCPP_INLINE_VISIBILITY
910 __RAII_IncreaseAnnotator(const vector &, size_type = 1) {}
911 _LIBCPP_INLINE_VISIBILITY void __done() {}
Marshall Clowc78ffa52014-09-03 21:37:43 +0000912 };
913#endif
914
Howard Hinnantc51e1022010-05-11 19:42:16 +0000915};
916
Marshall Clowf0ca1492018-05-21 21:30:12 +0000917#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
918template<class _InputIterator,
919 class _Alloc = typename std::allocator<typename iterator_traits<_InputIterator>::value_type>,
920 class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
921 >
922vector(_InputIterator, _InputIterator)
923 -> vector<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
924
925template<class _InputIterator,
926 class _Alloc,
927 class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
928 >
929vector(_InputIterator, _InputIterator, _Alloc)
930 -> vector<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
931#endif
932
Howard Hinnantc51e1022010-05-11 19:42:16 +0000933template <class _Tp, class _Allocator>
934void
935vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)
936{
Marshall Clow2cd9d372014-05-08 14:14:06 +0000937 __annotate_delete();
Howard Hinnantd2cab2f2012-02-15 00:41:34 +0000938 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000939 _VSTD::swap(this->__begin_, __v.__begin_);
940 _VSTD::swap(this->__end_, __v.__end_);
941 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000942 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000943 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000944 __invalidate_all_iterators();
945}
946
947template <class _Tp, class _Allocator>
948typename vector<_Tp, _Allocator>::pointer
949vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
950{
Marshall Clow2cd9d372014-05-08 14:14:06 +0000951 __annotate_delete();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000952 pointer __r = __v.__begin_;
Howard Hinnantd2cab2f2012-02-15 00:41:34 +0000953 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, __p, __v.__begin_);
954 __alloc_traits::__construct_forward(this->__alloc(), __p, this->__end_, __v.__end_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000955 _VSTD::swap(this->__begin_, __v.__begin_);
956 _VSTD::swap(this->__end_, __v.__end_);
957 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000958 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000959 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000960 __invalidate_all_iterators();
961 return __r;
962}
963
964// Allocate space for __n objects
965// throws length_error if __n > max_size()
966// throws (probably bad_alloc) if memory run out
967// Precondition: __begin_ == __end_ == __end_cap() == 0
968// Precondition: __n > 0
969// Postcondition: capacity() == __n
970// Postcondition: size() == 0
971template <class _Tp, class _Allocator>
972void
Marshall Clow3ff48e02018-05-22 16:20:28 +0000973vector<_Tp, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000974{
975 if (__n > max_size())
976 this->__throw_length_error();
977 this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
978 this->__end_cap() = this->__begin_ + __n;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000979 __annotate_new(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000980}
981
982template <class _Tp, class _Allocator>
983void
Marshall Clow3ff48e02018-05-22 16:20:28 +0000984vector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000985{
Howard Hinnant76053d72013-06-27 19:35:32 +0000986 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000987 {
988 clear();
989 __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
Howard Hinnant76053d72013-06-27 19:35:32 +0000990 this->__begin_ = this->__end_ = this->__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000991 }
992}
993
994template <class _Tp, class _Allocator>
995typename vector<_Tp, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +0000996vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000997{
Eric Fiselierb5d9f442016-11-23 01:18:56 +0000998 return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()),
999 numeric_limits<difference_type>::max());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001000}
1001
1002// Precondition: __new_size > capacity()
1003template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001004inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001005typename vector<_Tp, _Allocator>::size_type
1006vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
1007{
1008 const size_type __ms = max_size();
1009 if (__new_size > __ms)
1010 this->__throw_length_error();
1011 const size_type __cap = capacity();
1012 if (__cap >= __ms / 2)
1013 return __ms;
Alexis Hunt991d29b2011-07-29 23:31:58 +00001014 return _VSTD::max<size_type>(2*__cap, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001015}
1016
1017// Default constructs __n objects starting at __end_
1018// throws if construction throws
1019// Precondition: __n > 0
1020// Precondition: size() + __n <= capacity()
1021// Postcondition: size() == size() + __n
1022template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001023void
1024vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
1025{
Howard Hinnantc51e1022010-05-11 19:42:16 +00001026 allocator_type& __a = this->__alloc();
1027 do
1028 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001029 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001030 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001031 ++this->__end_;
1032 --__n;
Kostya Serebryany4963c252014-09-02 23:43:38 +00001033 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001034 } while (__n > 0);
1035}
1036
Howard Hinnantc51e1022010-05-11 19:42:16 +00001037// Copy constructs __n objects starting at __end_ from __x
1038// throws if construction throws
1039// Precondition: __n > 0
1040// Precondition: size() + __n <= capacity()
1041// Postcondition: size() == old size() + __n
1042// Postcondition: [i] == __x for all i in [size() - __n, __n)
1043template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001044inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001045void
1046vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
1047{
Howard Hinnantc51e1022010-05-11 19:42:16 +00001048 allocator_type& __a = this->__alloc();
1049 do
1050 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001051 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001052 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001053 ++this->__end_;
1054 --__n;
Kostya Serebryany4963c252014-09-02 23:43:38 +00001055 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001056 } while (__n > 0);
1057}
1058
1059template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001060template <class _ForwardIterator>
1061typename enable_if
1062<
1063 __is_forward_iterator<_ForwardIterator>::value,
1064 void
1065>::type
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001066vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001067{
1068 allocator_type& __a = this->__alloc();
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001069 __RAII_IncreaseAnnotator __annotator(*this, __n);
1070 __alloc_traits::__construct_range_forward(__a, __first, __last, this->__end_);
1071 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001072}
1073
1074// Default constructs __n objects starting at __end_
1075// throws if construction throws
1076// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001077// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001078template <class _Tp, class _Allocator>
1079void
1080vector<_Tp, _Allocator>::__append(size_type __n)
1081{
1082 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1083 this->__construct_at_end(__n);
1084 else
1085 {
1086 allocator_type& __a = this->__alloc();
1087 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1088 __v.__construct_at_end(__n);
1089 __swap_out_circular_buffer(__v);
1090 }
1091}
1092
1093// Default constructs __n objects starting at __end_
1094// throws if construction throws
1095// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001096// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001097template <class _Tp, class _Allocator>
1098void
1099vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
1100{
1101 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1102 this->__construct_at_end(__n, __x);
1103 else
1104 {
1105 allocator_type& __a = this->__alloc();
1106 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1107 __v.__construct_at_end(__n, __x);
1108 __swap_out_circular_buffer(__v);
1109 }
1110}
1111
1112template <class _Tp, class _Allocator>
1113vector<_Tp, _Allocator>::vector(size_type __n)
1114{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001115#if _LIBCPP_DEBUG_LEVEL >= 2
1116 __get_db()->__insert_c(this);
1117#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001118 if (__n > 0)
1119 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001120 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001121 __construct_at_end(__n);
1122 }
1123}
1124
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001125#if _LIBCPP_STD_VER > 11
1126template <class _Tp, class _Allocator>
1127vector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a)
1128 : __base(__a)
1129{
1130#if _LIBCPP_DEBUG_LEVEL >= 2
1131 __get_db()->__insert_c(this);
1132#endif
1133 if (__n > 0)
1134 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001135 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001136 __construct_at_end(__n);
1137 }
1138}
1139#endif
1140
Howard Hinnantc51e1022010-05-11 19:42:16 +00001141template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001142vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001143{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001144#if _LIBCPP_DEBUG_LEVEL >= 2
1145 __get_db()->__insert_c(this);
1146#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001147 if (__n > 0)
1148 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001149 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001150 __construct_at_end(__n, __x);
1151 }
1152}
1153
1154template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001155vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001156 : __base(__a)
1157{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001158#if _LIBCPP_DEBUG_LEVEL >= 2
1159 __get_db()->__insert_c(this);
1160#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001161 if (__n > 0)
1162 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001163 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001164 __construct_at_end(__n, __x);
1165 }
1166}
1167
1168template <class _Tp, class _Allocator>
1169template <class _InputIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001170vector<_Tp, _Allocator>::vector(_InputIterator __first,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001171 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001172 !__is_forward_iterator<_InputIterator>::value &&
1173 is_constructible<
1174 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001175 typename iterator_traits<_InputIterator>::reference>::value,
1176 _InputIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001177{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001178#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001179 __get_db()->__insert_c(this);
1180#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001181 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001182 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001183}
1184
1185template <class _Tp, class _Allocator>
1186template <class _InputIterator>
1187vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
1188 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001189 !__is_forward_iterator<_InputIterator>::value &&
1190 is_constructible<
1191 value_type,
1192 typename iterator_traits<_InputIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001193 : __base(__a)
1194{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001195#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001196 __get_db()->__insert_c(this);
1197#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001198 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001199 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001200}
1201
1202template <class _Tp, class _Allocator>
1203template <class _ForwardIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001204vector<_Tp, _Allocator>::vector(_ForwardIterator __first,
Howard Hinnant88010252013-03-28 17:44:32 +00001205 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1206 is_constructible<
1207 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001208 typename iterator_traits<_ForwardIterator>::reference>::value,
1209 _ForwardIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001210{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001211#if _LIBCPP_DEBUG_LEVEL >= 2
1212 __get_db()->__insert_c(this);
1213#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001214 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001215 if (__n > 0)
1216 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001217 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001218 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001219 }
1220}
1221
1222template <class _Tp, class _Allocator>
1223template <class _ForwardIterator>
1224vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant88010252013-03-28 17:44:32 +00001225 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1226 is_constructible<
1227 value_type,
1228 typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001229 : __base(__a)
1230{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001231#if _LIBCPP_DEBUG_LEVEL >= 2
1232 __get_db()->__insert_c(this);
1233#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001234 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001235 if (__n > 0)
1236 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001237 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001238 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001239 }
1240}
1241
1242template <class _Tp, class _Allocator>
1243vector<_Tp, _Allocator>::vector(const vector& __x)
1244 : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
1245{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001246#if _LIBCPP_DEBUG_LEVEL >= 2
1247 __get_db()->__insert_c(this);
1248#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001249 size_type __n = __x.size();
1250 if (__n > 0)
1251 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001252 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001253 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001254 }
1255}
1256
1257template <class _Tp, class _Allocator>
1258vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a)
1259 : __base(__a)
1260{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001261#if _LIBCPP_DEBUG_LEVEL >= 2
1262 __get_db()->__insert_c(this);
1263#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001264 size_type __n = __x.size();
1265 if (__n > 0)
1266 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001267 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001268 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001269 }
1270}
1271
Eric Fiseliered9e9362017-04-16 02:40:45 +00001272#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001273
1274template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001275inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001276vector<_Tp, _Allocator>::vector(vector&& __x)
Marshall Clowe5108202015-07-14 14:46:32 +00001277#if _LIBCPP_STD_VER > 14
1278 _NOEXCEPT
1279#else
Howard Hinnant1c936782011-06-03 19:40:40 +00001280 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00001281#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001282 : __base(_VSTD::move(__x.__alloc()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001283{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001284#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001285 __get_db()->__insert_c(this);
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001286 __get_db()->swap(this, &__x);
Howard Hinnant27e0e772011-09-14 18:33:51 +00001287#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001288 this->__begin_ = __x.__begin_;
1289 this->__end_ = __x.__end_;
1290 this->__end_cap() = __x.__end_cap();
Howard Hinnant76053d72013-06-27 19:35:32 +00001291 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001292}
1293
1294template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001295inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001296vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a)
1297 : __base(__a)
1298{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001299#if _LIBCPP_DEBUG_LEVEL >= 2
1300 __get_db()->__insert_c(this);
1301#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001302 if (__a == __x.__alloc())
1303 {
1304 this->__begin_ = __x.__begin_;
1305 this->__end_ = __x.__end_;
1306 this->__end_cap() = __x.__end_cap();
1307 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001308#if _LIBCPP_DEBUG_LEVEL >= 2
1309 __get_db()->swap(this, &__x);
1310#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001311 }
1312 else
1313 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001314 typedef move_iterator<iterator> _Ip;
1315 assign(_Ip(__x.begin()), _Ip(__x.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001316 }
1317}
1318
1319template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001320inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001321vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
1322{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001323#if _LIBCPP_DEBUG_LEVEL >= 2
1324 __get_db()->__insert_c(this);
1325#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001326 if (__il.size() > 0)
1327 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001328 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001329 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001330 }
1331}
1332
1333template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001334inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001335vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
1336 : __base(__a)
1337{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001338#if _LIBCPP_DEBUG_LEVEL >= 2
1339 __get_db()->__insert_c(this);
1340#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001341 if (__il.size() > 0)
1342 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001343 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001344 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001345 }
1346}
1347
1348template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001349inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001350vector<_Tp, _Allocator>&
1351vector<_Tp, _Allocator>::operator=(vector&& __x)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001352 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001353{
1354 __move_assign(__x, integral_constant<bool,
1355 __alloc_traits::propagate_on_container_move_assignment::value>());
1356 return *this;
1357}
1358
1359template <class _Tp, class _Allocator>
1360void
1361vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001362 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001363{
1364 if (__base::__alloc() != __c.__alloc())
1365 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001366 typedef move_iterator<iterator> _Ip;
1367 assign(_Ip(__c.begin()), _Ip(__c.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001368 }
1369 else
1370 __move_assign(__c, true_type());
1371}
1372
1373template <class _Tp, class _Allocator>
1374void
1375vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00001376 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001377{
Marshall Clow3ff48e02018-05-22 16:20:28 +00001378 __vdeallocate();
Marshall Clow136d45c2014-07-21 15:11:13 +00001379 __base::__move_assign_alloc(__c); // this can throw
Howard Hinnantc51e1022010-05-11 19:42:16 +00001380 this->__begin_ = __c.__begin_;
1381 this->__end_ = __c.__end_;
1382 this->__end_cap() = __c.__end_cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001383 __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001384#if _LIBCPP_DEBUG_LEVEL >= 2
1385 __get_db()->swap(this, &__c);
1386#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001387}
1388
Eric Fiseliered9e9362017-04-16 02:40:45 +00001389#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001390
1391template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001392inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001393vector<_Tp, _Allocator>&
1394vector<_Tp, _Allocator>::operator=(const vector& __x)
1395{
1396 if (this != &__x)
1397 {
1398 __base::__copy_assign_alloc(__x);
1399 assign(__x.__begin_, __x.__end_);
1400 }
1401 return *this;
1402}
1403
1404template <class _Tp, class _Allocator>
1405template <class _InputIterator>
1406typename enable_if
1407<
1408 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001409 !__is_forward_iterator<_InputIterator>::value &&
1410 is_constructible<
1411 _Tp,
1412 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001413 void
1414>::type
1415vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1416{
1417 clear();
1418 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001419 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001420}
1421
1422template <class _Tp, class _Allocator>
1423template <class _ForwardIterator>
1424typename enable_if
1425<
Howard Hinnant88010252013-03-28 17:44:32 +00001426 __is_forward_iterator<_ForwardIterator>::value &&
1427 is_constructible<
1428 _Tp,
1429 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001430 void
1431>::type
1432vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
1433{
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001434 size_type __new_size = static_cast<size_type>(_VSTD::distance(__first, __last));
1435 if (__new_size <= capacity())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001436 {
1437 _ForwardIterator __mid = __last;
1438 bool __growing = false;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001439 if (__new_size > size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001440 {
1441 __growing = true;
1442 __mid = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001443 _VSTD::advance(__mid, size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001444 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001445 pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001446 if (__growing)
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001447 __construct_at_end(__mid, __last, __new_size - size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001448 else
1449 this->__destruct_at_end(__m);
1450 }
1451 else
1452 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001453 __vdeallocate();
1454 __vallocate(__recommend(__new_size));
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001455 __construct_at_end(__first, __last, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001456 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001457 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001458}
1459
1460template <class _Tp, class _Allocator>
1461void
1462vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
1463{
1464 if (__n <= capacity())
1465 {
1466 size_type __s = size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001467 _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001468 if (__n > __s)
1469 __construct_at_end(__n - __s, __u);
1470 else
Howard Hinnant155c2af2010-05-24 17:49:41 +00001471 this->__destruct_at_end(this->__begin_ + __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001472 }
1473 else
1474 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001475 __vdeallocate();
1476 __vallocate(__recommend(static_cast<size_type>(__n)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001477 __construct_at_end(__n, __u);
1478 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001479 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001480}
1481
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001482template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001483inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001484typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001485vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001486{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001487#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001488 return iterator(this, __p);
1489#else
1490 return iterator(__p);
1491#endif
1492}
1493
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001494template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001495inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001496typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001497vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001498{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001499#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001500 return const_iterator(this, __p);
1501#else
1502 return const_iterator(__p);
1503#endif
1504}
1505
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001506template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001507inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001508typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001509vector<_Tp, _Allocator>::begin() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001510{
1511 return __make_iter(this->__begin_);
1512}
1513
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001514template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001515inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001516typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001517vector<_Tp, _Allocator>::begin() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001518{
1519 return __make_iter(this->__begin_);
1520}
1521
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001522template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001523inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001524typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001525vector<_Tp, _Allocator>::end() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001526{
1527 return __make_iter(this->__end_);
1528}
1529
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001530template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001531inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001532typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001533vector<_Tp, _Allocator>::end() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001534{
1535 return __make_iter(this->__end_);
1536}
1537
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001538template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001539inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001540typename vector<_Tp, _Allocator>::reference
1541vector<_Tp, _Allocator>::operator[](size_type __n)
1542{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001543 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001544 return this->__begin_[__n];
1545}
1546
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001547template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001548inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001549typename vector<_Tp, _Allocator>::const_reference
1550vector<_Tp, _Allocator>::operator[](size_type __n) const
1551{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001552 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001553 return this->__begin_[__n];
1554}
1555
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001556template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001557typename vector<_Tp, _Allocator>::reference
1558vector<_Tp, _Allocator>::at(size_type __n)
1559{
1560 if (__n >= size())
1561 this->__throw_out_of_range();
1562 return this->__begin_[__n];
1563}
1564
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001565template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001566typename vector<_Tp, _Allocator>::const_reference
1567vector<_Tp, _Allocator>::at(size_type __n) const
1568{
1569 if (__n >= size())
1570 this->__throw_out_of_range();
1571 return this->__begin_[__n];
1572}
1573
1574template <class _Tp, class _Allocator>
1575void
1576vector<_Tp, _Allocator>::reserve(size_type __n)
1577{
1578 if (__n > capacity())
1579 {
1580 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001581 __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001582 __swap_out_circular_buffer(__v);
1583 }
1584}
1585
1586template <class _Tp, class _Allocator>
1587void
Howard Hinnant1c936782011-06-03 19:40:40 +00001588vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001589{
1590 if (capacity() > size())
1591 {
1592#ifndef _LIBCPP_NO_EXCEPTIONS
1593 try
1594 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001595#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001596 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001597 __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001598 __swap_out_circular_buffer(__v);
1599#ifndef _LIBCPP_NO_EXCEPTIONS
1600 }
1601 catch (...)
1602 {
1603 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001604#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001605 }
1606}
1607
1608template <class _Tp, class _Allocator>
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001609template <class _Up>
1610void
Eric Fiseliered9e9362017-04-16 02:40:45 +00001611#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001612vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
1613#else
1614vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
1615#endif
1616{
1617 allocator_type& __a = this->__alloc();
1618 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1619 // __v.push_back(_VSTD::forward<_Up>(__x));
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001620 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Up>(__x));
1621 __v.__end_++;
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001622 __swap_out_circular_buffer(__v);
1623}
1624
1625template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001626inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001627void
1628vector<_Tp, _Allocator>::push_back(const_reference __x)
1629{
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001630 if (this->__end_ != this->__end_cap())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001631 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001632 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001633 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001634 _VSTD::__to_raw_pointer(this->__end_), __x);
Kostya Serebryany4963c252014-09-02 23:43:38 +00001635 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001636 ++this->__end_;
1637 }
1638 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001639 __push_back_slow_path(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001640}
1641
Eric Fiseliered9e9362017-04-16 02:40:45 +00001642#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001643
1644template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001645inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001646void
1647vector<_Tp, _Allocator>::push_back(value_type&& __x)
1648{
1649 if (this->__end_ < this->__end_cap())
1650 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001651 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001652 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001653 _VSTD::__to_raw_pointer(this->__end_),
1654 _VSTD::move(__x));
Kostya Serebryany4963c252014-09-02 23:43:38 +00001655 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001656 ++this->__end_;
1657 }
1658 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001659 __push_back_slow_path(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001660}
1661
1662template <class _Tp, class _Allocator>
1663template <class... _Args>
1664void
Howard Hinnantb6c49562012-02-26 15:30:12 +00001665vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1666{
1667 allocator_type& __a = this->__alloc();
1668 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1669// __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001670 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Args>(__args)...);
1671 __v.__end_++;
Howard Hinnantb6c49562012-02-26 15:30:12 +00001672 __swap_out_circular_buffer(__v);
1673}
1674
1675template <class _Tp, class _Allocator>
1676template <class... _Args>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001677inline
Marshall Clowea52cc42017-01-24 23:09:12 +00001678#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001679typename vector<_Tp, _Allocator>::reference
Marshall Clowea52cc42017-01-24 23:09:12 +00001680#else
1681void
1682#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001683vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1684{
1685 if (this->__end_ < this->__end_cap())
1686 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001687 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001688 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001689 _VSTD::__to_raw_pointer(this->__end_),
1690 _VSTD::forward<_Args>(__args)...);
Kostya Serebryany4963c252014-09-02 23:43:38 +00001691 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001692 ++this->__end_;
1693 }
1694 else
Howard Hinnantb6c49562012-02-26 15:30:12 +00001695 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
Marshall Clowea52cc42017-01-24 23:09:12 +00001696#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001697 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00001698#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001699}
1700
Eric Fiseliered9e9362017-04-16 02:40:45 +00001701#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001702
1703template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001704inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001705void
1706vector<_Tp, _Allocator>::pop_back()
1707{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001708 _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001709 this->__destruct_at_end(this->__end_ - 1);
1710}
1711
1712template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001713inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001714typename vector<_Tp, _Allocator>::iterator
1715vector<_Tp, _Allocator>::erase(const_iterator __position)
1716{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001717#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001718 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1719 "vector::erase(iterator) called with an iterator not"
1720 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001721#endif
Howard Hinnant58d52d52013-03-25 22:12:26 +00001722 _LIBCPP_ASSERT(__position != end(),
1723 "vector::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnant76053d72013-06-27 19:35:32 +00001724 difference_type __ps = __position - cbegin();
1725 pointer __p = this->__begin_ + __ps;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001726 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001727 this->__invalidate_iterators_past(__p-1);
1728 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001729 return __r;
1730}
1731
1732template <class _Tp, class _Allocator>
1733typename vector<_Tp, _Allocator>::iterator
1734vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1735{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001736#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001737 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
1738 "vector::erase(iterator, iterator) called with an iterator not"
1739 " referring to this vector");
Eric Fiselier69c51982016-12-28 06:06:09 +00001740 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this,
1741 "vector::erase(iterator, iterator) called with an iterator not"
1742 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001743#endif
Howard Hinnant27e0e772011-09-14 18:33:51 +00001744 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001745 pointer __p = this->__begin_ + (__first - begin());
Eric Fiselier69c51982016-12-28 06:06:09 +00001746 if (__first != __last) {
Howard Hinnantc580cc32013-04-18 15:02:57 +00001747 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001748 this->__invalidate_iterators_past(__p - 1);
1749 }
1750 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001751 return __r;
1752}
1753
1754template <class _Tp, class _Allocator>
1755void
1756vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1757{
1758 pointer __old_last = this->__end_;
1759 difference_type __n = __old_last - __to;
1760 for (pointer __i = __from_s + __n; __i < __from_e; ++__i, ++this->__end_)
1761 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001762 _VSTD::__to_raw_pointer(this->__end_),
1763 _VSTD::move(*__i));
1764 _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001765}
1766
1767template <class _Tp, class _Allocator>
1768typename vector<_Tp, _Allocator>::iterator
1769vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1770{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001771#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001772 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1773 "vector::insert(iterator, x) called with an iterator not"
1774 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001775#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001776 pointer __p = this->__begin_ + (__position - begin());
1777 if (this->__end_ < this->__end_cap())
1778 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001779 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001780 if (__p == this->__end_)
1781 {
1782 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001783 _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001784 ++this->__end_;
1785 }
1786 else
1787 {
1788 __move_range(__p, this->__end_, __p + 1);
1789 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1790 if (__p <= __xr && __xr < this->__end_)
1791 ++__xr;
1792 *__p = *__xr;
1793 }
Kostya Serebryany4963c252014-09-02 23:43:38 +00001794 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001795 }
1796 else
1797 {
1798 allocator_type& __a = this->__alloc();
1799 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1800 __v.push_back(__x);
1801 __p = __swap_out_circular_buffer(__v, __p);
1802 }
1803 return __make_iter(__p);
1804}
1805
Eric Fiseliered9e9362017-04-16 02:40:45 +00001806#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001807
1808template <class _Tp, class _Allocator>
1809typename vector<_Tp, _Allocator>::iterator
1810vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1811{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001812#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001813 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1814 "vector::insert(iterator, x) called with an iterator not"
1815 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001816#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001817 pointer __p = this->__begin_ + (__position - begin());
1818 if (this->__end_ < this->__end_cap())
1819 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001820 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001821 if (__p == this->__end_)
1822 {
1823 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001824 _VSTD::__to_raw_pointer(this->__end_),
1825 _VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001826 ++this->__end_;
1827 }
1828 else
1829 {
1830 __move_range(__p, this->__end_, __p + 1);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001831 *__p = _VSTD::move(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001832 }
Kostya Serebryany4963c252014-09-02 23:43:38 +00001833 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001834 }
1835 else
1836 {
1837 allocator_type& __a = this->__alloc();
1838 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001839 __v.push_back(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001840 __p = __swap_out_circular_buffer(__v, __p);
1841 }
1842 return __make_iter(__p);
1843}
1844
1845template <class _Tp, class _Allocator>
1846template <class... _Args>
1847typename vector<_Tp, _Allocator>::iterator
1848vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1849{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001850#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001851 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1852 "vector::emplace(iterator, x) called with an iterator not"
1853 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001854#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001855 pointer __p = this->__begin_ + (__position - begin());
1856 if (this->__end_ < this->__end_cap())
1857 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001858 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001859 if (__p == this->__end_)
1860 {
1861 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001862 _VSTD::__to_raw_pointer(this->__end_),
1863 _VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001864 ++this->__end_;
1865 }
1866 else
1867 {
Marshall Clowa591b9a2016-07-11 21:38:08 +00001868 __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001869 __move_range(__p, this->__end_, __p + 1);
Marshall Clowa591b9a2016-07-11 21:38:08 +00001870 *__p = _VSTD::move(__tmp.get());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001871 }
Kostya Serebryany4963c252014-09-02 23:43:38 +00001872 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001873 }
1874 else
1875 {
1876 allocator_type& __a = this->__alloc();
1877 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001878 __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001879 __p = __swap_out_circular_buffer(__v, __p);
1880 }
1881 return __make_iter(__p);
1882}
1883
Eric Fiseliered9e9362017-04-16 02:40:45 +00001884#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001885
1886template <class _Tp, class _Allocator>
1887typename vector<_Tp, _Allocator>::iterator
1888vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1889{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001890#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001891 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1892 "vector::insert(iterator, n, x) called with an iterator not"
1893 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001894#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001895 pointer __p = this->__begin_ + (__position - begin());
1896 if (__n > 0)
1897 {
1898 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1899 {
1900 size_type __old_n = __n;
1901 pointer __old_last = this->__end_;
1902 if (__n > static_cast<size_type>(this->__end_ - __p))
1903 {
1904 size_type __cx = __n - (this->__end_ - __p);
1905 __construct_at_end(__cx, __x);
1906 __n -= __cx;
1907 }
1908 if (__n > 0)
1909 {
Eric Fiselier2a649652014-11-14 18:28:36 +00001910 __RAII_IncreaseAnnotator __annotator(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001911 __move_range(__p, __old_last, __p + __old_n);
Kostya Serebryany4963c252014-09-02 23:43:38 +00001912 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001913 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1914 if (__p <= __xr && __xr < this->__end_)
1915 __xr += __old_n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001916 _VSTD::fill_n(__p, __n, *__xr);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001917 }
1918 }
1919 else
1920 {
1921 allocator_type& __a = this->__alloc();
1922 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1923 __v.__construct_at_end(__n, __x);
1924 __p = __swap_out_circular_buffer(__v, __p);
1925 }
1926 }
1927 return __make_iter(__p);
1928}
1929
1930template <class _Tp, class _Allocator>
1931template <class _InputIterator>
1932typename enable_if
1933<
1934 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001935 !__is_forward_iterator<_InputIterator>::value &&
1936 is_constructible<
1937 _Tp,
1938 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001939 typename vector<_Tp, _Allocator>::iterator
1940>::type
1941vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1942{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001943#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001944 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1945 "vector::insert(iterator, range) called with an iterator not"
1946 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001947#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001948 difference_type __off = __position - begin();
1949 pointer __p = this->__begin_ + __off;
1950 allocator_type& __a = this->__alloc();
1951 pointer __old_last = this->__end_;
1952 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1953 {
Eric Fiselier489fd502015-07-18 18:22:12 +00001954 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001955 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
Howard Hinnantc51e1022010-05-11 19:42:16 +00001956 *__first);
1957 ++this->__end_;
Eric Fiselier489fd502015-07-18 18:22:12 +00001958 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001959 }
1960 __split_buffer<value_type, allocator_type&> __v(__a);
1961 if (__first != __last)
1962 {
1963#ifndef _LIBCPP_NO_EXCEPTIONS
1964 try
1965 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001966#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001967 __v.__construct_at_end(__first, __last);
1968 difference_type __old_size = __old_last - this->__begin_;
1969 difference_type __old_p = __p - this->__begin_;
1970 reserve(__recommend(size() + __v.size()));
1971 __p = this->__begin_ + __old_p;
1972 __old_last = this->__begin_ + __old_size;
1973#ifndef _LIBCPP_NO_EXCEPTIONS
1974 }
1975 catch (...)
1976 {
1977 erase(__make_iter(__old_last), end());
1978 throw;
1979 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001980#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001981 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001982 __p = _VSTD::rotate(__p, __old_last, this->__end_);
Howard Hinnant9cd22302011-09-16 18:41:29 +00001983 insert(__make_iter(__p), make_move_iterator(__v.begin()),
1984 make_move_iterator(__v.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001985 return begin() + __off;
1986}
1987
1988template <class _Tp, class _Allocator>
1989template <class _ForwardIterator>
1990typename enable_if
1991<
Howard Hinnant88010252013-03-28 17:44:32 +00001992 __is_forward_iterator<_ForwardIterator>::value &&
1993 is_constructible<
1994 _Tp,
1995 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001996 typename vector<_Tp, _Allocator>::iterator
1997>::type
1998vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1999{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002000#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002001 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
2002 "vector::insert(iterator, range) called with an iterator not"
2003 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002004#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002005 pointer __p = this->__begin_ + (__position - begin());
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002006 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002007 if (__n > 0)
2008 {
2009 if (__n <= this->__end_cap() - this->__end_)
2010 {
2011 size_type __old_n = __n;
2012 pointer __old_last = this->__end_;
2013 _ForwardIterator __m = __last;
2014 difference_type __dx = this->__end_ - __p;
2015 if (__n > __dx)
2016 {
2017 __m = __first;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00002018 difference_type __diff = this->__end_ - __p;
2019 _VSTD::advance(__m, __diff);
2020 __construct_at_end(__m, __last, __n - __diff);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002021 __n = __dx;
2022 }
2023 if (__n > 0)
2024 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00002025 __RAII_IncreaseAnnotator __annotator(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002026 __move_range(__p, __old_last, __p + __old_n);
Kostya Serebryany4963c252014-09-02 23:43:38 +00002027 __annotator.__done();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002028 _VSTD::copy(__first, __m, __p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002029 }
2030 }
2031 else
2032 {
2033 allocator_type& __a = this->__alloc();
2034 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
2035 __v.__construct_at_end(__first, __last);
2036 __p = __swap_out_circular_buffer(__v, __p);
2037 }
2038 }
2039 return __make_iter(__p);
2040}
2041
2042template <class _Tp, class _Allocator>
2043void
2044vector<_Tp, _Allocator>::resize(size_type __sz)
2045{
2046 size_type __cs = size();
2047 if (__cs < __sz)
2048 this->__append(__sz - __cs);
2049 else if (__cs > __sz)
2050 this->__destruct_at_end(this->__begin_ + __sz);
2051}
2052
2053template <class _Tp, class _Allocator>
2054void
2055vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
2056{
2057 size_type __cs = size();
2058 if (__cs < __sz)
2059 this->__append(__sz - __cs, __x);
2060 else if (__cs > __sz)
2061 this->__destruct_at_end(this->__begin_ + __sz);
2062}
2063
2064template <class _Tp, class _Allocator>
2065void
2066vector<_Tp, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002067#if _LIBCPP_STD_VER >= 14
Eric Fiselier69c51982016-12-28 06:06:09 +00002068 _NOEXCEPT_DEBUG
Marshall Clow8982dcd2015-07-13 20:04:56 +00002069#else
Eric Fiselier69c51982016-12-28 06:06:09 +00002070 _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002071 __is_nothrow_swappable<allocator_type>::value)
2072#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002073{
Howard Hinnant27e0e772011-09-14 18:33:51 +00002074 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
2075 this->__alloc() == __x.__alloc(),
2076 "vector::swap: Either propagate_on_container_swap must be true"
2077 " or the allocators must compare equal");
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002078 _VSTD::swap(this->__begin_, __x.__begin_);
2079 _VSTD::swap(this->__end_, __x.__end_);
2080 _VSTD::swap(this->__end_cap(), __x.__end_cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00002081 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00002082 integral_constant<bool,__alloc_traits::propagate_on_container_swap::value>());
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002083#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002084 __get_db()->swap(this, &__x);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002085#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002086}
2087
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002088template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002089bool
2090vector<_Tp, _Allocator>::__invariants() const
2091{
Howard Hinnant76053d72013-06-27 19:35:32 +00002092 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002093 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002094 if (this->__end_ != nullptr || this->__end_cap() != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002095 return false;
2096 }
2097 else
2098 {
2099 if (this->__begin_ > this->__end_)
2100 return false;
2101 if (this->__begin_ == this->__end_cap())
2102 return false;
2103 if (this->__end_ > this->__end_cap())
2104 return false;
2105 }
2106 return true;
2107}
2108
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002109#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002110
Howard Hinnantc51e1022010-05-11 19:42:16 +00002111template <class _Tp, class _Allocator>
Howard Hinnant27e0e772011-09-14 18:33:51 +00002112bool
2113vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
2114{
2115 return this->__begin_ <= __i->base() && __i->base() < this->__end_;
2116}
2117
2118template <class _Tp, class _Allocator>
2119bool
2120vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
2121{
2122 return this->__begin_ < __i->base() && __i->base() <= this->__end_;
2123}
2124
2125template <class _Tp, class _Allocator>
2126bool
2127vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
2128{
2129 const_pointer __p = __i->base() + __n;
2130 return this->__begin_ <= __p && __p <= this->__end_;
2131}
2132
2133template <class _Tp, class _Allocator>
2134bool
2135vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2136{
2137 const_pointer __p = __i->base() + __n;
2138 return this->__begin_ <= __p && __p < this->__end_;
2139}
2140
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002141#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002142
2143template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002144inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002145void
2146vector<_Tp, _Allocator>::__invalidate_all_iterators()
2147{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002148#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002149 __get_db()->__invalidate_all(this);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002150#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002151}
2152
Eric Fiselier69c51982016-12-28 06:06:09 +00002153
2154template <class _Tp, class _Allocator>
2155inline _LIBCPP_INLINE_VISIBILITY
2156void
2157vector<_Tp, _Allocator>::__invalidate_iterators_past(pointer __new_last) {
2158#if _LIBCPP_DEBUG_LEVEL >= 2
2159 __c_node* __c = __get_db()->__find_c_and_lock(this);
2160 for (__i_node** __p = __c->end_; __p != __c->beg_; ) {
2161 --__p;
2162 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
2163 if (__i->base() > __new_last) {
2164 (*__p)->__c_ = nullptr;
2165 if (--__c->end_ != __p)
2166 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
2167 }
2168 }
2169 __get_db()->unlock();
2170#else
2171 ((void)__new_last);
2172#endif
2173}
2174
Howard Hinnantc51e1022010-05-11 19:42:16 +00002175// vector<bool>
2176
2177template <class _Allocator> class vector<bool, _Allocator>;
2178
2179template <class _Allocator> struct hash<vector<bool, _Allocator> >;
2180
2181template <class _Allocator>
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002182struct __has_storage_type<vector<bool, _Allocator> >
2183{
2184 static const bool value = true;
2185};
2186
2187template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002188class _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002189 : private __vector_base_common<true>
2190{
2191public:
2192 typedef vector __self;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002193 typedef bool value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002194 typedef _Allocator allocator_type;
2195 typedef allocator_traits<allocator_type> __alloc_traits;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002196 typedef typename __alloc_traits::size_type size_type;
2197 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant896b7622012-05-07 16:50:38 +00002198 typedef size_type __storage_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002199 typedef __bit_iterator<vector, false> pointer;
2200 typedef __bit_iterator<vector, true> const_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002201 typedef pointer iterator;
2202 typedef const_pointer const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002203 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
2204 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002205
2206private:
Marshall Clow940e01c2015-04-07 05:21:38 +00002207 typedef typename __rebind_alloc_helper<__alloc_traits, __storage_type>::type __storage_allocator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002208 typedef allocator_traits<__storage_allocator> __storage_traits;
2209 typedef typename __storage_traits::pointer __storage_pointer;
2210 typedef typename __storage_traits::const_pointer __const_storage_pointer;
2211
2212 __storage_pointer __begin_;
2213 size_type __size_;
2214 __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002215public:
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002216 typedef __bit_reference<vector> reference;
2217 typedef __bit_const_reference<vector> const_reference;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002218private:
Howard Hinnant1c936782011-06-03 19:40:40 +00002219 _LIBCPP_INLINE_VISIBILITY
2220 size_type& __cap() _NOEXCEPT
2221 {return __cap_alloc_.first();}
2222 _LIBCPP_INLINE_VISIBILITY
2223 const size_type& __cap() const _NOEXCEPT
2224 {return __cap_alloc_.first();}
2225 _LIBCPP_INLINE_VISIBILITY
2226 __storage_allocator& __alloc() _NOEXCEPT
2227 {return __cap_alloc_.second();}
2228 _LIBCPP_INLINE_VISIBILITY
2229 const __storage_allocator& __alloc() const _NOEXCEPT
2230 {return __cap_alloc_.second();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002231
2232 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2233
Howard Hinnant1c936782011-06-03 19:40:40 +00002234 _LIBCPP_INLINE_VISIBILITY
2235 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002236 {return __n * __bits_per_word;}
Howard Hinnant1c936782011-06-03 19:40:40 +00002237 _LIBCPP_INLINE_VISIBILITY
2238 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002239 {return (__n - 1) / __bits_per_word + 1;}
2240
2241public:
Howard Hinnant1c936782011-06-03 19:40:40 +00002242 _LIBCPP_INLINE_VISIBILITY
Marshall Clowe546cbb2015-06-04 02:05:41 +00002243 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Marshall Clow8f282f42015-06-04 00:10:20 +00002244
2245 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
2246#if _LIBCPP_STD_VER <= 14
2247 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
2248#else
2249 _NOEXCEPT;
2250#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002251 ~vector();
2252 explicit vector(size_type __n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002253#if _LIBCPP_STD_VER > 11
2254 explicit vector(size_type __n, const allocator_type& __a);
2255#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002256 vector(size_type __n, const value_type& __v);
2257 vector(size_type __n, const value_type& __v, const allocator_type& __a);
2258 template <class _InputIterator>
2259 vector(_InputIterator __first, _InputIterator __last,
2260 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2261 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2262 template <class _InputIterator>
2263 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2264 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2265 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2266 template <class _ForwardIterator>
2267 vector(_ForwardIterator __first, _ForwardIterator __last,
2268 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2269 template <class _ForwardIterator>
2270 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2271 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2272
2273 vector(const vector& __v);
2274 vector(const vector& __v, const allocator_type& __a);
2275 vector& operator=(const vector& __v);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002276
2277#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002278 vector(initializer_list<value_type> __il);
2279 vector(initializer_list<value_type> __il, const allocator_type& __a);
2280
Howard Hinnant1c936782011-06-03 19:40:40 +00002281 _LIBCPP_INLINE_VISIBILITY
2282 vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002283#if _LIBCPP_STD_VER > 14
2284 _NOEXCEPT;
2285#else
Howard Hinnant1c936782011-06-03 19:40:40 +00002286 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clowe5108202015-07-14 14:46:32 +00002287#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002288 vector(vector&& __v, const allocator_type& __a);
Howard Hinnant1c936782011-06-03 19:40:40 +00002289 _LIBCPP_INLINE_VISIBILITY
2290 vector& operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002291 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Eric Fiseliered9e9362017-04-16 02:40:45 +00002292
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002293 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002294 vector& operator=(initializer_list<value_type> __il)
2295 {assign(__il.begin(), __il.end()); return *this;}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002296
2297#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002298
2299 template <class _InputIterator>
2300 typename enable_if
2301 <
2302 __is_input_iterator<_InputIterator>::value &&
2303 !__is_forward_iterator<_InputIterator>::value,
2304 void
2305 >::type
2306 assign(_InputIterator __first, _InputIterator __last);
2307 template <class _ForwardIterator>
2308 typename enable_if
2309 <
2310 __is_forward_iterator<_ForwardIterator>::value,
2311 void
2312 >::type
2313 assign(_ForwardIterator __first, _ForwardIterator __last);
2314
2315 void assign(size_type __n, const value_type& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002316
2317#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002318 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002319 void assign(initializer_list<value_type> __il)
2320 {assign(__il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002321#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002322
Howard Hinnant1c936782011-06-03 19:40:40 +00002323 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002324 {return allocator_type(this->__alloc());}
2325
Howard Hinnant1c936782011-06-03 19:40:40 +00002326 size_type max_size() const _NOEXCEPT;
2327 _LIBCPP_INLINE_VISIBILITY
2328 size_type capacity() const _NOEXCEPT
2329 {return __internal_cap_to_external(__cap());}
2330 _LIBCPP_INLINE_VISIBILITY
2331 size_type size() const _NOEXCEPT
2332 {return __size_;}
Marshall Clow425f5752017-11-15 05:51:26 +00002333 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00002334 bool empty() const _NOEXCEPT
2335 {return __size_ == 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002336 void reserve(size_type __n);
Howard Hinnant1c936782011-06-03 19:40:40 +00002337 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002338
Howard Hinnant1c936782011-06-03 19:40:40 +00002339 _LIBCPP_INLINE_VISIBILITY
2340 iterator begin() _NOEXCEPT
2341 {return __make_iter(0);}
2342 _LIBCPP_INLINE_VISIBILITY
2343 const_iterator begin() const _NOEXCEPT
2344 {return __make_iter(0);}
2345 _LIBCPP_INLINE_VISIBILITY
2346 iterator end() _NOEXCEPT
2347 {return __make_iter(__size_);}
2348 _LIBCPP_INLINE_VISIBILITY
2349 const_iterator end() const _NOEXCEPT
2350 {return __make_iter(__size_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002351
Howard Hinnant1c936782011-06-03 19:40:40 +00002352 _LIBCPP_INLINE_VISIBILITY
2353 reverse_iterator rbegin() _NOEXCEPT
2354 {return reverse_iterator(end());}
2355 _LIBCPP_INLINE_VISIBILITY
2356 const_reverse_iterator rbegin() const _NOEXCEPT
2357 {return const_reverse_iterator(end());}
2358 _LIBCPP_INLINE_VISIBILITY
2359 reverse_iterator rend() _NOEXCEPT
2360 {return reverse_iterator(begin());}
2361 _LIBCPP_INLINE_VISIBILITY
2362 const_reverse_iterator rend() const _NOEXCEPT
2363 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002364
Howard Hinnant1c936782011-06-03 19:40:40 +00002365 _LIBCPP_INLINE_VISIBILITY
2366 const_iterator cbegin() const _NOEXCEPT
2367 {return __make_iter(0);}
2368 _LIBCPP_INLINE_VISIBILITY
2369 const_iterator cend() const _NOEXCEPT
2370 {return __make_iter(__size_);}
2371 _LIBCPP_INLINE_VISIBILITY
2372 const_reverse_iterator crbegin() const _NOEXCEPT
2373 {return rbegin();}
2374 _LIBCPP_INLINE_VISIBILITY
2375 const_reverse_iterator crend() const _NOEXCEPT
2376 {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002377
2378 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
2379 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2380 reference at(size_type __n);
2381 const_reference at(size_type __n) const;
2382
2383 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
2384 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2385 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
2386 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
2387
2388 void push_back(const value_type& __x);
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002389#if _LIBCPP_STD_VER > 11
2390 template <class... _Args>
Marshall Clowea52cc42017-01-24 23:09:12 +00002391#if _LIBCPP_STD_VER > 14
2392 _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args)
2393#else
2394 _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args)
2395#endif
2396 {
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002397 push_back ( value_type ( _VSTD::forward<_Args>(__args)... ));
Marshall Clowea52cc42017-01-24 23:09:12 +00002398#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002399 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00002400#endif
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002401 }
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002402#endif
2403
Howard Hinnantc51e1022010-05-11 19:42:16 +00002404 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2405
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002406#if _LIBCPP_STD_VER > 11
2407 template <class... _Args>
2408 _LIBCPP_INLINE_VISIBILITY iterator emplace(const_iterator position, _Args&&... __args)
2409 { return insert ( position, value_type ( _VSTD::forward<_Args>(__args)... )); }
2410#endif
2411
Howard Hinnantc51e1022010-05-11 19:42:16 +00002412 iterator insert(const_iterator __position, const value_type& __x);
2413 iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2414 iterator insert(const_iterator __position, size_type __n, const_reference __x);
2415 template <class _InputIterator>
2416 typename enable_if
2417 <
2418 __is_input_iterator <_InputIterator>::value &&
2419 !__is_forward_iterator<_InputIterator>::value,
2420 iterator
2421 >::type
2422 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2423 template <class _ForwardIterator>
2424 typename enable_if
2425 <
2426 __is_forward_iterator<_ForwardIterator>::value,
2427 iterator
2428 >::type
2429 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002430
2431#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002432 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002433 iterator insert(const_iterator __position, initializer_list<value_type> __il)
2434 {return insert(__position, __il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002435#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002436
Howard Hinnantcf823322010-12-17 14:46:43 +00002437 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002438 iterator erase(const_iterator __first, const_iterator __last);
2439
Howard Hinnant1c936782011-06-03 19:40:40 +00002440 _LIBCPP_INLINE_VISIBILITY
2441 void clear() _NOEXCEPT {__size_ = 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002442
Howard Hinnant1c936782011-06-03 19:40:40 +00002443 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002444#if _LIBCPP_STD_VER >= 14
2445 _NOEXCEPT;
2446#else
Eric Fiselier69c51982016-12-28 06:06:09 +00002447 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002448 __is_nothrow_swappable<allocator_type>::value);
2449#endif
Marshall Clow89eb3822016-04-07 14:20:31 +00002450 static void swap(reference __x, reference __y) _NOEXCEPT { _VSTD::swap(__x, __y); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002451
2452 void resize(size_type __sz, value_type __x = false);
Howard Hinnant1c936782011-06-03 19:40:40 +00002453 void flip() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002454
2455 bool __invariants() const;
2456
2457private:
Howard Hinnantcf823322010-12-17 14:46:43 +00002458 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Marshall Clow3ff48e02018-05-22 16:20:28 +00002459 void __vallocate(size_type __n);
2460 void __vdeallocate() _NOEXCEPT;
Howard Hinnant1c936782011-06-03 19:40:40 +00002461 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantea382952013-08-14 18:00:20 +00002462 static size_type __align_it(size_type __new_size) _NOEXCEPT
Eric Fiselierb41db9a2018-10-01 01:59:37 +00002463 {return __new_size + (__bits_per_word-1) & ~((size_type)__bits_per_word-1);}
Howard Hinnantcf823322010-12-17 14:46:43 +00002464 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
2465 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002466 template <class _ForwardIterator>
2467 typename enable_if
2468 <
2469 __is_forward_iterator<_ForwardIterator>::value,
2470 void
2471 >::type
2472 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2473 void __append(size_type __n, const_reference __x);
Howard Hinnant1c936782011-06-03 19:40:40 +00002474 _LIBCPP_INLINE_VISIBILITY
2475 reference __make_ref(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002476 {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnant1c936782011-06-03 19:40:40 +00002477 _LIBCPP_INLINE_VISIBILITY
2478 const_reference __make_ref(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002479 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnant1c936782011-06-03 19:40:40 +00002480 _LIBCPP_INLINE_VISIBILITY
2481 iterator __make_iter(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002482 {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnant1c936782011-06-03 19:40:40 +00002483 _LIBCPP_INLINE_VISIBILITY
2484 const_iterator __make_iter(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002485 {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnant1c936782011-06-03 19:40:40 +00002486 _LIBCPP_INLINE_VISIBILITY
2487 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
Howard Hinnant76053d72013-06-27 19:35:32 +00002488 {return begin() + (__p - cbegin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002489
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002491 void __copy_assign_alloc(const vector& __v)
2492 {__copy_assign_alloc(__v, integral_constant<bool,
2493 __storage_traits::propagate_on_container_copy_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002494 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002495 void __copy_assign_alloc(const vector& __c, true_type)
2496 {
2497 if (__alloc() != __c.__alloc())
Marshall Clow3ff48e02018-05-22 16:20:28 +00002498 __vdeallocate();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002499 __alloc() = __c.__alloc();
2500 }
2501
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002502 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002503 void __copy_assign_alloc(const vector&, false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002504 {}
2505
2506 void __move_assign(vector& __c, false_type);
Howard Hinnant1c936782011-06-03 19:40:40 +00002507 void __move_assign(vector& __c, true_type)
2508 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002509 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002510 void __move_assign_alloc(vector& __c)
Howard Hinnant1c936782011-06-03 19:40:40 +00002511 _NOEXCEPT_(
2512 !__storage_traits::propagate_on_container_move_assignment::value ||
2513 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002514 {__move_assign_alloc(__c, integral_constant<bool,
2515 __storage_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002516 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc2734962011-09-02 20:42:31 +00002517 void __move_assign_alloc(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002518 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002519 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002520 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002521 }
2522
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002523 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002524 void __move_assign_alloc(vector&, false_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002525 _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002526 {}
2527
Howard Hinnant1c936782011-06-03 19:40:40 +00002528 size_t __hash_code() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002529
2530 friend class __bit_reference<vector>;
2531 friend class __bit_const_reference<vector>;
2532 friend class __bit_iterator<vector, false>;
2533 friend class __bit_iterator<vector, true>;
Howard Hinnant4210a0f2012-08-17 17:10:18 +00002534 friend struct __bit_array<vector>;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002535 friend struct _LIBCPP_TEMPLATE_VIS hash<vector>;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002536};
2537
2538template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002539inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002540void
2541vector<bool, _Allocator>::__invalidate_all_iterators()
2542{
Howard Hinnantc51e1022010-05-11 19:42:16 +00002543}
2544
2545// Allocate space for __n objects
2546// throws length_error if __n > max_size()
2547// throws (probably bad_alloc) if memory run out
2548// Precondition: __begin_ == __end_ == __cap() == 0
2549// Precondition: __n > 0
2550// Postcondition: capacity() == __n
2551// Postcondition: size() == 0
2552template <class _Allocator>
2553void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002554vector<bool, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002555{
2556 if (__n > max_size())
2557 this->__throw_length_error();
2558 __n = __external_cap_to_internal(__n);
2559 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2560 this->__size_ = 0;
2561 this->__cap() = __n;
2562}
2563
2564template <class _Allocator>
2565void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002566vector<bool, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002567{
Howard Hinnant76053d72013-06-27 19:35:32 +00002568 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002569 {
2570 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2571 __invalidate_all_iterators();
Howard Hinnant76053d72013-06-27 19:35:32 +00002572 this->__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002573 this->__size_ = this->__cap() = 0;
2574 }
2575}
2576
2577template <class _Allocator>
2578typename vector<bool, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +00002579vector<bool, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002580{
2581 size_type __amax = __storage_traits::max_size(__alloc());
2582 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
2583 if (__nmax / __bits_per_word <= __amax)
2584 return __nmax;
2585 return __internal_cap_to_external(__amax);
2586}
2587
2588// Precondition: __new_size > capacity()
2589template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002590inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002591typename vector<bool, _Allocator>::size_type
2592vector<bool, _Allocator>::__recommend(size_type __new_size) const
2593{
2594 const size_type __ms = max_size();
2595 if (__new_size > __ms)
2596 this->__throw_length_error();
2597 const size_type __cap = capacity();
2598 if (__cap >= __ms / 2)
2599 return __ms;
Howard Hinnantea382952013-08-14 18:00:20 +00002600 return _VSTD::max(2*__cap, __align_it(__new_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002601}
2602
2603// Default constructs __n objects starting at __end_
2604// Precondition: __n > 0
2605// Precondition: size() + __n <= capacity()
2606// Postcondition: size() == size() + __n
2607template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002608inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002609void
2610vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2611{
2612 size_type __old_size = this->__size_;
2613 this->__size_ += __n;
Marshall Clow1893ec72018-10-23 20:07:45 +00002614 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2615 {
2616 if (this->__size_ <= __bits_per_word)
2617 this->__begin_[0] = __storage_type(0);
2618 else
2619 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2620 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002621 _VSTD::fill_n(__make_iter(__old_size), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002622}
2623
2624template <class _Allocator>
2625template <class _ForwardIterator>
2626typename enable_if
2627<
2628 __is_forward_iterator<_ForwardIterator>::value,
2629 void
2630>::type
2631vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2632{
2633 size_type __old_size = this->__size_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002634 this->__size_ += _VSTD::distance(__first, __last);
Marshall Clow1893ec72018-10-23 20:07:45 +00002635 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2636 {
2637 if (this->__size_ <= __bits_per_word)
2638 this->__begin_[0] = __storage_type(0);
2639 else
2640 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2641 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002642 _VSTD::copy(__first, __last, __make_iter(__old_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002643}
2644
2645template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002646inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002647vector<bool, _Allocator>::vector()
Marshall Clowe546cbb2015-06-04 02:05:41 +00002648 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant76053d72013-06-27 19:35:32 +00002649 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002650 __size_(0),
2651 __cap_alloc_(0)
2652{
2653}
2654
2655template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002656inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002657vector<bool, _Allocator>::vector(const allocator_type& __a)
Marshall Clow8f282f42015-06-04 00:10:20 +00002658#if _LIBCPP_STD_VER <= 14
2659 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
2660#else
2661 _NOEXCEPT
2662#endif
Howard Hinnant76053d72013-06-27 19:35:32 +00002663 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002664 __size_(0),
2665 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2666{
2667}
2668
2669template <class _Allocator>
2670vector<bool, _Allocator>::vector(size_type __n)
Howard Hinnant76053d72013-06-27 19:35:32 +00002671 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002672 __size_(0),
2673 __cap_alloc_(0)
2674{
2675 if (__n > 0)
2676 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002677 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002678 __construct_at_end(__n, false);
2679 }
2680}
2681
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002682#if _LIBCPP_STD_VER > 11
2683template <class _Allocator>
2684vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a)
2685 : __begin_(nullptr),
2686 __size_(0),
2687 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2688{
2689 if (__n > 0)
2690 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002691 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002692 __construct_at_end(__n, false);
2693 }
2694}
2695#endif
2696
Howard Hinnantc51e1022010-05-11 19:42:16 +00002697template <class _Allocator>
2698vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnant76053d72013-06-27 19:35:32 +00002699 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002700 __size_(0),
2701 __cap_alloc_(0)
2702{
2703 if (__n > 0)
2704 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002705 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002706 __construct_at_end(__n, __x);
2707 }
2708}
2709
2710template <class _Allocator>
2711vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002712 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002713 __size_(0),
2714 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2715{
2716 if (__n > 0)
2717 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002718 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002719 __construct_at_end(__n, __x);
2720 }
2721}
2722
2723template <class _Allocator>
2724template <class _InputIterator>
2725vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2726 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2727 !__is_forward_iterator<_InputIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002728 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002729 __size_(0),
2730 __cap_alloc_(0)
2731{
2732#ifndef _LIBCPP_NO_EXCEPTIONS
2733 try
2734 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002735#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002736 for (; __first != __last; ++__first)
2737 push_back(*__first);
2738#ifndef _LIBCPP_NO_EXCEPTIONS
2739 }
2740 catch (...)
2741 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002742 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002743 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2744 __invalidate_all_iterators();
2745 throw;
2746 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002747#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002748}
2749
2750template <class _Allocator>
2751template <class _InputIterator>
2752vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2753 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2754 !__is_forward_iterator<_InputIterator>::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, static_cast<__storage_allocator>(__a))
2758{
2759#ifndef _LIBCPP_NO_EXCEPTIONS
2760 try
2761 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002762#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002763 for (; __first != __last; ++__first)
2764 push_back(*__first);
2765#ifndef _LIBCPP_NO_EXCEPTIONS
2766 }
2767 catch (...)
2768 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002769 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002770 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2771 __invalidate_all_iterators();
2772 throw;
2773 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002774#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002775}
2776
2777template <class _Allocator>
2778template <class _ForwardIterator>
2779vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2780 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002781 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002782 __size_(0),
2783 __cap_alloc_(0)
2784{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002785 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002786 if (__n > 0)
2787 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002788 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002789 __construct_at_end(__first, __last);
2790 }
2791}
2792
2793template <class _Allocator>
2794template <class _ForwardIterator>
2795vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2796 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002797 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002798 __size_(0),
2799 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2800{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002801 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002802 if (__n > 0)
2803 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002804 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002805 __construct_at_end(__first, __last);
2806 }
2807}
2808
Eric Fiseliered9e9362017-04-16 02:40:45 +00002809#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002810
Howard Hinnantc51e1022010-05-11 19:42:16 +00002811template <class _Allocator>
2812vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
Howard Hinnant76053d72013-06-27 19:35:32 +00002813 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002814 __size_(0),
2815 __cap_alloc_(0)
2816{
2817 size_type __n = static_cast<size_type>(__il.size());
2818 if (__n > 0)
2819 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002820 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002821 __construct_at_end(__il.begin(), __il.end());
2822 }
2823}
2824
2825template <class _Allocator>
2826vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002827 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002828 __size_(0),
2829 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2830{
2831 size_type __n = static_cast<size_type>(__il.size());
2832 if (__n > 0)
2833 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002834 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002835 __construct_at_end(__il.begin(), __il.end());
2836 }
2837}
2838
Eric Fiseliered9e9362017-04-16 02:40:45 +00002839#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002840
Howard Hinnantc51e1022010-05-11 19:42:16 +00002841template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002842vector<bool, _Allocator>::~vector()
2843{
Howard Hinnant76053d72013-06-27 19:35:32 +00002844 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002845 __storage_traits::deallocate(__alloc(), __begin_, __cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002846 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002847}
2848
2849template <class _Allocator>
2850vector<bool, _Allocator>::vector(const vector& __v)
Howard Hinnant76053d72013-06-27 19:35:32 +00002851 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002852 __size_(0),
2853 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2854{
2855 if (__v.size() > 0)
2856 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002857 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002858 __construct_at_end(__v.begin(), __v.end());
2859 }
2860}
2861
2862template <class _Allocator>
2863vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002864 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002865 __size_(0),
2866 __cap_alloc_(0, __a)
2867{
2868 if (__v.size() > 0)
2869 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002870 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002871 __construct_at_end(__v.begin(), __v.end());
2872 }
2873}
2874
2875template <class _Allocator>
2876vector<bool, _Allocator>&
2877vector<bool, _Allocator>::operator=(const vector& __v)
2878{
2879 if (this != &__v)
2880 {
2881 __copy_assign_alloc(__v);
2882 if (__v.__size_)
2883 {
2884 if (__v.__size_ > capacity())
2885 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002886 __vdeallocate();
2887 __vallocate(__v.__size_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002888 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002889 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002890 }
2891 __size_ = __v.__size_;
2892 }
2893 return *this;
2894}
2895
Eric Fiseliered9e9362017-04-16 02:40:45 +00002896#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant74279a52010-09-04 23:28:19 +00002897
Howard Hinnantc51e1022010-05-11 19:42:16 +00002898template <class _Allocator>
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002899inline _LIBCPP_INLINE_VISIBILITY vector<bool, _Allocator>::vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002900#if _LIBCPP_STD_VER > 14
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002901 _NOEXCEPT
Marshall Clowe5108202015-07-14 14:46:32 +00002902#else
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002903 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00002904#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002905 : __begin_(__v.__begin_),
2906 __size_(__v.__size_),
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002907 __cap_alloc_(std::move(__v.__cap_alloc_)) {
Howard Hinnant76053d72013-06-27 19:35:32 +00002908 __v.__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002909 __v.__size_ = 0;
2910 __v.__cap() = 0;
2911}
2912
2913template <class _Allocator>
2914vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002915 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002916 __size_(0),
2917 __cap_alloc_(0, __a)
2918{
2919 if (__a == allocator_type(__v.__alloc()))
2920 {
2921 this->__begin_ = __v.__begin_;
2922 this->__size_ = __v.__size_;
2923 this->__cap() = __v.__cap();
2924 __v.__begin_ = nullptr;
2925 __v.__cap() = __v.__size_ = 0;
2926 }
2927 else if (__v.size() > 0)
2928 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002929 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002930 __construct_at_end(__v.begin(), __v.end());
2931 }
2932}
2933
2934template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002935inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002936vector<bool, _Allocator>&
2937vector<bool, _Allocator>::operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002938 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002939{
2940 __move_assign(__v, integral_constant<bool,
2941 __storage_traits::propagate_on_container_move_assignment::value>());
Argyrios Kyrtzidisaf904652012-10-13 02:03:45 +00002942 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002943}
2944
2945template <class _Allocator>
2946void
2947vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2948{
2949 if (__alloc() != __c.__alloc())
2950 assign(__c.begin(), __c.end());
2951 else
2952 __move_assign(__c, true_type());
2953}
2954
2955template <class _Allocator>
2956void
2957vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002958 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002959{
Marshall Clow3ff48e02018-05-22 16:20:28 +00002960 __vdeallocate();
Marshall Clowb4871fa2014-07-21 15:15:15 +00002961 __move_assign_alloc(__c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002962 this->__begin_ = __c.__begin_;
2963 this->__size_ = __c.__size_;
2964 this->__cap() = __c.__cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002965 __c.__begin_ = nullptr;
2966 __c.__cap() = __c.__size_ = 0;
2967}
Howard Hinnant74279a52010-09-04 23:28:19 +00002968
Eric Fiseliered9e9362017-04-16 02:40:45 +00002969#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002970
2971template <class _Allocator>
2972void
2973vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2974{
2975 __size_ = 0;
2976 if (__n > 0)
2977 {
2978 size_type __c = capacity();
2979 if (__n <= __c)
2980 __size_ = __n;
2981 else
2982 {
2983 vector __v(__alloc());
2984 __v.reserve(__recommend(__n));
2985 __v.__size_ = __n;
2986 swap(__v);
2987 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002988 _VSTD::fill_n(begin(), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002989 }
Eric Fiselier69c51982016-12-28 06:06:09 +00002990 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002991}
2992
2993template <class _Allocator>
2994template <class _InputIterator>
2995typename enable_if
2996<
2997 __is_input_iterator<_InputIterator>::value &&
2998 !__is_forward_iterator<_InputIterator>::value,
2999 void
3000>::type
3001vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
3002{
3003 clear();
3004 for (; __first != __last; ++__first)
3005 push_back(*__first);
3006}
3007
3008template <class _Allocator>
3009template <class _ForwardIterator>
3010typename enable_if
3011<
3012 __is_forward_iterator<_ForwardIterator>::value,
3013 void
3014>::type
3015vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
3016{
3017 clear();
Eric Fiselier6003c772016-12-23 23:37:52 +00003018 difference_type __ns = _VSTD::distance(__first, __last);
3019 _LIBCPP_ASSERT(__ns >= 0, "invalid range specified");
3020 const size_t __n = static_cast<size_type>(__ns);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003021 if (__n)
3022 {
3023 if (__n > capacity())
3024 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00003025 __vdeallocate();
3026 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003027 }
3028 __construct_at_end(__first, __last);
3029 }
3030}
3031
3032template <class _Allocator>
3033void
3034vector<bool, _Allocator>::reserve(size_type __n)
3035{
3036 if (__n > capacity())
3037 {
3038 vector __v(this->__alloc());
Marshall Clow3ff48e02018-05-22 16:20:28 +00003039 __v.__vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003040 __v.__construct_at_end(this->begin(), this->end());
3041 swap(__v);
3042 __invalidate_all_iterators();
3043 }
3044}
3045
3046template <class _Allocator>
3047void
Howard Hinnant1c936782011-06-03 19:40:40 +00003048vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003049{
3050 if (__external_cap_to_internal(size()) > __cap())
3051 {
3052#ifndef _LIBCPP_NO_EXCEPTIONS
3053 try
3054 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003055#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003056 vector(*this, allocator_type(__alloc())).swap(*this);
3057#ifndef _LIBCPP_NO_EXCEPTIONS
3058 }
3059 catch (...)
3060 {
3061 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003062#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003063 }
3064}
3065
3066template <class _Allocator>
3067typename vector<bool, _Allocator>::reference
3068vector<bool, _Allocator>::at(size_type __n)
3069{
3070 if (__n >= size())
3071 this->__throw_out_of_range();
3072 return (*this)[__n];
3073}
3074
3075template <class _Allocator>
3076typename vector<bool, _Allocator>::const_reference
3077vector<bool, _Allocator>::at(size_type __n) const
3078{
3079 if (__n >= size())
3080 this->__throw_out_of_range();
3081 return (*this)[__n];
3082}
3083
3084template <class _Allocator>
3085void
3086vector<bool, _Allocator>::push_back(const value_type& __x)
3087{
3088 if (this->__size_ == this->capacity())
3089 reserve(__recommend(this->__size_ + 1));
3090 ++this->__size_;
3091 back() = __x;
3092}
3093
3094template <class _Allocator>
3095typename vector<bool, _Allocator>::iterator
3096vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
3097{
3098 iterator __r;
3099 if (size() < capacity())
3100 {
3101 const_iterator __old_end = end();
3102 ++__size_;
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_ + 1));
3110 __v.__size_ = __size_ + 1;
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 }
3115 *__r = __x;
3116 return __r;
3117}
3118
3119template <class _Allocator>
3120typename vector<bool, _Allocator>::iterator
3121vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
3122{
3123 iterator __r;
3124 size_type __c = capacity();
3125 if (__n <= __c && size() <= __c - __n)
3126 {
3127 const_iterator __old_end = end();
3128 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003129 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003130 __r = __const_iterator_cast(__position);
3131 }
3132 else
3133 {
3134 vector __v(__alloc());
3135 __v.reserve(__recommend(__size_ + __n));
3136 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003137 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3138 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003139 swap(__v);
3140 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003141 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003142 return __r;
3143}
3144
3145template <class _Allocator>
3146template <class _InputIterator>
3147typename enable_if
3148<
3149 __is_input_iterator <_InputIterator>::value &&
3150 !__is_forward_iterator<_InputIterator>::value,
3151 typename vector<bool, _Allocator>::iterator
3152>::type
3153vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
3154{
3155 difference_type __off = __position - begin();
3156 iterator __p = __const_iterator_cast(__position);
3157 iterator __old_end = end();
3158 for (; size() != capacity() && __first != __last; ++__first)
3159 {
3160 ++this->__size_;
3161 back() = *__first;
3162 }
3163 vector __v(__alloc());
3164 if (__first != __last)
3165 {
3166#ifndef _LIBCPP_NO_EXCEPTIONS
3167 try
3168 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003169#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003170 __v.assign(__first, __last);
3171 difference_type __old_size = static_cast<difference_type>(__old_end - begin());
3172 difference_type __old_p = __p - begin();
3173 reserve(__recommend(size() + __v.size()));
3174 __p = begin() + __old_p;
3175 __old_end = begin() + __old_size;
3176#ifndef _LIBCPP_NO_EXCEPTIONS
3177 }
3178 catch (...)
3179 {
3180 erase(__old_end, end());
3181 throw;
3182 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003183#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003184 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003185 __p = _VSTD::rotate(__p, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003186 insert(__p, __v.begin(), __v.end());
3187 return begin() + __off;
3188}
3189
3190template <class _Allocator>
3191template <class _ForwardIterator>
3192typename enable_if
3193<
3194 __is_forward_iterator<_ForwardIterator>::value,
3195 typename vector<bool, _Allocator>::iterator
3196>::type
3197vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
3198{
Eric Fiselier654dd332016-12-11 05:31:00 +00003199 const difference_type __n_signed = _VSTD::distance(__first, __last);
3200 _LIBCPP_ASSERT(__n_signed >= 0, "invalid range specified");
3201 const size_type __n = static_cast<size_type>(__n_signed);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003202 iterator __r;
3203 size_type __c = capacity();
3204 if (__n <= __c && size() <= __c - __n)
3205 {
3206 const_iterator __old_end = end();
3207 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003208 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003209 __r = __const_iterator_cast(__position);
3210 }
3211 else
3212 {
3213 vector __v(__alloc());
3214 __v.reserve(__recommend(__size_ + __n));
3215 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003216 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3217 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003218 swap(__v);
3219 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003220 _VSTD::copy(__first, __last, __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003221 return __r;
3222}
3223
3224template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003225inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003226typename vector<bool, _Allocator>::iterator
3227vector<bool, _Allocator>::erase(const_iterator __position)
3228{
3229 iterator __r = __const_iterator_cast(__position);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003230 _VSTD::copy(__position + 1, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003231 --__size_;
3232 return __r;
3233}
3234
3235template <class _Allocator>
3236typename vector<bool, _Allocator>::iterator
3237vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
3238{
3239 iterator __r = __const_iterator_cast(__first);
3240 difference_type __d = __last - __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003241 _VSTD::copy(__last, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003242 __size_ -= __d;
3243 return __r;
3244}
3245
3246template <class _Allocator>
3247void
3248vector<bool, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00003249#if _LIBCPP_STD_VER >= 14
3250 _NOEXCEPT
3251#else
Eric Fiselier69c51982016-12-28 06:06:09 +00003252 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00003253 __is_nothrow_swappable<allocator_type>::value)
3254#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00003255{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003256 _VSTD::swap(this->__begin_, __x.__begin_);
3257 _VSTD::swap(this->__size_, __x.__size_);
3258 _VSTD::swap(this->__cap(), __x.__cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00003259 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00003260 integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003261}
3262
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003263template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003264void
3265vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3266{
3267 size_type __cs = size();
3268 if (__cs < __sz)
3269 {
3270 iterator __r;
3271 size_type __c = capacity();
3272 size_type __n = __sz - __cs;
3273 if (__n <= __c && __cs <= __c - __n)
3274 {
3275 __r = end();
3276 __size_ += __n;
3277 }
3278 else
3279 {
3280 vector __v(__alloc());
3281 __v.reserve(__recommend(__size_ + __n));
3282 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003283 __r = _VSTD::copy(cbegin(), cend(), __v.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003284 swap(__v);
3285 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003286 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003287 }
3288 else
3289 __size_ = __sz;
3290}
3291
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003292template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003293void
Howard Hinnant1c936782011-06-03 19:40:40 +00003294vector<bool, _Allocator>::flip() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003295{
3296 // do middle whole words
3297 size_type __n = __size_;
3298 __storage_pointer __p = __begin_;
3299 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3300 *__p = ~*__p;
3301 // do last partial word
3302 if (__n > 0)
3303 {
3304 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3305 __storage_type __b = *__p & __m;
3306 *__p &= ~__m;
3307 *__p |= ~__b & __m;
3308 }
3309}
3310
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003311template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003312bool
3313vector<bool, _Allocator>::__invariants() const
3314{
Howard Hinnant76053d72013-06-27 19:35:32 +00003315 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003316 {
3317 if (this->__size_ != 0 || this->__cap() != 0)
3318 return false;
3319 }
3320 else
3321 {
3322 if (this->__cap() == 0)
3323 return false;
3324 if (this->__size_ > this->capacity())
3325 return false;
3326 }
3327 return true;
3328}
3329
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003330template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003331size_t
Howard Hinnant1c936782011-06-03 19:40:40 +00003332vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003333{
3334 size_t __h = 0;
3335 // do middle whole words
3336 size_type __n = __size_;
3337 __storage_pointer __p = __begin_;
3338 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3339 __h ^= *__p;
3340 // do last partial word
3341 if (__n > 0)
3342 {
3343 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3344 __h ^= *__p & __m;
3345 }
3346 return __h;
3347}
3348
3349template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00003350struct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003351 : public unary_function<vector<bool, _Allocator>, size_t>
3352{
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003353 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00003354 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003355 {return __vec.__hash_code();}
3356};
3357
3358template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003359inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003360bool
3361operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3362{
3363 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003364 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003365}
3366
3367template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003368inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003369bool
3370operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3371{
3372 return !(__x == __y);
3373}
3374
3375template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003376inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003377bool
3378operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3379{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003380 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003381}
3382
3383template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003384inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003385bool
3386operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3387{
3388 return __y < __x;
3389}
3390
3391template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003392inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003393bool
3394operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3395{
3396 return !(__x < __y);
3397}
3398
3399template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003400inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003401bool
3402operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3403{
3404 return !(__y < __x);
3405}
3406
3407template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003408inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003409void
3410swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
Howard Hinnant1c936782011-06-03 19:40:40 +00003411 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00003412{
3413 __x.swap(__y);
3414}
3415
Marshall Clow29b53f22018-12-14 18:49:35 +00003416#if _LIBCPP_STD_VER > 17
3417template <class _Tp, class _Allocator, class _Up>
3418inline _LIBCPP_INLINE_VISIBILITY
3419void erase(vector<_Tp, _Allocator>& __c, const _Up& __v)
3420{ __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end()); }
3421
3422template <class _Tp, class _Allocator, class _Predicate>
3423inline _LIBCPP_INLINE_VISIBILITY
3424void erase_if(vector<_Tp, _Allocator>& __c, _Predicate __pred)
3425{ __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end()); }
3426#endif
3427
Howard Hinnantc51e1022010-05-11 19:42:16 +00003428_LIBCPP_END_NAMESPACE_STD
3429
Eric Fiselierf4433a32017-05-31 22:07:49 +00003430_LIBCPP_POP_MACROS
3431
Howard Hinnantc51e1022010-05-11 19:42:16 +00003432#endif // _LIBCPP_VECTOR