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