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