blob: 876b7e5676bdef5c9adb7cabfe1d90c828aa4295 [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 Hinnantbc8d3f92010-05-11 19:42:16 +0000443 __alloc_traits::destroy(__alloc(), const_cast<pointer>(--__end_));
444}
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{
451 __end_ = const_cast<pointer>(__new_last);
452}
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 Hinnant36cdf022010-09-10 16:42:26 +0000484class _LIBCPP_VISIBLE 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 Hinnantd1d27a42011-06-03 19:40:40 +0000505 _LIBCPP_INLINE_VISIBILITY
506 vector()
507 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnant7a563db2011-09-14 18:33:51 +0000508 {
Howard Hinnantabe26282011-09-16 17:29:17 +0000509#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000510 __get_db()->__insert_c(this);
511#endif
512 }
513 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
514 : __base(__a)
515 {
Howard Hinnantabe26282011-09-16 17:29:17 +0000516#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000517 __get_db()->__insert_c(this);
518#endif
519 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000520 explicit vector(size_type __n);
521 vector(size_type __n, const_reference __x);
522 vector(size_type __n, const_reference __x, const allocator_type& __a);
523 template <class _InputIterator>
524 vector(_InputIterator __first, _InputIterator __last,
525 typename enable_if<__is_input_iterator <_InputIterator>::value &&
526 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
527 template <class _InputIterator>
528 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
529 typename enable_if<__is_input_iterator <_InputIterator>::value &&
530 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
531 template <class _ForwardIterator>
532 vector(_ForwardIterator __first, _ForwardIterator __last,
533 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
534 template <class _ForwardIterator>
535 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
536 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
Howard Hinnante3e32912011-08-12 21:56:02 +0000537#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000538 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000539 vector(initializer_list<value_type> __il);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000540 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000541 vector(initializer_list<value_type> __il, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +0000542#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantabe26282011-09-16 17:29:17 +0000543#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000544 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7a563db2011-09-14 18:33:51 +0000545 ~vector()
546 {
547 __get_db()->__erase_c(this);
548 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000549#endif
550
551 vector(const vector& __x);
552 vector(const vector& __x, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000554 vector& operator=(const vector& __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000555#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000557 vector(vector&& __x)
558 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000560 vector(vector&& __x, const allocator_type& __a);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000561 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000562 vector& operator=(vector&& __x)
563 _NOEXCEPT_(
564 __alloc_traits::propagate_on_container_move_assignment::value &&
565 is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000566#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02 +0000567#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000569 vector& operator=(initializer_list<value_type> __il)
570 {assign(__il.begin(), __il.end()); return *this;}
Howard Hinnante3e32912011-08-12 21:56:02 +0000571#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000572
573 template <class _InputIterator>
574 typename enable_if
575 <
576 __is_input_iterator <_InputIterator>::value &&
577 !__is_forward_iterator<_InputIterator>::value,
578 void
579 >::type
580 assign(_InputIterator __first, _InputIterator __last);
581 template <class _ForwardIterator>
582 typename enable_if
583 <
584 __is_forward_iterator<_ForwardIterator>::value,
585 void
586 >::type
587 assign(_ForwardIterator __first, _ForwardIterator __last);
588
589 void assign(size_type __n, const_reference __u);
Howard Hinnante3e32912011-08-12 21:56:02 +0000590#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000592 void assign(initializer_list<value_type> __il)
593 {assign(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +0000594#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000595
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000596 _LIBCPP_INLINE_VISIBILITY
597 allocator_type get_allocator() const _NOEXCEPT
598 {return this->__alloc();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000599
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000600 _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT;
601 _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT;
602 _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT;
603 _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000604
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000605 _LIBCPP_INLINE_VISIBILITY
606 reverse_iterator rbegin() _NOEXCEPT
607 {return reverse_iterator(end());}
608 _LIBCPP_INLINE_VISIBILITY
609 const_reverse_iterator rbegin() const _NOEXCEPT
610 {return const_reverse_iterator(end());}
611 _LIBCPP_INLINE_VISIBILITY
612 reverse_iterator rend() _NOEXCEPT
613 {return reverse_iterator(begin());}
614 _LIBCPP_INLINE_VISIBILITY
615 const_reverse_iterator rend() const _NOEXCEPT
616 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000617
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000618 _LIBCPP_INLINE_VISIBILITY
619 const_iterator cbegin() const _NOEXCEPT
620 {return begin();}
621 _LIBCPP_INLINE_VISIBILITY
622 const_iterator cend() const _NOEXCEPT
623 {return end();}
624 _LIBCPP_INLINE_VISIBILITY
625 const_reverse_iterator crbegin() const _NOEXCEPT
626 {return rbegin();}
627 _LIBCPP_INLINE_VISIBILITY
628 const_reverse_iterator crend() const _NOEXCEPT
629 {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000630
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000631 _LIBCPP_INLINE_VISIBILITY
632 size_type size() const _NOEXCEPT
633 {return static_cast<size_type>(this->__end_ - this->__begin_);}
634 _LIBCPP_INLINE_VISIBILITY
635 size_type capacity() const _NOEXCEPT
636 {return __base::capacity();}
637 _LIBCPP_INLINE_VISIBILITY
638 bool empty() const _NOEXCEPT
639 {return this->__begin_ == this->__end_;}
640 size_type max_size() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000641 void reserve(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000642 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000643
644 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n);
645 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const;
646 reference at(size_type __n);
647 const_reference at(size_type __n) const;
648
Howard Hinnant7a563db2011-09-14 18:33:51 +0000649 _LIBCPP_INLINE_VISIBILITY reference front()
650 {
651 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
652 return *this->__begin_;
653 }
654 _LIBCPP_INLINE_VISIBILITY const_reference front() const
655 {
656 _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
657 return *this->__begin_;
658 }
659 _LIBCPP_INLINE_VISIBILITY reference back()
660 {
661 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
662 return *(this->__end_ - 1);
663 }
664 _LIBCPP_INLINE_VISIBILITY const_reference back() const
665 {
666 _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
667 return *(this->__end_ - 1);
668 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000669
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000670 _LIBCPP_INLINE_VISIBILITY
671 value_type* data() _NOEXCEPT
Howard Hinnant0949eed2011-06-30 21:18:19 +0000672 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000673 _LIBCPP_INLINE_VISIBILITY
674 const value_type* data() const _NOEXCEPT
Howard Hinnant0949eed2011-06-30 21:18:19 +0000675 {return _VSTD::__to_raw_pointer(this->__begin_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000676
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000677 _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000678#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000679 _LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000680#ifndef _LIBCPP_HAS_NO_VARIADICS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000681 template <class... _Args>
682 void emplace_back(_Args&&... __args);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000683#endif // _LIBCPP_HAS_NO_VARIADICS
684#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000685 void pop_back();
686
687 iterator insert(const_iterator __position, const_reference __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000688#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000689 iterator insert(const_iterator __position, value_type&& __x);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000690#ifndef _LIBCPP_HAS_NO_VARIADICS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000691 template <class... _Args>
692 iterator emplace(const_iterator __position, _Args&&... __args);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000693#endif // _LIBCPP_HAS_NO_VARIADICS
694#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000695 iterator insert(const_iterator __position, size_type __n, const_reference __x);
696 template <class _InputIterator>
697 typename enable_if
698 <
699 __is_input_iterator <_InputIterator>::value &&
700 !__is_forward_iterator<_InputIterator>::value,
701 iterator
702 >::type
703 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
704 template <class _ForwardIterator>
705 typename enable_if
706 <
707 __is_forward_iterator<_ForwardIterator>::value,
708 iterator
709 >::type
710 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +0000711#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000712 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000713 iterator insert(const_iterator __position, initializer_list<value_type> __il)
714 {return insert(__position, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +0000715#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000716
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000717 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000718 iterator erase(const_iterator __first, const_iterator __last);
719
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000720 _LIBCPP_INLINE_VISIBILITY
721 void clear() _NOEXCEPT
Howard Hinnant7a563db2011-09-14 18:33:51 +0000722 {
723 __base::clear();
724 __invalidate_all_iterators();
725 }
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000726
727 void resize(size_type __sz);
728 void resize(size_type __sz, const_reference __x);
729
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000730 void swap(vector&)
731 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
732 __is_nothrow_swappable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000733
734 bool __invariants() const;
735
Howard Hinnantabe26282011-09-16 17:29:17 +0000736#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000737
738 bool __dereferenceable(const const_iterator* __i) const;
739 bool __decrementable(const const_iterator* __i) const;
740 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
741 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
742
Howard Hinnantabe26282011-09-16 17:29:17 +0000743#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000744
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000745private:
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000746 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000747 void allocate(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000748 void deallocate() _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000749 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
Howard Hinnant04240d92011-01-04 19:53:31 +0000750 void __construct_at_end(size_type __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000751 void __construct_at_end(size_type __n, const_reference __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000752 template <class _ForwardIterator>
753 typename enable_if
754 <
755 __is_forward_iterator<_ForwardIterator>::value,
756 void
757 >::type
758 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
759 void __move_construct_at_end(pointer __first, pointer __last);
760 void __append(size_type __n);
761 void __append(size_type __n, const_reference __x);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000762 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000763 iterator __make_iter(pointer __p) _NOEXCEPT;
Howard Hinnant2d72b1e2010-12-17 14:46:43 +0000764 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000765 const_iterator __make_iter(const_pointer __p) const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000766 void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v);
767 pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p);
768 void __move_range(pointer __from_s, pointer __from_e, pointer __to);
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000769 void __move_assign(vector& __c, true_type)
770 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000771 void __move_assign(vector& __c, false_type);
Howard Hinnant7a563db2011-09-14 18:33:51 +0000772 _LIBCPP_INLINE_VISIBILITY
773 void __destruct_at_end(const_pointer __new_last) _NOEXCEPT
774 {
Howard Hinnantabe26282011-09-16 17:29:17 +0000775#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +0000776 __c_node* __c = __get_db()->__find_c_and_lock(this);
777 for (__i_node** __p = __c->end_; __p != __c->beg_; )
778 {
779 --__p;
780 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
781 if (__i->base() > __new_last)
782 {
783 (*__p)->__c_ = nullptr;
784 if (--__c->end_ != __p)
785 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
786 }
787 }
788 __get_db()->unlock();
789#endif
790 __base::__destruct_at_end(__new_last);
791 }
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000792 template <class _Up>
793 void
794#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
795 __push_back_slow_path(_Up&& __x);
796#else
797 __push_back_slow_path(_Up& __x);
798#endif
Howard Hinnant0438ea22012-02-26 15:30:12 +0000799#if !defined(_LIBCPP_HAS_NO_VARIADICS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
800 template <class... _Args>
801 void
802 __emplace_back_slow_path(_Args&&... __args);
803#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000804};
805
806template <class _Tp, class _Allocator>
807void
808vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)
809{
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000810 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
Howard Hinnant0949eed2011-06-30 21:18:19 +0000811 _VSTD::swap(this->__begin_, __v.__begin_);
812 _VSTD::swap(this->__end_, __v.__end_);
813 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000814 __v.__first_ = __v.__begin_;
815 __invalidate_all_iterators();
816}
817
818template <class _Tp, class _Allocator>
819typename vector<_Tp, _Allocator>::pointer
820vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
821{
822 pointer __r = __v.__begin_;
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +0000823 __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, __p, __v.__begin_);
824 __alloc_traits::__construct_forward(this->__alloc(), __p, this->__end_, __v.__end_);
Howard Hinnant0949eed2011-06-30 21:18:19 +0000825 _VSTD::swap(this->__begin_, __v.__begin_);
826 _VSTD::swap(this->__end_, __v.__end_);
827 _VSTD::swap(this->__end_cap(), __v.__end_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000828 __v.__first_ = __v.__begin_;
829 __invalidate_all_iterators();
830 return __r;
831}
832
833// Allocate space for __n objects
834// throws length_error if __n > max_size()
835// throws (probably bad_alloc) if memory run out
836// Precondition: __begin_ == __end_ == __end_cap() == 0
837// Precondition: __n > 0
838// Postcondition: capacity() == __n
839// Postcondition: size() == 0
840template <class _Tp, class _Allocator>
841void
842vector<_Tp, _Allocator>::allocate(size_type __n)
843{
844 if (__n > max_size())
845 this->__throw_length_error();
846 this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
847 this->__end_cap() = this->__begin_ + __n;
848}
849
850template <class _Tp, class _Allocator>
851void
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000852vector<_Tp, _Allocator>::deallocate() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000853{
854 if (this->__begin_ != 0)
855 {
856 clear();
857 __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000858 this->__begin_ = this->__end_ = this->__end_cap() = 0;
859 }
860}
861
862template <class _Tp, class _Allocator>
863typename vector<_Tp, _Allocator>::size_type
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000864vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000865{
Sean Hunt110b8bf2011-07-29 23:31:58 +0000866 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 +0000867}
868
869// Precondition: __new_size > capacity()
870template <class _Tp, class _Allocator>
871_LIBCPP_INLINE_VISIBILITY inline
872typename vector<_Tp, _Allocator>::size_type
873vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
874{
875 const size_type __ms = max_size();
876 if (__new_size > __ms)
877 this->__throw_length_error();
878 const size_type __cap = capacity();
879 if (__cap >= __ms / 2)
880 return __ms;
Sean Hunt110b8bf2011-07-29 23:31:58 +0000881 return _VSTD::max<size_type>(2*__cap, __new_size);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000882}
883
884// Default constructs __n objects starting at __end_
885// throws if construction throws
886// Precondition: __n > 0
887// Precondition: size() + __n <= capacity()
888// Postcondition: size() == size() + __n
889template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000890void
891vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
892{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000893 allocator_type& __a = this->__alloc();
894 do
895 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000896 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000897 ++this->__end_;
898 --__n;
899 } while (__n > 0);
900}
901
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000902// Copy constructs __n objects starting at __end_ from __x
903// throws if construction throws
904// Precondition: __n > 0
905// Precondition: size() + __n <= capacity()
906// Postcondition: size() == old size() + __n
907// Postcondition: [i] == __x for all i in [size() - __n, __n)
908template <class _Tp, class _Allocator>
909_LIBCPP_INLINE_VISIBILITY inline
910void
911vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
912{
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000913 allocator_type& __a = this->__alloc();
914 do
915 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000916 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000917 ++this->__end_;
918 --__n;
919 } while (__n > 0);
920}
921
922template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000923template <class _ForwardIterator>
924typename enable_if
925<
926 __is_forward_iterator<_ForwardIterator>::value,
927 void
928>::type
929vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
930{
931 allocator_type& __a = this->__alloc();
932 for (; __first != __last; ++__first)
933 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000934 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), *__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000935 ++this->__end_;
936 }
937}
938
939template <class _Tp, class _Allocator>
940void
941vector<_Tp, _Allocator>::__move_construct_at_end(pointer __first, pointer __last)
942{
943 allocator_type& __a = this->__alloc();
944 for (; __first != __last; ++__first)
945 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000946 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
947 _VSTD::move(*__first));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000948 ++this->__end_;
949 }
950}
951
952// Default constructs __n objects starting at __end_
953// throws if construction throws
954// Postcondition: size() == size() + __n
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000955// Exception safety: strong.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000956template <class _Tp, class _Allocator>
957void
958vector<_Tp, _Allocator>::__append(size_type __n)
959{
960 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
961 this->__construct_at_end(__n);
962 else
963 {
964 allocator_type& __a = this->__alloc();
965 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
966 __v.__construct_at_end(__n);
967 __swap_out_circular_buffer(__v);
968 }
969}
970
971// Default constructs __n objects starting at __end_
972// throws if construction throws
973// Postcondition: size() == size() + __n
Howard Hinnantd1d27a42011-06-03 19:40:40 +0000974// Exception safety: strong.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000975template <class _Tp, class _Allocator>
976void
977vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
978{
979 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
980 this->__construct_at_end(__n, __x);
981 else
982 {
983 allocator_type& __a = this->__alloc();
984 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
985 __v.__construct_at_end(__n, __x);
986 __swap_out_circular_buffer(__v);
987 }
988}
989
990template <class _Tp, class _Allocator>
991vector<_Tp, _Allocator>::vector(size_type __n)
992{
Howard Hinnant0442b122011-09-16 18:41:29 +0000993#if _LIBCPP_DEBUG_LEVEL >= 2
994 __get_db()->__insert_c(this);
995#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000996 if (__n > 0)
997 {
998 allocate(__n);
999 __construct_at_end(__n);
1000 }
1001}
1002
1003template <class _Tp, class _Allocator>
1004vector<_Tp, _Allocator>::vector(size_type __n, const_reference __x)
1005{
Howard Hinnant0442b122011-09-16 18:41:29 +00001006#if _LIBCPP_DEBUG_LEVEL >= 2
1007 __get_db()->__insert_c(this);
1008#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001009 if (__n > 0)
1010 {
1011 allocate(__n);
1012 __construct_at_end(__n, __x);
1013 }
1014}
1015
1016template <class _Tp, class _Allocator>
1017vector<_Tp, _Allocator>::vector(size_type __n, const_reference __x, const allocator_type& __a)
1018 : __base(__a)
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, __x);
1027 }
1028}
1029
1030template <class _Tp, class _Allocator>
1031template <class _InputIterator>
1032vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
1033 typename enable_if<__is_input_iterator <_InputIterator>::value &&
1034 !__is_forward_iterator<_InputIterator>::value>::type*)
1035{
Howard Hinnantabe26282011-09-16 17:29:17 +00001036#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001037 __get_db()->__insert_c(this);
1038#endif
Howard Hinnant0442b122011-09-16 18:41:29 +00001039 for (; __first != __last; ++__first)
1040 push_back(*__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001041}
1042
1043template <class _Tp, class _Allocator>
1044template <class _InputIterator>
1045vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
1046 typename enable_if<__is_input_iterator <_InputIterator>::value &&
1047 !__is_forward_iterator<_InputIterator>::value>::type*)
1048 : __base(__a)
1049{
Howard Hinnantabe26282011-09-16 17:29:17 +00001050#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001051 __get_db()->__insert_c(this);
1052#endif
Howard Hinnant0442b122011-09-16 18:41:29 +00001053 for (; __first != __last; ++__first)
1054 push_back(*__first);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001055}
1056
1057template <class _Tp, class _Allocator>
1058template <class _ForwardIterator>
1059vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
1060 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
1061{
Howard Hinnant0442b122011-09-16 18:41:29 +00001062#if _LIBCPP_DEBUG_LEVEL >= 2
1063 __get_db()->__insert_c(this);
1064#endif
Howard Hinnant0949eed2011-06-30 21:18:19 +00001065 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001066 if (__n > 0)
1067 {
1068 allocate(__n);
1069 __construct_at_end(__first, __last);
1070 }
1071}
1072
1073template <class _Tp, class _Allocator>
1074template <class _ForwardIterator>
1075vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
1076 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
1077 : __base(__a)
1078{
Howard Hinnant0442b122011-09-16 18:41:29 +00001079#if _LIBCPP_DEBUG_LEVEL >= 2
1080 __get_db()->__insert_c(this);
1081#endif
Howard Hinnant0949eed2011-06-30 21:18:19 +00001082 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001083 if (__n > 0)
1084 {
1085 allocate(__n);
1086 __construct_at_end(__first, __last);
1087 }
1088}
1089
1090template <class _Tp, class _Allocator>
1091vector<_Tp, _Allocator>::vector(const vector& __x)
1092 : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
1093{
Howard Hinnant0442b122011-09-16 18:41:29 +00001094#if _LIBCPP_DEBUG_LEVEL >= 2
1095 __get_db()->__insert_c(this);
1096#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001097 size_type __n = __x.size();
1098 if (__n > 0)
1099 {
1100 allocate(__n);
1101 __construct_at_end(__x.__begin_, __x.__end_);
1102 }
1103}
1104
1105template <class _Tp, class _Allocator>
1106vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a)
1107 : __base(__a)
1108{
Howard Hinnant0442b122011-09-16 18:41:29 +00001109#if _LIBCPP_DEBUG_LEVEL >= 2
1110 __get_db()->__insert_c(this);
1111#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001112 size_type __n = __x.size();
1113 if (__n > 0)
1114 {
1115 allocate(__n);
1116 __construct_at_end(__x.__begin_, __x.__end_);
1117 }
1118}
1119
Howard Hinnant73d21a42010-09-04 23:28:19 +00001120#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001121
1122template <class _Tp, class _Allocator>
1123_LIBCPP_INLINE_VISIBILITY inline
1124vector<_Tp, _Allocator>::vector(vector&& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001125 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001126 : __base(_VSTD::move(__x.__alloc()))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001127{
Howard Hinnantabe26282011-09-16 17:29:17 +00001128#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001129 __get_db()->__insert_c(this);
Howard Hinnante6125bd2011-09-19 16:34:29 +00001130 __get_db()->swap(this, &__x);
Howard Hinnant7a563db2011-09-14 18:33:51 +00001131#endif
Howard Hinnant0442b122011-09-16 18:41:29 +00001132 this->__begin_ = __x.__begin_;
1133 this->__end_ = __x.__end_;
1134 this->__end_cap() = __x.__end_cap();
1135 __x.__begin_ = __x.__end_ = __x.__end_cap() = 0;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001136}
1137
1138template <class _Tp, class _Allocator>
1139_LIBCPP_INLINE_VISIBILITY inline
1140vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a)
1141 : __base(__a)
1142{
Howard Hinnant0442b122011-09-16 18:41:29 +00001143#if _LIBCPP_DEBUG_LEVEL >= 2
1144 __get_db()->__insert_c(this);
1145#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001146 if (__a == __x.__alloc())
1147 {
1148 this->__begin_ = __x.__begin_;
1149 this->__end_ = __x.__end_;
1150 this->__end_cap() = __x.__end_cap();
1151 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
Howard Hinnante6125bd2011-09-19 16:34:29 +00001152#if _LIBCPP_DEBUG_LEVEL >= 2
1153 __get_db()->swap(this, &__x);
1154#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001155 }
1156 else
1157 {
Howard Hinnant99968442011-11-29 18:15:50 +00001158 typedef move_iterator<iterator> _Ip;
1159 assign(_Ip(__x.begin()), _Ip(__x.end()));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001160 }
1161}
1162
Howard Hinnante3e32912011-08-12 21:56:02 +00001163#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1164
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001165template <class _Tp, class _Allocator>
1166_LIBCPP_INLINE_VISIBILITY inline
1167vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
1168{
Howard Hinnant0442b122011-09-16 18:41:29 +00001169#if _LIBCPP_DEBUG_LEVEL >= 2
1170 __get_db()->__insert_c(this);
1171#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001172 if (__il.size() > 0)
1173 {
1174 allocate(__il.size());
1175 __construct_at_end(__il.begin(), __il.end());
1176 }
1177}
1178
1179template <class _Tp, class _Allocator>
1180_LIBCPP_INLINE_VISIBILITY inline
1181vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
1182 : __base(__a)
1183{
Howard Hinnant0442b122011-09-16 18:41:29 +00001184#if _LIBCPP_DEBUG_LEVEL >= 2
1185 __get_db()->__insert_c(this);
1186#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001187 if (__il.size() > 0)
1188 {
1189 allocate(__il.size());
1190 __construct_at_end(__il.begin(), __il.end());
1191 }
1192}
1193
Howard Hinnante3e32912011-08-12 21:56:02 +00001194#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1195
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001196template <class _Tp, class _Allocator>
1197_LIBCPP_INLINE_VISIBILITY inline
1198vector<_Tp, _Allocator>&
1199vector<_Tp, _Allocator>::operator=(vector&& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001200 _NOEXCEPT_(
1201 __alloc_traits::propagate_on_container_move_assignment::value &&
1202 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001203{
1204 __move_assign(__x, integral_constant<bool,
1205 __alloc_traits::propagate_on_container_move_assignment::value>());
1206 return *this;
1207}
1208
1209template <class _Tp, class _Allocator>
1210void
1211vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
1212{
1213 if (__base::__alloc() != __c.__alloc())
1214 {
Howard Hinnant99968442011-11-29 18:15:50 +00001215 typedef move_iterator<iterator> _Ip;
1216 assign(_Ip(__c.begin()), _Ip(__c.end()));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001217 }
1218 else
1219 __move_assign(__c, true_type());
1220}
1221
1222template <class _Tp, class _Allocator>
1223void
1224vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001225 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001226{
1227 deallocate();
1228 this->__begin_ = __c.__begin_;
1229 this->__end_ = __c.__end_;
1230 this->__end_cap() = __c.__end_cap();
1231 __base::__move_assign_alloc(__c);
1232 __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
Howard Hinnante6125bd2011-09-19 16:34:29 +00001233#if _LIBCPP_DEBUG_LEVEL >= 2
1234 __get_db()->swap(this, &__c);
1235#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001236}
1237
Howard Hinnant73d21a42010-09-04 23:28:19 +00001238#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001239
1240template <class _Tp, class _Allocator>
1241_LIBCPP_INLINE_VISIBILITY inline
1242vector<_Tp, _Allocator>&
1243vector<_Tp, _Allocator>::operator=(const vector& __x)
1244{
1245 if (this != &__x)
1246 {
1247 __base::__copy_assign_alloc(__x);
1248 assign(__x.__begin_, __x.__end_);
1249 }
1250 return *this;
1251}
1252
1253template <class _Tp, class _Allocator>
1254template <class _InputIterator>
1255typename enable_if
1256<
1257 __is_input_iterator <_InputIterator>::value &&
1258 !__is_forward_iterator<_InputIterator>::value,
1259 void
1260>::type
1261vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1262{
1263 clear();
1264 for (; __first != __last; ++__first)
1265 push_back(*__first);
1266}
1267
1268template <class _Tp, class _Allocator>
1269template <class _ForwardIterator>
1270typename enable_if
1271<
1272 __is_forward_iterator<_ForwardIterator>::value,
1273 void
1274>::type
1275vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
1276{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001277 typename iterator_traits<_ForwardIterator>::difference_type __new_size = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001278 if (static_cast<size_type>(__new_size) <= capacity())
1279 {
1280 _ForwardIterator __mid = __last;
1281 bool __growing = false;
1282 if (static_cast<size_type>(__new_size) > size())
1283 {
1284 __growing = true;
1285 __mid = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001286 _VSTD::advance(__mid, size());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001287 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00001288 pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001289 if (__growing)
1290 __construct_at_end(__mid, __last);
1291 else
1292 this->__destruct_at_end(__m);
1293 }
1294 else
1295 {
1296 deallocate();
1297 allocate(__recommend(static_cast<size_type>(__new_size)));
1298 __construct_at_end(__first, __last);
1299 }
1300}
1301
1302template <class _Tp, class _Allocator>
1303void
1304vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
1305{
1306 if (__n <= capacity())
1307 {
1308 size_type __s = size();
Howard Hinnant0949eed2011-06-30 21:18:19 +00001309 _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001310 if (__n > __s)
1311 __construct_at_end(__n - __s, __u);
1312 else
Howard Hinnantadff4892010-05-24 17:49:41 +00001313 this->__destruct_at_end(this->__begin_ + __n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001314 }
1315 else
1316 {
1317 deallocate();
1318 allocate(__recommend(static_cast<size_type>(__n)));
1319 __construct_at_end(__n, __u);
1320 }
1321}
1322
Howard Hinnant324bb032010-08-22 00:02:43 +00001323template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001324_LIBCPP_INLINE_VISIBILITY inline
1325typename vector<_Tp, _Allocator>::iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001326vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001327{
Howard Hinnantabe26282011-09-16 17:29:17 +00001328#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001329 return iterator(this, __p);
1330#else
1331 return iterator(__p);
1332#endif
1333}
1334
Howard Hinnant324bb032010-08-22 00:02:43 +00001335template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001336_LIBCPP_INLINE_VISIBILITY inline
1337typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001338vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001339{
Howard Hinnantabe26282011-09-16 17:29:17 +00001340#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001341 return const_iterator(this, __p);
1342#else
1343 return const_iterator(__p);
1344#endif
1345}
1346
Howard Hinnant324bb032010-08-22 00:02:43 +00001347template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001348_LIBCPP_INLINE_VISIBILITY inline
1349typename vector<_Tp, _Allocator>::iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001350vector<_Tp, _Allocator>::begin() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001351{
1352 return __make_iter(this->__begin_);
1353}
1354
Howard Hinnant324bb032010-08-22 00:02:43 +00001355template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001356_LIBCPP_INLINE_VISIBILITY inline
1357typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001358vector<_Tp, _Allocator>::begin() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001359{
1360 return __make_iter(this->__begin_);
1361}
1362
Howard Hinnant324bb032010-08-22 00:02:43 +00001363template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001364_LIBCPP_INLINE_VISIBILITY inline
1365typename vector<_Tp, _Allocator>::iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001366vector<_Tp, _Allocator>::end() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001367{
1368 return __make_iter(this->__end_);
1369}
1370
Howard Hinnant324bb032010-08-22 00:02:43 +00001371template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001372_LIBCPP_INLINE_VISIBILITY inline
1373typename vector<_Tp, _Allocator>::const_iterator
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001374vector<_Tp, _Allocator>::end() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001375{
1376 return __make_iter(this->__end_);
1377}
1378
Howard Hinnant324bb032010-08-22 00:02:43 +00001379template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001380_LIBCPP_INLINE_VISIBILITY inline
1381typename vector<_Tp, _Allocator>::reference
1382vector<_Tp, _Allocator>::operator[](size_type __n)
1383{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001384 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001385 return this->__begin_[__n];
1386}
1387
Howard Hinnant324bb032010-08-22 00:02:43 +00001388template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001389_LIBCPP_INLINE_VISIBILITY inline
1390typename vector<_Tp, _Allocator>::const_reference
1391vector<_Tp, _Allocator>::operator[](size_type __n) const
1392{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001393 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001394 return this->__begin_[__n];
1395}
1396
Howard Hinnant324bb032010-08-22 00:02:43 +00001397template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001398typename vector<_Tp, _Allocator>::reference
1399vector<_Tp, _Allocator>::at(size_type __n)
1400{
1401 if (__n >= size())
1402 this->__throw_out_of_range();
1403 return this->__begin_[__n];
1404}
1405
Howard Hinnant324bb032010-08-22 00:02:43 +00001406template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001407typename vector<_Tp, _Allocator>::const_reference
1408vector<_Tp, _Allocator>::at(size_type __n) const
1409{
1410 if (__n >= size())
1411 this->__throw_out_of_range();
1412 return this->__begin_[__n];
1413}
1414
1415template <class _Tp, class _Allocator>
1416void
1417vector<_Tp, _Allocator>::reserve(size_type __n)
1418{
1419 if (__n > capacity())
1420 {
1421 allocator_type& __a = this->__alloc();
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001422 __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001423 __swap_out_circular_buffer(__v);
1424 }
1425}
1426
1427template <class _Tp, class _Allocator>
1428void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001429vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001430{
1431 if (capacity() > size())
1432 {
1433#ifndef _LIBCPP_NO_EXCEPTIONS
1434 try
1435 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001436#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001437 allocator_type& __a = this->__alloc();
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001438 __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001439 __swap_out_circular_buffer(__v);
1440#ifndef _LIBCPP_NO_EXCEPTIONS
1441 }
1442 catch (...)
1443 {
1444 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001445#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001446 }
1447}
1448
1449template <class _Tp, class _Allocator>
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001450template <class _Up>
1451void
1452#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1453vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
1454#else
1455vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
1456#endif
1457{
1458 allocator_type& __a = this->__alloc();
1459 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1460 // __v.push_back(_VSTD::forward<_Up>(__x));
Howard Hinnantf619e232013-01-11 20:36:59 +00001461 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Up>(__x));
1462 __v.__end_++;
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001463 __swap_out_circular_buffer(__v);
1464}
1465
1466template <class _Tp, class _Allocator>
1467_LIBCPP_INLINE_VISIBILITY inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001468void
1469vector<_Tp, _Allocator>::push_back(const_reference __x)
1470{
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001471 if (this->__end_ != this->__end_cap())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001472 {
1473 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001474 _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001475 ++this->__end_;
1476 }
1477 else
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001478 __push_back_slow_path(__x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001479}
1480
Howard Hinnant73d21a42010-09-04 23:28:19 +00001481#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001482
1483template <class _Tp, class _Allocator>
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001484_LIBCPP_INLINE_VISIBILITY inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001485void
1486vector<_Tp, _Allocator>::push_back(value_type&& __x)
1487{
1488 if (this->__end_ < this->__end_cap())
1489 {
1490 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001491 _VSTD::__to_raw_pointer(this->__end_),
1492 _VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001493 ++this->__end_;
1494 }
1495 else
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001496 __push_back_slow_path(_VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001497}
1498
Howard Hinnant73d21a42010-09-04 23:28:19 +00001499#ifndef _LIBCPP_HAS_NO_VARIADICS
1500
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001501template <class _Tp, class _Allocator>
1502template <class... _Args>
1503void
Howard Hinnant0438ea22012-02-26 15:30:12 +00001504vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1505{
1506 allocator_type& __a = this->__alloc();
1507 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1508// __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantf619e232013-01-11 20:36:59 +00001509 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Args>(__args)...);
1510 __v.__end_++;
Howard Hinnant0438ea22012-02-26 15:30:12 +00001511 __swap_out_circular_buffer(__v);
1512}
1513
1514template <class _Tp, class _Allocator>
1515template <class... _Args>
1516_LIBCPP_INLINE_VISIBILITY inline
1517void
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001518vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1519{
1520 if (this->__end_ < this->__end_cap())
1521 {
1522 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001523 _VSTD::__to_raw_pointer(this->__end_),
1524 _VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001525 ++this->__end_;
1526 }
1527 else
Howard Hinnant0438ea22012-02-26 15:30:12 +00001528 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001529}
1530
Howard Hinnant73d21a42010-09-04 23:28:19 +00001531#endif // _LIBCPP_HAS_NO_VARIADICS
1532#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001533
1534template <class _Tp, class _Allocator>
1535_LIBCPP_INLINE_VISIBILITY inline
1536void
1537vector<_Tp, _Allocator>::pop_back()
1538{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001539 _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001540 this->__destruct_at_end(this->__end_ - 1);
1541}
1542
1543template <class _Tp, class _Allocator>
1544_LIBCPP_INLINE_VISIBILITY inline
1545typename vector<_Tp, _Allocator>::iterator
1546vector<_Tp, _Allocator>::erase(const_iterator __position)
1547{
Howard Hinnantabe26282011-09-16 17:29:17 +00001548#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001549 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1550 "vector::erase(iterator) called with an iterator not"
1551 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001552#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001553 pointer __p = const_cast<pointer>(&*__position);
1554 iterator __r = __make_iter(__p);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001555 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001556 return __r;
1557}
1558
1559template <class _Tp, class _Allocator>
1560typename vector<_Tp, _Allocator>::iterator
1561vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1562{
Howard Hinnantabe26282011-09-16 17:29:17 +00001563#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001564 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
1565 "vector::erase(iterator, iterator) called with an iterator not"
1566 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001567#endif
Howard Hinnant7a563db2011-09-14 18:33:51 +00001568 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001569 pointer __p = this->__begin_ + (__first - begin());
1570 iterator __r = __make_iter(__p);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001571 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001572 return __r;
1573}
1574
1575template <class _Tp, class _Allocator>
1576void
1577vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1578{
1579 pointer __old_last = this->__end_;
1580 difference_type __n = __old_last - __to;
1581 for (pointer __i = __from_s + __n; __i < __from_e; ++__i, ++this->__end_)
1582 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001583 _VSTD::__to_raw_pointer(this->__end_),
1584 _VSTD::move(*__i));
1585 _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001586}
1587
1588template <class _Tp, class _Allocator>
1589typename vector<_Tp, _Allocator>::iterator
1590vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1591{
Howard Hinnantabe26282011-09-16 17:29:17 +00001592#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001593 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1594 "vector::insert(iterator, x) called with an iterator not"
1595 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001596#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001597 pointer __p = this->__begin_ + (__position - begin());
1598 if (this->__end_ < this->__end_cap())
1599 {
1600 if (__p == this->__end_)
1601 {
1602 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001603 _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001604 ++this->__end_;
1605 }
1606 else
1607 {
1608 __move_range(__p, this->__end_, __p + 1);
1609 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1610 if (__p <= __xr && __xr < this->__end_)
1611 ++__xr;
1612 *__p = *__xr;
1613 }
1614 }
1615 else
1616 {
1617 allocator_type& __a = this->__alloc();
1618 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1619 __v.push_back(__x);
1620 __p = __swap_out_circular_buffer(__v, __p);
1621 }
1622 return __make_iter(__p);
1623}
1624
Howard Hinnant73d21a42010-09-04 23:28:19 +00001625#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001626
1627template <class _Tp, class _Allocator>
1628typename vector<_Tp, _Allocator>::iterator
1629vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1630{
Howard Hinnantabe26282011-09-16 17:29:17 +00001631#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001632 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1633 "vector::insert(iterator, x) called with an iterator not"
1634 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001635#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001636 pointer __p = this->__begin_ + (__position - begin());
1637 if (this->__end_ < this->__end_cap())
1638 {
1639 if (__p == this->__end_)
1640 {
1641 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001642 _VSTD::__to_raw_pointer(this->__end_),
1643 _VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001644 ++this->__end_;
1645 }
1646 else
1647 {
1648 __move_range(__p, this->__end_, __p + 1);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001649 *__p = _VSTD::move(__x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001650 }
1651 }
1652 else
1653 {
1654 allocator_type& __a = this->__alloc();
1655 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001656 __v.push_back(_VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001657 __p = __swap_out_circular_buffer(__v, __p);
1658 }
1659 return __make_iter(__p);
1660}
1661
Howard Hinnant73d21a42010-09-04 23:28:19 +00001662#ifndef _LIBCPP_HAS_NO_VARIADICS
1663
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001664template <class _Tp, class _Allocator>
1665template <class... _Args>
1666typename vector<_Tp, _Allocator>::iterator
1667vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1668{
Howard Hinnantabe26282011-09-16 17:29:17 +00001669#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001670 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1671 "vector::emplace(iterator, x) called with an iterator not"
1672 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001673#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001674 pointer __p = this->__begin_ + (__position - begin());
1675 if (this->__end_ < this->__end_cap())
1676 {
1677 if (__p == this->__end_)
1678 {
1679 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001680 _VSTD::__to_raw_pointer(this->__end_),
1681 _VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001682 ++this->__end_;
1683 }
1684 else
1685 {
Howard Hinnanta58402a2012-07-08 23:23:04 +00001686 value_type __tmp(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001687 __move_range(__p, this->__end_, __p + 1);
Howard Hinnanta58402a2012-07-08 23:23:04 +00001688 *__p = _VSTD::move(__tmp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001689 }
1690 }
1691 else
1692 {
1693 allocator_type& __a = this->__alloc();
1694 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001695 __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001696 __p = __swap_out_circular_buffer(__v, __p);
1697 }
1698 return __make_iter(__p);
1699}
1700
Howard Hinnant73d21a42010-09-04 23:28:19 +00001701#endif // _LIBCPP_HAS_NO_VARIADICS
1702#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001703
1704template <class _Tp, class _Allocator>
1705typename vector<_Tp, _Allocator>::iterator
1706vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1707{
Howard Hinnantabe26282011-09-16 17:29:17 +00001708#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001709 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1710 "vector::insert(iterator, n, x) called with an iterator not"
1711 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001712#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001713 pointer __p = this->__begin_ + (__position - begin());
1714 if (__n > 0)
1715 {
1716 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1717 {
1718 size_type __old_n = __n;
1719 pointer __old_last = this->__end_;
1720 if (__n > static_cast<size_type>(this->__end_ - __p))
1721 {
1722 size_type __cx = __n - (this->__end_ - __p);
1723 __construct_at_end(__cx, __x);
1724 __n -= __cx;
1725 }
1726 if (__n > 0)
1727 {
1728 __move_range(__p, __old_last, __p + __old_n);
1729 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1730 if (__p <= __xr && __xr < this->__end_)
1731 __xr += __old_n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001732 _VSTD::fill_n(__p, __n, *__xr);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001733 }
1734 }
1735 else
1736 {
1737 allocator_type& __a = this->__alloc();
1738 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1739 __v.__construct_at_end(__n, __x);
1740 __p = __swap_out_circular_buffer(__v, __p);
1741 }
1742 }
1743 return __make_iter(__p);
1744}
1745
1746template <class _Tp, class _Allocator>
1747template <class _InputIterator>
1748typename enable_if
1749<
1750 __is_input_iterator <_InputIterator>::value &&
1751 !__is_forward_iterator<_InputIterator>::value,
1752 typename vector<_Tp, _Allocator>::iterator
1753>::type
1754vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1755{
Howard Hinnantabe26282011-09-16 17:29:17 +00001756#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001757 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1758 "vector::insert(iterator, range) called with an iterator not"
1759 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001760#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001761 difference_type __off = __position - begin();
1762 pointer __p = this->__begin_ + __off;
1763 allocator_type& __a = this->__alloc();
1764 pointer __old_last = this->__end_;
1765 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1766 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00001767 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001768 *__first);
1769 ++this->__end_;
1770 }
1771 __split_buffer<value_type, allocator_type&> __v(__a);
1772 if (__first != __last)
1773 {
1774#ifndef _LIBCPP_NO_EXCEPTIONS
1775 try
1776 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001777#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001778 __v.__construct_at_end(__first, __last);
1779 difference_type __old_size = __old_last - this->__begin_;
1780 difference_type __old_p = __p - this->__begin_;
1781 reserve(__recommend(size() + __v.size()));
1782 __p = this->__begin_ + __old_p;
1783 __old_last = this->__begin_ + __old_size;
1784#ifndef _LIBCPP_NO_EXCEPTIONS
1785 }
1786 catch (...)
1787 {
1788 erase(__make_iter(__old_last), end());
1789 throw;
1790 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001791#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001792 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00001793 __p = _VSTD::rotate(__p, __old_last, this->__end_);
Howard Hinnant0442b122011-09-16 18:41:29 +00001794 insert(__make_iter(__p), make_move_iterator(__v.begin()),
1795 make_move_iterator(__v.end()));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001796 return begin() + __off;
1797}
1798
1799template <class _Tp, class _Allocator>
1800template <class _ForwardIterator>
1801typename enable_if
1802<
1803 __is_forward_iterator<_ForwardIterator>::value,
1804 typename vector<_Tp, _Allocator>::iterator
1805>::type
1806vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1807{
Howard Hinnantabe26282011-09-16 17:29:17 +00001808#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001809 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1810 "vector::insert(iterator, range) called with an iterator not"
1811 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001812#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001813 pointer __p = this->__begin_ + (__position - begin());
Howard Hinnant0949eed2011-06-30 21:18:19 +00001814 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001815 if (__n > 0)
1816 {
1817 if (__n <= this->__end_cap() - this->__end_)
1818 {
1819 size_type __old_n = __n;
1820 pointer __old_last = this->__end_;
1821 _ForwardIterator __m = __last;
1822 difference_type __dx = this->__end_ - __p;
1823 if (__n > __dx)
1824 {
1825 __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001826 _VSTD::advance(__m, this->__end_ - __p);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001827 __construct_at_end(__m, __last);
1828 __n = __dx;
1829 }
1830 if (__n > 0)
1831 {
1832 __move_range(__p, __old_last, __p + __old_n);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001833 _VSTD::copy(__first, __m, __p);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001834 }
1835 }
1836 else
1837 {
1838 allocator_type& __a = this->__alloc();
1839 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1840 __v.__construct_at_end(__first, __last);
1841 __p = __swap_out_circular_buffer(__v, __p);
1842 }
1843 }
1844 return __make_iter(__p);
1845}
1846
1847template <class _Tp, class _Allocator>
1848void
1849vector<_Tp, _Allocator>::resize(size_type __sz)
1850{
1851 size_type __cs = size();
1852 if (__cs < __sz)
1853 this->__append(__sz - __cs);
1854 else if (__cs > __sz)
1855 this->__destruct_at_end(this->__begin_ + __sz);
1856}
1857
1858template <class _Tp, class _Allocator>
1859void
1860vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
1861{
1862 size_type __cs = size();
1863 if (__cs < __sz)
1864 this->__append(__sz - __cs, __x);
1865 else if (__cs > __sz)
1866 this->__destruct_at_end(this->__begin_ + __sz);
1867}
1868
1869template <class _Tp, class _Allocator>
1870void
1871vector<_Tp, _Allocator>::swap(vector& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001872 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1873 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001874{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001875 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
1876 this->__alloc() == __x.__alloc(),
1877 "vector::swap: Either propagate_on_container_swap must be true"
1878 " or the allocators must compare equal");
Howard Hinnant0949eed2011-06-30 21:18:19 +00001879 _VSTD::swap(this->__begin_, __x.__begin_);
1880 _VSTD::swap(this->__end_, __x.__end_);
1881 _VSTD::swap(this->__end_cap(), __x.__end_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001882 __base::__swap_alloc(this->__alloc(), __x.__alloc());
Howard Hinnantabe26282011-09-16 17:29:17 +00001883#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001884 __get_db()->swap(this, &__x);
Howard Hinnantabe26282011-09-16 17:29:17 +00001885#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001886}
1887
Howard Hinnant324bb032010-08-22 00:02:43 +00001888template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001889bool
1890vector<_Tp, _Allocator>::__invariants() const
1891{
1892 if (this->__begin_ == 0)
1893 {
1894 if (this->__end_ != 0 || this->__end_cap() != 0)
1895 return false;
1896 }
1897 else
1898 {
1899 if (this->__begin_ > this->__end_)
1900 return false;
1901 if (this->__begin_ == this->__end_cap())
1902 return false;
1903 if (this->__end_ > this->__end_cap())
1904 return false;
1905 }
1906 return true;
1907}
1908
Howard Hinnantabe26282011-09-16 17:29:17 +00001909#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001910
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001911template <class _Tp, class _Allocator>
Howard Hinnant7a563db2011-09-14 18:33:51 +00001912bool
1913vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
1914{
1915 return this->__begin_ <= __i->base() && __i->base() < this->__end_;
1916}
1917
1918template <class _Tp, class _Allocator>
1919bool
1920vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
1921{
1922 return this->__begin_ < __i->base() && __i->base() <= this->__end_;
1923}
1924
1925template <class _Tp, class _Allocator>
1926bool
1927vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
1928{
1929 const_pointer __p = __i->base() + __n;
1930 return this->__begin_ <= __p && __p <= this->__end_;
1931}
1932
1933template <class _Tp, class _Allocator>
1934bool
1935vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1936{
1937 const_pointer __p = __i->base() + __n;
1938 return this->__begin_ <= __p && __p < this->__end_;
1939}
1940
Howard Hinnantabe26282011-09-16 17:29:17 +00001941#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001942
1943template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001944_LIBCPP_INLINE_VISIBILITY inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001945void
1946vector<_Tp, _Allocator>::__invalidate_all_iterators()
1947{
Howard Hinnantabe26282011-09-16 17:29:17 +00001948#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001949 __get_db()->__invalidate_all(this);
Howard Hinnantabe26282011-09-16 17:29:17 +00001950#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001951}
1952
1953// vector<bool>
1954
1955template <class _Allocator> class vector<bool, _Allocator>;
1956
1957template <class _Allocator> struct hash<vector<bool, _Allocator> >;
1958
1959template <class _Allocator>
Howard Hinnantf03c3b42011-07-02 20:33:23 +00001960struct __has_storage_type<vector<bool, _Allocator> >
1961{
1962 static const bool value = true;
1963};
1964
1965template <class _Allocator>
Howard Hinnant36cdf022010-09-10 16:42:26 +00001966class _LIBCPP_VISIBLE vector<bool, _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001967 : private __vector_base_common<true>
1968{
1969public:
1970 typedef vector __self;
Howard Hinnant324bb032010-08-22 00:02:43 +00001971 typedef bool value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001972 typedef _Allocator allocator_type;
1973 typedef allocator_traits<allocator_type> __alloc_traits;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001974 typedef typename __alloc_traits::size_type size_type;
1975 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnantf867f632012-05-07 16:50:38 +00001976 typedef size_type __storage_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001977 typedef __bit_iterator<vector, false> pointer;
1978 typedef __bit_iterator<vector, true> const_pointer;
1979#ifdef _LIBCPP_DEBUG
1980 typedef __debug_iter<vector, pointer> iterator;
1981 typedef __debug_iter<vector, const_pointer> const_iterator;
1982
1983 friend class __debug_iter<vector, pointer>;
1984 friend class __debug_iter<vector, const_pointer>;
1985
1986 pair<iterator*, const_iterator*> __iterator_list_;
1987
1988 _LIBCPP_INLINE_VISIBILITY iterator*& __get_iterator_list(iterator*) {return __iterator_list_.first;}
1989 _LIBCPP_INLINE_VISIBILITY const_iterator*& __get_iterator_list(const_iterator*) {return __iterator_list_.second;}
Howard Hinnant324bb032010-08-22 00:02:43 +00001990#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001991 typedef pointer iterator;
1992 typedef const_pointer const_iterator;
Howard Hinnant324bb032010-08-22 00:02:43 +00001993#endif // _LIBCPP_DEBUG
Howard Hinnant0949eed2011-06-30 21:18:19 +00001994 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1995 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001996
1997private:
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001998 typedef typename __alloc_traits::template
1999#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
2000 rebind_alloc<__storage_type>
2001#else
2002 rebind_alloc<__storage_type>::other
2003#endif
2004 __storage_allocator;
2005 typedef allocator_traits<__storage_allocator> __storage_traits;
2006 typedef typename __storage_traits::pointer __storage_pointer;
2007 typedef typename __storage_traits::const_pointer __const_storage_pointer;
2008
2009 __storage_pointer __begin_;
2010 size_type __size_;
2011 __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
Howard Hinnant2bf1c082011-07-09 15:50:42 +00002012public:
Howard Hinnantf03c3b42011-07-02 20:33:23 +00002013 typedef __bit_reference<vector> reference;
2014 typedef __bit_const_reference<vector> const_reference;
Howard Hinnant2bf1c082011-07-09 15:50:42 +00002015private:
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002016 _LIBCPP_INLINE_VISIBILITY
2017 size_type& __cap() _NOEXCEPT
2018 {return __cap_alloc_.first();}
2019 _LIBCPP_INLINE_VISIBILITY
2020 const size_type& __cap() const _NOEXCEPT
2021 {return __cap_alloc_.first();}
2022 _LIBCPP_INLINE_VISIBILITY
2023 __storage_allocator& __alloc() _NOEXCEPT
2024 {return __cap_alloc_.second();}
2025 _LIBCPP_INLINE_VISIBILITY
2026 const __storage_allocator& __alloc() const _NOEXCEPT
2027 {return __cap_alloc_.second();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002028
2029 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2030
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002031 _LIBCPP_INLINE_VISIBILITY
2032 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002033 {return __n * __bits_per_word;}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002034 _LIBCPP_INLINE_VISIBILITY
2035 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002036 {return (__n - 1) / __bits_per_word + 1;}
2037
2038public:
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002039 _LIBCPP_INLINE_VISIBILITY
2040 vector()
2041 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002042 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002043 ~vector();
2044 explicit vector(size_type __n);
2045 vector(size_type __n, const value_type& __v);
2046 vector(size_type __n, const value_type& __v, const allocator_type& __a);
2047 template <class _InputIterator>
2048 vector(_InputIterator __first, _InputIterator __last,
2049 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2050 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2051 template <class _InputIterator>
2052 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2053 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2054 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2055 template <class _ForwardIterator>
2056 vector(_ForwardIterator __first, _ForwardIterator __last,
2057 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2058 template <class _ForwardIterator>
2059 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2060 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2061
2062 vector(const vector& __v);
2063 vector(const vector& __v, const allocator_type& __a);
2064 vector& operator=(const vector& __v);
Howard Hinnante3e32912011-08-12 21:56:02 +00002065#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002066 vector(initializer_list<value_type> __il);
2067 vector(initializer_list<value_type> __il, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +00002068#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002069
Howard Hinnant73d21a42010-09-04 23:28:19 +00002070#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002071 _LIBCPP_INLINE_VISIBILITY
2072 vector(vector&& __v)
2073 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002074 vector(vector&& __v, const allocator_type& __a);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002075 _LIBCPP_INLINE_VISIBILITY
2076 vector& operator=(vector&& __v)
2077 _NOEXCEPT_(
2078 __alloc_traits::propagate_on_container_move_assignment::value &&
2079 is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant73d21a42010-09-04 23:28:19 +00002080#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02 +00002081#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002082 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002083 vector& operator=(initializer_list<value_type> __il)
2084 {assign(__il.begin(), __il.end()); return *this;}
Howard Hinnante3e32912011-08-12 21:56:02 +00002085#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002086
2087 template <class _InputIterator>
2088 typename enable_if
2089 <
2090 __is_input_iterator<_InputIterator>::value &&
2091 !__is_forward_iterator<_InputIterator>::value,
2092 void
2093 >::type
2094 assign(_InputIterator __first, _InputIterator __last);
2095 template <class _ForwardIterator>
2096 typename enable_if
2097 <
2098 __is_forward_iterator<_ForwardIterator>::value,
2099 void
2100 >::type
2101 assign(_ForwardIterator __first, _ForwardIterator __last);
2102
2103 void assign(size_type __n, const value_type& __x);
Howard Hinnante3e32912011-08-12 21:56:02 +00002104#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002105 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002106 void assign(initializer_list<value_type> __il)
2107 {assign(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002108#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002109
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002110 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002111 {return allocator_type(this->__alloc());}
2112
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002113 size_type max_size() const _NOEXCEPT;
2114 _LIBCPP_INLINE_VISIBILITY
2115 size_type capacity() const _NOEXCEPT
2116 {return __internal_cap_to_external(__cap());}
2117 _LIBCPP_INLINE_VISIBILITY
2118 size_type size() const _NOEXCEPT
2119 {return __size_;}
2120 _LIBCPP_INLINE_VISIBILITY
2121 bool empty() const _NOEXCEPT
2122 {return __size_ == 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002123 void reserve(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002124 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002125
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002126 _LIBCPP_INLINE_VISIBILITY
2127 iterator begin() _NOEXCEPT
2128 {return __make_iter(0);}
2129 _LIBCPP_INLINE_VISIBILITY
2130 const_iterator begin() const _NOEXCEPT
2131 {return __make_iter(0);}
2132 _LIBCPP_INLINE_VISIBILITY
2133 iterator end() _NOEXCEPT
2134 {return __make_iter(__size_);}
2135 _LIBCPP_INLINE_VISIBILITY
2136 const_iterator end() const _NOEXCEPT
2137 {return __make_iter(__size_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002138
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002139 _LIBCPP_INLINE_VISIBILITY
2140 reverse_iterator rbegin() _NOEXCEPT
2141 {return reverse_iterator(end());}
2142 _LIBCPP_INLINE_VISIBILITY
2143 const_reverse_iterator rbegin() const _NOEXCEPT
2144 {return const_reverse_iterator(end());}
2145 _LIBCPP_INLINE_VISIBILITY
2146 reverse_iterator rend() _NOEXCEPT
2147 {return reverse_iterator(begin());}
2148 _LIBCPP_INLINE_VISIBILITY
2149 const_reverse_iterator rend() const _NOEXCEPT
2150 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002151
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002152 _LIBCPP_INLINE_VISIBILITY
2153 const_iterator cbegin() const _NOEXCEPT
2154 {return __make_iter(0);}
2155 _LIBCPP_INLINE_VISIBILITY
2156 const_iterator cend() const _NOEXCEPT
2157 {return __make_iter(__size_);}
2158 _LIBCPP_INLINE_VISIBILITY
2159 const_reverse_iterator crbegin() const _NOEXCEPT
2160 {return rbegin();}
2161 _LIBCPP_INLINE_VISIBILITY
2162 const_reverse_iterator crend() const _NOEXCEPT
2163 {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002164
2165 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
2166 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2167 reference at(size_type __n);
2168 const_reference at(size_type __n) const;
2169
2170 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
2171 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2172 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
2173 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
2174
2175 void push_back(const value_type& __x);
2176 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2177
2178 iterator insert(const_iterator __position, const value_type& __x);
2179 iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2180 iterator insert(const_iterator __position, size_type __n, const_reference __x);
2181 template <class _InputIterator>
2182 typename enable_if
2183 <
2184 __is_input_iterator <_InputIterator>::value &&
2185 !__is_forward_iterator<_InputIterator>::value,
2186 iterator
2187 >::type
2188 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2189 template <class _ForwardIterator>
2190 typename enable_if
2191 <
2192 __is_forward_iterator<_ForwardIterator>::value,
2193 iterator
2194 >::type
2195 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00002196#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002197 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002198 iterator insert(const_iterator __position, initializer_list<value_type> __il)
2199 {return insert(__position, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002200#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002201
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002202 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002203 iterator erase(const_iterator __first, const_iterator __last);
2204
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002205 _LIBCPP_INLINE_VISIBILITY
2206 void clear() _NOEXCEPT {__size_ = 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002207
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002208 void swap(vector&)
2209 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
2210 __is_nothrow_swappable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002211
2212 void resize(size_type __sz, value_type __x = false);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002213 void flip() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002214
2215 bool __invariants() const;
2216
2217private:
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002218 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002219 void allocate(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002220 void deallocate() _NOEXCEPT;
2221 _LIBCPP_INLINE_VISIBILITY
2222 static size_type __align(size_type __new_size) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002223 {return __new_size + (__bits_per_word-1) & ~(__bits_per_word-1);};
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002224 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
2225 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002226 template <class _ForwardIterator>
2227 typename enable_if
2228 <
2229 __is_forward_iterator<_ForwardIterator>::value,
2230 void
2231 >::type
2232 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2233 void __append(size_type __n, const_reference __x);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002234 _LIBCPP_INLINE_VISIBILITY
2235 reference __make_ref(size_type __pos) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002236 {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002237 _LIBCPP_INLINE_VISIBILITY
2238 const_reference __make_ref(size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002239 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
2240#ifdef _LIBCPP_DEBUG
2241 _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_type __pos)
2242 {return iterator(this, pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));}
2243 _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_type __pos) const
2244 {return const_iterator(this, const_pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));}
2245 _LIBCPP_INLINE_VISIBILITY iterator __const_iterator_cast(const_iterator __p)
2246 {return iterator(this, pointer(const_cast<__storage_pointer>(__p.base().__seg_), __p.base().__ctz_));}
Howard Hinnant324bb032010-08-22 00:02:43 +00002247#else // _LIBCPP_DEBUG
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002248 _LIBCPP_INLINE_VISIBILITY
2249 iterator __make_iter(size_type __pos) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002250 {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002251 _LIBCPP_INLINE_VISIBILITY
2252 const_iterator __make_iter(size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002253 {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002254 _LIBCPP_INLINE_VISIBILITY
2255 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002256 {return iterator(const_cast<__storage_pointer>(__p.__seg_), __p.__ctz_);}
Howard Hinnant324bb032010-08-22 00:02:43 +00002257#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002258
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002259 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002260 void __copy_assign_alloc(const vector& __v)
2261 {__copy_assign_alloc(__v, integral_constant<bool,
2262 __storage_traits::propagate_on_container_copy_assignment::value>());}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002263 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002264 void __copy_assign_alloc(const vector& __c, true_type)
2265 {
2266 if (__alloc() != __c.__alloc())
2267 deallocate();
2268 __alloc() = __c.__alloc();
2269 }
2270
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002271 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00002272 void __copy_assign_alloc(const vector&, false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002273 {}
2274
2275 void __move_assign(vector& __c, false_type);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002276 void __move_assign(vector& __c, true_type)
2277 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002278 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002279 void __move_assign_alloc(vector& __c)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002280 _NOEXCEPT_(
2281 !__storage_traits::propagate_on_container_move_assignment::value ||
2282 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002283 {__move_assign_alloc(__c, integral_constant<bool,
2284 __storage_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002285 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9cbee432011-09-02 20:42:31 +00002286 void __move_assign_alloc(vector& __c, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002287 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002288 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002289 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002290 }
2291
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002292 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00002293 void __move_assign_alloc(vector&, false_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002294 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002295 {}
2296
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002297 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002298 static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002299 _NOEXCEPT_(
2300 !__storage_traits::propagate_on_container_swap::value ||
2301 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002302 {__swap_alloc(__x, __y, integral_constant<bool,
2303 __storage_traits::propagate_on_container_swap::value>());}
2304
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002306 static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002307 _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002308 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002309 using _VSTD::swap;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002310 swap(__x, __y);
2311 }
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002312 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00002313 static void __swap_alloc(__storage_allocator&, __storage_allocator&, false_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002314 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002315 {}
2316
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002317 size_t __hash_code() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002318
2319 friend class __bit_reference<vector>;
2320 friend class __bit_const_reference<vector>;
2321 friend class __bit_iterator<vector, false>;
2322 friend class __bit_iterator<vector, true>;
Howard Hinnant4ae952a2012-08-17 17:10:18 +00002323 friend struct __bit_array<vector>;
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002324 friend struct _LIBCPP_VISIBLE hash<vector>;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002325};
2326
2327template <class _Allocator>
2328#ifndef _LIBCPP_DEBUG
2329_LIBCPP_INLINE_VISIBILITY inline
2330#endif
2331void
2332vector<bool, _Allocator>::__invalidate_all_iterators()
2333{
2334#ifdef _LIBCPP_DEBUG
2335 iterator::__remove_all(this);
2336 const_iterator::__remove_all(this);
Howard Hinnant324bb032010-08-22 00:02:43 +00002337#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002338}
2339
2340// Allocate space for __n objects
2341// throws length_error if __n > max_size()
2342// throws (probably bad_alloc) if memory run out
2343// Precondition: __begin_ == __end_ == __cap() == 0
2344// Precondition: __n > 0
2345// Postcondition: capacity() == __n
2346// Postcondition: size() == 0
2347template <class _Allocator>
2348void
2349vector<bool, _Allocator>::allocate(size_type __n)
2350{
2351 if (__n > max_size())
2352 this->__throw_length_error();
2353 __n = __external_cap_to_internal(__n);
2354 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2355 this->__size_ = 0;
2356 this->__cap() = __n;
2357}
2358
2359template <class _Allocator>
2360void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002361vector<bool, _Allocator>::deallocate() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002362{
2363 if (this->__begin_ != 0)
2364 {
2365 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2366 __invalidate_all_iterators();
2367 this->__begin_ = 0;
2368 this->__size_ = this->__cap() = 0;
2369 }
2370}
2371
2372template <class _Allocator>
2373typename vector<bool, _Allocator>::size_type
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002374vector<bool, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002375{
2376 size_type __amax = __storage_traits::max_size(__alloc());
2377 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
2378 if (__nmax / __bits_per_word <= __amax)
2379 return __nmax;
2380 return __internal_cap_to_external(__amax);
2381}
2382
2383// Precondition: __new_size > capacity()
2384template <class _Allocator>
2385_LIBCPP_INLINE_VISIBILITY inline
2386typename vector<bool, _Allocator>::size_type
2387vector<bool, _Allocator>::__recommend(size_type __new_size) const
2388{
2389 const size_type __ms = max_size();
2390 if (__new_size > __ms)
2391 this->__throw_length_error();
2392 const size_type __cap = capacity();
2393 if (__cap >= __ms / 2)
2394 return __ms;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002395 return _VSTD::max(2*__cap, __align(__new_size));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002396}
2397
2398// Default constructs __n objects starting at __end_
2399// Precondition: __n > 0
2400// Precondition: size() + __n <= capacity()
2401// Postcondition: size() == size() + __n
2402template <class _Allocator>
2403_LIBCPP_INLINE_VISIBILITY inline
2404void
2405vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2406{
2407 size_type __old_size = this->__size_;
2408 this->__size_ += __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002409 _VSTD::fill_n(__make_iter(__old_size), __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002410}
2411
2412template <class _Allocator>
2413template <class _ForwardIterator>
2414typename enable_if
2415<
2416 __is_forward_iterator<_ForwardIterator>::value,
2417 void
2418>::type
2419vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2420{
2421 size_type __old_size = this->__size_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002422 this->__size_ += _VSTD::distance(__first, __last);
2423 _VSTD::copy(__first, __last, __make_iter(__old_size));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002424}
2425
2426template <class _Allocator>
2427_LIBCPP_INLINE_VISIBILITY inline
2428vector<bool, _Allocator>::vector()
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002429 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002430 : __begin_(0),
2431 __size_(0),
2432 __cap_alloc_(0)
2433{
2434}
2435
2436template <class _Allocator>
2437_LIBCPP_INLINE_VISIBILITY inline
2438vector<bool, _Allocator>::vector(const allocator_type& __a)
2439 : __begin_(0),
2440 __size_(0),
2441 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2442{
2443}
2444
2445template <class _Allocator>
2446vector<bool, _Allocator>::vector(size_type __n)
2447 : __begin_(0),
2448 __size_(0),
2449 __cap_alloc_(0)
2450{
2451 if (__n > 0)
2452 {
2453 allocate(__n);
2454 __construct_at_end(__n, false);
2455 }
2456}
2457
2458template <class _Allocator>
2459vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
2460 : __begin_(0),
2461 __size_(0),
2462 __cap_alloc_(0)
2463{
2464 if (__n > 0)
2465 {
2466 allocate(__n);
2467 __construct_at_end(__n, __x);
2468 }
2469}
2470
2471template <class _Allocator>
2472vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
2473 : __begin_(0),
2474 __size_(0),
2475 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2476{
2477 if (__n > 0)
2478 {
2479 allocate(__n);
2480 __construct_at_end(__n, __x);
2481 }
2482}
2483
2484template <class _Allocator>
2485template <class _InputIterator>
2486vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2487 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2488 !__is_forward_iterator<_InputIterator>::value>::type*)
2489 : __begin_(0),
2490 __size_(0),
2491 __cap_alloc_(0)
2492{
2493#ifndef _LIBCPP_NO_EXCEPTIONS
2494 try
2495 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002496#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002497 for (; __first != __last; ++__first)
2498 push_back(*__first);
2499#ifndef _LIBCPP_NO_EXCEPTIONS
2500 }
2501 catch (...)
2502 {
2503 if (__begin_ != 0)
2504 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2505 __invalidate_all_iterators();
2506 throw;
2507 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002508#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002509}
2510
2511template <class _Allocator>
2512template <class _InputIterator>
2513vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2514 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2515 !__is_forward_iterator<_InputIterator>::value>::type*)
2516 : __begin_(0),
2517 __size_(0),
2518 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2519{
2520#ifndef _LIBCPP_NO_EXCEPTIONS
2521 try
2522 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002523#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002524 for (; __first != __last; ++__first)
2525 push_back(*__first);
2526#ifndef _LIBCPP_NO_EXCEPTIONS
2527 }
2528 catch (...)
2529 {
2530 if (__begin_ != 0)
2531 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2532 __invalidate_all_iterators();
2533 throw;
2534 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002535#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002536}
2537
2538template <class _Allocator>
2539template <class _ForwardIterator>
2540vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2541 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
2542 : __begin_(0),
2543 __size_(0),
2544 __cap_alloc_(0)
2545{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002546 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002547 if (__n > 0)
2548 {
2549 allocate(__n);
2550 __construct_at_end(__first, __last);
2551 }
2552}
2553
2554template <class _Allocator>
2555template <class _ForwardIterator>
2556vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2557 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
2558 : __begin_(0),
2559 __size_(0),
2560 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2561{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002562 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002563 if (__n > 0)
2564 {
2565 allocate(__n);
2566 __construct_at_end(__first, __last);
2567 }
2568}
2569
Howard Hinnante3e32912011-08-12 21:56:02 +00002570#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2571
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002572template <class _Allocator>
2573vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
2574 : __begin_(0),
2575 __size_(0),
2576 __cap_alloc_(0)
2577{
2578 size_type __n = static_cast<size_type>(__il.size());
2579 if (__n > 0)
2580 {
2581 allocate(__n);
2582 __construct_at_end(__il.begin(), __il.end());
2583 }
2584}
2585
2586template <class _Allocator>
2587vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
2588 : __begin_(0),
2589 __size_(0),
2590 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2591{
2592 size_type __n = static_cast<size_type>(__il.size());
2593 if (__n > 0)
2594 {
2595 allocate(__n);
2596 __construct_at_end(__il.begin(), __il.end());
2597 }
2598}
2599
Howard Hinnante3e32912011-08-12 21:56:02 +00002600#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2601
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002602template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002603vector<bool, _Allocator>::~vector()
2604{
2605 if (__begin_ != 0)
2606 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2607#ifdef _LIBCPP_DEBUG
2608 __invalidate_all_iterators();
2609#endif
2610}
2611
2612template <class _Allocator>
2613vector<bool, _Allocator>::vector(const vector& __v)
2614 : __begin_(0),
2615 __size_(0),
2616 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2617{
2618 if (__v.size() > 0)
2619 {
2620 allocate(__v.size());
2621 __construct_at_end(__v.begin(), __v.end());
2622 }
2623}
2624
2625template <class _Allocator>
2626vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
2627 : __begin_(0),
2628 __size_(0),
2629 __cap_alloc_(0, __a)
2630{
2631 if (__v.size() > 0)
2632 {
2633 allocate(__v.size());
2634 __construct_at_end(__v.begin(), __v.end());
2635 }
2636}
2637
2638template <class _Allocator>
2639vector<bool, _Allocator>&
2640vector<bool, _Allocator>::operator=(const vector& __v)
2641{
2642 if (this != &__v)
2643 {
2644 __copy_assign_alloc(__v);
2645 if (__v.__size_)
2646 {
2647 if (__v.__size_ > capacity())
2648 {
2649 deallocate();
2650 allocate(__v.__size_);
2651 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002652 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002653 }
2654 __size_ = __v.__size_;
2655 }
2656 return *this;
2657}
2658
Howard Hinnant73d21a42010-09-04 23:28:19 +00002659#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2660
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002661template <class _Allocator>
2662_LIBCPP_INLINE_VISIBILITY inline
2663vector<bool, _Allocator>::vector(vector&& __v)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002664 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002665 : __begin_(__v.__begin_),
2666 __size_(__v.__size_),
2667 __cap_alloc_(__v.__cap_alloc_)
2668{
2669 __v.__begin_ = 0;
2670 __v.__size_ = 0;
2671 __v.__cap() = 0;
2672}
2673
2674template <class _Allocator>
2675vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
2676 : __begin_(0),
2677 __size_(0),
2678 __cap_alloc_(0, __a)
2679{
2680 if (__a == allocator_type(__v.__alloc()))
2681 {
2682 this->__begin_ = __v.__begin_;
2683 this->__size_ = __v.__size_;
2684 this->__cap() = __v.__cap();
2685 __v.__begin_ = nullptr;
2686 __v.__cap() = __v.__size_ = 0;
2687 }
2688 else if (__v.size() > 0)
2689 {
2690 allocate(__v.size());
2691 __construct_at_end(__v.begin(), __v.end());
2692 }
2693}
2694
2695template <class _Allocator>
2696_LIBCPP_INLINE_VISIBILITY inline
2697vector<bool, _Allocator>&
2698vector<bool, _Allocator>::operator=(vector&& __v)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002699 _NOEXCEPT_(
2700 __alloc_traits::propagate_on_container_move_assignment::value &&
2701 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002702{
2703 __move_assign(__v, integral_constant<bool,
2704 __storage_traits::propagate_on_container_move_assignment::value>());
Argyrios Kyrtzidis1dc6f7a2012-10-13 02:03:45 +00002705 return *this;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002706}
2707
2708template <class _Allocator>
2709void
2710vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2711{
2712 if (__alloc() != __c.__alloc())
2713 assign(__c.begin(), __c.end());
2714 else
2715 __move_assign(__c, true_type());
2716}
2717
2718template <class _Allocator>
2719void
2720vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002721 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002722{
2723 deallocate();
2724 this->__begin_ = __c.__begin_;
2725 this->__size_ = __c.__size_;
2726 this->__cap() = __c.__cap();
2727 __move_assign_alloc(__c);
2728 __c.__begin_ = nullptr;
2729 __c.__cap() = __c.__size_ = 0;
2730}
Howard Hinnant73d21a42010-09-04 23:28:19 +00002731
2732#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002733
2734template <class _Allocator>
2735void
2736vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2737{
2738 __size_ = 0;
2739 if (__n > 0)
2740 {
2741 size_type __c = capacity();
2742 if (__n <= __c)
2743 __size_ = __n;
2744 else
2745 {
2746 vector __v(__alloc());
2747 __v.reserve(__recommend(__n));
2748 __v.__size_ = __n;
2749 swap(__v);
2750 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002751 _VSTD::fill_n(begin(), __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002752 }
2753}
2754
2755template <class _Allocator>
2756template <class _InputIterator>
2757typename enable_if
2758<
2759 __is_input_iterator<_InputIterator>::value &&
2760 !__is_forward_iterator<_InputIterator>::value,
2761 void
2762>::type
2763vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2764{
2765 clear();
2766 for (; __first != __last; ++__first)
2767 push_back(*__first);
2768}
2769
2770template <class _Allocator>
2771template <class _ForwardIterator>
2772typename enable_if
2773<
2774 __is_forward_iterator<_ForwardIterator>::value,
2775 void
2776>::type
2777vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2778{
2779 clear();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002780 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002781 if (__n)
2782 {
2783 if (__n > capacity())
2784 {
2785 deallocate();
2786 allocate(__n);
2787 }
2788 __construct_at_end(__first, __last);
2789 }
2790}
2791
2792template <class _Allocator>
2793void
2794vector<bool, _Allocator>::reserve(size_type __n)
2795{
2796 if (__n > capacity())
2797 {
2798 vector __v(this->__alloc());
2799 __v.allocate(__n);
2800 __v.__construct_at_end(this->begin(), this->end());
2801 swap(__v);
2802 __invalidate_all_iterators();
2803 }
2804}
2805
2806template <class _Allocator>
2807void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002808vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002809{
2810 if (__external_cap_to_internal(size()) > __cap())
2811 {
2812#ifndef _LIBCPP_NO_EXCEPTIONS
2813 try
2814 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002815#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002816 vector(*this, allocator_type(__alloc())).swap(*this);
2817#ifndef _LIBCPP_NO_EXCEPTIONS
2818 }
2819 catch (...)
2820 {
2821 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002822#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002823 }
2824}
2825
2826template <class _Allocator>
2827typename vector<bool, _Allocator>::reference
2828vector<bool, _Allocator>::at(size_type __n)
2829{
2830 if (__n >= size())
2831 this->__throw_out_of_range();
2832 return (*this)[__n];
2833}
2834
2835template <class _Allocator>
2836typename vector<bool, _Allocator>::const_reference
2837vector<bool, _Allocator>::at(size_type __n) const
2838{
2839 if (__n >= size())
2840 this->__throw_out_of_range();
2841 return (*this)[__n];
2842}
2843
2844template <class _Allocator>
2845void
2846vector<bool, _Allocator>::push_back(const value_type& __x)
2847{
2848 if (this->__size_ == this->capacity())
2849 reserve(__recommend(this->__size_ + 1));
2850 ++this->__size_;
2851 back() = __x;
2852}
2853
2854template <class _Allocator>
2855typename vector<bool, _Allocator>::iterator
2856vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
2857{
2858 iterator __r;
2859 if (size() < capacity())
2860 {
2861 const_iterator __old_end = end();
2862 ++__size_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002863 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002864 __r = __const_iterator_cast(__position);
2865 }
2866 else
2867 {
2868 vector __v(__alloc());
2869 __v.reserve(__recommend(__size_ + 1));
2870 __v.__size_ = __size_ + 1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002871 __r = _VSTD::copy(cbegin(), __position, __v.begin());
2872 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002873 swap(__v);
2874 }
2875 *__r = __x;
2876 return __r;
2877}
2878
2879template <class _Allocator>
2880typename vector<bool, _Allocator>::iterator
2881vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
2882{
2883 iterator __r;
2884 size_type __c = capacity();
2885 if (__n <= __c && size() <= __c - __n)
2886 {
2887 const_iterator __old_end = end();
2888 __size_ += __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002889 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002890 __r = __const_iterator_cast(__position);
2891 }
2892 else
2893 {
2894 vector __v(__alloc());
2895 __v.reserve(__recommend(__size_ + __n));
2896 __v.__size_ = __size_ + __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002897 __r = _VSTD::copy(cbegin(), __position, __v.begin());
2898 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002899 swap(__v);
2900 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002901 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002902 return __r;
2903}
2904
2905template <class _Allocator>
2906template <class _InputIterator>
2907typename enable_if
2908<
2909 __is_input_iterator <_InputIterator>::value &&
2910 !__is_forward_iterator<_InputIterator>::value,
2911 typename vector<bool, _Allocator>::iterator
2912>::type
2913vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
2914{
2915 difference_type __off = __position - begin();
2916 iterator __p = __const_iterator_cast(__position);
2917 iterator __old_end = end();
2918 for (; size() != capacity() && __first != __last; ++__first)
2919 {
2920 ++this->__size_;
2921 back() = *__first;
2922 }
2923 vector __v(__alloc());
2924 if (__first != __last)
2925 {
2926#ifndef _LIBCPP_NO_EXCEPTIONS
2927 try
2928 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002929#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002930 __v.assign(__first, __last);
2931 difference_type __old_size = static_cast<difference_type>(__old_end - begin());
2932 difference_type __old_p = __p - begin();
2933 reserve(__recommend(size() + __v.size()));
2934 __p = begin() + __old_p;
2935 __old_end = begin() + __old_size;
2936#ifndef _LIBCPP_NO_EXCEPTIONS
2937 }
2938 catch (...)
2939 {
2940 erase(__old_end, end());
2941 throw;
2942 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002943#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002944 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002945 __p = _VSTD::rotate(__p, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002946 insert(__p, __v.begin(), __v.end());
2947 return begin() + __off;
2948}
2949
2950template <class _Allocator>
2951template <class _ForwardIterator>
2952typename enable_if
2953<
2954 __is_forward_iterator<_ForwardIterator>::value,
2955 typename vector<bool, _Allocator>::iterator
2956>::type
2957vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
2958{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002959 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002960 iterator __r;
2961 size_type __c = capacity();
2962 if (__n <= __c && size() <= __c - __n)
2963 {
2964 const_iterator __old_end = end();
2965 __size_ += __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002966 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002967 __r = __const_iterator_cast(__position);
2968 }
2969 else
2970 {
2971 vector __v(__alloc());
2972 __v.reserve(__recommend(__size_ + __n));
2973 __v.__size_ = __size_ + __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002974 __r = _VSTD::copy(cbegin(), __position, __v.begin());
2975 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002976 swap(__v);
2977 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002978 _VSTD::copy(__first, __last, __r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002979 return __r;
2980}
2981
2982template <class _Allocator>
2983_LIBCPP_INLINE_VISIBILITY inline
2984typename vector<bool, _Allocator>::iterator
2985vector<bool, _Allocator>::erase(const_iterator __position)
2986{
2987 iterator __r = __const_iterator_cast(__position);
Howard Hinnant0949eed2011-06-30 21:18:19 +00002988 _VSTD::copy(__position + 1, this->cend(), __r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002989 --__size_;
2990 return __r;
2991}
2992
2993template <class _Allocator>
2994typename vector<bool, _Allocator>::iterator
2995vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
2996{
2997 iterator __r = __const_iterator_cast(__first);
2998 difference_type __d = __last - __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002999 _VSTD::copy(__last, this->cend(), __r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003000 __size_ -= __d;
3001 return __r;
3002}
3003
3004template <class _Allocator>
3005void
3006vector<bool, _Allocator>::swap(vector& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003007 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3008 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003009{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003010 _VSTD::swap(this->__begin_, __x.__begin_);
3011 _VSTD::swap(this->__size_, __x.__size_);
3012 _VSTD::swap(this->__cap(), __x.__cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003013 __swap_alloc(this->__alloc(), __x.__alloc());
3014#ifdef _LIBCPP_DEBUG
3015 iterator::swap(this, &__x);
3016 const_iterator::swap(this, &__x);
Howard Hinnant324bb032010-08-22 00:02:43 +00003017#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003018}
3019
Howard Hinnant324bb032010-08-22 00:02:43 +00003020template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003021void
3022vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3023{
3024 size_type __cs = size();
3025 if (__cs < __sz)
3026 {
3027 iterator __r;
3028 size_type __c = capacity();
3029 size_type __n = __sz - __cs;
3030 if (__n <= __c && __cs <= __c - __n)
3031 {
3032 __r = end();
3033 __size_ += __n;
3034 }
3035 else
3036 {
3037 vector __v(__alloc());
3038 __v.reserve(__recommend(__size_ + __n));
3039 __v.__size_ = __size_ + __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003040 __r = _VSTD::copy(cbegin(), cend(), __v.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003041 swap(__v);
3042 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003043 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003044 }
3045 else
3046 __size_ = __sz;
3047}
3048
Howard Hinnant324bb032010-08-22 00:02:43 +00003049template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003050void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003051vector<bool, _Allocator>::flip() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003052{
3053 // do middle whole words
3054 size_type __n = __size_;
3055 __storage_pointer __p = __begin_;
3056 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3057 *__p = ~*__p;
3058 // do last partial word
3059 if (__n > 0)
3060 {
3061 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3062 __storage_type __b = *__p & __m;
3063 *__p &= ~__m;
3064 *__p |= ~__b & __m;
3065 }
3066}
3067
Howard Hinnant324bb032010-08-22 00:02:43 +00003068template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003069bool
3070vector<bool, _Allocator>::__invariants() const
3071{
3072 if (this->__begin_ == 0)
3073 {
3074 if (this->__size_ != 0 || this->__cap() != 0)
3075 return false;
3076 }
3077 else
3078 {
3079 if (this->__cap() == 0)
3080 return false;
3081 if (this->__size_ > this->capacity())
3082 return false;
3083 }
3084 return true;
3085}
3086
Howard Hinnant324bb032010-08-22 00:02:43 +00003087template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003088size_t
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003089vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003090{
3091 size_t __h = 0;
3092 // do middle whole words
3093 size_type __n = __size_;
3094 __storage_pointer __p = __begin_;
3095 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3096 __h ^= *__p;
3097 // do last partial word
3098 if (__n > 0)
3099 {
3100 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3101 __h ^= *__p & __m;
3102 }
3103 return __h;
3104}
3105
3106template <class _Allocator>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003107struct _LIBCPP_VISIBLE hash<vector<bool, _Allocator> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003108 : public unary_function<vector<bool, _Allocator>, size_t>
3109{
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003110 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003111 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003112 {return __vec.__hash_code();}
3113};
3114
3115template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003116_LIBCPP_INLINE_VISIBILITY inline
3117bool
3118operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3119{
3120 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003121 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003122}
3123
3124template <class _Tp, class _Allocator>
3125_LIBCPP_INLINE_VISIBILITY inline
3126bool
3127operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3128{
3129 return !(__x == __y);
3130}
3131
3132template <class _Tp, class _Allocator>
3133_LIBCPP_INLINE_VISIBILITY inline
3134bool
3135operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3136{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003137 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003138}
3139
3140template <class _Tp, class _Allocator>
3141_LIBCPP_INLINE_VISIBILITY inline
3142bool
3143operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3144{
3145 return __y < __x;
3146}
3147
3148template <class _Tp, class _Allocator>
3149_LIBCPP_INLINE_VISIBILITY inline
3150bool
3151operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3152{
3153 return !(__x < __y);
3154}
3155
3156template <class _Tp, class _Allocator>
3157_LIBCPP_INLINE_VISIBILITY inline
3158bool
3159operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3160{
3161 return !(__y < __x);
3162}
3163
3164template <class _Tp, class _Allocator>
3165_LIBCPP_INLINE_VISIBILITY inline
3166void
3167swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003168 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003169{
3170 __x.swap(__y);
3171}
3172
3173_LIBCPP_END_NAMESPACE_STD
3174
3175#endif // _LIBCPP_VECTOR