2 //===----------------------------------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #ifndef _LIBCPP_VECTOR
11 #define _LIBCPP_VECTOR
19 template <class T, class Allocator = allocator<T> >
24 typedef Allocator allocator_type;
25 typedef typename allocator_type::reference reference;
26 typedef typename allocator_type::const_reference const_reference;
27 typedef implementation-defined iterator;
28 typedef implementation-defined const_iterator;
29 typedef typename allocator_type::size_type size_type;
30 typedef typename allocator_type::difference_type difference_type;
31 typedef typename allocator_type::pointer pointer;
32 typedef typename allocator_type::const_pointer const_pointer;
33 typedef std::reverse_iterator<iterator> reverse_iterator;
34 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
37 noexcept(is_nothrow_default_constructible<allocator_type>::value);
38 explicit vector(const allocator_type&);
39 explicit vector(size_type n);
40 explicit vector(size_type n, const allocator_type&); // C++14
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);
46 noexcept(is_nothrow_move_constructible<allocator_type>::value);
47 vector(initializer_list<value_type> il);
48 vector(initializer_list<value_type> il, const allocator_type& a);
50 vector& operator=(const vector& x);
51 vector& operator=(vector&& x)
53 allocator_type::propagate_on_container_move_assignment::value ||
54 allocator_type::is_always_equal::value); // C++17
55 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);
61 allocator_type get_allocator() const noexcept;
63 iterator begin() noexcept;
64 const_iterator begin() const noexcept;
65 iterator end() noexcept;
66 const_iterator end() const noexcept;
68 reverse_iterator rbegin() noexcept;
69 const_reverse_iterator rbegin() const noexcept;
70 reverse_iterator rend() noexcept;
71 const_reverse_iterator rend() const noexcept;
73 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;
78 size_type size() const noexcept;
79 size_type max_size() const noexcept;
80 size_type capacity() const noexcept;
81 bool empty() const noexcept;
82 void reserve(size_type n);
83 void shrink_to_fit() noexcept;
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;
91 const_reference front() const;
93 const_reference back() const;
95 value_type* data() noexcept;
96 const value_type* data() const noexcept;
98 void push_back(const value_type& x);
99 void push_back(value_type&& x);
100 template <class... Args>
101 reference emplace_back(Args&&... args); // reference in C++17
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);
112 iterator erase(const_iterator position);
113 iterator erase(const_iterator first, const_iterator last);
115 void clear() noexcept;
117 void resize(size_type sz);
118 void resize(size_type sz, const value_type& c);
121 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
122 allocator_traits<allocator_type>::is_always_equal::value); // C++17
124 bool __invariants() const;
127 template <class Allocator = allocator<T> >
128 class vector<bool, Allocator>
131 typedef bool value_type;
132 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;
145 reference(const reference&) noexcept;
146 operator bool() const noexcept;
147 reference& operator=(bool x) noexcept;
148 reference& operator=(const reference& x) noexcept;
149 iterator operator&() const noexcept;
150 void flip() noexcept;
153 class const_reference
156 const_reference(const reference&) noexcept;
157 operator bool() const noexcept;
158 const_iterator operator&() const noexcept;
162 noexcept(is_nothrow_default_constructible<allocator_type>::value);
163 explicit vector(const allocator_type&);
164 explicit vector(size_type n, const allocator_type& a = allocator_type()); // C++14
165 vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
166 template <class InputIterator>
167 vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
168 vector(const vector& x);
170 noexcept(is_nothrow_move_constructible<allocator_type>::value);
171 vector(initializer_list<value_type> il);
172 vector(initializer_list<value_type> il, const allocator_type& a);
174 vector& operator=(const vector& x);
175 vector& operator=(vector&& x)
177 allocator_type::propagate_on_container_move_assignment::value ||
178 allocator_type::is_always_equal::value); // C++17
179 vector& operator=(initializer_list<value_type> il);
180 template <class InputIterator>
181 void assign(InputIterator first, InputIterator last);
182 void assign(size_type n, const value_type& u);
183 void assign(initializer_list<value_type> il);
185 allocator_type get_allocator() const noexcept;
187 iterator begin() noexcept;
188 const_iterator begin() const noexcept;
189 iterator end() noexcept;
190 const_iterator end() const noexcept;
192 reverse_iterator rbegin() noexcept;
193 const_reverse_iterator rbegin() const noexcept;
194 reverse_iterator rend() noexcept;
195 const_reverse_iterator rend() const noexcept;
197 const_iterator cbegin() const noexcept;
198 const_iterator cend() const noexcept;
199 const_reverse_iterator crbegin() const noexcept;
200 const_reverse_iterator crend() const noexcept;
202 size_type size() const noexcept;
203 size_type max_size() const noexcept;
204 size_type capacity() const noexcept;
205 bool empty() const noexcept;
206 void reserve(size_type n);
207 void shrink_to_fit() noexcept;
209 reference operator[](size_type n);
210 const_reference operator[](size_type n) const;
211 reference at(size_type n);
212 const_reference at(size_type n) const;
215 const_reference front() const;
217 const_reference back() const;
219 void push_back(const value_type& x);
220 template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17
223 template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14
224 iterator insert(const_iterator position, const value_type& x);
225 iterator insert(const_iterator position, size_type n, const value_type& x);
226 template <class InputIterator>
227 iterator insert(const_iterator position, InputIterator first, InputIterator last);
228 iterator insert(const_iterator position, initializer_list<value_type> il);
230 iterator erase(const_iterator position);
231 iterator erase(const_iterator first, const_iterator last);
233 void clear() noexcept;
235 void resize(size_type sz);
236 void resize(size_type sz, value_type x);
239 noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
240 allocator_traits<allocator_type>::is_always_equal::value); // C++17
241 void flip() noexcept;
243 bool __invariants() const;
246 template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
247 vector(InputIterator, InputIterator, Allocator = Allocator())
248 -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>; // C++17
250 template <class Allocator> struct hash<std::vector<bool, Allocator>>;
252 template <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
253 template <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
254 template <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
255 template <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
256 template <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
257 template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
259 template <class T, class Allocator>
260 void swap(vector<T,Allocator>& x, vector<T,Allocator>& y)
261 noexcept(noexcept(x.swap(y)));
263 template <class T, class Allocator, class U>
264 typename vector<T, Allocator>::size_type
265 erase(vector<T, Allocator>& c, const U& value); // C++20
266 template <class T, class Allocator, class Predicate>
267 typename vector<T, Allocator>::size_type
268 erase_if(vector<T, Allocator>& c, Predicate pred); // C++20
274 #include <__bit_reference>
277 #include <__functional_base>
278 #include <__iterator/iterator_traits.h>
279 #include <__iterator/wrap_iter.h>
280 #include <__split_buffer>
281 #include <__utility/forward.h>
287 #include <initializer_list>
288 #include <iosfwd> // for forward declaration of vector
292 #include <type_traits>
295 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
296 #pragma GCC system_header
300 #include <__undef_macros>
303 _LIBCPP_BEGIN_NAMESPACE_STD
306 struct __vector_base_common;
309 struct __vector_base_common<true> {
310 // Both are defined in vector.cpp
311 _LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_length_error() const;
312 _LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_out_of_range() const;
315 template <class _Tp, class _Allocator>
317 : protected __vector_base_common<true> // This base class is historical, but it needs to remain for ABI compatibility
319 typedef _Allocator allocator_type;
320 typedef typename allocator_traits<allocator_type>::pointer pointer;
325 __compressed_pair<pointer, allocator_type> __end_cap_;
327 _LIBCPP_INLINE_VISIBILITY
329 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
332 __end_cap_(nullptr, __default_init_tag()) {}
334 _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a)
337 __end_cap_(nullptr, __a) {}
339 #ifndef _LIBCPP_CXX03_LANG
340 _LIBCPP_INLINE_VISIBILITY __vector_base(allocator_type&& __a) _NOEXCEPT
343 __end_cap_(nullptr, _VSTD::move(__a)) {}
347 template <class _Tp, class _Allocator /* = allocator<_Tp> */>
348 class _LIBCPP_TEMPLATE_VIS vector
349 // This base class is historical, but it needs to remain for ABI compatibility.
350 : private __vector_base<_Tp, _Allocator>
353 typedef __vector_base<_Tp, _Allocator> __base;
354 typedef allocator<_Tp> __default_allocator_type;
356 typedef vector __self;
357 typedef _Tp value_type;
358 typedef _Allocator allocator_type;
359 typedef allocator_traits<allocator_type> __alloc_traits;
360 typedef value_type& reference;
361 typedef const value_type& const_reference;
362 typedef typename __alloc_traits::size_type size_type;
363 typedef typename __alloc_traits::difference_type difference_type;
364 typedef typename __alloc_traits::pointer pointer;
365 typedef typename __alloc_traits::const_pointer const_pointer;
366 typedef __wrap_iter<pointer> iterator;
367 typedef __wrap_iter<const_pointer> const_iterator;
368 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
369 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
371 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
372 "Allocator::value_type must be same type as value_type");
374 _LIBCPP_INLINE_VISIBILITY
375 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
377 _VSTD::__debug_db_insert_c(this);
379 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
380 #if _LIBCPP_STD_VER <= 14
381 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
387 _VSTD::__debug_db_insert_c(this);
389 explicit vector(size_type __n);
390 #if _LIBCPP_STD_VER > 11
391 explicit vector(size_type __n, const allocator_type& __a);
393 vector(size_type __n, const value_type& __x);
395 template <class = __enable_if_t<__is_allocator<_Allocator>::value> >
396 vector(size_type __n, const value_type& __x, const allocator_type& __a)
399 _VSTD::__debug_db_insert_c(this);
403 __construct_at_end(__n, __x);
407 template <class _InputIterator>
408 vector(_InputIterator __first,
409 typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value &&
410 !__is_cpp17_forward_iterator<_InputIterator>::value &&
413 typename iterator_traits<_InputIterator>::reference>::value,
414 _InputIterator>::type __last);
415 template <class _InputIterator>
416 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
417 typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value &&
418 !__is_cpp17_forward_iterator<_InputIterator>::value &&
421 typename iterator_traits<_InputIterator>::reference>::value>::type* = 0);
422 template <class _ForwardIterator>
423 vector(_ForwardIterator __first,
424 typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value &&
427 typename iterator_traits<_ForwardIterator>::reference>::value,
428 _ForwardIterator>::type __last);
429 template <class _ForwardIterator>
430 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
431 typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value &&
434 typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0);
436 _LIBCPP_INLINE_VISIBILITY
440 #if _LIBCPP_DEBUG_LEVEL == 2
441 __get_db()->__erase_c(this);
444 if (this->__begin_ != nullptr)
447 __alloc_traits::deallocate(__alloc(), this->__begin_, capacity());
451 vector(const vector& __x);
452 vector(const vector& __x, const __identity_t<allocator_type>& __a);
453 _LIBCPP_INLINE_VISIBILITY
454 vector& operator=(const vector& __x);
456 #ifndef _LIBCPP_CXX03_LANG
457 _LIBCPP_INLINE_VISIBILITY
458 vector(initializer_list<value_type> __il);
460 _LIBCPP_INLINE_VISIBILITY
461 vector(initializer_list<value_type> __il, const allocator_type& __a);
463 _LIBCPP_INLINE_VISIBILITY
465 #if _LIBCPP_STD_VER > 14
468 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
471 _LIBCPP_INLINE_VISIBILITY
472 vector(vector&& __x, const __identity_t<allocator_type>& __a);
473 _LIBCPP_INLINE_VISIBILITY
474 vector& operator=(vector&& __x)
475 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
477 _LIBCPP_INLINE_VISIBILITY
478 vector& operator=(initializer_list<value_type> __il)
479 {assign(__il.begin(), __il.end()); return *this;}
481 #endif // !_LIBCPP_CXX03_LANG
483 template <class _InputIterator>
486 __is_cpp17_input_iterator <_InputIterator>::value &&
487 !__is_cpp17_forward_iterator<_InputIterator>::value &&
490 typename iterator_traits<_InputIterator>::reference>::value,
493 assign(_InputIterator __first, _InputIterator __last);
494 template <class _ForwardIterator>
497 __is_cpp17_forward_iterator<_ForwardIterator>::value &&
500 typename iterator_traits<_ForwardIterator>::reference>::value,
503 assign(_ForwardIterator __first, _ForwardIterator __last);
505 void assign(size_type __n, const_reference __u);
507 #ifndef _LIBCPP_CXX03_LANG
508 _LIBCPP_INLINE_VISIBILITY
509 void assign(initializer_list<value_type> __il)
510 {assign(__il.begin(), __il.end());}
513 _LIBCPP_INLINE_VISIBILITY
514 allocator_type get_allocator() const _NOEXCEPT
515 {return this->__alloc();}
517 _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT;
518 _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT;
519 _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT;
520 _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT;
522 _LIBCPP_INLINE_VISIBILITY
523 reverse_iterator rbegin() _NOEXCEPT
524 {return reverse_iterator(end());}
525 _LIBCPP_INLINE_VISIBILITY
526 const_reverse_iterator rbegin() const _NOEXCEPT
527 {return const_reverse_iterator(end());}
528 _LIBCPP_INLINE_VISIBILITY
529 reverse_iterator rend() _NOEXCEPT
530 {return reverse_iterator(begin());}
531 _LIBCPP_INLINE_VISIBILITY
532 const_reverse_iterator rend() const _NOEXCEPT
533 {return const_reverse_iterator(begin());}
535 _LIBCPP_INLINE_VISIBILITY
536 const_iterator cbegin() const _NOEXCEPT
538 _LIBCPP_INLINE_VISIBILITY
539 const_iterator cend() const _NOEXCEPT
541 _LIBCPP_INLINE_VISIBILITY
542 const_reverse_iterator crbegin() const _NOEXCEPT
544 _LIBCPP_INLINE_VISIBILITY
545 const_reverse_iterator crend() const _NOEXCEPT
548 _LIBCPP_INLINE_VISIBILITY
549 size_type size() const _NOEXCEPT
550 {return static_cast<size_type>(this->__end_ - this->__begin_);}
551 _LIBCPP_INLINE_VISIBILITY
552 size_type capacity() const _NOEXCEPT
553 {return static_cast<size_type>(__end_cap() - this->__begin_);}
554 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
555 bool empty() const _NOEXCEPT
556 {return this->__begin_ == this->__end_;}
557 size_type max_size() const _NOEXCEPT;
558 void reserve(size_type __n);
559 void shrink_to_fit() _NOEXCEPT;
561 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) _NOEXCEPT;
562 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const _NOEXCEPT;
563 reference at(size_type __n);
564 const_reference at(size_type __n) const;
566 _LIBCPP_INLINE_VISIBILITY reference front() _NOEXCEPT
568 _LIBCPP_ASSERT(!empty(), "front() called on an empty vector");
569 return *this->__begin_;
571 _LIBCPP_INLINE_VISIBILITY const_reference front() const _NOEXCEPT
573 _LIBCPP_ASSERT(!empty(), "front() called on an empty vector");
574 return *this->__begin_;
576 _LIBCPP_INLINE_VISIBILITY reference back() _NOEXCEPT
578 _LIBCPP_ASSERT(!empty(), "back() called on an empty vector");
579 return *(this->__end_ - 1);
581 _LIBCPP_INLINE_VISIBILITY const_reference back() const _NOEXCEPT
583 _LIBCPP_ASSERT(!empty(), "back() called on an empty vector");
584 return *(this->__end_ - 1);
587 _LIBCPP_INLINE_VISIBILITY
588 value_type* data() _NOEXCEPT
589 {return _VSTD::__to_address(this->__begin_);}
590 _LIBCPP_INLINE_VISIBILITY
591 const value_type* data() const _NOEXCEPT
592 {return _VSTD::__to_address(this->__begin_);}
594 #ifdef _LIBCPP_CXX03_LANG
595 _LIBCPP_INLINE_VISIBILITY
596 void __emplace_back(const value_type& __x) { push_back(__x); }
598 template <class _Arg>
599 _LIBCPP_INLINE_VISIBILITY
600 void __emplace_back(_Arg&& __arg) {
601 emplace_back(_VSTD::forward<_Arg>(__arg));
605 _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
607 #ifndef _LIBCPP_CXX03_LANG
608 _LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
610 template <class... _Args>
611 _LIBCPP_INLINE_VISIBILITY
612 #if _LIBCPP_STD_VER > 14
613 reference emplace_back(_Args&&... __args);
615 void emplace_back(_Args&&... __args);
617 #endif // !_LIBCPP_CXX03_LANG
619 _LIBCPP_INLINE_VISIBILITY
622 iterator insert(const_iterator __position, const_reference __x);
624 #ifndef _LIBCPP_CXX03_LANG
625 iterator insert(const_iterator __position, value_type&& __x);
626 template <class... _Args>
627 iterator emplace(const_iterator __position, _Args&&... __args);
628 #endif // !_LIBCPP_CXX03_LANG
630 iterator insert(const_iterator __position, size_type __n, const_reference __x);
631 template <class _InputIterator>
634 __is_cpp17_input_iterator <_InputIterator>::value &&
635 !__is_cpp17_forward_iterator<_InputIterator>::value &&
638 typename iterator_traits<_InputIterator>::reference>::value,
641 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
642 template <class _ForwardIterator>
645 __is_cpp17_forward_iterator<_ForwardIterator>::value &&
648 typename iterator_traits<_ForwardIterator>::reference>::value,
651 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
653 #ifndef _LIBCPP_CXX03_LANG
654 _LIBCPP_INLINE_VISIBILITY
655 iterator insert(const_iterator __position, initializer_list<value_type> __il)
656 {return insert(__position, __il.begin(), __il.end());}
659 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
660 iterator erase(const_iterator __first, const_iterator __last);
662 _LIBCPP_INLINE_VISIBILITY
663 void clear() _NOEXCEPT
665 size_type __old_size = size();
667 __annotate_shrink(__old_size);
668 __invalidate_all_iterators();
671 void resize(size_type __sz);
672 void resize(size_type __sz, const_reference __x);
675 #if _LIBCPP_STD_VER >= 14
678 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
679 __is_nothrow_swappable<allocator_type>::value);
682 bool __invariants() const;
684 #if _LIBCPP_DEBUG_LEVEL == 2
686 bool __dereferenceable(const const_iterator* __i) const;
687 bool __decrementable(const const_iterator* __i) const;
688 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
689 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
691 #endif // _LIBCPP_DEBUG_LEVEL == 2
694 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
695 _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(pointer __new_last);
696 void __vallocate(size_type __n);
697 void __vdeallocate() _NOEXCEPT;
698 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
699 void __construct_at_end(size_type __n);
700 _LIBCPP_INLINE_VISIBILITY
701 void __construct_at_end(size_type __n, const_reference __x);
702 template <class _ForwardIterator>
705 __is_cpp17_forward_iterator<_ForwardIterator>::value,
708 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n);
709 void __append(size_type __n);
710 void __append(size_type __n, const_reference __x);
711 _LIBCPP_INLINE_VISIBILITY
712 iterator __make_iter(pointer __p) _NOEXCEPT;
713 _LIBCPP_INLINE_VISIBILITY
714 const_iterator __make_iter(const_pointer __p) const _NOEXCEPT;
715 void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v);
716 pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p);
717 void __move_range(pointer __from_s, pointer __from_e, pointer __to);
718 void __move_assign(vector& __c, true_type)
719 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
720 void __move_assign(vector& __c, false_type)
721 _NOEXCEPT_(__alloc_traits::is_always_equal::value);
722 _LIBCPP_INLINE_VISIBILITY
723 void __destruct_at_end(pointer __new_last) _NOEXCEPT
725 __invalidate_iterators_past(__new_last);
726 size_type __old_size = size();
727 __base_destruct_at_end(__new_last);
728 __annotate_shrink(__old_size);
731 #ifndef _LIBCPP_CXX03_LANG
733 _LIBCPP_INLINE_VISIBILITY
734 inline void __push_back_slow_path(_Up&& __x);
736 template <class... _Args>
737 _LIBCPP_INLINE_VISIBILITY
738 inline void __emplace_back_slow_path(_Args&&... __args);
741 _LIBCPP_INLINE_VISIBILITY
742 inline void __push_back_slow_path(_Up& __x);
745 // The following functions are no-ops outside of AddressSanitizer mode.
746 // We call annotatations only for the default Allocator because other allocators
747 // may not meet the AddressSanitizer alignment constraints.
748 // See the documentation for __sanitizer_annotate_contiguous_container for more details.
749 #ifndef _LIBCPP_HAS_NO_ASAN
750 void __annotate_contiguous_container(const void *__beg, const void *__end,
751 const void *__old_mid,
752 const void *__new_mid) const
755 if (__beg && is_same<allocator_type, __default_allocator_type>::value)
756 __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid);
759 _LIBCPP_INLINE_VISIBILITY
760 void __annotate_contiguous_container(const void*, const void*, const void*,
761 const void*) const _NOEXCEPT {}
763 _LIBCPP_INLINE_VISIBILITY
764 void __annotate_new(size_type __current_size) const _NOEXCEPT {
765 __annotate_contiguous_container(data(), data() + capacity(),
766 data() + capacity(), data() + __current_size);
769 _LIBCPP_INLINE_VISIBILITY
770 void __annotate_delete() const _NOEXCEPT {
771 __annotate_contiguous_container(data(), data() + capacity(),
772 data() + size(), data() + capacity());
775 _LIBCPP_INLINE_VISIBILITY
776 void __annotate_increase(size_type __n) const _NOEXCEPT
778 __annotate_contiguous_container(data(), data() + capacity(),
779 data() + size(), data() + size() + __n);
782 _LIBCPP_INLINE_VISIBILITY
783 void __annotate_shrink(size_type __old_size) const _NOEXCEPT
785 __annotate_contiguous_container(data(), data() + capacity(),
786 data() + __old_size, data() + size());
789 struct _ConstructTransaction {
790 explicit _ConstructTransaction(vector &__v, size_type __n)
791 : __v_(__v), __pos_(__v.__end_), __new_end_(__v.__end_ + __n) {
792 #ifndef _LIBCPP_HAS_NO_ASAN
793 __v_.__annotate_increase(__n);
796 ~_ConstructTransaction() {
797 __v_.__end_ = __pos_;
798 #ifndef _LIBCPP_HAS_NO_ASAN
799 if (__pos_ != __new_end_) {
800 __v_.__annotate_shrink(__new_end_ - __v_.__begin_);
807 const_pointer const __new_end_;
810 _ConstructTransaction(_ConstructTransaction const&) = delete;
811 _ConstructTransaction& operator=(_ConstructTransaction const&) = delete;
814 template <class ..._Args>
815 _LIBCPP_INLINE_VISIBILITY
816 void __construct_one_at_end(_Args&& ...__args) {
817 _ConstructTransaction __tx(*this, 1);
818 __alloc_traits::construct(this->__alloc(), _VSTD::__to_address(__tx.__pos_),
819 _VSTD::forward<_Args>(__args)...);
823 _LIBCPP_INLINE_VISIBILITY
824 allocator_type& __alloc() _NOEXCEPT
825 {return this->__end_cap_.second();}
826 _LIBCPP_INLINE_VISIBILITY
827 const allocator_type& __alloc() const _NOEXCEPT
828 {return this->__end_cap_.second();}
829 _LIBCPP_INLINE_VISIBILITY
830 pointer& __end_cap() _NOEXCEPT
831 {return this->__end_cap_.first();}
832 _LIBCPP_INLINE_VISIBILITY
833 const pointer& __end_cap() const _NOEXCEPT
834 {return this->__end_cap_.first();}
836 _LIBCPP_INLINE_VISIBILITY
837 void __clear() _NOEXCEPT {__base_destruct_at_end(this->__begin_);}
839 _LIBCPP_INLINE_VISIBILITY
840 void __base_destruct_at_end(pointer __new_last) _NOEXCEPT {
841 pointer __soon_to_be_end = this->__end_;
842 while (__new_last != __soon_to_be_end)
843 __alloc_traits::destroy(__alloc(), _VSTD::__to_address(--__soon_to_be_end));
844 this->__end_ = __new_last;
847 _LIBCPP_INLINE_VISIBILITY
848 void __copy_assign_alloc(const vector& __c)
849 {__copy_assign_alloc(__c, integral_constant<bool,
850 __alloc_traits::propagate_on_container_copy_assignment::value>());}
852 _LIBCPP_INLINE_VISIBILITY
853 void __move_assign_alloc(vector& __c)
855 !__alloc_traits::propagate_on_container_move_assignment::value ||
856 is_nothrow_move_assignable<allocator_type>::value)
857 {__move_assign_alloc(__c, integral_constant<bool,
858 __alloc_traits::propagate_on_container_move_assignment::value>());}
860 _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI
861 void __throw_length_error() const {
862 #ifndef _LIBCPP_NO_EXCEPTIONS
863 __vector_base_common<true>::__throw_length_error();
869 _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI
870 void __throw_out_of_range() const {
871 #ifndef _LIBCPP_NO_EXCEPTIONS
872 __vector_base_common<true>::__throw_out_of_range();
878 _LIBCPP_INLINE_VISIBILITY
879 void __copy_assign_alloc(const vector& __c, true_type)
881 if (__alloc() != __c.__alloc())
884 __alloc_traits::deallocate(__alloc(), this->__begin_, capacity());
885 this->__begin_ = this->__end_ = __end_cap() = nullptr;
887 __alloc() = __c.__alloc();
890 _LIBCPP_INLINE_VISIBILITY
891 void __copy_assign_alloc(const vector&, false_type)
894 _LIBCPP_INLINE_VISIBILITY
895 void __move_assign_alloc(vector& __c, true_type)
896 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
898 __alloc() = _VSTD::move(__c.__alloc());
901 _LIBCPP_INLINE_VISIBILITY
902 void __move_assign_alloc(vector&, false_type)
907 #if _LIBCPP_STD_VER >= 17
908 template<class _InputIterator,
909 class _Alloc = allocator<__iter_value_type<_InputIterator>>,
910 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
911 class = enable_if_t<__is_allocator<_Alloc>::value>
913 vector(_InputIterator, _InputIterator)
914 -> vector<__iter_value_type<_InputIterator>, _Alloc>;
916 template<class _InputIterator,
918 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
919 class = enable_if_t<__is_allocator<_Alloc>::value>
921 vector(_InputIterator, _InputIterator, _Alloc)
922 -> vector<__iter_value_type<_InputIterator>, _Alloc>;
925 template <class _Tp, class _Allocator>
927 vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)
931 _VSTD::__construct_backward_with_exception_guarantees(this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
932 _VSTD::swap(this->__begin_, __v.__begin_);
933 _VSTD::swap(this->__end_, __v.__end_);
934 _VSTD::swap(this->__end_cap(), __v.__end_cap());
935 __v.__first_ = __v.__begin_;
936 __annotate_new(size());
937 __invalidate_all_iterators();
940 template <class _Tp, class _Allocator>
941 typename vector<_Tp, _Allocator>::pointer
942 vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
945 pointer __r = __v.__begin_;
946 _VSTD::__construct_backward_with_exception_guarantees(this->__alloc(), this->__begin_, __p, __v.__begin_);
947 _VSTD::__construct_forward_with_exception_guarantees(this->__alloc(), __p, this->__end_, __v.__end_);
948 _VSTD::swap(this->__begin_, __v.__begin_);
949 _VSTD::swap(this->__end_, __v.__end_);
950 _VSTD::swap(this->__end_cap(), __v.__end_cap());
951 __v.__first_ = __v.__begin_;
952 __annotate_new(size());
953 __invalidate_all_iterators();
957 // Allocate space for __n objects
958 // throws length_error if __n > max_size()
959 // throws (probably bad_alloc) if memory run out
960 // Precondition: __begin_ == __end_ == __end_cap() == 0
961 // Precondition: __n > 0
962 // Postcondition: capacity() == __n
963 // Postcondition: size() == 0
964 template <class _Tp, class _Allocator>
966 vector<_Tp, _Allocator>::__vallocate(size_type __n)
968 if (__n > max_size())
969 this->__throw_length_error();
970 this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
971 this->__end_cap() = this->__begin_ + __n;
975 template <class _Tp, class _Allocator>
977 vector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT
979 if (this->__begin_ != nullptr)
982 __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
983 this->__begin_ = this->__end_ = this->__end_cap() = nullptr;
987 template <class _Tp, class _Allocator>
988 typename vector<_Tp, _Allocator>::size_type
989 vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
991 return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()),
992 numeric_limits<difference_type>::max());
995 // Precondition: __new_size > capacity()
996 template <class _Tp, class _Allocator>
997 inline _LIBCPP_INLINE_VISIBILITY
998 typename vector<_Tp, _Allocator>::size_type
999 vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
1001 const size_type __ms = max_size();
1002 if (__new_size > __ms)
1003 this->__throw_length_error();
1004 const size_type __cap = capacity();
1005 if (__cap >= __ms / 2)
1007 return _VSTD::max<size_type>(2 * __cap, __new_size);
1010 // Default constructs __n objects starting at __end_
1011 // throws if construction throws
1012 // Precondition: __n > 0
1013 // Precondition: size() + __n <= capacity()
1014 // Postcondition: size() == size() + __n
1015 template <class _Tp, class _Allocator>
1017 vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
1019 _ConstructTransaction __tx(*this, __n);
1020 const_pointer __new_end = __tx.__new_end_;
1021 for (pointer __pos = __tx.__pos_; __pos != __new_end; __tx.__pos_ = ++__pos) {
1022 __alloc_traits::construct(this->__alloc(), _VSTD::__to_address(__pos));
1026 // Copy constructs __n objects starting at __end_ from __x
1027 // throws if construction throws
1028 // Precondition: __n > 0
1029 // Precondition: size() + __n <= capacity()
1030 // Postcondition: size() == old size() + __n
1031 // Postcondition: [i] == __x for all i in [size() - __n, __n)
1032 template <class _Tp, class _Allocator>
1035 vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
1037 _ConstructTransaction __tx(*this, __n);
1038 const_pointer __new_end = __tx.__new_end_;
1039 for (pointer __pos = __tx.__pos_; __pos != __new_end; __tx.__pos_ = ++__pos) {
1040 __alloc_traits::construct(this->__alloc(), _VSTD::__to_address(__pos), __x);
1044 template <class _Tp, class _Allocator>
1045 template <class _ForwardIterator>
1048 __is_cpp17_forward_iterator<_ForwardIterator>::value,
1051 vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n)
1053 _ConstructTransaction __tx(*this, __n);
1054 _VSTD::__construct_range_forward(this->__alloc(), __first, __last, __tx.__pos_);
1057 // Default constructs __n objects starting at __end_
1058 // throws if construction throws
1059 // Postcondition: size() == size() + __n
1060 // Exception safety: strong.
1061 template <class _Tp, class _Allocator>
1063 vector<_Tp, _Allocator>::__append(size_type __n)
1065 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1066 this->__construct_at_end(__n);
1069 allocator_type& __a = this->__alloc();
1070 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1071 __v.__construct_at_end(__n);
1072 __swap_out_circular_buffer(__v);
1076 // Default constructs __n objects starting at __end_
1077 // throws if construction throws
1078 // Postcondition: size() == size() + __n
1079 // Exception safety: strong.
1080 template <class _Tp, class _Allocator>
1082 vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
1084 if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1085 this->__construct_at_end(__n, __x);
1088 allocator_type& __a = this->__alloc();
1089 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1090 __v.__construct_at_end(__n, __x);
1091 __swap_out_circular_buffer(__v);
1095 template <class _Tp, class _Allocator>
1096 vector<_Tp, _Allocator>::vector(size_type __n)
1098 _VSTD::__debug_db_insert_c(this);
1102 __construct_at_end(__n);
1106 #if _LIBCPP_STD_VER > 11
1107 template <class _Tp, class _Allocator>
1108 vector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a)
1111 _VSTD::__debug_db_insert_c(this);
1115 __construct_at_end(__n);
1120 template <class _Tp, class _Allocator>
1121 vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x)
1123 _VSTD::__debug_db_insert_c(this);
1127 __construct_at_end(__n, __x);
1131 template <class _Tp, class _Allocator>
1132 template <class _InputIterator>
1133 vector<_Tp, _Allocator>::vector(_InputIterator __first,
1134 typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value &&
1135 !__is_cpp17_forward_iterator<_InputIterator>::value &&
1138 typename iterator_traits<_InputIterator>::reference>::value,
1139 _InputIterator>::type __last)
1141 _VSTD::__debug_db_insert_c(this);
1142 for (; __first != __last; ++__first)
1143 __emplace_back(*__first);
1146 template <class _Tp, class _Allocator>
1147 template <class _InputIterator>
1148 vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
1149 typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value &&
1150 !__is_cpp17_forward_iterator<_InputIterator>::value &&
1153 typename iterator_traits<_InputIterator>::reference>::value>::type*)
1156 _VSTD::__debug_db_insert_c(this);
1157 for (; __first != __last; ++__first)
1158 __emplace_back(*__first);
1161 template <class _Tp, class _Allocator>
1162 template <class _ForwardIterator>
1163 vector<_Tp, _Allocator>::vector(_ForwardIterator __first,
1164 typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value &&
1167 typename iterator_traits<_ForwardIterator>::reference>::value,
1168 _ForwardIterator>::type __last)
1170 _VSTD::__debug_db_insert_c(this);
1171 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
1175 __construct_at_end(__first, __last, __n);
1179 template <class _Tp, class _Allocator>
1180 template <class _ForwardIterator>
1181 vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
1182 typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value &&
1185 typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
1188 _VSTD::__debug_db_insert_c(this);
1189 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
1193 __construct_at_end(__first, __last, __n);
1197 template <class _Tp, class _Allocator>
1198 vector<_Tp, _Allocator>::vector(const vector& __x)
1199 : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
1201 _VSTD::__debug_db_insert_c(this);
1202 size_type __n = __x.size();
1206 __construct_at_end(__x.__begin_, __x.__end_, __n);
1210 template <class _Tp, class _Allocator>
1211 vector<_Tp, _Allocator>::vector(const vector& __x, const __identity_t<allocator_type>& __a)
1214 _VSTD::__debug_db_insert_c(this);
1215 size_type __n = __x.size();
1219 __construct_at_end(__x.__begin_, __x.__end_, __n);
1223 #ifndef _LIBCPP_CXX03_LANG
1225 template <class _Tp, class _Allocator>
1226 inline _LIBCPP_INLINE_VISIBILITY
1227 vector<_Tp, _Allocator>::vector(vector&& __x)
1228 #if _LIBCPP_STD_VER > 14
1231 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
1233 : __base(_VSTD::move(__x.__alloc()))
1235 _VSTD::__debug_db_insert_c(this);
1236 #if _LIBCPP_DEBUG_LEVEL == 2
1237 __get_db()->swap(this, _VSTD::addressof(__x));
1239 this->__begin_ = __x.__begin_;
1240 this->__end_ = __x.__end_;
1241 this->__end_cap() = __x.__end_cap();
1242 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
1245 template <class _Tp, class _Allocator>
1246 inline _LIBCPP_INLINE_VISIBILITY
1247 vector<_Tp, _Allocator>::vector(vector&& __x, const __identity_t<allocator_type>& __a)
1250 _VSTD::__debug_db_insert_c(this);
1251 if (__a == __x.__alloc())
1253 this->__begin_ = __x.__begin_;
1254 this->__end_ = __x.__end_;
1255 this->__end_cap() = __x.__end_cap();
1256 __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
1257 #if _LIBCPP_DEBUG_LEVEL == 2
1258 __get_db()->swap(this, _VSTD::addressof(__x));
1263 typedef move_iterator<iterator> _Ip;
1264 assign(_Ip(__x.begin()), _Ip(__x.end()));
1268 template <class _Tp, class _Allocator>
1269 inline _LIBCPP_INLINE_VISIBILITY
1270 vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
1272 _VSTD::__debug_db_insert_c(this);
1273 if (__il.size() > 0)
1275 __vallocate(__il.size());
1276 __construct_at_end(__il.begin(), __il.end(), __il.size());
1280 template <class _Tp, class _Allocator>
1281 inline _LIBCPP_INLINE_VISIBILITY
1282 vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
1285 _VSTD::__debug_db_insert_c(this);
1286 if (__il.size() > 0)
1288 __vallocate(__il.size());
1289 __construct_at_end(__il.begin(), __il.end(), __il.size());
1293 template <class _Tp, class _Allocator>
1294 inline _LIBCPP_INLINE_VISIBILITY
1295 vector<_Tp, _Allocator>&
1296 vector<_Tp, _Allocator>::operator=(vector&& __x)
1297 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
1299 __move_assign(__x, integral_constant<bool,
1300 __alloc_traits::propagate_on_container_move_assignment::value>());
1304 template <class _Tp, class _Allocator>
1306 vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
1307 _NOEXCEPT_(__alloc_traits::is_always_equal::value)
1309 if (__alloc() != __c.__alloc())
1311 typedef move_iterator<iterator> _Ip;
1312 assign(_Ip(__c.begin()), _Ip(__c.end()));
1315 __move_assign(__c, true_type());
1318 template <class _Tp, class _Allocator>
1320 vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
1321 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1324 __move_assign_alloc(__c); // this can throw
1325 this->__begin_ = __c.__begin_;
1326 this->__end_ = __c.__end_;
1327 this->__end_cap() = __c.__end_cap();
1328 __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
1329 #if _LIBCPP_DEBUG_LEVEL == 2
1330 __get_db()->swap(this, _VSTD::addressof(__c));
1334 #endif // !_LIBCPP_CXX03_LANG
1336 template <class _Tp, class _Allocator>
1337 inline _LIBCPP_INLINE_VISIBILITY
1338 vector<_Tp, _Allocator>&
1339 vector<_Tp, _Allocator>::operator=(const vector& __x)
1341 if (this != _VSTD::addressof(__x))
1343 __copy_assign_alloc(__x);
1344 assign(__x.__begin_, __x.__end_);
1349 template <class _Tp, class _Allocator>
1350 template <class _InputIterator>
1353 __is_cpp17_input_iterator <_InputIterator>::value &&
1354 !__is_cpp17_forward_iterator<_InputIterator>::value &&
1357 typename iterator_traits<_InputIterator>::reference>::value,
1360 vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1363 for (; __first != __last; ++__first)
1364 __emplace_back(*__first);
1367 template <class _Tp, class _Allocator>
1368 template <class _ForwardIterator>
1371 __is_cpp17_forward_iterator<_ForwardIterator>::value &&
1374 typename iterator_traits<_ForwardIterator>::reference>::value,
1377 vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
1379 size_type __new_size = static_cast<size_type>(_VSTD::distance(__first, __last));
1380 if (__new_size <= capacity())
1382 _ForwardIterator __mid = __last;
1383 bool __growing = false;
1384 if (__new_size > size())
1388 _VSTD::advance(__mid, size());
1390 pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
1392 __construct_at_end(__mid, __last, __new_size - size());
1394 this->__destruct_at_end(__m);
1399 __vallocate(__recommend(__new_size));
1400 __construct_at_end(__first, __last, __new_size);
1402 __invalidate_all_iterators();
1405 template <class _Tp, class _Allocator>
1407 vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
1409 if (__n <= capacity())
1411 size_type __s = size();
1412 _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
1414 __construct_at_end(__n - __s, __u);
1416 this->__destruct_at_end(this->__begin_ + __n);
1421 __vallocate(__recommend(static_cast<size_type>(__n)));
1422 __construct_at_end(__n, __u);
1424 __invalidate_all_iterators();
1427 template <class _Tp, class _Allocator>
1428 inline _LIBCPP_INLINE_VISIBILITY
1429 typename vector<_Tp, _Allocator>::iterator
1430 vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
1432 #if _LIBCPP_DEBUG_LEVEL == 2
1433 return iterator(this, __p);
1435 return iterator(__p);
1439 template <class _Tp, class _Allocator>
1440 inline _LIBCPP_INLINE_VISIBILITY
1441 typename vector<_Tp, _Allocator>::const_iterator
1442 vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
1444 #if _LIBCPP_DEBUG_LEVEL == 2
1445 return const_iterator(this, __p);
1447 return const_iterator(__p);
1451 template <class _Tp, class _Allocator>
1452 inline _LIBCPP_INLINE_VISIBILITY
1453 typename vector<_Tp, _Allocator>::iterator
1454 vector<_Tp, _Allocator>::begin() _NOEXCEPT
1456 return __make_iter(this->__begin_);
1459 template <class _Tp, class _Allocator>
1460 inline _LIBCPP_INLINE_VISIBILITY
1461 typename vector<_Tp, _Allocator>::const_iterator
1462 vector<_Tp, _Allocator>::begin() const _NOEXCEPT
1464 return __make_iter(this->__begin_);
1467 template <class _Tp, class _Allocator>
1468 inline _LIBCPP_INLINE_VISIBILITY
1469 typename vector<_Tp, _Allocator>::iterator
1470 vector<_Tp, _Allocator>::end() _NOEXCEPT
1472 return __make_iter(this->__end_);
1475 template <class _Tp, class _Allocator>
1476 inline _LIBCPP_INLINE_VISIBILITY
1477 typename vector<_Tp, _Allocator>::const_iterator
1478 vector<_Tp, _Allocator>::end() const _NOEXCEPT
1480 return __make_iter(this->__end_);
1483 template <class _Tp, class _Allocator>
1484 inline _LIBCPP_INLINE_VISIBILITY
1485 typename vector<_Tp, _Allocator>::reference
1486 vector<_Tp, _Allocator>::operator[](size_type __n) _NOEXCEPT
1488 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
1489 return this->__begin_[__n];
1492 template <class _Tp, class _Allocator>
1493 inline _LIBCPP_INLINE_VISIBILITY
1494 typename vector<_Tp, _Allocator>::const_reference
1495 vector<_Tp, _Allocator>::operator[](size_type __n) const _NOEXCEPT
1497 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
1498 return this->__begin_[__n];
1501 template <class _Tp, class _Allocator>
1502 typename vector<_Tp, _Allocator>::reference
1503 vector<_Tp, _Allocator>::at(size_type __n)
1506 this->__throw_out_of_range();
1507 return this->__begin_[__n];
1510 template <class _Tp, class _Allocator>
1511 typename vector<_Tp, _Allocator>::const_reference
1512 vector<_Tp, _Allocator>::at(size_type __n) const
1515 this->__throw_out_of_range();
1516 return this->__begin_[__n];
1519 template <class _Tp, class _Allocator>
1521 vector<_Tp, _Allocator>::reserve(size_type __n)
1523 if (__n > capacity())
1525 if (__n > max_size())
1526 this->__throw_length_error();
1527 allocator_type& __a = this->__alloc();
1528 __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
1529 __swap_out_circular_buffer(__v);
1533 template <class _Tp, class _Allocator>
1535 vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
1537 if (capacity() > size())
1539 #ifndef _LIBCPP_NO_EXCEPTIONS
1542 #endif // _LIBCPP_NO_EXCEPTIONS
1543 allocator_type& __a = this->__alloc();
1544 __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
1545 __swap_out_circular_buffer(__v);
1546 #ifndef _LIBCPP_NO_EXCEPTIONS
1551 #endif // _LIBCPP_NO_EXCEPTIONS
1555 template <class _Tp, class _Allocator>
1556 template <class _Up>
1558 #ifndef _LIBCPP_CXX03_LANG
1559 vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
1561 vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
1564 allocator_type& __a = this->__alloc();
1565 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1566 // __v.push_back(_VSTD::forward<_Up>(__x));
1567 __alloc_traits::construct(__a, _VSTD::__to_address(__v.__end_), _VSTD::forward<_Up>(__x));
1569 __swap_out_circular_buffer(__v);
1572 template <class _Tp, class _Allocator>
1573 inline _LIBCPP_INLINE_VISIBILITY
1575 vector<_Tp, _Allocator>::push_back(const_reference __x)
1577 if (this->__end_ != this->__end_cap())
1579 __construct_one_at_end(__x);
1582 __push_back_slow_path(__x);
1585 #ifndef _LIBCPP_CXX03_LANG
1587 template <class _Tp, class _Allocator>
1588 inline _LIBCPP_INLINE_VISIBILITY
1590 vector<_Tp, _Allocator>::push_back(value_type&& __x)
1592 if (this->__end_ < this->__end_cap())
1594 __construct_one_at_end(_VSTD::move(__x));
1597 __push_back_slow_path(_VSTD::move(__x));
1600 template <class _Tp, class _Allocator>
1601 template <class... _Args>
1603 vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1605 allocator_type& __a = this->__alloc();
1606 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1607 // __v.emplace_back(_VSTD::forward<_Args>(__args)...);
1608 __alloc_traits::construct(__a, _VSTD::__to_address(__v.__end_), _VSTD::forward<_Args>(__args)...);
1610 __swap_out_circular_buffer(__v);
1613 template <class _Tp, class _Allocator>
1614 template <class... _Args>
1616 #if _LIBCPP_STD_VER > 14
1617 typename vector<_Tp, _Allocator>::reference
1621 vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1623 if (this->__end_ < this->__end_cap())
1625 __construct_one_at_end(_VSTD::forward<_Args>(__args)...);
1628 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
1629 #if _LIBCPP_STD_VER > 14
1630 return this->back();
1634 #endif // !_LIBCPP_CXX03_LANG
1636 template <class _Tp, class _Allocator>
1639 vector<_Tp, _Allocator>::pop_back()
1641 _LIBCPP_ASSERT(!empty(), "vector::pop_back called on an empty vector");
1642 this->__destruct_at_end(this->__end_ - 1);
1645 template <class _Tp, class _Allocator>
1646 inline _LIBCPP_INLINE_VISIBILITY
1647 typename vector<_Tp, _Allocator>::iterator
1648 vector<_Tp, _Allocator>::erase(const_iterator __position)
1650 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__position)) == this,
1651 "vector::erase(iterator) called with an iterator not referring to this vector");
1652 _LIBCPP_ASSERT(__position != end(),
1653 "vector::erase(iterator) called with a non-dereferenceable iterator");
1654 difference_type __ps = __position - cbegin();
1655 pointer __p = this->__begin_ + __ps;
1656 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
1657 this->__invalidate_iterators_past(__p-1);
1658 iterator __r = __make_iter(__p);
1662 template <class _Tp, class _Allocator>
1663 typename vector<_Tp, _Allocator>::iterator
1664 vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1666 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__first)) == this,
1667 "vector::erase(iterator, iterator) called with an iterator not referring to this vector");
1668 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__last)) == this,
1669 "vector::erase(iterator, iterator) called with an iterator not referring to this vector");
1671 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
1672 pointer __p = this->__begin_ + (__first - begin());
1673 if (__first != __last) {
1674 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
1675 this->__invalidate_iterators_past(__p - 1);
1677 iterator __r = __make_iter(__p);
1681 template <class _Tp, class _Allocator>
1683 vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1685 pointer __old_last = this->__end_;
1686 difference_type __n = __old_last - __to;
1688 pointer __i = __from_s + __n;
1689 _ConstructTransaction __tx(*this, __from_e - __i);
1690 for (pointer __pos = __tx.__pos_; __i < __from_e;
1691 ++__i, (void) ++__pos, __tx.__pos_ = __pos) {
1692 __alloc_traits::construct(this->__alloc(),
1693 _VSTD::__to_address(__pos),
1697 _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
1700 template <class _Tp, class _Allocator>
1701 typename vector<_Tp, _Allocator>::iterator
1702 vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1704 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__position)) == this,
1705 "vector::insert(iterator, x) called with an iterator not referring to this vector");
1706 pointer __p = this->__begin_ + (__position - begin());
1707 if (this->__end_ < this->__end_cap())
1709 if (__p == this->__end_)
1711 __construct_one_at_end(__x);
1715 __move_range(__p, this->__end_, __p + 1);
1716 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1717 if (__p <= __xr && __xr < this->__end_)
1724 allocator_type& __a = this->__alloc();
1725 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1727 __p = __swap_out_circular_buffer(__v, __p);
1729 return __make_iter(__p);
1732 #ifndef _LIBCPP_CXX03_LANG
1734 template <class _Tp, class _Allocator>
1735 typename vector<_Tp, _Allocator>::iterator
1736 vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1738 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__position)) == this,
1739 "vector::insert(iterator, x) called with an iterator not referring to this vector");
1740 pointer __p = this->__begin_ + (__position - begin());
1741 if (this->__end_ < this->__end_cap())
1743 if (__p == this->__end_)
1745 __construct_one_at_end(_VSTD::move(__x));
1749 __move_range(__p, this->__end_, __p + 1);
1750 *__p = _VSTD::move(__x);
1755 allocator_type& __a = this->__alloc();
1756 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1757 __v.push_back(_VSTD::move(__x));
1758 __p = __swap_out_circular_buffer(__v, __p);
1760 return __make_iter(__p);
1763 template <class _Tp, class _Allocator>
1764 template <class... _Args>
1765 typename vector<_Tp, _Allocator>::iterator
1766 vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1768 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__position)) == this,
1769 "vector::emplace(iterator, x) called with an iterator not referring to this vector");
1770 pointer __p = this->__begin_ + (__position - begin());
1771 if (this->__end_ < this->__end_cap())
1773 if (__p == this->__end_)
1775 __construct_one_at_end(_VSTD::forward<_Args>(__args)...);
1779 __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...);
1780 __move_range(__p, this->__end_, __p + 1);
1781 *__p = _VSTD::move(__tmp.get());
1786 allocator_type& __a = this->__alloc();
1787 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1788 __v.emplace_back(_VSTD::forward<_Args>(__args)...);
1789 __p = __swap_out_circular_buffer(__v, __p);
1791 return __make_iter(__p);
1794 #endif // !_LIBCPP_CXX03_LANG
1796 template <class _Tp, class _Allocator>
1797 typename vector<_Tp, _Allocator>::iterator
1798 vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1800 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__position)) == this,
1801 "vector::insert(iterator, n, x) called with an iterator not referring to this vector");
1802 pointer __p = this->__begin_ + (__position - begin());
1805 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1807 size_type __old_n = __n;
1808 pointer __old_last = this->__end_;
1809 if (__n > static_cast<size_type>(this->__end_ - __p))
1811 size_type __cx = __n - (this->__end_ - __p);
1812 __construct_at_end(__cx, __x);
1817 __move_range(__p, __old_last, __p + __old_n);
1818 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1819 if (__p <= __xr && __xr < this->__end_)
1821 _VSTD::fill_n(__p, __n, *__xr);
1826 allocator_type& __a = this->__alloc();
1827 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1828 __v.__construct_at_end(__n, __x);
1829 __p = __swap_out_circular_buffer(__v, __p);
1832 return __make_iter(__p);
1835 template <class _Tp, class _Allocator>
1836 template <class _InputIterator>
1839 __is_cpp17_input_iterator <_InputIterator>::value &&
1840 !__is_cpp17_forward_iterator<_InputIterator>::value &&
1843 typename iterator_traits<_InputIterator>::reference>::value,
1844 typename vector<_Tp, _Allocator>::iterator
1846 vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1848 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__position)) == this,
1849 "vector::insert(iterator, range) called with an iterator not referring to this vector");
1850 difference_type __off = __position - begin();
1851 pointer __p = this->__begin_ + __off;
1852 allocator_type& __a = this->__alloc();
1853 pointer __old_last = this->__end_;
1854 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1856 __construct_one_at_end(*__first);
1858 __split_buffer<value_type, allocator_type&> __v(__a);
1859 if (__first != __last)
1861 #ifndef _LIBCPP_NO_EXCEPTIONS
1864 #endif // _LIBCPP_NO_EXCEPTIONS
1865 __v.__construct_at_end(__first, __last);
1866 difference_type __old_size = __old_last - this->__begin_;
1867 difference_type __old_p = __p - this->__begin_;
1868 reserve(__recommend(size() + __v.size()));
1869 __p = this->__begin_ + __old_p;
1870 __old_last = this->__begin_ + __old_size;
1871 #ifndef _LIBCPP_NO_EXCEPTIONS
1875 erase(__make_iter(__old_last), end());
1878 #endif // _LIBCPP_NO_EXCEPTIONS
1880 __p = _VSTD::rotate(__p, __old_last, this->__end_);
1881 insert(__make_iter(__p), _VSTD::make_move_iterator(__v.begin()),
1882 _VSTD::make_move_iterator(__v.end()));
1883 return begin() + __off;
1886 template <class _Tp, class _Allocator>
1887 template <class _ForwardIterator>
1890 __is_cpp17_forward_iterator<_ForwardIterator>::value &&
1893 typename iterator_traits<_ForwardIterator>::reference>::value,
1894 typename vector<_Tp, _Allocator>::iterator
1896 vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1898 _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__position)) == this,
1899 "vector::insert(iterator, range) called with an iterator not referring to this vector");
1900 pointer __p = this->__begin_ + (__position - begin());
1901 difference_type __n = _VSTD::distance(__first, __last);
1904 if (__n <= this->__end_cap() - this->__end_)
1906 size_type __old_n = __n;
1907 pointer __old_last = this->__end_;
1908 _ForwardIterator __m = __last;
1909 difference_type __dx = this->__end_ - __p;
1913 difference_type __diff = this->__end_ - __p;
1914 _VSTD::advance(__m, __diff);
1915 __construct_at_end(__m, __last, __n - __diff);
1920 __move_range(__p, __old_last, __p + __old_n);
1921 _VSTD::copy(__first, __m, __p);
1926 allocator_type& __a = this->__alloc();
1927 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1928 __v.__construct_at_end(__first, __last);
1929 __p = __swap_out_circular_buffer(__v, __p);
1932 return __make_iter(__p);
1935 template <class _Tp, class _Allocator>
1937 vector<_Tp, _Allocator>::resize(size_type __sz)
1939 size_type __cs = size();
1941 this->__append(__sz - __cs);
1942 else if (__cs > __sz)
1943 this->__destruct_at_end(this->__begin_ + __sz);
1946 template <class _Tp, class _Allocator>
1948 vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
1950 size_type __cs = size();
1952 this->__append(__sz - __cs, __x);
1953 else if (__cs > __sz)
1954 this->__destruct_at_end(this->__begin_ + __sz);
1957 template <class _Tp, class _Allocator>
1959 vector<_Tp, _Allocator>::swap(vector& __x)
1960 #if _LIBCPP_STD_VER >= 14
1963 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
1964 __is_nothrow_swappable<allocator_type>::value)
1967 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
1968 this->__alloc() == __x.__alloc(),
1969 "vector::swap: Either propagate_on_container_swap must be true"
1970 " or the allocators must compare equal");
1971 _VSTD::swap(this->__begin_, __x.__begin_);
1972 _VSTD::swap(this->__end_, __x.__end_);
1973 _VSTD::swap(this->__end_cap(), __x.__end_cap());
1974 _VSTD::__swap_allocator(this->__alloc(), __x.__alloc(),
1975 integral_constant<bool,__alloc_traits::propagate_on_container_swap::value>());
1976 #if _LIBCPP_DEBUG_LEVEL == 2
1977 __get_db()->swap(this, _VSTD::addressof(__x));
1981 template <class _Tp, class _Allocator>
1983 vector<_Tp, _Allocator>::__invariants() const
1985 if (this->__begin_ == nullptr)
1987 if (this->__end_ != nullptr || this->__end_cap() != nullptr)
1992 if (this->__begin_ > this->__end_)
1994 if (this->__begin_ == this->__end_cap())
1996 if (this->__end_ > this->__end_cap())
2002 #if _LIBCPP_DEBUG_LEVEL == 2
2004 template <class _Tp, class _Allocator>
2006 vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
2008 return this->__begin_ <= __i->base() && __i->base() < this->__end_;
2011 template <class _Tp, class _Allocator>
2013 vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
2015 return this->__begin_ < __i->base() && __i->base() <= this->__end_;
2018 template <class _Tp, class _Allocator>
2020 vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
2022 const_pointer __p = __i->base() + __n;
2023 return this->__begin_ <= __p && __p <= this->__end_;
2026 template <class _Tp, class _Allocator>
2028 vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2030 const_pointer __p = __i->base() + __n;
2031 return this->__begin_ <= __p && __p < this->__end_;
2034 #endif // _LIBCPP_DEBUG_LEVEL == 2
2036 template <class _Tp, class _Allocator>
2037 inline _LIBCPP_INLINE_VISIBILITY
2039 vector<_Tp, _Allocator>::__invalidate_all_iterators()
2041 #if _LIBCPP_DEBUG_LEVEL == 2
2042 __get_db()->__invalidate_all(this);
2047 template <class _Tp, class _Allocator>
2048 inline _LIBCPP_INLINE_VISIBILITY
2050 vector<_Tp, _Allocator>::__invalidate_iterators_past(pointer __new_last) {
2051 #if _LIBCPP_DEBUG_LEVEL == 2
2052 __c_node* __c = __get_db()->__find_c_and_lock(this);
2053 for (__i_node** __p = __c->end_; __p != __c->beg_; ) {
2055 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
2056 if (__i->base() > __new_last) {
2057 (*__p)->__c_ = nullptr;
2058 if (--__c->end_ != __p)
2059 _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
2062 __get_db()->unlock();
2070 template <class _Allocator> class vector<bool, _Allocator>;
2072 template <class _Allocator> struct hash<vector<bool, _Allocator> >;
2074 template <class _Allocator>
2075 struct __has_storage_type<vector<bool, _Allocator> >
2077 static const bool value = true;
2080 template <class _Allocator>
2081 class _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator>
2082 : private __vector_base_common<true>
2085 typedef vector __self;
2086 typedef bool value_type;
2087 typedef _Allocator allocator_type;
2088 typedef allocator_traits<allocator_type> __alloc_traits;
2089 typedef typename __alloc_traits::size_type size_type;
2090 typedef typename __alloc_traits::difference_type difference_type;
2091 typedef size_type __storage_type;
2092 typedef __bit_iterator<vector, false> pointer;
2093 typedef __bit_iterator<vector, true> const_pointer;
2094 typedef pointer iterator;
2095 typedef const_pointer const_iterator;
2096 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
2097 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
2100 typedef typename __rebind_alloc_helper<__alloc_traits, __storage_type>::type __storage_allocator;
2101 typedef allocator_traits<__storage_allocator> __storage_traits;
2102 typedef typename __storage_traits::pointer __storage_pointer;
2103 typedef typename __storage_traits::const_pointer __const_storage_pointer;
2105 __storage_pointer __begin_;
2107 __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
2109 typedef __bit_reference<vector> reference;
2110 typedef __bit_const_reference<vector> const_reference;
2112 _LIBCPP_INLINE_VISIBILITY
2113 size_type& __cap() _NOEXCEPT
2114 {return __cap_alloc_.first();}
2115 _LIBCPP_INLINE_VISIBILITY
2116 const size_type& __cap() const _NOEXCEPT
2117 {return __cap_alloc_.first();}
2118 _LIBCPP_INLINE_VISIBILITY
2119 __storage_allocator& __alloc() _NOEXCEPT
2120 {return __cap_alloc_.second();}
2121 _LIBCPP_INLINE_VISIBILITY
2122 const __storage_allocator& __alloc() const _NOEXCEPT
2123 {return __cap_alloc_.second();}
2125 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2127 _LIBCPP_INLINE_VISIBILITY
2128 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
2129 {return __n * __bits_per_word;}
2130 _LIBCPP_INLINE_VISIBILITY
2131 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
2132 {return (__n - 1) / __bits_per_word + 1;}
2135 _LIBCPP_INLINE_VISIBILITY
2136 vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
2138 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
2139 #if _LIBCPP_STD_VER <= 14
2140 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
2145 explicit vector(size_type __n);
2146 #if _LIBCPP_STD_VER > 11
2147 explicit vector(size_type __n, const allocator_type& __a);
2149 vector(size_type __n, const value_type& __v);
2150 vector(size_type __n, const value_type& __v, const allocator_type& __a);
2151 template <class _InputIterator>
2152 vector(_InputIterator __first, _InputIterator __last,
2153 typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value &&
2154 !__is_cpp17_forward_iterator<_InputIterator>::value>::type* = 0);
2155 template <class _InputIterator>
2156 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2157 typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value &&
2158 !__is_cpp17_forward_iterator<_InputIterator>::value>::type* = 0);
2159 template <class _ForwardIterator>
2160 vector(_ForwardIterator __first, _ForwardIterator __last,
2161 typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type* = 0);
2162 template <class _ForwardIterator>
2163 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2164 typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type* = 0);
2166 vector(const vector& __v);
2167 vector(const vector& __v, const allocator_type& __a);
2168 vector& operator=(const vector& __v);
2170 #ifndef _LIBCPP_CXX03_LANG
2171 vector(initializer_list<value_type> __il);
2172 vector(initializer_list<value_type> __il, const allocator_type& __a);
2174 _LIBCPP_INLINE_VISIBILITY
2175 vector(vector&& __v)
2176 #if _LIBCPP_STD_VER > 14
2179 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
2181 vector(vector&& __v, const __identity_t<allocator_type>& __a);
2182 _LIBCPP_INLINE_VISIBILITY
2183 vector& operator=(vector&& __v)
2184 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value));
2186 _LIBCPP_INLINE_VISIBILITY
2187 vector& operator=(initializer_list<value_type> __il)
2188 {assign(__il.begin(), __il.end()); return *this;}
2190 #endif // !_LIBCPP_CXX03_LANG
2192 template <class _InputIterator>
2195 __is_cpp17_input_iterator<_InputIterator>::value &&
2196 !__is_cpp17_forward_iterator<_InputIterator>::value,
2199 assign(_InputIterator __first, _InputIterator __last);
2200 template <class _ForwardIterator>
2203 __is_cpp17_forward_iterator<_ForwardIterator>::value,
2206 assign(_ForwardIterator __first, _ForwardIterator __last);
2208 void assign(size_type __n, const value_type& __x);
2210 #ifndef _LIBCPP_CXX03_LANG
2211 _LIBCPP_INLINE_VISIBILITY
2212 void assign(initializer_list<value_type> __il)
2213 {assign(__il.begin(), __il.end());}
2216 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
2217 {return allocator_type(this->__alloc());}
2219 size_type max_size() const _NOEXCEPT;
2220 _LIBCPP_INLINE_VISIBILITY
2221 size_type capacity() const _NOEXCEPT
2222 {return __internal_cap_to_external(__cap());}
2223 _LIBCPP_INLINE_VISIBILITY
2224 size_type size() const _NOEXCEPT
2226 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
2227 bool empty() const _NOEXCEPT
2228 {return __size_ == 0;}
2229 void reserve(size_type __n);
2230 void shrink_to_fit() _NOEXCEPT;
2232 _LIBCPP_INLINE_VISIBILITY
2233 iterator begin() _NOEXCEPT
2234 {return __make_iter(0);}
2235 _LIBCPP_INLINE_VISIBILITY
2236 const_iterator begin() const _NOEXCEPT
2237 {return __make_iter(0);}
2238 _LIBCPP_INLINE_VISIBILITY
2239 iterator end() _NOEXCEPT
2240 {return __make_iter(__size_);}
2241 _LIBCPP_INLINE_VISIBILITY
2242 const_iterator end() const _NOEXCEPT
2243 {return __make_iter(__size_);}
2245 _LIBCPP_INLINE_VISIBILITY
2246 reverse_iterator rbegin() _NOEXCEPT
2247 {return reverse_iterator(end());}
2248 _LIBCPP_INLINE_VISIBILITY
2249 const_reverse_iterator rbegin() const _NOEXCEPT
2250 {return const_reverse_iterator(end());}
2251 _LIBCPP_INLINE_VISIBILITY
2252 reverse_iterator rend() _NOEXCEPT
2253 {return reverse_iterator(begin());}
2254 _LIBCPP_INLINE_VISIBILITY
2255 const_reverse_iterator rend() const _NOEXCEPT
2256 {return const_reverse_iterator(begin());}
2258 _LIBCPP_INLINE_VISIBILITY
2259 const_iterator cbegin() const _NOEXCEPT
2260 {return __make_iter(0);}
2261 _LIBCPP_INLINE_VISIBILITY
2262 const_iterator cend() const _NOEXCEPT
2263 {return __make_iter(__size_);}
2264 _LIBCPP_INLINE_VISIBILITY
2265 const_reverse_iterator crbegin() const _NOEXCEPT
2267 _LIBCPP_INLINE_VISIBILITY
2268 const_reverse_iterator crend() const _NOEXCEPT
2271 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);}
2272 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2273 reference at(size_type __n);
2274 const_reference at(size_type __n) const;
2276 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);}
2277 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2278 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);}
2279 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);}
2281 void push_back(const value_type& __x);
2282 #if _LIBCPP_STD_VER > 11
2283 template <class... _Args>
2284 #if _LIBCPP_STD_VER > 14
2285 _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args)
2287 _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args)
2290 push_back ( value_type ( _VSTD::forward<_Args>(__args)... ));
2291 #if _LIBCPP_STD_VER > 14
2292 return this->back();
2297 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2299 #if _LIBCPP_STD_VER > 11
2300 template <class... _Args>
2301 _LIBCPP_INLINE_VISIBILITY iterator emplace(const_iterator position, _Args&&... __args)
2302 { return insert ( position, value_type ( _VSTD::forward<_Args>(__args)... )); }
2305 iterator insert(const_iterator __position, const value_type& __x);
2306 iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2307 iterator insert(const_iterator __position, size_type __n, const_reference __x);
2308 template <class _InputIterator>
2311 __is_cpp17_input_iterator <_InputIterator>::value &&
2312 !__is_cpp17_forward_iterator<_InputIterator>::value,
2315 insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2316 template <class _ForwardIterator>
2319 __is_cpp17_forward_iterator<_ForwardIterator>::value,
2322 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
2324 #ifndef _LIBCPP_CXX03_LANG
2325 _LIBCPP_INLINE_VISIBILITY
2326 iterator insert(const_iterator __position, initializer_list<value_type> __il)
2327 {return insert(__position, __il.begin(), __il.end());}
2330 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
2331 iterator erase(const_iterator __first, const_iterator __last);
2333 _LIBCPP_INLINE_VISIBILITY
2334 void clear() _NOEXCEPT {__size_ = 0;}
2337 #if _LIBCPP_STD_VER >= 14
2340 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
2341 __is_nothrow_swappable<allocator_type>::value);
2343 static void swap(reference __x, reference __y) _NOEXCEPT { _VSTD::swap(__x, __y); }
2345 void resize(size_type __sz, value_type __x = false);
2346 void flip() _NOEXCEPT;
2348 bool __invariants() const;
2351 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
2352 void __vallocate(size_type __n);
2353 void __vdeallocate() _NOEXCEPT;
2354 _LIBCPP_INLINE_VISIBILITY
2355 static size_type __align_it(size_type __new_size) _NOEXCEPT
2356 {return __new_size + (__bits_per_word-1) & ~((size_type)__bits_per_word-1);}
2357 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
2358 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
2359 template <class _ForwardIterator>
2362 __is_cpp17_forward_iterator<_ForwardIterator>::value,
2365 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2366 void __append(size_type __n, const_reference __x);
2367 _LIBCPP_INLINE_VISIBILITY
2368 reference __make_ref(size_type __pos) _NOEXCEPT
2369 {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
2370 _LIBCPP_INLINE_VISIBILITY
2371 const_reference __make_ref(size_type __pos) const _NOEXCEPT
2372 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
2373 _LIBCPP_INLINE_VISIBILITY
2374 iterator __make_iter(size_type __pos) _NOEXCEPT
2375 {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
2376 _LIBCPP_INLINE_VISIBILITY
2377 const_iterator __make_iter(size_type __pos) const _NOEXCEPT
2378 {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
2379 _LIBCPP_INLINE_VISIBILITY
2380 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
2381 {return begin() + (__p - cbegin());}
2383 _LIBCPP_INLINE_VISIBILITY
2384 void __copy_assign_alloc(const vector& __v)
2385 {__copy_assign_alloc(__v, integral_constant<bool,
2386 __storage_traits::propagate_on_container_copy_assignment::value>());}
2387 _LIBCPP_INLINE_VISIBILITY
2388 void __copy_assign_alloc(const vector& __c, true_type)
2390 if (__alloc() != __c.__alloc())
2392 __alloc() = __c.__alloc();
2395 _LIBCPP_INLINE_VISIBILITY
2396 void __copy_assign_alloc(const vector&, false_type)
2399 void __move_assign(vector& __c, false_type);
2400 void __move_assign(vector& __c, true_type)
2401 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
2402 _LIBCPP_INLINE_VISIBILITY
2403 void __move_assign_alloc(vector& __c)
2405 !__storage_traits::propagate_on_container_move_assignment::value ||
2406 is_nothrow_move_assignable<allocator_type>::value)
2407 {__move_assign_alloc(__c, integral_constant<bool,
2408 __storage_traits::propagate_on_container_move_assignment::value>());}
2409 _LIBCPP_INLINE_VISIBILITY
2410 void __move_assign_alloc(vector& __c, true_type)
2411 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
2413 __alloc() = _VSTD::move(__c.__alloc());
2416 _LIBCPP_INLINE_VISIBILITY
2417 void __move_assign_alloc(vector&, false_type)
2421 size_t __hash_code() const _NOEXCEPT;
2423 friend class __bit_reference<vector>;
2424 friend class __bit_const_reference<vector>;
2425 friend class __bit_iterator<vector, false>;
2426 friend class __bit_iterator<vector, true>;
2427 friend struct __bit_array<vector>;
2428 friend struct _LIBCPP_TEMPLATE_VIS hash<vector>;
2431 template <class _Allocator>
2432 inline _LIBCPP_INLINE_VISIBILITY
2434 vector<bool, _Allocator>::__invalidate_all_iterators()
2438 // Allocate space for __n objects
2439 // throws length_error if __n > max_size()
2440 // throws (probably bad_alloc) if memory run out
2441 // Precondition: __begin_ == __end_ == __cap() == 0
2442 // Precondition: __n > 0
2443 // Postcondition: capacity() == __n
2444 // Postcondition: size() == 0
2445 template <class _Allocator>
2447 vector<bool, _Allocator>::__vallocate(size_type __n)
2449 if (__n > max_size())
2450 this->__throw_length_error();
2451 __n = __external_cap_to_internal(__n);
2452 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2454 this->__cap() = __n;
2457 template <class _Allocator>
2459 vector<bool, _Allocator>::__vdeallocate() _NOEXCEPT
2461 if (this->__begin_ != nullptr)
2463 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2464 __invalidate_all_iterators();
2465 this->__begin_ = nullptr;
2466 this->__size_ = this->__cap() = 0;
2470 template <class _Allocator>
2471 typename vector<bool, _Allocator>::size_type
2472 vector<bool, _Allocator>::max_size() const _NOEXCEPT
2474 size_type __amax = __storage_traits::max_size(__alloc());
2475 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always
2476 if (__nmax / __bits_per_word <= __amax)
2478 return __internal_cap_to_external(__amax);
2481 // Precondition: __new_size > capacity()
2482 template <class _Allocator>
2483 inline _LIBCPP_INLINE_VISIBILITY
2484 typename vector<bool, _Allocator>::size_type
2485 vector<bool, _Allocator>::__recommend(size_type __new_size) const
2487 const size_type __ms = max_size();
2488 if (__new_size > __ms)
2489 this->__throw_length_error();
2490 const size_type __cap = capacity();
2491 if (__cap >= __ms / 2)
2493 return _VSTD::max(2 * __cap, __align_it(__new_size));
2496 // Default constructs __n objects starting at __end_
2497 // Precondition: __n > 0
2498 // Precondition: size() + __n <= capacity()
2499 // Postcondition: size() == size() + __n
2500 template <class _Allocator>
2501 inline _LIBCPP_INLINE_VISIBILITY
2503 vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2505 size_type __old_size = this->__size_;
2506 this->__size_ += __n;
2507 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2509 if (this->__size_ <= __bits_per_word)
2510 this->__begin_[0] = __storage_type(0);
2512 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2514 _VSTD::fill_n(__make_iter(__old_size), __n, __x);
2517 template <class _Allocator>
2518 template <class _ForwardIterator>
2521 __is_cpp17_forward_iterator<_ForwardIterator>::value,
2524 vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2526 size_type __old_size = this->__size_;
2527 this->__size_ += _VSTD::distance(__first, __last);
2528 if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word))
2530 if (this->__size_ <= __bits_per_word)
2531 this->__begin_[0] = __storage_type(0);
2533 this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0);
2535 _VSTD::copy(__first, __last, __make_iter(__old_size));
2538 template <class _Allocator>
2539 inline _LIBCPP_INLINE_VISIBILITY
2540 vector<bool, _Allocator>::vector()
2541 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
2542 : __begin_(nullptr),
2544 __cap_alloc_(0, __default_init_tag())
2548 template <class _Allocator>
2549 inline _LIBCPP_INLINE_VISIBILITY
2550 vector<bool, _Allocator>::vector(const allocator_type& __a)
2551 #if _LIBCPP_STD_VER <= 14
2552 _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
2556 : __begin_(nullptr),
2558 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2562 template <class _Allocator>
2563 vector<bool, _Allocator>::vector(size_type __n)
2564 : __begin_(nullptr),
2566 __cap_alloc_(0, __default_init_tag())
2571 __construct_at_end(__n, false);
2575 #if _LIBCPP_STD_VER > 11
2576 template <class _Allocator>
2577 vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a)
2578 : __begin_(nullptr),
2580 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2585 __construct_at_end(__n, false);
2590 template <class _Allocator>
2591 vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
2592 : __begin_(nullptr),
2594 __cap_alloc_(0, __default_init_tag())
2599 __construct_at_end(__n, __x);
2603 template <class _Allocator>
2604 vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
2605 : __begin_(nullptr),
2607 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2612 __construct_at_end(__n, __x);
2616 template <class _Allocator>
2617 template <class _InputIterator>
2618 vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2619 typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value &&
2620 !__is_cpp17_forward_iterator<_InputIterator>::value>::type*)
2621 : __begin_(nullptr),
2623 __cap_alloc_(0, __default_init_tag())
2625 #ifndef _LIBCPP_NO_EXCEPTIONS
2628 #endif // _LIBCPP_NO_EXCEPTIONS
2629 for (; __first != __last; ++__first)
2630 push_back(*__first);
2631 #ifndef _LIBCPP_NO_EXCEPTIONS
2635 if (__begin_ != nullptr)
2636 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2637 __invalidate_all_iterators();
2640 #endif // _LIBCPP_NO_EXCEPTIONS
2643 template <class _Allocator>
2644 template <class _InputIterator>
2645 vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2646 typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value &&
2647 !__is_cpp17_forward_iterator<_InputIterator>::value>::type*)
2648 : __begin_(nullptr),
2650 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2652 #ifndef _LIBCPP_NO_EXCEPTIONS
2655 #endif // _LIBCPP_NO_EXCEPTIONS
2656 for (; __first != __last; ++__first)
2657 push_back(*__first);
2658 #ifndef _LIBCPP_NO_EXCEPTIONS
2662 if (__begin_ != nullptr)
2663 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2664 __invalidate_all_iterators();
2667 #endif // _LIBCPP_NO_EXCEPTIONS
2670 template <class _Allocator>
2671 template <class _ForwardIterator>
2672 vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2673 typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type*)
2674 : __begin_(nullptr),
2676 __cap_alloc_(0, __default_init_tag())
2678 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2682 __construct_at_end(__first, __last);
2686 template <class _Allocator>
2687 template <class _ForwardIterator>
2688 vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2689 typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type*)
2690 : __begin_(nullptr),
2692 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2694 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2698 __construct_at_end(__first, __last);
2702 #ifndef _LIBCPP_CXX03_LANG
2704 template <class _Allocator>
2705 vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
2706 : __begin_(nullptr),
2708 __cap_alloc_(0, __default_init_tag())
2710 size_type __n = static_cast<size_type>(__il.size());
2714 __construct_at_end(__il.begin(), __il.end());
2718 template <class _Allocator>
2719 vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
2720 : __begin_(nullptr),
2722 __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2724 size_type __n = static_cast<size_type>(__il.size());
2728 __construct_at_end(__il.begin(), __il.end());
2732 #endif // _LIBCPP_CXX03_LANG
2734 template <class _Allocator>
2735 vector<bool, _Allocator>::~vector()
2737 if (__begin_ != nullptr)
2738 __storage_traits::deallocate(__alloc(), __begin_, __cap());
2739 __invalidate_all_iterators();
2742 template <class _Allocator>
2743 vector<bool, _Allocator>::vector(const vector& __v)
2744 : __begin_(nullptr),
2746 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2750 __vallocate(__v.size());
2751 __construct_at_end(__v.begin(), __v.end());
2755 template <class _Allocator>
2756 vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
2757 : __begin_(nullptr),
2759 __cap_alloc_(0, __a)
2763 __vallocate(__v.size());
2764 __construct_at_end(__v.begin(), __v.end());
2768 template <class _Allocator>
2769 vector<bool, _Allocator>&
2770 vector<bool, _Allocator>::operator=(const vector& __v)
2772 if (this != _VSTD::addressof(__v))
2774 __copy_assign_alloc(__v);
2777 if (__v.__size_ > capacity())
2780 __vallocate(__v.__size_);
2782 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
2784 __size_ = __v.__size_;
2789 #ifndef _LIBCPP_CXX03_LANG
2791 template <class _Allocator>
2792 inline _LIBCPP_INLINE_VISIBILITY vector<bool, _Allocator>::vector(vector&& __v)
2793 #if _LIBCPP_STD_VER > 14
2796 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
2798 : __begin_(__v.__begin_),
2799 __size_(__v.__size_),
2800 __cap_alloc_(_VSTD::move(__v.__cap_alloc_)) {
2801 __v.__begin_ = nullptr;
2806 template <class _Allocator>
2807 vector<bool, _Allocator>::vector(vector&& __v, const __identity_t<allocator_type>& __a)
2808 : __begin_(nullptr),
2810 __cap_alloc_(0, __a)
2812 if (__a == allocator_type(__v.__alloc()))
2814 this->__begin_ = __v.__begin_;
2815 this->__size_ = __v.__size_;
2816 this->__cap() = __v.__cap();
2817 __v.__begin_ = nullptr;
2818 __v.__cap() = __v.__size_ = 0;
2820 else if (__v.size() > 0)
2822 __vallocate(__v.size());
2823 __construct_at_end(__v.begin(), __v.end());
2827 template <class _Allocator>
2828 inline _LIBCPP_INLINE_VISIBILITY
2829 vector<bool, _Allocator>&
2830 vector<bool, _Allocator>::operator=(vector&& __v)
2831 _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value))
2833 __move_assign(__v, integral_constant<bool,
2834 __storage_traits::propagate_on_container_move_assignment::value>());
2838 template <class _Allocator>
2840 vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2842 if (__alloc() != __c.__alloc())
2843 assign(__c.begin(), __c.end());
2845 __move_assign(__c, true_type());
2848 template <class _Allocator>
2850 vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
2851 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
2854 __move_assign_alloc(__c);
2855 this->__begin_ = __c.__begin_;
2856 this->__size_ = __c.__size_;
2857 this->__cap() = __c.__cap();
2858 __c.__begin_ = nullptr;
2859 __c.__cap() = __c.__size_ = 0;
2862 #endif // !_LIBCPP_CXX03_LANG
2864 template <class _Allocator>
2866 vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2871 size_type __c = capacity();
2876 vector __v(get_allocator());
2877 __v.reserve(__recommend(__n));
2881 _VSTD::fill_n(begin(), __n, __x);
2883 __invalidate_all_iterators();
2886 template <class _Allocator>
2887 template <class _InputIterator>
2890 __is_cpp17_input_iterator<_InputIterator>::value &&
2891 !__is_cpp17_forward_iterator<_InputIterator>::value,
2894 vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2897 for (; __first != __last; ++__first)
2898 push_back(*__first);
2901 template <class _Allocator>
2902 template <class _ForwardIterator>
2905 __is_cpp17_forward_iterator<_ForwardIterator>::value,
2908 vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2911 difference_type __ns = _VSTD::distance(__first, __last);
2912 _LIBCPP_ASSERT(__ns >= 0, "invalid range specified");
2913 const size_t __n = static_cast<size_type>(__ns);
2916 if (__n > capacity())
2921 __construct_at_end(__first, __last);
2925 template <class _Allocator>
2927 vector<bool, _Allocator>::reserve(size_type __n)
2929 if (__n > capacity())
2931 if (__n > max_size())
2932 this->__throw_length_error();
2933 vector __v(this->get_allocator());
2934 __v.__vallocate(__n);
2935 __v.__construct_at_end(this->begin(), this->end());
2937 __invalidate_all_iterators();
2941 template <class _Allocator>
2943 vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
2945 if (__external_cap_to_internal(size()) > __cap())
2947 #ifndef _LIBCPP_NO_EXCEPTIONS
2950 #endif // _LIBCPP_NO_EXCEPTIONS
2951 vector(*this, allocator_type(__alloc())).swap(*this);
2952 #ifndef _LIBCPP_NO_EXCEPTIONS
2957 #endif // _LIBCPP_NO_EXCEPTIONS
2961 template <class _Allocator>
2962 typename vector<bool, _Allocator>::reference
2963 vector<bool, _Allocator>::at(size_type __n)
2966 this->__throw_out_of_range();
2967 return (*this)[__n];
2970 template <class _Allocator>
2971 typename vector<bool, _Allocator>::const_reference
2972 vector<bool, _Allocator>::at(size_type __n) const
2975 this->__throw_out_of_range();
2976 return (*this)[__n];
2979 template <class _Allocator>
2981 vector<bool, _Allocator>::push_back(const value_type& __x)
2983 if (this->__size_ == this->capacity())
2984 reserve(__recommend(this->__size_ + 1));
2989 template <class _Allocator>
2990 typename vector<bool, _Allocator>::iterator
2991 vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
2994 if (size() < capacity())
2996 const_iterator __old_end = end();
2998 _VSTD::copy_backward(__position, __old_end, end());
2999 __r = __const_iterator_cast(__position);
3003 vector __v(get_allocator());
3004 __v.reserve(__recommend(__size_ + 1));
3005 __v.__size_ = __size_ + 1;
3006 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3007 _VSTD::copy_backward(__position, cend(), __v.end());
3014 template <class _Allocator>
3015 typename vector<bool, _Allocator>::iterator
3016 vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
3019 size_type __c = capacity();
3020 if (__n <= __c && size() <= __c - __n)
3022 const_iterator __old_end = end();
3024 _VSTD::copy_backward(__position, __old_end, end());
3025 __r = __const_iterator_cast(__position);
3029 vector __v(get_allocator());
3030 __v.reserve(__recommend(__size_ + __n));
3031 __v.__size_ = __size_ + __n;
3032 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3033 _VSTD::copy_backward(__position, cend(), __v.end());
3036 _VSTD::fill_n(__r, __n, __x);
3040 template <class _Allocator>
3041 template <class _InputIterator>
3044 __is_cpp17_input_iterator <_InputIterator>::value &&
3045 !__is_cpp17_forward_iterator<_InputIterator>::value,
3046 typename vector<bool, _Allocator>::iterator
3048 vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
3050 difference_type __off = __position - begin();
3051 iterator __p = __const_iterator_cast(__position);
3052 iterator __old_end = end();
3053 for (; size() != capacity() && __first != __last; ++__first)
3058 vector __v(get_allocator());
3059 if (__first != __last)
3061 #ifndef _LIBCPP_NO_EXCEPTIONS
3064 #endif // _LIBCPP_NO_EXCEPTIONS
3065 __v.assign(__first, __last);
3066 difference_type __old_size = static_cast<difference_type>(__old_end - begin());
3067 difference_type __old_p = __p - begin();
3068 reserve(__recommend(size() + __v.size()));
3069 __p = begin() + __old_p;
3070 __old_end = begin() + __old_size;
3071 #ifndef _LIBCPP_NO_EXCEPTIONS
3075 erase(__old_end, end());
3078 #endif // _LIBCPP_NO_EXCEPTIONS
3080 __p = _VSTD::rotate(__p, __old_end, end());
3081 insert(__p, __v.begin(), __v.end());
3082 return begin() + __off;
3085 template <class _Allocator>
3086 template <class _ForwardIterator>
3089 __is_cpp17_forward_iterator<_ForwardIterator>::value,
3090 typename vector<bool, _Allocator>::iterator
3092 vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
3094 const difference_type __n_signed = _VSTD::distance(__first, __last);
3095 _LIBCPP_ASSERT(__n_signed >= 0, "invalid range specified");
3096 const size_type __n = static_cast<size_type>(__n_signed);
3098 size_type __c = capacity();
3099 if (__n <= __c && size() <= __c - __n)
3101 const_iterator __old_end = end();
3103 _VSTD::copy_backward(__position, __old_end, end());
3104 __r = __const_iterator_cast(__position);
3108 vector __v(get_allocator());
3109 __v.reserve(__recommend(__size_ + __n));
3110 __v.__size_ = __size_ + __n;
3111 __r = _VSTD::copy(cbegin(), __position, __v.begin());
3112 _VSTD::copy_backward(__position, cend(), __v.end());
3115 _VSTD::copy(__first, __last, __r);
3119 template <class _Allocator>
3120 inline _LIBCPP_INLINE_VISIBILITY
3121 typename vector<bool, _Allocator>::iterator
3122 vector<bool, _Allocator>::erase(const_iterator __position)
3124 iterator __r = __const_iterator_cast(__position);
3125 _VSTD::copy(__position + 1, this->cend(), __r);
3130 template <class _Allocator>
3131 typename vector<bool, _Allocator>::iterator
3132 vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
3134 iterator __r = __const_iterator_cast(__first);
3135 difference_type __d = __last - __first;
3136 _VSTD::copy(__last, this->cend(), __r);
3141 template <class _Allocator>
3143 vector<bool, _Allocator>::swap(vector& __x)
3144 #if _LIBCPP_STD_VER >= 14
3147 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3148 __is_nothrow_swappable<allocator_type>::value)
3151 _VSTD::swap(this->__begin_, __x.__begin_);
3152 _VSTD::swap(this->__size_, __x.__size_);
3153 _VSTD::swap(this->__cap(), __x.__cap());
3154 _VSTD::__swap_allocator(this->__alloc(), __x.__alloc(),
3155 integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>());
3158 template <class _Allocator>
3160 vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3162 size_type __cs = size();
3166 size_type __c = capacity();
3167 size_type __n = __sz - __cs;
3168 if (__n <= __c && __cs <= __c - __n)
3175 vector __v(get_allocator());
3176 __v.reserve(__recommend(__size_ + __n));
3177 __v.__size_ = __size_ + __n;
3178 __r = _VSTD::copy(cbegin(), cend(), __v.begin());
3181 _VSTD::fill_n(__r, __n, __x);
3187 template <class _Allocator>
3189 vector<bool, _Allocator>::flip() _NOEXCEPT
3191 // do middle whole words
3192 size_type __n = __size_;
3193 __storage_pointer __p = __begin_;
3194 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3196 // do last partial word
3199 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3200 __storage_type __b = *__p & __m;
3206 template <class _Allocator>
3208 vector<bool, _Allocator>::__invariants() const
3210 if (this->__begin_ == nullptr)
3212 if (this->__size_ != 0 || this->__cap() != 0)
3217 if (this->__cap() == 0)
3219 if (this->__size_ > this->capacity())
3225 template <class _Allocator>
3227 vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
3230 // do middle whole words
3231 size_type __n = __size_;
3232 __storage_pointer __p = __begin_;
3233 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3235 // do last partial word
3238 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3244 template <class _Allocator>
3245 struct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> >
3246 : public unary_function<vector<bool, _Allocator>, size_t>
3248 _LIBCPP_INLINE_VISIBILITY
3249 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
3250 {return __vec.__hash_code();}
3253 template <class _Tp, class _Allocator>
3254 inline _LIBCPP_INLINE_VISIBILITY
3256 operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3258 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
3259 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
3262 template <class _Tp, class _Allocator>
3263 inline _LIBCPP_INLINE_VISIBILITY
3265 operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3267 return !(__x == __y);
3270 template <class _Tp, class _Allocator>
3271 inline _LIBCPP_INLINE_VISIBILITY
3273 operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3275 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
3278 template <class _Tp, class _Allocator>
3279 inline _LIBCPP_INLINE_VISIBILITY
3281 operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3286 template <class _Tp, class _Allocator>
3287 inline _LIBCPP_INLINE_VISIBILITY
3289 operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3291 return !(__x < __y);
3294 template <class _Tp, class _Allocator>
3295 inline _LIBCPP_INLINE_VISIBILITY
3297 operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3299 return !(__y < __x);
3302 template <class _Tp, class _Allocator>
3303 inline _LIBCPP_INLINE_VISIBILITY
3305 swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
3306 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
3311 #if _LIBCPP_STD_VER > 17
3312 template <class _Tp, class _Allocator, class _Up>
3313 inline _LIBCPP_INLINE_VISIBILITY typename vector<_Tp, _Allocator>::size_type
3314 erase(vector<_Tp, _Allocator>& __c, const _Up& __v) {
3315 auto __old_size = __c.size();
3316 __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end());
3317 return __old_size - __c.size();
3320 template <class _Tp, class _Allocator, class _Predicate>
3321 inline _LIBCPP_INLINE_VISIBILITY typename vector<_Tp, _Allocator>::size_type
3322 erase_if(vector<_Tp, _Allocator>& __c, _Predicate __pred) {
3323 auto __old_size = __c.size();
3324 __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end());
3325 return __old_size - __c.size();
3329 _LIBCPP_END_NAMESPACE_STD
3333 #endif // _LIBCPP_VECTOR