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