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