xref: /llvm-project-15.0.7/libcxx/include/vector (revision 2ef5ec6b)
1// -*- C++ -*-
2//===------------------------------ vector --------------------------------===//
3//
4//                     The LLVM Compiler Infrastructure
5//
6// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_VECTOR
12#define _LIBCPP_VECTOR
13
14/*
15    vector synopsis
16
17namespace std
18{
19
20template <class T, class Allocator = allocator<T> >
21class vector
22{
23public:
24    typedef T                                        value_type;
25    typedef Allocator                                allocator_type;
26    typedef typename allocator_type::reference       reference;
27    typedef typename allocator_type::const_reference const_reference;
28    typedef implementation-defined                   iterator;
29    typedef implementation-defined                   const_iterator;
30    typedef typename allocator_type::size_type       size_type;
31    typedef typename allocator_type::difference_type difference_type;
32    typedef typename allocator_type::pointer         pointer;
33    typedef typename allocator_type::const_pointer   const_pointer;
34    typedef std::reverse_iterator<iterator>          reverse_iterator;
35    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
36
37    vector()
38        noexcept(is_nothrow_default_constructible<allocator_type>::value);
39    explicit vector(const allocator_type&);
40    explicit vector(size_type n);
41    explicit vector(size_type n, const allocator_type&); // C++14
42    vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
43    template <class InputIterator>
44        vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
45    vector(const vector& x);
46    vector(vector&& x)
47        noexcept(is_nothrow_move_constructible<allocator_type>::value);
48    vector(initializer_list<value_type> il);
49    vector(initializer_list<value_type> il, const allocator_type& a);
50    ~vector();
51    vector& operator=(const vector& x);
52    vector& operator=(vector&& x)
53        noexcept(
54             allocator_type::propagate_on_container_move_assignment::value &&
55             is_nothrow_move_assignable<allocator_type>::value);
56    vector& operator=(initializer_list<value_type> il);
57    template <class InputIterator>
58        void assign(InputIterator first, InputIterator last);
59    void assign(size_type n, const value_type& u);
60    void assign(initializer_list<value_type> il);
61
62    allocator_type get_allocator() const noexcept;
63
64    iterator               begin() noexcept;
65    const_iterator         begin()   const noexcept;
66    iterator               end() noexcept;
67    const_iterator         end()     const noexcept;
68
69    reverse_iterator       rbegin() noexcept;
70    const_reverse_iterator rbegin()  const noexcept;
71    reverse_iterator       rend() noexcept;
72    const_reverse_iterator rend()    const noexcept;
73
74    const_iterator         cbegin()  const noexcept;
75    const_iterator         cend()    const noexcept;
76    const_reverse_iterator crbegin() const noexcept;
77    const_reverse_iterator crend()   const noexcept;
78
79    size_type size() const noexcept;
80    size_type max_size() const noexcept;
81    size_type capacity() const noexcept;
82    bool empty() const noexcept;
83    void reserve(size_type n);
84    void shrink_to_fit() noexcept;
85
86    reference       operator[](size_type n);
87    const_reference operator[](size_type n) const;
88    reference       at(size_type n);
89    const_reference at(size_type n) const;
90
91    reference       front();
92    const_reference front() const;
93    reference       back();
94    const_reference back() const;
95
96    value_type*       data() noexcept;
97    const value_type* data() const noexcept;
98
99    void push_back(const value_type& x);
100    void push_back(value_type&& x);
101    template <class... Args>
102        void emplace_back(Args&&... args);
103    void pop_back();
104
105    template <class... Args> iterator emplace(const_iterator position, Args&&... args);
106    iterator insert(const_iterator position, const value_type& x);
107    iterator insert(const_iterator position, value_type&& x);
108    iterator insert(const_iterator position, size_type n, const value_type& x);
109    template <class InputIterator>
110        iterator insert(const_iterator position, InputIterator first, InputIterator last);
111    iterator insert(const_iterator position, initializer_list<value_type> il);
112
113    iterator erase(const_iterator position);
114    iterator erase(const_iterator first, const_iterator last);
115
116    void clear() noexcept;
117
118    void resize(size_type sz);
119    void resize(size_type sz, const value_type& c);
120
121    void swap(vector&)
122        noexcept(!allocator_type::propagate_on_container_swap::value ||
123                 __is_nothrow_swappable<allocator_type>::value);
124
125    bool __invariants() const;
126};
127
128template <class Allocator = allocator<T> >
129class vector<bool, Allocator>
130{
131public:
132    typedef bool                                     value_type;
133    typedef Allocator                                allocator_type;
134    typedef implementation-defined                   iterator;
135    typedef implementation-defined                   const_iterator;
136    typedef typename allocator_type::size_type       size_type;
137    typedef typename allocator_type::difference_type difference_type;
138    typedef iterator                                 pointer;
139    typedef const_iterator                           const_pointer;
140    typedef std::reverse_iterator<iterator>          reverse_iterator;
141    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
142
143    class reference
144    {
145    public:
146        reference(const reference&) noexcept;
147        operator bool() const noexcept;
148        reference& operator=(const bool x) noexcept;
149        reference& operator=(const reference& x) noexcept;
150        iterator operator&() const noexcept;
151        void flip() noexcept;
152    };
153
154    class const_reference
155    {
156    public:
157        const_reference(const reference&) noexcept;
158        operator bool() const noexcept;
159        const_iterator operator&() const noexcept;
160    };
161
162    vector()
163        noexcept(is_nothrow_default_constructible<allocator_type>::value);
164    explicit vector(const allocator_type&);
165    explicit vector(size_type n, const allocator_type& a = allocator_type()); // C++14
166    vector(size_type n, const value_type& value, const allocator_type& = allocator_type());
167    template <class InputIterator>
168        vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type());
169    vector(const vector& x);
170    vector(vector&& x)
171        noexcept(is_nothrow_move_constructible<allocator_type>::value);
172    vector(initializer_list<value_type> il);
173    vector(initializer_list<value_type> il, const allocator_type& a);
174    ~vector();
175    vector& operator=(const vector& x);
176    vector& operator=(vector&& x)
177        noexcept(
178             allocator_type::propagate_on_container_move_assignment::value &&
179             is_nothrow_move_assignable<allocator_type>::value);
180    vector& operator=(initializer_list<value_type> il);
181    template <class InputIterator>
182        void assign(InputIterator first, InputIterator last);
183    void assign(size_type n, const value_type& u);
184    void assign(initializer_list<value_type> il);
185
186    allocator_type get_allocator() const noexcept;
187
188    iterator               begin() noexcept;
189    const_iterator         begin()   const noexcept;
190    iterator               end() noexcept;
191    const_iterator         end()     const noexcept;
192
193    reverse_iterator       rbegin() noexcept;
194    const_reverse_iterator rbegin()  const noexcept;
195    reverse_iterator       rend() noexcept;
196    const_reverse_iterator rend()    const noexcept;
197
198    const_iterator         cbegin()  const noexcept;
199    const_iterator         cend()    const noexcept;
200    const_reverse_iterator crbegin() const noexcept;
201    const_reverse_iterator crend()   const noexcept;
202
203    size_type size() const noexcept;
204    size_type max_size() const noexcept;
205    size_type capacity() const noexcept;
206    bool empty() const noexcept;
207    void reserve(size_type n);
208    void shrink_to_fit() noexcept;
209
210    reference       operator[](size_type n);
211    const_reference operator[](size_type n) const;
212    reference       at(size_type n);
213    const_reference at(size_type n) const;
214
215    reference       front();
216    const_reference front() const;
217    reference       back();
218    const_reference back() const;
219
220    void push_back(const value_type& x);
221    template <class... Args> void emplace_back(Args&&... args);  // C++14
222    void pop_back();
223
224    template <class... Args> iterator emplace(const_iterator position, Args&&... args);  // C++14
225    iterator insert(const_iterator position, const value_type& x);
226    iterator insert(const_iterator position, size_type n, const value_type& x);
227    template <class InputIterator>
228        iterator insert(const_iterator position, InputIterator first, InputIterator last);
229    iterator insert(const_iterator position, initializer_list<value_type> il);
230
231    iterator erase(const_iterator position);
232    iterator erase(const_iterator first, const_iterator last);
233
234    void clear() noexcept;
235
236    void resize(size_type sz);
237    void resize(size_type sz, value_type x);
238
239    void swap(vector&)
240        noexcept(!allocator_type::propagate_on_container_swap::value ||
241                 __is_nothrow_swappable<allocator_type>::value);
242    void flip() noexcept;
243
244    bool __invariants() const;
245};
246
247template <class Allocator> struct hash<std::vector<bool, Allocator>>;
248
249template <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
250template <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
251template <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
252template <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y);
253template <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
254template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y);
255
256template <class T, class Allocator>
257void swap(vector<T,Allocator>& x, vector<T,Allocator>& y)
258    noexcept(noexcept(x.swap(y)));
259
260}  // std
261
262*/
263
264#include <__config>
265#include <__bit_reference>
266#include <type_traits>
267#include <climits>
268#include <limits>
269#include <initializer_list>
270#include <memory>
271#include <stdexcept>
272#include <algorithm>
273#include <cstring>
274#include <__split_buffer>
275#include <__functional_base>
276
277#include <__undef_min_max>
278
279#include <__debug>
280
281#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
282#pragma GCC system_header
283#endif
284
285_LIBCPP_BEGIN_NAMESPACE_STD
286
287template <bool>
288class __vector_base_common
289{
290protected:
291    _LIBCPP_ALWAYS_INLINE __vector_base_common() {}
292    void __throw_length_error() const;
293    void __throw_out_of_range() const;
294};
295
296template <bool __b>
297void
298__vector_base_common<__b>::__throw_length_error() const
299{
300#ifndef _LIBCPP_NO_EXCEPTIONS
301    throw length_error("vector");
302#else
303    assert(!"vector length_error");
304#endif
305}
306
307template <bool __b>
308void
309__vector_base_common<__b>::__throw_out_of_range() const
310{
311#ifndef _LIBCPP_NO_EXCEPTIONS
312    throw out_of_range("vector");
313#else
314    assert(!"vector out_of_range");
315#endif
316}
317
318#ifdef _LIBCPP_MSVC
319#pragma warning( push )
320#pragma warning( disable: 4231 )
321#endif // _LIBCPP_MSVC
322_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS __vector_base_common<true>)
323#ifdef _LIBCPP_MSVC
324#pragma warning( pop )
325#endif // _LIBCPP_MSVC
326
327template <class _Tp, class _Allocator>
328class __vector_base
329    : protected __vector_base_common<true>
330{
331protected:
332    typedef _Tp                                      value_type;
333    typedef _Allocator                               allocator_type;
334    typedef allocator_traits<allocator_type>         __alloc_traits;
335    typedef value_type&                              reference;
336    typedef const value_type&                        const_reference;
337    typedef typename __alloc_traits::size_type       size_type;
338    typedef typename __alloc_traits::difference_type difference_type;
339    typedef typename __alloc_traits::pointer         pointer;
340    typedef typename __alloc_traits::const_pointer   const_pointer;
341    typedef pointer                                  iterator;
342    typedef const_pointer                            const_iterator;
343
344    pointer                                         __begin_;
345    pointer                                         __end_;
346    __compressed_pair<pointer, allocator_type> __end_cap_;
347
348    _LIBCPP_INLINE_VISIBILITY
349    allocator_type& __alloc() _NOEXCEPT
350        {return __end_cap_.second();}
351    _LIBCPP_INLINE_VISIBILITY
352    const allocator_type& __alloc() const _NOEXCEPT
353        {return __end_cap_.second();}
354    _LIBCPP_INLINE_VISIBILITY
355    pointer& __end_cap() _NOEXCEPT
356        {return __end_cap_.first();}
357    _LIBCPP_INLINE_VISIBILITY
358    const pointer& __end_cap() const _NOEXCEPT
359        {return __end_cap_.first();}
360
361    _LIBCPP_INLINE_VISIBILITY
362    __vector_base()
363        _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
364    _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a);
365    ~__vector_base();
366
367    _LIBCPP_INLINE_VISIBILITY
368    void clear() _NOEXCEPT {__destruct_at_end(__begin_);}
369    _LIBCPP_INLINE_VISIBILITY
370    size_type capacity() const _NOEXCEPT
371        {return static_cast<size_type>(__end_cap() - __begin_);}
372
373    _LIBCPP_INLINE_VISIBILITY
374    void __destruct_at_end(pointer __new_last) _NOEXCEPT;
375
376    _LIBCPP_INLINE_VISIBILITY
377    void __copy_assign_alloc(const __vector_base& __c)
378        {__copy_assign_alloc(__c, integral_constant<bool,
379                      __alloc_traits::propagate_on_container_copy_assignment::value>());}
380
381    _LIBCPP_INLINE_VISIBILITY
382    void __move_assign_alloc(__vector_base& __c)
383        _NOEXCEPT_(
384            !__alloc_traits::propagate_on_container_move_assignment::value ||
385            is_nothrow_move_assignable<allocator_type>::value)
386        {__move_assign_alloc(__c, integral_constant<bool,
387                      __alloc_traits::propagate_on_container_move_assignment::value>());}
388
389    _LIBCPP_INLINE_VISIBILITY
390    static void __swap_alloc(allocator_type& __x, allocator_type& __y)
391        _NOEXCEPT_(
392            !__alloc_traits::propagate_on_container_swap::value ||
393            __is_nothrow_swappable<allocator_type>::value)
394        {__swap_alloc(__x, __y, integral_constant<bool,
395                      __alloc_traits::propagate_on_container_swap::value>());}
396private:
397    _LIBCPP_INLINE_VISIBILITY
398    void __copy_assign_alloc(const __vector_base& __c, true_type)
399        {
400            if (__alloc() != __c.__alloc())
401            {
402                clear();
403                __alloc_traits::deallocate(__alloc(), __begin_, capacity());
404                __begin_ = __end_ = __end_cap() = nullptr;
405            }
406            __alloc() = __c.__alloc();
407        }
408
409    _LIBCPP_INLINE_VISIBILITY
410    void __copy_assign_alloc(const __vector_base&, false_type)
411        {}
412
413    _LIBCPP_INLINE_VISIBILITY
414    void __move_assign_alloc(__vector_base& __c, true_type)
415        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
416        {
417            __alloc() = _VSTD::move(__c.__alloc());
418        }
419
420    _LIBCPP_INLINE_VISIBILITY
421    void __move_assign_alloc(__vector_base&, false_type)
422        _NOEXCEPT
423        {}
424
425    _LIBCPP_INLINE_VISIBILITY
426    static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type)
427        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
428        {
429            using _VSTD::swap;
430            swap(__x, __y);
431        }
432    _LIBCPP_INLINE_VISIBILITY
433    static void __swap_alloc(allocator_type&, allocator_type&, false_type)
434        _NOEXCEPT
435        {}
436};
437
438template <class _Tp, class _Allocator>
439inline _LIBCPP_INLINE_VISIBILITY
440void
441__vector_base<_Tp, _Allocator>::__destruct_at_end(pointer __new_last) _NOEXCEPT
442{
443    while (__new_last != __end_)
444        __alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(--__end_));
445}
446
447template <class _Tp, class _Allocator>
448inline _LIBCPP_INLINE_VISIBILITY
449__vector_base<_Tp, _Allocator>::__vector_base()
450        _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
451    : __begin_(nullptr),
452      __end_(nullptr),
453      __end_cap_(nullptr)
454{
455}
456
457template <class _Tp, class _Allocator>
458inline _LIBCPP_INLINE_VISIBILITY
459__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a)
460    : __begin_(nullptr),
461      __end_(nullptr),
462      __end_cap_(nullptr, __a)
463{
464}
465
466template <class _Tp, class _Allocator>
467__vector_base<_Tp, _Allocator>::~__vector_base()
468{
469    if (__begin_ != nullptr)
470    {
471        clear();
472        __alloc_traits::deallocate(__alloc(), __begin_, capacity());
473    }
474}
475
476template <class _Tp, class _Allocator = allocator<_Tp> >
477class _LIBCPP_TYPE_VIS_ONLY vector
478    : private __vector_base<_Tp, _Allocator>
479{
480private:
481    typedef __vector_base<_Tp, _Allocator>           __base;
482    typedef allocator<_Tp>                           __default_allocator_type;
483public:
484    typedef vector                                   __self;
485    typedef _Tp                                      value_type;
486    typedef _Allocator                               allocator_type;
487    typedef typename __base::__alloc_traits          __alloc_traits;
488    typedef typename __base::reference               reference;
489    typedef typename __base::const_reference         const_reference;
490    typedef typename __base::size_type               size_type;
491    typedef typename __base::difference_type         difference_type;
492    typedef typename __base::pointer                 pointer;
493    typedef typename __base::const_pointer           const_pointer;
494    typedef __wrap_iter<pointer>                     iterator;
495    typedef __wrap_iter<const_pointer>               const_iterator;
496    typedef _VSTD::reverse_iterator<iterator>         reverse_iterator;
497    typedef _VSTD::reverse_iterator<const_iterator>   const_reverse_iterator;
498
499    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
500                  "Allocator::value_type must be same type as value_type");
501
502    _LIBCPP_INLINE_VISIBILITY
503    vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
504        {
505#if _LIBCPP_DEBUG_LEVEL >= 2
506            __get_db()->__insert_c(this);
507#endif
508        }
509    _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
510#if _LIBCPP_STD_VER <= 14
511        _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
512#else
513        _NOEXCEPT
514#endif
515        : __base(__a)
516    {
517#if _LIBCPP_DEBUG_LEVEL >= 2
518        __get_db()->__insert_c(this);
519#endif
520    }
521    explicit vector(size_type __n);
522#if _LIBCPP_STD_VER > 11
523    explicit vector(size_type __n, const allocator_type& __a);
524#endif
525    vector(size_type __n, const_reference __x);
526    vector(size_type __n, const_reference __x, const allocator_type& __a);
527    template <class _InputIterator>
528        vector(_InputIterator __first,
529               typename enable_if<__is_input_iterator  <_InputIterator>::value &&
530                                 !__is_forward_iterator<_InputIterator>::value &&
531                                 is_constructible<
532                                    value_type,
533                                    typename iterator_traits<_InputIterator>::reference>::value,
534                                 _InputIterator>::type __last);
535    template <class _InputIterator>
536        vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
537               typename enable_if<__is_input_iterator  <_InputIterator>::value &&
538                                 !__is_forward_iterator<_InputIterator>::value &&
539                                 is_constructible<
540                                    value_type,
541                                    typename iterator_traits<_InputIterator>::reference>::value>::type* = 0);
542    template <class _ForwardIterator>
543        vector(_ForwardIterator __first,
544               typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
545                                 is_constructible<
546                                    value_type,
547                                    typename iterator_traits<_ForwardIterator>::reference>::value,
548                                 _ForwardIterator>::type __last);
549    template <class _ForwardIterator>
550        vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
551               typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
552                                 is_constructible<
553                                    value_type,
554                                    typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0);
555#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
556    _LIBCPP_INLINE_VISIBILITY
557    vector(initializer_list<value_type> __il);
558    _LIBCPP_INLINE_VISIBILITY
559    vector(initializer_list<value_type> __il, const allocator_type& __a);
560#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
561#if _LIBCPP_DEBUG_LEVEL >= 2
562    _LIBCPP_INLINE_VISIBILITY
563    ~vector()
564    {
565        __get_db()->__erase_c(this);
566    }
567#endif
568
569    vector(const vector& __x);
570    vector(const vector& __x, const allocator_type& __a);
571    _LIBCPP_INLINE_VISIBILITY
572    vector& operator=(const vector& __x);
573#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
574    _LIBCPP_INLINE_VISIBILITY
575    vector(vector&& __x)
576        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
577    _LIBCPP_INLINE_VISIBILITY
578    vector(vector&& __x, const allocator_type& __a);
579    _LIBCPP_INLINE_VISIBILITY
580    vector& operator=(vector&& __x)
581        _NOEXCEPT_(
582             __alloc_traits::propagate_on_container_move_assignment::value &&
583             is_nothrow_move_assignable<allocator_type>::value);
584#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
585#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
586    _LIBCPP_INLINE_VISIBILITY
587    vector& operator=(initializer_list<value_type> __il)
588        {assign(__il.begin(), __il.end()); return *this;}
589#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
590
591    template <class _InputIterator>
592        typename enable_if
593        <
594             __is_input_iterator  <_InputIterator>::value &&
595            !__is_forward_iterator<_InputIterator>::value &&
596            is_constructible<
597                 value_type,
598                 typename iterator_traits<_InputIterator>::reference>::value,
599            void
600        >::type
601        assign(_InputIterator __first, _InputIterator __last);
602    template <class _ForwardIterator>
603        typename enable_if
604        <
605            __is_forward_iterator<_ForwardIterator>::value &&
606            is_constructible<
607                 value_type,
608                 typename iterator_traits<_ForwardIterator>::reference>::value,
609            void
610        >::type
611        assign(_ForwardIterator __first, _ForwardIterator __last);
612
613    void assign(size_type __n, const_reference __u);
614#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
615    _LIBCPP_INLINE_VISIBILITY
616    void assign(initializer_list<value_type> __il)
617        {assign(__il.begin(), __il.end());}
618#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
619
620    _LIBCPP_INLINE_VISIBILITY
621    allocator_type get_allocator() const _NOEXCEPT
622        {return this->__alloc();}
623
624    _LIBCPP_INLINE_VISIBILITY iterator               begin() _NOEXCEPT;
625    _LIBCPP_INLINE_VISIBILITY const_iterator         begin()   const _NOEXCEPT;
626    _LIBCPP_INLINE_VISIBILITY iterator               end() _NOEXCEPT;
627    _LIBCPP_INLINE_VISIBILITY const_iterator         end()     const _NOEXCEPT;
628
629    _LIBCPP_INLINE_VISIBILITY
630    reverse_iterator       rbegin() _NOEXCEPT
631        {return       reverse_iterator(end());}
632    _LIBCPP_INLINE_VISIBILITY
633    const_reverse_iterator rbegin()  const _NOEXCEPT
634        {return const_reverse_iterator(end());}
635    _LIBCPP_INLINE_VISIBILITY
636    reverse_iterator       rend() _NOEXCEPT
637        {return       reverse_iterator(begin());}
638    _LIBCPP_INLINE_VISIBILITY
639    const_reverse_iterator rend()    const _NOEXCEPT
640        {return const_reverse_iterator(begin());}
641
642    _LIBCPP_INLINE_VISIBILITY
643    const_iterator         cbegin()  const _NOEXCEPT
644        {return begin();}
645    _LIBCPP_INLINE_VISIBILITY
646    const_iterator         cend()    const _NOEXCEPT
647        {return end();}
648    _LIBCPP_INLINE_VISIBILITY
649    const_reverse_iterator crbegin() const _NOEXCEPT
650        {return rbegin();}
651    _LIBCPP_INLINE_VISIBILITY
652    const_reverse_iterator crend()   const _NOEXCEPT
653        {return rend();}
654
655    _LIBCPP_INLINE_VISIBILITY
656    size_type size() const _NOEXCEPT
657        {return static_cast<size_type>(this->__end_ - this->__begin_);}
658    _LIBCPP_INLINE_VISIBILITY
659    size_type capacity() const _NOEXCEPT
660        {return __base::capacity();}
661    _LIBCPP_INLINE_VISIBILITY
662    bool empty() const _NOEXCEPT
663        {return this->__begin_ == this->__end_;}
664    size_type max_size() const _NOEXCEPT;
665    void reserve(size_type __n);
666    void shrink_to_fit() _NOEXCEPT;
667
668    _LIBCPP_INLINE_VISIBILITY reference       operator[](size_type __n);
669    _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const;
670    reference       at(size_type __n);
671    const_reference at(size_type __n) const;
672
673    _LIBCPP_INLINE_VISIBILITY reference       front()
674    {
675        _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
676        return *this->__begin_;
677    }
678    _LIBCPP_INLINE_VISIBILITY const_reference front() const
679    {
680        _LIBCPP_ASSERT(!empty(), "front() called for empty vector");
681        return *this->__begin_;
682    }
683    _LIBCPP_INLINE_VISIBILITY reference       back()
684    {
685        _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
686        return *(this->__end_ - 1);
687    }
688    _LIBCPP_INLINE_VISIBILITY const_reference back()  const
689    {
690        _LIBCPP_ASSERT(!empty(), "back() called for empty vector");
691        return *(this->__end_ - 1);
692    }
693
694    _LIBCPP_INLINE_VISIBILITY
695    value_type*       data() _NOEXCEPT
696        {return _VSTD::__to_raw_pointer(this->__begin_);}
697    _LIBCPP_INLINE_VISIBILITY
698    const value_type* data() const _NOEXCEPT
699        {return _VSTD::__to_raw_pointer(this->__begin_);}
700
701    _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
702#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
703    _LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
704#ifndef _LIBCPP_HAS_NO_VARIADICS
705    template <class... _Args>
706        void emplace_back(_Args&&... __args);
707#endif  // _LIBCPP_HAS_NO_VARIADICS
708#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
709    void pop_back();
710
711    iterator insert(const_iterator __position, const_reference __x);
712#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
713    iterator insert(const_iterator __position, value_type&& __x);
714#ifndef _LIBCPP_HAS_NO_VARIADICS
715    template <class... _Args>
716        iterator emplace(const_iterator __position, _Args&&... __args);
717#endif  // _LIBCPP_HAS_NO_VARIADICS
718#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
719    iterator insert(const_iterator __position, size_type __n, const_reference __x);
720    template <class _InputIterator>
721        typename enable_if
722        <
723             __is_input_iterator  <_InputIterator>::value &&
724            !__is_forward_iterator<_InputIterator>::value &&
725            is_constructible<
726                 value_type,
727                 typename iterator_traits<_InputIterator>::reference>::value,
728            iterator
729        >::type
730        insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
731    template <class _ForwardIterator>
732        typename enable_if
733        <
734            __is_forward_iterator<_ForwardIterator>::value &&
735            is_constructible<
736                 value_type,
737                 typename iterator_traits<_ForwardIterator>::reference>::value,
738            iterator
739        >::type
740        insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
741#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
742    _LIBCPP_INLINE_VISIBILITY
743    iterator insert(const_iterator __position, initializer_list<value_type> __il)
744        {return insert(__position, __il.begin(), __il.end());}
745#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
746
747    _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
748    iterator erase(const_iterator __first, const_iterator __last);
749
750    _LIBCPP_INLINE_VISIBILITY
751    void clear() _NOEXCEPT
752    {
753        size_type __old_size = size();
754        __base::clear();
755        __annotate_shrink(__old_size);
756        __invalidate_all_iterators();
757    }
758
759    void resize(size_type __sz);
760    void resize(size_type __sz, const_reference __x);
761
762    void swap(vector&)
763        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
764                   __is_nothrow_swappable<allocator_type>::value);
765
766    bool __invariants() const;
767
768#if _LIBCPP_DEBUG_LEVEL >= 2
769
770    bool __dereferenceable(const const_iterator* __i) const;
771    bool __decrementable(const const_iterator* __i) const;
772    bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
773    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
774
775#endif  // _LIBCPP_DEBUG_LEVEL >= 2
776
777private:
778    _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
779    void allocate(size_type __n);
780    void deallocate() _NOEXCEPT;
781    _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const;
782    void __construct_at_end(size_type __n);
783    void __construct_at_end(size_type __n, const_reference __x);
784    template <class _ForwardIterator>
785        typename enable_if
786        <
787            __is_forward_iterator<_ForwardIterator>::value,
788            void
789        >::type
790        __construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n);
791    void __append(size_type __n);
792    void __append(size_type __n, const_reference __x);
793    _LIBCPP_INLINE_VISIBILITY
794    iterator       __make_iter(pointer __p) _NOEXCEPT;
795    _LIBCPP_INLINE_VISIBILITY
796    const_iterator __make_iter(const_pointer __p) const _NOEXCEPT;
797    void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v);
798    pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p);
799    void __move_range(pointer __from_s, pointer __from_e, pointer __to);
800    void __move_assign(vector& __c, true_type)
801        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
802    void __move_assign(vector& __c, false_type);
803    _LIBCPP_INLINE_VISIBILITY
804    void __destruct_at_end(pointer __new_last) _NOEXCEPT
805    {
806#if _LIBCPP_DEBUG_LEVEL >= 2
807        __c_node* __c = __get_db()->__find_c_and_lock(this);
808        for (__i_node** __p = __c->end_; __p != __c->beg_; )
809        {
810            --__p;
811            const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
812            if (__i->base() > __new_last)
813            {
814                (*__p)->__c_ = nullptr;
815                if (--__c->end_ != __p)
816                    memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
817            }
818        }
819        __get_db()->unlock();
820#endif
821        size_type __old_size = size();
822        __base::__destruct_at_end(__new_last);
823        __annotate_shrink(__old_size);
824    }
825    template <class _Up>
826        void
827#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
828        __push_back_slow_path(_Up&& __x);
829#else
830        __push_back_slow_path(_Up& __x);
831#endif
832#if !defined(_LIBCPP_HAS_NO_VARIADICS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
833    template <class... _Args>
834        void
835        __emplace_back_slow_path(_Args&&... __args);
836#endif
837    // The following functions are no-ops outside of AddressSanitizer mode.
838    // We call annotatations only for the default Allocator because other allocators
839    // may not meet the AddressSanitizer alignment constraints.
840    // See the documentation for __sanitizer_annotate_contiguous_container for more details.
841    void __annotate_contiguous_container
842    (const void *__beg, const void *__end, const void *__old_mid, const void *__new_mid) const
843    {
844#ifndef _LIBCPP_HAS_NO_ASAN
845      if (__beg && is_same<allocator_type, __default_allocator_type>::value)
846        __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid);
847#endif
848    }
849
850    void __annotate_new(size_type __current_size) const
851    {
852      __annotate_contiguous_container(data(), data() + capacity(),
853                                      data() + capacity(), data() + __current_size);
854    }
855    void __annotate_delete() const
856    {
857      __annotate_contiguous_container(data(), data() + capacity(),
858                                      data() + size(), data() + capacity());
859    }
860    void __annotate_increase(size_type __n) const
861    {
862      __annotate_contiguous_container(data(), data() + capacity(),
863                                      data() + size(), data() + size() + __n);
864    }
865    void __annotate_shrink(size_type __old_size) const
866    {
867      __annotate_contiguous_container(data(), data() + capacity(),
868                                      data() + __old_size, data() + size());
869    }
870#ifndef _LIBCPP_HAS_NO_ASAN
871    // The annotation for size increase should happen before the actual increase,
872    // but if an exception is thrown after that the annotation has to be undone.
873    struct __RAII_IncreaseAnnotator {
874      __RAII_IncreaseAnnotator(const vector &__v, size_type __n = 1)
875        : __commit(false), __v(__v), __old_size(__v.size() + __n) {
876        __v.__annotate_increase(__n);
877      }
878      void __done() { __commit = true; }
879      ~__RAII_IncreaseAnnotator() {
880        if (__commit) return;
881        __v.__annotate_shrink(__old_size);
882      }
883      bool __commit;
884      const vector &__v;
885      size_type __old_size;
886    };
887#else
888    struct __RAII_IncreaseAnnotator {
889      inline __RAII_IncreaseAnnotator(const vector &, size_type __n = 1) {}
890      inline void __done() {}
891    };
892#endif
893
894};
895
896template <class _Tp, class _Allocator>
897void
898vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)
899{
900    __annotate_delete();
901    __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, this->__end_, __v.__begin_);
902    _VSTD::swap(this->__begin_, __v.__begin_);
903    _VSTD::swap(this->__end_, __v.__end_);
904    _VSTD::swap(this->__end_cap(), __v.__end_cap());
905    __v.__first_ = __v.__begin_;
906    __annotate_new(size());
907    __invalidate_all_iterators();
908}
909
910template <class _Tp, class _Allocator>
911typename vector<_Tp, _Allocator>::pointer
912vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)
913{
914    __annotate_delete();
915    pointer __r = __v.__begin_;
916    __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, __p, __v.__begin_);
917    __alloc_traits::__construct_forward(this->__alloc(), __p, this->__end_, __v.__end_);
918    _VSTD::swap(this->__begin_, __v.__begin_);
919    _VSTD::swap(this->__end_, __v.__end_);
920    _VSTD::swap(this->__end_cap(), __v.__end_cap());
921    __v.__first_ = __v.__begin_;
922    __annotate_new(size());
923    __invalidate_all_iterators();
924    return __r;
925}
926
927//  Allocate space for __n objects
928//  throws length_error if __n > max_size()
929//  throws (probably bad_alloc) if memory run out
930//  Precondition:  __begin_ == __end_ == __end_cap() == 0
931//  Precondition:  __n > 0
932//  Postcondition:  capacity() == __n
933//  Postcondition:  size() == 0
934template <class _Tp, class _Allocator>
935void
936vector<_Tp, _Allocator>::allocate(size_type __n)
937{
938    if (__n > max_size())
939        this->__throw_length_error();
940    this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);
941    this->__end_cap() = this->__begin_ + __n;
942    __annotate_new(0);
943}
944
945template <class _Tp, class _Allocator>
946void
947vector<_Tp, _Allocator>::deallocate() _NOEXCEPT
948{
949    if (this->__begin_ != nullptr)
950    {
951        clear();
952        __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity());
953        this->__begin_ = this->__end_ = this->__end_cap() = nullptr;
954    }
955}
956
957template <class _Tp, class _Allocator>
958typename vector<_Tp, _Allocator>::size_type
959vector<_Tp, _Allocator>::max_size() const _NOEXCEPT
960{
961    return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()), numeric_limits<size_type>::max() / 2);  // end() >= begin(), always
962}
963
964//  Precondition:  __new_size > capacity()
965template <class _Tp, class _Allocator>
966inline _LIBCPP_INLINE_VISIBILITY
967typename vector<_Tp, _Allocator>::size_type
968vector<_Tp, _Allocator>::__recommend(size_type __new_size) const
969{
970    const size_type __ms = max_size();
971    if (__new_size > __ms)
972        this->__throw_length_error();
973    const size_type __cap = capacity();
974    if (__cap >= __ms / 2)
975        return __ms;
976    return _VSTD::max<size_type>(2*__cap, __new_size);
977}
978
979//  Default constructs __n objects starting at __end_
980//  throws if construction throws
981//  Precondition:  __n > 0
982//  Precondition:  size() + __n <= capacity()
983//  Postcondition:  size() == size() + __n
984template <class _Tp, class _Allocator>
985void
986vector<_Tp, _Allocator>::__construct_at_end(size_type __n)
987{
988    allocator_type& __a = this->__alloc();
989    do
990    {
991        __RAII_IncreaseAnnotator __annotator(*this);
992        __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));
993        ++this->__end_;
994        --__n;
995        __annotator.__done();
996    } while (__n > 0);
997}
998
999//  Copy constructs __n objects starting at __end_ from __x
1000//  throws if construction throws
1001//  Precondition:  __n > 0
1002//  Precondition:  size() + __n <= capacity()
1003//  Postcondition:  size() == old size() + __n
1004//  Postcondition:  [i] == __x for all i in [size() - __n, __n)
1005template <class _Tp, class _Allocator>
1006inline _LIBCPP_INLINE_VISIBILITY
1007void
1008vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
1009{
1010    allocator_type& __a = this->__alloc();
1011    do
1012    {
1013        __RAII_IncreaseAnnotator __annotator(*this);
1014        __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x);
1015        ++this->__end_;
1016        --__n;
1017        __annotator.__done();
1018    } while (__n > 0);
1019}
1020
1021template <class _Tp, class _Allocator>
1022template <class _ForwardIterator>
1023typename enable_if
1024<
1025    __is_forward_iterator<_ForwardIterator>::value,
1026    void
1027>::type
1028vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n)
1029{
1030    allocator_type& __a = this->__alloc();
1031    __RAII_IncreaseAnnotator __annotator(*this, __n);
1032    __alloc_traits::__construct_range_forward(__a, __first, __last, this->__end_);
1033    __annotator.__done();
1034}
1035
1036//  Default constructs __n objects starting at __end_
1037//  throws if construction throws
1038//  Postcondition:  size() == size() + __n
1039//  Exception safety: strong.
1040template <class _Tp, class _Allocator>
1041void
1042vector<_Tp, _Allocator>::__append(size_type __n)
1043{
1044    if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1045        this->__construct_at_end(__n);
1046    else
1047    {
1048        allocator_type& __a = this->__alloc();
1049        __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1050        __v.__construct_at_end(__n);
1051        __swap_out_circular_buffer(__v);
1052    }
1053}
1054
1055//  Default constructs __n objects starting at __end_
1056//  throws if construction throws
1057//  Postcondition:  size() == size() + __n
1058//  Exception safety: strong.
1059template <class _Tp, class _Allocator>
1060void
1061vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x)
1062{
1063    if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n)
1064        this->__construct_at_end(__n, __x);
1065    else
1066    {
1067        allocator_type& __a = this->__alloc();
1068        __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a);
1069        __v.__construct_at_end(__n, __x);
1070        __swap_out_circular_buffer(__v);
1071    }
1072}
1073
1074template <class _Tp, class _Allocator>
1075vector<_Tp, _Allocator>::vector(size_type __n)
1076{
1077#if _LIBCPP_DEBUG_LEVEL >= 2
1078    __get_db()->__insert_c(this);
1079#endif
1080    if (__n > 0)
1081    {
1082        allocate(__n);
1083        __construct_at_end(__n);
1084    }
1085}
1086
1087#if _LIBCPP_STD_VER > 11
1088template <class _Tp, class _Allocator>
1089vector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a)
1090    : __base(__a)
1091{
1092#if _LIBCPP_DEBUG_LEVEL >= 2
1093    __get_db()->__insert_c(this);
1094#endif
1095    if (__n > 0)
1096    {
1097        allocate(__n);
1098        __construct_at_end(__n);
1099    }
1100}
1101#endif
1102
1103template <class _Tp, class _Allocator>
1104vector<_Tp, _Allocator>::vector(size_type __n, const_reference __x)
1105{
1106#if _LIBCPP_DEBUG_LEVEL >= 2
1107    __get_db()->__insert_c(this);
1108#endif
1109    if (__n > 0)
1110    {
1111        allocate(__n);
1112        __construct_at_end(__n, __x);
1113    }
1114}
1115
1116template <class _Tp, class _Allocator>
1117vector<_Tp, _Allocator>::vector(size_type __n, const_reference __x, const allocator_type& __a)
1118    : __base(__a)
1119{
1120#if _LIBCPP_DEBUG_LEVEL >= 2
1121    __get_db()->__insert_c(this);
1122#endif
1123    if (__n > 0)
1124    {
1125        allocate(__n);
1126        __construct_at_end(__n, __x);
1127    }
1128}
1129
1130template <class _Tp, class _Allocator>
1131template <class _InputIterator>
1132vector<_Tp, _Allocator>::vector(_InputIterator __first,
1133       typename enable_if<__is_input_iterator  <_InputIterator>::value &&
1134                         !__is_forward_iterator<_InputIterator>::value &&
1135                         is_constructible<
1136                            value_type,
1137                            typename iterator_traits<_InputIterator>::reference>::value,
1138                          _InputIterator>::type __last)
1139{
1140#if _LIBCPP_DEBUG_LEVEL >= 2
1141    __get_db()->__insert_c(this);
1142#endif
1143    for (; __first != __last; ++__first)
1144        push_back(*__first);
1145}
1146
1147template <class _Tp, class _Allocator>
1148template <class _InputIterator>
1149vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
1150       typename enable_if<__is_input_iterator  <_InputIterator>::value &&
1151                         !__is_forward_iterator<_InputIterator>::value &&
1152                         is_constructible<
1153                            value_type,
1154                            typename iterator_traits<_InputIterator>::reference>::value>::type*)
1155    : __base(__a)
1156{
1157#if _LIBCPP_DEBUG_LEVEL >= 2
1158    __get_db()->__insert_c(this);
1159#endif
1160    for (; __first != __last; ++__first)
1161        push_back(*__first);
1162}
1163
1164template <class _Tp, class _Allocator>
1165template <class _ForwardIterator>
1166vector<_Tp, _Allocator>::vector(_ForwardIterator __first,
1167                                typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1168                                is_constructible<
1169                                   value_type,
1170                                   typename iterator_traits<_ForwardIterator>::reference>::value,
1171                                                   _ForwardIterator>::type __last)
1172{
1173#if _LIBCPP_DEBUG_LEVEL >= 2
1174    __get_db()->__insert_c(this);
1175#endif
1176    size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
1177    if (__n > 0)
1178    {
1179        allocate(__n);
1180        __construct_at_end(__first, __last, __n);
1181    }
1182}
1183
1184template <class _Tp, class _Allocator>
1185template <class _ForwardIterator>
1186vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
1187                                typename enable_if<__is_forward_iterator<_ForwardIterator>::value &&
1188                                is_constructible<
1189                                   value_type,
1190                                   typename iterator_traits<_ForwardIterator>::reference>::value>::type*)
1191    : __base(__a)
1192{
1193#if _LIBCPP_DEBUG_LEVEL >= 2
1194    __get_db()->__insert_c(this);
1195#endif
1196    size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
1197    if (__n > 0)
1198    {
1199        allocate(__n);
1200        __construct_at_end(__first, __last, __n);
1201    }
1202}
1203
1204template <class _Tp, class _Allocator>
1205vector<_Tp, _Allocator>::vector(const vector& __x)
1206    : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc()))
1207{
1208#if _LIBCPP_DEBUG_LEVEL >= 2
1209    __get_db()->__insert_c(this);
1210#endif
1211    size_type __n = __x.size();
1212    if (__n > 0)
1213    {
1214        allocate(__n);
1215        __construct_at_end(__x.__begin_, __x.__end_, __n);
1216    }
1217}
1218
1219template <class _Tp, class _Allocator>
1220vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a)
1221    : __base(__a)
1222{
1223#if _LIBCPP_DEBUG_LEVEL >= 2
1224    __get_db()->__insert_c(this);
1225#endif
1226    size_type __n = __x.size();
1227    if (__n > 0)
1228    {
1229        allocate(__n);
1230        __construct_at_end(__x.__begin_, __x.__end_, __n);
1231    }
1232}
1233
1234#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1235
1236template <class _Tp, class _Allocator>
1237inline _LIBCPP_INLINE_VISIBILITY
1238vector<_Tp, _Allocator>::vector(vector&& __x)
1239        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
1240    : __base(_VSTD::move(__x.__alloc()))
1241{
1242#if _LIBCPP_DEBUG_LEVEL >= 2
1243    __get_db()->__insert_c(this);
1244    __get_db()->swap(this, &__x);
1245#endif
1246    this->__begin_ = __x.__begin_;
1247    this->__end_ = __x.__end_;
1248    this->__end_cap() = __x.__end_cap();
1249    __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
1250}
1251
1252template <class _Tp, class _Allocator>
1253inline _LIBCPP_INLINE_VISIBILITY
1254vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a)
1255    : __base(__a)
1256{
1257#if _LIBCPP_DEBUG_LEVEL >= 2
1258    __get_db()->__insert_c(this);
1259#endif
1260    if (__a == __x.__alloc())
1261    {
1262        this->__begin_ = __x.__begin_;
1263        this->__end_ = __x.__end_;
1264        this->__end_cap() = __x.__end_cap();
1265        __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr;
1266#if _LIBCPP_DEBUG_LEVEL >= 2
1267        __get_db()->swap(this, &__x);
1268#endif
1269    }
1270    else
1271    {
1272        typedef move_iterator<iterator> _Ip;
1273        assign(_Ip(__x.begin()), _Ip(__x.end()));
1274    }
1275}
1276
1277#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1278
1279template <class _Tp, class _Allocator>
1280inline _LIBCPP_INLINE_VISIBILITY
1281vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il)
1282{
1283#if _LIBCPP_DEBUG_LEVEL >= 2
1284    __get_db()->__insert_c(this);
1285#endif
1286    if (__il.size() > 0)
1287    {
1288        allocate(__il.size());
1289        __construct_at_end(__il.begin(), __il.end(), __il.size());
1290    }
1291}
1292
1293template <class _Tp, class _Allocator>
1294inline _LIBCPP_INLINE_VISIBILITY
1295vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
1296    : __base(__a)
1297{
1298#if _LIBCPP_DEBUG_LEVEL >= 2
1299    __get_db()->__insert_c(this);
1300#endif
1301    if (__il.size() > 0)
1302    {
1303        allocate(__il.size());
1304        __construct_at_end(__il.begin(), __il.end(), __il.size());
1305    }
1306}
1307
1308#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1309
1310template <class _Tp, class _Allocator>
1311inline _LIBCPP_INLINE_VISIBILITY
1312vector<_Tp, _Allocator>&
1313vector<_Tp, _Allocator>::operator=(vector&& __x)
1314        _NOEXCEPT_(
1315             __alloc_traits::propagate_on_container_move_assignment::value &&
1316             is_nothrow_move_assignable<allocator_type>::value)
1317{
1318    __move_assign(__x, integral_constant<bool,
1319          __alloc_traits::propagate_on_container_move_assignment::value>());
1320    return *this;
1321}
1322
1323template <class _Tp, class _Allocator>
1324void
1325vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type)
1326{
1327    if (__base::__alloc() != __c.__alloc())
1328    {
1329        typedef move_iterator<iterator> _Ip;
1330        assign(_Ip(__c.begin()), _Ip(__c.end()));
1331    }
1332    else
1333        __move_assign(__c, true_type());
1334}
1335
1336template <class _Tp, class _Allocator>
1337void
1338vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type)
1339    _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
1340{
1341    deallocate();
1342    __base::__move_assign_alloc(__c); // this can throw
1343    this->__begin_ = __c.__begin_;
1344    this->__end_ = __c.__end_;
1345    this->__end_cap() = __c.__end_cap();
1346    __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
1347#if _LIBCPP_DEBUG_LEVEL >= 2
1348    __get_db()->swap(this, &__c);
1349#endif
1350}
1351
1352#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1353
1354template <class _Tp, class _Allocator>
1355inline _LIBCPP_INLINE_VISIBILITY
1356vector<_Tp, _Allocator>&
1357vector<_Tp, _Allocator>::operator=(const vector& __x)
1358{
1359    if (this != &__x)
1360    {
1361        __base::__copy_assign_alloc(__x);
1362        assign(__x.__begin_, __x.__end_);
1363    }
1364    return *this;
1365}
1366
1367template <class _Tp, class _Allocator>
1368template <class _InputIterator>
1369typename enable_if
1370<
1371     __is_input_iterator  <_InputIterator>::value &&
1372    !__is_forward_iterator<_InputIterator>::value &&
1373    is_constructible<
1374       _Tp,
1375       typename iterator_traits<_InputIterator>::reference>::value,
1376    void
1377>::type
1378vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1379{
1380    clear();
1381    for (; __first != __last; ++__first)
1382        push_back(*__first);
1383}
1384
1385template <class _Tp, class _Allocator>
1386template <class _ForwardIterator>
1387typename enable_if
1388<
1389    __is_forward_iterator<_ForwardIterator>::value &&
1390    is_constructible<
1391       _Tp,
1392       typename iterator_traits<_ForwardIterator>::reference>::value,
1393    void
1394>::type
1395vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
1396{
1397    size_type __new_size = static_cast<size_type>(_VSTD::distance(__first, __last));
1398    if (__new_size <= capacity())
1399    {
1400        _ForwardIterator __mid = __last;
1401        bool __growing = false;
1402        if (__new_size > size())
1403        {
1404            __growing = true;
1405            __mid =  __first;
1406            _VSTD::advance(__mid, size());
1407        }
1408        pointer __m = _VSTD::copy(__first, __mid, this->__begin_);
1409        if (__growing)
1410            __construct_at_end(__mid, __last, __new_size - size());
1411        else
1412            this->__destruct_at_end(__m);
1413    }
1414    else
1415    {
1416        deallocate();
1417        allocate(__recommend(__new_size));
1418        __construct_at_end(__first, __last, __new_size);
1419    }
1420}
1421
1422template <class _Tp, class _Allocator>
1423void
1424vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u)
1425{
1426    if (__n <= capacity())
1427    {
1428        size_type __s = size();
1429        _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u);
1430        if (__n > __s)
1431            __construct_at_end(__n - __s, __u);
1432        else
1433            this->__destruct_at_end(this->__begin_ + __n);
1434    }
1435    else
1436    {
1437        deallocate();
1438        allocate(__recommend(static_cast<size_type>(__n)));
1439        __construct_at_end(__n, __u);
1440    }
1441}
1442
1443template <class _Tp, class _Allocator>
1444inline _LIBCPP_INLINE_VISIBILITY
1445typename vector<_Tp, _Allocator>::iterator
1446vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT
1447{
1448#if _LIBCPP_DEBUG_LEVEL >= 2
1449    return iterator(this, __p);
1450#else
1451    return iterator(__p);
1452#endif
1453}
1454
1455template <class _Tp, class _Allocator>
1456inline _LIBCPP_INLINE_VISIBILITY
1457typename vector<_Tp, _Allocator>::const_iterator
1458vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT
1459{
1460#if _LIBCPP_DEBUG_LEVEL >= 2
1461    return const_iterator(this, __p);
1462#else
1463    return const_iterator(__p);
1464#endif
1465}
1466
1467template <class _Tp, class _Allocator>
1468inline _LIBCPP_INLINE_VISIBILITY
1469typename vector<_Tp, _Allocator>::iterator
1470vector<_Tp, _Allocator>::begin() _NOEXCEPT
1471{
1472    return __make_iter(this->__begin_);
1473}
1474
1475template <class _Tp, class _Allocator>
1476inline _LIBCPP_INLINE_VISIBILITY
1477typename vector<_Tp, _Allocator>::const_iterator
1478vector<_Tp, _Allocator>::begin() const _NOEXCEPT
1479{
1480    return __make_iter(this->__begin_);
1481}
1482
1483template <class _Tp, class _Allocator>
1484inline _LIBCPP_INLINE_VISIBILITY
1485typename vector<_Tp, _Allocator>::iterator
1486vector<_Tp, _Allocator>::end() _NOEXCEPT
1487{
1488    return __make_iter(this->__end_);
1489}
1490
1491template <class _Tp, class _Allocator>
1492inline _LIBCPP_INLINE_VISIBILITY
1493typename vector<_Tp, _Allocator>::const_iterator
1494vector<_Tp, _Allocator>::end() const _NOEXCEPT
1495{
1496    return __make_iter(this->__end_);
1497}
1498
1499template <class _Tp, class _Allocator>
1500inline _LIBCPP_INLINE_VISIBILITY
1501typename vector<_Tp, _Allocator>::reference
1502vector<_Tp, _Allocator>::operator[](size_type __n)
1503{
1504    _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
1505    return this->__begin_[__n];
1506}
1507
1508template <class _Tp, class _Allocator>
1509inline _LIBCPP_INLINE_VISIBILITY
1510typename vector<_Tp, _Allocator>::const_reference
1511vector<_Tp, _Allocator>::operator[](size_type __n) const
1512{
1513    _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
1514    return this->__begin_[__n];
1515}
1516
1517template <class _Tp, class _Allocator>
1518typename vector<_Tp, _Allocator>::reference
1519vector<_Tp, _Allocator>::at(size_type __n)
1520{
1521    if (__n >= size())
1522        this->__throw_out_of_range();
1523    return this->__begin_[__n];
1524}
1525
1526template <class _Tp, class _Allocator>
1527typename vector<_Tp, _Allocator>::const_reference
1528vector<_Tp, _Allocator>::at(size_type __n) const
1529{
1530    if (__n >= size())
1531        this->__throw_out_of_range();
1532    return this->__begin_[__n];
1533}
1534
1535template <class _Tp, class _Allocator>
1536void
1537vector<_Tp, _Allocator>::reserve(size_type __n)
1538{
1539    if (__n > capacity())
1540    {
1541        allocator_type& __a = this->__alloc();
1542        __split_buffer<value_type, allocator_type&> __v(__n, size(), __a);
1543        __swap_out_circular_buffer(__v);
1544    }
1545}
1546
1547template <class _Tp, class _Allocator>
1548void
1549vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
1550{
1551    if (capacity() > size())
1552    {
1553#ifndef _LIBCPP_NO_EXCEPTIONS
1554        try
1555        {
1556#endif  // _LIBCPP_NO_EXCEPTIONS
1557            allocator_type& __a = this->__alloc();
1558            __split_buffer<value_type, allocator_type&> __v(size(), size(), __a);
1559            __swap_out_circular_buffer(__v);
1560#ifndef _LIBCPP_NO_EXCEPTIONS
1561        }
1562        catch (...)
1563        {
1564        }
1565#endif  // _LIBCPP_NO_EXCEPTIONS
1566    }
1567}
1568
1569template <class _Tp, class _Allocator>
1570template <class _Up>
1571void
1572#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1573vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x)
1574#else
1575vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x)
1576#endif
1577{
1578    allocator_type& __a = this->__alloc();
1579    __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1580    // __v.push_back(_VSTD::forward<_Up>(__x));
1581    __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Up>(__x));
1582    __v.__end_++;
1583    __swap_out_circular_buffer(__v);
1584}
1585
1586template <class _Tp, class _Allocator>
1587inline _LIBCPP_INLINE_VISIBILITY
1588void
1589vector<_Tp, _Allocator>::push_back(const_reference __x)
1590{
1591    if (this->__end_ != this->__end_cap())
1592    {
1593        __RAII_IncreaseAnnotator __annotator(*this);
1594        __alloc_traits::construct(this->__alloc(),
1595                                  _VSTD::__to_raw_pointer(this->__end_), __x);
1596        __annotator.__done();
1597        ++this->__end_;
1598    }
1599    else
1600        __push_back_slow_path(__x);
1601}
1602
1603#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1604
1605template <class _Tp, class _Allocator>
1606inline _LIBCPP_INLINE_VISIBILITY
1607void
1608vector<_Tp, _Allocator>::push_back(value_type&& __x)
1609{
1610    if (this->__end_ < this->__end_cap())
1611    {
1612        __RAII_IncreaseAnnotator __annotator(*this);
1613        __alloc_traits::construct(this->__alloc(),
1614                                  _VSTD::__to_raw_pointer(this->__end_),
1615                                  _VSTD::move(__x));
1616        __annotator.__done();
1617        ++this->__end_;
1618    }
1619    else
1620        __push_back_slow_path(_VSTD::move(__x));
1621}
1622
1623#ifndef _LIBCPP_HAS_NO_VARIADICS
1624
1625template <class _Tp, class _Allocator>
1626template <class... _Args>
1627void
1628vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args)
1629{
1630    allocator_type& __a = this->__alloc();
1631    __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
1632//    __v.emplace_back(_VSTD::forward<_Args>(__args)...);
1633    __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward<_Args>(__args)...);
1634    __v.__end_++;
1635    __swap_out_circular_buffer(__v);
1636}
1637
1638template <class _Tp, class _Allocator>
1639template <class... _Args>
1640inline _LIBCPP_INLINE_VISIBILITY
1641void
1642vector<_Tp, _Allocator>::emplace_back(_Args&&... __args)
1643{
1644    if (this->__end_ < this->__end_cap())
1645    {
1646        __RAII_IncreaseAnnotator __annotator(*this);
1647        __alloc_traits::construct(this->__alloc(),
1648                                  _VSTD::__to_raw_pointer(this->__end_),
1649                                  _VSTD::forward<_Args>(__args)...);
1650        __annotator.__done();
1651        ++this->__end_;
1652    }
1653    else
1654        __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...);
1655}
1656
1657#endif  // _LIBCPP_HAS_NO_VARIADICS
1658#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1659
1660template <class _Tp, class _Allocator>
1661inline _LIBCPP_INLINE_VISIBILITY
1662void
1663vector<_Tp, _Allocator>::pop_back()
1664{
1665    _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector");
1666    this->__destruct_at_end(this->__end_ - 1);
1667}
1668
1669template <class _Tp, class _Allocator>
1670inline _LIBCPP_INLINE_VISIBILITY
1671typename vector<_Tp, _Allocator>::iterator
1672vector<_Tp, _Allocator>::erase(const_iterator __position)
1673{
1674#if _LIBCPP_DEBUG_LEVEL >= 2
1675    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1676        "vector::erase(iterator) called with an iterator not"
1677        " referring to this vector");
1678#endif
1679    _LIBCPP_ASSERT(__position != end(),
1680        "vector::erase(iterator) called with a non-dereferenceable iterator");
1681    difference_type __ps = __position - cbegin();
1682    pointer __p = this->__begin_ + __ps;
1683    iterator __r = __make_iter(__p);
1684    this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
1685    return __r;
1686}
1687
1688template <class _Tp, class _Allocator>
1689typename vector<_Tp, _Allocator>::iterator
1690vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last)
1691{
1692#if _LIBCPP_DEBUG_LEVEL >= 2
1693    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
1694        "vector::erase(iterator,  iterator) called with an iterator not"
1695        " referring to this vector");
1696#endif
1697    _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range");
1698    pointer __p = this->__begin_ + (__first - begin());
1699    iterator __r = __make_iter(__p);
1700    if (__first != __last)
1701        this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p));
1702    return __r;
1703}
1704
1705template <class _Tp, class _Allocator>
1706void
1707vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to)
1708{
1709    pointer __old_last = this->__end_;
1710    difference_type __n = __old_last - __to;
1711    for (pointer __i = __from_s + __n; __i < __from_e; ++__i, ++this->__end_)
1712        __alloc_traits::construct(this->__alloc(),
1713                                  _VSTD::__to_raw_pointer(this->__end_),
1714                                  _VSTD::move(*__i));
1715    _VSTD::move_backward(__from_s, __from_s + __n, __old_last);
1716}
1717
1718template <class _Tp, class _Allocator>
1719typename vector<_Tp, _Allocator>::iterator
1720vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x)
1721{
1722#if _LIBCPP_DEBUG_LEVEL >= 2
1723    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1724        "vector::insert(iterator, x) called with an iterator not"
1725        " referring to this vector");
1726#endif
1727    pointer __p = this->__begin_ + (__position - begin());
1728    if (this->__end_ < this->__end_cap())
1729    {
1730        __RAII_IncreaseAnnotator __annotator(*this);
1731        if (__p == this->__end_)
1732        {
1733            __alloc_traits::construct(this->__alloc(),
1734                                      _VSTD::__to_raw_pointer(this->__end_), __x);
1735            ++this->__end_;
1736        }
1737        else
1738        {
1739            __move_range(__p, this->__end_, __p + 1);
1740            const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1741            if (__p <= __xr && __xr < this->__end_)
1742                ++__xr;
1743            *__p = *__xr;
1744        }
1745        __annotator.__done();
1746    }
1747    else
1748    {
1749        allocator_type& __a = this->__alloc();
1750        __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1751        __v.push_back(__x);
1752        __p = __swap_out_circular_buffer(__v, __p);
1753    }
1754    return __make_iter(__p);
1755}
1756
1757#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1758
1759template <class _Tp, class _Allocator>
1760typename vector<_Tp, _Allocator>::iterator
1761vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x)
1762{
1763#if _LIBCPP_DEBUG_LEVEL >= 2
1764    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1765        "vector::insert(iterator, x) called with an iterator not"
1766        " referring to this vector");
1767#endif
1768    pointer __p = this->__begin_ + (__position - begin());
1769    if (this->__end_ < this->__end_cap())
1770    {
1771        __RAII_IncreaseAnnotator __annotator(*this);
1772        if (__p == this->__end_)
1773        {
1774            __alloc_traits::construct(this->__alloc(),
1775                                      _VSTD::__to_raw_pointer(this->__end_),
1776                                      _VSTD::move(__x));
1777            ++this->__end_;
1778        }
1779        else
1780        {
1781            __move_range(__p, this->__end_, __p + 1);
1782            *__p = _VSTD::move(__x);
1783        }
1784        __annotator.__done();
1785    }
1786    else
1787    {
1788        allocator_type& __a = this->__alloc();
1789        __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1790        __v.push_back(_VSTD::move(__x));
1791        __p = __swap_out_circular_buffer(__v, __p);
1792    }
1793    return __make_iter(__p);
1794}
1795
1796#ifndef _LIBCPP_HAS_NO_VARIADICS
1797
1798template <class _Tp, class _Allocator>
1799template <class... _Args>
1800typename vector<_Tp, _Allocator>::iterator
1801vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args)
1802{
1803#if _LIBCPP_DEBUG_LEVEL >= 2
1804    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1805        "vector::emplace(iterator, x) called with an iterator not"
1806        " referring to this vector");
1807#endif
1808    pointer __p = this->__begin_ + (__position - begin());
1809    if (this->__end_ < this->__end_cap())
1810    {
1811        __RAII_IncreaseAnnotator __annotator(*this);
1812        if (__p == this->__end_)
1813        {
1814            __alloc_traits::construct(this->__alloc(),
1815                                      _VSTD::__to_raw_pointer(this->__end_),
1816                                      _VSTD::forward<_Args>(__args)...);
1817            ++this->__end_;
1818        }
1819        else
1820        {
1821            value_type __tmp(_VSTD::forward<_Args>(__args)...);
1822            __move_range(__p, this->__end_, __p + 1);
1823            *__p = _VSTD::move(__tmp);
1824        }
1825        __annotator.__done();
1826    }
1827    else
1828    {
1829        allocator_type& __a = this->__alloc();
1830        __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a);
1831        __v.emplace_back(_VSTD::forward<_Args>(__args)...);
1832        __p = __swap_out_circular_buffer(__v, __p);
1833    }
1834    return __make_iter(__p);
1835}
1836
1837#endif  // _LIBCPP_HAS_NO_VARIADICS
1838#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1839
1840template <class _Tp, class _Allocator>
1841typename vector<_Tp, _Allocator>::iterator
1842vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x)
1843{
1844#if _LIBCPP_DEBUG_LEVEL >= 2
1845    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1846        "vector::insert(iterator, n, x) called with an iterator not"
1847        " referring to this vector");
1848#endif
1849    pointer __p = this->__begin_ + (__position - begin());
1850    if (__n > 0)
1851    {
1852        if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_))
1853        {
1854            size_type __old_n = __n;
1855            pointer __old_last = this->__end_;
1856            if (__n > static_cast<size_type>(this->__end_ - __p))
1857            {
1858                size_type __cx = __n - (this->__end_ - __p);
1859                __construct_at_end(__cx, __x);
1860                __n -= __cx;
1861            }
1862            if (__n > 0)
1863            {
1864                __RAII_IncreaseAnnotator __annotator(*this, __n);
1865                __move_range(__p, __old_last, __p + __old_n);
1866                __annotator.__done();
1867                const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);
1868                if (__p <= __xr && __xr < this->__end_)
1869                    __xr += __old_n;
1870                _VSTD::fill_n(__p, __n, *__xr);
1871            }
1872        }
1873        else
1874        {
1875            allocator_type& __a = this->__alloc();
1876            __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1877            __v.__construct_at_end(__n, __x);
1878            __p = __swap_out_circular_buffer(__v, __p);
1879        }
1880    }
1881    return __make_iter(__p);
1882}
1883
1884template <class _Tp, class _Allocator>
1885template <class _InputIterator>
1886typename enable_if
1887<
1888     __is_input_iterator  <_InputIterator>::value &&
1889    !__is_forward_iterator<_InputIterator>::value &&
1890    is_constructible<
1891       _Tp,
1892       typename iterator_traits<_InputIterator>::reference>::value,
1893    typename vector<_Tp, _Allocator>::iterator
1894>::type
1895vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
1896{
1897#if _LIBCPP_DEBUG_LEVEL >= 2
1898    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1899        "vector::insert(iterator, range) called with an iterator not"
1900        " referring to this vector");
1901#endif
1902    difference_type __off = __position - begin();
1903    pointer __p = this->__begin_ + __off;
1904    allocator_type& __a = this->__alloc();
1905    pointer __old_last = this->__end_;
1906    for (; this->__end_ != this->__end_cap() && __first != __last; ++__first)
1907    {
1908        __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),
1909                                  *__first);
1910        ++this->__end_;
1911    }
1912    __split_buffer<value_type, allocator_type&> __v(__a);
1913    if (__first != __last)
1914    {
1915#ifndef _LIBCPP_NO_EXCEPTIONS
1916        try
1917        {
1918#endif  // _LIBCPP_NO_EXCEPTIONS
1919            __v.__construct_at_end(__first, __last);
1920            difference_type __old_size = __old_last - this->__begin_;
1921            difference_type __old_p = __p - this->__begin_;
1922            reserve(__recommend(size() + __v.size()));
1923            __p = this->__begin_ + __old_p;
1924            __old_last = this->__begin_ + __old_size;
1925#ifndef _LIBCPP_NO_EXCEPTIONS
1926        }
1927        catch (...)
1928        {
1929            erase(__make_iter(__old_last), end());
1930            throw;
1931        }
1932#endif  // _LIBCPP_NO_EXCEPTIONS
1933    }
1934    __p = _VSTD::rotate(__p, __old_last, this->__end_);
1935    insert(__make_iter(__p), make_move_iterator(__v.begin()),
1936                                    make_move_iterator(__v.end()));
1937    return begin() + __off;
1938}
1939
1940template <class _Tp, class _Allocator>
1941template <class _ForwardIterator>
1942typename enable_if
1943<
1944    __is_forward_iterator<_ForwardIterator>::value &&
1945    is_constructible<
1946       _Tp,
1947       typename iterator_traits<_ForwardIterator>::reference>::value,
1948    typename vector<_Tp, _Allocator>::iterator
1949>::type
1950vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
1951{
1952#if _LIBCPP_DEBUG_LEVEL >= 2
1953    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
1954        "vector::insert(iterator, range) called with an iterator not"
1955        " referring to this vector");
1956#endif
1957    pointer __p = this->__begin_ + (__position - begin());
1958    difference_type __n = _VSTD::distance(__first, __last);
1959    if (__n > 0)
1960    {
1961        if (__n <= this->__end_cap() - this->__end_)
1962        {
1963            size_type __old_n = __n;
1964            pointer __old_last = this->__end_;
1965            _ForwardIterator __m = __last;
1966            difference_type __dx = this->__end_ - __p;
1967            if (__n > __dx)
1968            {
1969                __m = __first;
1970                difference_type __diff = this->__end_ - __p;
1971                _VSTD::advance(__m, __diff);
1972                __construct_at_end(__m, __last, __n - __diff);
1973                __n = __dx;
1974            }
1975            if (__n > 0)
1976            {
1977                __RAII_IncreaseAnnotator __annotator(*this, __n);
1978                __move_range(__p, __old_last, __p + __old_n);
1979                __annotator.__done();
1980                _VSTD::copy(__first, __m, __p);
1981            }
1982        }
1983        else
1984        {
1985            allocator_type& __a = this->__alloc();
1986            __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a);
1987            __v.__construct_at_end(__first, __last);
1988            __p = __swap_out_circular_buffer(__v, __p);
1989        }
1990    }
1991    return __make_iter(__p);
1992}
1993
1994template <class _Tp, class _Allocator>
1995void
1996vector<_Tp, _Allocator>::resize(size_type __sz)
1997{
1998    size_type __cs = size();
1999    if (__cs < __sz)
2000        this->__append(__sz - __cs);
2001    else if (__cs > __sz)
2002        this->__destruct_at_end(this->__begin_ + __sz);
2003}
2004
2005template <class _Tp, class _Allocator>
2006void
2007vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x)
2008{
2009    size_type __cs = size();
2010    if (__cs < __sz)
2011        this->__append(__sz - __cs, __x);
2012    else if (__cs > __sz)
2013        this->__destruct_at_end(this->__begin_ + __sz);
2014}
2015
2016template <class _Tp, class _Allocator>
2017void
2018vector<_Tp, _Allocator>::swap(vector& __x)
2019        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
2020                   __is_nothrow_swappable<allocator_type>::value)
2021{
2022    _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
2023                   this->__alloc() == __x.__alloc(),
2024                   "vector::swap: Either propagate_on_container_swap must be true"
2025                   " or the allocators must compare equal");
2026    _VSTD::swap(this->__begin_, __x.__begin_);
2027    _VSTD::swap(this->__end_, __x.__end_);
2028    _VSTD::swap(this->__end_cap(), __x.__end_cap());
2029    __base::__swap_alloc(this->__alloc(), __x.__alloc());
2030#if _LIBCPP_DEBUG_LEVEL >= 2
2031    __get_db()->swap(this, &__x);
2032#endif  // _LIBCPP_DEBUG_LEVEL >= 2
2033}
2034
2035template <class _Tp, class _Allocator>
2036bool
2037vector<_Tp, _Allocator>::__invariants() const
2038{
2039    if (this->__begin_ == nullptr)
2040    {
2041        if (this->__end_ != nullptr || this->__end_cap() != nullptr)
2042            return false;
2043    }
2044    else
2045    {
2046        if (this->__begin_ > this->__end_)
2047            return false;
2048        if (this->__begin_ == this->__end_cap())
2049            return false;
2050        if (this->__end_ > this->__end_cap())
2051            return false;
2052    }
2053    return true;
2054}
2055
2056#if _LIBCPP_DEBUG_LEVEL >= 2
2057
2058template <class _Tp, class _Allocator>
2059bool
2060vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const
2061{
2062    return this->__begin_ <= __i->base() && __i->base() < this->__end_;
2063}
2064
2065template <class _Tp, class _Allocator>
2066bool
2067vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const
2068{
2069    return this->__begin_ < __i->base() && __i->base() <= this->__end_;
2070}
2071
2072template <class _Tp, class _Allocator>
2073bool
2074vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const
2075{
2076    const_pointer __p = __i->base() + __n;
2077    return this->__begin_ <= __p && __p <= this->__end_;
2078}
2079
2080template <class _Tp, class _Allocator>
2081bool
2082vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2083{
2084    const_pointer __p = __i->base() + __n;
2085    return this->__begin_ <= __p && __p < this->__end_;
2086}
2087
2088#endif  // _LIBCPP_DEBUG_LEVEL >= 2
2089
2090template <class _Tp, class _Allocator>
2091inline _LIBCPP_INLINE_VISIBILITY
2092void
2093vector<_Tp, _Allocator>::__invalidate_all_iterators()
2094{
2095#if _LIBCPP_DEBUG_LEVEL >= 2
2096    __get_db()->__invalidate_all(this);
2097#endif  // _LIBCPP_DEBUG_LEVEL >= 2
2098}
2099
2100// vector<bool>
2101
2102template <class _Allocator> class vector<bool, _Allocator>;
2103
2104template <class _Allocator> struct hash<vector<bool, _Allocator> >;
2105
2106template <class _Allocator>
2107struct __has_storage_type<vector<bool, _Allocator> >
2108{
2109    static const bool value = true;
2110};
2111
2112template <class _Allocator>
2113class _LIBCPP_TYPE_VIS_ONLY vector<bool, _Allocator>
2114    : private __vector_base_common<true>
2115{
2116public:
2117    typedef vector                                   __self;
2118    typedef bool                                     value_type;
2119    typedef _Allocator                               allocator_type;
2120    typedef allocator_traits<allocator_type>         __alloc_traits;
2121    typedef typename __alloc_traits::size_type       size_type;
2122    typedef typename __alloc_traits::difference_type difference_type;
2123    typedef size_type __storage_type;
2124    typedef __bit_iterator<vector, false>            pointer;
2125    typedef __bit_iterator<vector, true>             const_pointer;
2126    typedef pointer                                  iterator;
2127    typedef const_pointer                            const_iterator;
2128    typedef _VSTD::reverse_iterator<iterator>         reverse_iterator;
2129    typedef _VSTD::reverse_iterator<const_iterator>   const_reverse_iterator;
2130
2131private:
2132    typedef typename __rebind_alloc_helper<__alloc_traits, __storage_type>::type __storage_allocator;
2133    typedef allocator_traits<__storage_allocator>    __storage_traits;
2134    typedef typename __storage_traits::pointer       __storage_pointer;
2135    typedef typename __storage_traits::const_pointer __const_storage_pointer;
2136
2137    __storage_pointer                                      __begin_;
2138    size_type                                              __size_;
2139    __compressed_pair<size_type, __storage_allocator> __cap_alloc_;
2140public:
2141    typedef __bit_reference<vector>                  reference;
2142    typedef __bit_const_reference<vector>            const_reference;
2143private:
2144    _LIBCPP_INLINE_VISIBILITY
2145    size_type& __cap() _NOEXCEPT
2146        {return __cap_alloc_.first();}
2147    _LIBCPP_INLINE_VISIBILITY
2148    const size_type& __cap() const _NOEXCEPT
2149        {return __cap_alloc_.first();}
2150    _LIBCPP_INLINE_VISIBILITY
2151    __storage_allocator& __alloc() _NOEXCEPT
2152        {return __cap_alloc_.second();}
2153    _LIBCPP_INLINE_VISIBILITY
2154    const __storage_allocator& __alloc() const _NOEXCEPT
2155        {return __cap_alloc_.second();}
2156
2157    static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
2158
2159    _LIBCPP_INLINE_VISIBILITY
2160    static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT
2161        {return __n * __bits_per_word;}
2162    _LIBCPP_INLINE_VISIBILITY
2163    static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT
2164        {return (__n - 1) / __bits_per_word + 1;}
2165
2166public:
2167    _LIBCPP_INLINE_VISIBILITY
2168    vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
2169
2170    _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
2171#if _LIBCPP_STD_VER <= 14
2172        _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value);
2173#else
2174        _NOEXCEPT;
2175#endif
2176    ~vector();
2177    explicit vector(size_type __n);
2178#if _LIBCPP_STD_VER > 11
2179    explicit vector(size_type __n, const allocator_type& __a);
2180#endif
2181    vector(size_type __n, const value_type& __v);
2182    vector(size_type __n, const value_type& __v, const allocator_type& __a);
2183    template <class _InputIterator>
2184        vector(_InputIterator __first, _InputIterator __last,
2185               typename enable_if<__is_input_iterator  <_InputIterator>::value &&
2186                                 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2187    template <class _InputIterator>
2188        vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2189               typename enable_if<__is_input_iterator  <_InputIterator>::value &&
2190                                 !__is_forward_iterator<_InputIterator>::value>::type* = 0);
2191    template <class _ForwardIterator>
2192        vector(_ForwardIterator __first, _ForwardIterator __last,
2193               typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2194    template <class _ForwardIterator>
2195        vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2196               typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0);
2197
2198    vector(const vector& __v);
2199    vector(const vector& __v, const allocator_type& __a);
2200    vector& operator=(const vector& __v);
2201#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2202    vector(initializer_list<value_type> __il);
2203    vector(initializer_list<value_type> __il, const allocator_type& __a);
2204#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2205
2206#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2207    _LIBCPP_INLINE_VISIBILITY
2208    vector(vector&& __v)
2209        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
2210    vector(vector&& __v, const allocator_type& __a);
2211    _LIBCPP_INLINE_VISIBILITY
2212    vector& operator=(vector&& __v)
2213        _NOEXCEPT_(
2214             __alloc_traits::propagate_on_container_move_assignment::value &&
2215             is_nothrow_move_assignable<allocator_type>::value);
2216#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2217#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2218    _LIBCPP_INLINE_VISIBILITY
2219    vector& operator=(initializer_list<value_type> __il)
2220        {assign(__il.begin(), __il.end()); return *this;}
2221#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2222
2223    template <class _InputIterator>
2224        typename enable_if
2225        <
2226            __is_input_iterator<_InputIterator>::value &&
2227           !__is_forward_iterator<_InputIterator>::value,
2228           void
2229        >::type
2230        assign(_InputIterator __first, _InputIterator __last);
2231    template <class _ForwardIterator>
2232        typename enable_if
2233        <
2234            __is_forward_iterator<_ForwardIterator>::value,
2235           void
2236        >::type
2237        assign(_ForwardIterator __first, _ForwardIterator __last);
2238
2239    void assign(size_type __n, const value_type& __x);
2240#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2241    _LIBCPP_INLINE_VISIBILITY
2242    void assign(initializer_list<value_type> __il)
2243        {assign(__il.begin(), __il.end());}
2244#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2245
2246    _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT
2247        {return allocator_type(this->__alloc());}
2248
2249    size_type max_size() const _NOEXCEPT;
2250    _LIBCPP_INLINE_VISIBILITY
2251    size_type capacity() const _NOEXCEPT
2252        {return __internal_cap_to_external(__cap());}
2253    _LIBCPP_INLINE_VISIBILITY
2254    size_type size() const _NOEXCEPT
2255        {return __size_;}
2256    _LIBCPP_INLINE_VISIBILITY
2257    bool empty() const _NOEXCEPT
2258        {return __size_ == 0;}
2259    void reserve(size_type __n);
2260    void shrink_to_fit() _NOEXCEPT;
2261
2262    _LIBCPP_INLINE_VISIBILITY
2263    iterator begin() _NOEXCEPT
2264        {return __make_iter(0);}
2265    _LIBCPP_INLINE_VISIBILITY
2266    const_iterator begin() const _NOEXCEPT
2267        {return __make_iter(0);}
2268    _LIBCPP_INLINE_VISIBILITY
2269    iterator end() _NOEXCEPT
2270        {return __make_iter(__size_);}
2271    _LIBCPP_INLINE_VISIBILITY
2272    const_iterator end()   const _NOEXCEPT
2273        {return __make_iter(__size_);}
2274
2275    _LIBCPP_INLINE_VISIBILITY
2276    reverse_iterator rbegin() _NOEXCEPT
2277        {return       reverse_iterator(end());}
2278    _LIBCPP_INLINE_VISIBILITY
2279    const_reverse_iterator rbegin() const _NOEXCEPT
2280        {return const_reverse_iterator(end());}
2281    _LIBCPP_INLINE_VISIBILITY
2282    reverse_iterator rend() _NOEXCEPT
2283        {return       reverse_iterator(begin());}
2284    _LIBCPP_INLINE_VISIBILITY
2285    const_reverse_iterator rend()   const _NOEXCEPT
2286        {return const_reverse_iterator(begin());}
2287
2288    _LIBCPP_INLINE_VISIBILITY
2289    const_iterator         cbegin()  const _NOEXCEPT
2290        {return __make_iter(0);}
2291    _LIBCPP_INLINE_VISIBILITY
2292    const_iterator         cend()    const _NOEXCEPT
2293        {return __make_iter(__size_);}
2294    _LIBCPP_INLINE_VISIBILITY
2295    const_reverse_iterator crbegin() const _NOEXCEPT
2296        {return rbegin();}
2297    _LIBCPP_INLINE_VISIBILITY
2298    const_reverse_iterator crend()   const _NOEXCEPT
2299        {return rend();}
2300
2301    _LIBCPP_INLINE_VISIBILITY reference       operator[](size_type __n)       {return __make_ref(__n);}
2302    _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);}
2303    reference       at(size_type __n);
2304    const_reference at(size_type __n) const;
2305
2306    _LIBCPP_INLINE_VISIBILITY reference       front()       {return __make_ref(0);}
2307    _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);}
2308    _LIBCPP_INLINE_VISIBILITY reference       back()        {return __make_ref(__size_ - 1);}
2309    _LIBCPP_INLINE_VISIBILITY const_reference back()  const {return __make_ref(__size_ - 1);}
2310
2311    void push_back(const value_type& __x);
2312#if _LIBCPP_STD_VER > 11
2313    template <class... _Args>
2314    _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args)
2315        { push_back ( value_type ( _VSTD::forward<_Args>(__args)... )); }
2316#endif
2317
2318    _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;}
2319
2320#if _LIBCPP_STD_VER > 11
2321    template <class... _Args>
2322   _LIBCPP_INLINE_VISIBILITY iterator emplace(const_iterator position, _Args&&... __args)
2323        { return insert ( position, value_type ( _VSTD::forward<_Args>(__args)... )); }
2324#endif
2325
2326    iterator insert(const_iterator __position, const value_type& __x);
2327    iterator insert(const_iterator __position, size_type __n, const value_type& __x);
2328    iterator insert(const_iterator __position, size_type __n, const_reference __x);
2329    template <class _InputIterator>
2330        typename enable_if
2331        <
2332             __is_input_iterator  <_InputIterator>::value &&
2333            !__is_forward_iterator<_InputIterator>::value,
2334            iterator
2335        >::type
2336        insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
2337    template <class _ForwardIterator>
2338        typename enable_if
2339        <
2340            __is_forward_iterator<_ForwardIterator>::value,
2341            iterator
2342        >::type
2343        insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
2344#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2345    _LIBCPP_INLINE_VISIBILITY
2346    iterator insert(const_iterator __position, initializer_list<value_type> __il)
2347        {return insert(__position, __il.begin(), __il.end());}
2348#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2349
2350    _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position);
2351    iterator erase(const_iterator __first, const_iterator __last);
2352
2353    _LIBCPP_INLINE_VISIBILITY
2354    void clear() _NOEXCEPT {__size_ = 0;}
2355
2356    void swap(vector&)
2357        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
2358                   __is_nothrow_swappable<allocator_type>::value);
2359
2360    void resize(size_type __sz, value_type __x = false);
2361    void flip() _NOEXCEPT;
2362
2363    bool __invariants() const;
2364
2365private:
2366    _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators();
2367    void allocate(size_type __n);
2368    void deallocate() _NOEXCEPT;
2369    _LIBCPP_INLINE_VISIBILITY
2370    static size_type __align_it(size_type __new_size) _NOEXCEPT
2371        {return __new_size + (__bits_per_word-1) & ~((size_type)__bits_per_word-1);};
2372    _LIBCPP_INLINE_VISIBILITY  size_type __recommend(size_type __new_size) const;
2373    _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x);
2374    template <class _ForwardIterator>
2375        typename enable_if
2376        <
2377            __is_forward_iterator<_ForwardIterator>::value,
2378            void
2379        >::type
2380        __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
2381    void __append(size_type __n, const_reference __x);
2382    _LIBCPP_INLINE_VISIBILITY
2383    reference __make_ref(size_type __pos) _NOEXCEPT
2384        {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
2385    _LIBCPP_INLINE_VISIBILITY
2386    const_reference __make_ref(size_type __pos) const _NOEXCEPT
2387        {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
2388    _LIBCPP_INLINE_VISIBILITY
2389    iterator __make_iter(size_type __pos) _NOEXCEPT
2390        {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
2391    _LIBCPP_INLINE_VISIBILITY
2392    const_iterator __make_iter(size_type __pos) const _NOEXCEPT
2393        {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));}
2394    _LIBCPP_INLINE_VISIBILITY
2395    iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT
2396        {return begin() + (__p - cbegin());}
2397
2398    _LIBCPP_INLINE_VISIBILITY
2399    void __copy_assign_alloc(const vector& __v)
2400        {__copy_assign_alloc(__v, integral_constant<bool,
2401                      __storage_traits::propagate_on_container_copy_assignment::value>());}
2402    _LIBCPP_INLINE_VISIBILITY
2403    void __copy_assign_alloc(const vector& __c, true_type)
2404        {
2405            if (__alloc() != __c.__alloc())
2406                deallocate();
2407            __alloc() = __c.__alloc();
2408        }
2409
2410    _LIBCPP_INLINE_VISIBILITY
2411    void __copy_assign_alloc(const vector&, false_type)
2412        {}
2413
2414    void __move_assign(vector& __c, false_type);
2415    void __move_assign(vector& __c, true_type)
2416        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value);
2417    _LIBCPP_INLINE_VISIBILITY
2418    void __move_assign_alloc(vector& __c)
2419        _NOEXCEPT_(
2420            !__storage_traits::propagate_on_container_move_assignment::value ||
2421            is_nothrow_move_assignable<allocator_type>::value)
2422        {__move_assign_alloc(__c, integral_constant<bool,
2423                      __storage_traits::propagate_on_container_move_assignment::value>());}
2424    _LIBCPP_INLINE_VISIBILITY
2425    void __move_assign_alloc(vector& __c, true_type)
2426        _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
2427        {
2428            __alloc() = _VSTD::move(__c.__alloc());
2429        }
2430
2431    _LIBCPP_INLINE_VISIBILITY
2432    void __move_assign_alloc(vector&, false_type)
2433        _NOEXCEPT
2434        {}
2435
2436    _LIBCPP_INLINE_VISIBILITY
2437    static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y)
2438        _NOEXCEPT_(
2439            !__storage_traits::propagate_on_container_swap::value ||
2440            __is_nothrow_swappable<allocator_type>::value)
2441        {__swap_alloc(__x, __y, integral_constant<bool,
2442                      __storage_traits::propagate_on_container_swap::value>());}
2443
2444    _LIBCPP_INLINE_VISIBILITY
2445    static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y, true_type)
2446        _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value)
2447        {
2448            using _VSTD::swap;
2449            swap(__x, __y);
2450        }
2451    _LIBCPP_INLINE_VISIBILITY
2452    static void __swap_alloc(__storage_allocator&, __storage_allocator&, false_type)
2453        _NOEXCEPT
2454        {}
2455
2456    size_t __hash_code() const _NOEXCEPT;
2457
2458    friend class __bit_reference<vector>;
2459    friend class __bit_const_reference<vector>;
2460    friend class __bit_iterator<vector, false>;
2461    friend class __bit_iterator<vector, true>;
2462    friend struct __bit_array<vector>;
2463    friend struct _LIBCPP_TYPE_VIS_ONLY hash<vector>;
2464};
2465
2466template <class _Allocator>
2467inline _LIBCPP_INLINE_VISIBILITY
2468void
2469vector<bool, _Allocator>::__invalidate_all_iterators()
2470{
2471}
2472
2473//  Allocate space for __n objects
2474//  throws length_error if __n > max_size()
2475//  throws (probably bad_alloc) if memory run out
2476//  Precondition:  __begin_ == __end_ == __cap() == 0
2477//  Precondition:  __n > 0
2478//  Postcondition:  capacity() == __n
2479//  Postcondition:  size() == 0
2480template <class _Allocator>
2481void
2482vector<bool, _Allocator>::allocate(size_type __n)
2483{
2484    if (__n > max_size())
2485        this->__throw_length_error();
2486    __n = __external_cap_to_internal(__n);
2487    this->__begin_ = __storage_traits::allocate(this->__alloc(), __n);
2488    this->__size_ = 0;
2489    this->__cap() = __n;
2490}
2491
2492template <class _Allocator>
2493void
2494vector<bool, _Allocator>::deallocate() _NOEXCEPT
2495{
2496    if (this->__begin_ != nullptr)
2497    {
2498        __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap());
2499        __invalidate_all_iterators();
2500        this->__begin_ = nullptr;
2501        this->__size_ = this->__cap() = 0;
2502    }
2503}
2504
2505template <class _Allocator>
2506typename vector<bool, _Allocator>::size_type
2507vector<bool, _Allocator>::max_size() const _NOEXCEPT
2508{
2509    size_type __amax = __storage_traits::max_size(__alloc());
2510    size_type __nmax = numeric_limits<size_type>::max() / 2;  // end() >= begin(), always
2511    if (__nmax / __bits_per_word <= __amax)
2512        return __nmax;
2513    return __internal_cap_to_external(__amax);
2514}
2515
2516//  Precondition:  __new_size > capacity()
2517template <class _Allocator>
2518inline _LIBCPP_INLINE_VISIBILITY
2519typename vector<bool, _Allocator>::size_type
2520vector<bool, _Allocator>::__recommend(size_type __new_size) const
2521{
2522    const size_type __ms = max_size();
2523    if (__new_size > __ms)
2524        this->__throw_length_error();
2525    const size_type __cap = capacity();
2526    if (__cap >= __ms / 2)
2527        return __ms;
2528    return _VSTD::max(2*__cap, __align_it(__new_size));
2529}
2530
2531//  Default constructs __n objects starting at __end_
2532//  Precondition:  __n > 0
2533//  Precondition:  size() + __n <= capacity()
2534//  Postcondition:  size() == size() + __n
2535template <class _Allocator>
2536inline _LIBCPP_INLINE_VISIBILITY
2537void
2538vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x)
2539{
2540    size_type __old_size = this->__size_;
2541    this->__size_ += __n;
2542    _VSTD::fill_n(__make_iter(__old_size), __n, __x);
2543}
2544
2545template <class _Allocator>
2546template <class _ForwardIterator>
2547typename enable_if
2548<
2549    __is_forward_iterator<_ForwardIterator>::value,
2550    void
2551>::type
2552vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
2553{
2554    size_type __old_size = this->__size_;
2555    this->__size_ += _VSTD::distance(__first, __last);
2556    _VSTD::copy(__first, __last, __make_iter(__old_size));
2557}
2558
2559template <class _Allocator>
2560inline _LIBCPP_INLINE_VISIBILITY
2561vector<bool, _Allocator>::vector()
2562    _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
2563    : __begin_(nullptr),
2564      __size_(0),
2565      __cap_alloc_(0)
2566{
2567}
2568
2569template <class _Allocator>
2570inline _LIBCPP_INLINE_VISIBILITY
2571vector<bool, _Allocator>::vector(const allocator_type& __a)
2572#if _LIBCPP_STD_VER <= 14
2573        _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
2574#else
2575        _NOEXCEPT
2576#endif
2577    : __begin_(nullptr),
2578      __size_(0),
2579      __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2580{
2581}
2582
2583template <class _Allocator>
2584vector<bool, _Allocator>::vector(size_type __n)
2585    : __begin_(nullptr),
2586      __size_(0),
2587      __cap_alloc_(0)
2588{
2589    if (__n > 0)
2590    {
2591        allocate(__n);
2592        __construct_at_end(__n, false);
2593    }
2594}
2595
2596#if _LIBCPP_STD_VER > 11
2597template <class _Allocator>
2598vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a)
2599    : __begin_(nullptr),
2600      __size_(0),
2601      __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2602{
2603    if (__n > 0)
2604    {
2605        allocate(__n);
2606        __construct_at_end(__n, false);
2607    }
2608}
2609#endif
2610
2611template <class _Allocator>
2612vector<bool, _Allocator>::vector(size_type __n, const value_type& __x)
2613    : __begin_(nullptr),
2614      __size_(0),
2615      __cap_alloc_(0)
2616{
2617    if (__n > 0)
2618    {
2619        allocate(__n);
2620        __construct_at_end(__n, __x);
2621    }
2622}
2623
2624template <class _Allocator>
2625vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a)
2626    : __begin_(nullptr),
2627      __size_(0),
2628      __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2629{
2630    if (__n > 0)
2631    {
2632        allocate(__n);
2633        __construct_at_end(__n, __x);
2634    }
2635}
2636
2637template <class _Allocator>
2638template <class _InputIterator>
2639vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last,
2640       typename enable_if<__is_input_iterator  <_InputIterator>::value &&
2641                         !__is_forward_iterator<_InputIterator>::value>::type*)
2642    : __begin_(nullptr),
2643      __size_(0),
2644      __cap_alloc_(0)
2645{
2646#ifndef _LIBCPP_NO_EXCEPTIONS
2647    try
2648    {
2649#endif  // _LIBCPP_NO_EXCEPTIONS
2650        for (; __first != __last; ++__first)
2651            push_back(*__first);
2652#ifndef _LIBCPP_NO_EXCEPTIONS
2653    }
2654    catch (...)
2655    {
2656        if (__begin_ != nullptr)
2657            __storage_traits::deallocate(__alloc(), __begin_, __cap());
2658        __invalidate_all_iterators();
2659        throw;
2660    }
2661#endif  // _LIBCPP_NO_EXCEPTIONS
2662}
2663
2664template <class _Allocator>
2665template <class _InputIterator>
2666vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a,
2667       typename enable_if<__is_input_iterator  <_InputIterator>::value &&
2668                         !__is_forward_iterator<_InputIterator>::value>::type*)
2669    : __begin_(nullptr),
2670      __size_(0),
2671      __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2672{
2673#ifndef _LIBCPP_NO_EXCEPTIONS
2674    try
2675    {
2676#endif  // _LIBCPP_NO_EXCEPTIONS
2677        for (; __first != __last; ++__first)
2678            push_back(*__first);
2679#ifndef _LIBCPP_NO_EXCEPTIONS
2680    }
2681    catch (...)
2682    {
2683        if (__begin_ != nullptr)
2684            __storage_traits::deallocate(__alloc(), __begin_, __cap());
2685        __invalidate_all_iterators();
2686        throw;
2687    }
2688#endif  // _LIBCPP_NO_EXCEPTIONS
2689}
2690
2691template <class _Allocator>
2692template <class _ForwardIterator>
2693vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last,
2694                                typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
2695    : __begin_(nullptr),
2696      __size_(0),
2697      __cap_alloc_(0)
2698{
2699    size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2700    if (__n > 0)
2701    {
2702        allocate(__n);
2703        __construct_at_end(__first, __last);
2704    }
2705}
2706
2707template <class _Allocator>
2708template <class _ForwardIterator>
2709vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a,
2710                                typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*)
2711    : __begin_(nullptr),
2712      __size_(0),
2713      __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2714{
2715    size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
2716    if (__n > 0)
2717    {
2718        allocate(__n);
2719        __construct_at_end(__first, __last);
2720    }
2721}
2722
2723#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2724
2725template <class _Allocator>
2726vector<bool, _Allocator>::vector(initializer_list<value_type> __il)
2727    : __begin_(nullptr),
2728      __size_(0),
2729      __cap_alloc_(0)
2730{
2731    size_type __n = static_cast<size_type>(__il.size());
2732    if (__n > 0)
2733    {
2734        allocate(__n);
2735        __construct_at_end(__il.begin(), __il.end());
2736    }
2737}
2738
2739template <class _Allocator>
2740vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a)
2741    : __begin_(nullptr),
2742      __size_(0),
2743      __cap_alloc_(0, static_cast<__storage_allocator>(__a))
2744{
2745    size_type __n = static_cast<size_type>(__il.size());
2746    if (__n > 0)
2747    {
2748        allocate(__n);
2749        __construct_at_end(__il.begin(), __il.end());
2750    }
2751}
2752
2753#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2754
2755template <class _Allocator>
2756vector<bool, _Allocator>::~vector()
2757{
2758    if (__begin_ != nullptr)
2759        __storage_traits::deallocate(__alloc(), __begin_, __cap());
2760    __invalidate_all_iterators();
2761}
2762
2763template <class _Allocator>
2764vector<bool, _Allocator>::vector(const vector& __v)
2765    : __begin_(nullptr),
2766      __size_(0),
2767      __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc()))
2768{
2769    if (__v.size() > 0)
2770    {
2771        allocate(__v.size());
2772        __construct_at_end(__v.begin(), __v.end());
2773    }
2774}
2775
2776template <class _Allocator>
2777vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a)
2778    : __begin_(nullptr),
2779      __size_(0),
2780      __cap_alloc_(0, __a)
2781{
2782    if (__v.size() > 0)
2783    {
2784        allocate(__v.size());
2785        __construct_at_end(__v.begin(), __v.end());
2786    }
2787}
2788
2789template <class _Allocator>
2790vector<bool, _Allocator>&
2791vector<bool, _Allocator>::operator=(const vector& __v)
2792{
2793    if (this != &__v)
2794    {
2795        __copy_assign_alloc(__v);
2796        if (__v.__size_)
2797        {
2798            if (__v.__size_ > capacity())
2799            {
2800                deallocate();
2801                allocate(__v.__size_);
2802            }
2803            _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
2804        }
2805        __size_ = __v.__size_;
2806    }
2807    return *this;
2808}
2809
2810#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2811
2812template <class _Allocator>
2813inline _LIBCPP_INLINE_VISIBILITY
2814vector<bool, _Allocator>::vector(vector&& __v)
2815        _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
2816    : __begin_(__v.__begin_),
2817      __size_(__v.__size_),
2818      __cap_alloc_(__v.__cap_alloc_)
2819{
2820    __v.__begin_ = nullptr;
2821    __v.__size_ = 0;
2822    __v.__cap() = 0;
2823}
2824
2825template <class _Allocator>
2826vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a)
2827    : __begin_(nullptr),
2828      __size_(0),
2829      __cap_alloc_(0, __a)
2830{
2831    if (__a == allocator_type(__v.__alloc()))
2832    {
2833        this->__begin_ = __v.__begin_;
2834        this->__size_ = __v.__size_;
2835        this->__cap() = __v.__cap();
2836        __v.__begin_ = nullptr;
2837        __v.__cap() = __v.__size_ = 0;
2838    }
2839    else if (__v.size() > 0)
2840    {
2841        allocate(__v.size());
2842        __construct_at_end(__v.begin(), __v.end());
2843    }
2844}
2845
2846template <class _Allocator>
2847inline _LIBCPP_INLINE_VISIBILITY
2848vector<bool, _Allocator>&
2849vector<bool, _Allocator>::operator=(vector&& __v)
2850        _NOEXCEPT_(
2851             __alloc_traits::propagate_on_container_move_assignment::value &&
2852             is_nothrow_move_assignable<allocator_type>::value)
2853{
2854    __move_assign(__v, integral_constant<bool,
2855          __storage_traits::propagate_on_container_move_assignment::value>());
2856    return *this;
2857}
2858
2859template <class _Allocator>
2860void
2861vector<bool, _Allocator>::__move_assign(vector& __c, false_type)
2862{
2863    if (__alloc() != __c.__alloc())
2864        assign(__c.begin(), __c.end());
2865    else
2866        __move_assign(__c, true_type());
2867}
2868
2869template <class _Allocator>
2870void
2871vector<bool, _Allocator>::__move_assign(vector& __c, true_type)
2872    _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
2873{
2874    deallocate();
2875    __move_assign_alloc(__c);
2876    this->__begin_ = __c.__begin_;
2877    this->__size_ = __c.__size_;
2878    this->__cap() = __c.__cap();
2879    __c.__begin_ = nullptr;
2880    __c.__cap() = __c.__size_ = 0;
2881}
2882
2883#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2884
2885template <class _Allocator>
2886void
2887vector<bool, _Allocator>::assign(size_type __n, const value_type& __x)
2888{
2889    __size_ = 0;
2890    if (__n > 0)
2891    {
2892        size_type __c = capacity();
2893        if (__n <= __c)
2894            __size_ = __n;
2895        else
2896        {
2897            vector __v(__alloc());
2898            __v.reserve(__recommend(__n));
2899            __v.__size_ = __n;
2900            swap(__v);
2901        }
2902        _VSTD::fill_n(begin(), __n, __x);
2903    }
2904}
2905
2906template <class _Allocator>
2907template <class _InputIterator>
2908typename enable_if
2909<
2910    __is_input_iterator<_InputIterator>::value &&
2911   !__is_forward_iterator<_InputIterator>::value,
2912   void
2913>::type
2914vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
2915{
2916    clear();
2917    for (; __first != __last; ++__first)
2918        push_back(*__first);
2919}
2920
2921template <class _Allocator>
2922template <class _ForwardIterator>
2923typename enable_if
2924<
2925    __is_forward_iterator<_ForwardIterator>::value,
2926   void
2927>::type
2928vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last)
2929{
2930    clear();
2931    difference_type __n = _VSTD::distance(__first, __last);
2932    if (__n)
2933    {
2934        if (__n > capacity())
2935        {
2936            deallocate();
2937            allocate(__n);
2938        }
2939        __construct_at_end(__first, __last);
2940    }
2941}
2942
2943template <class _Allocator>
2944void
2945vector<bool, _Allocator>::reserve(size_type __n)
2946{
2947    if (__n > capacity())
2948    {
2949        vector __v(this->__alloc());
2950        __v.allocate(__n);
2951        __v.__construct_at_end(this->begin(), this->end());
2952        swap(__v);
2953        __invalidate_all_iterators();
2954    }
2955}
2956
2957template <class _Allocator>
2958void
2959vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT
2960{
2961    if (__external_cap_to_internal(size()) > __cap())
2962    {
2963#ifndef _LIBCPP_NO_EXCEPTIONS
2964        try
2965        {
2966#endif  // _LIBCPP_NO_EXCEPTIONS
2967            vector(*this, allocator_type(__alloc())).swap(*this);
2968#ifndef _LIBCPP_NO_EXCEPTIONS
2969        }
2970        catch (...)
2971        {
2972        }
2973#endif  // _LIBCPP_NO_EXCEPTIONS
2974    }
2975}
2976
2977template <class _Allocator>
2978typename vector<bool, _Allocator>::reference
2979vector<bool, _Allocator>::at(size_type __n)
2980{
2981    if (__n >= size())
2982        this->__throw_out_of_range();
2983    return (*this)[__n];
2984}
2985
2986template <class _Allocator>
2987typename vector<bool, _Allocator>::const_reference
2988vector<bool, _Allocator>::at(size_type __n) const
2989{
2990    if (__n >= size())
2991        this->__throw_out_of_range();
2992    return (*this)[__n];
2993}
2994
2995template <class _Allocator>
2996void
2997vector<bool, _Allocator>::push_back(const value_type& __x)
2998{
2999    if (this->__size_ == this->capacity())
3000        reserve(__recommend(this->__size_ + 1));
3001    ++this->__size_;
3002    back() = __x;
3003}
3004
3005template <class _Allocator>
3006typename vector<bool, _Allocator>::iterator
3007vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x)
3008{
3009    iterator __r;
3010    if (size() < capacity())
3011    {
3012        const_iterator __old_end = end();
3013        ++__size_;
3014        _VSTD::copy_backward(__position, __old_end, end());
3015        __r = __const_iterator_cast(__position);
3016    }
3017    else
3018    {
3019        vector __v(__alloc());
3020        __v.reserve(__recommend(__size_ + 1));
3021        __v.__size_ = __size_ + 1;
3022        __r = _VSTD::copy(cbegin(), __position, __v.begin());
3023        _VSTD::copy_backward(__position, cend(), __v.end());
3024        swap(__v);
3025    }
3026    *__r = __x;
3027    return __r;
3028}
3029
3030template <class _Allocator>
3031typename vector<bool, _Allocator>::iterator
3032vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x)
3033{
3034    iterator __r;
3035    size_type __c = capacity();
3036    if (__n <= __c && size() <= __c - __n)
3037    {
3038        const_iterator __old_end = end();
3039        __size_ += __n;
3040        _VSTD::copy_backward(__position, __old_end, end());
3041        __r = __const_iterator_cast(__position);
3042    }
3043    else
3044    {
3045        vector __v(__alloc());
3046        __v.reserve(__recommend(__size_ + __n));
3047        __v.__size_ = __size_ + __n;
3048        __r = _VSTD::copy(cbegin(), __position, __v.begin());
3049        _VSTD::copy_backward(__position, cend(), __v.end());
3050        swap(__v);
3051    }
3052    _VSTD::fill_n(__r, __n, __x);
3053    return __r;
3054}
3055
3056template <class _Allocator>
3057template <class _InputIterator>
3058typename enable_if
3059<
3060     __is_input_iterator  <_InputIterator>::value &&
3061    !__is_forward_iterator<_InputIterator>::value,
3062    typename vector<bool, _Allocator>::iterator
3063>::type
3064vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
3065{
3066    difference_type __off = __position - begin();
3067    iterator __p = __const_iterator_cast(__position);
3068    iterator __old_end = end();
3069    for (; size() != capacity() && __first != __last; ++__first)
3070    {
3071        ++this->__size_;
3072        back() = *__first;
3073    }
3074    vector __v(__alloc());
3075    if (__first != __last)
3076    {
3077#ifndef _LIBCPP_NO_EXCEPTIONS
3078        try
3079        {
3080#endif  // _LIBCPP_NO_EXCEPTIONS
3081            __v.assign(__first, __last);
3082            difference_type __old_size = static_cast<difference_type>(__old_end - begin());
3083            difference_type __old_p = __p - begin();
3084            reserve(__recommend(size() + __v.size()));
3085            __p = begin() + __old_p;
3086            __old_end = begin() + __old_size;
3087#ifndef _LIBCPP_NO_EXCEPTIONS
3088        }
3089        catch (...)
3090        {
3091            erase(__old_end, end());
3092            throw;
3093        }
3094#endif  // _LIBCPP_NO_EXCEPTIONS
3095    }
3096    __p = _VSTD::rotate(__p, __old_end, end());
3097    insert(__p, __v.begin(), __v.end());
3098    return begin() + __off;
3099}
3100
3101template <class _Allocator>
3102template <class _ForwardIterator>
3103typename enable_if
3104<
3105    __is_forward_iterator<_ForwardIterator>::value,
3106    typename vector<bool, _Allocator>::iterator
3107>::type
3108vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
3109{
3110    difference_type __n = _VSTD::distance(__first, __last);
3111    iterator __r;
3112    size_type __c = capacity();
3113    if (__n <= __c && size() <= __c - __n)
3114    {
3115        const_iterator __old_end = end();
3116        __size_ += __n;
3117        _VSTD::copy_backward(__position, __old_end, end());
3118        __r = __const_iterator_cast(__position);
3119    }
3120    else
3121    {
3122        vector __v(__alloc());
3123        __v.reserve(__recommend(__size_ + __n));
3124        __v.__size_ = __size_ + __n;
3125        __r = _VSTD::copy(cbegin(), __position, __v.begin());
3126        _VSTD::copy_backward(__position, cend(), __v.end());
3127        swap(__v);
3128    }
3129    _VSTD::copy(__first, __last, __r);
3130    return __r;
3131}
3132
3133template <class _Allocator>
3134inline _LIBCPP_INLINE_VISIBILITY
3135typename vector<bool, _Allocator>::iterator
3136vector<bool, _Allocator>::erase(const_iterator __position)
3137{
3138    iterator __r = __const_iterator_cast(__position);
3139    _VSTD::copy(__position + 1, this->cend(), __r);
3140    --__size_;
3141    return __r;
3142}
3143
3144template <class _Allocator>
3145typename vector<bool, _Allocator>::iterator
3146vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last)
3147{
3148    iterator __r = __const_iterator_cast(__first);
3149    difference_type __d = __last - __first;
3150    _VSTD::copy(__last, this->cend(), __r);
3151    __size_ -= __d;
3152    return __r;
3153}
3154
3155template <class _Allocator>
3156void
3157vector<bool, _Allocator>::swap(vector& __x)
3158        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
3159                   __is_nothrow_swappable<allocator_type>::value)
3160{
3161    _VSTD::swap(this->__begin_, __x.__begin_);
3162    _VSTD::swap(this->__size_, __x.__size_);
3163    _VSTD::swap(this->__cap(), __x.__cap());
3164    __swap_alloc(this->__alloc(), __x.__alloc());
3165}
3166
3167template <class _Allocator>
3168void
3169vector<bool, _Allocator>::resize(size_type __sz, value_type __x)
3170{
3171    size_type __cs = size();
3172    if (__cs < __sz)
3173    {
3174        iterator __r;
3175        size_type __c = capacity();
3176        size_type __n = __sz - __cs;
3177        if (__n <= __c && __cs <= __c - __n)
3178        {
3179            __r = end();
3180            __size_ += __n;
3181        }
3182        else
3183        {
3184            vector __v(__alloc());
3185            __v.reserve(__recommend(__size_ + __n));
3186            __v.__size_ = __size_ + __n;
3187            __r = _VSTD::copy(cbegin(), cend(), __v.begin());
3188            swap(__v);
3189        }
3190        _VSTD::fill_n(__r, __n, __x);
3191    }
3192    else
3193        __size_ = __sz;
3194}
3195
3196template <class _Allocator>
3197void
3198vector<bool, _Allocator>::flip() _NOEXCEPT
3199{
3200    // do middle whole words
3201    size_type __n = __size_;
3202    __storage_pointer __p = __begin_;
3203    for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3204        *__p = ~*__p;
3205    // do last partial word
3206    if (__n > 0)
3207    {
3208        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3209        __storage_type __b = *__p & __m;
3210        *__p &= ~__m;
3211        *__p |= ~__b & __m;
3212    }
3213}
3214
3215template <class _Allocator>
3216bool
3217vector<bool, _Allocator>::__invariants() const
3218{
3219    if (this->__begin_ == nullptr)
3220    {
3221        if (this->__size_ != 0 || this->__cap() != 0)
3222            return false;
3223    }
3224    else
3225    {
3226        if (this->__cap() == 0)
3227            return false;
3228        if (this->__size_ > this->capacity())
3229            return false;
3230    }
3231    return true;
3232}
3233
3234template <class _Allocator>
3235size_t
3236vector<bool, _Allocator>::__hash_code() const _NOEXCEPT
3237{
3238    size_t __h = 0;
3239    // do middle whole words
3240    size_type __n = __size_;
3241    __storage_pointer __p = __begin_;
3242    for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3243        __h ^= *__p;
3244    // do last partial word
3245    if (__n > 0)
3246    {
3247        const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3248        __h ^= *__p & __m;
3249    }
3250    return __h;
3251}
3252
3253template <class _Allocator>
3254struct _LIBCPP_TYPE_VIS_ONLY hash<vector<bool, _Allocator> >
3255    : public unary_function<vector<bool, _Allocator>, size_t>
3256{
3257    _LIBCPP_INLINE_VISIBILITY
3258    size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT
3259        {return __vec.__hash_code();}
3260};
3261
3262template <class _Tp, class _Allocator>
3263inline _LIBCPP_INLINE_VISIBILITY
3264bool
3265operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3266{
3267    const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
3268    return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
3269}
3270
3271template <class _Tp, class _Allocator>
3272inline _LIBCPP_INLINE_VISIBILITY
3273bool
3274operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3275{
3276    return !(__x == __y);
3277}
3278
3279template <class _Tp, class _Allocator>
3280inline _LIBCPP_INLINE_VISIBILITY
3281bool
3282operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3283{
3284    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
3285}
3286
3287template <class _Tp, class _Allocator>
3288inline _LIBCPP_INLINE_VISIBILITY
3289bool
3290operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3291{
3292    return __y < __x;
3293}
3294
3295template <class _Tp, class _Allocator>
3296inline _LIBCPP_INLINE_VISIBILITY
3297bool
3298operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3299{
3300    return !(__x < __y);
3301}
3302
3303template <class _Tp, class _Allocator>
3304inline _LIBCPP_INLINE_VISIBILITY
3305bool
3306operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
3307{
3308    return !(__y < __x);
3309}
3310
3311template <class _Tp, class _Allocator>
3312inline _LIBCPP_INLINE_VISIBILITY
3313void
3314swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y)
3315    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
3316{
3317    __x.swap(__y);
3318}
3319
3320_LIBCPP_END_NAMESPACE_STD
3321
3322#endif  // _LIBCPP_VECTOR
3323