blob: 9245ba18ce928b35ce53692747d4ddbffa190757 [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
264} // std
265
266*/
267
268#include <__config>
Eric Fiselier876c6862016-02-20 00:19:45 +0000269#include <iosfwd> // for forward declaration of vector
Howard Hinnantc51e1022010-05-11 19:42:16 +0000270#include <__bit_reference>
271#include <type_traits>
272#include <climits>
273#include <limits>
274#include <initializer_list>
275#include <memory>
276#include <stdexcept>
277#include <algorithm>
278#include <cstring>
279#include <__split_buffer>
280#include <__functional_base>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000281
Eric Fiselier14b6de92014-08-10 23:53:08 +0000282#include <__debug>
Howard Hinnante6ff0b62013-08-02 00:26:35 +0000283
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000284#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000285#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000286#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000287
Eric Fiselierf4433a32017-05-31 22:07:49 +0000288_LIBCPP_PUSH_MACROS
289#include <__undef_macros>
290
291
Howard Hinnantc51e1022010-05-11 19:42:16 +0000292_LIBCPP_BEGIN_NAMESPACE_STD
293
294template <bool>
295class __vector_base_common
296{
297protected:
Louis Dionne16fe2952018-07-11 23:14:33 +0000298 _LIBCPP_INLINE_VISIBILITY __vector_base_common() {}
Marshall Clow8fea1612016-08-25 15:09:01 +0000299 _LIBCPP_NORETURN void __throw_length_error() const;
300 _LIBCPP_NORETURN void __throw_out_of_range() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000301};
302
303template <bool __b>
304void
305__vector_base_common<__b>::__throw_length_error() const
306{
Marshall Clow8fea1612016-08-25 15:09:01 +0000307 _VSTD::__throw_length_error("vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +0000308}
309
310template <bool __b>
311void
312__vector_base_common<__b>::__throw_out_of_range() const
313{
Marshall Clow8fea1612016-08-25 15:09:01 +0000314 _VSTD::__throw_out_of_range("vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +0000315}
316
Eric Fiselier1b57fa82016-09-15 22:27:07 +0000317_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __vector_base_common<true>)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000318
319template <class _Tp, class _Allocator>
320class __vector_base
321 : protected __vector_base_common<true>
322{
Marshall Clowf0ca1492018-05-21 21:30:12 +0000323public:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 typedef _Allocator allocator_type;
325 typedef allocator_traits<allocator_type> __alloc_traits;
Marshall Clowf0ca1492018-05-21 21:30:12 +0000326 typedef typename __alloc_traits::size_type size_type;
327protected:
328 typedef _Tp value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000329 typedef value_type& reference;
330 typedef const value_type& const_reference;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000331 typedef typename __alloc_traits::difference_type difference_type;
332 typedef typename __alloc_traits::pointer pointer;
333 typedef typename __alloc_traits::const_pointer const_pointer;
334 typedef pointer iterator;
335 typedef const_pointer const_iterator;
336
337 pointer __begin_;
338 pointer __end_;
339 __compressed_pair<pointer, allocator_type> __end_cap_;
340
Howard Hinnant1c936782011-06-03 19:40:40 +0000341 _LIBCPP_INLINE_VISIBILITY
342 allocator_type& __alloc() _NOEXCEPT
343 {return __end_cap_.second();}
344 _LIBCPP_INLINE_VISIBILITY
345 const allocator_type& __alloc() const _NOEXCEPT
346 {return __end_cap_.second();}
347 _LIBCPP_INLINE_VISIBILITY
348 pointer& __end_cap() _NOEXCEPT
349 {return __end_cap_.first();}
350 _LIBCPP_INLINE_VISIBILITY
351 const pointer& __end_cap() const _NOEXCEPT
352 {return __end_cap_.first();}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353
Howard Hinnant1c936782011-06-03 19:40:40 +0000354 _LIBCPP_INLINE_VISIBILITY
355 __vector_base()
356 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnantcf823322010-12-17 14:46:43 +0000357 _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a);
Eric Fiselier4f1534c2018-06-05 22:32:52 +0000358#ifndef _LIBCPP_CXX03_LANG
359 _LIBCPP_INLINE_VISIBILITY __vector_base(allocator_type&& __a) _NOEXCEPT;
360#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000361 ~__vector_base();
362
Howard Hinnant1c936782011-06-03 19:40:40 +0000363 _LIBCPP_INLINE_VISIBILITY
364 void clear() _NOEXCEPT {__destruct_at_end(__begin_);}
365 _LIBCPP_INLINE_VISIBILITY
366 size_type capacity() const _NOEXCEPT
367 {return static_cast<size_type>(__end_cap() - __begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000368
Howard Hinnant1c936782011-06-03 19:40:40 +0000369 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant76053d72013-06-27 19:35:32 +0000370 void __destruct_at_end(pointer __new_last) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000371
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000372 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373 void __copy_assign_alloc(const __vector_base& __c)
374 {__copy_assign_alloc(__c, integral_constant<bool,
375 __alloc_traits::propagate_on_container_copy_assignment::value>());}
376
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000377 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378 void __move_assign_alloc(__vector_base& __c)
Howard Hinnant1c936782011-06-03 19:40:40 +0000379 _NOEXCEPT_(
380 !__alloc_traits::propagate_on_container_move_assignment::value ||
381 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382 {__move_assign_alloc(__c, integral_constant<bool,
383 __alloc_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000385 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000386 void __copy_assign_alloc(const __vector_base& __c, true_type)
387 {
388 if (__alloc() != __c.__alloc())
389 {
390 clear();
391 __alloc_traits::deallocate(__alloc(), __begin_, capacity());
392 __begin_ = __end_ = __end_cap() = nullptr;
393 }
394 __alloc() = __c.__alloc();
395 }
396
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000397 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +0000398 void __copy_assign_alloc(const __vector_base&, false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000399 {}
400
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000401 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc2734962011-09-02 20:42:31 +0000402 void __move_assign_alloc(__vector_base& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +0000403 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000405 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000406 }
407
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000408 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +0000409 void __move_assign_alloc(__vector_base&, false_type)
Howard Hinnant1c936782011-06-03 19:40:40 +0000410 _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411 {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412};
413
414template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000415inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000416void
Howard Hinnant76053d72013-06-27 19:35:32 +0000417__vector_base<_Tp, _Allocator>::__destruct_at_end(pointer __new_last) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000418{
Bruce Mitchener405fdcd2017-03-23 14:39:23 +0000419 pointer __soon_to_be_end = __end_;
420 while (__new_last != __soon_to_be_end)
421 __alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(--__soon_to_be_end));
422 __end_ = __new_last;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423}
424
425template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000426inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000427__vector_base<_Tp, _Allocator>::__vector_base()
Howard Hinnant1c936782011-06-03 19:40:40 +0000428 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant76053d72013-06-27 19:35:32 +0000429 : __begin_(nullptr),
430 __end_(nullptr),
431 __end_cap_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432{
433}
434
435template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000436inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000437__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +0000438 : __begin_(nullptr),
439 __end_(nullptr),
440 __end_cap_(nullptr, __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000441{
442}
443
Eric Fiselier4f1534c2018-06-05 22:32:52 +0000444#ifndef _LIBCPP_CXX03_LANG
445template <class _Tp, class _Allocator>
446inline _LIBCPP_INLINE_VISIBILITY
447__vector_base<_Tp, _Allocator>::__vector_base(allocator_type&& __a) _NOEXCEPT
448 : __begin_(nullptr),
449 __end_(nullptr),
450 __end_cap_(nullptr, std::move(__a)) {}
451#endif
452
Howard Hinnantc51e1022010-05-11 19:42:16 +0000453template <class _Tp, class _Allocator>
454__vector_base<_Tp, _Allocator>::~__vector_base()
455{
Howard Hinnant76053d72013-06-27 19:35:32 +0000456 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000457 {
458 clear();
459 __alloc_traits::deallocate(__alloc(), __begin_, capacity());
460 }
461}
462
Eric Fiselier876c6862016-02-20 00:19:45 +0000463template <class _Tp, class _Allocator /* = allocator<_Tp> */>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000464class _LIBCPP_TEMPLATE_VIS vector
Howard Hinnantc51e1022010-05-11 19:42:16 +0000465 : private __vector_base<_Tp, _Allocator>
466{
467private:
468 typedef __vector_base<_Tp, _Allocator> __base;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000469 typedef allocator<_Tp> __default_allocator_type;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000470public:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000471 typedef vector __self;
Howard Hinnant3b6579a2010-08-22 00:02:43 +0000472 typedef _Tp value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000473 typedef _Allocator allocator_type;
474 typedef typename __base::__alloc_traits __alloc_traits;
475 typedef typename __base::reference reference;
476 typedef typename __base::const_reference const_reference;
477 typedef typename __base::size_type size_type;
478 typedef typename __base::difference_type difference_type;
479 typedef typename __base::pointer pointer;
480 typedef typename __base::const_pointer const_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000481 typedef __wrap_iter<pointer> iterator;
482 typedef __wrap_iter<const_pointer> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000483 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
484 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000485
Howard Hinnanta416ff02013-03-26 19:04:56 +0000486 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
487 "Allocator::value_type must be same type as value_type");
488
Howard Hinnant1c936782011-06-03 19:40:40 +0000489 _LIBCPP_INLINE_VISIBILITY
Marshall Clowe546cbb2015-06-04 02:05:41 +0000490 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant27e0e772011-09-14 18:33:51 +0000491 {
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000492#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000493 __get_db()->__insert_c(this);
494#endif
495 }
496 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
Marshall Clow8f282f42015-06-04 00:10:20 +0000497#if _LIBCPP_STD_VER <= 14
498 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
499#else
500 _NOEXCEPT
501#endif
Howard Hinnant27e0e772011-09-14 18:33:51 +0000502 : __base(__a)
503 {
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000504#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000505 __get_db()->__insert_c(this);
506#endif
507 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000508 explicit vector(size_type __n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +0000509#if _LIBCPP_STD_VER > 11
510 explicit vector(size_type __n, const allocator_type& __a);
511#endif
Marshall Clowf0ca1492018-05-21 21:30:12 +0000512 vector(size_type __n, const value_type& __x);
513 vector(size_type __n, const value_type& __x, const allocator_type& __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000514 template <class _InputIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +0000515 vector(_InputIterator __first,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000516 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000517 !__is_forward_iterator<_InputIterator>::value &&
518 is_constructible<
519 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +0000520 typename iterator_traits<_InputIterator>::reference>::value,
521 _InputIterator>::type __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522 template <class _InputIterator>
523 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
524 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000525 !__is_forward_iterator<_InputIterator>::value &&
526 is_constructible<
527 value_type,
528 typename iterator_traits<_InputIterator>::reference>::value>::type* = 0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000529 template <class _ForwardIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +0000530 vector(_ForwardIterator __first,
Howard Hinnant88010252013-03-28 17:44:32 +0000531 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
532 is_constructible<
533 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +0000534 typename iterator_traits<_ForwardIterator>::reference>::value,
535 _ForwardIterator>::type __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000536 template <class _ForwardIterator>
537 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant88010252013-03-28 17:44:32 +0000538 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
539 is_constructible<
540 value_type,
541 typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000542
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000543 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant27e0e772011-09-14 18:33:51 +0000544 ~vector()
545 {
Marshall Clow68af4f32018-09-07 15:47:59 +0000546 __annotate_delete();
547#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000548 __get_db()->__erase_c(this);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000549#endif
Marshall Clow68af4f32018-09-07 15:47:59 +0000550 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000551
552 vector(const vector& __x);
553 vector(const vector& __x, const allocator_type& __a);
Howard Hinnantcf823322010-12-17 14:46:43 +0000554 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000555 vector& operator=(const vector& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000556
557#ifndef _LIBCPP_CXX03_LANG
558 _LIBCPP_INLINE_VISIBILITY
559 vector(initializer_list<value_type> __il);
560
561 _LIBCPP_INLINE_VISIBILITY
562 vector(initializer_list<value_type> __il, const allocator_type& __a);
563
Howard Hinnantcf823322010-12-17 14:46:43 +0000564 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000565 vector(vector&& __x)
Marshall Clowe5108202015-07-14 14:46:32 +0000566#if _LIBCPP_STD_VER > 14
567 _NOEXCEPT;
568#else
Howard Hinnant1c936782011-06-03 19:40:40 +0000569 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clowe5108202015-07-14 14:46:32 +0000570#endif
Eric Fiseliered9e9362017-04-16 02:40:45 +0000571
Howard Hinnantcf823322010-12-17 14:46:43 +0000572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000573 vector(vector&& __x, const allocator_type& __a);
Howard Hinnantcf823322010-12-17 14:46:43 +0000574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000575 vector& operator=(vector&& __x)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +0000576 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Eric Fiseliered9e9362017-04-16 02:40:45 +0000577
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000578 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000579 vector& operator=(initializer_list<value_type> __il)
580 {assign(__il.begin(), __il.end()); return *this;}
Eric Fiseliered9e9362017-04-16 02:40:45 +0000581
582#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000583
584 template <class _InputIterator>
585 typename enable_if
586 <
587 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000588 !__is_forward_iterator<_InputIterator>::value &&
589 is_constructible<
590 value_type,
591 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000592 void
593 >::type
594 assign(_InputIterator __first, _InputIterator __last);
595 template <class _ForwardIterator>
596 typename enable_if
597 <
Howard Hinnant88010252013-03-28 17:44:32 +0000598 __is_forward_iterator<_ForwardIterator>::value &&
599 is_constructible<
600 value_type,
601 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000602 void
603 >::type
604 assign(_ForwardIterator __first, _ForwardIterator __last);
605
606 void assign(size_type __n, const_reference __u);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000607
608#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000609 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000610 void assign(initializer_list<value_type> __il)
611 {assign(__il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +0000612#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000613
Howard Hinnant1c936782011-06-03 19:40:40 +0000614 _LIBCPP_INLINE_VISIBILITY
615 allocator_type get_allocator() const _NOEXCEPT
616 {return this->__alloc();}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000617
Howard Hinnant1c936782011-06-03 19:40:40 +0000618 _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT;
619 _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT;
620 _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT;
621 _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622
Howard Hinnant1c936782011-06-03 19:40:40 +0000623 _LIBCPP_INLINE_VISIBILITY
624 reverse_iterator rbegin() _NOEXCEPT
625 {return reverse_iterator(end());}
626 _LIBCPP_INLINE_VISIBILITY
627 const_reverse_iterator rbegin() const _NOEXCEPT
628 {return const_reverse_iterator(end());}
629 _LIBCPP_INLINE_VISIBILITY
630 reverse_iterator rend() _NOEXCEPT
631 {return reverse_iterator(begin());}
632 _LIBCPP_INLINE_VISIBILITY
633 const_reverse_iterator rend() const _NOEXCEPT
634 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000635
Howard Hinnant1c936782011-06-03 19:40:40 +0000636 _LIBCPP_INLINE_VISIBILITY
637 const_iterator cbegin() const _NOEXCEPT
638 {return begin();}
639 _LIBCPP_INLINE_VISIBILITY
640 const_iterator cend() const _NOEXCEPT
641 {return end();}
642 _LIBCPP_INLINE_VISIBILITY
643 const_reverse_iterator crbegin() const _NOEXCEPT
644 {return rbegin();}
645 _LIBCPP_INLINE_VISIBILITY
646 const_reverse_iterator crend() const _NOEXCEPT
647 {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000648
Howard Hinnant1c936782011-06-03 19:40:40 +0000649 _LIBCPP_INLINE_VISIBILITY
650 size_type size() const _NOEXCEPT
651 {return static_cast<size_type>(this->__end_ - this->__begin_);}
652 _LIBCPP_INLINE_VISIBILITY
653 size_type capacity() const _NOEXCEPT
654 {return __base::capacity();}
Marshall Clow425f5752017-11-15 05:51:26 +0000655 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000656 bool empty() const _NOEXCEPT
657 {return this->__begin_ == this->__end_;}
658 size_type max_size() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000659 void reserve(size_type __n);
Howard Hinnant1c936782011-06-03 19:40:40 +0000660 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000661
662 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n);
663 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const;
664 reference at(size_type __n);
665 const_reference at(size_type __n) const;
666
Howard Hinnant27e0e772011-09-14 18:33:51 +0000667 _LIBCPP_INLINE_VISIBILITY reference front()
668 {
669 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
670 return *this->__begin_;
671 }
672 _LIBCPP_INLINE_VISIBILITY const_reference front() const
673 {
674 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
675 return *this->__begin_;
676 }
677 _LIBCPP_INLINE_VISIBILITY reference back()
678 {
679 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
680 return *(this->__end_ - 1);
681 }
682 _LIBCPP_INLINE_VISIBILITY const_reference back() const
683 {
684 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
685 return *(this->__end_ - 1);
686 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000687
Howard Hinnant1c936782011-06-03 19:40:40 +0000688 _LIBCPP_INLINE_VISIBILITY
689 value_type* data() _NOEXCEPT
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000690 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnant1c936782011-06-03 19:40:40 +0000691 _LIBCPP_INLINE_VISIBILITY
692 const value_type* data() const _NOEXCEPT
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000693 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000694
Eric Fiselier96919722017-10-17 13:03:17 +0000695#ifdef _LIBCPP_CXX03_LANG
696 _LIBCPP_INLINE_VISIBILITY
697 void __emplace_back(const value_type& __x) { push_back(__x); }
698#else
699 template <class _Arg>
700 _LIBCPP_INLINE_VISIBILITY
701 void __emplace_back(_Arg&& __arg) {
702 emplace_back(_VSTD::forward<_Arg>(__arg));
703 }
704#endif
705
Howard Hinnantcf823322010-12-17 14:46:43 +0000706 _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000707
708#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd2cab2f2012-02-15 00:41:34 +0000709 _LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000710
Howard Hinnantc51e1022010-05-11 19:42:16 +0000711 template <class... _Args>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000712 _LIBCPP_INLINE_VISIBILITY
Marshall Clowea52cc42017-01-24 23:09:12 +0000713#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +0000714 reference emplace_back(_Args&&... __args);
Marshall Clowea52cc42017-01-24 23:09:12 +0000715#else
716 void emplace_back(_Args&&... __args);
717#endif
Eric Fiseliered9e9362017-04-16 02:40:45 +0000718#endif // !_LIBCPP_CXX03_LANG
719
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000720 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000721 void pop_back();
722
723 iterator insert(const_iterator __position, const_reference __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000724
725#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000726 iterator insert(const_iterator __position, value_type&& __x);
727 template <class... _Args>
728 iterator emplace(const_iterator __position, _Args&&... __args);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000729#endif // !_LIBCPP_CXX03_LANG
730
Howard Hinnantc51e1022010-05-11 19:42:16 +0000731 iterator insert(const_iterator __position, size_type __n, const_reference __x);
732 template <class _InputIterator>
733 typename enable_if
734 <
735 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +0000736 !__is_forward_iterator<_InputIterator>::value &&
737 is_constructible<
738 value_type,
739 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000740 iterator
741 >::type
742 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
743 template <class _ForwardIterator>
744 typename enable_if
745 <
Howard Hinnant88010252013-03-28 17:44:32 +0000746 __is_forward_iterator<_ForwardIterator>::value &&
747 is_constructible<
748 value_type,
749 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +0000750 iterator
751 >::type
752 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Eric Fiseliered9e9362017-04-16 02:40:45 +0000753
754#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000755 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000756 iterator insert(const_iterator __position, initializer_list<value_type> __il)
757 {return insert(__position, __il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +0000758#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000759
Howard Hinnantcf823322010-12-17 14:46:43 +0000760 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000761 iterator erase(const_iterator __first, const_iterator __last);
762
Howard Hinnant1c936782011-06-03 19:40:40 +0000763 _LIBCPP_INLINE_VISIBILITY
764 void clear() _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000765 {
Marshall Clow2cd9d372014-05-08 14:14:06 +0000766 size_type __old_size = size();
Howard Hinnant27e0e772011-09-14 18:33:51 +0000767 __base::clear();
Marshall Clow2cd9d372014-05-08 14:14:06 +0000768 __annotate_shrink(__old_size);
Howard Hinnant27e0e772011-09-14 18:33:51 +0000769 __invalidate_all_iterators();
770 }
Howard Hinnantc51e1022010-05-11 19:42:16 +0000771
772 void resize(size_type __sz);
773 void resize(size_type __sz, const_reference __x);
774
Howard Hinnant1c936782011-06-03 19:40:40 +0000775 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000776#if _LIBCPP_STD_VER >= 14
Eric Fiselier69c51982016-12-28 06:06:09 +0000777 _NOEXCEPT_DEBUG;
Marshall Clow8982dcd2015-07-13 20:04:56 +0000778#else
Eric Fiselier69c51982016-12-28 06:06:09 +0000779 _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +0000780 __is_nothrow_swappable<allocator_type>::value);
781#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000782
783 bool __invariants() const;
784
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000785#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000786
787 bool __dereferenceable(const const_iterator* __i) const;
788 bool __decrementable(const const_iterator* __i) const;
789 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
790 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
791
Howard Hinnanta47c6d52011-09-16 17:29:17 +0000792#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +0000793
Howard Hinnantc51e1022010-05-11 19:42:16 +0000794private:
Howard Hinnantcf823322010-12-17 14:46:43 +0000795 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Eric Fiselier69c51982016-12-28 06:06:09 +0000796 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(pointer __new_last);
Marshall Clow3ff48e02018-05-22 16:20:28 +0000797 void __vallocate(size_type __n);
798 void __vdeallocate() _NOEXCEPT;
Howard Hinnantcf823322010-12-17 14:46:43 +0000799 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
Howard Hinnanta5589382011-01-04 19:53:31 +0000800 void __construct_at_end(size_type __n);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000801 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000802 void __construct_at_end(size_type __n, const_reference __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000803 template <class _ForwardIterator>
804 typename enable_if
805 <
806 __is_forward_iterator<_ForwardIterator>::value,
807 void
808 >::type
Eric Fiselieracfe6f02015-03-31 16:54:19 +0000809 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000810 void __append(size_type __n);
811 void __append(size_type __n, const_reference __x);
Howard Hinnantcf823322010-12-17 14:46:43 +0000812 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000813 iterator __make_iter(pointer __p) _NOEXCEPT;
Howard Hinnantcf823322010-12-17 14:46:43 +0000814 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +0000815 const_iterator __make_iter(const_pointer __p) const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000816 void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v);
817 pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p);
818 void __move_range(pointer __from_s, pointer __from_e, pointer __to);
Howard Hinnant1c936782011-06-03 19:40:40 +0000819 void __move_assign(vector& __c, true_type)
820 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Marshall Clow2fe8a8d2015-08-18 18:57:00 +0000821 void __move_assign(vector& __c, false_type)
822 _NOEXCEPT_(__alloc_traits::is_always_equal::value);
Howard Hinnant27e0e772011-09-14 18:33:51 +0000823 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant76053d72013-06-27 19:35:32 +0000824 void __destruct_at_end(pointer __new_last) _NOEXCEPT
Howard Hinnant27e0e772011-09-14 18:33:51 +0000825 {
Eric Fiselier69c51982016-12-28 06:06:09 +0000826 __invalidate_iterators_past(__new_last);
Marshall Clow2cd9d372014-05-08 14:14:06 +0000827 size_type __old_size = size();
Howard Hinnant27e0e772011-09-14 18:33:51 +0000828 __base::__destruct_at_end(__new_last);
Marshall Clow2cd9d372014-05-08 14:14:06 +0000829 __annotate_shrink(__old_size);
Howard Hinnant27e0e772011-09-14 18:33:51 +0000830 }
Eric Fiseliered9e9362017-04-16 02:40:45 +0000831
832#ifndef _LIBCPP_CXX03_LANG
833 template <class _Up> void __push_back_slow_path(_Up&& __x);
834
Howard Hinnantb6c49562012-02-26 15:30:12 +0000835 template <class... _Args>
Eric Fiseliered9e9362017-04-16 02:40:45 +0000836 void __emplace_back_slow_path(_Args&&... __args);
837#else
838 template <class _Up> void __push_back_slow_path(_Up& __x);
Howard Hinnantb6c49562012-02-26 15:30:12 +0000839#endif
Eric Fiseliered9e9362017-04-16 02:40:45 +0000840
Marshall Clow2cd9d372014-05-08 14:14:06 +0000841 // The following functions are no-ops outside of AddressSanitizer mode.
842 // We call annotatations only for the default Allocator because other allocators
843 // may not meet the AddressSanitizer alignment constraints.
844 // See the documentation for __sanitizer_annotate_contiguous_container for more details.
Marshall Clow2cd9d372014-05-08 14:14:06 +0000845#ifndef _LIBCPP_HAS_NO_ASAN
Eric Fiselier6003c772016-12-23 23:37:52 +0000846 void __annotate_contiguous_container(const void *__beg, const void *__end,
847 const void *__old_mid,
848 const void *__new_mid) const
849 {
850
Marshall Clow2cd9d372014-05-08 14:14:06 +0000851 if (__beg && is_same<allocator_type, __default_allocator_type>::value)
852 __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid);
Marshall Clow2cd9d372014-05-08 14:14:06 +0000853 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000854#else
855 _LIBCPP_INLINE_VISIBILITY
856 void __annotate_contiguous_container(const void*, const void*, const void*,
857 const void*) const {}
858#endif
859 _LIBCPP_INLINE_VISIBILITY
860 void __annotate_new(size_type __current_size) const {
Marshall Clow2cd9d372014-05-08 14:14:06 +0000861 __annotate_contiguous_container(data(), data() + capacity(),
862 data() + capacity(), data() + __current_size);
863 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000864
865 _LIBCPP_INLINE_VISIBILITY
866 void __annotate_delete() const {
Marshall Clow2cd9d372014-05-08 14:14:06 +0000867 __annotate_contiguous_container(data(), data() + capacity(),
868 data() + size(), data() + capacity());
869 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000870
871 _LIBCPP_INLINE_VISIBILITY
Kostya Serebryany4963c252014-09-02 23:43:38 +0000872 void __annotate_increase(size_type __n) const
Marshall Clow2cd9d372014-05-08 14:14:06 +0000873 {
874 __annotate_contiguous_container(data(), data() + capacity(),
875 data() + size(), data() + size() + __n);
876 }
Eric Fiselier6003c772016-12-23 23:37:52 +0000877
878 _LIBCPP_INLINE_VISIBILITY
Kostya Serebryany4963c252014-09-02 23:43:38 +0000879 void __annotate_shrink(size_type __old_size) const
Marshall Clow2cd9d372014-05-08 14:14:06 +0000880 {
881 __annotate_contiguous_container(data(), data() + capacity(),
882 data() + __old_size, data() + size());
883 }
Marshall Clowc78ffa52014-09-03 21:37:43 +0000884#ifndef _LIBCPP_HAS_NO_ASAN
Kostya Serebryany4963c252014-09-02 23:43:38 +0000885 // The annotation for size increase should happen before the actual increase,
886 // but if an exception is thrown after that the annotation has to be undone.
887 struct __RAII_IncreaseAnnotator {
888 __RAII_IncreaseAnnotator(const vector &__v, size_type __n = 1)
Eric Fiseliera7c043e2015-03-10 00:25:20 +0000889 : __commit(false), __v(__v), __old_size(__v.size() + __n) {
Kostya Serebryany4963c252014-09-02 23:43:38 +0000890 __v.__annotate_increase(__n);
891 }
892 void __done() { __commit = true; }
893 ~__RAII_IncreaseAnnotator() {
894 if (__commit) return;
Eric Fiseliera7c043e2015-03-10 00:25:20 +0000895 __v.__annotate_shrink(__old_size);
Kostya Serebryany4963c252014-09-02 23:43:38 +0000896 }
897 bool __commit;
Kostya Serebryany4963c252014-09-02 23:43:38 +0000898 const vector &__v;
Eric Fiseliera7c043e2015-03-10 00:25:20 +0000899 size_type __old_size;
Kostya Serebryany4963c252014-09-02 23:43:38 +0000900 };
Marshall Clowc78ffa52014-09-03 21:37:43 +0000901#else
902 struct __RAII_IncreaseAnnotator {
Eric Fiselier6003c772016-12-23 23:37:52 +0000903 _LIBCPP_INLINE_VISIBILITY
904 __RAII_IncreaseAnnotator(const vector &, size_type = 1) {}
905 _LIBCPP_INLINE_VISIBILITY void __done() {}
Marshall Clowc78ffa52014-09-03 21:37:43 +0000906 };
907#endif
908
Howard Hinnantc51e1022010-05-11 19:42:16 +0000909};
910
Marshall Clowf0ca1492018-05-21 21:30:12 +0000911#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
912template<class _InputIterator,
913 class _Alloc = typename std::allocator<typename iterator_traits<_InputIterator>::value_type>,
914 class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
915 >
916vector(_InputIterator, _InputIterator)
917 -> vector<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
918
919template<class _InputIterator,
920 class _Alloc,
921 class = typename enable_if<__is_allocator<_Alloc>::value, void>::type
922 >
923vector(_InputIterator, _InputIterator, _Alloc)
924 -> vector<typename iterator_traits<_InputIterator>::value_type, _Alloc>;
925#endif
926
Howard Hinnantc51e1022010-05-11 19:42:16 +0000927template <class _Tp, class _Allocator>
928void
929vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)
930{
Marshall Clow2cd9d372014-05-08 14:14:06 +0000931 __annotate_delete();
Howard Hinnantd2cab2f2012-02-15 00:41:34 +0000932 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000933 _VSTD::swap(this->__begin_, __v.__begin_);
934 _VSTD::swap(this->__end_, __v.__end_);
935 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000936 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000937 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000938 __invalidate_all_iterators();
939}
940
941template <class _Tp, class _Allocator>
942typename vector<_Tp, _Allocator>::pointer
943vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
944{
Marshall Clow2cd9d372014-05-08 14:14:06 +0000945 __annotate_delete();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000946 pointer __r = __v.__begin_;
Howard Hinnantd2cab2f2012-02-15 00:41:34 +0000947 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, __p, __v.__begin_);
948 __alloc_traits::__construct_forward(this->__alloc(), __p, this->__end_, __v.__end_);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000949 _VSTD::swap(this->__begin_, __v.__begin_);
950 _VSTD::swap(this->__end_, __v.__end_);
951 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000952 __v.__first_ = __v.__begin_;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000953 __annotate_new(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000954 __invalidate_all_iterators();
955 return __r;
956}
957
958// Allocate space for __n objects
959// throws length_error if __n > max_size()
960// throws (probably bad_alloc) if memory run out
961// Precondition: __begin_ == __end_ == __end_cap() == 0
962// Precondition: __n > 0
963// Postcondition: capacity() == __n
964// Postcondition: size() == 0
965template <class _Tp, class _Allocator>
966void
Marshall Clow3ff48e02018-05-22 16:20:28 +0000967vector<_Tp, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000968{
969 if (__n > max_size())
970 this->__throw_length_error();
971 this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
972 this->__end_cap() = this->__begin_ + __n;
Marshall Clow2cd9d372014-05-08 14:14:06 +0000973 __annotate_new(0);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000974}
975
976template <class _Tp, class _Allocator>
977void
Marshall Clow3ff48e02018-05-22 16:20:28 +0000978vector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000979{
Howard Hinnant76053d72013-06-27 19:35:32 +0000980 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000981 {
982 clear();
983 __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
Howard Hinnant76053d72013-06-27 19:35:32 +0000984 this->__begin_ = this->__end_ = this->__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000985 }
986}
987
988template <class _Tp, class _Allocator>
989typename vector<_Tp, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +0000990vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000991{
Eric Fiselierb5d9f442016-11-23 01:18:56 +0000992 return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()),
993 numeric_limits<difference_type>::max());
Howard Hinnantc51e1022010-05-11 19:42:16 +0000994}
995
996// Precondition: __new_size > capacity()
997template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +0000998inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000999typename vector<_Tp, _Allocator>::size_type
1000vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
1001{
1002 const size_type __ms = max_size();
1003 if (__new_size > __ms)
1004 this->__throw_length_error();
1005 const size_type __cap = capacity();
1006 if (__cap >= __ms / 2)
1007 return __ms;
Alexis Hunt991d29b2011-07-29 23:31:58 +00001008 return _VSTD::max<size_type>(2*__cap, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001009}
1010
1011// Default constructs __n objects starting at __end_
1012// throws if construction throws
1013// Precondition: __n > 0
1014// Precondition: size() + __n <= capacity()
1015// Postcondition: size() == size() + __n
1016template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001017void
1018vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
1019{
Howard Hinnantc51e1022010-05-11 19:42:16 +00001020 allocator_type& __a = this->__alloc();
1021 do
1022 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001023 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001024 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001025 ++this->__end_;
1026 --__n;
Kostya Serebryany4963c252014-09-02 23:43:38 +00001027 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001028 } while (__n > 0);
1029}
1030
Howard Hinnantc51e1022010-05-11 19:42:16 +00001031// Copy constructs __n objects starting at __end_ from __x
1032// throws if construction throws
1033// Precondition: __n > 0
1034// Precondition: size() + __n <= capacity()
1035// Postcondition: size() == old size() + __n
1036// Postcondition: [i] == __x for all i in [size() - __n, __n)
1037template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001038inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001039void
1040vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
1041{
Howard Hinnantc51e1022010-05-11 19:42:16 +00001042 allocator_type& __a = this->__alloc();
1043 do
1044 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001045 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001046 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001047 ++this->__end_;
1048 --__n;
Kostya Serebryany4963c252014-09-02 23:43:38 +00001049 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001050 } while (__n > 0);
1051}
1052
1053template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001054template <class _ForwardIterator>
1055typename enable_if
1056<
1057 __is_forward_iterator<_ForwardIterator>::value,
1058 void
1059>::type
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001060vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001061{
1062 allocator_type& __a = this->__alloc();
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001063 __RAII_IncreaseAnnotator __annotator(*this, __n);
1064 __alloc_traits::__construct_range_forward(__a, __first, __last, this->__end_);
1065 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001066}
1067
1068// Default constructs __n objects starting at __end_
1069// throws if construction throws
1070// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001071// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001072template <class _Tp, class _Allocator>
1073void
1074vector<_Tp, _Allocator>::__append(size_type __n)
1075{
1076 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1077 this->__construct_at_end(__n);
1078 else
1079 {
1080 allocator_type& __a = this->__alloc();
1081 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1082 __v.__construct_at_end(__n);
1083 __swap_out_circular_buffer(__v);
1084 }
1085}
1086
1087// Default constructs __n objects starting at __end_
1088// throws if construction throws
1089// Postcondition: size() == size() + __n
Howard Hinnant1c936782011-06-03 19:40:40 +00001090// Exception safety: strong.
Howard Hinnantc51e1022010-05-11 19:42:16 +00001091template <class _Tp, class _Allocator>
1092void
1093vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
1094{
1095 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1096 this->__construct_at_end(__n, __x);
1097 else
1098 {
1099 allocator_type& __a = this->__alloc();
1100 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1101 __v.__construct_at_end(__n, __x);
1102 __swap_out_circular_buffer(__v);
1103 }
1104}
1105
1106template <class _Tp, class _Allocator>
1107vector<_Tp, _Allocator>::vector(size_type __n)
1108{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001109#if _LIBCPP_DEBUG_LEVEL >= 2
1110 __get_db()->__insert_c(this);
1111#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001112 if (__n > 0)
1113 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001114 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001115 __construct_at_end(__n);
1116 }
1117}
1118
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001119#if _LIBCPP_STD_VER > 11
1120template <class _Tp, class _Allocator>
1121vector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a)
1122 : __base(__a)
1123{
1124#if _LIBCPP_DEBUG_LEVEL >= 2
1125 __get_db()->__insert_c(this);
1126#endif
1127 if (__n > 0)
1128 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001129 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00001130 __construct_at_end(__n);
1131 }
1132}
1133#endif
1134
Howard Hinnantc51e1022010-05-11 19:42:16 +00001135template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001136vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001137{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001138#if _LIBCPP_DEBUG_LEVEL >= 2
1139 __get_db()->__insert_c(this);
1140#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001141 if (__n > 0)
1142 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001143 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001144 __construct_at_end(__n, __x);
1145 }
1146}
1147
1148template <class _Tp, class _Allocator>
Marshall Clowf0ca1492018-05-21 21:30:12 +00001149vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001150 : __base(__a)
1151{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001152#if _LIBCPP_DEBUG_LEVEL >= 2
1153 __get_db()->__insert_c(this);
1154#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001155 if (__n > 0)
1156 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001157 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001158 __construct_at_end(__n, __x);
1159 }
1160}
1161
1162template <class _Tp, class _Allocator>
1163template <class _InputIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001164vector<_Tp, _Allocator>::vector(_InputIterator __first,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001165 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001166 !__is_forward_iterator<_InputIterator>::value &&
1167 is_constructible<
1168 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001169 typename iterator_traits<_InputIterator>::reference>::value,
1170 _InputIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001171{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001172#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001173 __get_db()->__insert_c(this);
1174#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001175 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001176 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001177}
1178
1179template <class _Tp, class _Allocator>
1180template <class _InputIterator>
1181vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
1182 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001183 !__is_forward_iterator<_InputIterator>::value &&
1184 is_constructible<
1185 value_type,
1186 typename iterator_traits<_InputIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001187 : __base(__a)
1188{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001189#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001190 __get_db()->__insert_c(this);
1191#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001192 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001193 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001194}
1195
1196template <class _Tp, class _Allocator>
1197template <class _ForwardIterator>
Howard Hinnant66fce262013-09-21 21:13:54 +00001198vector<_Tp, _Allocator>::vector(_ForwardIterator __first,
Howard Hinnant88010252013-03-28 17:44:32 +00001199 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1200 is_constructible<
1201 value_type,
Howard Hinnant66fce262013-09-21 21:13:54 +00001202 typename iterator_traits<_ForwardIterator>::reference>::value,
1203 _ForwardIterator>::type __last)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001204{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001205#if _LIBCPP_DEBUG_LEVEL >= 2
1206 __get_db()->__insert_c(this);
1207#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001208 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001209 if (__n > 0)
1210 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001211 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001212 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001213 }
1214}
1215
1216template <class _Tp, class _Allocator>
1217template <class _ForwardIterator>
1218vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant88010252013-03-28 17:44:32 +00001219 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1220 is_constructible<
1221 value_type,
1222 typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001223 : __base(__a)
1224{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001225#if _LIBCPP_DEBUG_LEVEL >= 2
1226 __get_db()->__insert_c(this);
1227#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001228 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001229 if (__n > 0)
1230 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001231 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001232 __construct_at_end(__first, __last, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001233 }
1234}
1235
1236template <class _Tp, class _Allocator>
1237vector<_Tp, _Allocator>::vector(const vector& __x)
1238 : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
1239{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001240#if _LIBCPP_DEBUG_LEVEL >= 2
1241 __get_db()->__insert_c(this);
1242#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001243 size_type __n = __x.size();
1244 if (__n > 0)
1245 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001246 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001247 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001248 }
1249}
1250
1251template <class _Tp, class _Allocator>
1252vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a)
1253 : __base(__a)
1254{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001255#if _LIBCPP_DEBUG_LEVEL >= 2
1256 __get_db()->__insert_c(this);
1257#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001258 size_type __n = __x.size();
1259 if (__n > 0)
1260 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001261 __vallocate(__n);
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001262 __construct_at_end(__x.__begin_, __x.__end_, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001263 }
1264}
1265
Eric Fiseliered9e9362017-04-16 02:40:45 +00001266#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001267
1268template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001269inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001270vector<_Tp, _Allocator>::vector(vector&& __x)
Marshall Clowe5108202015-07-14 14:46:32 +00001271#if _LIBCPP_STD_VER > 14
1272 _NOEXCEPT
1273#else
Howard Hinnant1c936782011-06-03 19:40:40 +00001274 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00001275#endif
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001276 : __base(_VSTD::move(__x.__alloc()))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001277{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001278#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001279 __get_db()->__insert_c(this);
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001280 __get_db()->swap(this, &__x);
Howard Hinnant27e0e772011-09-14 18:33:51 +00001281#endif
Howard Hinnant9cd22302011-09-16 18:41:29 +00001282 this->__begin_ = __x.__begin_;
1283 this->__end_ = __x.__end_;
1284 this->__end_cap() = __x.__end_cap();
Howard Hinnant76053d72013-06-27 19:35:32 +00001285 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001286}
1287
1288template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001289inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001290vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a)
1291 : __base(__a)
1292{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001293#if _LIBCPP_DEBUG_LEVEL >= 2
1294 __get_db()->__insert_c(this);
1295#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001296 if (__a == __x.__alloc())
1297 {
1298 this->__begin_ = __x.__begin_;
1299 this->__end_ = __x.__end_;
1300 this->__end_cap() = __x.__end_cap();
1301 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001302#if _LIBCPP_DEBUG_LEVEL >= 2
1303 __get_db()->swap(this, &__x);
1304#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001305 }
1306 else
1307 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001308 typedef move_iterator<iterator> _Ip;
1309 assign(_Ip(__x.begin()), _Ip(__x.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001310 }
1311}
1312
1313template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001314inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001315vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
1316{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001317#if _LIBCPP_DEBUG_LEVEL >= 2
1318 __get_db()->__insert_c(this);
1319#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001320 if (__il.size() > 0)
1321 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001322 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001323 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001324 }
1325}
1326
1327template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001328inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001329vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
1330 : __base(__a)
1331{
Howard Hinnant9cd22302011-09-16 18:41:29 +00001332#if _LIBCPP_DEBUG_LEVEL >= 2
1333 __get_db()->__insert_c(this);
1334#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001335 if (__il.size() > 0)
1336 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001337 __vallocate(__il.size());
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001338 __construct_at_end(__il.begin(), __il.end(), __il.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001339 }
1340}
1341
1342template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001343inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001344vector<_Tp, _Allocator>&
1345vector<_Tp, _Allocator>::operator=(vector&& __x)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001346 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001347{
1348 __move_assign(__x, integral_constant<bool,
1349 __alloc_traits::propagate_on_container_move_assignment::value>());
1350 return *this;
1351}
1352
1353template <class _Tp, class _Allocator>
1354void
1355vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00001356 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001357{
1358 if (__base::__alloc() != __c.__alloc())
1359 {
Howard Hinnantc834c512011-11-29 18:15:50 +00001360 typedef move_iterator<iterator> _Ip;
1361 assign(_Ip(__c.begin()), _Ip(__c.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001362 }
1363 else
1364 __move_assign(__c, true_type());
1365}
1366
1367template <class _Tp, class _Allocator>
1368void
1369vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00001370 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001371{
Marshall Clow3ff48e02018-05-22 16:20:28 +00001372 __vdeallocate();
Marshall Clow136d45c2014-07-21 15:11:13 +00001373 __base::__move_assign_alloc(__c); // this can throw
Howard Hinnantc51e1022010-05-11 19:42:16 +00001374 this->__begin_ = __c.__begin_;
1375 this->__end_ = __c.__end_;
1376 this->__end_cap() = __c.__end_cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001377 __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
Howard Hinnanta1e60cd2011-09-19 16:34:29 +00001378#if _LIBCPP_DEBUG_LEVEL >= 2
1379 __get_db()->swap(this, &__c);
1380#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001381}
1382
Eric Fiseliered9e9362017-04-16 02:40:45 +00001383#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001384
1385template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001386inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001387vector<_Tp, _Allocator>&
1388vector<_Tp, _Allocator>::operator=(const vector& __x)
1389{
1390 if (this != &__x)
1391 {
1392 __base::__copy_assign_alloc(__x);
1393 assign(__x.__begin_, __x.__end_);
1394 }
1395 return *this;
1396}
1397
1398template <class _Tp, class _Allocator>
1399template <class _InputIterator>
1400typename enable_if
1401<
1402 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001403 !__is_forward_iterator<_InputIterator>::value &&
1404 is_constructible<
1405 _Tp,
1406 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001407 void
1408>::type
1409vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1410{
1411 clear();
1412 for (; __first != __last; ++__first)
Eric Fiselier96919722017-10-17 13:03:17 +00001413 __emplace_back(*__first);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001414}
1415
1416template <class _Tp, class _Allocator>
1417template <class _ForwardIterator>
1418typename enable_if
1419<
Howard Hinnant88010252013-03-28 17:44:32 +00001420 __is_forward_iterator<_ForwardIterator>::value &&
1421 is_constructible<
1422 _Tp,
1423 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001424 void
1425>::type
1426vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
1427{
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001428 size_type __new_size = static_cast<size_type>(_VSTD::distance(__first, __last));
1429 if (__new_size <= capacity())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001430 {
1431 _ForwardIterator __mid = __last;
1432 bool __growing = false;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001433 if (__new_size > size())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001434 {
1435 __growing = true;
1436 __mid = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001437 _VSTD::advance(__mid, size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001438 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001439 pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001440 if (__growing)
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001441 __construct_at_end(__mid, __last, __new_size - size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001442 else
1443 this->__destruct_at_end(__m);
1444 }
1445 else
1446 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001447 __vdeallocate();
1448 __vallocate(__recommend(__new_size));
Eric Fiselieracfe6f02015-03-31 16:54:19 +00001449 __construct_at_end(__first, __last, __new_size);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001450 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001451 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001452}
1453
1454template <class _Tp, class _Allocator>
1455void
1456vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
1457{
1458 if (__n <= capacity())
1459 {
1460 size_type __s = size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001461 _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001462 if (__n > __s)
1463 __construct_at_end(__n - __s, __u);
1464 else
Howard Hinnant155c2af2010-05-24 17:49:41 +00001465 this->__destruct_at_end(this->__begin_ + __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001466 }
1467 else
1468 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00001469 __vdeallocate();
1470 __vallocate(__recommend(static_cast<size_type>(__n)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001471 __construct_at_end(__n, __u);
1472 }
Eric Fiselier69c51982016-12-28 06:06:09 +00001473 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001474}
1475
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001476template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001477inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001478typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001479vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001480{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001481#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001482 return iterator(this, __p);
1483#else
1484 return iterator(__p);
1485#endif
1486}
1487
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001488template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001489inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001490typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001491vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001492{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001493#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00001494 return const_iterator(this, __p);
1495#else
1496 return const_iterator(__p);
1497#endif
1498}
1499
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001500template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001501inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001502typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001503vector<_Tp, _Allocator>::begin() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001504{
1505 return __make_iter(this->__begin_);
1506}
1507
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001508template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001509inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001510typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001511vector<_Tp, _Allocator>::begin() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001512{
1513 return __make_iter(this->__begin_);
1514}
1515
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001516template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001517inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001518typename vector<_Tp, _Allocator>::iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001519vector<_Tp, _Allocator>::end() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001520{
1521 return __make_iter(this->__end_);
1522}
1523
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001524template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001525inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001526typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnant1c936782011-06-03 19:40:40 +00001527vector<_Tp, _Allocator>::end() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001528{
1529 return __make_iter(this->__end_);
1530}
1531
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001532template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001533inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001534typename vector<_Tp, _Allocator>::reference
1535vector<_Tp, _Allocator>::operator[](size_type __n)
1536{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001537 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001538 return this->__begin_[__n];
1539}
1540
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001541template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001542inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001543typename vector<_Tp, _Allocator>::const_reference
1544vector<_Tp, _Allocator>::operator[](size_type __n) const
1545{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001546 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547 return this->__begin_[__n];
1548}
1549
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001550template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001551typename vector<_Tp, _Allocator>::reference
1552vector<_Tp, _Allocator>::at(size_type __n)
1553{
1554 if (__n >= size())
1555 this->__throw_out_of_range();
1556 return this->__begin_[__n];
1557}
1558
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001559template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001560typename vector<_Tp, _Allocator>::const_reference
1561vector<_Tp, _Allocator>::at(size_type __n) const
1562{
1563 if (__n >= size())
1564 this->__throw_out_of_range();
1565 return this->__begin_[__n];
1566}
1567
1568template <class _Tp, class _Allocator>
1569void
1570vector<_Tp, _Allocator>::reserve(size_type __n)
1571{
1572 if (__n > capacity())
1573 {
1574 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001575 __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001576 __swap_out_circular_buffer(__v);
1577 }
1578}
1579
1580template <class _Tp, class _Allocator>
1581void
Howard Hinnant1c936782011-06-03 19:40:40 +00001582vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00001583{
1584 if (capacity() > size())
1585 {
1586#ifndef _LIBCPP_NO_EXCEPTIONS
1587 try
1588 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001589#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001590 allocator_type& __a = this->__alloc();
Howard Hinnant1c936782011-06-03 19:40:40 +00001591 __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001592 __swap_out_circular_buffer(__v);
1593#ifndef _LIBCPP_NO_EXCEPTIONS
1594 }
1595 catch (...)
1596 {
1597 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001598#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001599 }
1600}
1601
1602template <class _Tp, class _Allocator>
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001603template <class _Up>
1604void
Eric Fiseliered9e9362017-04-16 02:40:45 +00001605#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001606vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
1607#else
1608vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
1609#endif
1610{
1611 allocator_type& __a = this->__alloc();
1612 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1613 // __v.push_back(_VSTD::forward<_Up>(__x));
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001614 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Up>(__x));
1615 __v.__end_++;
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001616 __swap_out_circular_buffer(__v);
1617}
1618
1619template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001620inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001621void
1622vector<_Tp, _Allocator>::push_back(const_reference __x)
1623{
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001624 if (this->__end_ != this->__end_cap())
Howard Hinnantc51e1022010-05-11 19:42:16 +00001625 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001626 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001627 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001628 _VSTD::__to_raw_pointer(this->__end_), __x);
Kostya Serebryany4963c252014-09-02 23:43:38 +00001629 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001630 ++this->__end_;
1631 }
1632 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001633 __push_back_slow_path(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001634}
1635
Eric Fiseliered9e9362017-04-16 02:40:45 +00001636#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001637
1638template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001639inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001640void
1641vector<_Tp, _Allocator>::push_back(value_type&& __x)
1642{
1643 if (this->__end_ < this->__end_cap())
1644 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001645 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001646 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001647 _VSTD::__to_raw_pointer(this->__end_),
1648 _VSTD::move(__x));
Kostya Serebryany4963c252014-09-02 23:43:38 +00001649 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001650 ++this->__end_;
1651 }
1652 else
Howard Hinnantd2cab2f2012-02-15 00:41:34 +00001653 __push_back_slow_path(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001654}
1655
1656template <class _Tp, class _Allocator>
1657template <class... _Args>
1658void
Howard Hinnantb6c49562012-02-26 15:30:12 +00001659vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1660{
1661 allocator_type& __a = this->__alloc();
1662 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1663// __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnant5adee4c2013-01-11 20:36:59 +00001664 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Args>(__args)...);
1665 __v.__end_++;
Howard Hinnantb6c49562012-02-26 15:30:12 +00001666 __swap_out_circular_buffer(__v);
1667}
1668
1669template <class _Tp, class _Allocator>
1670template <class... _Args>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001671inline
Marshall Clowea52cc42017-01-24 23:09:12 +00001672#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001673typename vector<_Tp, _Allocator>::reference
Marshall Clowea52cc42017-01-24 23:09:12 +00001674#else
1675void
1676#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001677vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1678{
1679 if (this->__end_ < this->__end_cap())
1680 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001681 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001682 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001683 _VSTD::__to_raw_pointer(this->__end_),
1684 _VSTD::forward<_Args>(__args)...);
Kostya Serebryany4963c252014-09-02 23:43:38 +00001685 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001686 ++this->__end_;
1687 }
1688 else
Howard Hinnantb6c49562012-02-26 15:30:12 +00001689 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
Marshall Clowea52cc42017-01-24 23:09:12 +00001690#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00001691 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00001692#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001693}
1694
Eric Fiseliered9e9362017-04-16 02:40:45 +00001695#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001696
1697template <class _Tp, class _Allocator>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001698inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001699void
1700vector<_Tp, _Allocator>::pop_back()
1701{
Howard Hinnant27e0e772011-09-14 18:33:51 +00001702 _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001703 this->__destruct_at_end(this->__end_ - 1);
1704}
1705
1706template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00001707inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001708typename vector<_Tp, _Allocator>::iterator
1709vector<_Tp, _Allocator>::erase(const_iterator __position)
1710{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001711#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001712 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1713 "vector::erase(iterator) called with an iterator not"
1714 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001715#endif
Howard Hinnant58d52d52013-03-25 22:12:26 +00001716 _LIBCPP_ASSERT(__position != end(),
1717 "vector::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnant76053d72013-06-27 19:35:32 +00001718 difference_type __ps = __position - cbegin();
1719 pointer __p = this->__begin_ + __ps;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001720 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001721 this->__invalidate_iterators_past(__p-1);
1722 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001723 return __r;
1724}
1725
1726template <class _Tp, class _Allocator>
1727typename vector<_Tp, _Allocator>::iterator
1728vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1729{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001730#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001731 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
1732 "vector::erase(iterator, iterator) called with an iterator not"
1733 " referring to this vector");
Eric Fiselier69c51982016-12-28 06:06:09 +00001734 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this,
1735 "vector::erase(iterator, iterator) called with an iterator not"
1736 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001737#endif
Howard Hinnant27e0e772011-09-14 18:33:51 +00001738 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
Howard Hinnantc51e1022010-05-11 19:42:16 +00001739 pointer __p = this->__begin_ + (__first - begin());
Eric Fiselier69c51982016-12-28 06:06:09 +00001740 if (__first != __last) {
Howard Hinnantc580cc32013-04-18 15:02:57 +00001741 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
Eric Fiselier69c51982016-12-28 06:06:09 +00001742 this->__invalidate_iterators_past(__p - 1);
1743 }
1744 iterator __r = __make_iter(__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001745 return __r;
1746}
1747
1748template <class _Tp, class _Allocator>
1749void
1750vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1751{
1752 pointer __old_last = this->__end_;
1753 difference_type __n = __old_last - __to;
1754 for (pointer __i = __from_s + __n; __i < __from_e; ++__i, ++this->__end_)
1755 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001756 _VSTD::__to_raw_pointer(this->__end_),
1757 _VSTD::move(*__i));
1758 _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001759}
1760
1761template <class _Tp, class _Allocator>
1762typename vector<_Tp, _Allocator>::iterator
1763vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1764{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001765#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001766 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1767 "vector::insert(iterator, x) called with an iterator not"
1768 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001769#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001770 pointer __p = this->__begin_ + (__position - begin());
1771 if (this->__end_ < this->__end_cap())
1772 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001773 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001774 if (__p == this->__end_)
1775 {
1776 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001777 _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001778 ++this->__end_;
1779 }
1780 else
1781 {
1782 __move_range(__p, this->__end_, __p + 1);
1783 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1784 if (__p <= __xr && __xr < this->__end_)
1785 ++__xr;
1786 *__p = *__xr;
1787 }
Kostya Serebryany4963c252014-09-02 23:43:38 +00001788 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001789 }
1790 else
1791 {
1792 allocator_type& __a = this->__alloc();
1793 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1794 __v.push_back(__x);
1795 __p = __swap_out_circular_buffer(__v, __p);
1796 }
1797 return __make_iter(__p);
1798}
1799
Eric Fiseliered9e9362017-04-16 02:40:45 +00001800#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001801
1802template <class _Tp, class _Allocator>
1803typename vector<_Tp, _Allocator>::iterator
1804vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1805{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001806#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001807 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1808 "vector::insert(iterator, x) called with an iterator not"
1809 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001810#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001811 pointer __p = this->__begin_ + (__position - begin());
1812 if (this->__end_ < this->__end_cap())
1813 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001814 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001815 if (__p == this->__end_)
1816 {
1817 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001818 _VSTD::__to_raw_pointer(this->__end_),
1819 _VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001820 ++this->__end_;
1821 }
1822 else
1823 {
1824 __move_range(__p, this->__end_, __p + 1);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001825 *__p = _VSTD::move(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001826 }
Kostya Serebryany4963c252014-09-02 23:43:38 +00001827 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001828 }
1829 else
1830 {
1831 allocator_type& __a = this->__alloc();
1832 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001833 __v.push_back(_VSTD::move(__x));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001834 __p = __swap_out_circular_buffer(__v, __p);
1835 }
1836 return __make_iter(__p);
1837}
1838
1839template <class _Tp, class _Allocator>
1840template <class... _Args>
1841typename vector<_Tp, _Allocator>::iterator
1842vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1843{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001844#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001845 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1846 "vector::emplace(iterator, x) called with an iterator not"
1847 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001848#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001849 pointer __p = this->__begin_ + (__position - begin());
1850 if (this->__end_ < this->__end_cap())
1851 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00001852 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001853 if (__p == this->__end_)
1854 {
1855 __alloc_traits::construct(this->__alloc(),
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001856 _VSTD::__to_raw_pointer(this->__end_),
1857 _VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001858 ++this->__end_;
1859 }
1860 else
1861 {
Marshall Clowa591b9a2016-07-11 21:38:08 +00001862 __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001863 __move_range(__p, this->__end_, __p + 1);
Marshall Clowa591b9a2016-07-11 21:38:08 +00001864 *__p = _VSTD::move(__tmp.get());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001865 }
Kostya Serebryany4963c252014-09-02 23:43:38 +00001866 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001867 }
1868 else
1869 {
1870 allocator_type& __a = this->__alloc();
1871 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001872 __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001873 __p = __swap_out_circular_buffer(__v, __p);
1874 }
1875 return __make_iter(__p);
1876}
1877
Eric Fiseliered9e9362017-04-16 02:40:45 +00001878#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001879
1880template <class _Tp, class _Allocator>
1881typename vector<_Tp, _Allocator>::iterator
1882vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1883{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001884#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001885 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1886 "vector::insert(iterator, n, x) called with an iterator not"
1887 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001888#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001889 pointer __p = this->__begin_ + (__position - begin());
1890 if (__n > 0)
1891 {
1892 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1893 {
1894 size_type __old_n = __n;
1895 pointer __old_last = this->__end_;
1896 if (__n > static_cast<size_type>(this->__end_ - __p))
1897 {
1898 size_type __cx = __n - (this->__end_ - __p);
1899 __construct_at_end(__cx, __x);
1900 __n -= __cx;
1901 }
1902 if (__n > 0)
1903 {
Eric Fiselier2a649652014-11-14 18:28:36 +00001904 __RAII_IncreaseAnnotator __annotator(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001905 __move_range(__p, __old_last, __p + __old_n);
Kostya Serebryany4963c252014-09-02 23:43:38 +00001906 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001907 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1908 if (__p <= __xr && __xr < this->__end_)
1909 __xr += __old_n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001910 _VSTD::fill_n(__p, __n, *__xr);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001911 }
1912 }
1913 else
1914 {
1915 allocator_type& __a = this->__alloc();
1916 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1917 __v.__construct_at_end(__n, __x);
1918 __p = __swap_out_circular_buffer(__v, __p);
1919 }
1920 }
1921 return __make_iter(__p);
1922}
1923
1924template <class _Tp, class _Allocator>
1925template <class _InputIterator>
1926typename enable_if
1927<
1928 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant88010252013-03-28 17:44:32 +00001929 !__is_forward_iterator<_InputIterator>::value &&
1930 is_constructible<
1931 _Tp,
1932 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001933 typename vector<_Tp, _Allocator>::iterator
1934>::type
1935vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1936{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001937#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001938 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1939 "vector::insert(iterator, range) called with an iterator not"
1940 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001941#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001942 difference_type __off = __position - begin();
1943 pointer __p = this->__begin_ + __off;
1944 allocator_type& __a = this->__alloc();
1945 pointer __old_last = this->__end_;
1946 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1947 {
Eric Fiselier489fd502015-07-18 18:22:12 +00001948 __RAII_IncreaseAnnotator __annotator(*this);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001949 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
Howard Hinnantc51e1022010-05-11 19:42:16 +00001950 *__first);
1951 ++this->__end_;
Eric Fiselier489fd502015-07-18 18:22:12 +00001952 __annotator.__done();
Howard Hinnantc51e1022010-05-11 19:42:16 +00001953 }
1954 __split_buffer<value_type, allocator_type&> __v(__a);
1955 if (__first != __last)
1956 {
1957#ifndef _LIBCPP_NO_EXCEPTIONS
1958 try
1959 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001960#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001961 __v.__construct_at_end(__first, __last);
1962 difference_type __old_size = __old_last - this->__begin_;
1963 difference_type __old_p = __p - this->__begin_;
1964 reserve(__recommend(size() + __v.size()));
1965 __p = this->__begin_ + __old_p;
1966 __old_last = this->__begin_ + __old_size;
1967#ifndef _LIBCPP_NO_EXCEPTIONS
1968 }
1969 catch (...)
1970 {
1971 erase(__make_iter(__old_last), end());
1972 throw;
1973 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001974#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001975 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001976 __p = _VSTD::rotate(__p, __old_last, this->__end_);
Howard Hinnant9cd22302011-09-16 18:41:29 +00001977 insert(__make_iter(__p), make_move_iterator(__v.begin()),
1978 make_move_iterator(__v.end()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001979 return begin() + __off;
1980}
1981
1982template <class _Tp, class _Allocator>
1983template <class _ForwardIterator>
1984typename enable_if
1985<
Howard Hinnant88010252013-03-28 17:44:32 +00001986 __is_forward_iterator<_ForwardIterator>::value &&
1987 is_constructible<
1988 _Tp,
1989 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantc51e1022010-05-11 19:42:16 +00001990 typename vector<_Tp, _Allocator>::iterator
1991>::type
1992vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1993{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001994#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00001995 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1996 "vector::insert(iterator, range) called with an iterator not"
1997 " referring to this vector");
Howard Hinnanta47c6d52011-09-16 17:29:17 +00001998#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001999 pointer __p = this->__begin_ + (__position - begin());
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002000 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002001 if (__n > 0)
2002 {
2003 if (__n <= this->__end_cap() - this->__end_)
2004 {
2005 size_type __old_n = __n;
2006 pointer __old_last = this->__end_;
2007 _ForwardIterator __m = __last;
2008 difference_type __dx = this->__end_ - __p;
2009 if (__n > __dx)
2010 {
2011 __m = __first;
Eric Fiselieracfe6f02015-03-31 16:54:19 +00002012 difference_type __diff = this->__end_ - __p;
2013 _VSTD::advance(__m, __diff);
2014 __construct_at_end(__m, __last, __n - __diff);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002015 __n = __dx;
2016 }
2017 if (__n > 0)
2018 {
Kostya Serebryany4963c252014-09-02 23:43:38 +00002019 __RAII_IncreaseAnnotator __annotator(*this, __n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002020 __move_range(__p, __old_last, __p + __old_n);
Kostya Serebryany4963c252014-09-02 23:43:38 +00002021 __annotator.__done();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002022 _VSTD::copy(__first, __m, __p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002023 }
2024 }
2025 else
2026 {
2027 allocator_type& __a = this->__alloc();
2028 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
2029 __v.__construct_at_end(__first, __last);
2030 __p = __swap_out_circular_buffer(__v, __p);
2031 }
2032 }
2033 return __make_iter(__p);
2034}
2035
2036template <class _Tp, class _Allocator>
2037void
2038vector<_Tp, _Allocator>::resize(size_type __sz)
2039{
2040 size_type __cs = size();
2041 if (__cs < __sz)
2042 this->__append(__sz - __cs);
2043 else if (__cs > __sz)
2044 this->__destruct_at_end(this->__begin_ + __sz);
2045}
2046
2047template <class _Tp, class _Allocator>
2048void
2049vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
2050{
2051 size_type __cs = size();
2052 if (__cs < __sz)
2053 this->__append(__sz - __cs, __x);
2054 else if (__cs > __sz)
2055 this->__destruct_at_end(this->__begin_ + __sz);
2056}
2057
2058template <class _Tp, class _Allocator>
2059void
2060vector<_Tp, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002061#if _LIBCPP_STD_VER >= 14
Eric Fiselier69c51982016-12-28 06:06:09 +00002062 _NOEXCEPT_DEBUG
Marshall Clow8982dcd2015-07-13 20:04:56 +00002063#else
Eric Fiselier69c51982016-12-28 06:06:09 +00002064 _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002065 __is_nothrow_swappable<allocator_type>::value)
2066#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002067{
Howard Hinnant27e0e772011-09-14 18:33:51 +00002068 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
2069 this->__alloc() == __x.__alloc(),
2070 "vector::swap: Either propagate_on_container_swap must be true"
2071 " or the allocators must compare equal");
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002072 _VSTD::swap(this->__begin_, __x.__begin_);
2073 _VSTD::swap(this->__end_, __x.__end_);
2074 _VSTD::swap(this->__end_cap(), __x.__end_cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00002075 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00002076 integral_constant<bool,__alloc_traits::propagate_on_container_swap::value>());
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002077#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002078 __get_db()->swap(this, &__x);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002079#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002080}
2081
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002082template <class _Tp, class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002083bool
2084vector<_Tp, _Allocator>::__invariants() const
2085{
Howard Hinnant76053d72013-06-27 19:35:32 +00002086 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002087 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002088 if (this->__end_ != nullptr || this->__end_cap() != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002089 return false;
2090 }
2091 else
2092 {
2093 if (this->__begin_ > this->__end_)
2094 return false;
2095 if (this->__begin_ == this->__end_cap())
2096 return false;
2097 if (this->__end_ > this->__end_cap())
2098 return false;
2099 }
2100 return true;
2101}
2102
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002103#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002104
Howard Hinnantc51e1022010-05-11 19:42:16 +00002105template <class _Tp, class _Allocator>
Howard Hinnant27e0e772011-09-14 18:33:51 +00002106bool
2107vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
2108{
2109 return this->__begin_ <= __i->base() && __i->base() < this->__end_;
2110}
2111
2112template <class _Tp, class _Allocator>
2113bool
2114vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
2115{
2116 return this->__begin_ < __i->base() && __i->base() <= this->__end_;
2117}
2118
2119template <class _Tp, class _Allocator>
2120bool
2121vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
2122{
2123 const_pointer __p = __i->base() + __n;
2124 return this->__begin_ <= __p && __p <= this->__end_;
2125}
2126
2127template <class _Tp, class _Allocator>
2128bool
2129vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2130{
2131 const_pointer __p = __i->base() + __n;
2132 return this->__begin_ <= __p && __p < this->__end_;
2133}
2134
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002135#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002136
2137template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002138inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002139void
2140vector<_Tp, _Allocator>::__invalidate_all_iterators()
2141{
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002142#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant27e0e772011-09-14 18:33:51 +00002143 __get_db()->__invalidate_all(this);
Howard Hinnanta47c6d52011-09-16 17:29:17 +00002144#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantc51e1022010-05-11 19:42:16 +00002145}
2146
Eric Fiselier69c51982016-12-28 06:06:09 +00002147
2148template <class _Tp, class _Allocator>
2149inline _LIBCPP_INLINE_VISIBILITY
2150void
2151vector<_Tp, _Allocator>::__invalidate_iterators_past(pointer __new_last) {
2152#if _LIBCPP_DEBUG_LEVEL >= 2
2153 __c_node* __c = __get_db()->__find_c_and_lock(this);
2154 for (__i_node** __p = __c->end_; __p != __c->beg_; ) {
2155 --__p;
2156 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
2157 if (__i->base() > __new_last) {
2158 (*__p)->__c_ = nullptr;
2159 if (--__c->end_ != __p)
2160 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
2161 }
2162 }
2163 __get_db()->unlock();
2164#else
2165 ((void)__new_last);
2166#endif
2167}
2168
Howard Hinnantc51e1022010-05-11 19:42:16 +00002169// vector<bool>
2170
2171template <class _Allocator> class vector<bool, _Allocator>;
2172
2173template <class _Allocator> struct hash<vector<bool, _Allocator> >;
2174
2175template <class _Allocator>
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002176struct __has_storage_type<vector<bool, _Allocator> >
2177{
2178 static const bool value = true;
2179};
2180
2181template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002182class _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002183 : private __vector_base_common<true>
2184{
2185public:
2186 typedef vector __self;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002187 typedef bool value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002188 typedef _Allocator allocator_type;
2189 typedef allocator_traits<allocator_type> __alloc_traits;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002190 typedef typename __alloc_traits::size_type size_type;
2191 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnant896b7622012-05-07 16:50:38 +00002192 typedef size_type __storage_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002193 typedef __bit_iterator<vector, false> pointer;
2194 typedef __bit_iterator<vector, true> const_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002195 typedef pointer iterator;
2196 typedef const_pointer const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002197 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
2198 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002199
2200private:
Marshall Clow940e01c2015-04-07 05:21:38 +00002201 typedef typename __rebind_alloc_helper<__alloc_traits, __storage_type>::type __storage_allocator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002202 typedef allocator_traits<__storage_allocator> __storage_traits;
2203 typedef typename __storage_traits::pointer __storage_pointer;
2204 typedef typename __storage_traits::const_pointer __const_storage_pointer;
2205
2206 __storage_pointer __begin_;
2207 size_type __size_;
2208 __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002209public:
Howard Hinnantb4ef6482011-07-02 20:33:23 +00002210 typedef __bit_reference<vector> reference;
2211 typedef __bit_const_reference<vector> const_reference;
Howard Hinnant71d1c192011-07-09 15:50:42 +00002212private:
Howard Hinnant1c936782011-06-03 19:40:40 +00002213 _LIBCPP_INLINE_VISIBILITY
2214 size_type& __cap() _NOEXCEPT
2215 {return __cap_alloc_.first();}
2216 _LIBCPP_INLINE_VISIBILITY
2217 const size_type& __cap() const _NOEXCEPT
2218 {return __cap_alloc_.first();}
2219 _LIBCPP_INLINE_VISIBILITY
2220 __storage_allocator& __alloc() _NOEXCEPT
2221 {return __cap_alloc_.second();}
2222 _LIBCPP_INLINE_VISIBILITY
2223 const __storage_allocator& __alloc() const _NOEXCEPT
2224 {return __cap_alloc_.second();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002225
2226 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2227
Howard Hinnant1c936782011-06-03 19:40:40 +00002228 _LIBCPP_INLINE_VISIBILITY
2229 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002230 {return __n * __bits_per_word;}
Howard Hinnant1c936782011-06-03 19:40:40 +00002231 _LIBCPP_INLINE_VISIBILITY
2232 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002233 {return (__n - 1) / __bits_per_word + 1;}
2234
2235public:
Howard Hinnant1c936782011-06-03 19:40:40 +00002236 _LIBCPP_INLINE_VISIBILITY
Marshall Clowe546cbb2015-06-04 02:05:41 +00002237 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Marshall Clow8f282f42015-06-04 00:10:20 +00002238
2239 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
2240#if _LIBCPP_STD_VER <= 14
2241 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
2242#else
2243 _NOEXCEPT;
2244#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002245 ~vector();
2246 explicit vector(size_type __n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002247#if _LIBCPP_STD_VER > 11
2248 explicit vector(size_type __n, const allocator_type& __a);
2249#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002250 vector(size_type __n, const value_type& __v);
2251 vector(size_type __n, const value_type& __v, const allocator_type& __a);
2252 template <class _InputIterator>
2253 vector(_InputIterator __first, _InputIterator __last,
2254 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2255 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2256 template <class _InputIterator>
2257 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2258 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2259 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2260 template <class _ForwardIterator>
2261 vector(_ForwardIterator __first, _ForwardIterator __last,
2262 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2263 template <class _ForwardIterator>
2264 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2265 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2266
2267 vector(const vector& __v);
2268 vector(const vector& __v, const allocator_type& __a);
2269 vector& operator=(const vector& __v);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002270
2271#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002272 vector(initializer_list<value_type> __il);
2273 vector(initializer_list<value_type> __il, const allocator_type& __a);
2274
Howard Hinnant1c936782011-06-03 19:40:40 +00002275 _LIBCPP_INLINE_VISIBILITY
2276 vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002277#if _LIBCPP_STD_VER > 14
2278 _NOEXCEPT;
2279#else
Howard Hinnant1c936782011-06-03 19:40:40 +00002280 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Marshall Clowe5108202015-07-14 14:46:32 +00002281#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002282 vector(vector&& __v, const allocator_type& __a);
Howard Hinnant1c936782011-06-03 19:40:40 +00002283 _LIBCPP_INLINE_VISIBILITY
2284 vector& operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002285 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
Eric Fiseliered9e9362017-04-16 02:40:45 +00002286
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002287 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002288 vector& operator=(initializer_list<value_type> __il)
2289 {assign(__il.begin(), __il.end()); return *this;}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002290
2291#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002292
2293 template <class _InputIterator>
2294 typename enable_if
2295 <
2296 __is_input_iterator<_InputIterator>::value &&
2297 !__is_forward_iterator<_InputIterator>::value,
2298 void
2299 >::type
2300 assign(_InputIterator __first, _InputIterator __last);
2301 template <class _ForwardIterator>
2302 typename enable_if
2303 <
2304 __is_forward_iterator<_ForwardIterator>::value,
2305 void
2306 >::type
2307 assign(_ForwardIterator __first, _ForwardIterator __last);
2308
2309 void assign(size_type __n, const value_type& __x);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002310
2311#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002312 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002313 void assign(initializer_list<value_type> __il)
2314 {assign(__il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002315#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002316
Howard Hinnant1c936782011-06-03 19:40:40 +00002317 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002318 {return allocator_type(this->__alloc());}
2319
Howard Hinnant1c936782011-06-03 19:40:40 +00002320 size_type max_size() const _NOEXCEPT;
2321 _LIBCPP_INLINE_VISIBILITY
2322 size_type capacity() const _NOEXCEPT
2323 {return __internal_cap_to_external(__cap());}
2324 _LIBCPP_INLINE_VISIBILITY
2325 size_type size() const _NOEXCEPT
2326 {return __size_;}
Marshall Clow425f5752017-11-15 05:51:26 +00002327 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00002328 bool empty() const _NOEXCEPT
2329 {return __size_ == 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002330 void reserve(size_type __n);
Howard Hinnant1c936782011-06-03 19:40:40 +00002331 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002332
Howard Hinnant1c936782011-06-03 19:40:40 +00002333 _LIBCPP_INLINE_VISIBILITY
2334 iterator begin() _NOEXCEPT
2335 {return __make_iter(0);}
2336 _LIBCPP_INLINE_VISIBILITY
2337 const_iterator begin() const _NOEXCEPT
2338 {return __make_iter(0);}
2339 _LIBCPP_INLINE_VISIBILITY
2340 iterator end() _NOEXCEPT
2341 {return __make_iter(__size_);}
2342 _LIBCPP_INLINE_VISIBILITY
2343 const_iterator end() const _NOEXCEPT
2344 {return __make_iter(__size_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002345
Howard Hinnant1c936782011-06-03 19:40:40 +00002346 _LIBCPP_INLINE_VISIBILITY
2347 reverse_iterator rbegin() _NOEXCEPT
2348 {return reverse_iterator(end());}
2349 _LIBCPP_INLINE_VISIBILITY
2350 const_reverse_iterator rbegin() const _NOEXCEPT
2351 {return const_reverse_iterator(end());}
2352 _LIBCPP_INLINE_VISIBILITY
2353 reverse_iterator rend() _NOEXCEPT
2354 {return reverse_iterator(begin());}
2355 _LIBCPP_INLINE_VISIBILITY
2356 const_reverse_iterator rend() const _NOEXCEPT
2357 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002358
Howard Hinnant1c936782011-06-03 19:40:40 +00002359 _LIBCPP_INLINE_VISIBILITY
2360 const_iterator cbegin() const _NOEXCEPT
2361 {return __make_iter(0);}
2362 _LIBCPP_INLINE_VISIBILITY
2363 const_iterator cend() const _NOEXCEPT
2364 {return __make_iter(__size_);}
2365 _LIBCPP_INLINE_VISIBILITY
2366 const_reverse_iterator crbegin() const _NOEXCEPT
2367 {return rbegin();}
2368 _LIBCPP_INLINE_VISIBILITY
2369 const_reverse_iterator crend() const _NOEXCEPT
2370 {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002371
2372 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
2373 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2374 reference at(size_type __n);
2375 const_reference at(size_type __n) const;
2376
2377 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
2378 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2379 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
2380 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
2381
2382 void push_back(const value_type& __x);
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002383#if _LIBCPP_STD_VER > 11
2384 template <class... _Args>
Marshall Clowea52cc42017-01-24 23:09:12 +00002385#if _LIBCPP_STD_VER > 14
2386 _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args)
2387#else
2388 _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args)
2389#endif
2390 {
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002391 push_back ( value_type ( _VSTD::forward<_Args>(__args)... ));
Marshall Clowea52cc42017-01-24 23:09:12 +00002392#if _LIBCPP_STD_VER > 14
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002393 return this->back();
Marshall Clowea52cc42017-01-24 23:09:12 +00002394#endif
Eric Fiselier34ba5b92016-07-21 03:20:17 +00002395 }
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002396#endif
2397
Howard Hinnantc51e1022010-05-11 19:42:16 +00002398 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2399
Marshall Clowc46bb8e2013-08-13 23:54:12 +00002400#if _LIBCPP_STD_VER > 11
2401 template <class... _Args>
2402 _LIBCPP_INLINE_VISIBILITY iterator emplace(const_iterator position, _Args&&... __args)
2403 { return insert ( position, value_type ( _VSTD::forward<_Args>(__args)... )); }
2404#endif
2405
Howard Hinnantc51e1022010-05-11 19:42:16 +00002406 iterator insert(const_iterator __position, const value_type& __x);
2407 iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2408 iterator insert(const_iterator __position, size_type __n, const_reference __x);
2409 template <class _InputIterator>
2410 typename enable_if
2411 <
2412 __is_input_iterator <_InputIterator>::value &&
2413 !__is_forward_iterator<_InputIterator>::value,
2414 iterator
2415 >::type
2416 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2417 template <class _ForwardIterator>
2418 typename enable_if
2419 <
2420 __is_forward_iterator<_ForwardIterator>::value,
2421 iterator
2422 >::type
2423 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Eric Fiseliered9e9362017-04-16 02:40:45 +00002424
2425#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002426 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002427 iterator insert(const_iterator __position, initializer_list<value_type> __il)
2428 {return insert(__position, __il.begin(), __il.end());}
Eric Fiseliered9e9362017-04-16 02:40:45 +00002429#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002430
Howard Hinnantcf823322010-12-17 14:46:43 +00002431 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002432 iterator erase(const_iterator __first, const_iterator __last);
2433
Howard Hinnant1c936782011-06-03 19:40:40 +00002434 _LIBCPP_INLINE_VISIBILITY
2435 void clear() _NOEXCEPT {__size_ = 0;}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002436
Howard Hinnant1c936782011-06-03 19:40:40 +00002437 void swap(vector&)
Marshall Clow8982dcd2015-07-13 20:04:56 +00002438#if _LIBCPP_STD_VER >= 14
2439 _NOEXCEPT;
2440#else
Eric Fiselier69c51982016-12-28 06:06:09 +00002441 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00002442 __is_nothrow_swappable<allocator_type>::value);
2443#endif
Marshall Clow89eb3822016-04-07 14:20:31 +00002444 static void swap(reference __x, reference __y) _NOEXCEPT { _VSTD::swap(__x, __y); }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002445
2446 void resize(size_type __sz, value_type __x = false);
Howard Hinnant1c936782011-06-03 19:40:40 +00002447 void flip() _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002448
2449 bool __invariants() const;
2450
2451private:
Howard Hinnantcf823322010-12-17 14:46:43 +00002452 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Marshall Clow3ff48e02018-05-22 16:20:28 +00002453 void __vallocate(size_type __n);
2454 void __vdeallocate() _NOEXCEPT;
Howard Hinnant1c936782011-06-03 19:40:40 +00002455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantea382952013-08-14 18:00:20 +00002456 static size_type __align_it(size_type __new_size) _NOEXCEPT
Marshall Clow66f34152014-07-28 15:02:42 +00002457 {return __new_size + (__bits_per_word-1) & ~((size_type)__bits_per_word-1);};
Howard Hinnantcf823322010-12-17 14:46:43 +00002458 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
2459 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002460 template <class _ForwardIterator>
2461 typename enable_if
2462 <
2463 __is_forward_iterator<_ForwardIterator>::value,
2464 void
2465 >::type
2466 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2467 void __append(size_type __n, const_reference __x);
Howard Hinnant1c936782011-06-03 19:40:40 +00002468 _LIBCPP_INLINE_VISIBILITY
2469 reference __make_ref(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002470 {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnant1c936782011-06-03 19:40:40 +00002471 _LIBCPP_INLINE_VISIBILITY
2472 const_reference __make_ref(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002473 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnant1c936782011-06-03 19:40:40 +00002474 _LIBCPP_INLINE_VISIBILITY
2475 iterator __make_iter(size_type __pos) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002476 {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnant1c936782011-06-03 19:40:40 +00002477 _LIBCPP_INLINE_VISIBILITY
2478 const_iterator __make_iter(size_type __pos) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002479 {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnant1c936782011-06-03 19:40:40 +00002480 _LIBCPP_INLINE_VISIBILITY
2481 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
Howard Hinnant76053d72013-06-27 19:35:32 +00002482 {return begin() + (__p - cbegin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002483
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002484 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002485 void __copy_assign_alloc(const vector& __v)
2486 {__copy_assign_alloc(__v, integral_constant<bool,
2487 __storage_traits::propagate_on_container_copy_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002488 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002489 void __copy_assign_alloc(const vector& __c, true_type)
2490 {
2491 if (__alloc() != __c.__alloc())
Marshall Clow3ff48e02018-05-22 16:20:28 +00002492 __vdeallocate();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002493 __alloc() = __c.__alloc();
2494 }
2495
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002497 void __copy_assign_alloc(const vector&, false_type)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002498 {}
2499
2500 void __move_assign(vector& __c, false_type);
Howard Hinnant1c936782011-06-03 19:40:40 +00002501 void __move_assign(vector& __c, true_type)
2502 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002504 void __move_assign_alloc(vector& __c)
Howard Hinnant1c936782011-06-03 19:40:40 +00002505 _NOEXCEPT_(
2506 !__storage_traits::propagate_on_container_move_assignment::value ||
2507 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002508 {__move_assign_alloc(__c, integral_constant<bool,
2509 __storage_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002510 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc2734962011-09-02 20:42:31 +00002511 void __move_assign_alloc(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002512 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002513 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002514 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002515 }
2516
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002517 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00002518 void __move_assign_alloc(vector&, false_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002519 _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002520 {}
2521
Howard Hinnant1c936782011-06-03 19:40:40 +00002522 size_t __hash_code() const _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002523
2524 friend class __bit_reference<vector>;
2525 friend class __bit_const_reference<vector>;
2526 friend class __bit_iterator<vector, false>;
2527 friend class __bit_iterator<vector, true>;
Howard Hinnant4210a0f2012-08-17 17:10:18 +00002528 friend struct __bit_array<vector>;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002529 friend struct _LIBCPP_TEMPLATE_VIS hash<vector>;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002530};
2531
2532template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002533inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002534void
2535vector<bool, _Allocator>::__invalidate_all_iterators()
2536{
Howard Hinnantc51e1022010-05-11 19:42:16 +00002537}
2538
2539// Allocate space for __n objects
2540// throws length_error if __n > max_size()
2541// throws (probably bad_alloc) if memory run out
2542// Precondition: __begin_ == __end_ == __cap() == 0
2543// Precondition: __n > 0
2544// Postcondition: capacity() == __n
2545// Postcondition: size() == 0
2546template <class _Allocator>
2547void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002548vector<bool, _Allocator>::__vallocate(size_type __n)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002549{
2550 if (__n > max_size())
2551 this->__throw_length_error();
2552 __n = __external_cap_to_internal(__n);
2553 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2554 this->__size_ = 0;
2555 this->__cap() = __n;
2556}
2557
2558template <class _Allocator>
2559void
Marshall Clow3ff48e02018-05-22 16:20:28 +00002560vector<bool, _Allocator>::__vdeallocate() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002561{
Howard Hinnant76053d72013-06-27 19:35:32 +00002562 if (this->__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002563 {
2564 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2565 __invalidate_all_iterators();
Howard Hinnant76053d72013-06-27 19:35:32 +00002566 this->__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002567 this->__size_ = this->__cap() = 0;
2568 }
2569}
2570
2571template <class _Allocator>
2572typename vector<bool, _Allocator>::size_type
Howard Hinnant1c936782011-06-03 19:40:40 +00002573vector<bool, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002574{
2575 size_type __amax = __storage_traits::max_size(__alloc());
2576 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
2577 if (__nmax / __bits_per_word <= __amax)
2578 return __nmax;
2579 return __internal_cap_to_external(__amax);
2580}
2581
2582// Precondition: __new_size > capacity()
2583template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002584inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002585typename vector<bool, _Allocator>::size_type
2586vector<bool, _Allocator>::__recommend(size_type __new_size) const
2587{
2588 const size_type __ms = max_size();
2589 if (__new_size > __ms)
2590 this->__throw_length_error();
2591 const size_type __cap = capacity();
2592 if (__cap >= __ms / 2)
2593 return __ms;
Howard Hinnantea382952013-08-14 18:00:20 +00002594 return _VSTD::max(2*__cap, __align_it(__new_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002595}
2596
2597// Default constructs __n objects starting at __end_
2598// Precondition: __n > 0
2599// Precondition: size() + __n <= capacity()
2600// Postcondition: size() == size() + __n
2601template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002602inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002603void
2604vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2605{
2606 size_type __old_size = this->__size_;
2607 this->__size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002608 _VSTD::fill_n(__make_iter(__old_size), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002609}
2610
2611template <class _Allocator>
2612template <class _ForwardIterator>
2613typename enable_if
2614<
2615 __is_forward_iterator<_ForwardIterator>::value,
2616 void
2617>::type
2618vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2619{
2620 size_type __old_size = this->__size_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002621 this->__size_ += _VSTD::distance(__first, __last);
2622 _VSTD::copy(__first, __last, __make_iter(__old_size));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002623}
2624
2625template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002626inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002627vector<bool, _Allocator>::vector()
Marshall Clowe546cbb2015-06-04 02:05:41 +00002628 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant76053d72013-06-27 19:35:32 +00002629 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002630 __size_(0),
2631 __cap_alloc_(0)
2632{
2633}
2634
2635template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002636inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002637vector<bool, _Allocator>::vector(const allocator_type& __a)
Marshall Clow8f282f42015-06-04 00:10:20 +00002638#if _LIBCPP_STD_VER <= 14
2639 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
2640#else
2641 _NOEXCEPT
2642#endif
Howard Hinnant76053d72013-06-27 19:35:32 +00002643 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002644 __size_(0),
2645 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2646{
2647}
2648
2649template <class _Allocator>
2650vector<bool, _Allocator>::vector(size_type __n)
Howard Hinnant76053d72013-06-27 19:35:32 +00002651 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002652 __size_(0),
2653 __cap_alloc_(0)
2654{
2655 if (__n > 0)
2656 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002657 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002658 __construct_at_end(__n, false);
2659 }
2660}
2661
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002662#if _LIBCPP_STD_VER > 11
2663template <class _Allocator>
2664vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a)
2665 : __begin_(nullptr),
2666 __size_(0),
2667 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2668{
2669 if (__n > 0)
2670 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002671 __vallocate(__n);
Marshall Clowd3cbeaa2013-09-14 00:47:59 +00002672 __construct_at_end(__n, false);
2673 }
2674}
2675#endif
2676
Howard Hinnantc51e1022010-05-11 19:42:16 +00002677template <class _Allocator>
2678vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
Howard Hinnant76053d72013-06-27 19:35:32 +00002679 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002680 __size_(0),
2681 __cap_alloc_(0)
2682{
2683 if (__n > 0)
2684 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002685 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002686 __construct_at_end(__n, __x);
2687 }
2688}
2689
2690template <class _Allocator>
2691vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002692 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002693 __size_(0),
2694 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2695{
2696 if (__n > 0)
2697 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002698 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002699 __construct_at_end(__n, __x);
2700 }
2701}
2702
2703template <class _Allocator>
2704template <class _InputIterator>
2705vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2706 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2707 !__is_forward_iterator<_InputIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002708 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002709 __size_(0),
2710 __cap_alloc_(0)
2711{
2712#ifndef _LIBCPP_NO_EXCEPTIONS
2713 try
2714 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002715#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002716 for (; __first != __last; ++__first)
2717 push_back(*__first);
2718#ifndef _LIBCPP_NO_EXCEPTIONS
2719 }
2720 catch (...)
2721 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002722 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002723 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2724 __invalidate_all_iterators();
2725 throw;
2726 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002727#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002728}
2729
2730template <class _Allocator>
2731template <class _InputIterator>
2732vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2733 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2734 !__is_forward_iterator<_InputIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002735 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002736 __size_(0),
2737 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2738{
2739#ifndef _LIBCPP_NO_EXCEPTIONS
2740 try
2741 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002742#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002743 for (; __first != __last; ++__first)
2744 push_back(*__first);
2745#ifndef _LIBCPP_NO_EXCEPTIONS
2746 }
2747 catch (...)
2748 {
Howard Hinnant76053d72013-06-27 19:35:32 +00002749 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002750 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2751 __invalidate_all_iterators();
2752 throw;
2753 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002754#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002755}
2756
2757template <class _Allocator>
2758template <class _ForwardIterator>
2759vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2760 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002761 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002762 __size_(0),
2763 __cap_alloc_(0)
2764{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002765 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002766 if (__n > 0)
2767 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002768 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002769 __construct_at_end(__first, __last);
2770 }
2771}
2772
2773template <class _Allocator>
2774template <class _ForwardIterator>
2775vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2776 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
Howard Hinnant76053d72013-06-27 19:35:32 +00002777 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002778 __size_(0),
2779 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2780{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002781 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002782 if (__n > 0)
2783 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002784 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002785 __construct_at_end(__first, __last);
2786 }
2787}
2788
Eric Fiseliered9e9362017-04-16 02:40:45 +00002789#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002790
Howard Hinnantc51e1022010-05-11 19:42:16 +00002791template <class _Allocator>
2792vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
Howard Hinnant76053d72013-06-27 19:35:32 +00002793 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002794 __size_(0),
2795 __cap_alloc_(0)
2796{
2797 size_type __n = static_cast<size_type>(__il.size());
2798 if (__n > 0)
2799 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002800 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002801 __construct_at_end(__il.begin(), __il.end());
2802 }
2803}
2804
2805template <class _Allocator>
2806vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002807 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002808 __size_(0),
2809 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2810{
2811 size_type __n = static_cast<size_type>(__il.size());
2812 if (__n > 0)
2813 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002814 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002815 __construct_at_end(__il.begin(), __il.end());
2816 }
2817}
2818
Eric Fiseliered9e9362017-04-16 02:40:45 +00002819#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002820
Howard Hinnantc51e1022010-05-11 19:42:16 +00002821template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00002822vector<bool, _Allocator>::~vector()
2823{
Howard Hinnant76053d72013-06-27 19:35:32 +00002824 if (__begin_ != nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002825 __storage_traits::deallocate(__alloc(), __begin_, __cap());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002826 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002827}
2828
2829template <class _Allocator>
2830vector<bool, _Allocator>::vector(const vector& __v)
Howard Hinnant76053d72013-06-27 19:35:32 +00002831 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002832 __size_(0),
2833 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2834{
2835 if (__v.size() > 0)
2836 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002837 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002838 __construct_at_end(__v.begin(), __v.end());
2839 }
2840}
2841
2842template <class _Allocator>
2843vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002844 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002845 __size_(0),
2846 __cap_alloc_(0, __a)
2847{
2848 if (__v.size() > 0)
2849 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002850 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002851 __construct_at_end(__v.begin(), __v.end());
2852 }
2853}
2854
2855template <class _Allocator>
2856vector<bool, _Allocator>&
2857vector<bool, _Allocator>::operator=(const vector& __v)
2858{
2859 if (this != &__v)
2860 {
2861 __copy_assign_alloc(__v);
2862 if (__v.__size_)
2863 {
2864 if (__v.__size_ > capacity())
2865 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002866 __vdeallocate();
2867 __vallocate(__v.__size_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002868 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002869 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002870 }
2871 __size_ = __v.__size_;
2872 }
2873 return *this;
2874}
2875
Eric Fiseliered9e9362017-04-16 02:40:45 +00002876#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant74279a52010-09-04 23:28:19 +00002877
Howard Hinnantc51e1022010-05-11 19:42:16 +00002878template <class _Allocator>
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002879inline _LIBCPP_INLINE_VISIBILITY vector<bool, _Allocator>::vector(vector&& __v)
Marshall Clowe5108202015-07-14 14:46:32 +00002880#if _LIBCPP_STD_VER > 14
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002881 _NOEXCEPT
Marshall Clowe5108202015-07-14 14:46:32 +00002882#else
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002883 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Marshall Clowe5108202015-07-14 14:46:32 +00002884#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002885 : __begin_(__v.__begin_),
2886 __size_(__v.__size_),
Eric Fiselier4f1534c2018-06-05 22:32:52 +00002887 __cap_alloc_(std::move(__v.__cap_alloc_)) {
Howard Hinnant76053d72013-06-27 19:35:32 +00002888 __v.__begin_ = nullptr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002889 __v.__size_ = 0;
2890 __v.__cap() = 0;
2891}
2892
2893template <class _Allocator>
2894vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
Howard Hinnant76053d72013-06-27 19:35:32 +00002895 : __begin_(nullptr),
Howard Hinnantc51e1022010-05-11 19:42:16 +00002896 __size_(0),
2897 __cap_alloc_(0, __a)
2898{
2899 if (__a == allocator_type(__v.__alloc()))
2900 {
2901 this->__begin_ = __v.__begin_;
2902 this->__size_ = __v.__size_;
2903 this->__cap() = __v.__cap();
2904 __v.__begin_ = nullptr;
2905 __v.__cap() = __v.__size_ = 0;
2906 }
2907 else if (__v.size() > 0)
2908 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00002909 __vallocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002910 __construct_at_end(__v.begin(), __v.end());
2911 }
2912}
2913
2914template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00002915inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002916vector<bool, _Allocator>&
2917vector<bool, _Allocator>::operator=(vector&& __v)
Marshall Clow2fe8a8d2015-08-18 18:57:00 +00002918 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002919{
2920 __move_assign(__v, integral_constant<bool,
2921 __storage_traits::propagate_on_container_move_assignment::value>());
Argyrios Kyrtzidisaf904652012-10-13 02:03:45 +00002922 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002923}
2924
2925template <class _Allocator>
2926void
2927vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2928{
2929 if (__alloc() != __c.__alloc())
2930 assign(__c.begin(), __c.end());
2931 else
2932 __move_assign(__c, true_type());
2933}
2934
2935template <class _Allocator>
2936void
2937vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnant1c936782011-06-03 19:40:40 +00002938 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002939{
Marshall Clow3ff48e02018-05-22 16:20:28 +00002940 __vdeallocate();
Marshall Clowb4871fa2014-07-21 15:15:15 +00002941 __move_assign_alloc(__c);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002942 this->__begin_ = __c.__begin_;
2943 this->__size_ = __c.__size_;
2944 this->__cap() = __c.__cap();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002945 __c.__begin_ = nullptr;
2946 __c.__cap() = __c.__size_ = 0;
2947}
Howard Hinnant74279a52010-09-04 23:28:19 +00002948
Eric Fiseliered9e9362017-04-16 02:40:45 +00002949#endif // !_LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002950
2951template <class _Allocator>
2952void
2953vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2954{
2955 __size_ = 0;
2956 if (__n > 0)
2957 {
2958 size_type __c = capacity();
2959 if (__n <= __c)
2960 __size_ = __n;
2961 else
2962 {
2963 vector __v(__alloc());
2964 __v.reserve(__recommend(__n));
2965 __v.__size_ = __n;
2966 swap(__v);
2967 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002968 _VSTD::fill_n(begin(), __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002969 }
Eric Fiselier69c51982016-12-28 06:06:09 +00002970 __invalidate_all_iterators();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002971}
2972
2973template <class _Allocator>
2974template <class _InputIterator>
2975typename enable_if
2976<
2977 __is_input_iterator<_InputIterator>::value &&
2978 !__is_forward_iterator<_InputIterator>::value,
2979 void
2980>::type
2981vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2982{
2983 clear();
2984 for (; __first != __last; ++__first)
2985 push_back(*__first);
2986}
2987
2988template <class _Allocator>
2989template <class _ForwardIterator>
2990typename enable_if
2991<
2992 __is_forward_iterator<_ForwardIterator>::value,
2993 void
2994>::type
2995vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2996{
2997 clear();
Eric Fiselier6003c772016-12-23 23:37:52 +00002998 difference_type __ns = _VSTD::distance(__first, __last);
2999 _LIBCPP_ASSERT(__ns >= 0, "invalid range specified");
3000 const size_t __n = static_cast<size_type>(__ns);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003001 if (__n)
3002 {
3003 if (__n > capacity())
3004 {
Marshall Clow3ff48e02018-05-22 16:20:28 +00003005 __vdeallocate();
3006 __vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003007 }
3008 __construct_at_end(__first, __last);
3009 }
3010}
3011
3012template <class _Allocator>
3013void
3014vector<bool, _Allocator>::reserve(size_type __n)
3015{
3016 if (__n > capacity())
3017 {
3018 vector __v(this->__alloc());
Marshall Clow3ff48e02018-05-22 16:20:28 +00003019 __v.__vallocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003020 __v.__construct_at_end(this->begin(), this->end());
3021 swap(__v);
3022 __invalidate_all_iterators();
3023 }
3024}
3025
3026template <class _Allocator>
3027void
Howard Hinnant1c936782011-06-03 19:40:40 +00003028vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003029{
3030 if (__external_cap_to_internal(size()) > __cap())
3031 {
3032#ifndef _LIBCPP_NO_EXCEPTIONS
3033 try
3034 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003035#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003036 vector(*this, allocator_type(__alloc())).swap(*this);
3037#ifndef _LIBCPP_NO_EXCEPTIONS
3038 }
3039 catch (...)
3040 {
3041 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003042#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003043 }
3044}
3045
3046template <class _Allocator>
3047typename vector<bool, _Allocator>::reference
3048vector<bool, _Allocator>::at(size_type __n)
3049{
3050 if (__n >= size())
3051 this->__throw_out_of_range();
3052 return (*this)[__n];
3053}
3054
3055template <class _Allocator>
3056typename vector<bool, _Allocator>::const_reference
3057vector<bool, _Allocator>::at(size_type __n) const
3058{
3059 if (__n >= size())
3060 this->__throw_out_of_range();
3061 return (*this)[__n];
3062}
3063
3064template <class _Allocator>
3065void
3066vector<bool, _Allocator>::push_back(const value_type& __x)
3067{
3068 if (this->__size_ == this->capacity())
3069 reserve(__recommend(this->__size_ + 1));
3070 ++this->__size_;
3071 back() = __x;
3072}
3073
3074template <class _Allocator>
3075typename vector<bool, _Allocator>::iterator
3076vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
3077{
3078 iterator __r;
3079 if (size() < capacity())
3080 {
3081 const_iterator __old_end = end();
3082 ++__size_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003083 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003084 __r = __const_iterator_cast(__position);
3085 }
3086 else
3087 {
3088 vector __v(__alloc());
3089 __v.reserve(__recommend(__size_ + 1));
3090 __v.__size_ = __size_ + 1;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003091 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3092 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003093 swap(__v);
3094 }
3095 *__r = __x;
3096 return __r;
3097}
3098
3099template <class _Allocator>
3100typename vector<bool, _Allocator>::iterator
3101vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
3102{
3103 iterator __r;
3104 size_type __c = capacity();
3105 if (__n <= __c && size() <= __c - __n)
3106 {
3107 const_iterator __old_end = end();
3108 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003109 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003110 __r = __const_iterator_cast(__position);
3111 }
3112 else
3113 {
3114 vector __v(__alloc());
3115 __v.reserve(__recommend(__size_ + __n));
3116 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003117 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3118 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003119 swap(__v);
3120 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003121 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003122 return __r;
3123}
3124
3125template <class _Allocator>
3126template <class _InputIterator>
3127typename enable_if
3128<
3129 __is_input_iterator <_InputIterator>::value &&
3130 !__is_forward_iterator<_InputIterator>::value,
3131 typename vector<bool, _Allocator>::iterator
3132>::type
3133vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
3134{
3135 difference_type __off = __position - begin();
3136 iterator __p = __const_iterator_cast(__position);
3137 iterator __old_end = end();
3138 for (; size() != capacity() && __first != __last; ++__first)
3139 {
3140 ++this->__size_;
3141 back() = *__first;
3142 }
3143 vector __v(__alloc());
3144 if (__first != __last)
3145 {
3146#ifndef _LIBCPP_NO_EXCEPTIONS
3147 try
3148 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003149#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003150 __v.assign(__first, __last);
3151 difference_type __old_size = static_cast<difference_type>(__old_end - begin());
3152 difference_type __old_p = __p - begin();
3153 reserve(__recommend(size() + __v.size()));
3154 __p = begin() + __old_p;
3155 __old_end = begin() + __old_size;
3156#ifndef _LIBCPP_NO_EXCEPTIONS
3157 }
3158 catch (...)
3159 {
3160 erase(__old_end, end());
3161 throw;
3162 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003163#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003164 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003165 __p = _VSTD::rotate(__p, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003166 insert(__p, __v.begin(), __v.end());
3167 return begin() + __off;
3168}
3169
3170template <class _Allocator>
3171template <class _ForwardIterator>
3172typename enable_if
3173<
3174 __is_forward_iterator<_ForwardIterator>::value,
3175 typename vector<bool, _Allocator>::iterator
3176>::type
3177vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
3178{
Eric Fiselier654dd332016-12-11 05:31:00 +00003179 const difference_type __n_signed = _VSTD::distance(__first, __last);
3180 _LIBCPP_ASSERT(__n_signed >= 0, "invalid range specified");
3181 const size_type __n = static_cast<size_type>(__n_signed);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003182 iterator __r;
3183 size_type __c = capacity();
3184 if (__n <= __c && size() <= __c - __n)
3185 {
3186 const_iterator __old_end = end();
3187 __size_ += __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003188 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003189 __r = __const_iterator_cast(__position);
3190 }
3191 else
3192 {
3193 vector __v(__alloc());
3194 __v.reserve(__recommend(__size_ + __n));
3195 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003196 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3197 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003198 swap(__v);
3199 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003200 _VSTD::copy(__first, __last, __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003201 return __r;
3202}
3203
3204template <class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003205inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003206typename vector<bool, _Allocator>::iterator
3207vector<bool, _Allocator>::erase(const_iterator __position)
3208{
3209 iterator __r = __const_iterator_cast(__position);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003210 _VSTD::copy(__position + 1, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003211 --__size_;
3212 return __r;
3213}
3214
3215template <class _Allocator>
3216typename vector<bool, _Allocator>::iterator
3217vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
3218{
3219 iterator __r = __const_iterator_cast(__first);
3220 difference_type __d = __last - __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003221 _VSTD::copy(__last, this->cend(), __r);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003222 __size_ -= __d;
3223 return __r;
3224}
3225
3226template <class _Allocator>
3227void
3228vector<bool, _Allocator>::swap(vector& __x)
Marshall Clow8982dcd2015-07-13 20:04:56 +00003229#if _LIBCPP_STD_VER >= 14
3230 _NOEXCEPT
3231#else
Eric Fiselier69c51982016-12-28 06:06:09 +00003232 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow8982dcd2015-07-13 20:04:56 +00003233 __is_nothrow_swappable<allocator_type>::value)
3234#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00003235{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003236 _VSTD::swap(this->__begin_, __x.__begin_);
3237 _VSTD::swap(this->__size_, __x.__size_);
3238 _VSTD::swap(this->__cap(), __x.__cap());
Eric Fiseliered9e9362017-04-16 02:40:45 +00003239 __swap_allocator(this->__alloc(), __x.__alloc(),
Marshall Clow8982dcd2015-07-13 20:04:56 +00003240 integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003241}
3242
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003243template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003244void
3245vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3246{
3247 size_type __cs = size();
3248 if (__cs < __sz)
3249 {
3250 iterator __r;
3251 size_type __c = capacity();
3252 size_type __n = __sz - __cs;
3253 if (__n <= __c && __cs <= __c - __n)
3254 {
3255 __r = end();
3256 __size_ += __n;
3257 }
3258 else
3259 {
3260 vector __v(__alloc());
3261 __v.reserve(__recommend(__size_ + __n));
3262 __v.__size_ = __size_ + __n;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003263 __r = _VSTD::copy(cbegin(), cend(), __v.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003264 swap(__v);
3265 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003266 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003267 }
3268 else
3269 __size_ = __sz;
3270}
3271
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003272template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003273void
Howard Hinnant1c936782011-06-03 19:40:40 +00003274vector<bool, _Allocator>::flip() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003275{
3276 // do middle whole words
3277 size_type __n = __size_;
3278 __storage_pointer __p = __begin_;
3279 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3280 *__p = ~*__p;
3281 // do last partial word
3282 if (__n > 0)
3283 {
3284 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3285 __storage_type __b = *__p & __m;
3286 *__p &= ~__m;
3287 *__p |= ~__b & __m;
3288 }
3289}
3290
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003291template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003292bool
3293vector<bool, _Allocator>::__invariants() const
3294{
Howard Hinnant76053d72013-06-27 19:35:32 +00003295 if (this->__begin_ == nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003296 {
3297 if (this->__size_ != 0 || this->__cap() != 0)
3298 return false;
3299 }
3300 else
3301 {
3302 if (this->__cap() == 0)
3303 return false;
3304 if (this->__size_ > this->capacity())
3305 return false;
3306 }
3307 return true;
3308}
3309
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003310template <class _Allocator>
Howard Hinnantc51e1022010-05-11 19:42:16 +00003311size_t
Howard Hinnant1c936782011-06-03 19:40:40 +00003312vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003313{
3314 size_t __h = 0;
3315 // do middle whole words
3316 size_type __n = __size_;
3317 __storage_pointer __p = __begin_;
3318 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3319 __h ^= *__p;
3320 // do last partial word
3321 if (__n > 0)
3322 {
3323 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3324 __h ^= *__p & __m;
3325 }
3326 return __h;
3327}
3328
3329template <class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00003330struct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003331 : public unary_function<vector<bool, _Allocator>, size_t>
3332{
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003333 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c936782011-06-03 19:40:40 +00003334 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003335 {return __vec.__hash_code();}
3336};
3337
3338template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003339inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003340bool
3341operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3342{
3343 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003344 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003345}
3346
3347template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003348inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003349bool
3350operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3351{
3352 return !(__x == __y);
3353}
3354
3355template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003356inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003357bool
3358operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3359{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003360 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003361}
3362
3363template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003364inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003365bool
3366operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3367{
3368 return __y < __x;
3369}
3370
3371template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003372inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003373bool
3374operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3375{
3376 return !(__x < __y);
3377}
3378
3379template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003380inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003381bool
3382operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3383{
3384 return !(__y < __x);
3385}
3386
3387template <class _Tp, class _Allocator>
Howard Hinnantb8a8ca22013-10-04 22:09:00 +00003388inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003389void
3390swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
Howard Hinnant1c936782011-06-03 19:40:40 +00003391 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00003392{
3393 __x.swap(__y);
3394}
3395
3396_LIBCPP_END_NAMESPACE_STD
3397
Eric Fiselierf4433a32017-05-31 22:07:49 +00003398_LIBCPP_POP_MACROS
3399
Howard Hinnantc51e1022010-05-11 19:42:16 +00003400#endif // _LIBCPP_VECTOR