blob: 0d5b6b8b66df9f62193d7919d5521457e0408170 [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 Hinnantbc8d3f92010-05-11 19:42:16 +0000316extern 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));
1461 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_++), _VSTD::forward<_Up>(__x));
1462 __swap_out_circular_buffer(__v);
1463}
1464
1465template <class _Tp, class _Allocator>
1466_LIBCPP_INLINE_VISIBILITY inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001467void
1468vector<_Tp, _Allocator>::push_back(const_reference __x)
1469{
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001470 if (this->__end_ != this->__end_cap())
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001471 {
1472 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001473 _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001474 ++this->__end_;
1475 }
1476 else
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001477 __push_back_slow_path(__x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001478}
1479
Howard Hinnant73d21a42010-09-04 23:28:19 +00001480#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001481
1482template <class _Tp, class _Allocator>
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001483_LIBCPP_INLINE_VISIBILITY inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001484void
1485vector<_Tp, _Allocator>::push_back(value_type&& __x)
1486{
1487 if (this->__end_ < this->__end_cap())
1488 {
1489 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001490 _VSTD::__to_raw_pointer(this->__end_),
1491 _VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001492 ++this->__end_;
1493 }
1494 else
Howard Hinnantb0bfd9b2012-02-15 00:41:34 +00001495 __push_back_slow_path(_VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001496}
1497
Howard Hinnant73d21a42010-09-04 23:28:19 +00001498#ifndef _LIBCPP_HAS_NO_VARIADICS
1499
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001500template <class _Tp, class _Allocator>
1501template <class... _Args>
1502void
Howard Hinnant0438ea22012-02-26 15:30:12 +00001503vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1504{
1505 allocator_type& __a = this->__alloc();
1506 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1507// __v.emplace_back(_VSTD::forward<_Args>(__args)...);
1508 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_++), _VSTD::forward<_Args>(__args)...);
1509 __swap_out_circular_buffer(__v);
1510}
1511
1512template <class _Tp, class _Allocator>
1513template <class... _Args>
1514_LIBCPP_INLINE_VISIBILITY inline
1515void
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001516vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1517{
1518 if (this->__end_ < this->__end_cap())
1519 {
1520 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001521 _VSTD::__to_raw_pointer(this->__end_),
1522 _VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001523 ++this->__end_;
1524 }
1525 else
Howard Hinnant0438ea22012-02-26 15:30:12 +00001526 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001527}
1528
Howard Hinnant73d21a42010-09-04 23:28:19 +00001529#endif // _LIBCPP_HAS_NO_VARIADICS
1530#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001531
1532template <class _Tp, class _Allocator>
1533_LIBCPP_INLINE_VISIBILITY inline
1534void
1535vector<_Tp, _Allocator>::pop_back()
1536{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001537 _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001538 this->__destruct_at_end(this->__end_ - 1);
1539}
1540
1541template <class _Tp, class _Allocator>
1542_LIBCPP_INLINE_VISIBILITY inline
1543typename vector<_Tp, _Allocator>::iterator
1544vector<_Tp, _Allocator>::erase(const_iterator __position)
1545{
Howard Hinnantabe26282011-09-16 17:29:17 +00001546#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001547 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1548 "vector::erase(iterator) called with an iterator not"
1549 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001550#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001551 pointer __p = const_cast<pointer>(&*__position);
1552 iterator __r = __make_iter(__p);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001553 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001554 return __r;
1555}
1556
1557template <class _Tp, class _Allocator>
1558typename vector<_Tp, _Allocator>::iterator
1559vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1560{
Howard Hinnantabe26282011-09-16 17:29:17 +00001561#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001562 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
1563 "vector::erase(iterator, iterator) called with an iterator not"
1564 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001565#endif
Howard Hinnant7a563db2011-09-14 18:33:51 +00001566 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001567 pointer __p = this->__begin_ + (__first - begin());
1568 iterator __r = __make_iter(__p);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001569 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001570 return __r;
1571}
1572
1573template <class _Tp, class _Allocator>
1574void
1575vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1576{
1577 pointer __old_last = this->__end_;
1578 difference_type __n = __old_last - __to;
1579 for (pointer __i = __from_s + __n; __i < __from_e; ++__i, ++this->__end_)
1580 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001581 _VSTD::__to_raw_pointer(this->__end_),
1582 _VSTD::move(*__i));
1583 _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001584}
1585
1586template <class _Tp, class _Allocator>
1587typename vector<_Tp, _Allocator>::iterator
1588vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1589{
Howard Hinnantabe26282011-09-16 17:29:17 +00001590#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001591 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1592 "vector::insert(iterator, x) called with an iterator not"
1593 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001594#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001595 pointer __p = this->__begin_ + (__position - begin());
1596 if (this->__end_ < this->__end_cap())
1597 {
1598 if (__p == this->__end_)
1599 {
1600 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001601 _VSTD::__to_raw_pointer(this->__end_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001602 ++this->__end_;
1603 }
1604 else
1605 {
1606 __move_range(__p, this->__end_, __p + 1);
1607 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1608 if (__p <= __xr && __xr < this->__end_)
1609 ++__xr;
1610 *__p = *__xr;
1611 }
1612 }
1613 else
1614 {
1615 allocator_type& __a = this->__alloc();
1616 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1617 __v.push_back(__x);
1618 __p = __swap_out_circular_buffer(__v, __p);
1619 }
1620 return __make_iter(__p);
1621}
1622
Howard Hinnant73d21a42010-09-04 23:28:19 +00001623#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001624
1625template <class _Tp, class _Allocator>
1626typename vector<_Tp, _Allocator>::iterator
1627vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1628{
Howard Hinnantabe26282011-09-16 17:29:17 +00001629#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001630 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1631 "vector::insert(iterator, x) called with an iterator not"
1632 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001633#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001634 pointer __p = this->__begin_ + (__position - begin());
1635 if (this->__end_ < this->__end_cap())
1636 {
1637 if (__p == this->__end_)
1638 {
1639 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001640 _VSTD::__to_raw_pointer(this->__end_),
1641 _VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001642 ++this->__end_;
1643 }
1644 else
1645 {
1646 __move_range(__p, this->__end_, __p + 1);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001647 *__p = _VSTD::move(__x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001648 }
1649 }
1650 else
1651 {
1652 allocator_type& __a = this->__alloc();
1653 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001654 __v.push_back(_VSTD::move(__x));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001655 __p = __swap_out_circular_buffer(__v, __p);
1656 }
1657 return __make_iter(__p);
1658}
1659
Howard Hinnant73d21a42010-09-04 23:28:19 +00001660#ifndef _LIBCPP_HAS_NO_VARIADICS
1661
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001662template <class _Tp, class _Allocator>
1663template <class... _Args>
1664typename vector<_Tp, _Allocator>::iterator
1665vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1666{
Howard Hinnantabe26282011-09-16 17:29:17 +00001667#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001668 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1669 "vector::emplace(iterator, x) called with an iterator not"
1670 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001671#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001672 pointer __p = this->__begin_ + (__position - begin());
1673 if (this->__end_ < this->__end_cap())
1674 {
1675 if (__p == this->__end_)
1676 {
1677 __alloc_traits::construct(this->__alloc(),
Howard Hinnant0949eed2011-06-30 21:18:19 +00001678 _VSTD::__to_raw_pointer(this->__end_),
1679 _VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001680 ++this->__end_;
1681 }
1682 else
1683 {
1684 __move_range(__p, this->__end_, __p + 1);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001685 *__p = value_type(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001686 }
1687 }
1688 else
1689 {
1690 allocator_type& __a = this->__alloc();
1691 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001692 __v.emplace_back(_VSTD::forward<_Args>(__args)...);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001693 __p = __swap_out_circular_buffer(__v, __p);
1694 }
1695 return __make_iter(__p);
1696}
1697
Howard Hinnant73d21a42010-09-04 23:28:19 +00001698#endif // _LIBCPP_HAS_NO_VARIADICS
1699#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001700
1701template <class _Tp, class _Allocator>
1702typename vector<_Tp, _Allocator>::iterator
1703vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1704{
Howard Hinnantabe26282011-09-16 17:29:17 +00001705#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001706 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1707 "vector::insert(iterator, n, x) called with an iterator not"
1708 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001709#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001710 pointer __p = this->__begin_ + (__position - begin());
1711 if (__n > 0)
1712 {
1713 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1714 {
1715 size_type __old_n = __n;
1716 pointer __old_last = this->__end_;
1717 if (__n > static_cast<size_type>(this->__end_ - __p))
1718 {
1719 size_type __cx = __n - (this->__end_ - __p);
1720 __construct_at_end(__cx, __x);
1721 __n -= __cx;
1722 }
1723 if (__n > 0)
1724 {
1725 __move_range(__p, __old_last, __p + __old_n);
1726 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1727 if (__p <= __xr && __xr < this->__end_)
1728 __xr += __old_n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001729 _VSTD::fill_n(__p, __n, *__xr);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001730 }
1731 }
1732 else
1733 {
1734 allocator_type& __a = this->__alloc();
1735 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1736 __v.__construct_at_end(__n, __x);
1737 __p = __swap_out_circular_buffer(__v, __p);
1738 }
1739 }
1740 return __make_iter(__p);
1741}
1742
1743template <class _Tp, class _Allocator>
1744template <class _InputIterator>
1745typename enable_if
1746<
1747 __is_input_iterator <_InputIterator>::value &&
1748 !__is_forward_iterator<_InputIterator>::value,
1749 typename vector<_Tp, _Allocator>::iterator
1750>::type
1751vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1752{
Howard Hinnantabe26282011-09-16 17:29:17 +00001753#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001754 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1755 "vector::insert(iterator, range) called with an iterator not"
1756 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001757#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001758 difference_type __off = __position - begin();
1759 pointer __p = this->__begin_ + __off;
1760 allocator_type& __a = this->__alloc();
1761 pointer __old_last = this->__end_;
1762 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1763 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00001764 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001765 *__first);
1766 ++this->__end_;
1767 }
1768 __split_buffer<value_type, allocator_type&> __v(__a);
1769 if (__first != __last)
1770 {
1771#ifndef _LIBCPP_NO_EXCEPTIONS
1772 try
1773 {
Howard Hinnant324bb032010-08-22 00:02:43 +00001774#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001775 __v.__construct_at_end(__first, __last);
1776 difference_type __old_size = __old_last - this->__begin_;
1777 difference_type __old_p = __p - this->__begin_;
1778 reserve(__recommend(size() + __v.size()));
1779 __p = this->__begin_ + __old_p;
1780 __old_last = this->__begin_ + __old_size;
1781#ifndef _LIBCPP_NO_EXCEPTIONS
1782 }
1783 catch (...)
1784 {
1785 erase(__make_iter(__old_last), end());
1786 throw;
1787 }
Howard Hinnant324bb032010-08-22 00:02:43 +00001788#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001789 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00001790 __p = _VSTD::rotate(__p, __old_last, this->__end_);
Howard Hinnant0442b122011-09-16 18:41:29 +00001791 insert(__make_iter(__p), make_move_iterator(__v.begin()),
1792 make_move_iterator(__v.end()));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001793 return begin() + __off;
1794}
1795
1796template <class _Tp, class _Allocator>
1797template <class _ForwardIterator>
1798typename enable_if
1799<
1800 __is_forward_iterator<_ForwardIterator>::value,
1801 typename vector<_Tp, _Allocator>::iterator
1802>::type
1803vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1804{
Howard Hinnantabe26282011-09-16 17:29:17 +00001805#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001806 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1807 "vector::insert(iterator, range) called with an iterator not"
1808 " referring to this vector");
Howard Hinnantabe26282011-09-16 17:29:17 +00001809#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001810 pointer __p = this->__begin_ + (__position - begin());
Howard Hinnant0949eed2011-06-30 21:18:19 +00001811 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001812 if (__n > 0)
1813 {
1814 if (__n <= this->__end_cap() - this->__end_)
1815 {
1816 size_type __old_n = __n;
1817 pointer __old_last = this->__end_;
1818 _ForwardIterator __m = __last;
1819 difference_type __dx = this->__end_ - __p;
1820 if (__n > __dx)
1821 {
1822 __m = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00001823 _VSTD::advance(__m, this->__end_ - __p);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001824 __construct_at_end(__m, __last);
1825 __n = __dx;
1826 }
1827 if (__n > 0)
1828 {
1829 __move_range(__p, __old_last, __p + __old_n);
Howard Hinnant0949eed2011-06-30 21:18:19 +00001830 _VSTD::copy(__first, __m, __p);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001831 }
1832 }
1833 else
1834 {
1835 allocator_type& __a = this->__alloc();
1836 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1837 __v.__construct_at_end(__first, __last);
1838 __p = __swap_out_circular_buffer(__v, __p);
1839 }
1840 }
1841 return __make_iter(__p);
1842}
1843
1844template <class _Tp, class _Allocator>
1845void
1846vector<_Tp, _Allocator>::resize(size_type __sz)
1847{
1848 size_type __cs = size();
1849 if (__cs < __sz)
1850 this->__append(__sz - __cs);
1851 else if (__cs > __sz)
1852 this->__destruct_at_end(this->__begin_ + __sz);
1853}
1854
1855template <class _Tp, class _Allocator>
1856void
1857vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
1858{
1859 size_type __cs = size();
1860 if (__cs < __sz)
1861 this->__append(__sz - __cs, __x);
1862 else if (__cs > __sz)
1863 this->__destruct_at_end(this->__begin_ + __sz);
1864}
1865
1866template <class _Tp, class _Allocator>
1867void
1868vector<_Tp, _Allocator>::swap(vector& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00001869 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1870 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001871{
Howard Hinnant7a563db2011-09-14 18:33:51 +00001872 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
1873 this->__alloc() == __x.__alloc(),
1874 "vector::swap: Either propagate_on_container_swap must be true"
1875 " or the allocators must compare equal");
Howard Hinnant0949eed2011-06-30 21:18:19 +00001876 _VSTD::swap(this->__begin_, __x.__begin_);
1877 _VSTD::swap(this->__end_, __x.__end_);
1878 _VSTD::swap(this->__end_cap(), __x.__end_cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001879 __base::__swap_alloc(this->__alloc(), __x.__alloc());
Howard Hinnantabe26282011-09-16 17:29:17 +00001880#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001881 __get_db()->swap(this, &__x);
Howard Hinnantabe26282011-09-16 17:29:17 +00001882#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001883}
1884
Howard Hinnant324bb032010-08-22 00:02:43 +00001885template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001886bool
1887vector<_Tp, _Allocator>::__invariants() const
1888{
1889 if (this->__begin_ == 0)
1890 {
1891 if (this->__end_ != 0 || this->__end_cap() != 0)
1892 return false;
1893 }
1894 else
1895 {
1896 if (this->__begin_ > this->__end_)
1897 return false;
1898 if (this->__begin_ == this->__end_cap())
1899 return false;
1900 if (this->__end_ > this->__end_cap())
1901 return false;
1902 }
1903 return true;
1904}
1905
Howard Hinnantabe26282011-09-16 17:29:17 +00001906#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001907
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001908template <class _Tp, class _Allocator>
Howard Hinnant7a563db2011-09-14 18:33:51 +00001909bool
1910vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
1911{
1912 return this->__begin_ <= __i->base() && __i->base() < this->__end_;
1913}
1914
1915template <class _Tp, class _Allocator>
1916bool
1917vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
1918{
1919 return this->__begin_ < __i->base() && __i->base() <= this->__end_;
1920}
1921
1922template <class _Tp, class _Allocator>
1923bool
1924vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
1925{
1926 const_pointer __p = __i->base() + __n;
1927 return this->__begin_ <= __p && __p <= this->__end_;
1928}
1929
1930template <class _Tp, class _Allocator>
1931bool
1932vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
1933{
1934 const_pointer __p = __i->base() + __n;
1935 return this->__begin_ <= __p && __p < this->__end_;
1936}
1937
Howard Hinnantabe26282011-09-16 17:29:17 +00001938#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001939
1940template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001941_LIBCPP_INLINE_VISIBILITY inline
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001942void
1943vector<_Tp, _Allocator>::__invalidate_all_iterators()
1944{
Howard Hinnantabe26282011-09-16 17:29:17 +00001945#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant7a563db2011-09-14 18:33:51 +00001946 __get_db()->__invalidate_all(this);
Howard Hinnantabe26282011-09-16 17:29:17 +00001947#endif // _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001948}
1949
1950// vector<bool>
1951
1952template <class _Allocator> class vector<bool, _Allocator>;
1953
1954template <class _Allocator> struct hash<vector<bool, _Allocator> >;
1955
1956template <class _Allocator>
Howard Hinnantf03c3b42011-07-02 20:33:23 +00001957struct __has_storage_type<vector<bool, _Allocator> >
1958{
1959 static const bool value = true;
1960};
1961
1962template <class _Allocator>
Howard Hinnant36cdf022010-09-10 16:42:26 +00001963class _LIBCPP_VISIBLE vector<bool, _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001964 : private __vector_base_common<true>
1965{
1966public:
1967 typedef vector __self;
Howard Hinnant324bb032010-08-22 00:02:43 +00001968 typedef bool value_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001969 typedef _Allocator allocator_type;
1970 typedef allocator_traits<allocator_type> __alloc_traits;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001971 typedef typename __alloc_traits::size_type size_type;
1972 typedef typename __alloc_traits::difference_type difference_type;
Howard Hinnantf867f632012-05-07 16:50:38 +00001973 typedef size_type __storage_type;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001974 typedef __bit_iterator<vector, false> pointer;
1975 typedef __bit_iterator<vector, true> const_pointer;
1976#ifdef _LIBCPP_DEBUG
1977 typedef __debug_iter<vector, pointer> iterator;
1978 typedef __debug_iter<vector, const_pointer> const_iterator;
1979
1980 friend class __debug_iter<vector, pointer>;
1981 friend class __debug_iter<vector, const_pointer>;
1982
1983 pair<iterator*, const_iterator*> __iterator_list_;
1984
1985 _LIBCPP_INLINE_VISIBILITY iterator*& __get_iterator_list(iterator*) {return __iterator_list_.first;}
1986 _LIBCPP_INLINE_VISIBILITY const_iterator*& __get_iterator_list(const_iterator*) {return __iterator_list_.second;}
Howard Hinnant324bb032010-08-22 00:02:43 +00001987#else // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001988 typedef pointer iterator;
1989 typedef const_pointer const_iterator;
Howard Hinnant324bb032010-08-22 00:02:43 +00001990#endif // _LIBCPP_DEBUG
Howard Hinnant0949eed2011-06-30 21:18:19 +00001991 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1992 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001993
1994private:
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001995 typedef typename __alloc_traits::template
1996#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
1997 rebind_alloc<__storage_type>
1998#else
1999 rebind_alloc<__storage_type>::other
2000#endif
2001 __storage_allocator;
2002 typedef allocator_traits<__storage_allocator> __storage_traits;
2003 typedef typename __storage_traits::pointer __storage_pointer;
2004 typedef typename __storage_traits::const_pointer __const_storage_pointer;
2005
2006 __storage_pointer __begin_;
2007 size_type __size_;
2008 __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
Howard Hinnant2bf1c082011-07-09 15:50:42 +00002009public:
Howard Hinnantf03c3b42011-07-02 20:33:23 +00002010 typedef __bit_reference<vector> reference;
2011 typedef __bit_const_reference<vector> const_reference;
Howard Hinnant2bf1c082011-07-09 15:50:42 +00002012private:
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002013 _LIBCPP_INLINE_VISIBILITY
2014 size_type& __cap() _NOEXCEPT
2015 {return __cap_alloc_.first();}
2016 _LIBCPP_INLINE_VISIBILITY
2017 const size_type& __cap() const _NOEXCEPT
2018 {return __cap_alloc_.first();}
2019 _LIBCPP_INLINE_VISIBILITY
2020 __storage_allocator& __alloc() _NOEXCEPT
2021 {return __cap_alloc_.second();}
2022 _LIBCPP_INLINE_VISIBILITY
2023 const __storage_allocator& __alloc() const _NOEXCEPT
2024 {return __cap_alloc_.second();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002025
2026 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2027
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002028 _LIBCPP_INLINE_VISIBILITY
2029 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002030 {return __n * __bits_per_word;}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002031 _LIBCPP_INLINE_VISIBILITY
2032 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002033 {return (__n - 1) / __bits_per_word + 1;}
2034
2035public:
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002036 _LIBCPP_INLINE_VISIBILITY
2037 vector()
2038 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002039 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002040 ~vector();
2041 explicit vector(size_type __n);
2042 vector(size_type __n, const value_type& __v);
2043 vector(size_type __n, const value_type& __v, const allocator_type& __a);
2044 template <class _InputIterator>
2045 vector(_InputIterator __first, _InputIterator __last,
2046 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2047 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2048 template <class _InputIterator>
2049 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2050 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2051 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2052 template <class _ForwardIterator>
2053 vector(_ForwardIterator __first, _ForwardIterator __last,
2054 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2055 template <class _ForwardIterator>
2056 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2057 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2058
2059 vector(const vector& __v);
2060 vector(const vector& __v, const allocator_type& __a);
2061 vector& operator=(const vector& __v);
Howard Hinnante3e32912011-08-12 21:56:02 +00002062#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002063 vector(initializer_list<value_type> __il);
2064 vector(initializer_list<value_type> __il, const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02 +00002065#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002066
Howard Hinnant73d21a42010-09-04 23:28:19 +00002067#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002068 _LIBCPP_INLINE_VISIBILITY
2069 vector(vector&& __v)
2070 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002071 vector(vector&& __v, const allocator_type& __a);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002072 _LIBCPP_INLINE_VISIBILITY
2073 vector& operator=(vector&& __v)
2074 _NOEXCEPT_(
2075 __alloc_traits::propagate_on_container_move_assignment::value &&
2076 is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnant73d21a42010-09-04 23:28:19 +00002077#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02 +00002078#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002079 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002080 vector& operator=(initializer_list<value_type> __il)
2081 {assign(__il.begin(), __il.end()); return *this;}
Howard Hinnante3e32912011-08-12 21:56:02 +00002082#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002083
2084 template <class _InputIterator>
2085 typename enable_if
2086 <
2087 __is_input_iterator<_InputIterator>::value &&
2088 !__is_forward_iterator<_InputIterator>::value,
2089 void
2090 >::type
2091 assign(_InputIterator __first, _InputIterator __last);
2092 template <class _ForwardIterator>
2093 typename enable_if
2094 <
2095 __is_forward_iterator<_ForwardIterator>::value,
2096 void
2097 >::type
2098 assign(_ForwardIterator __first, _ForwardIterator __last);
2099
2100 void assign(size_type __n, const value_type& __x);
Howard Hinnante3e32912011-08-12 21:56:02 +00002101#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002102 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002103 void assign(initializer_list<value_type> __il)
2104 {assign(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002105#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002106
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002107 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002108 {return allocator_type(this->__alloc());}
2109
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002110 size_type max_size() const _NOEXCEPT;
2111 _LIBCPP_INLINE_VISIBILITY
2112 size_type capacity() const _NOEXCEPT
2113 {return __internal_cap_to_external(__cap());}
2114 _LIBCPP_INLINE_VISIBILITY
2115 size_type size() const _NOEXCEPT
2116 {return __size_;}
2117 _LIBCPP_INLINE_VISIBILITY
2118 bool empty() const _NOEXCEPT
2119 {return __size_ == 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002120 void reserve(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002121 void shrink_to_fit() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002122
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002123 _LIBCPP_INLINE_VISIBILITY
2124 iterator begin() _NOEXCEPT
2125 {return __make_iter(0);}
2126 _LIBCPP_INLINE_VISIBILITY
2127 const_iterator begin() const _NOEXCEPT
2128 {return __make_iter(0);}
2129 _LIBCPP_INLINE_VISIBILITY
2130 iterator end() _NOEXCEPT
2131 {return __make_iter(__size_);}
2132 _LIBCPP_INLINE_VISIBILITY
2133 const_iterator end() const _NOEXCEPT
2134 {return __make_iter(__size_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002135
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002136 _LIBCPP_INLINE_VISIBILITY
2137 reverse_iterator rbegin() _NOEXCEPT
2138 {return reverse_iterator(end());}
2139 _LIBCPP_INLINE_VISIBILITY
2140 const_reverse_iterator rbegin() const _NOEXCEPT
2141 {return const_reverse_iterator(end());}
2142 _LIBCPP_INLINE_VISIBILITY
2143 reverse_iterator rend() _NOEXCEPT
2144 {return reverse_iterator(begin());}
2145 _LIBCPP_INLINE_VISIBILITY
2146 const_reverse_iterator rend() const _NOEXCEPT
2147 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002148
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002149 _LIBCPP_INLINE_VISIBILITY
2150 const_iterator cbegin() const _NOEXCEPT
2151 {return __make_iter(0);}
2152 _LIBCPP_INLINE_VISIBILITY
2153 const_iterator cend() const _NOEXCEPT
2154 {return __make_iter(__size_);}
2155 _LIBCPP_INLINE_VISIBILITY
2156 const_reverse_iterator crbegin() const _NOEXCEPT
2157 {return rbegin();}
2158 _LIBCPP_INLINE_VISIBILITY
2159 const_reverse_iterator crend() const _NOEXCEPT
2160 {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002161
2162 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
2163 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2164 reference at(size_type __n);
2165 const_reference at(size_type __n) const;
2166
2167 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
2168 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2169 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
2170 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
2171
2172 void push_back(const value_type& __x);
2173 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2174
2175 iterator insert(const_iterator __position, const value_type& __x);
2176 iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2177 iterator insert(const_iterator __position, size_type __n, const_reference __x);
2178 template <class _InputIterator>
2179 typename enable_if
2180 <
2181 __is_input_iterator <_InputIterator>::value &&
2182 !__is_forward_iterator<_InputIterator>::value,
2183 iterator
2184 >::type
2185 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2186 template <class _ForwardIterator>
2187 typename enable_if
2188 <
2189 __is_forward_iterator<_ForwardIterator>::value,
2190 iterator
2191 >::type
2192 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02 +00002193#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002194 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002195 iterator insert(const_iterator __position, initializer_list<value_type> __il)
2196 {return insert(__position, __il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002197#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002198
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002199 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002200 iterator erase(const_iterator __first, const_iterator __last);
2201
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002202 _LIBCPP_INLINE_VISIBILITY
2203 void clear() _NOEXCEPT {__size_ = 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002204
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002205 void swap(vector&)
2206 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
2207 __is_nothrow_swappable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002208
2209 void resize(size_type __sz, value_type __x = false);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002210 void flip() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002211
2212 bool __invariants() const;
2213
2214private:
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002215 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002216 void allocate(size_type __n);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002217 void deallocate() _NOEXCEPT;
2218 _LIBCPP_INLINE_VISIBILITY
2219 static size_type __align(size_type __new_size) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002220 {return __new_size + (__bits_per_word-1) & ~(__bits_per_word-1);};
Howard Hinnant2d72b1e2010-12-17 14:46:43 +00002221 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
2222 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002223 template <class _ForwardIterator>
2224 typename enable_if
2225 <
2226 __is_forward_iterator<_ForwardIterator>::value,
2227 void
2228 >::type
2229 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2230 void __append(size_type __n, const_reference __x);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002231 _LIBCPP_INLINE_VISIBILITY
2232 reference __make_ref(size_type __pos) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002233 {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002234 _LIBCPP_INLINE_VISIBILITY
2235 const_reference __make_ref(size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002236 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
2237#ifdef _LIBCPP_DEBUG
2238 _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_type __pos)
2239 {return iterator(this, pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));}
2240 _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_type __pos) const
2241 {return const_iterator(this, const_pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));}
2242 _LIBCPP_INLINE_VISIBILITY iterator __const_iterator_cast(const_iterator __p)
2243 {return iterator(this, pointer(const_cast<__storage_pointer>(__p.base().__seg_), __p.base().__ctz_));}
Howard Hinnant324bb032010-08-22 00:02:43 +00002244#else // _LIBCPP_DEBUG
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002245 _LIBCPP_INLINE_VISIBILITY
2246 iterator __make_iter(size_type __pos) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002247 {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002248 _LIBCPP_INLINE_VISIBILITY
2249 const_iterator __make_iter(size_type __pos) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002250 {return const_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 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002253 {return iterator(const_cast<__storage_pointer>(__p.__seg_), __p.__ctz_);}
Howard Hinnant324bb032010-08-22 00:02:43 +00002254#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002255
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002256 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002257 void __copy_assign_alloc(const vector& __v)
2258 {__copy_assign_alloc(__v, integral_constant<bool,
2259 __storage_traits::propagate_on_container_copy_assignment::value>());}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002260 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002261 void __copy_assign_alloc(const vector& __c, true_type)
2262 {
2263 if (__alloc() != __c.__alloc())
2264 deallocate();
2265 __alloc() = __c.__alloc();
2266 }
2267
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002268 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00002269 void __copy_assign_alloc(const vector&, false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002270 {}
2271
2272 void __move_assign(vector& __c, false_type);
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002273 void __move_assign(vector& __c, true_type)
2274 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002275 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002276 void __move_assign_alloc(vector& __c)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002277 _NOEXCEPT_(
2278 !__storage_traits::propagate_on_container_move_assignment::value ||
2279 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002280 {__move_assign_alloc(__c, integral_constant<bool,
2281 __storage_traits::propagate_on_container_move_assignment::value>());}
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002282 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9cbee432011-09-02 20:42:31 +00002283 void __move_assign_alloc(vector& __c, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002284 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002285 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002286 __alloc() = _VSTD::move(__c.__alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002287 }
2288
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002289 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00002290 void __move_assign_alloc(vector&, false_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002291 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002292 {}
2293
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002294 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002295 static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002296 _NOEXCEPT_(
2297 !__storage_traits::propagate_on_container_swap::value ||
2298 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002299 {__swap_alloc(__x, __y, integral_constant<bool,
2300 __storage_traits::propagate_on_container_swap::value>());}
2301
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002302 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002303 static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002304 _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002305 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002306 using _VSTD::swap;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002307 swap(__x, __y);
2308 }
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002309 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantec3773c2011-12-01 20:21:04 +00002310 static void __swap_alloc(__storage_allocator&, __storage_allocator&, false_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002311 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002312 {}
2313
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002314 size_t __hash_code() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002315
2316 friend class __bit_reference<vector>;
2317 friend class __bit_const_reference<vector>;
2318 friend class __bit_iterator<vector, false>;
2319 friend class __bit_iterator<vector, true>;
2320 friend class __bit_array<vector>;
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002321 friend struct _LIBCPP_VISIBLE hash<vector>;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002322};
2323
2324template <class _Allocator>
2325#ifndef _LIBCPP_DEBUG
2326_LIBCPP_INLINE_VISIBILITY inline
2327#endif
2328void
2329vector<bool, _Allocator>::__invalidate_all_iterators()
2330{
2331#ifdef _LIBCPP_DEBUG
2332 iterator::__remove_all(this);
2333 const_iterator::__remove_all(this);
Howard Hinnant324bb032010-08-22 00:02:43 +00002334#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002335}
2336
2337// Allocate space for __n objects
2338// throws length_error if __n > max_size()
2339// throws (probably bad_alloc) if memory run out
2340// Precondition: __begin_ == __end_ == __cap() == 0
2341// Precondition: __n > 0
2342// Postcondition: capacity() == __n
2343// Postcondition: size() == 0
2344template <class _Allocator>
2345void
2346vector<bool, _Allocator>::allocate(size_type __n)
2347{
2348 if (__n > max_size())
2349 this->__throw_length_error();
2350 __n = __external_cap_to_internal(__n);
2351 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2352 this->__size_ = 0;
2353 this->__cap() = __n;
2354}
2355
2356template <class _Allocator>
2357void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002358vector<bool, _Allocator>::deallocate() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002359{
2360 if (this->__begin_ != 0)
2361 {
2362 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2363 __invalidate_all_iterators();
2364 this->__begin_ = 0;
2365 this->__size_ = this->__cap() = 0;
2366 }
2367}
2368
2369template <class _Allocator>
2370typename vector<bool, _Allocator>::size_type
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002371vector<bool, _Allocator>::max_size() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002372{
2373 size_type __amax = __storage_traits::max_size(__alloc());
2374 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
2375 if (__nmax / __bits_per_word <= __amax)
2376 return __nmax;
2377 return __internal_cap_to_external(__amax);
2378}
2379
2380// Precondition: __new_size > capacity()
2381template <class _Allocator>
2382_LIBCPP_INLINE_VISIBILITY inline
2383typename vector<bool, _Allocator>::size_type
2384vector<bool, _Allocator>::__recommend(size_type __new_size) const
2385{
2386 const size_type __ms = max_size();
2387 if (__new_size > __ms)
2388 this->__throw_length_error();
2389 const size_type __cap = capacity();
2390 if (__cap >= __ms / 2)
2391 return __ms;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002392 return _VSTD::max(2*__cap, __align(__new_size));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002393}
2394
2395// Default constructs __n objects starting at __end_
2396// Precondition: __n > 0
2397// Precondition: size() + __n <= capacity()
2398// Postcondition: size() == size() + __n
2399template <class _Allocator>
2400_LIBCPP_INLINE_VISIBILITY inline
2401void
2402vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2403{
2404 size_type __old_size = this->__size_;
2405 this->__size_ += __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002406 _VSTD::fill_n(__make_iter(__old_size), __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002407}
2408
2409template <class _Allocator>
2410template <class _ForwardIterator>
2411typename enable_if
2412<
2413 __is_forward_iterator<_ForwardIterator>::value,
2414 void
2415>::type
2416vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2417{
2418 size_type __old_size = this->__size_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002419 this->__size_ += _VSTD::distance(__first, __last);
2420 _VSTD::copy(__first, __last, __make_iter(__old_size));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002421}
2422
2423template <class _Allocator>
2424_LIBCPP_INLINE_VISIBILITY inline
2425vector<bool, _Allocator>::vector()
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002426 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002427 : __begin_(0),
2428 __size_(0),
2429 __cap_alloc_(0)
2430{
2431}
2432
2433template <class _Allocator>
2434_LIBCPP_INLINE_VISIBILITY inline
2435vector<bool, _Allocator>::vector(const allocator_type& __a)
2436 : __begin_(0),
2437 __size_(0),
2438 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2439{
2440}
2441
2442template <class _Allocator>
2443vector<bool, _Allocator>::vector(size_type __n)
2444 : __begin_(0),
2445 __size_(0),
2446 __cap_alloc_(0)
2447{
2448 if (__n > 0)
2449 {
2450 allocate(__n);
2451 __construct_at_end(__n, false);
2452 }
2453}
2454
2455template <class _Allocator>
2456vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
2457 : __begin_(0),
2458 __size_(0),
2459 __cap_alloc_(0)
2460{
2461 if (__n > 0)
2462 {
2463 allocate(__n);
2464 __construct_at_end(__n, __x);
2465 }
2466}
2467
2468template <class _Allocator>
2469vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
2470 : __begin_(0),
2471 __size_(0),
2472 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2473{
2474 if (__n > 0)
2475 {
2476 allocate(__n);
2477 __construct_at_end(__n, __x);
2478 }
2479}
2480
2481template <class _Allocator>
2482template <class _InputIterator>
2483vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2484 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2485 !__is_forward_iterator<_InputIterator>::value>::type*)
2486 : __begin_(0),
2487 __size_(0),
2488 __cap_alloc_(0)
2489{
2490#ifndef _LIBCPP_NO_EXCEPTIONS
2491 try
2492 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002493#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002494 for (; __first != __last; ++__first)
2495 push_back(*__first);
2496#ifndef _LIBCPP_NO_EXCEPTIONS
2497 }
2498 catch (...)
2499 {
2500 if (__begin_ != 0)
2501 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2502 __invalidate_all_iterators();
2503 throw;
2504 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002505#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002506}
2507
2508template <class _Allocator>
2509template <class _InputIterator>
2510vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2511 typename enable_if<__is_input_iterator <_InputIterator>::value &&
2512 !__is_forward_iterator<_InputIterator>::value>::type*)
2513 : __begin_(0),
2514 __size_(0),
2515 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2516{
2517#ifndef _LIBCPP_NO_EXCEPTIONS
2518 try
2519 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002520#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002521 for (; __first != __last; ++__first)
2522 push_back(*__first);
2523#ifndef _LIBCPP_NO_EXCEPTIONS
2524 }
2525 catch (...)
2526 {
2527 if (__begin_ != 0)
2528 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2529 __invalidate_all_iterators();
2530 throw;
2531 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002532#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002533}
2534
2535template <class _Allocator>
2536template <class _ForwardIterator>
2537vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2538 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
2539 : __begin_(0),
2540 __size_(0),
2541 __cap_alloc_(0)
2542{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002543 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002544 if (__n > 0)
2545 {
2546 allocate(__n);
2547 __construct_at_end(__first, __last);
2548 }
2549}
2550
2551template <class _Allocator>
2552template <class _ForwardIterator>
2553vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2554 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
2555 : __begin_(0),
2556 __size_(0),
2557 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2558{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002559 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002560 if (__n > 0)
2561 {
2562 allocate(__n);
2563 __construct_at_end(__first, __last);
2564 }
2565}
2566
Howard Hinnante3e32912011-08-12 21:56:02 +00002567#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2568
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002569template <class _Allocator>
2570vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
2571 : __begin_(0),
2572 __size_(0),
2573 __cap_alloc_(0)
2574{
2575 size_type __n = static_cast<size_type>(__il.size());
2576 if (__n > 0)
2577 {
2578 allocate(__n);
2579 __construct_at_end(__il.begin(), __il.end());
2580 }
2581}
2582
2583template <class _Allocator>
2584vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
2585 : __begin_(0),
2586 __size_(0),
2587 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2588{
2589 size_type __n = static_cast<size_type>(__il.size());
2590 if (__n > 0)
2591 {
2592 allocate(__n);
2593 __construct_at_end(__il.begin(), __il.end());
2594 }
2595}
2596
Howard Hinnante3e32912011-08-12 21:56:02 +00002597#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2598
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002599template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002600vector<bool, _Allocator>::~vector()
2601{
2602 if (__begin_ != 0)
2603 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2604#ifdef _LIBCPP_DEBUG
2605 __invalidate_all_iterators();
2606#endif
2607}
2608
2609template <class _Allocator>
2610vector<bool, _Allocator>::vector(const vector& __v)
2611 : __begin_(0),
2612 __size_(0),
2613 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2614{
2615 if (__v.size() > 0)
2616 {
2617 allocate(__v.size());
2618 __construct_at_end(__v.begin(), __v.end());
2619 }
2620}
2621
2622template <class _Allocator>
2623vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
2624 : __begin_(0),
2625 __size_(0),
2626 __cap_alloc_(0, __a)
2627{
2628 if (__v.size() > 0)
2629 {
2630 allocate(__v.size());
2631 __construct_at_end(__v.begin(), __v.end());
2632 }
2633}
2634
2635template <class _Allocator>
2636vector<bool, _Allocator>&
2637vector<bool, _Allocator>::operator=(const vector& __v)
2638{
2639 if (this != &__v)
2640 {
2641 __copy_assign_alloc(__v);
2642 if (__v.__size_)
2643 {
2644 if (__v.__size_ > capacity())
2645 {
2646 deallocate();
2647 allocate(__v.__size_);
2648 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002649 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002650 }
2651 __size_ = __v.__size_;
2652 }
2653 return *this;
2654}
2655
Howard Hinnant73d21a42010-09-04 23:28:19 +00002656#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2657
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002658template <class _Allocator>
2659_LIBCPP_INLINE_VISIBILITY inline
2660vector<bool, _Allocator>::vector(vector&& __v)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002661 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002662 : __begin_(__v.__begin_),
2663 __size_(__v.__size_),
2664 __cap_alloc_(__v.__cap_alloc_)
2665{
2666 __v.__begin_ = 0;
2667 __v.__size_ = 0;
2668 __v.__cap() = 0;
2669}
2670
2671template <class _Allocator>
2672vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
2673 : __begin_(0),
2674 __size_(0),
2675 __cap_alloc_(0, __a)
2676{
2677 if (__a == allocator_type(__v.__alloc()))
2678 {
2679 this->__begin_ = __v.__begin_;
2680 this->__size_ = __v.__size_;
2681 this->__cap() = __v.__cap();
2682 __v.__begin_ = nullptr;
2683 __v.__cap() = __v.__size_ = 0;
2684 }
2685 else if (__v.size() > 0)
2686 {
2687 allocate(__v.size());
2688 __construct_at_end(__v.begin(), __v.end());
2689 }
2690}
2691
2692template <class _Allocator>
2693_LIBCPP_INLINE_VISIBILITY inline
2694vector<bool, _Allocator>&
2695vector<bool, _Allocator>::operator=(vector&& __v)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002696 _NOEXCEPT_(
2697 __alloc_traits::propagate_on_container_move_assignment::value &&
2698 is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002699{
2700 __move_assign(__v, integral_constant<bool,
2701 __storage_traits::propagate_on_container_move_assignment::value>());
2702}
2703
2704template <class _Allocator>
2705void
2706vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2707{
2708 if (__alloc() != __c.__alloc())
2709 assign(__c.begin(), __c.end());
2710 else
2711 __move_assign(__c, true_type());
2712}
2713
2714template <class _Allocator>
2715void
2716vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002717 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002718{
2719 deallocate();
2720 this->__begin_ = __c.__begin_;
2721 this->__size_ = __c.__size_;
2722 this->__cap() = __c.__cap();
2723 __move_assign_alloc(__c);
2724 __c.__begin_ = nullptr;
2725 __c.__cap() = __c.__size_ = 0;
2726}
Howard Hinnant73d21a42010-09-04 23:28:19 +00002727
2728#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002729
2730template <class _Allocator>
2731void
2732vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2733{
2734 __size_ = 0;
2735 if (__n > 0)
2736 {
2737 size_type __c = capacity();
2738 if (__n <= __c)
2739 __size_ = __n;
2740 else
2741 {
2742 vector __v(__alloc());
2743 __v.reserve(__recommend(__n));
2744 __v.__size_ = __n;
2745 swap(__v);
2746 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002747 _VSTD::fill_n(begin(), __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002748 }
2749}
2750
2751template <class _Allocator>
2752template <class _InputIterator>
2753typename enable_if
2754<
2755 __is_input_iterator<_InputIterator>::value &&
2756 !__is_forward_iterator<_InputIterator>::value,
2757 void
2758>::type
2759vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2760{
2761 clear();
2762 for (; __first != __last; ++__first)
2763 push_back(*__first);
2764}
2765
2766template <class _Allocator>
2767template <class _ForwardIterator>
2768typename enable_if
2769<
2770 __is_forward_iterator<_ForwardIterator>::value,
2771 void
2772>::type
2773vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2774{
2775 clear();
Howard Hinnant0949eed2011-06-30 21:18:19 +00002776 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002777 if (__n)
2778 {
2779 if (__n > capacity())
2780 {
2781 deallocate();
2782 allocate(__n);
2783 }
2784 __construct_at_end(__first, __last);
2785 }
2786}
2787
2788template <class _Allocator>
2789void
2790vector<bool, _Allocator>::reserve(size_type __n)
2791{
2792 if (__n > capacity())
2793 {
2794 vector __v(this->__alloc());
2795 __v.allocate(__n);
2796 __v.__construct_at_end(this->begin(), this->end());
2797 swap(__v);
2798 __invalidate_all_iterators();
2799 }
2800}
2801
2802template <class _Allocator>
2803void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00002804vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002805{
2806 if (__external_cap_to_internal(size()) > __cap())
2807 {
2808#ifndef _LIBCPP_NO_EXCEPTIONS
2809 try
2810 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002811#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002812 vector(*this, allocator_type(__alloc())).swap(*this);
2813#ifndef _LIBCPP_NO_EXCEPTIONS
2814 }
2815 catch (...)
2816 {
2817 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002818#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002819 }
2820}
2821
2822template <class _Allocator>
2823typename vector<bool, _Allocator>::reference
2824vector<bool, _Allocator>::at(size_type __n)
2825{
2826 if (__n >= size())
2827 this->__throw_out_of_range();
2828 return (*this)[__n];
2829}
2830
2831template <class _Allocator>
2832typename vector<bool, _Allocator>::const_reference
2833vector<bool, _Allocator>::at(size_type __n) const
2834{
2835 if (__n >= size())
2836 this->__throw_out_of_range();
2837 return (*this)[__n];
2838}
2839
2840template <class _Allocator>
2841void
2842vector<bool, _Allocator>::push_back(const value_type& __x)
2843{
2844 if (this->__size_ == this->capacity())
2845 reserve(__recommend(this->__size_ + 1));
2846 ++this->__size_;
2847 back() = __x;
2848}
2849
2850template <class _Allocator>
2851typename vector<bool, _Allocator>::iterator
2852vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
2853{
2854 iterator __r;
2855 if (size() < capacity())
2856 {
2857 const_iterator __old_end = end();
2858 ++__size_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002859 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002860 __r = __const_iterator_cast(__position);
2861 }
2862 else
2863 {
2864 vector __v(__alloc());
2865 __v.reserve(__recommend(__size_ + 1));
2866 __v.__size_ = __size_ + 1;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002867 __r = _VSTD::copy(cbegin(), __position, __v.begin());
2868 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002869 swap(__v);
2870 }
2871 *__r = __x;
2872 return __r;
2873}
2874
2875template <class _Allocator>
2876typename vector<bool, _Allocator>::iterator
2877vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
2878{
2879 iterator __r;
2880 size_type __c = capacity();
2881 if (__n <= __c && size() <= __c - __n)
2882 {
2883 const_iterator __old_end = end();
2884 __size_ += __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002885 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002886 __r = __const_iterator_cast(__position);
2887 }
2888 else
2889 {
2890 vector __v(__alloc());
2891 __v.reserve(__recommend(__size_ + __n));
2892 __v.__size_ = __size_ + __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002893 __r = _VSTD::copy(cbegin(), __position, __v.begin());
2894 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002895 swap(__v);
2896 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002897 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002898 return __r;
2899}
2900
2901template <class _Allocator>
2902template <class _InputIterator>
2903typename enable_if
2904<
2905 __is_input_iterator <_InputIterator>::value &&
2906 !__is_forward_iterator<_InputIterator>::value,
2907 typename vector<bool, _Allocator>::iterator
2908>::type
2909vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
2910{
2911 difference_type __off = __position - begin();
2912 iterator __p = __const_iterator_cast(__position);
2913 iterator __old_end = end();
2914 for (; size() != capacity() && __first != __last; ++__first)
2915 {
2916 ++this->__size_;
2917 back() = *__first;
2918 }
2919 vector __v(__alloc());
2920 if (__first != __last)
2921 {
2922#ifndef _LIBCPP_NO_EXCEPTIONS
2923 try
2924 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002925#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002926 __v.assign(__first, __last);
2927 difference_type __old_size = static_cast<difference_type>(__old_end - begin());
2928 difference_type __old_p = __p - begin();
2929 reserve(__recommend(size() + __v.size()));
2930 __p = begin() + __old_p;
2931 __old_end = begin() + __old_size;
2932#ifndef _LIBCPP_NO_EXCEPTIONS
2933 }
2934 catch (...)
2935 {
2936 erase(__old_end, end());
2937 throw;
2938 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002939#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002940 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002941 __p = _VSTD::rotate(__p, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002942 insert(__p, __v.begin(), __v.end());
2943 return begin() + __off;
2944}
2945
2946template <class _Allocator>
2947template <class _ForwardIterator>
2948typename enable_if
2949<
2950 __is_forward_iterator<_ForwardIterator>::value,
2951 typename vector<bool, _Allocator>::iterator
2952>::type
2953vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
2954{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002955 difference_type __n = _VSTD::distance(__first, __last);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002956 iterator __r;
2957 size_type __c = capacity();
2958 if (__n <= __c && size() <= __c - __n)
2959 {
2960 const_iterator __old_end = end();
2961 __size_ += __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002962 _VSTD::copy_backward(__position, __old_end, end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002963 __r = __const_iterator_cast(__position);
2964 }
2965 else
2966 {
2967 vector __v(__alloc());
2968 __v.reserve(__recommend(__size_ + __n));
2969 __v.__size_ = __size_ + __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002970 __r = _VSTD::copy(cbegin(), __position, __v.begin());
2971 _VSTD::copy_backward(__position, cend(), __v.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002972 swap(__v);
2973 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002974 _VSTD::copy(__first, __last, __r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002975 return __r;
2976}
2977
2978template <class _Allocator>
2979_LIBCPP_INLINE_VISIBILITY inline
2980typename vector<bool, _Allocator>::iterator
2981vector<bool, _Allocator>::erase(const_iterator __position)
2982{
2983 iterator __r = __const_iterator_cast(__position);
Howard Hinnant0949eed2011-06-30 21:18:19 +00002984 _VSTD::copy(__position + 1, this->cend(), __r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002985 --__size_;
2986 return __r;
2987}
2988
2989template <class _Allocator>
2990typename vector<bool, _Allocator>::iterator
2991vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
2992{
2993 iterator __r = __const_iterator_cast(__first);
2994 difference_type __d = __last - __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00002995 _VSTD::copy(__last, this->cend(), __r);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002996 __size_ -= __d;
2997 return __r;
2998}
2999
3000template <class _Allocator>
3001void
3002vector<bool, _Allocator>::swap(vector& __x)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003003 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3004 __is_nothrow_swappable<allocator_type>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003005{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003006 _VSTD::swap(this->__begin_, __x.__begin_);
3007 _VSTD::swap(this->__size_, __x.__size_);
3008 _VSTD::swap(this->__cap(), __x.__cap());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003009 __swap_alloc(this->__alloc(), __x.__alloc());
3010#ifdef _LIBCPP_DEBUG
3011 iterator::swap(this, &__x);
3012 const_iterator::swap(this, &__x);
Howard Hinnant324bb032010-08-22 00:02:43 +00003013#endif // _LIBCPP_DEBUG
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003014}
3015
Howard Hinnant324bb032010-08-22 00:02:43 +00003016template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003017void
3018vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3019{
3020 size_type __cs = size();
3021 if (__cs < __sz)
3022 {
3023 iterator __r;
3024 size_type __c = capacity();
3025 size_type __n = __sz - __cs;
3026 if (__n <= __c && __cs <= __c - __n)
3027 {
3028 __r = end();
3029 __size_ += __n;
3030 }
3031 else
3032 {
3033 vector __v(__alloc());
3034 __v.reserve(__recommend(__size_ + __n));
3035 __v.__size_ = __size_ + __n;
Howard Hinnant0949eed2011-06-30 21:18:19 +00003036 __r = _VSTD::copy(cbegin(), cend(), __v.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003037 swap(__v);
3038 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003039 _VSTD::fill_n(__r, __n, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003040 }
3041 else
3042 __size_ = __sz;
3043}
3044
Howard Hinnant324bb032010-08-22 00:02:43 +00003045template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003046void
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003047vector<bool, _Allocator>::flip() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003048{
3049 // do middle whole words
3050 size_type __n = __size_;
3051 __storage_pointer __p = __begin_;
3052 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3053 *__p = ~*__p;
3054 // do last partial word
3055 if (__n > 0)
3056 {
3057 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3058 __storage_type __b = *__p & __m;
3059 *__p &= ~__m;
3060 *__p |= ~__b & __m;
3061 }
3062}
3063
Howard Hinnant324bb032010-08-22 00:02:43 +00003064template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003065bool
3066vector<bool, _Allocator>::__invariants() const
3067{
3068 if (this->__begin_ == 0)
3069 {
3070 if (this->__size_ != 0 || this->__cap() != 0)
3071 return false;
3072 }
3073 else
3074 {
3075 if (this->__cap() == 0)
3076 return false;
3077 if (this->__size_ > this->capacity())
3078 return false;
3079 }
3080 return true;
3081}
3082
Howard Hinnant324bb032010-08-22 00:02:43 +00003083template <class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003084size_t
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003085vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003086{
3087 size_t __h = 0;
3088 // do middle whole words
3089 size_type __n = __size_;
3090 __storage_pointer __p = __begin_;
3091 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3092 __h ^= *__p;
3093 // do last partial word
3094 if (__n > 0)
3095 {
3096 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3097 __h ^= *__p & __m;
3098 }
3099 return __h;
3100}
3101
3102template <class _Allocator>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003103struct _LIBCPP_VISIBLE hash<vector<bool, _Allocator> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003104 : public unary_function<vector<bool, _Allocator>, size_t>
3105{
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003106 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003107 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003108 {return __vec.__hash_code();}
3109};
3110
3111template <class _Tp, class _Allocator>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003112_LIBCPP_INLINE_VISIBILITY inline
3113bool
3114operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3115{
3116 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003117 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003118}
3119
3120template <class _Tp, class _Allocator>
3121_LIBCPP_INLINE_VISIBILITY inline
3122bool
3123operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3124{
3125 return !(__x == __y);
3126}
3127
3128template <class _Tp, class _Allocator>
3129_LIBCPP_INLINE_VISIBILITY inline
3130bool
3131operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3132{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003133 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003134}
3135
3136template <class _Tp, class _Allocator>
3137_LIBCPP_INLINE_VISIBILITY inline
3138bool
3139operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3140{
3141 return __y < __x;
3142}
3143
3144template <class _Tp, class _Allocator>
3145_LIBCPP_INLINE_VISIBILITY inline
3146bool
3147operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3148{
3149 return !(__x < __y);
3150}
3151
3152template <class _Tp, class _Allocator>
3153_LIBCPP_INLINE_VISIBILITY inline
3154bool
3155operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3156{
3157 return !(__y < __x);
3158}
3159
3160template <class _Tp, class _Allocator>
3161_LIBCPP_INLINE_VISIBILITY inline
3162void
3163swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
Howard Hinnantd1d27a42011-06-03 19:40:40 +00003164 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003165{
3166 __x.swap(__y);
3167}
3168
3169_LIBCPP_END_NAMESPACE_STD
3170
3171#endif // _LIBCPP_VECTOR