blob: d1bc23e6a81801b8a55a75ad4424a9577d620406 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===------------------------------ vector --------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-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 Hinnantbc8d3f92010-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 Hinnant324bb032010-08-22 00:02:43 +000020template <class T, class Allocator = allocator<T> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000021class vector
Howard Hinnant324bb032010-08-22 00:02:43 +000022{
23public:
24 typedef T value_type;
Howard Hinnantbc8d3f92010-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 Hinnantd1d27a42011-06-03 19:40:40 +000037 vector()
38 noexcept(is_nothrow_default_constructible<allocator_type>::value);
39 explicit vector(const allocator_type&);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000040 explicit vector(size_type n);
41 vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
42 template <class InputIterator>
43 vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
44 vector(const vector& x);
Howard Hinnantd1d27a42011-06-03 19:40:40 +000045 vector(vector&& x)
46 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000047 vector(initializer_list<value_type> il);
48 vector(initializer_list<value_type> il, const allocator_type& a);
49 ~vector();
50 vector& operator=(const vector& x);
Howard Hinnantd1d27a42011-06-03 19:40:40 +000051 vector& operator=(vector&& x)
52 noexcept(
53 allocator_type::propagate_on_container_move_assignment::value &&
54 is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000055 vector& operator=(initializer_list<value_type> il);
56 template <class InputIterator>
57 void assign(InputIterator first, InputIterator last);
58 void assign(size_type n, const value_type& u);
59 void assign(initializer_list<value_type> il);
60
Howard Hinnantd1d27a42011-06-03 19:40:40 +000061 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000062
Howard Hinnantd1d27a42011-06-03 19:40:40 +000063 iterator begin() noexcept;
64 const_iterator begin() const noexcept;
65 iterator end() noexcept;
66 const_iterator end() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000067
Howard Hinnantd1d27a42011-06-03 19:40:40 +000068 reverse_iterator rbegin() noexcept;
69 const_reverse_iterator rbegin() const noexcept;
70 reverse_iterator rend() noexcept;
71 const_reverse_iterator rend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000072
Howard Hinnantd1d27a42011-06-03 19:40:40 +000073 const_iterator cbegin() const noexcept;
74 const_iterator cend() const noexcept;
75 const_reverse_iterator crbegin() const noexcept;
76 const_reverse_iterator crend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000077
Howard Hinnantd1d27a42011-06-03 19:40:40 +000078 size_type size() const noexcept;
79 size_type max_size() const noexcept;
80 size_type capacity() const noexcept;
81 bool empty() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000082 void reserve(size_type n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +000083 void shrink_to_fit() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000084
85 reference operator[](size_type n);
86 const_reference operator[](size_type n) const;
87 reference at(size_type n);
88 const_reference at(size_type n) const;
89
90 reference front();
91 const_reference front() const;
92 reference back();
93 const_reference back() const;
94
Howard Hinnantd1d27a42011-06-03 19:40:40 +000095 value_type* data() noexcept;
96 const value_type* data() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000097
98 void push_back(const value_type& x);
99 void push_back(value_type&& x);
100 template <class... Args>
101 void emplace_back(Args&&... args);
102 void pop_back();
103
104 template <class... Args> iterator emplace(const_iterator position, Args&&... args);
105 iterator insert(const_iterator position, const value_type& x);
106 iterator insert(const_iterator position, value_type&& x);
107 iterator insert(const_iterator position, size_type n, const value_type& x);
108 template <class InputIterator>
109 iterator insert(const_iterator position, InputIterator first, InputIterator last);
110 iterator insert(const_iterator position, initializer_list<value_type> il);
111
112 iterator erase(const_iterator position);
113 iterator erase(const_iterator first, const_iterator last);
114
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000115 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000116
117 void resize(size_type sz);
118 void resize(size_type sz, const value_type& c);
119
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000120 void swap(vector&)
121 noexcept(!allocator_type::propagate_on_container_swap::value ||
122 __is_nothrow_swappable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000123
124 bool __invariants() const;
Howard Hinnant324bb032010-08-22 00:02:43 +0000125};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000126
Howard Hinnant324bb032010-08-22 00:02:43 +0000127template <class Allocator = allocator<T> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000128class vector<bool, Allocator>
Howard Hinnant324bb032010-08-22 00:02:43 +0000129{
130public:
131 typedef bool value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000132 typedef Allocator allocator_type;
133 typedef implementation-defined iterator;
134 typedef implementation-defined const_iterator;
135 typedef typename allocator_type::size_type size_type;
136 typedef typename allocator_type::difference_type difference_type;
137 typedef iterator pointer;
138 typedef const_iterator const_pointer;
139 typedef std::reverse_iterator<iterator> reverse_iterator;
140 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
141
142 class reference
143 {
144 public:
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000145 reference(const reference&) noexcept;
146 operator bool() const noexcept;
147 reference& operator=(const bool x) noexcept;
148 reference& operator=(const reference& x) noexcept;
149 iterator operator&() const noexcept;
150 void flip() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000151 };
152
153 class const_reference
154 {
155 public:
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000156 const_reference(const reference&) noexcept;
157 operator bool() const noexcept;
158 const_iterator operator&() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000159 };
160
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000161 vector()
162 noexcept(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnant9cbee432011-09-02 20:42:31 +0000163 explicit vector(const allocator_type&);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000164 explicit vector(size_type n, const value_type& value = value_type(), const allocator_type& = allocator_type());
165 template <class InputIterator>
166 vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
167 vector(const vector& x);
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000168 vector(vector&& x)
169 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000170 vector(initializer_list<value_type> il);
171 vector(initializer_list<value_type> il, const allocator_type& a);
172 ~vector();
173 vector& operator=(const vector& x);
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000174 vector& operator=(vector&& x)
175 noexcept(
176 allocator_type::propagate_on_container_move_assignment::value &&
177 is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000178 vector& operator=(initializer_list<value_type> il);
179 template <class InputIterator>
180 void assign(InputIterator first, InputIterator last);
181 void assign(size_type n, const value_type& u);
182 void assign(initializer_list<value_type> il);
183
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000184 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000185
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000186 iterator begin() noexcept;
187 const_iterator begin() const noexcept;
188 iterator end() noexcept;
189 const_iterator end() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000190
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000191 reverse_iterator rbegin() noexcept;
192 const_reverse_iterator rbegin() const noexcept;
193 reverse_iterator rend() noexcept;
194 const_reverse_iterator rend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000195
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000196 const_iterator cbegin() const noexcept;
197 const_iterator cend() const noexcept;
198 const_reverse_iterator crbegin() const noexcept;
199 const_reverse_iterator crend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000200
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000201 size_type size() const noexcept;
202 size_type max_size() const noexcept;
203 size_type capacity() const noexcept;
204 bool empty() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000205 void reserve(size_type n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000206 void shrink_to_fit() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000207
208 reference operator[](size_type n);
209 const_reference operator[](size_type n) const;
210 reference at(size_type n);
211 const_reference at(size_type n) const;
212
213 reference front();
214 const_reference front() const;
215 reference back();
216 const_reference back() const;
217
218 void push_back(const value_type& x);
219 void pop_back();
220
221 iterator insert(const_iterator position, const value_type& x);
222 iterator insert(const_iterator position, size_type n, const value_type& x);
223 template <class InputIterator>
224 iterator insert(const_iterator position, InputIterator first, InputIterator last);
225 iterator insert(const_iterator position, initializer_list<value_type> il);
226
227 iterator erase(const_iterator position);
228 iterator erase(const_iterator first, const_iterator last);
229
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000230 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000231
232 void resize(size_type sz);
233 void resize(size_type sz, value_type x);
234
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000235 void swap(vector&)
236 noexcept(!allocator_type::propagate_on_container_swap::value ||
237 __is_nothrow_swappable<allocator_type>::value);
238 void flip() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000239
240 bool __invariants() const;
Howard Hinnant324bb032010-08-22 00:02:43 +0000241};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000242
243template <class Allocator> struct hash<std::vector<bool, Allocator>>;
244
245template <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
246template <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
247template <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
248template <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
249template <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
250template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
251
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000252template <class T, class Allocator>
253void swap(vector<T,Allocator>& x, vector<T,Allocator>& y)
254 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000255
256} // std
257
258*/
259
260#include <__config>
261#include <__bit_reference>
262#include <type_traits>
263#include <climits>
264#include <limits>
265#include <initializer_list>
266#include <memory>
267#include <stdexcept>
268#include <algorithm>
269#include <cstring>
270#include <__split_buffer>
271#include <__functional_base>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000272
Howard Hinnant66c6f972011-11-29 16:45:27 +0000273#include <__undef_min_max>
274
Howard Hinnant08e17472011-10-17 20:05:10 +0000275#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000276#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000277#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000278
279_LIBCPP_BEGIN_NAMESPACE_STD
280
281template <bool>
282class __vector_base_common
283{
284protected:
285 _LIBCPP_ALWAYS_INLINE __vector_base_common() {}
286 void __throw_length_error() const;
287 void __throw_out_of_range() const;
288};
289
290template <bool __b>
291void
292__vector_base_common<__b>::__throw_length_error() const
293{
294#ifndef _LIBCPP_NO_EXCEPTIONS
295 throw length_error("vector");
296#else
297 assert(!"vector length_error");
298#endif
299}
300
301template <bool __b>
302void
303__vector_base_common<__b>::__throw_out_of_range() const
304{
305#ifndef _LIBCPP_NO_EXCEPTIONS
306 throw out_of_range("vector");
307#else
308 assert(!"vector out_of_range");
309#endif
310}
311
Howard Hinnant78b68282011-10-22 20:59:45 +0000312#ifdef _MSC_VER
313#pragma warning( push )
314#pragma warning( disable: 4231 )
315#endif // _MSC_VER
Howard Hinnantff926772012-11-06 21:08:48 +0000316_LIBCPP_EXTERN_TEMPLATE(class __vector_base_common<true>)
Howard Hinnant78b68282011-10-22 20:59:45 +0000317#ifdef _MSC_VER
318#pragma warning( pop )
319#endif // _MSC_VER
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000320
321template <class _Tp, class _Allocator>
322class __vector_base
323 : protected __vector_base_common<true>
324{
325protected:
Howard Hinnant324bb032010-08-22 00:02:43 +0000326 typedef _Tp value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000327 typedef _Allocator allocator_type;
328 typedef allocator_traits<allocator_type> __alloc_traits;
329 typedef value_type& reference;
330 typedef const value_type& const_reference;
331 typedef typename __alloc_traits::size_type size_type;
332 typedef typename __alloc_traits::difference_type difference_type;
333 typedef typename __alloc_traits::pointer pointer;
334 typedef typename __alloc_traits::const_pointer const_pointer;
335 typedef pointer iterator;
336 typedef const_pointer const_iterator;
337
338 pointer __begin_;
339 pointer __end_;
340 __compressed_pair<pointer, allocator_type> __end_cap_;
341
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000342 _LIBCPP_INLINE_VISIBILITY
343 allocator_type& __alloc() _NOEXCEPT
344 {return __end_cap_.second();}
345 _LIBCPP_INLINE_VISIBILITY
346 const allocator_type& __alloc() const _NOEXCEPT
347 {return __end_cap_.second();}
348 _LIBCPP_INLINE_VISIBILITY
349 pointer& __end_cap() _NOEXCEPT
350 {return __end_cap_.first();}
351 _LIBCPP_INLINE_VISIBILITY
352 const pointer& __end_cap() const _NOEXCEPT
353 {return __end_cap_.first();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000354
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000355 _LIBCPP_INLINE_VISIBILITY
356 __vector_base()
357 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000358 _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000359 ~__vector_base();
360
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000361 _LIBCPP_INLINE_VISIBILITY
362 void clear() _NOEXCEPT {__destruct_at_end(__begin_);}
363 _LIBCPP_INLINE_VISIBILITY
364 size_type capacity() const _NOEXCEPT
365 {return static_cast<size_type>(__end_cap() - __begin_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000366
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000367 _LIBCPP_INLINE_VISIBILITY
368 void __destruct_at_end(const_pointer __new_last) _NOEXCEPT
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000369 {__destruct_at_end(__new_last, false_type());}
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000370 _LIBCPP_INLINE_VISIBILITY
371 void __destruct_at_end(const_pointer __new_last, false_type) _NOEXCEPT;
372 _LIBCPP_INLINE_VISIBILITY
373 void __destruct_at_end(const_pointer __new_last, true_type) _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000374
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000375 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000376 void __copy_assign_alloc(const __vector_base& __c)
377 {__copy_assign_alloc(__c, integral_constant<bool,
378 __alloc_traits::propagate_on_container_copy_assignment::value>());}
379
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000380 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000381 void __move_assign_alloc(__vector_base& __c)
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000382 _NOEXCEPT_(
383 !__alloc_traits::propagate_on_container_move_assignment::value ||
384 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000385 {__move_assign_alloc(__c, integral_constant<bool,
386 __alloc_traits::propagate_on_container_move_assignment::value>());}
387
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000388 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000389 static void __swap_alloc(allocator_type& __x, allocator_type& __y)
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000390 _NOEXCEPT_(
391 !__alloc_traits::propagate_on_container_swap::value ||
392 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000393 {__swap_alloc(__x, __y, integral_constant<bool,
394 __alloc_traits::propagate_on_container_swap::value>());}
395private:
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000396 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000397 void __copy_assign_alloc(const __vector_base& __c, true_type)
398 {
399 if (__alloc() != __c.__alloc())
400 {
401 clear();
402 __alloc_traits::deallocate(__alloc(), __begin_, capacity());
403 __begin_ = __end_ = __end_cap() = nullptr;
404 }
405 __alloc() = __c.__alloc();
406 }
407
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000408 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +0000409 void __copy_assign_alloc(const __vector_base&, false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000410 {}
411
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000412 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9cbee432011-09-02 20:42:31 +0000413 void __move_assign_alloc(__vector_base& __c, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000414 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000415 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000416 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000417 }
418
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000419 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +0000420 void __move_assign_alloc(__vector_base&, false_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000421 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000422 {}
423
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000424 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000425 static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000426 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000427 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000428 using _VSTD::swap;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000429 swap(__x, __y);
430 }
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000431 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +0000432 static void __swap_alloc(allocator_type&, allocator_type&, false_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000433 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000434 {}
435};
436
437template <class _Tp, class _Allocator>
438_LIBCPP_INLINE_VISIBILITY inline
439void
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000440__vector_base<_Tp, _Allocator>::__destruct_at_end(const_pointer __new_last, false_type) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000441{
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000442 while (__new_last != __end_)
Howard Hinnant635bbbb2013-02-07 15:31:44 +0000443 __alloc_traits::destroy(__alloc(), const_cast<pointer>(--__end_));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000444}
445
446template <class _Tp, class _Allocator>
447_LIBCPP_INLINE_VISIBILITY inline
448void
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000449__vector_base<_Tp, _Allocator>::__destruct_at_end(const_pointer __new_last, true_type) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000450{
Howard Hinnant635bbbb2013-02-07 15:31:44 +0000451 __end_ = const_cast<pointer>(__new_last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000452}
453
454template <class _Tp, class _Allocator>
455_LIBCPP_INLINE_VISIBILITY inline
456__vector_base<_Tp, _Allocator>::__vector_base()
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000457 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000458 : __begin_(0),
459 __end_(0),
460 __end_cap_(0)
461{
462}
463
464template <class _Tp, class _Allocator>
465_LIBCPP_INLINE_VISIBILITY inline
466__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a)
467 : __begin_(0),
468 __end_(0),
469 __end_cap_(0, __a)
470{
471}
472
473template <class _Tp, class _Allocator>
474__vector_base<_Tp, _Allocator>::~__vector_base()
475{
476 if (__begin_ != 0)
477 {
478 clear();
479 __alloc_traits::deallocate(__alloc(), __begin_, capacity());
480 }
481}
482
483template <class _Tp, class _Allocator = allocator<_Tp> >
Howard Hinnant83eade62013-03-06 23:30:19 +0000484class _LIBCPP_TYPE_VIS vector
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000485 : private __vector_base<_Tp, _Allocator>
486{
487private:
488 typedef __vector_base<_Tp, _Allocator> __base;
Howard Hinnant324bb032010-08-22 00:02:43 +0000489public:
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000490 typedef vector __self;
Howard Hinnant324bb032010-08-22 00:02:43 +0000491 typedef _Tp value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000492 typedef _Allocator allocator_type;
493 typedef typename __base::__alloc_traits __alloc_traits;
494 typedef typename __base::reference reference;
495 typedef typename __base::const_reference const_reference;
496 typedef typename __base::size_type size_type;
497 typedef typename __base::difference_type difference_type;
498 typedef typename __base::pointer pointer;
499 typedef typename __base::const_pointer const_pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000500 typedef __wrap_iter<pointer> iterator;
501 typedef __wrap_iter<const_pointer> const_iterator;
Howard Hinnant0949eed2011-06-30 21:18:19 +0000502 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
503 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000504
Howard Hinnant02d5e182013-03-26 19:04:56 +0000505 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
506 "Allocator::value_type must be same type as value_type");
507
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000508 _LIBCPP_INLINE_VISIBILITY
509 vector()
510 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant7a563db2011-09-14 18:33:51 +0000511 {
Howard Hinnantabe26282011-09-16 17:29:17 +0000512#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000513 __get_db()->__insert_c(this);
514#endif
515 }
516 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
517 : __base(__a)
518 {
Howard Hinnantabe26282011-09-16 17:29:17 +0000519#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000520 __get_db()->__insert_c(this);
521#endif
522 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000523 explicit vector(size_type __n);
524 vector(size_type __n, const_reference __x);
525 vector(size_type __n, const_reference __x, const allocator_type& __a);
526 template <class _InputIterator>
527 vector(_InputIterator __first, _InputIterator __last,
528 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant742fecb2013-03-28 17:44:32 +0000529 !__is_forward_iterator<_InputIterator>::value &&
530 is_constructible<
531 value_type,
532 typename iterator_traits<_InputIterator>::reference>::value>::type* = 0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000533 template <class _InputIterator>
534 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
535 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant742fecb2013-03-28 17:44:32 +0000536 !__is_forward_iterator<_InputIterator>::value &&
537 is_constructible<
538 value_type,
539 typename iterator_traits<_InputIterator>::reference>::value>::type* = 0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000540 template <class _ForwardIterator>
541 vector(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant742fecb2013-03-28 17:44:32 +0000542 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
543 is_constructible<
544 value_type,
545 typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000546 template <class _ForwardIterator>
547 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant742fecb2013-03-28 17:44:32 +0000548 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
549 is_constructible<
550 value_type,
551 typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0);
Howard Hinnante3e32912011-08-12 21:56:02 +0000552#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000554 vector(initializer_list<value_type> __il);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000556 vector(initializer_list<value_type> __il, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +0000557#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantabe26282011-09-16 17:29:17 +0000558#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a563db2011-09-14 18:33:51 +0000560 ~vector()
561 {
562 __get_db()->__erase_c(this);
563 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000564#endif
565
566 vector(const vector& __x);
567 vector(const vector& __x, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000569 vector& operator=(const vector& __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000570#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000572 vector(vector&& __x)
573 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000575 vector(vector&& __x, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000576 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000577 vector& operator=(vector&& __x)
578 _NOEXCEPT_(
579 __alloc_traits::propagate_on_container_move_assignment::value &&
580 is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000581#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02 +0000582#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000583 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000584 vector& operator=(initializer_list<value_type> __il)
585 {assign(__il.begin(), __il.end()); return *this;}
Howard Hinnante3e32912011-08-12 21:56:02 +0000586#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000587
588 template <class _InputIterator>
589 typename enable_if
590 <
591 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant742fecb2013-03-28 17:44:32 +0000592 !__is_forward_iterator<_InputIterator>::value &&
593 is_constructible<
594 value_type,
595 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000596 void
597 >::type
598 assign(_InputIterator __first, _InputIterator __last);
599 template <class _ForwardIterator>
600 typename enable_if
601 <
Howard Hinnant742fecb2013-03-28 17:44:32 +0000602 __is_forward_iterator<_ForwardIterator>::value &&
603 is_constructible<
604 value_type,
605 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000606 void
607 >::type
608 assign(_ForwardIterator __first, _ForwardIterator __last);
609
610 void assign(size_type __n, const_reference __u);
Howard Hinnante3e32912011-08-12 21:56:02 +0000611#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000613 void assign(initializer_list<value_type> __il)
614 {assign(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +0000615#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000616
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000617 _LIBCPP_INLINE_VISIBILITY
618 allocator_type get_allocator() const _NOEXCEPT
619 {return this->__alloc();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000620
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000621 _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT;
622 _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT;
623 _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT;
624 _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000625
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000626 _LIBCPP_INLINE_VISIBILITY
627 reverse_iterator rbegin() _NOEXCEPT
628 {return reverse_iterator(end());}
629 _LIBCPP_INLINE_VISIBILITY
630 const_reverse_iterator rbegin() const _NOEXCEPT
631 {return const_reverse_iterator(end());}
632 _LIBCPP_INLINE_VISIBILITY
633 reverse_iterator rend() _NOEXCEPT
634 {return reverse_iterator(begin());}
635 _LIBCPP_INLINE_VISIBILITY
636 const_reverse_iterator rend() const _NOEXCEPT
637 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000638
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000639 _LIBCPP_INLINE_VISIBILITY
640 const_iterator cbegin() const _NOEXCEPT
641 {return begin();}
642 _LIBCPP_INLINE_VISIBILITY
643 const_iterator cend() const _NOEXCEPT
644 {return end();}
645 _LIBCPP_INLINE_VISIBILITY
646 const_reverse_iterator crbegin() const _NOEXCEPT
647 {return rbegin();}
648 _LIBCPP_INLINE_VISIBILITY
649 const_reverse_iterator crend() const _NOEXCEPT
650 {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000651
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000652 _LIBCPP_INLINE_VISIBILITY
653 size_type size() const _NOEXCEPT
654 {return static_cast<size_type>(this->__end_ - this->__begin_);}
655 _LIBCPP_INLINE_VISIBILITY
656 size_type capacity() const _NOEXCEPT
657 {return __base::capacity();}
658 _LIBCPP_INLINE_VISIBILITY
659 bool empty() const _NOEXCEPT
660 {return this->__begin_ == this->__end_;}
661 size_type max_size() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000662 void reserve(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000663 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000664
665 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n);
666 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const;
667 reference at(size_type __n);
668 const_reference at(size_type __n) const;
669
Howard Hinnant7a563db2011-09-14 18:33:51 +0000670 _LIBCPP_INLINE_VISIBILITY reference front()
671 {
672 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
673 return *this->__begin_;
674 }
675 _LIBCPP_INLINE_VISIBILITY const_reference front() const
676 {
677 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
678 return *this->__begin_;
679 }
680 _LIBCPP_INLINE_VISIBILITY reference back()
681 {
682 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
683 return *(this->__end_ - 1);
684 }
685 _LIBCPP_INLINE_VISIBILITY const_reference back() const
686 {
687 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
688 return *(this->__end_ - 1);
689 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000690
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000691 _LIBCPP_INLINE_VISIBILITY
692 value_type* data() _NOEXCEPT
Howard Hinnant0949eed2011-06-30 21:18:19 +0000693 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000694 _LIBCPP_INLINE_VISIBILITY
695 const value_type* data() const _NOEXCEPT
Howard Hinnant0949eed2011-06-30 21:18:19 +0000696 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000697
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000698 _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000699#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000700 _LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000701#ifndef _LIBCPP_HAS_NO_VARIADICS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000702 template <class... _Args>
703 void emplace_back(_Args&&... __args);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000704#endif // _LIBCPP_HAS_NO_VARIADICS
705#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000706 void pop_back();
707
708 iterator insert(const_iterator __position, const_reference __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000709#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000710 iterator insert(const_iterator __position, value_type&& __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000711#ifndef _LIBCPP_HAS_NO_VARIADICS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000712 template <class... _Args>
713 iterator emplace(const_iterator __position, _Args&&... __args);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000714#endif // _LIBCPP_HAS_NO_VARIADICS
715#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000716 iterator insert(const_iterator __position, size_type __n, const_reference __x);
717 template <class _InputIterator>
718 typename enable_if
719 <
720 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant742fecb2013-03-28 17:44:32 +0000721 !__is_forward_iterator<_InputIterator>::value &&
722 is_constructible<
723 value_type,
724 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000725 iterator
726 >::type
727 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
728 template <class _ForwardIterator>
729 typename enable_if
730 <
Howard Hinnant742fecb2013-03-28 17:44:32 +0000731 __is_forward_iterator<_ForwardIterator>::value &&
732 is_constructible<
733 value_type,
734 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000735 iterator
736 >::type
737 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +0000738#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000739 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000740 iterator insert(const_iterator __position, initializer_list<value_type> __il)
741 {return insert(__position, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +0000742#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000743
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000744 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000745 iterator erase(const_iterator __first, const_iterator __last);
746
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000747 _LIBCPP_INLINE_VISIBILITY
748 void clear() _NOEXCEPT
Howard Hinnant7a563db2011-09-14 18:33:51 +0000749 {
750 __base::clear();
751 __invalidate_all_iterators();
752 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000753
754 void resize(size_type __sz);
755 void resize(size_type __sz, const_reference __x);
756
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000757 void swap(vector&)
758 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
759 __is_nothrow_swappable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000760
761 bool __invariants() const;
762
Howard Hinnantabe26282011-09-16 17:29:17 +0000763#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000764
765 bool __dereferenceable(const const_iterator* __i) const;
766 bool __decrementable(const const_iterator* __i) const;
767 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
768 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
769
Howard Hinnantabe26282011-09-16 17:29:17 +0000770#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000771
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000772private:
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000773 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000774 void allocate(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000775 void deallocate() _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000776 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
Howard Hinnant04240d92011-01-04 19:53:31 +0000777 void __construct_at_end(size_type __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000778 void __construct_at_end(size_type __n, const_reference __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000779 template <class _ForwardIterator>
780 typename enable_if
781 <
782 __is_forward_iterator<_ForwardIterator>::value,
783 void
784 >::type
785 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
786 void __move_construct_at_end(pointer __first, pointer __last);
787 void __append(size_type __n);
788 void __append(size_type __n, const_reference __x);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000789 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000790 iterator __make_iter(pointer __p) _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000791 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000792 const_iterator __make_iter(const_pointer __p) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000793 void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v);
794 pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p);
795 void __move_range(pointer __from_s, pointer __from_e, pointer __to);
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000796 void __move_assign(vector& __c, true_type)
797 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000798 void __move_assign(vector& __c, false_type);
Howard Hinnant7a563db2011-09-14 18:33:51 +0000799 _LIBCPP_INLINE_VISIBILITY
800 void __destruct_at_end(const_pointer __new_last) _NOEXCEPT
801 {
Howard Hinnantabe26282011-09-16 17:29:17 +0000802#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000803 __c_node* __c = __get_db()->__find_c_and_lock(this);
804 for (__i_node** __p = __c->end_; __p != __c->beg_; )
805 {
806 --__p;
807 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
808 if (__i->base() > __new_last)
809 {
810 (*__p)->__c_ = nullptr;
811 if (--__c->end_ != __p)
812 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
813 }
814 }
815 __get_db()->unlock();
816#endif
817 __base::__destruct_at_end(__new_last);
818 }
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000819 template <class _Up>
820 void
821#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
822 __push_back_slow_path(_Up&& __x);
823#else
824 __push_back_slow_path(_Up& __x);
825#endif
Howard Hinnant0438ea22012-02-26 15:30:12 +0000826#if !defined(_LIBCPP_HAS_NO_VARIADICS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
827 template <class... _Args>
828 void
829 __emplace_back_slow_path(_Args&&... __args);
830#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000831};
832
833template <class _Tp, class _Allocator>
834void
835vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)
836{
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000837 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
Howard Hinnant0949eed2011-06-30 21:18:19 +0000838 _VSTD::swap(this->__begin_, __v.__begin_);
839 _VSTD::swap(this->__end_, __v.__end_);
840 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000841 __v.__first_ = __v.__begin_;
842 __invalidate_all_iterators();
843}
844
845template <class _Tp, class _Allocator>
846typename vector<_Tp, _Allocator>::pointer
847vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
848{
849 pointer __r = __v.__begin_;
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000850 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, __p, __v.__begin_);
851 __alloc_traits::__construct_forward(this->__alloc(), __p, this->__end_, __v.__end_);
Howard Hinnant0949eed2011-06-30 21:18:19 +0000852 _VSTD::swap(this->__begin_, __v.__begin_);
853 _VSTD::swap(this->__end_, __v.__end_);
854 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000855 __v.__first_ = __v.__begin_;
856 __invalidate_all_iterators();
857 return __r;
858}
859
860// Allocate space for __n objects
861// throws length_error if __n > max_size()
862// throws (probably bad_alloc) if memory run out
863// Precondition: __begin_ == __end_ == __end_cap() == 0
864// Precondition: __n > 0
865// Postcondition: capacity() == __n
866// Postcondition: size() == 0
867template <class _Tp, class _Allocator>
868void
869vector<_Tp, _Allocator>::allocate(size_type __n)
870{
871 if (__n > max_size())
872 this->__throw_length_error();
873 this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
874 this->__end_cap() = this->__begin_ + __n;
875}
876
877template <class _Tp, class _Allocator>
878void
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000879vector<_Tp, _Allocator>::deallocate() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000880{
881 if (this->__begin_ != 0)
882 {
883 clear();
884 __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000885 this->__begin_ = this->__end_ = this->__end_cap() = 0;
886 }
887}
888
889template <class _Tp, class _Allocator>
890typename vector<_Tp, _Allocator>::size_type
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000891vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000892{
Sean Hunt110b8bf2011-07-29 23:31:58 +0000893 return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()), numeric_limits<size_type>::max() / 2); // end() >= begin(), always
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000894}
895
896// Precondition: __new_size > capacity()
897template <class _Tp, class _Allocator>
898_LIBCPP_INLINE_VISIBILITY inline
899typename vector<_Tp, _Allocator>::size_type
900vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
901{
902 const size_type __ms = max_size();
903 if (__new_size > __ms)
904 this->__throw_length_error();
905 const size_type __cap = capacity();
906 if (__cap >= __ms / 2)
907 return __ms;
Sean Hunt110b8bf2011-07-29 23:31:58 +0000908 return _VSTD::max<size_type>(2*__cap, __new_size);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000909}
910
911// Default constructs __n objects starting at __end_
912// throws if construction throws
913// Precondition: __n > 0
914// Precondition: size() + __n <= capacity()
915// Postcondition: size() == size() + __n
916template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000917void
918vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
919{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000920 allocator_type& __a = this->__alloc();
921 do
922 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000923 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000924 ++this->__end_;
925 --__n;
926 } while (__n > 0);
927}
928
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000929// Copy constructs __n objects starting at __end_ from __x
930// throws if construction throws
931// Precondition: __n > 0
932// Precondition: size() + __n <= capacity()
933// Postcondition: size() == old size() + __n
934// Postcondition: [i] == __x for all i in [size() - __n, __n)
935template <class _Tp, class _Allocator>
936_LIBCPP_INLINE_VISIBILITY inline
937void
938vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
939{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000940 allocator_type& __a = this->__alloc();
941 do
942 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000943 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000944 ++this->__end_;
945 --__n;
946 } while (__n > 0);
947}
948
949template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000950template <class _ForwardIterator>
951typename enable_if
952<
953 __is_forward_iterator<_ForwardIterator>::value,
954 void
955>::type
956vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
957{
958 allocator_type& __a = this->__alloc();
959 for (; __first != __last; ++__first)
960 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000961 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), *__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000962 ++this->__end_;
963 }
964}
965
966template <class _Tp, class _Allocator>
967void
968vector<_Tp, _Allocator>::__move_construct_at_end(pointer __first, pointer __last)
969{
970 allocator_type& __a = this->__alloc();
971 for (; __first != __last; ++__first)
972 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000973 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
974 _VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000975 ++this->__end_;
976 }
977}
978
979// Default constructs __n objects starting at __end_
980// throws if construction throws
981// Postcondition: size() == size() + __n
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000982// Exception safety: strong.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000983template <class _Tp, class _Allocator>
984void
985vector<_Tp, _Allocator>::__append(size_type __n)
986{
987 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
988 this->__construct_at_end(__n);
989 else
990 {
991 allocator_type& __a = this->__alloc();
992 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
993 __v.__construct_at_end(__n);
994 __swap_out_circular_buffer(__v);
995 }
996}
997
998// Default constructs __n objects starting at __end_
999// throws if construction throws
1000// Postcondition: size() == size() + __n
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001001// Exception safety: strong.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001002template <class _Tp, class _Allocator>
1003void
1004vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
1005{
1006 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1007 this->__construct_at_end(__n, __x);
1008 else
1009 {
1010 allocator_type& __a = this->__alloc();
1011 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1012 __v.__construct_at_end(__n, __x);
1013 __swap_out_circular_buffer(__v);
1014 }
1015}
1016
1017template <class _Tp, class _Allocator>
1018vector<_Tp, _Allocator>::vector(size_type __n)
1019{
Howard Hinnant0442b122011-09-16 18:41:29 +00001020#if _LIBCPP_DEBUG_LEVEL >= 2
1021 __get_db()->__insert_c(this);
1022#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001023 if (__n > 0)
1024 {
1025 allocate(__n);
1026 __construct_at_end(__n);
1027 }
1028}
1029
1030template <class _Tp, class _Allocator>
1031vector<_Tp, _Allocator>::vector(size_type __n, const_reference __x)
1032{
Howard Hinnant0442b122011-09-16 18:41:29 +00001033#if _LIBCPP_DEBUG_LEVEL >= 2
1034 __get_db()->__insert_c(this);
1035#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001036 if (__n > 0)
1037 {
1038 allocate(__n);
1039 __construct_at_end(__n, __x);
1040 }
1041}
1042
1043template <class _Tp, class _Allocator>
1044vector<_Tp, _Allocator>::vector(size_type __n, const_reference __x, const allocator_type& __a)
1045 : __base(__a)
1046{
Howard Hinnant0442b122011-09-16 18:41:29 +00001047#if _LIBCPP_DEBUG_LEVEL >= 2
1048 __get_db()->__insert_c(this);
1049#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001050 if (__n > 0)
1051 {
1052 allocate(__n);
1053 __construct_at_end(__n, __x);
1054 }
1055}
1056
1057template <class _Tp, class _Allocator>
1058template <class _InputIterator>
1059vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
1060 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant742fecb2013-03-28 17:44:32 +00001061 !__is_forward_iterator<_InputIterator>::value &&
1062 is_constructible<
1063 value_type,
1064 typename iterator_traits<_InputIterator>::reference>::value>::type*)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001065{
Howard Hinnantabe26282011-09-16 17:29:17 +00001066#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001067 __get_db()->__insert_c(this);
1068#endif
Howard Hinnant0442b122011-09-16 18:41:29 +00001069 for (; __first != __last; ++__first)
1070 push_back(*__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001071}
1072
1073template <class _Tp, class _Allocator>
1074template <class _InputIterator>
1075vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
1076 typename enable_if<__is_input_iterator <_InputIterator>::value &&
Howard Hinnant742fecb2013-03-28 17:44:32 +00001077 !__is_forward_iterator<_InputIterator>::value &&
1078 is_constructible<
1079 value_type,
1080 typename iterator_traits<_InputIterator>::reference>::value>::type*)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001081 : __base(__a)
1082{
Howard Hinnantabe26282011-09-16 17:29:17 +00001083#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001084 __get_db()->__insert_c(this);
1085#endif
Howard Hinnant0442b122011-09-16 18:41:29 +00001086 for (; __first != __last; ++__first)
1087 push_back(*__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001088}
1089
1090template <class _Tp, class _Allocator>
1091template <class _ForwardIterator>
1092vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant742fecb2013-03-28 17:44:32 +00001093 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1094 is_constructible<
1095 value_type,
1096 typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001097{
Howard Hinnant0442b122011-09-16 18:41:29 +00001098#if _LIBCPP_DEBUG_LEVEL >= 2
1099 __get_db()->__insert_c(this);
1100#endif
Howard Hinnant0949eed2011-06-30 21:18:19 +00001101 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001102 if (__n > 0)
1103 {
1104 allocate(__n);
1105 __construct_at_end(__first, __last);
1106 }
1107}
1108
1109template <class _Tp, class _Allocator>
1110template <class _ForwardIterator>
1111vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
Howard Hinnant742fecb2013-03-28 17:44:32 +00001112 typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1113 is_constructible<
1114 value_type,
1115 typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001116 : __base(__a)
1117{
Howard Hinnant0442b122011-09-16 18:41:29 +00001118#if _LIBCPP_DEBUG_LEVEL >= 2
1119 __get_db()->__insert_c(this);
1120#endif
Howard Hinnant0949eed2011-06-30 21:18:19 +00001121 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001122 if (__n > 0)
1123 {
1124 allocate(__n);
1125 __construct_at_end(__first, __last);
1126 }
1127}
1128
1129template <class _Tp, class _Allocator>
1130vector<_Tp, _Allocator>::vector(const vector& __x)
1131 : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
1132{
Howard Hinnant0442b122011-09-16 18:41:29 +00001133#if _LIBCPP_DEBUG_LEVEL >= 2
1134 __get_db()->__insert_c(this);
1135#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001136 size_type __n = __x.size();
1137 if (__n > 0)
1138 {
1139 allocate(__n);
1140 __construct_at_end(__x.__begin_, __x.__end_);
1141 }
1142}
1143
1144template <class _Tp, class _Allocator>
1145vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a)
1146 : __base(__a)
1147{
Howard Hinnant0442b122011-09-16 18:41:29 +00001148#if _LIBCPP_DEBUG_LEVEL >= 2
1149 __get_db()->__insert_c(this);
1150#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001151 size_type __n = __x.size();
1152 if (__n > 0)
1153 {
1154 allocate(__n);
1155 __construct_at_end(__x.__begin_, __x.__end_);
1156 }
1157}
1158
Howard Hinnant73d21a42010-09-04 23:28:19 +00001159#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001160
1161template <class _Tp, class _Allocator>
1162_LIBCPP_INLINE_VISIBILITY inline
1163vector<_Tp, _Allocator>::vector(vector&& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001164 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001165 : __base(_VSTD::move(__x.__alloc()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001166{
Howard Hinnantabe26282011-09-16 17:29:17 +00001167#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001168 __get_db()->__insert_c(this);
Howard Hinnante6125bd2011-09-19 16:34:29 +00001169 __get_db()->swap(this, &__x);
Howard Hinnant7a563db2011-09-14 18:33:51 +00001170#endif
Howard Hinnant0442b122011-09-16 18:41:29 +00001171 this->__begin_ = __x.__begin_;
1172 this->__end_ = __x.__end_;
1173 this->__end_cap() = __x.__end_cap();
1174 __x.__begin_ = __x.__end_ = __x.__end_cap() = 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001175}
1176
1177template <class _Tp, class _Allocator>
1178_LIBCPP_INLINE_VISIBILITY inline
1179vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a)
1180 : __base(__a)
1181{
Howard Hinnant0442b122011-09-16 18:41:29 +00001182#if _LIBCPP_DEBUG_LEVEL >= 2
1183 __get_db()->__insert_c(this);
1184#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001185 if (__a == __x.__alloc())
1186 {
1187 this->__begin_ = __x.__begin_;
1188 this->__end_ = __x.__end_;
1189 this->__end_cap() = __x.__end_cap();
1190 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnante6125bd2011-09-19 16:34:29 +00001191#if _LIBCPP_DEBUG_LEVEL >= 2
1192 __get_db()->swap(this, &__x);
1193#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001194 }
1195 else
1196 {
Howard Hinnant99968442011-11-29 18:15:50 +00001197 typedef move_iterator<iterator> _Ip;
1198 assign(_Ip(__x.begin()), _Ip(__x.end()));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001199 }
1200}
1201
Howard Hinnante3e32912011-08-12 21:56:02 +00001202#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1203
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001204template <class _Tp, class _Allocator>
1205_LIBCPP_INLINE_VISIBILITY inline
1206vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
1207{
Howard Hinnant0442b122011-09-16 18:41:29 +00001208#if _LIBCPP_DEBUG_LEVEL >= 2
1209 __get_db()->__insert_c(this);
1210#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001211 if (__il.size() > 0)
1212 {
1213 allocate(__il.size());
1214 __construct_at_end(__il.begin(), __il.end());
1215 }
1216}
1217
1218template <class _Tp, class _Allocator>
1219_LIBCPP_INLINE_VISIBILITY inline
1220vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
1221 : __base(__a)
1222{
Howard Hinnant0442b122011-09-16 18:41:29 +00001223#if _LIBCPP_DEBUG_LEVEL >= 2
1224 __get_db()->__insert_c(this);
1225#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001226 if (__il.size() > 0)
1227 {
1228 allocate(__il.size());
1229 __construct_at_end(__il.begin(), __il.end());
1230 }
1231}
1232
Howard Hinnante3e32912011-08-12 21:56:02 +00001233#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1234
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001235template <class _Tp, class _Allocator>
1236_LIBCPP_INLINE_VISIBILITY inline
1237vector<_Tp, _Allocator>&
1238vector<_Tp, _Allocator>::operator=(vector&& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001239 _NOEXCEPT_(
1240 __alloc_traits::propagate_on_container_move_assignment::value &&
1241 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001242{
1243 __move_assign(__x, integral_constant<bool,
1244 __alloc_traits::propagate_on_container_move_assignment::value>());
1245 return *this;
1246}
1247
1248template <class _Tp, class _Allocator>
1249void
1250vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
1251{
1252 if (__base::__alloc() != __c.__alloc())
1253 {
Howard Hinnant99968442011-11-29 18:15:50 +00001254 typedef move_iterator<iterator> _Ip;
1255 assign(_Ip(__c.begin()), _Ip(__c.end()));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001256 }
1257 else
1258 __move_assign(__c, true_type());
1259}
1260
1261template <class _Tp, class _Allocator>
1262void
1263vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001264 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001265{
1266 deallocate();
1267 this->__begin_ = __c.__begin_;
1268 this->__end_ = __c.__end_;
1269 this->__end_cap() = __c.__end_cap();
1270 __base::__move_assign_alloc(__c);
1271 __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
Howard Hinnante6125bd2011-09-19 16:34:29 +00001272#if _LIBCPP_DEBUG_LEVEL >= 2
1273 __get_db()->swap(this, &__c);
1274#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001275}
1276
Howard Hinnant73d21a42010-09-04 23:28:19 +00001277#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001278
1279template <class _Tp, class _Allocator>
1280_LIBCPP_INLINE_VISIBILITY inline
1281vector<_Tp, _Allocator>&
1282vector<_Tp, _Allocator>::operator=(const vector& __x)
1283{
1284 if (this != &__x)
1285 {
1286 __base::__copy_assign_alloc(__x);
1287 assign(__x.__begin_, __x.__end_);
1288 }
1289 return *this;
1290}
1291
1292template <class _Tp, class _Allocator>
1293template <class _InputIterator>
1294typename enable_if
1295<
1296 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant742fecb2013-03-28 17:44:32 +00001297 !__is_forward_iterator<_InputIterator>::value &&
1298 is_constructible<
1299 _Tp,
1300 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001301 void
1302>::type
1303vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1304{
1305 clear();
1306 for (; __first != __last; ++__first)
1307 push_back(*__first);
1308}
1309
1310template <class _Tp, class _Allocator>
1311template <class _ForwardIterator>
1312typename enable_if
1313<
Howard Hinnant742fecb2013-03-28 17:44:32 +00001314 __is_forward_iterator<_ForwardIterator>::value &&
1315 is_constructible<
1316 _Tp,
1317 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001318 void
1319>::type
1320vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
1321{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001322 typename iterator_traits<_ForwardIterator>::difference_type __new_size = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001323 if (static_cast<size_type>(__new_size) <= capacity())
1324 {
1325 _ForwardIterator __mid = __last;
1326 bool __growing = false;
1327 if (static_cast<size_type>(__new_size) > size())
1328 {
1329 __growing = true;
1330 __mid = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001331 _VSTD::advance(__mid, size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001332 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00001333 pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001334 if (__growing)
1335 __construct_at_end(__mid, __last);
1336 else
1337 this->__destruct_at_end(__m);
1338 }
1339 else
1340 {
1341 deallocate();
1342 allocate(__recommend(static_cast<size_type>(__new_size)));
1343 __construct_at_end(__first, __last);
1344 }
1345}
1346
1347template <class _Tp, class _Allocator>
1348void
1349vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
1350{
1351 if (__n <= capacity())
1352 {
1353 size_type __s = size();
Howard Hinnant0949eed2011-06-30 21:18:19 +00001354 _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001355 if (__n > __s)
1356 __construct_at_end(__n - __s, __u);
1357 else
Howard Hinnantadff4892010-05-24 17:49:41 +00001358 this->__destruct_at_end(this->__begin_ + __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001359 }
1360 else
1361 {
1362 deallocate();
1363 allocate(__recommend(static_cast<size_type>(__n)));
1364 __construct_at_end(__n, __u);
1365 }
1366}
1367
Howard Hinnant324bb032010-08-22 00:02:43 +00001368template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001369_LIBCPP_INLINE_VISIBILITY inline
1370typename vector<_Tp, _Allocator>::iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001371vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001372{
Howard Hinnantabe26282011-09-16 17:29:17 +00001373#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001374 return iterator(this, __p);
1375#else
1376 return iterator(__p);
1377#endif
1378}
1379
Howard Hinnant324bb032010-08-22 00:02:43 +00001380template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001381_LIBCPP_INLINE_VISIBILITY inline
1382typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001383vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001384{
Howard Hinnantabe26282011-09-16 17:29:17 +00001385#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001386 return const_iterator(this, __p);
1387#else
1388 return const_iterator(__p);
1389#endif
1390}
1391
Howard Hinnant324bb032010-08-22 00:02:43 +00001392template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001393_LIBCPP_INLINE_VISIBILITY inline
1394typename vector<_Tp, _Allocator>::iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001395vector<_Tp, _Allocator>::begin() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001396{
1397 return __make_iter(this->__begin_);
1398}
1399
Howard Hinnant324bb032010-08-22 00:02:43 +00001400template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001401_LIBCPP_INLINE_VISIBILITY inline
1402typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001403vector<_Tp, _Allocator>::begin() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001404{
1405 return __make_iter(this->__begin_);
1406}
1407
Howard Hinnant324bb032010-08-22 00:02:43 +00001408template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001409_LIBCPP_INLINE_VISIBILITY inline
1410typename vector<_Tp, _Allocator>::iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001411vector<_Tp, _Allocator>::end() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001412{
1413 return __make_iter(this->__end_);
1414}
1415
Howard Hinnant324bb032010-08-22 00:02:43 +00001416template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001417_LIBCPP_INLINE_VISIBILITY inline
1418typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001419vector<_Tp, _Allocator>::end() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001420{
1421 return __make_iter(this->__end_);
1422}
1423
Howard Hinnant324bb032010-08-22 00:02:43 +00001424template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001425_LIBCPP_INLINE_VISIBILITY inline
1426typename vector<_Tp, _Allocator>::reference
1427vector<_Tp, _Allocator>::operator[](size_type __n)
1428{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001429 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001430 return this->__begin_[__n];
1431}
1432
Howard Hinnant324bb032010-08-22 00:02:43 +00001433template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001434_LIBCPP_INLINE_VISIBILITY inline
1435typename vector<_Tp, _Allocator>::const_reference
1436vector<_Tp, _Allocator>::operator[](size_type __n) const
1437{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001438 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001439 return this->__begin_[__n];
1440}
1441
Howard Hinnant324bb032010-08-22 00:02:43 +00001442template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001443typename vector<_Tp, _Allocator>::reference
1444vector<_Tp, _Allocator>::at(size_type __n)
1445{
1446 if (__n >= size())
1447 this->__throw_out_of_range();
1448 return this->__begin_[__n];
1449}
1450
Howard Hinnant324bb032010-08-22 00:02:43 +00001451template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001452typename vector<_Tp, _Allocator>::const_reference
1453vector<_Tp, _Allocator>::at(size_type __n) const
1454{
1455 if (__n >= size())
1456 this->__throw_out_of_range();
1457 return this->__begin_[__n];
1458}
1459
1460template <class _Tp, class _Allocator>
1461void
1462vector<_Tp, _Allocator>::reserve(size_type __n)
1463{
1464 if (__n > capacity())
1465 {
1466 allocator_type& __a = this->__alloc();
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001467 __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001468 __swap_out_circular_buffer(__v);
1469 }
1470}
1471
1472template <class _Tp, class _Allocator>
1473void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001474vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001475{
1476 if (capacity() > size())
1477 {
1478#ifndef _LIBCPP_NO_EXCEPTIONS
1479 try
1480 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001481#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001482 allocator_type& __a = this->__alloc();
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001483 __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001484 __swap_out_circular_buffer(__v);
1485#ifndef _LIBCPP_NO_EXCEPTIONS
1486 }
1487 catch (...)
1488 {
1489 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001490#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001491 }
1492}
1493
1494template <class _Tp, class _Allocator>
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001495template <class _Up>
1496void
1497#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1498vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
1499#else
1500vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
1501#endif
1502{
1503 allocator_type& __a = this->__alloc();
1504 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1505 // __v.push_back(_VSTD::forward<_Up>(__x));
Howard Hinnantf619e232013-01-11 20:36:59 +00001506 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Up>(__x));
1507 __v.__end_++;
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001508 __swap_out_circular_buffer(__v);
1509}
1510
1511template <class _Tp, class _Allocator>
1512_LIBCPP_INLINE_VISIBILITY inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001513void
1514vector<_Tp, _Allocator>::push_back(const_reference __x)
1515{
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001516 if (this->__end_ != this->__end_cap())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001517 {
1518 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001519 _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001520 ++this->__end_;
1521 }
1522 else
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001523 __push_back_slow_path(__x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001524}
1525
Howard Hinnant73d21a42010-09-04 23:28:19 +00001526#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001527
1528template <class _Tp, class _Allocator>
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001529_LIBCPP_INLINE_VISIBILITY inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001530void
1531vector<_Tp, _Allocator>::push_back(value_type&& __x)
1532{
1533 if (this->__end_ < this->__end_cap())
1534 {
1535 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001536 _VSTD::__to_raw_pointer(this->__end_),
1537 _VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001538 ++this->__end_;
1539 }
1540 else
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001541 __push_back_slow_path(_VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001542}
1543
Howard Hinnant73d21a42010-09-04 23:28:19 +00001544#ifndef _LIBCPP_HAS_NO_VARIADICS
1545
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001546template <class _Tp, class _Allocator>
1547template <class... _Args>
1548void
Howard Hinnant0438ea22012-02-26 15:30:12 +00001549vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1550{
1551 allocator_type& __a = this->__alloc();
1552 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1553// __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantf619e232013-01-11 20:36:59 +00001554 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Args>(__args)...);
1555 __v.__end_++;
Howard Hinnant0438ea22012-02-26 15:30:12 +00001556 __swap_out_circular_buffer(__v);
1557}
1558
1559template <class _Tp, class _Allocator>
1560template <class... _Args>
1561_LIBCPP_INLINE_VISIBILITY inline
1562void
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001563vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1564{
1565 if (this->__end_ < this->__end_cap())
1566 {
1567 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001568 _VSTD::__to_raw_pointer(this->__end_),
1569 _VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001570 ++this->__end_;
1571 }
1572 else
Howard Hinnant0438ea22012-02-26 15:30:12 +00001573 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001574}
1575
Howard Hinnant73d21a42010-09-04 23:28:19 +00001576#endif // _LIBCPP_HAS_NO_VARIADICS
1577#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001578
1579template <class _Tp, class _Allocator>
1580_LIBCPP_INLINE_VISIBILITY inline
1581void
1582vector<_Tp, _Allocator>::pop_back()
1583{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001584 _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001585 this->__destruct_at_end(this->__end_ - 1);
1586}
1587
1588template <class _Tp, class _Allocator>
1589_LIBCPP_INLINE_VISIBILITY inline
1590typename vector<_Tp, _Allocator>::iterator
1591vector<_Tp, _Allocator>::erase(const_iterator __position)
1592{
Howard Hinnantabe26282011-09-16 17:29:17 +00001593#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001594 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1595 "vector::erase(iterator) called with an iterator not"
1596 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001597#endif
Howard Hinnant782da332013-03-25 22:12:26 +00001598 _LIBCPP_ASSERT(__position != end(),
1599 "vector::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnant635bbbb2013-02-07 15:31:44 +00001600 pointer __p = const_cast<pointer>(&*__position);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001601 iterator __r = __make_iter(__p);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001602 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001603 return __r;
1604}
1605
1606template <class _Tp, class _Allocator>
1607typename vector<_Tp, _Allocator>::iterator
1608vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1609{
Howard Hinnantabe26282011-09-16 17:29:17 +00001610#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001611 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
1612 "vector::erase(iterator, iterator) called with an iterator not"
1613 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001614#endif
Howard Hinnant7a563db2011-09-14 18:33:51 +00001615 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001616 pointer __p = this->__begin_ + (__first - begin());
1617 iterator __r = __make_iter(__p);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001618 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001619 return __r;
1620}
1621
1622template <class _Tp, class _Allocator>
1623void
1624vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1625{
1626 pointer __old_last = this->__end_;
1627 difference_type __n = __old_last - __to;
1628 for (pointer __i = __from_s + __n; __i < __from_e; ++__i, ++this->__end_)
1629 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001630 _VSTD::__to_raw_pointer(this->__end_),
1631 _VSTD::move(*__i));
1632 _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001633}
1634
1635template <class _Tp, class _Allocator>
1636typename vector<_Tp, _Allocator>::iterator
1637vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1638{
Howard Hinnantabe26282011-09-16 17:29:17 +00001639#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001640 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1641 "vector::insert(iterator, x) called with an iterator not"
1642 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001643#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001644 pointer __p = this->__begin_ + (__position - begin());
1645 if (this->__end_ < this->__end_cap())
1646 {
1647 if (__p == this->__end_)
1648 {
1649 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001650 _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001651 ++this->__end_;
1652 }
1653 else
1654 {
1655 __move_range(__p, this->__end_, __p + 1);
1656 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1657 if (__p <= __xr && __xr < this->__end_)
1658 ++__xr;
1659 *__p = *__xr;
1660 }
1661 }
1662 else
1663 {
1664 allocator_type& __a = this->__alloc();
1665 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1666 __v.push_back(__x);
1667 __p = __swap_out_circular_buffer(__v, __p);
1668 }
1669 return __make_iter(__p);
1670}
1671
Howard Hinnant73d21a42010-09-04 23:28:19 +00001672#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001673
1674template <class _Tp, class _Allocator>
1675typename vector<_Tp, _Allocator>::iterator
1676vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1677{
Howard Hinnantabe26282011-09-16 17:29:17 +00001678#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001679 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1680 "vector::insert(iterator, x) called with an iterator not"
1681 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001682#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001683 pointer __p = this->__begin_ + (__position - begin());
1684 if (this->__end_ < this->__end_cap())
1685 {
1686 if (__p == this->__end_)
1687 {
1688 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001689 _VSTD::__to_raw_pointer(this->__end_),
1690 _VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001691 ++this->__end_;
1692 }
1693 else
1694 {
1695 __move_range(__p, this->__end_, __p + 1);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001696 *__p = _VSTD::move(__x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001697 }
1698 }
1699 else
1700 {
1701 allocator_type& __a = this->__alloc();
1702 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001703 __v.push_back(_VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001704 __p = __swap_out_circular_buffer(__v, __p);
1705 }
1706 return __make_iter(__p);
1707}
1708
Howard Hinnant73d21a42010-09-04 23:28:19 +00001709#ifndef _LIBCPP_HAS_NO_VARIADICS
1710
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001711template <class _Tp, class _Allocator>
1712template <class... _Args>
1713typename vector<_Tp, _Allocator>::iterator
1714vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1715{
Howard Hinnantabe26282011-09-16 17:29:17 +00001716#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001717 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1718 "vector::emplace(iterator, x) called with an iterator not"
1719 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001720#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001721 pointer __p = this->__begin_ + (__position - begin());
1722 if (this->__end_ < this->__end_cap())
1723 {
1724 if (__p == this->__end_)
1725 {
1726 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001727 _VSTD::__to_raw_pointer(this->__end_),
1728 _VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001729 ++this->__end_;
1730 }
1731 else
1732 {
Howard Hinnanta58402a2012-07-08 23:23:04 +00001733 value_type __tmp(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001734 __move_range(__p, this->__end_, __p + 1);
Howard Hinnanta58402a2012-07-08 23:23:04 +00001735 *__p = _VSTD::move(__tmp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001736 }
1737 }
1738 else
1739 {
1740 allocator_type& __a = this->__alloc();
1741 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001742 __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001743 __p = __swap_out_circular_buffer(__v, __p);
1744 }
1745 return __make_iter(__p);
1746}
1747
Howard Hinnant73d21a42010-09-04 23:28:19 +00001748#endif // _LIBCPP_HAS_NO_VARIADICS
1749#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001750
1751template <class _Tp, class _Allocator>
1752typename vector<_Tp, _Allocator>::iterator
1753vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1754{
Howard Hinnantabe26282011-09-16 17:29:17 +00001755#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001756 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1757 "vector::insert(iterator, n, x) called with an iterator not"
1758 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001759#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001760 pointer __p = this->__begin_ + (__position - begin());
1761 if (__n > 0)
1762 {
1763 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1764 {
1765 size_type __old_n = __n;
1766 pointer __old_last = this->__end_;
1767 if (__n > static_cast<size_type>(this->__end_ - __p))
1768 {
1769 size_type __cx = __n - (this->__end_ - __p);
1770 __construct_at_end(__cx, __x);
1771 __n -= __cx;
1772 }
1773 if (__n > 0)
1774 {
1775 __move_range(__p, __old_last, __p + __old_n);
1776 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1777 if (__p <= __xr && __xr < this->__end_)
1778 __xr += __old_n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001779 _VSTD::fill_n(__p, __n, *__xr);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001780 }
1781 }
1782 else
1783 {
1784 allocator_type& __a = this->__alloc();
1785 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1786 __v.__construct_at_end(__n, __x);
1787 __p = __swap_out_circular_buffer(__v, __p);
1788 }
1789 }
1790 return __make_iter(__p);
1791}
1792
1793template <class _Tp, class _Allocator>
1794template <class _InputIterator>
1795typename enable_if
1796<
1797 __is_input_iterator <_InputIterator>::value &&
Howard Hinnant742fecb2013-03-28 17:44:32 +00001798 !__is_forward_iterator<_InputIterator>::value &&
1799 is_constructible<
1800 _Tp,
1801 typename iterator_traits<_InputIterator>::reference>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001802 typename vector<_Tp, _Allocator>::iterator
1803>::type
1804vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1805{
Howard Hinnantabe26282011-09-16 17:29:17 +00001806#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001807 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1808 "vector::insert(iterator, range) called with an iterator not"
1809 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001810#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001811 difference_type __off = __position - begin();
1812 pointer __p = this->__begin_ + __off;
1813 allocator_type& __a = this->__alloc();
1814 pointer __old_last = this->__end_;
1815 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1816 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00001817 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001818 *__first);
1819 ++this->__end_;
1820 }
1821 __split_buffer<value_type, allocator_type&> __v(__a);
1822 if (__first != __last)
1823 {
1824#ifndef _LIBCPP_NO_EXCEPTIONS
1825 try
1826 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001827#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001828 __v.__construct_at_end(__first, __last);
1829 difference_type __old_size = __old_last - this->__begin_;
1830 difference_type __old_p = __p - this->__begin_;
1831 reserve(__recommend(size() + __v.size()));
1832 __p = this->__begin_ + __old_p;
1833 __old_last = this->__begin_ + __old_size;
1834#ifndef _LIBCPP_NO_EXCEPTIONS
1835 }
1836 catch (...)
1837 {
1838 erase(__make_iter(__old_last), end());
1839 throw;
1840 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001841#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001842 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00001843 __p = _VSTD::rotate(__p, __old_last, this->__end_);
Howard Hinnant0442b122011-09-16 18:41:29 +00001844 insert(__make_iter(__p), make_move_iterator(__v.begin()),
1845 make_move_iterator(__v.end()));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001846 return begin() + __off;
1847}
1848
1849template <class _Tp, class _Allocator>
1850template <class _ForwardIterator>
1851typename enable_if
1852<
Howard Hinnant742fecb2013-03-28 17:44:32 +00001853 __is_forward_iterator<_ForwardIterator>::value &&
1854 is_constructible<
1855 _Tp,
1856 typename iterator_traits<_ForwardIterator>::reference>::value,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001857 typename vector<_Tp, _Allocator>::iterator
1858>::type
1859vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1860{
Howard Hinnantabe26282011-09-16 17:29:17 +00001861#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001862 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1863 "vector::insert(iterator, range) called with an iterator not"
1864 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001865#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001866 pointer __p = this->__begin_ + (__position - begin());
Howard Hinnant0949eed2011-06-30 21:18:19 +00001867 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001868 if (__n > 0)
1869 {
1870 if (__n <= this->__end_cap() - this->__end_)
1871 {
1872 size_type __old_n = __n;
1873 pointer __old_last = this->__end_;
1874 _ForwardIterator __m = __last;
1875 difference_type __dx = this->__end_ - __p;
1876 if (__n > __dx)
1877 {
1878 __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001879 _VSTD::advance(__m, this->__end_ - __p);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001880 __construct_at_end(__m, __last);
1881 __n = __dx;
1882 }
1883 if (__n > 0)
1884 {
1885 __move_range(__p, __old_last, __p + __old_n);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001886 _VSTD::copy(__first, __m, __p);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001887 }
1888 }
1889 else
1890 {
1891 allocator_type& __a = this->__alloc();
1892 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1893 __v.__construct_at_end(__first, __last);
1894 __p = __swap_out_circular_buffer(__v, __p);
1895 }
1896 }
1897 return __make_iter(__p);
1898}
1899
1900template <class _Tp, class _Allocator>
1901void
1902vector<_Tp, _Allocator>::resize(size_type __sz)
1903{
1904 size_type __cs = size();
1905 if (__cs < __sz)
1906 this->__append(__sz - __cs);
1907 else if (__cs > __sz)
1908 this->__destruct_at_end(this->__begin_ + __sz);
1909}
1910
1911template <class _Tp, class _Allocator>
1912void
1913vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
1914{
1915 size_type __cs = size();
1916 if (__cs < __sz)
1917 this->__append(__sz - __cs, __x);
1918 else if (__cs > __sz)
1919 this->__destruct_at_end(this->__begin_ + __sz);
1920}
1921
1922template <class _Tp, class _Allocator>
1923void
1924vector<_Tp, _Allocator>::swap(vector& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001925 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1926 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001927{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001928 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
1929 this->__alloc() == __x.__alloc(),
1930 "vector::swap: Either propagate_on_container_swap must be true"
1931 " or the allocators must compare equal");
Howard Hinnant0949eed2011-06-30 21:18:19 +00001932 _VSTD::swap(this->__begin_, __x.__begin_);
1933 _VSTD::swap(this->__end_, __x.__end_);
1934 _VSTD::swap(this->__end_cap(), __x.__end_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001935 __base::__swap_alloc(this->__alloc(), __x.__alloc());
Howard Hinnantabe26282011-09-16 17:29:17 +00001936#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001937 __get_db()->swap(this, &__x);
Howard Hinnantabe26282011-09-16 17:29:17 +00001938#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001939}
1940
Howard Hinnant324bb032010-08-22 00:02:43 +00001941template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001942bool
1943vector<_Tp, _Allocator>::__invariants() const
1944{
1945 if (this->__begin_ == 0)
1946 {
1947 if (this->__end_ != 0 || this->__end_cap() != 0)
1948 return false;
1949 }
1950 else
1951 {
1952 if (this->__begin_ > this->__end_)
1953 return false;
1954 if (this->__begin_ == this->__end_cap())
1955 return false;
1956 if (this->__end_ > this->__end_cap())
1957 return false;
1958 }
1959 return true;
1960}
1961
Howard Hinnantabe26282011-09-16 17:29:17 +00001962#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001963
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001964template <class _Tp, class _Allocator>
Howard Hinnant7a563db2011-09-14 18:33:51 +00001965bool
1966vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
1967{
1968 return this->__begin_ <= __i->base() && __i->base() < this->__end_;
1969}
1970
1971template <class _Tp, class _Allocator>
1972bool
1973vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
1974{
1975 return this->__begin_ < __i->base() && __i->base() <= this->__end_;
1976}
1977
1978template <class _Tp, class _Allocator>
1979bool
1980vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
1981{
1982 const_pointer __p = __i->base() + __n;
1983 return this->__begin_ <= __p && __p <= this->__end_;
1984}
1985
1986template <class _Tp, class _Allocator>
1987bool
1988vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1989{
1990 const_pointer __p = __i->base() + __n;
1991 return this->__begin_ <= __p && __p < this->__end_;
1992}
1993
Howard Hinnantabe26282011-09-16 17:29:17 +00001994#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001995
1996template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001997_LIBCPP_INLINE_VISIBILITY inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001998void
1999vector<_Tp, _Allocator>::__invalidate_all_iterators()
2000{
Howard Hinnantabe26282011-09-16 17:29:17 +00002001#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00002002 __get_db()->__invalidate_all(this);
Howard Hinnantabe26282011-09-16 17:29:17 +00002003#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002004}
2005
2006// vector<bool>
2007
2008template <class _Allocator> class vector<bool, _Allocator>;
2009
2010template <class _Allocator> struct hash<vector<bool, _Allocator> >;
2011
2012template <class _Allocator>
Howard Hinnantf03c3b42011-07-02 20:33:23 +00002013struct __has_storage_type<vector<bool, _Allocator> >
2014{
2015 static const bool value = true;
2016};
2017
2018template <class _Allocator>
Howard Hinnant83eade62013-03-06 23:30:19 +00002019class _LIBCPP_TYPE_VIS vector<bool, _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002020 : private __vector_base_common<true>
2021{
2022public:
2023 typedef vector __self;
Howard Hinnant324bb032010-08-22 00:02:43 +00002024 typedef bool value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002025 typedef _Allocator allocator_type;
2026 typedef allocator_traits<allocator_type> __alloc_traits;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002027 typedef typename __alloc_traits::size_type size_type;
2028 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnantf867f632012-05-07 16:50:38 +00002029 typedef size_type __storage_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002030 typedef __bit_iterator<vector, false> pointer;
2031 typedef __bit_iterator<vector, true> const_pointer;
2032#ifdef _LIBCPP_DEBUG
2033 typedef __debug_iter<vector, pointer> iterator;
2034 typedef __debug_iter<vector, const_pointer> const_iterator;
2035
2036 friend class __debug_iter<vector, pointer>;
2037 friend class __debug_iter<vector, const_pointer>;
2038
2039 pair<iterator*, const_iterator*> __iterator_list_;
2040
2041 _LIBCPP_INLINE_VISIBILITY iterator*& __get_iterator_list(iterator*) {return __iterator_list_.first;}
2042 _LIBCPP_INLINE_VISIBILITY const_iterator*& __get_iterator_list(const_iterator*) {return __iterator_list_.second;}
Howard Hinnant324bb032010-08-22 00:02:43 +00002043#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002044 typedef pointer iterator;
2045 typedef const_pointer const_iterator;
Howard Hinnant324bb032010-08-22 00:02:43 +00002046#endif // _LIBCPP_DEBUG
Howard Hinnant0949eed2011-06-30 21:18:19 +00002047 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
2048 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002049
2050private:
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002051 typedef typename __alloc_traits::template
2052#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
2053 rebind_alloc<__storage_type>
2054#else
2055 rebind_alloc<__storage_type>::other
2056#endif
2057 __storage_allocator;
2058 typedef allocator_traits<__storage_allocator> __storage_traits;
2059 typedef typename __storage_traits::pointer __storage_pointer;
2060 typedef typename __storage_traits::const_pointer __const_storage_pointer;
2061
2062 __storage_pointer __begin_;
2063 size_type __size_;
2064 __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
Howard Hinnant2bf1c082011-07-09 15:50:42 +00002065public:
Howard Hinnantf03c3b42011-07-02 20:33:23 +00002066 typedef __bit_reference<vector> reference;
2067 typedef __bit_const_reference<vector> const_reference;
Howard Hinnant2bf1c082011-07-09 15:50:42 +00002068private:
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002069 _LIBCPP_INLINE_VISIBILITY
2070 size_type& __cap() _NOEXCEPT
2071 {return __cap_alloc_.first();}
2072 _LIBCPP_INLINE_VISIBILITY
2073 const size_type& __cap() const _NOEXCEPT
2074 {return __cap_alloc_.first();}
2075 _LIBCPP_INLINE_VISIBILITY
2076 __storage_allocator& __alloc() _NOEXCEPT
2077 {return __cap_alloc_.second();}
2078 _LIBCPP_INLINE_VISIBILITY
2079 const __storage_allocator& __alloc() const _NOEXCEPT
2080 {return __cap_alloc_.second();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002081
2082 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2083
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002084 _LIBCPP_INLINE_VISIBILITY
2085 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002086 {return __n * __bits_per_word;}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002087 _LIBCPP_INLINE_VISIBILITY
2088 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002089 {return (__n - 1) / __bits_per_word + 1;}
2090
2091public:
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002092 _LIBCPP_INLINE_VISIBILITY
2093 vector()
2094 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002095 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002096 ~vector();
2097 explicit vector(size_type __n);
2098 vector(size_type __n, const value_type& __v);
2099 vector(size_type __n, const value_type& __v, const allocator_type& __a);
2100 template <class _InputIterator>
2101 vector(_InputIterator __first, _InputIterator __last,
2102 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2103 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2104 template <class _InputIterator>
2105 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2106 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2107 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2108 template <class _ForwardIterator>
2109 vector(_ForwardIterator __first, _ForwardIterator __last,
2110 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2111 template <class _ForwardIterator>
2112 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2113 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2114
2115 vector(const vector& __v);
2116 vector(const vector& __v, const allocator_type& __a);
2117 vector& operator=(const vector& __v);
Howard Hinnante3e32912011-08-12 21:56:02 +00002118#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002119 vector(initializer_list<value_type> __il);
2120 vector(initializer_list<value_type> __il, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +00002121#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002122
Howard Hinnant73d21a42010-09-04 23:28:19 +00002123#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002124 _LIBCPP_INLINE_VISIBILITY
2125 vector(vector&& __v)
2126 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002127 vector(vector&& __v, const allocator_type& __a);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002128 _LIBCPP_INLINE_VISIBILITY
2129 vector& operator=(vector&& __v)
2130 _NOEXCEPT_(
2131 __alloc_traits::propagate_on_container_move_assignment::value &&
2132 is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant73d21a42010-09-04 23:28:19 +00002133#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02 +00002134#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002135 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002136 vector& operator=(initializer_list<value_type> __il)
2137 {assign(__il.begin(), __il.end()); return *this;}
Howard Hinnante3e32912011-08-12 21:56:02 +00002138#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002139
2140 template <class _InputIterator>
2141 typename enable_if
2142 <
2143 __is_input_iterator<_InputIterator>::value &&
2144 !__is_forward_iterator<_InputIterator>::value,
2145 void
2146 >::type
2147 assign(_InputIterator __first, _InputIterator __last);
2148 template <class _ForwardIterator>
2149 typename enable_if
2150 <
2151 __is_forward_iterator<_ForwardIterator>::value,
2152 void
2153 >::type
2154 assign(_ForwardIterator __first, _ForwardIterator __last);
2155
2156 void assign(size_type __n, const value_type& __x);
Howard Hinnante3e32912011-08-12 21:56:02 +00002157#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002158 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002159 void assign(initializer_list<value_type> __il)
2160 {assign(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002161#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002162
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002163 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002164 {return allocator_type(this->__alloc());}
2165
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002166 size_type max_size() const _NOEXCEPT;
2167 _LIBCPP_INLINE_VISIBILITY
2168 size_type capacity() const _NOEXCEPT
2169 {return __internal_cap_to_external(__cap());}
2170 _LIBCPP_INLINE_VISIBILITY
2171 size_type size() const _NOEXCEPT
2172 {return __size_;}
2173 _LIBCPP_INLINE_VISIBILITY
2174 bool empty() const _NOEXCEPT
2175 {return __size_ == 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002176 void reserve(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002177 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002178
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002179 _LIBCPP_INLINE_VISIBILITY
2180 iterator begin() _NOEXCEPT
2181 {return __make_iter(0);}
2182 _LIBCPP_INLINE_VISIBILITY
2183 const_iterator begin() const _NOEXCEPT
2184 {return __make_iter(0);}
2185 _LIBCPP_INLINE_VISIBILITY
2186 iterator end() _NOEXCEPT
2187 {return __make_iter(__size_);}
2188 _LIBCPP_INLINE_VISIBILITY
2189 const_iterator end() const _NOEXCEPT
2190 {return __make_iter(__size_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002191
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002192 _LIBCPP_INLINE_VISIBILITY
2193 reverse_iterator rbegin() _NOEXCEPT
2194 {return reverse_iterator(end());}
2195 _LIBCPP_INLINE_VISIBILITY
2196 const_reverse_iterator rbegin() const _NOEXCEPT
2197 {return const_reverse_iterator(end());}
2198 _LIBCPP_INLINE_VISIBILITY
2199 reverse_iterator rend() _NOEXCEPT
2200 {return reverse_iterator(begin());}
2201 _LIBCPP_INLINE_VISIBILITY
2202 const_reverse_iterator rend() const _NOEXCEPT
2203 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002204
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002205 _LIBCPP_INLINE_VISIBILITY
2206 const_iterator cbegin() const _NOEXCEPT
2207 {return __make_iter(0);}
2208 _LIBCPP_INLINE_VISIBILITY
2209 const_iterator cend() const _NOEXCEPT
2210 {return __make_iter(__size_);}
2211 _LIBCPP_INLINE_VISIBILITY
2212 const_reverse_iterator crbegin() const _NOEXCEPT
2213 {return rbegin();}
2214 _LIBCPP_INLINE_VISIBILITY
2215 const_reverse_iterator crend() const _NOEXCEPT
2216 {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002217
2218 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
2219 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2220 reference at(size_type __n);
2221 const_reference at(size_type __n) const;
2222
2223 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
2224 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2225 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
2226 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
2227
2228 void push_back(const value_type& __x);
2229 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2230
2231 iterator insert(const_iterator __position, const value_type& __x);
2232 iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2233 iterator insert(const_iterator __position, size_type __n, const_reference __x);
2234 template <class _InputIterator>
2235 typename enable_if
2236 <
2237 __is_input_iterator <_InputIterator>::value &&
2238 !__is_forward_iterator<_InputIterator>::value,
2239 iterator
2240 >::type
2241 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2242 template <class _ForwardIterator>
2243 typename enable_if
2244 <
2245 __is_forward_iterator<_ForwardIterator>::value,
2246 iterator
2247 >::type
2248 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00002249#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002250 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002251 iterator insert(const_iterator __position, initializer_list<value_type> __il)
2252 {return insert(__position, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002253#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002254
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002255 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002256 iterator erase(const_iterator __first, const_iterator __last);
2257
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002258 _LIBCPP_INLINE_VISIBILITY
2259 void clear() _NOEXCEPT {__size_ = 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002260
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002261 void swap(vector&)
2262 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
2263 __is_nothrow_swappable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002264
2265 void resize(size_type __sz, value_type __x = false);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002266 void flip() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002267
2268 bool __invariants() const;
2269
2270private:
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002271 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002272 void allocate(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002273 void deallocate() _NOEXCEPT;
2274 _LIBCPP_INLINE_VISIBILITY
2275 static size_type __align(size_type __new_size) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002276 {return __new_size + (__bits_per_word-1) & ~(__bits_per_word-1);};
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002277 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
2278 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002279 template <class _ForwardIterator>
2280 typename enable_if
2281 <
2282 __is_forward_iterator<_ForwardIterator>::value,
2283 void
2284 >::type
2285 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2286 void __append(size_type __n, const_reference __x);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002287 _LIBCPP_INLINE_VISIBILITY
2288 reference __make_ref(size_type __pos) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002289 {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002290 _LIBCPP_INLINE_VISIBILITY
2291 const_reference __make_ref(size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002292 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
2293#ifdef _LIBCPP_DEBUG
2294 _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_type __pos)
2295 {return iterator(this, pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));}
2296 _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_type __pos) const
2297 {return const_iterator(this, const_pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));}
2298 _LIBCPP_INLINE_VISIBILITY iterator __const_iterator_cast(const_iterator __p)
2299 {return iterator(this, pointer(const_cast<__storage_pointer>(__p.base().__seg_), __p.base().__ctz_));}
Howard Hinnant324bb032010-08-22 00:02:43 +00002300#else // _LIBCPP_DEBUG
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002301 _LIBCPP_INLINE_VISIBILITY
2302 iterator __make_iter(size_type __pos) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002303 {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002304 _LIBCPP_INLINE_VISIBILITY
2305 const_iterator __make_iter(size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002306 {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002307 _LIBCPP_INLINE_VISIBILITY
2308 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002309 {return iterator(const_cast<__storage_pointer>(__p.__seg_), __p.__ctz_);}
Howard Hinnant324bb032010-08-22 00:02:43 +00002310#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002311
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002312 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002313 void __copy_assign_alloc(const vector& __v)
2314 {__copy_assign_alloc(__v, integral_constant<bool,
2315 __storage_traits::propagate_on_container_copy_assignment::value>());}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002316 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002317 void __copy_assign_alloc(const vector& __c, true_type)
2318 {
2319 if (__alloc() != __c.__alloc())
2320 deallocate();
2321 __alloc() = __c.__alloc();
2322 }
2323
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002324 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00002325 void __copy_assign_alloc(const vector&, false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002326 {}
2327
2328 void __move_assign(vector& __c, false_type);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002329 void __move_assign(vector& __c, true_type)
2330 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002331 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002332 void __move_assign_alloc(vector& __c)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002333 _NOEXCEPT_(
2334 !__storage_traits::propagate_on_container_move_assignment::value ||
2335 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002336 {__move_assign_alloc(__c, integral_constant<bool,
2337 __storage_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002338 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9cbee432011-09-02 20:42:31 +00002339 void __move_assign_alloc(vector& __c, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002340 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002341 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002342 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002343 }
2344
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002345 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00002346 void __move_assign_alloc(vector&, false_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002347 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002348 {}
2349
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002351 static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002352 _NOEXCEPT_(
2353 !__storage_traits::propagate_on_container_swap::value ||
2354 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002355 {__swap_alloc(__x, __y, integral_constant<bool,
2356 __storage_traits::propagate_on_container_swap::value>());}
2357
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002358 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002359 static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002360 _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002361 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002362 using _VSTD::swap;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002363 swap(__x, __y);
2364 }
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002365 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00002366 static void __swap_alloc(__storage_allocator&, __storage_allocator&, false_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002367 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002368 {}
2369
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002370 size_t __hash_code() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002371
2372 friend class __bit_reference<vector>;
2373 friend class __bit_const_reference<vector>;
2374 friend class __bit_iterator<vector, false>;
2375 friend class __bit_iterator<vector, true>;
Howard Hinnant4ae952a2012-08-17 17:10:18 +00002376 friend struct __bit_array<vector>;
Howard Hinnant83eade62013-03-06 23:30:19 +00002377 friend struct _LIBCPP_TYPE_VIS hash<vector>;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002378};
2379
2380template <class _Allocator>
2381#ifndef _LIBCPP_DEBUG
2382_LIBCPP_INLINE_VISIBILITY inline
2383#endif
2384void
2385vector<bool, _Allocator>::__invalidate_all_iterators()
2386{
2387#ifdef _LIBCPP_DEBUG
2388 iterator::__remove_all(this);
2389 const_iterator::__remove_all(this);
Howard Hinnant324bb032010-08-22 00:02:43 +00002390#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002391}
2392
2393// Allocate space for __n objects
2394// throws length_error if __n > max_size()
2395// throws (probably bad_alloc) if memory run out
2396// Precondition: __begin_ == __end_ == __cap() == 0
2397// Precondition: __n > 0
2398// Postcondition: capacity() == __n
2399// Postcondition: size() == 0
2400template <class _Allocator>
2401void
2402vector<bool, _Allocator>::allocate(size_type __n)
2403{
2404 if (__n > max_size())
2405 this->__throw_length_error();
2406 __n = __external_cap_to_internal(__n);
2407 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2408 this->__size_ = 0;
2409 this->__cap() = __n;
2410}
2411
2412template <class _Allocator>
2413void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002414vector<bool, _Allocator>::deallocate() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002415{
2416 if (this->__begin_ != 0)
2417 {
2418 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2419 __invalidate_all_iterators();
2420 this->__begin_ = 0;
2421 this->__size_ = this->__cap() = 0;
2422 }
2423}
2424
2425template <class _Allocator>
2426typename vector<bool, _Allocator>::size_type
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002427vector<bool, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002428{
2429 size_type __amax = __storage_traits::max_size(__alloc());
2430 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
2431 if (__nmax / __bits_per_word <= __amax)
2432 return __nmax;
2433 return __internal_cap_to_external(__amax);
2434}
2435
2436// Precondition: __new_size > capacity()
2437template <class _Allocator>
2438_LIBCPP_INLINE_VISIBILITY inline
2439typename vector<bool, _Allocator>::size_type
2440vector<bool, _Allocator>::__recommend(size_type __new_size) const
2441{
2442 const size_type __ms = max_size();
2443 if (__new_size > __ms)
2444 this->__throw_length_error();
2445 const size_type __cap = capacity();
2446 if (__cap >= __ms / 2)
2447 return __ms;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002448 return _VSTD::max(2*__cap, __align(__new_size));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002449}
2450
2451// Default constructs __n objects starting at __end_
2452// Precondition: __n > 0
2453// Precondition: size() + __n <= capacity()
2454// Postcondition: size() == size() + __n
2455template <class _Allocator>
2456_LIBCPP_INLINE_VISIBILITY inline
2457void
2458vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2459{
2460 size_type __old_size = this->__size_;
2461 this->__size_ += __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002462 _VSTD::fill_n(__make_iter(__old_size), __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002463}
2464
2465template <class _Allocator>
2466template <class _ForwardIterator>
2467typename enable_if
2468<
2469 __is_forward_iterator<_ForwardIterator>::value,
2470 void
2471>::type
2472vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2473{
2474 size_type __old_size = this->__size_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002475 this->__size_ += _VSTD::distance(__first, __last);
2476 _VSTD::copy(__first, __last, __make_iter(__old_size));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002477}
2478
2479template <class _Allocator>
2480_LIBCPP_INLINE_VISIBILITY inline
2481vector<bool, _Allocator>::vector()
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002482 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002483 : __begin_(0),
2484 __size_(0),
2485 __cap_alloc_(0)
2486{
2487}
2488
2489template <class _Allocator>
2490_LIBCPP_INLINE_VISIBILITY inline
2491vector<bool, _Allocator>::vector(const allocator_type& __a)
2492 : __begin_(0),
2493 __size_(0),
2494 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2495{
2496}
2497
2498template <class _Allocator>
2499vector<bool, _Allocator>::vector(size_type __n)
2500 : __begin_(0),
2501 __size_(0),
2502 __cap_alloc_(0)
2503{
2504 if (__n > 0)
2505 {
2506 allocate(__n);
2507 __construct_at_end(__n, false);
2508 }
2509}
2510
2511template <class _Allocator>
2512vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
2513 : __begin_(0),
2514 __size_(0),
2515 __cap_alloc_(0)
2516{
2517 if (__n > 0)
2518 {
2519 allocate(__n);
2520 __construct_at_end(__n, __x);
2521 }
2522}
2523
2524template <class _Allocator>
2525vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
2526 : __begin_(0),
2527 __size_(0),
2528 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2529{
2530 if (__n > 0)
2531 {
2532 allocate(__n);
2533 __construct_at_end(__n, __x);
2534 }
2535}
2536
2537template <class _Allocator>
2538template <class _InputIterator>
2539vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2540 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2541 !__is_forward_iterator<_InputIterator>::value>::type*)
2542 : __begin_(0),
2543 __size_(0),
2544 __cap_alloc_(0)
2545{
2546#ifndef _LIBCPP_NO_EXCEPTIONS
2547 try
2548 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002549#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002550 for (; __first != __last; ++__first)
2551 push_back(*__first);
2552#ifndef _LIBCPP_NO_EXCEPTIONS
2553 }
2554 catch (...)
2555 {
2556 if (__begin_ != 0)
2557 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2558 __invalidate_all_iterators();
2559 throw;
2560 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002561#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002562}
2563
2564template <class _Allocator>
2565template <class _InputIterator>
2566vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2567 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2568 !__is_forward_iterator<_InputIterator>::value>::type*)
2569 : __begin_(0),
2570 __size_(0),
2571 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2572{
2573#ifndef _LIBCPP_NO_EXCEPTIONS
2574 try
2575 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002576#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002577 for (; __first != __last; ++__first)
2578 push_back(*__first);
2579#ifndef _LIBCPP_NO_EXCEPTIONS
2580 }
2581 catch (...)
2582 {
2583 if (__begin_ != 0)
2584 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2585 __invalidate_all_iterators();
2586 throw;
2587 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002588#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002589}
2590
2591template <class _Allocator>
2592template <class _ForwardIterator>
2593vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2594 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
2595 : __begin_(0),
2596 __size_(0),
2597 __cap_alloc_(0)
2598{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002599 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002600 if (__n > 0)
2601 {
2602 allocate(__n);
2603 __construct_at_end(__first, __last);
2604 }
2605}
2606
2607template <class _Allocator>
2608template <class _ForwardIterator>
2609vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2610 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
2611 : __begin_(0),
2612 __size_(0),
2613 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2614{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002615 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002616 if (__n > 0)
2617 {
2618 allocate(__n);
2619 __construct_at_end(__first, __last);
2620 }
2621}
2622
Howard Hinnante3e32912011-08-12 21:56:02 +00002623#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2624
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002625template <class _Allocator>
2626vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
2627 : __begin_(0),
2628 __size_(0),
2629 __cap_alloc_(0)
2630{
2631 size_type __n = static_cast<size_type>(__il.size());
2632 if (__n > 0)
2633 {
2634 allocate(__n);
2635 __construct_at_end(__il.begin(), __il.end());
2636 }
2637}
2638
2639template <class _Allocator>
2640vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
2641 : __begin_(0),
2642 __size_(0),
2643 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2644{
2645 size_type __n = static_cast<size_type>(__il.size());
2646 if (__n > 0)
2647 {
2648 allocate(__n);
2649 __construct_at_end(__il.begin(), __il.end());
2650 }
2651}
2652
Howard Hinnante3e32912011-08-12 21:56:02 +00002653#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2654
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002655template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002656vector<bool, _Allocator>::~vector()
2657{
2658 if (__begin_ != 0)
2659 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2660#ifdef _LIBCPP_DEBUG
2661 __invalidate_all_iterators();
2662#endif
2663}
2664
2665template <class _Allocator>
2666vector<bool, _Allocator>::vector(const vector& __v)
2667 : __begin_(0),
2668 __size_(0),
2669 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2670{
2671 if (__v.size() > 0)
2672 {
2673 allocate(__v.size());
2674 __construct_at_end(__v.begin(), __v.end());
2675 }
2676}
2677
2678template <class _Allocator>
2679vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
2680 : __begin_(0),
2681 __size_(0),
2682 __cap_alloc_(0, __a)
2683{
2684 if (__v.size() > 0)
2685 {
2686 allocate(__v.size());
2687 __construct_at_end(__v.begin(), __v.end());
2688 }
2689}
2690
2691template <class _Allocator>
2692vector<bool, _Allocator>&
2693vector<bool, _Allocator>::operator=(const vector& __v)
2694{
2695 if (this != &__v)
2696 {
2697 __copy_assign_alloc(__v);
2698 if (__v.__size_)
2699 {
2700 if (__v.__size_ > capacity())
2701 {
2702 deallocate();
2703 allocate(__v.__size_);
2704 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002705 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002706 }
2707 __size_ = __v.__size_;
2708 }
2709 return *this;
2710}
2711
Howard Hinnant73d21a42010-09-04 23:28:19 +00002712#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2713
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002714template <class _Allocator>
2715_LIBCPP_INLINE_VISIBILITY inline
2716vector<bool, _Allocator>::vector(vector&& __v)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002717 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002718 : __begin_(__v.__begin_),
2719 __size_(__v.__size_),
2720 __cap_alloc_(__v.__cap_alloc_)
2721{
2722 __v.__begin_ = 0;
2723 __v.__size_ = 0;
2724 __v.__cap() = 0;
2725}
2726
2727template <class _Allocator>
2728vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
2729 : __begin_(0),
2730 __size_(0),
2731 __cap_alloc_(0, __a)
2732{
2733 if (__a == allocator_type(__v.__alloc()))
2734 {
2735 this->__begin_ = __v.__begin_;
2736 this->__size_ = __v.__size_;
2737 this->__cap() = __v.__cap();
2738 __v.__begin_ = nullptr;
2739 __v.__cap() = __v.__size_ = 0;
2740 }
2741 else if (__v.size() > 0)
2742 {
2743 allocate(__v.size());
2744 __construct_at_end(__v.begin(), __v.end());
2745 }
2746}
2747
2748template <class _Allocator>
2749_LIBCPP_INLINE_VISIBILITY inline
2750vector<bool, _Allocator>&
2751vector<bool, _Allocator>::operator=(vector&& __v)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002752 _NOEXCEPT_(
2753 __alloc_traits::propagate_on_container_move_assignment::value &&
2754 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002755{
2756 __move_assign(__v, integral_constant<bool,
2757 __storage_traits::propagate_on_container_move_assignment::value>());
Argyrios Kyrtzidis1dc6f7a2012-10-13 02:03:45 +00002758 return *this;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002759}
2760
2761template <class _Allocator>
2762void
2763vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2764{
2765 if (__alloc() != __c.__alloc())
2766 assign(__c.begin(), __c.end());
2767 else
2768 __move_assign(__c, true_type());
2769}
2770
2771template <class _Allocator>
2772void
2773vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002774 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002775{
2776 deallocate();
2777 this->__begin_ = __c.__begin_;
2778 this->__size_ = __c.__size_;
2779 this->__cap() = __c.__cap();
2780 __move_assign_alloc(__c);
2781 __c.__begin_ = nullptr;
2782 __c.__cap() = __c.__size_ = 0;
2783}
Howard Hinnant73d21a42010-09-04 23:28:19 +00002784
2785#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002786
2787template <class _Allocator>
2788void
2789vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2790{
2791 __size_ = 0;
2792 if (__n > 0)
2793 {
2794 size_type __c = capacity();
2795 if (__n <= __c)
2796 __size_ = __n;
2797 else
2798 {
2799 vector __v(__alloc());
2800 __v.reserve(__recommend(__n));
2801 __v.__size_ = __n;
2802 swap(__v);
2803 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002804 _VSTD::fill_n(begin(), __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002805 }
2806}
2807
2808template <class _Allocator>
2809template <class _InputIterator>
2810typename enable_if
2811<
2812 __is_input_iterator<_InputIterator>::value &&
2813 !__is_forward_iterator<_InputIterator>::value,
2814 void
2815>::type
2816vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2817{
2818 clear();
2819 for (; __first != __last; ++__first)
2820 push_back(*__first);
2821}
2822
2823template <class _Allocator>
2824template <class _ForwardIterator>
2825typename enable_if
2826<
2827 __is_forward_iterator<_ForwardIterator>::value,
2828 void
2829>::type
2830vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2831{
2832 clear();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002833 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002834 if (__n)
2835 {
2836 if (__n > capacity())
2837 {
2838 deallocate();
2839 allocate(__n);
2840 }
2841 __construct_at_end(__first, __last);
2842 }
2843}
2844
2845template <class _Allocator>
2846void
2847vector<bool, _Allocator>::reserve(size_type __n)
2848{
2849 if (__n > capacity())
2850 {
2851 vector __v(this->__alloc());
2852 __v.allocate(__n);
2853 __v.__construct_at_end(this->begin(), this->end());
2854 swap(__v);
2855 __invalidate_all_iterators();
2856 }
2857}
2858
2859template <class _Allocator>
2860void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002861vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002862{
2863 if (__external_cap_to_internal(size()) > __cap())
2864 {
2865#ifndef _LIBCPP_NO_EXCEPTIONS
2866 try
2867 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002868#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002869 vector(*this, allocator_type(__alloc())).swap(*this);
2870#ifndef _LIBCPP_NO_EXCEPTIONS
2871 }
2872 catch (...)
2873 {
2874 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002875#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002876 }
2877}
2878
2879template <class _Allocator>
2880typename vector<bool, _Allocator>::reference
2881vector<bool, _Allocator>::at(size_type __n)
2882{
2883 if (__n >= size())
2884 this->__throw_out_of_range();
2885 return (*this)[__n];
2886}
2887
2888template <class _Allocator>
2889typename vector<bool, _Allocator>::const_reference
2890vector<bool, _Allocator>::at(size_type __n) const
2891{
2892 if (__n >= size())
2893 this->__throw_out_of_range();
2894 return (*this)[__n];
2895}
2896
2897template <class _Allocator>
2898void
2899vector<bool, _Allocator>::push_back(const value_type& __x)
2900{
2901 if (this->__size_ == this->capacity())
2902 reserve(__recommend(this->__size_ + 1));
2903 ++this->__size_;
2904 back() = __x;
2905}
2906
2907template <class _Allocator>
2908typename vector<bool, _Allocator>::iterator
2909vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
2910{
2911 iterator __r;
2912 if (size() < capacity())
2913 {
2914 const_iterator __old_end = end();
2915 ++__size_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002916 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002917 __r = __const_iterator_cast(__position);
2918 }
2919 else
2920 {
2921 vector __v(__alloc());
2922 __v.reserve(__recommend(__size_ + 1));
2923 __v.__size_ = __size_ + 1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002924 __r = _VSTD::copy(cbegin(), __position, __v.begin());
2925 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002926 swap(__v);
2927 }
2928 *__r = __x;
2929 return __r;
2930}
2931
2932template <class _Allocator>
2933typename vector<bool, _Allocator>::iterator
2934vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
2935{
2936 iterator __r;
2937 size_type __c = capacity();
2938 if (__n <= __c && size() <= __c - __n)
2939 {
2940 const_iterator __old_end = end();
2941 __size_ += __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002942 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002943 __r = __const_iterator_cast(__position);
2944 }
2945 else
2946 {
2947 vector __v(__alloc());
2948 __v.reserve(__recommend(__size_ + __n));
2949 __v.__size_ = __size_ + __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002950 __r = _VSTD::copy(cbegin(), __position, __v.begin());
2951 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002952 swap(__v);
2953 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002954 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002955 return __r;
2956}
2957
2958template <class _Allocator>
2959template <class _InputIterator>
2960typename enable_if
2961<
2962 __is_input_iterator <_InputIterator>::value &&
2963 !__is_forward_iterator<_InputIterator>::value,
2964 typename vector<bool, _Allocator>::iterator
2965>::type
2966vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
2967{
2968 difference_type __off = __position - begin();
2969 iterator __p = __const_iterator_cast(__position);
2970 iterator __old_end = end();
2971 for (; size() != capacity() && __first != __last; ++__first)
2972 {
2973 ++this->__size_;
2974 back() = *__first;
2975 }
2976 vector __v(__alloc());
2977 if (__first != __last)
2978 {
2979#ifndef _LIBCPP_NO_EXCEPTIONS
2980 try
2981 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002982#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002983 __v.assign(__first, __last);
2984 difference_type __old_size = static_cast<difference_type>(__old_end - begin());
2985 difference_type __old_p = __p - begin();
2986 reserve(__recommend(size() + __v.size()));
2987 __p = begin() + __old_p;
2988 __old_end = begin() + __old_size;
2989#ifndef _LIBCPP_NO_EXCEPTIONS
2990 }
2991 catch (...)
2992 {
2993 erase(__old_end, end());
2994 throw;
2995 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002996#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002997 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002998 __p = _VSTD::rotate(__p, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002999 insert(__p, __v.begin(), __v.end());
3000 return begin() + __off;
3001}
3002
3003template <class _Allocator>
3004template <class _ForwardIterator>
3005typename enable_if
3006<
3007 __is_forward_iterator<_ForwardIterator>::value,
3008 typename vector<bool, _Allocator>::iterator
3009>::type
3010vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
3011{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003012 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003013 iterator __r;
3014 size_type __c = capacity();
3015 if (__n <= __c && size() <= __c - __n)
3016 {
3017 const_iterator __old_end = end();
3018 __size_ += __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003019 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003020 __r = __const_iterator_cast(__position);
3021 }
3022 else
3023 {
3024 vector __v(__alloc());
3025 __v.reserve(__recommend(__size_ + __n));
3026 __v.__size_ = __size_ + __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003027 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3028 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003029 swap(__v);
3030 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003031 _VSTD::copy(__first, __last, __r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003032 return __r;
3033}
3034
3035template <class _Allocator>
3036_LIBCPP_INLINE_VISIBILITY inline
3037typename vector<bool, _Allocator>::iterator
3038vector<bool, _Allocator>::erase(const_iterator __position)
3039{
3040 iterator __r = __const_iterator_cast(__position);
Howard Hinnant0949eed2011-06-30 21:18:19 +00003041 _VSTD::copy(__position + 1, this->cend(), __r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003042 --__size_;
3043 return __r;
3044}
3045
3046template <class _Allocator>
3047typename vector<bool, _Allocator>::iterator
3048vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
3049{
3050 iterator __r = __const_iterator_cast(__first);
3051 difference_type __d = __last - __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003052 _VSTD::copy(__last, this->cend(), __r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003053 __size_ -= __d;
3054 return __r;
3055}
3056
3057template <class _Allocator>
3058void
3059vector<bool, _Allocator>::swap(vector& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003060 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3061 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003062{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003063 _VSTD::swap(this->__begin_, __x.__begin_);
3064 _VSTD::swap(this->__size_, __x.__size_);
3065 _VSTD::swap(this->__cap(), __x.__cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003066 __swap_alloc(this->__alloc(), __x.__alloc());
3067#ifdef _LIBCPP_DEBUG
3068 iterator::swap(this, &__x);
3069 const_iterator::swap(this, &__x);
Howard Hinnant324bb032010-08-22 00:02:43 +00003070#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003071}
3072
Howard Hinnant324bb032010-08-22 00:02:43 +00003073template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003074void
3075vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3076{
3077 size_type __cs = size();
3078 if (__cs < __sz)
3079 {
3080 iterator __r;
3081 size_type __c = capacity();
3082 size_type __n = __sz - __cs;
3083 if (__n <= __c && __cs <= __c - __n)
3084 {
3085 __r = end();
3086 __size_ += __n;
3087 }
3088 else
3089 {
3090 vector __v(__alloc());
3091 __v.reserve(__recommend(__size_ + __n));
3092 __v.__size_ = __size_ + __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003093 __r = _VSTD::copy(cbegin(), cend(), __v.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003094 swap(__v);
3095 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003096 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003097 }
3098 else
3099 __size_ = __sz;
3100}
3101
Howard Hinnant324bb032010-08-22 00:02:43 +00003102template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003103void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003104vector<bool, _Allocator>::flip() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003105{
3106 // do middle whole words
3107 size_type __n = __size_;
3108 __storage_pointer __p = __begin_;
3109 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3110 *__p = ~*__p;
3111 // do last partial word
3112 if (__n > 0)
3113 {
3114 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3115 __storage_type __b = *__p & __m;
3116 *__p &= ~__m;
3117 *__p |= ~__b & __m;
3118 }
3119}
3120
Howard Hinnant324bb032010-08-22 00:02:43 +00003121template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003122bool
3123vector<bool, _Allocator>::__invariants() const
3124{
3125 if (this->__begin_ == 0)
3126 {
3127 if (this->__size_ != 0 || this->__cap() != 0)
3128 return false;
3129 }
3130 else
3131 {
3132 if (this->__cap() == 0)
3133 return false;
3134 if (this->__size_ > this->capacity())
3135 return false;
3136 }
3137 return true;
3138}
3139
Howard Hinnant324bb032010-08-22 00:02:43 +00003140template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003141size_t
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003142vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003143{
3144 size_t __h = 0;
3145 // do middle whole words
3146 size_type __n = __size_;
3147 __storage_pointer __p = __begin_;
3148 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3149 __h ^= *__p;
3150 // do last partial word
3151 if (__n > 0)
3152 {
3153 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3154 __h ^= *__p & __m;
3155 }
3156 return __h;
3157}
3158
3159template <class _Allocator>
Howard Hinnant83eade62013-03-06 23:30:19 +00003160struct _LIBCPP_TYPE_VIS hash<vector<bool, _Allocator> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003161 : public unary_function<vector<bool, _Allocator>, size_t>
3162{
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003163 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003164 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003165 {return __vec.__hash_code();}
3166};
3167
3168template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003169_LIBCPP_INLINE_VISIBILITY inline
3170bool
3171operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3172{
3173 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003174 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003175}
3176
3177template <class _Tp, class _Allocator>
3178_LIBCPP_INLINE_VISIBILITY inline
3179bool
3180operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3181{
3182 return !(__x == __y);
3183}
3184
3185template <class _Tp, class _Allocator>
3186_LIBCPP_INLINE_VISIBILITY inline
3187bool
3188operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3189{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003190 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003191}
3192
3193template <class _Tp, class _Allocator>
3194_LIBCPP_INLINE_VISIBILITY inline
3195bool
3196operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3197{
3198 return __y < __x;
3199}
3200
3201template <class _Tp, class _Allocator>
3202_LIBCPP_INLINE_VISIBILITY inline
3203bool
3204operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3205{
3206 return !(__x < __y);
3207}
3208
3209template <class _Tp, class _Allocator>
3210_LIBCPP_INLINE_VISIBILITY inline
3211bool
3212operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3213{
3214 return !(__y < __x);
3215}
3216
3217template <class _Tp, class _Allocator>
3218_LIBCPP_INLINE_VISIBILITY inline
3219void
3220swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003221 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003222{
3223 __x.swap(__y);
3224}
3225
3226_LIBCPP_END_NAMESPACE_STD
3227
3228#endif // _LIBCPP_VECTOR