LCOV - code coverage report
Current view: top level - usr/include/c++/12/bits - stl_vector.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 18 18 100.0 %
Date: 2023-07-19 08:18:47 Functions: 2 2 100.0 %

          Line data    Source code
       1             : // Vector implementation -*- C++ -*-
       2             : 
       3             : // Copyright (C) 2001-2022 Free Software Foundation, Inc.
       4             : //
       5             : // This file is part of the GNU ISO C++ Library.  This library is free
       6             : // software; you can redistribute it and/or modify it under the
       7             : // terms of the GNU General Public License as published by the
       8             : // Free Software Foundation; either version 3, or (at your option)
       9             : // any later version.
      10             : 
      11             : // This library is distributed in the hope that it will be useful,
      12             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : // GNU General Public License for more details.
      15             : 
      16             : // Under Section 7 of GPL version 3, you are granted additional
      17             : // permissions described in the GCC Runtime Library Exception, version
      18             : // 3.1, as published by the Free Software Foundation.
      19             : 
      20             : // You should have received a copy of the GNU General Public License and
      21             : // a copy of the GCC Runtime Library Exception along with this program;
      22             : // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      23             : // <http://www.gnu.org/licenses/>.
      24             : 
      25             : /*
      26             :  *
      27             :  * Copyright (c) 1994
      28             :  * Hewlett-Packard Company
      29             :  *
      30             :  * Permission to use, copy, modify, distribute and sell this software
      31             :  * and its documentation for any purpose is hereby granted without fee,
      32             :  * provided that the above copyright notice appear in all copies and
      33             :  * that both that copyright notice and this permission notice appear
      34             :  * in supporting documentation.  Hewlett-Packard Company makes no
      35             :  * representations about the suitability of this software for any
      36             :  * purpose.  It is provided "as is" without express or implied warranty.
      37             :  *
      38             :  *
      39             :  * Copyright (c) 1996
      40             :  * Silicon Graphics Computer Systems, Inc.
      41             :  *
      42             :  * Permission to use, copy, modify, distribute and sell this software
      43             :  * and its documentation for any purpose is hereby granted without fee,
      44             :  * provided that the above copyright notice appear in all copies and
      45             :  * that both that copyright notice and this permission notice appear
      46             :  * in supporting documentation.  Silicon Graphics makes no
      47             :  * representations about the suitability of this  software for any
      48             :  * purpose.  It is provided "as is" without express or implied warranty.
      49             :  */
      50             : 
      51             : /** @file bits/stl_vector.h
      52             :  *  This is an internal header file, included by other library headers.
      53             :  *  Do not attempt to use it directly. @headername{vector}
      54             :  */
      55             : 
      56             : #ifndef _STL_VECTOR_H
      57             : #define _STL_VECTOR_H 1
      58             : 
      59             : #include <bits/stl_iterator_base_funcs.h>
      60             : #include <bits/functexcept.h>
      61             : #include <bits/concept_check.h>
      62             : #if __cplusplus >= 201103L
      63             : #include <initializer_list>
      64             : #endif
      65             : #if __cplusplus >= 202002L
      66             : # include <compare>
      67             : #define __cpp_lib_constexpr_vector 201907L
      68             : #endif
      69             : 
      70             : #include <debug/assertions.h>
      71             : 
      72             : #if _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
      73             : extern "C" void
      74             : __sanitizer_annotate_contiguous_container(const void*, const void*,
      75             :                                           const void*, const void*);
      76             : #endif
      77             : 
      78             : namespace std _GLIBCXX_VISIBILITY(default)
      79             : {
      80             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      81             : _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
      82             : 
      83             :   /// See bits/stl_deque.h's _Deque_base for an explanation.
      84             :   template<typename _Tp, typename _Alloc>
      85             :     struct _Vector_base
      86             :     {
      87             :       typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
      88             :         rebind<_Tp>::other _Tp_alloc_type;
      89             :       typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer
      90             :         pointer;
      91             : 
      92             :       struct _Vector_impl_data
      93             :       {
      94             :         pointer _M_start;
      95             :         pointer _M_finish;
      96             :         pointer _M_end_of_storage;
      97             : 
      98             :         _GLIBCXX20_CONSTEXPR
      99             :         _Vector_impl_data() _GLIBCXX_NOEXCEPT
     100             :         : _M_start(), _M_finish(), _M_end_of_storage()
     101             :         { }
     102             : 
     103             : #if __cplusplus >= 201103L
     104             :         _GLIBCXX20_CONSTEXPR
     105             :         _Vector_impl_data(_Vector_impl_data&& __x) noexcept
     106             :         : _M_start(__x._M_start), _M_finish(__x._M_finish),
     107             :           _M_end_of_storage(__x._M_end_of_storage)
     108             :         { __x._M_start = __x._M_finish = __x._M_end_of_storage = pointer(); }
     109             : #endif
     110             : 
     111             :         _GLIBCXX20_CONSTEXPR
     112             :         void
     113             :         _M_copy_data(_Vector_impl_data const& __x) _GLIBCXX_NOEXCEPT
     114             :         {
     115             :           _M_start = __x._M_start;
     116             :           _M_finish = __x._M_finish;
     117             :           _M_end_of_storage = __x._M_end_of_storage;
     118             :         }
     119             : 
     120             :         _GLIBCXX20_CONSTEXPR
     121             :         void
     122             :         _M_swap_data(_Vector_impl_data& __x) _GLIBCXX_NOEXCEPT
     123             :         {
     124             :           // Do not use std::swap(_M_start, __x._M_start), etc as it loses
     125             :           // information used by TBAA.
     126             :           _Vector_impl_data __tmp;
     127             :           __tmp._M_copy_data(*this);
     128             :           _M_copy_data(__x);
     129             :           __x._M_copy_data(__tmp);
     130             :         }
     131             :       };
     132             : 
     133        5823 :       struct _Vector_impl
     134             :         : public _Tp_alloc_type, public _Vector_impl_data
     135             :       {
     136             :         _GLIBCXX20_CONSTEXPR
     137             :         _Vector_impl() _GLIBCXX_NOEXCEPT_IF(
     138             :             is_nothrow_default_constructible<_Tp_alloc_type>::value)
     139             :         : _Tp_alloc_type()
     140             :         { }
     141             : 
     142             :         _GLIBCXX20_CONSTEXPR
     143             :         _Vector_impl(_Tp_alloc_type const& __a) _GLIBCXX_NOEXCEPT
     144             :         : _Tp_alloc_type(__a)
     145             :         { }
     146             : 
     147             : #if __cplusplus >= 201103L
     148             :         // Not defaulted, to enforce noexcept(true) even when
     149             :         // !is_nothrow_move_constructible<_Tp_alloc_type>.
     150             :         _GLIBCXX20_CONSTEXPR
     151             :         _Vector_impl(_Vector_impl&& __x) noexcept
     152             :         : _Tp_alloc_type(std::move(__x)), _Vector_impl_data(std::move(__x))
     153             :         { }
     154             : 
     155             :         _GLIBCXX20_CONSTEXPR
     156             :         _Vector_impl(_Tp_alloc_type&& __a) noexcept
     157             :         : _Tp_alloc_type(std::move(__a))
     158             :         { }
     159             : 
     160             :         _GLIBCXX20_CONSTEXPR
     161             :         _Vector_impl(_Tp_alloc_type&& __a, _Vector_impl&& __rv) noexcept
     162             :         : _Tp_alloc_type(std::move(__a)), _Vector_impl_data(std::move(__rv))
     163             :         { }
     164             : #endif
     165             : 
     166             : #if _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
     167             :         template<typename = _Tp_alloc_type>
     168             :           struct _Asan
     169             :           {
     170             :             typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
     171             :               ::size_type size_type;
     172             : 
     173             :             static _GLIBCXX20_CONSTEXPR void
     174             :             _S_shrink(_Vector_impl&, size_type) { }
     175             :             static _GLIBCXX20_CONSTEXPR void
     176             :             _S_on_dealloc(_Vector_impl&) { }
     177             : 
     178             :             typedef _Vector_impl& _Reinit;
     179             : 
     180             :             struct _Grow
     181             :             {
     182             :               _GLIBCXX20_CONSTEXPR _Grow(_Vector_impl&, size_type) { }
     183             :               _GLIBCXX20_CONSTEXPR void _M_grew(size_type) { }
     184             :             };
     185             :           };
     186             : 
     187             :         // Enable ASan annotations for memory obtained from std::allocator.
     188             :         template<typename _Up>
     189             :           struct _Asan<allocator<_Up> >
     190             :           {
     191             :             typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>
     192             :               ::size_type size_type;
     193             : 
     194             :             // Adjust ASan annotation for [_M_start, _M_end_of_storage) to
     195             :             // mark end of valid region as __curr instead of __prev.
     196             :             static _GLIBCXX20_CONSTEXPR void
     197             :             _S_adjust(_Vector_impl& __impl, pointer __prev, pointer __curr)
     198             :             {
     199             : #if __cpp_lib_is_constant_evaluated
     200             :               if (std::is_constant_evaluated())
     201             :                 return;
     202             : #endif
     203             :               __sanitizer_annotate_contiguous_container(__impl._M_start,
     204             :                   __impl._M_end_of_storage, __prev, __curr);
     205             :             }
     206             : 
     207             :             static _GLIBCXX20_CONSTEXPR void
     208             :             _S_grow(_Vector_impl& __impl, size_type __n)
     209             :             { _S_adjust(__impl, __impl._M_finish, __impl._M_finish + __n); }
     210             : 
     211             :             static _GLIBCXX20_CONSTEXPR void
     212             :             _S_shrink(_Vector_impl& __impl, size_type __n)
     213             :             { _S_adjust(__impl, __impl._M_finish + __n, __impl._M_finish); }
     214             : 
     215             :             static _GLIBCXX20_CONSTEXPR void
     216             :             _S_on_dealloc(_Vector_impl& __impl)
     217             :             {
     218             :               if (__impl._M_start)
     219             :                 _S_adjust(__impl, __impl._M_finish, __impl._M_end_of_storage);
     220             :             }
     221             : 
     222             :             // Used on reallocation to tell ASan unused capacity is invalid.
     223             :             struct _Reinit
     224             :             {
     225             :               explicit _GLIBCXX20_CONSTEXPR
     226             :               _Reinit(_Vector_impl& __impl) : _M_impl(__impl)
     227             :               {
     228             :                 // Mark unused capacity as valid again before deallocating it.
     229             :                 _S_on_dealloc(_M_impl);
     230             :               }
     231             : 
     232             :               _GLIBCXX20_CONSTEXPR
     233             :               ~_Reinit()
     234             :               {
     235             :                 // Mark unused capacity as invalid after reallocation.
     236             :                 if (_M_impl._M_start)
     237             :                   _S_adjust(_M_impl, _M_impl._M_end_of_storage,
     238             :                             _M_impl._M_finish);
     239             :               }
     240             : 
     241             :               _Vector_impl& _M_impl;
     242             : 
     243             : #if __cplusplus >= 201103L
     244             :               _Reinit(const _Reinit&) = delete;
     245             :               _Reinit& operator=(const _Reinit&) = delete;
     246             : #endif
     247             :             };
     248             : 
     249             :             // Tell ASan when unused capacity is initialized to be valid.
     250             :             struct _Grow
     251             :             {
     252             :               _GLIBCXX20_CONSTEXPR
     253             :               _Grow(_Vector_impl& __impl, size_type __n)
     254             :               : _M_impl(__impl), _M_n(__n)
     255             :               { _S_grow(_M_impl, __n); }
     256             : 
     257             :               _GLIBCXX20_CONSTEXPR
     258             :               ~_Grow() { if (_M_n) _S_shrink(_M_impl, _M_n); }
     259             : 
     260             :               _GLIBCXX20_CONSTEXPR
     261             :               void _M_grew(size_type __n) { _M_n -= __n; }
     262             : 
     263             : #if __cplusplus >= 201103L
     264             :               _Grow(const _Grow&) = delete;
     265             :               _Grow& operator=(const _Grow&) = delete;
     266             : #endif
     267             :             private:
     268             :               _Vector_impl& _M_impl;
     269             :               size_type _M_n;
     270             :             };
     271             :           };
     272             : 
     273             : #define _GLIBCXX_ASAN_ANNOTATE_REINIT \
     274             :   typename _Base::_Vector_impl::template _Asan<>::_Reinit const \
     275             :         __attribute__((__unused__)) __reinit_guard(this->_M_impl)
     276             : #define _GLIBCXX_ASAN_ANNOTATE_GROW(n) \
     277             :   typename _Base::_Vector_impl::template _Asan<>::_Grow \
     278             :         __attribute__((__unused__)) __grow_guard(this->_M_impl, (n))
     279             : #define _GLIBCXX_ASAN_ANNOTATE_GREW(n) __grow_guard._M_grew(n)
     280             : #define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n) \
     281             :   _Base::_Vector_impl::template _Asan<>::_S_shrink(this->_M_impl, n)
     282             : #define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC \
     283             :   _Base::_Vector_impl::template _Asan<>::_S_on_dealloc(this->_M_impl)
     284             : #else // ! (_GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR)
     285             : #define _GLIBCXX_ASAN_ANNOTATE_REINIT
     286             : #define _GLIBCXX_ASAN_ANNOTATE_GROW(n)
     287             : #define _GLIBCXX_ASAN_ANNOTATE_GREW(n)
     288             : #define _GLIBCXX_ASAN_ANNOTATE_SHRINK(n)
     289             : #define _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC
     290             : #endif // _GLIBCXX_SANITIZE_STD_ALLOCATOR && _GLIBCXX_SANITIZE_VECTOR
     291             :       };
     292             : 
     293             :     public:
     294             :       typedef _Alloc allocator_type;
     295             : 
     296             :       _GLIBCXX20_CONSTEXPR
     297             :       _Tp_alloc_type&
     298        5823 :       _M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
     299        5823 :       { return this->_M_impl; }
     300             : 
     301             :       _GLIBCXX20_CONSTEXPR
     302             :       const _Tp_alloc_type&
     303             :       _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
     304             :       { return this->_M_impl; }
     305             : 
     306             :       _GLIBCXX20_CONSTEXPR
     307             :       allocator_type
     308             :       get_allocator() const _GLIBCXX_NOEXCEPT
     309             :       { return allocator_type(_M_get_Tp_allocator()); }
     310             : 
     311             : #if __cplusplus >= 201103L
     312             :       _Vector_base() = default;
     313             : #else
     314             :       _Vector_base() { }
     315             : #endif
     316             : 
     317             :       _GLIBCXX20_CONSTEXPR
     318             :       _Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT
     319             :       : _M_impl(__a) { }
     320             : 
     321             :       // Kept for ABI compatibility.
     322             : #if !_GLIBCXX_INLINE_VERSION
     323             :       _GLIBCXX20_CONSTEXPR
     324             :       _Vector_base(size_t __n)
     325             :       : _M_impl()
     326             :       { _M_create_storage(__n); }
     327             : #endif
     328             : 
     329             :       _GLIBCXX20_CONSTEXPR
     330             :       _Vector_base(size_t __n, const allocator_type& __a)
     331             :       : _M_impl(__a)
     332             :       { _M_create_storage(__n); }
     333             : 
     334             : #if __cplusplus >= 201103L
     335             :       _Vector_base(_Vector_base&&) = default;
     336             : 
     337             :       // Kept for ABI compatibility.
     338             : # if !_GLIBCXX_INLINE_VERSION
     339             :       _GLIBCXX20_CONSTEXPR
     340             :       _Vector_base(_Tp_alloc_type&& __a) noexcept
     341             :       : _M_impl(std::move(__a)) { }
     342             : 
     343             :       _GLIBCXX20_CONSTEXPR
     344             :       _Vector_base(_Vector_base&& __x, const allocator_type& __a)
     345             :       : _M_impl(__a)
     346             :       {
     347             :         if (__x.get_allocator() == __a)
     348             :           this->_M_impl._M_swap_data(__x._M_impl);
     349             :         else
     350             :           {
     351             :             size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
     352             :             _M_create_storage(__n);
     353             :           }
     354             :       }
     355             : # endif
     356             : 
     357             :       _GLIBCXX20_CONSTEXPR
     358             :       _Vector_base(const allocator_type& __a, _Vector_base&& __x)
     359             :       : _M_impl(_Tp_alloc_type(__a), std::move(__x._M_impl))
     360             :       { }
     361             : #endif
     362             : 
     363             :       _GLIBCXX20_CONSTEXPR
     364        5823 :       ~_Vector_base() _GLIBCXX_NOEXCEPT
     365             :       {
     366       11646 :         _M_deallocate(_M_impl._M_start,
     367        5823 :                       _M_impl._M_end_of_storage - _M_impl._M_start);
     368        5823 :       }
     369             : 
     370             :     public:
     371             :       _Vector_impl _M_impl;
     372             : 
     373             :       _GLIBCXX20_CONSTEXPR
     374             :       pointer
     375             :       _M_allocate(size_t __n)
     376             :       {
     377             :         typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
     378             :         return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
     379             :       }
     380             : 
     381             :       _GLIBCXX20_CONSTEXPR
     382             :       void
     383        5823 :       _M_deallocate(pointer __p, size_t __n)
     384             :       {
     385             :         typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
     386        5823 :         if (__p)
     387        5823 :           _Tr::deallocate(_M_impl, __p, __n);
     388             :       }
     389             : 
     390             :     protected:
     391             :       _GLIBCXX20_CONSTEXPR
     392             :       void
     393             :       _M_create_storage(size_t __n)
     394             :       {
     395             :         this->_M_impl._M_start = this->_M_allocate(__n);
     396             :         this->_M_impl._M_finish = this->_M_impl._M_start;
     397             :         this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
     398             :       }
     399             :     };
     400             : 
     401             :   /**
     402             :    *  @brief A standard container which offers fixed time access to
     403             :    *  individual elements in any order.
     404             :    *
     405             :    *  @ingroup sequences
     406             :    *
     407             :    *  @tparam _Tp  Type of element.
     408             :    *  @tparam _Alloc  Allocator type, defaults to allocator<_Tp>.
     409             :    *
     410             :    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
     411             :    *  <a href="tables.html#66">reversible container</a>, and a
     412             :    *  <a href="tables.html#67">sequence</a>, including the
     413             :    *  <a href="tables.html#68">optional sequence requirements</a> with the
     414             :    *  %exception of @c push_front and @c pop_front.
     415             :    *
     416             :    *  In some terminology a %vector can be described as a dynamic
     417             :    *  C-style array, it offers fast and efficient access to individual
     418             :    *  elements in any order and saves the user from worrying about
     419             :    *  memory and size allocation.  Subscripting ( @c [] ) access is
     420             :    *  also provided as with C-style arrays.
     421             :   */
     422             :   template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
     423             :     class vector : protected _Vector_base<_Tp, _Alloc>
     424             :     {
     425             : #ifdef _GLIBCXX_CONCEPT_CHECKS
     426             :       // Concept requirements.
     427             :       typedef typename _Alloc::value_type               _Alloc_value_type;
     428             : # if __cplusplus < 201103L
     429             :       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
     430             : # endif
     431             :       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
     432             : #endif
     433             : 
     434             : #if __cplusplus >= 201103L
     435             :       static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
     436             :           "std::vector must have a non-const, non-volatile value_type");
     437             : # if __cplusplus > 201703L || defined __STRICT_ANSI__
     438             :       static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
     439             :           "std::vector must have the same value_type as its allocator");
     440             : # endif
     441             : #endif
     442             : 
     443             :       typedef _Vector_base<_Tp, _Alloc>                   _Base;
     444             :       typedef typename _Base::_Tp_alloc_type            _Tp_alloc_type;
     445             :       typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type>   _Alloc_traits;
     446             : 
     447             :     public:
     448             :       typedef _Tp                                       value_type;
     449             :       typedef typename _Base::pointer                   pointer;
     450             :       typedef typename _Alloc_traits::const_pointer     const_pointer;
     451             :       typedef typename _Alloc_traits::reference         reference;
     452             :       typedef typename _Alloc_traits::const_reference   const_reference;
     453             :       typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
     454             :       typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
     455             :       const_iterator;
     456             :       typedef std::reverse_iterator<const_iterator>       const_reverse_iterator;
     457             :       typedef std::reverse_iterator<iterator>             reverse_iterator;
     458             :       typedef size_t                                    size_type;
     459             :       typedef ptrdiff_t                                 difference_type;
     460             :       typedef _Alloc                                    allocator_type;
     461             : 
     462             :     private:
     463             : #if __cplusplus >= 201103L
     464             :       static constexpr bool
     465             :       _S_nothrow_relocate(true_type)
     466             :       {
     467             :         return noexcept(std::__relocate_a(std::declval<pointer>(),
     468             :                                           std::declval<pointer>(),
     469             :                                           std::declval<pointer>(),
     470             :                                           std::declval<_Tp_alloc_type&>()));
     471             :       }
     472             : 
     473             :       static constexpr bool
     474             :       _S_nothrow_relocate(false_type)
     475             :       { return false; }
     476             : 
     477             :       static constexpr bool
     478             :       _S_use_relocate()
     479             :       {
     480             :         // Instantiating std::__relocate_a might cause an error outside the
     481             :         // immediate context (in __relocate_object_a's noexcept-specifier),
     482             :         // so only do it if we know the type can be move-inserted into *this.
     483             :         return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
     484             :       }
     485             : 
     486             :       static pointer
     487             :       _S_do_relocate(pointer __first, pointer __last, pointer __result,
     488             :                      _Tp_alloc_type& __alloc, true_type) noexcept
     489             :       {
     490             :         return std::__relocate_a(__first, __last, __result, __alloc);
     491             :       }
     492             : 
     493             :       static pointer
     494             :       _S_do_relocate(pointer, pointer, pointer __result,
     495             :                      _Tp_alloc_type&, false_type) noexcept
     496             :       { return __result; }
     497             : 
     498             :       static _GLIBCXX20_CONSTEXPR pointer
     499             :       _S_relocate(pointer __first, pointer __last, pointer __result,
     500             :                   _Tp_alloc_type& __alloc) noexcept
     501             :       {
     502             : #if __cpp_if_constexpr
     503             :         // All callers have already checked _S_use_relocate() so just do it.
     504             :         return std::__relocate_a(__first, __last, __result, __alloc);
     505             : #else
     506             :         using __do_it = __bool_constant<_S_use_relocate()>;
     507             :         return _S_do_relocate(__first, __last, __result, __alloc, __do_it{});
     508             : #endif
     509             :       }
     510             : #endif // C++11
     511             : 
     512             :     protected:
     513             :       using _Base::_M_allocate;
     514             :       using _Base::_M_deallocate;
     515             :       using _Base::_M_impl;
     516             :       using _Base::_M_get_Tp_allocator;
     517             : 
     518             :     public:
     519             :       // [23.2.4.1] construct/copy/destroy
     520             :       // (assign() and get_allocator() are also listed in this section)
     521             : 
     522             :       /**
     523             :        *  @brief  Creates a %vector with no elements.
     524             :        */
     525             : #if __cplusplus >= 201103L
     526             :       vector() = default;
     527             : #else
     528             :       vector() { }
     529             : #endif
     530             : 
     531             :       /**
     532             :        *  @brief  Creates a %vector with no elements.
     533             :        *  @param  __a  An allocator object.
     534             :        */
     535             :       explicit
     536             :       _GLIBCXX20_CONSTEXPR
     537             :       vector(const allocator_type& __a) _GLIBCXX_NOEXCEPT
     538             :       : _Base(__a) { }
     539             : 
     540             : #if __cplusplus >= 201103L
     541             :       /**
     542             :        *  @brief  Creates a %vector with default constructed elements.
     543             :        *  @param  __n  The number of elements to initially create.
     544             :        *  @param  __a  An allocator.
     545             :        *
     546             :        *  This constructor fills the %vector with @a __n default
     547             :        *  constructed elements.
     548             :        */
     549             :       explicit
     550             :       _GLIBCXX20_CONSTEXPR
     551             :       vector(size_type __n, const allocator_type& __a = allocator_type())
     552             :       : _Base(_S_check_init_len(__n, __a), __a)
     553             :       { _M_default_initialize(__n); }
     554             : 
     555             :       /**
     556             :        *  @brief  Creates a %vector with copies of an exemplar element.
     557             :        *  @param  __n  The number of elements to initially create.
     558             :        *  @param  __value  An element to copy.
     559             :        *  @param  __a  An allocator.
     560             :        *
     561             :        *  This constructor fills the %vector with @a __n copies of @a __value.
     562             :        */
     563             :       _GLIBCXX20_CONSTEXPR
     564             :       vector(size_type __n, const value_type& __value,
     565             :              const allocator_type& __a = allocator_type())
     566             :       : _Base(_S_check_init_len(__n, __a), __a)
     567             :       { _M_fill_initialize(__n, __value); }
     568             : #else
     569             :       /**
     570             :        *  @brief  Creates a %vector with copies of an exemplar element.
     571             :        *  @param  __n  The number of elements to initially create.
     572             :        *  @param  __value  An element to copy.
     573             :        *  @param  __a  An allocator.
     574             :        *
     575             :        *  This constructor fills the %vector with @a __n copies of @a __value.
     576             :        */
     577             :       explicit
     578             :       vector(size_type __n, const value_type& __value = value_type(),
     579             :              const allocator_type& __a = allocator_type())
     580             :       : _Base(_S_check_init_len(__n, __a), __a)
     581             :       { _M_fill_initialize(__n, __value); }
     582             : #endif
     583             : 
     584             :       /**
     585             :        *  @brief  %Vector copy constructor.
     586             :        *  @param  __x  A %vector of identical element and allocator types.
     587             :        *
     588             :        *  All the elements of @a __x are copied, but any unused capacity in
     589             :        *  @a __x  will not be copied
     590             :        *  (i.e. capacity() == size() in the new %vector).
     591             :        *
     592             :        *  The newly-created %vector uses a copy of the allocator object used
     593             :        *  by @a __x (unless the allocator traits dictate a different object).
     594             :        */
     595             :       _GLIBCXX20_CONSTEXPR
     596             :       vector(const vector& __x)
     597             :       : _Base(__x.size(),
     598             :         _Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
     599             :       {
     600             :         this->_M_impl._M_finish =
     601             :           std::__uninitialized_copy_a(__x.begin(), __x.end(),
     602             :                                       this->_M_impl._M_start,
     603             :                                       _M_get_Tp_allocator());
     604             :       }
     605             : 
     606             : #if __cplusplus >= 201103L
     607             :       /**
     608             :        *  @brief  %Vector move constructor.
     609             :        *
     610             :        *  The newly-created %vector contains the exact contents of the
     611             :        *  moved instance.
     612             :        *  The contents of the moved instance are a valid, but unspecified
     613             :        *  %vector.
     614             :        */
     615             :       vector(vector&&) noexcept = default;
     616             : 
     617             :       /// Copy constructor with alternative allocator
     618             :       _GLIBCXX20_CONSTEXPR
     619             :       vector(const vector& __x, const __type_identity_t<allocator_type>& __a)
     620             :       : _Base(__x.size(), __a)
     621             :       {
     622             :         this->_M_impl._M_finish =
     623             :           std::__uninitialized_copy_a(__x.begin(), __x.end(),
     624             :                                       this->_M_impl._M_start,
     625             :                                       _M_get_Tp_allocator());
     626             :       }
     627             : 
     628             :     private:
     629             :       _GLIBCXX20_CONSTEXPR
     630             :       vector(vector&& __rv, const allocator_type& __m, true_type) noexcept
     631             :       : _Base(__m, std::move(__rv))
     632             :       { }
     633             : 
     634             :       _GLIBCXX20_CONSTEXPR
     635             :       vector(vector&& __rv, const allocator_type& __m, false_type)
     636             :       : _Base(__m)
     637             :       {
     638             :         if (__rv.get_allocator() == __m)
     639             :           this->_M_impl._M_swap_data(__rv._M_impl);
     640             :         else if (!__rv.empty())
     641             :           {
     642             :             this->_M_create_storage(__rv.size());
     643             :             this->_M_impl._M_finish =
     644             :               std::__uninitialized_move_a(__rv.begin(), __rv.end(),
     645             :                                           this->_M_impl._M_start,
     646             :                                           _M_get_Tp_allocator());
     647             :             __rv.clear();
     648             :           }
     649             :       }
     650             : 
     651             :     public:
     652             :       /// Move constructor with alternative allocator
     653             :       _GLIBCXX20_CONSTEXPR
     654             :       vector(vector&& __rv, const __type_identity_t<allocator_type>& __m)
     655             :       noexcept( noexcept(
     656             :         vector(std::declval<vector&&>(), std::declval<const allocator_type&>(),
     657             :                std::declval<typename _Alloc_traits::is_always_equal>())) )
     658             :       : vector(std::move(__rv), __m, typename _Alloc_traits::is_always_equal{})
     659             :       { }
     660             : 
     661             :       /**
     662             :        *  @brief  Builds a %vector from an initializer list.
     663             :        *  @param  __l  An initializer_list.
     664             :        *  @param  __a  An allocator.
     665             :        *
     666             :        *  Create a %vector consisting of copies of the elements in the
     667             :        *  initializer_list @a __l.
     668             :        *
     669             :        *  This will call the element type's copy constructor N times
     670             :        *  (where N is @a __l.size()) and do no memory reallocation.
     671             :        */
     672             :       _GLIBCXX20_CONSTEXPR
     673             :       vector(initializer_list<value_type> __l,
     674             :              const allocator_type& __a = allocator_type())
     675             :       : _Base(__a)
     676             :       {
     677             :         _M_range_initialize(__l.begin(), __l.end(),
     678             :                             random_access_iterator_tag());
     679             :       }
     680             : #endif
     681             : 
     682             :       /**
     683             :        *  @brief  Builds a %vector from a range.
     684             :        *  @param  __first  An input iterator.
     685             :        *  @param  __last  An input iterator.
     686             :        *  @param  __a  An allocator.
     687             :        *
     688             :        *  Create a %vector consisting of copies of the elements from
     689             :        *  [first,last).
     690             :        *
     691             :        *  If the iterators are forward, bidirectional, or
     692             :        *  random-access, then this will call the elements' copy
     693             :        *  constructor N times (where N is distance(first,last)) and do
     694             :        *  no memory reallocation.  But if only input iterators are
     695             :        *  used, then this will do at most 2N calls to the copy
     696             :        *  constructor, and logN memory reallocations.
     697             :        */
     698             : #if __cplusplus >= 201103L
     699             :       template<typename _InputIterator,
     700             :                typename = std::_RequireInputIter<_InputIterator>>
     701             :         _GLIBCXX20_CONSTEXPR
     702             :         vector(_InputIterator __first, _InputIterator __last,
     703             :                const allocator_type& __a = allocator_type())
     704             :         : _Base(__a)
     705             :         {
     706             :           _M_range_initialize(__first, __last,
     707             :                               std::__iterator_category(__first));
     708             :         }
     709             : #else
     710             :       template<typename _InputIterator>
     711             :         vector(_InputIterator __first, _InputIterator __last,
     712             :                const allocator_type& __a = allocator_type())
     713             :         : _Base(__a)
     714             :         {
     715             :           // Check whether it's an integral type.  If so, it's not an iterator.
     716             :           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
     717             :           _M_initialize_dispatch(__first, __last, _Integral());
     718             :         }
     719             : #endif
     720             : 
     721             :       /**
     722             :        *  The dtor only erases the elements, and note that if the
     723             :        *  elements themselves are pointers, the pointed-to memory is
     724             :        *  not touched in any way.  Managing the pointer is the user's
     725             :        *  responsibility.
     726             :        */
     727             :       _GLIBCXX20_CONSTEXPR
     728        5823 :       ~vector() _GLIBCXX_NOEXCEPT
     729             :       {
     730       11646 :         std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
     731        5823 :                       _M_get_Tp_allocator());
     732             :         _GLIBCXX_ASAN_ANNOTATE_BEFORE_DEALLOC;
     733        5823 :       }
     734             : 
     735             :       /**
     736             :        *  @brief  %Vector assignment operator.
     737             :        *  @param  __x  A %vector of identical element and allocator types.
     738             :        *
     739             :        *  All the elements of @a __x are copied, but any unused capacity in
     740             :        *  @a __x will not be copied.
     741             :        *
     742             :        *  Whether the allocator is copied depends on the allocator traits.
     743             :        */
     744             :       _GLIBCXX20_CONSTEXPR
     745             :       vector&
     746             :       operator=(const vector& __x);
     747             : 
     748             : #if __cplusplus >= 201103L
     749             :       /**
     750             :        *  @brief  %Vector move assignment operator.
     751             :        *  @param  __x  A %vector of identical element and allocator types.
     752             :        *
     753             :        *  The contents of @a __x are moved into this %vector (without copying,
     754             :        *  if the allocators permit it).
     755             :        *  Afterwards @a __x is a valid, but unspecified %vector.
     756             :        *
     757             :        *  Whether the allocator is moved depends on the allocator traits.
     758             :        */
     759             :       _GLIBCXX20_CONSTEXPR
     760             :       vector&
     761             :       operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
     762             :       {
     763             :         constexpr bool __move_storage =
     764             :           _Alloc_traits::_S_propagate_on_move_assign()
     765             :           || _Alloc_traits::_S_always_equal();
     766             :         _M_move_assign(std::move(__x), __bool_constant<__move_storage>());
     767             :         return *this;
     768             :       }
     769             : 
     770             :       /**
     771             :        *  @brief  %Vector list assignment operator.
     772             :        *  @param  __l  An initializer_list.
     773             :        *
     774             :        *  This function fills a %vector with copies of the elements in the
     775             :        *  initializer list @a __l.
     776             :        *
     777             :        *  Note that the assignment completely changes the %vector and
     778             :        *  that the resulting %vector's size is the same as the number
     779             :        *  of elements assigned.
     780             :        */
     781             :       _GLIBCXX20_CONSTEXPR
     782             :       vector&
     783             :       operator=(initializer_list<value_type> __l)
     784             :       {
     785             :         this->_M_assign_aux(__l.begin(), __l.end(),
     786             :                             random_access_iterator_tag());
     787             :         return *this;
     788             :       }
     789             : #endif
     790             : 
     791             :       /**
     792             :        *  @brief  Assigns a given value to a %vector.
     793             :        *  @param  __n  Number of elements to be assigned.
     794             :        *  @param  __val  Value to be assigned.
     795             :        *
     796             :        *  This function fills a %vector with @a __n copies of the given
     797             :        *  value.  Note that the assignment completely changes the
     798             :        *  %vector and that the resulting %vector's size is the same as
     799             :        *  the number of elements assigned.
     800             :        */
     801             :       _GLIBCXX20_CONSTEXPR
     802             :       void
     803             :       assign(size_type __n, const value_type& __val)
     804             :       { _M_fill_assign(__n, __val); }
     805             : 
     806             :       /**
     807             :        *  @brief  Assigns a range to a %vector.
     808             :        *  @param  __first  An input iterator.
     809             :        *  @param  __last   An input iterator.
     810             :        *
     811             :        *  This function fills a %vector with copies of the elements in the
     812             :        *  range [__first,__last).
     813             :        *
     814             :        *  Note that the assignment completely changes the %vector and
     815             :        *  that the resulting %vector's size is the same as the number
     816             :        *  of elements assigned.
     817             :        */
     818             : #if __cplusplus >= 201103L
     819             :       template<typename _InputIterator,
     820             :                typename = std::_RequireInputIter<_InputIterator>>
     821             :         _GLIBCXX20_CONSTEXPR
     822             :         void
     823             :         assign(_InputIterator __first, _InputIterator __last)
     824             :         { _M_assign_dispatch(__first, __last, __false_type()); }
     825             : #else
     826             :       template<typename _InputIterator>
     827             :         void
     828             :         assign(_InputIterator __first, _InputIterator __last)
     829             :         {
     830             :           // Check whether it's an integral type.  If so, it's not an iterator.
     831             :           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
     832             :           _M_assign_dispatch(__first, __last, _Integral());
     833             :         }
     834             : #endif
     835             : 
     836             : #if __cplusplus >= 201103L
     837             :       /**
     838             :        *  @brief  Assigns an initializer list to a %vector.
     839             :        *  @param  __l  An initializer_list.
     840             :        *
     841             :        *  This function fills a %vector with copies of the elements in the
     842             :        *  initializer list @a __l.
     843             :        *
     844             :        *  Note that the assignment completely changes the %vector and
     845             :        *  that the resulting %vector's size is the same as the number
     846             :        *  of elements assigned.
     847             :        */
     848             :       _GLIBCXX20_CONSTEXPR
     849             :       void
     850             :       assign(initializer_list<value_type> __l)
     851             :       {
     852             :         this->_M_assign_aux(__l.begin(), __l.end(),
     853             :                             random_access_iterator_tag());
     854             :       }
     855             : #endif
     856             : 
     857             :       /// Get a copy of the memory allocation object.
     858             :       using _Base::get_allocator;
     859             : 
     860             :       // iterators
     861             :       /**
     862             :        *  Returns a read/write iterator that points to the first
     863             :        *  element in the %vector.  Iteration is done in ordinary
     864             :        *  element order.
     865             :        */
     866             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     867             :       iterator
     868        2941 :       begin() _GLIBCXX_NOEXCEPT
     869        2941 :       { return iterator(this->_M_impl._M_start); }
     870             : 
     871             :       /**
     872             :        *  Returns a read-only (constant) iterator that points to the
     873             :        *  first element in the %vector.  Iteration is done in ordinary
     874             :        *  element order.
     875             :        */
     876             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     877             :       const_iterator
     878             :       begin() const _GLIBCXX_NOEXCEPT
     879             :       { return const_iterator(this->_M_impl._M_start); }
     880             : 
     881             :       /**
     882             :        *  Returns a read/write iterator that points one past the last
     883             :        *  element in the %vector.  Iteration is done in ordinary
     884             :        *  element order.
     885             :        */
     886             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     887             :       iterator
     888             :       end() _GLIBCXX_NOEXCEPT
     889             :       { return iterator(this->_M_impl._M_finish); }
     890             : 
     891             :       /**
     892             :        *  Returns a read-only (constant) iterator that points one past
     893             :        *  the last element in the %vector.  Iteration is done in
     894             :        *  ordinary element order.
     895             :        */
     896             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     897             :       const_iterator
     898             :       end() const _GLIBCXX_NOEXCEPT
     899             :       { return const_iterator(this->_M_impl._M_finish); }
     900             : 
     901             :       /**
     902             :        *  Returns a read/write reverse iterator that points to the
     903             :        *  last element in the %vector.  Iteration is done in reverse
     904             :        *  element order.
     905             :        */
     906             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     907             :       reverse_iterator
     908             :       rbegin() _GLIBCXX_NOEXCEPT
     909             :       { return reverse_iterator(end()); }
     910             : 
     911             :       /**
     912             :        *  Returns a read-only (constant) reverse iterator that points
     913             :        *  to the last element in the %vector.  Iteration is done in
     914             :        *  reverse element order.
     915             :        */
     916             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     917             :       const_reverse_iterator
     918             :       rbegin() const _GLIBCXX_NOEXCEPT
     919             :       { return const_reverse_iterator(end()); }
     920             : 
     921             :       /**
     922             :        *  Returns a read/write reverse iterator that points to one
     923             :        *  before the first element in the %vector.  Iteration is done
     924             :        *  in reverse element order.
     925             :        */
     926             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     927             :       reverse_iterator
     928             :       rend() _GLIBCXX_NOEXCEPT
     929             :       { return reverse_iterator(begin()); }
     930             : 
     931             :       /**
     932             :        *  Returns a read-only (constant) reverse iterator that points
     933             :        *  to one before the first element in the %vector.  Iteration
     934             :        *  is done in reverse element order.
     935             :        */
     936             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     937             :       const_reverse_iterator
     938             :       rend() const _GLIBCXX_NOEXCEPT
     939             :       { return const_reverse_iterator(begin()); }
     940             : 
     941             : #if __cplusplus >= 201103L
     942             :       /**
     943             :        *  Returns a read-only (constant) iterator that points to the
     944             :        *  first element in the %vector.  Iteration is done in ordinary
     945             :        *  element order.
     946             :        */
     947             :       [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
     948             :       const_iterator
     949             :       cbegin() const noexcept
     950             :       { return const_iterator(this->_M_impl._M_start); }
     951             : 
     952             :       /**
     953             :        *  Returns a read-only (constant) iterator that points one past
     954             :        *  the last element in the %vector.  Iteration is done in
     955             :        *  ordinary element order.
     956             :        */
     957             :       [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
     958             :       const_iterator
     959             :       cend() const noexcept
     960             :       { return const_iterator(this->_M_impl._M_finish); }
     961             : 
     962             :       /**
     963             :        *  Returns a read-only (constant) reverse iterator that points
     964             :        *  to the last element in the %vector.  Iteration is done in
     965             :        *  reverse element order.
     966             :        */
     967             :       [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
     968             :       const_reverse_iterator
     969             :       crbegin() const noexcept
     970             :       { return const_reverse_iterator(end()); }
     971             : 
     972             :       /**
     973             :        *  Returns a read-only (constant) reverse iterator that points
     974             :        *  to one before the first element in the %vector.  Iteration
     975             :        *  is done in reverse element order.
     976             :        */
     977             :       [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
     978             :       const_reverse_iterator
     979             :       crend() const noexcept
     980             :       { return const_reverse_iterator(begin()); }
     981             : #endif
     982             : 
     983             :       // [23.2.4.2] capacity
     984             :       /**  Returns the number of elements in the %vector.  */
     985             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     986             :       size_type
     987             :       size() const _GLIBCXX_NOEXCEPT
     988             :       { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
     989             : 
     990             :       /**  Returns the size() of the largest possible %vector.  */
     991             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
     992             :       size_type
     993             :       max_size() const _GLIBCXX_NOEXCEPT
     994             :       { return _S_max_size(_M_get_Tp_allocator()); }
     995             : 
     996             : #if __cplusplus >= 201103L
     997             :       /**
     998             :        *  @brief  Resizes the %vector to the specified number of elements.
     999             :        *  @param  __new_size  Number of elements the %vector should contain.
    1000             :        *
    1001             :        *  This function will %resize the %vector to the specified
    1002             :        *  number of elements.  If the number is smaller than the
    1003             :        *  %vector's current size the %vector is truncated, otherwise
    1004             :        *  default constructed elements are appended.
    1005             :        */
    1006             :       _GLIBCXX20_CONSTEXPR
    1007             :       void
    1008             :       resize(size_type __new_size)
    1009             :       {
    1010             :         if (__new_size > size())
    1011             :           _M_default_append(__new_size - size());
    1012             :         else if (__new_size < size())
    1013             :           _M_erase_at_end(this->_M_impl._M_start + __new_size);
    1014             :       }
    1015             : 
    1016             :       /**
    1017             :        *  @brief  Resizes the %vector to the specified number of elements.
    1018             :        *  @param  __new_size  Number of elements the %vector should contain.
    1019             :        *  @param  __x  Data with which new elements should be populated.
    1020             :        *
    1021             :        *  This function will %resize the %vector to the specified
    1022             :        *  number of elements.  If the number is smaller than the
    1023             :        *  %vector's current size the %vector is truncated, otherwise
    1024             :        *  the %vector is extended and new elements are populated with
    1025             :        *  given data.
    1026             :        */
    1027             :       _GLIBCXX20_CONSTEXPR
    1028             :       void
    1029             :       resize(size_type __new_size, const value_type& __x)
    1030             :       {
    1031             :         if (__new_size > size())
    1032             :           _M_fill_insert(end(), __new_size - size(), __x);
    1033             :         else if (__new_size < size())
    1034             :           _M_erase_at_end(this->_M_impl._M_start + __new_size);
    1035             :       }
    1036             : #else
    1037             :       /**
    1038             :        *  @brief  Resizes the %vector to the specified number of elements.
    1039             :        *  @param  __new_size  Number of elements the %vector should contain.
    1040             :        *  @param  __x  Data with which new elements should be populated.
    1041             :        *
    1042             :        *  This function will %resize the %vector to the specified
    1043             :        *  number of elements.  If the number is smaller than the
    1044             :        *  %vector's current size the %vector is truncated, otherwise
    1045             :        *  the %vector is extended and new elements are populated with
    1046             :        *  given data.
    1047             :        */
    1048             :       _GLIBCXX20_CONSTEXPR
    1049             :       void
    1050             :       resize(size_type __new_size, value_type __x = value_type())
    1051             :       {
    1052             :         if (__new_size > size())
    1053             :           _M_fill_insert(end(), __new_size - size(), __x);
    1054             :         else if (__new_size < size())
    1055             :           _M_erase_at_end(this->_M_impl._M_start + __new_size);
    1056             :       }
    1057             : #endif
    1058             : 
    1059             : #if __cplusplus >= 201103L
    1060             :       /**  A non-binding request to reduce capacity() to size().  */
    1061             :       _GLIBCXX20_CONSTEXPR
    1062             :       void
    1063             :       shrink_to_fit()
    1064             :       { _M_shrink_to_fit(); }
    1065             : #endif
    1066             : 
    1067             :       /**
    1068             :        *  Returns the total number of elements that the %vector can
    1069             :        *  hold before needing to allocate more memory.
    1070             :        */
    1071             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1072             :       size_type
    1073             :       capacity() const _GLIBCXX_NOEXCEPT
    1074             :       { return size_type(this->_M_impl._M_end_of_storage
    1075             :                          - this->_M_impl._M_start); }
    1076             : 
    1077             :       /**
    1078             :        *  Returns true if the %vector is empty.  (Thus begin() would
    1079             :        *  equal end().)
    1080             :        */
    1081             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1082             :       bool
    1083             :       empty() const _GLIBCXX_NOEXCEPT
    1084             :       { return begin() == end(); }
    1085             : 
    1086             :       /**
    1087             :        *  @brief  Attempt to preallocate enough memory for specified number of
    1088             :        *          elements.
    1089             :        *  @param  __n  Number of elements required.
    1090             :        *  @throw  std::length_error  If @a n exceeds @c max_size().
    1091             :        *
    1092             :        *  This function attempts to reserve enough memory for the
    1093             :        *  %vector to hold the specified number of elements.  If the
    1094             :        *  number requested is more than max_size(), length_error is
    1095             :        *  thrown.
    1096             :        *
    1097             :        *  The advantage of this function is that if optimal code is a
    1098             :        *  necessity and the user can determine the number of elements
    1099             :        *  that will be required, the user can reserve the memory in
    1100             :        *  %advance, and thus prevent a possible reallocation of memory
    1101             :        *  and copying of %vector data.
    1102             :        */
    1103             :       _GLIBCXX20_CONSTEXPR
    1104             :       void
    1105             :       reserve(size_type __n);
    1106             : 
    1107             :       // element access
    1108             :       /**
    1109             :        *  @brief  Subscript access to the data contained in the %vector.
    1110             :        *  @param __n The index of the element for which data should be
    1111             :        *  accessed.
    1112             :        *  @return  Read/write reference to data.
    1113             :        *
    1114             :        *  This operator allows for easy, array-style, data access.
    1115             :        *  Note that data access with this operator is unchecked and
    1116             :        *  out_of_range lookups are not defined. (For checked lookups
    1117             :        *  see at().)
    1118             :        */
    1119             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1120             :       reference
    1121        5764 :       operator[](size_type __n) _GLIBCXX_NOEXCEPT
    1122             :       {
    1123             :         __glibcxx_requires_subscript(__n);
    1124        5764 :         return *(this->_M_impl._M_start + __n);
    1125             :       }
    1126             : 
    1127             :       /**
    1128             :        *  @brief  Subscript access to the data contained in the %vector.
    1129             :        *  @param __n The index of the element for which data should be
    1130             :        *  accessed.
    1131             :        *  @return  Read-only (constant) reference to data.
    1132             :        *
    1133             :        *  This operator allows for easy, array-style, data access.
    1134             :        *  Note that data access with this operator is unchecked and
    1135             :        *  out_of_range lookups are not defined. (For checked lookups
    1136             :        *  see at().)
    1137             :        */
    1138             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1139             :       const_reference
    1140             :       operator[](size_type __n) const _GLIBCXX_NOEXCEPT
    1141             :       {
    1142             :         __glibcxx_requires_subscript(__n);
    1143             :         return *(this->_M_impl._M_start + __n);
    1144             :       }
    1145             : 
    1146             :     protected:
    1147             :       /// Safety check used only from at().
    1148             :       _GLIBCXX20_CONSTEXPR
    1149             :       void
    1150             :       _M_range_check(size_type __n) const
    1151             :       {
    1152             :         if (__n >= this->size())
    1153             :           __throw_out_of_range_fmt(__N("vector::_M_range_check: __n "
    1154             :                                        "(which is %zu) >= this->size() "
    1155             :                                        "(which is %zu)"),
    1156             :                                    __n, this->size());
    1157             :       }
    1158             : 
    1159             :     public:
    1160             :       /**
    1161             :        *  @brief  Provides access to the data contained in the %vector.
    1162             :        *  @param __n The index of the element for which data should be
    1163             :        *  accessed.
    1164             :        *  @return  Read/write reference to data.
    1165             :        *  @throw  std::out_of_range  If @a __n is an invalid index.
    1166             :        *
    1167             :        *  This function provides for safer data access.  The parameter
    1168             :        *  is first checked that it is in the range of the vector.  The
    1169             :        *  function throws out_of_range if the check fails.
    1170             :        */
    1171             :       _GLIBCXX20_CONSTEXPR
    1172             :       reference
    1173             :       at(size_type __n)
    1174             :       {
    1175             :         _M_range_check(__n);
    1176             :         return (*this)[__n];
    1177             :       }
    1178             : 
    1179             :       /**
    1180             :        *  @brief  Provides access to the data contained in the %vector.
    1181             :        *  @param __n The index of the element for which data should be
    1182             :        *  accessed.
    1183             :        *  @return  Read-only (constant) reference to data.
    1184             :        *  @throw  std::out_of_range  If @a __n is an invalid index.
    1185             :        *
    1186             :        *  This function provides for safer data access.  The parameter
    1187             :        *  is first checked that it is in the range of the vector.  The
    1188             :        *  function throws out_of_range if the check fails.
    1189             :        */
    1190             :       _GLIBCXX20_CONSTEXPR
    1191             :       const_reference
    1192             :       at(size_type __n) const
    1193             :       {
    1194             :         _M_range_check(__n);
    1195             :         return (*this)[__n];
    1196             :       }
    1197             : 
    1198             :       /**
    1199             :        *  Returns a read/write reference to the data at the first
    1200             :        *  element of the %vector.
    1201             :        */
    1202             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1203             :       reference
    1204             :       front() _GLIBCXX_NOEXCEPT
    1205             :       {
    1206             :         __glibcxx_requires_nonempty();
    1207             :         return *begin();
    1208             :       }
    1209             : 
    1210             :       /**
    1211             :        *  Returns a read-only (constant) reference to the data at the first
    1212             :        *  element of the %vector.
    1213             :        */
    1214             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1215             :       const_reference
    1216             :       front() const _GLIBCXX_NOEXCEPT
    1217             :       {
    1218             :         __glibcxx_requires_nonempty();
    1219             :         return *begin();
    1220             :       }
    1221             : 
    1222             :       /**
    1223             :        *  Returns a read/write reference to the data at the last
    1224             :        *  element of the %vector.
    1225             :        */
    1226             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1227             :       reference
    1228             :       back() _GLIBCXX_NOEXCEPT
    1229             :       {
    1230             :         __glibcxx_requires_nonempty();
    1231             :         return *(end() - 1);
    1232             :       }
    1233             : 
    1234             :       /**
    1235             :        *  Returns a read-only (constant) reference to the data at the
    1236             :        *  last element of the %vector.
    1237             :        */
    1238             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1239             :       const_reference
    1240             :       back() const _GLIBCXX_NOEXCEPT
    1241             :       {
    1242             :         __glibcxx_requires_nonempty();
    1243             :         return *(end() - 1);
    1244             :       }
    1245             : 
    1246             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1247             :       // DR 464. Suggestion for new member functions in standard containers.
    1248             :       // data access
    1249             :       /**
    1250             :        *   Returns a pointer such that [data(), data() + size()) is a valid
    1251             :        *   range.  For a non-empty %vector, data() == &front().
    1252             :        */
    1253             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1254             :       _Tp*
    1255             :       data() _GLIBCXX_NOEXCEPT
    1256             :       { return _M_data_ptr(this->_M_impl._M_start); }
    1257             : 
    1258             :       _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
    1259             :       const _Tp*
    1260             :       data() const _GLIBCXX_NOEXCEPT
    1261             :       { return _M_data_ptr(this->_M_impl._M_start); }
    1262             : 
    1263             :       // [23.2.4.3] modifiers
    1264             :       /**
    1265             :        *  @brief  Add data to the end of the %vector.
    1266             :        *  @param  __x  Data to be added.
    1267             :        *
    1268             :        *  This is a typical stack operation.  The function creates an
    1269             :        *  element at the end of the %vector and assigns the given data
    1270             :        *  to it.  Due to the nature of a %vector this operation can be
    1271             :        *  done in constant time if the %vector has preallocated space
    1272             :        *  available.
    1273             :        */
    1274             :       _GLIBCXX20_CONSTEXPR
    1275             :       void
    1276             :       push_back(const value_type& __x)
    1277             :       {
    1278             :         if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
    1279             :           {
    1280             :             _GLIBCXX_ASAN_ANNOTATE_GROW(1);
    1281             :             _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
    1282             :                                      __x);
    1283             :             ++this->_M_impl._M_finish;
    1284             :             _GLIBCXX_ASAN_ANNOTATE_GREW(1);
    1285             :           }
    1286             :         else
    1287             :           _M_realloc_insert(end(), __x);
    1288             :       }
    1289             : 
    1290             : #if __cplusplus >= 201103L
    1291             :       _GLIBCXX20_CONSTEXPR
    1292             :       void
    1293             :       push_back(value_type&& __x)
    1294             :       { emplace_back(std::move(__x)); }
    1295             : 
    1296             :       template<typename... _Args>
    1297             : #if __cplusplus > 201402L
    1298             :         _GLIBCXX20_CONSTEXPR
    1299             :         reference
    1300             : #else
    1301             :         void
    1302             : #endif
    1303             :         emplace_back(_Args&&... __args);
    1304             : #endif
    1305             : 
    1306             :       /**
    1307             :        *  @brief  Removes last element.
    1308             :        *
    1309             :        *  This is a typical stack operation. It shrinks the %vector by one.
    1310             :        *
    1311             :        *  Note that no data is returned, and if the last element's
    1312             :        *  data is needed, it should be retrieved before pop_back() is
    1313             :        *  called.
    1314             :        */
    1315             :       _GLIBCXX20_CONSTEXPR
    1316             :       void
    1317             :       pop_back() _GLIBCXX_NOEXCEPT
    1318             :       {
    1319             :         __glibcxx_requires_nonempty();
    1320             :         --this->_M_impl._M_finish;
    1321             :         _Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
    1322             :         _GLIBCXX_ASAN_ANNOTATE_SHRINK(1);
    1323             :       }
    1324             : 
    1325             : #if __cplusplus >= 201103L
    1326             :       /**
    1327             :        *  @brief  Inserts an object in %vector before specified iterator.
    1328             :        *  @param  __position  A const_iterator into the %vector.
    1329             :        *  @param  __args  Arguments.
    1330             :        *  @return  An iterator that points to the inserted data.
    1331             :        *
    1332             :        *  This function will insert an object of type T constructed
    1333             :        *  with T(std::forward<Args>(args)...) before the specified location.
    1334             :        *  Note that this kind of operation could be expensive for a %vector
    1335             :        *  and if it is frequently used the user should consider using
    1336             :        *  std::list.
    1337             :        */
    1338             :       template<typename... _Args>
    1339             :         _GLIBCXX20_CONSTEXPR
    1340             :         iterator
    1341             :         emplace(const_iterator __position, _Args&&... __args)
    1342             :         { return _M_emplace_aux(__position, std::forward<_Args>(__args)...); }
    1343             : 
    1344             :       /**
    1345             :        *  @brief  Inserts given value into %vector before specified iterator.
    1346             :        *  @param  __position  A const_iterator into the %vector.
    1347             :        *  @param  __x  Data to be inserted.
    1348             :        *  @return  An iterator that points to the inserted data.
    1349             :        *
    1350             :        *  This function will insert a copy of the given value before
    1351             :        *  the specified location.  Note that this kind of operation
    1352             :        *  could be expensive for a %vector and if it is frequently
    1353             :        *  used the user should consider using std::list.
    1354             :        */
    1355             :       _GLIBCXX20_CONSTEXPR
    1356             :       iterator
    1357             :       insert(const_iterator __position, const value_type& __x);
    1358             : #else
    1359             :       /**
    1360             :        *  @brief  Inserts given value into %vector before specified iterator.
    1361             :        *  @param  __position  An iterator into the %vector.
    1362             :        *  @param  __x  Data to be inserted.
    1363             :        *  @return  An iterator that points to the inserted data.
    1364             :        *
    1365             :        *  This function will insert a copy of the given value before
    1366             :        *  the specified location.  Note that this kind of operation
    1367             :        *  could be expensive for a %vector and if it is frequently
    1368             :        *  used the user should consider using std::list.
    1369             :        */
    1370             :       iterator
    1371             :       insert(iterator __position, const value_type& __x);
    1372             : #endif
    1373             : 
    1374             : #if __cplusplus >= 201103L
    1375             :       /**
    1376             :        *  @brief  Inserts given rvalue into %vector before specified iterator.
    1377             :        *  @param  __position  A const_iterator into the %vector.
    1378             :        *  @param  __x  Data to be inserted.
    1379             :        *  @return  An iterator that points to the inserted data.
    1380             :        *
    1381             :        *  This function will insert a copy of the given rvalue before
    1382             :        *  the specified location.  Note that this kind of operation
    1383             :        *  could be expensive for a %vector and if it is frequently
    1384             :        *  used the user should consider using std::list.
    1385             :        */
    1386             :       _GLIBCXX20_CONSTEXPR
    1387             :       iterator
    1388             :       insert(const_iterator __position, value_type&& __x)
    1389             :       { return _M_insert_rval(__position, std::move(__x)); }
    1390             : 
    1391             :       /**
    1392             :        *  @brief  Inserts an initializer_list into the %vector.
    1393             :        *  @param  __position  An iterator into the %vector.
    1394             :        *  @param  __l  An initializer_list.
    1395             :        *
    1396             :        *  This function will insert copies of the data in the
    1397             :        *  initializer_list @a l into the %vector before the location
    1398             :        *  specified by @a position.
    1399             :        *
    1400             :        *  Note that this kind of operation could be expensive for a
    1401             :        *  %vector and if it is frequently used the user should
    1402             :        *  consider using std::list.
    1403             :        */
    1404             :       _GLIBCXX20_CONSTEXPR
    1405             :       iterator
    1406             :       insert(const_iterator __position, initializer_list<value_type> __l)
    1407             :       {
    1408             :         auto __offset = __position - cbegin();
    1409             :         _M_range_insert(begin() + __offset, __l.begin(), __l.end(),
    1410             :                         std::random_access_iterator_tag());
    1411             :         return begin() + __offset;
    1412             :       }
    1413             : #endif
    1414             : 
    1415             : #if __cplusplus >= 201103L
    1416             :       /**
    1417             :        *  @brief  Inserts a number of copies of given data into the %vector.
    1418             :        *  @param  __position  A const_iterator into the %vector.
    1419             :        *  @param  __n  Number of elements to be inserted.
    1420             :        *  @param  __x  Data to be inserted.
    1421             :        *  @return  An iterator that points to the inserted data.
    1422             :        *
    1423             :        *  This function will insert a specified number of copies of
    1424             :        *  the given data before the location specified by @a position.
    1425             :        *
    1426             :        *  Note that this kind of operation could be expensive for a
    1427             :        *  %vector and if it is frequently used the user should
    1428             :        *  consider using std::list.
    1429             :        */
    1430             :       _GLIBCXX20_CONSTEXPR
    1431             :       iterator
    1432             :       insert(const_iterator __position, size_type __n, const value_type& __x)
    1433             :       {
    1434             :         difference_type __offset = __position - cbegin();
    1435             :         _M_fill_insert(begin() + __offset, __n, __x);
    1436             :         return begin() + __offset;
    1437             :       }
    1438             : #else
    1439             :       /**
    1440             :        *  @brief  Inserts a number of copies of given data into the %vector.
    1441             :        *  @param  __position  An iterator into the %vector.
    1442             :        *  @param  __n  Number of elements to be inserted.
    1443             :        *  @param  __x  Data to be inserted.
    1444             :        *
    1445             :        *  This function will insert a specified number of copies of
    1446             :        *  the given data before the location specified by @a position.
    1447             :        *
    1448             :        *  Note that this kind of operation could be expensive for a
    1449             :        *  %vector and if it is frequently used the user should
    1450             :        *  consider using std::list.
    1451             :        */
    1452             :       void
    1453             :       insert(iterator __position, size_type __n, const value_type& __x)
    1454             :       { _M_fill_insert(__position, __n, __x); }
    1455             : #endif
    1456             : 
    1457             : #if __cplusplus >= 201103L
    1458             :       /**
    1459             :        *  @brief  Inserts a range into the %vector.
    1460             :        *  @param  __position  A const_iterator into the %vector.
    1461             :        *  @param  __first  An input iterator.
    1462             :        *  @param  __last   An input iterator.
    1463             :        *  @return  An iterator that points to the inserted data.
    1464             :        *
    1465             :        *  This function will insert copies of the data in the range
    1466             :        *  [__first,__last) into the %vector before the location specified
    1467             :        *  by @a pos.
    1468             :        *
    1469             :        *  Note that this kind of operation could be expensive for a
    1470             :        *  %vector and if it is frequently used the user should
    1471             :        *  consider using std::list.
    1472             :        */
    1473             :       template<typename _InputIterator,
    1474             :                typename = std::_RequireInputIter<_InputIterator>>
    1475             :         _GLIBCXX20_CONSTEXPR
    1476             :         iterator
    1477             :         insert(const_iterator __position, _InputIterator __first,
    1478             :                _InputIterator __last)
    1479             :         {
    1480             :           difference_type __offset = __position - cbegin();
    1481             :           _M_insert_dispatch(begin() + __offset,
    1482             :                              __first, __last, __false_type());
    1483             :           return begin() + __offset;
    1484             :         }
    1485             : #else
    1486             :       /**
    1487             :        *  @brief  Inserts a range into the %vector.
    1488             :        *  @param  __position  An iterator into the %vector.
    1489             :        *  @param  __first  An input iterator.
    1490             :        *  @param  __last   An input iterator.
    1491             :        *
    1492             :        *  This function will insert copies of the data in the range
    1493             :        *  [__first,__last) into the %vector before the location specified
    1494             :        *  by @a pos.
    1495             :        *
    1496             :        *  Note that this kind of operation could be expensive for a
    1497             :        *  %vector and if it is frequently used the user should
    1498             :        *  consider using std::list.
    1499             :        */
    1500             :       template<typename _InputIterator>
    1501             :         void
    1502             :         insert(iterator __position, _InputIterator __first,
    1503             :                _InputIterator __last)
    1504             :         {
    1505             :           // Check whether it's an integral type.  If so, it's not an iterator.
    1506             :           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
    1507             :           _M_insert_dispatch(__position, __first, __last, _Integral());
    1508             :         }
    1509             : #endif
    1510             : 
    1511             :       /**
    1512             :        *  @brief  Remove element at given position.
    1513             :        *  @param  __position  Iterator pointing to element to be erased.
    1514             :        *  @return  An iterator pointing to the next element (or end()).
    1515             :        *
    1516             :        *  This function will erase the element at the given position and thus
    1517             :        *  shorten the %vector by one.
    1518             :        *
    1519             :        *  Note This operation could be expensive and if it is
    1520             :        *  frequently used the user should consider using std::list.
    1521             :        *  The user is also cautioned that this function only erases
    1522             :        *  the element, and that if the element is itself a pointer,
    1523             :        *  the pointed-to memory is not touched in any way.  Managing
    1524             :        *  the pointer is the user's responsibility.
    1525             :        */
    1526             :       _GLIBCXX20_CONSTEXPR
    1527             :       iterator
    1528             : #if __cplusplus >= 201103L
    1529             :       erase(const_iterator __position)
    1530             :       { return _M_erase(begin() + (__position - cbegin())); }
    1531             : #else
    1532             :       erase(iterator __position)
    1533             :       { return _M_erase(__position); }
    1534             : #endif
    1535             : 
    1536             :       /**
    1537             :        *  @brief  Remove a range of elements.
    1538             :        *  @param  __first  Iterator pointing to the first element to be erased.
    1539             :        *  @param  __last  Iterator pointing to one past the last element to be
    1540             :        *                  erased.
    1541             :        *  @return  An iterator pointing to the element pointed to by @a __last
    1542             :        *           prior to erasing (or end()).
    1543             :        *
    1544             :        *  This function will erase the elements in the range
    1545             :        *  [__first,__last) and shorten the %vector accordingly.
    1546             :        *
    1547             :        *  Note This operation could be expensive and if it is
    1548             :        *  frequently used the user should consider using std::list.
    1549             :        *  The user is also cautioned that this function only erases
    1550             :        *  the elements, and that if the elements themselves are
    1551             :        *  pointers, the pointed-to memory is not touched in any way.
    1552             :        *  Managing the pointer is the user's responsibility.
    1553             :        */
    1554             :       _GLIBCXX20_CONSTEXPR
    1555             :       iterator
    1556             : #if __cplusplus >= 201103L
    1557             :       erase(const_iterator __first, const_iterator __last)
    1558             :       {
    1559             :         const auto __beg = begin();
    1560             :         const auto __cbeg = cbegin();
    1561             :         return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg));
    1562             :       }
    1563             : #else
    1564             :       erase(iterator __first, iterator __last)
    1565             :       { return _M_erase(__first, __last); }
    1566             : #endif
    1567             : 
    1568             :       /**
    1569             :        *  @brief  Swaps data with another %vector.
    1570             :        *  @param  __x  A %vector of the same element and allocator types.
    1571             :        *
    1572             :        *  This exchanges the elements between two vectors in constant time.
    1573             :        *  (Three pointers, so it should be quite fast.)
    1574             :        *  Note that the global std::swap() function is specialized such that
    1575             :        *  std::swap(v1,v2) will feed to this function.
    1576             :        *
    1577             :        *  Whether the allocators are swapped depends on the allocator traits.
    1578             :        */
    1579             :       _GLIBCXX20_CONSTEXPR
    1580             :       void
    1581             :       swap(vector& __x) _GLIBCXX_NOEXCEPT
    1582             :       {
    1583             : #if __cplusplus >= 201103L
    1584             :         __glibcxx_assert(_Alloc_traits::propagate_on_container_swap::value
    1585             :                          || _M_get_Tp_allocator() == __x._M_get_Tp_allocator());
    1586             : #endif
    1587             :         this->_M_impl._M_swap_data(__x._M_impl);
    1588             :         _Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
    1589             :                                   __x._M_get_Tp_allocator());
    1590             :       }
    1591             : 
    1592             :       /**
    1593             :        *  Erases all the elements.  Note that this function only erases the
    1594             :        *  elements, and that if the elements themselves are pointers, the
    1595             :        *  pointed-to memory is not touched in any way.  Managing the pointer is
    1596             :        *  the user's responsibility.
    1597             :        */
    1598             :       _GLIBCXX20_CONSTEXPR
    1599             :       void
    1600             :       clear() _GLIBCXX_NOEXCEPT
    1601             :       { _M_erase_at_end(this->_M_impl._M_start); }
    1602             : 
    1603             :     protected:
    1604             :       /**
    1605             :        *  Memory expansion handler.  Uses the member allocation function to
    1606             :        *  obtain @a n bytes of memory, and then copies [first,last) into it.
    1607             :        */
    1608             :       template<typename _ForwardIterator>
    1609             :         _GLIBCXX20_CONSTEXPR
    1610             :         pointer
    1611             :         _M_allocate_and_copy(size_type __n,
    1612             :                              _ForwardIterator __first, _ForwardIterator __last)
    1613             :         {
    1614             :           pointer __result = this->_M_allocate(__n);
    1615             :           __try
    1616             :             {
    1617             :               std::__uninitialized_copy_a(__first, __last, __result,
    1618             :                                           _M_get_Tp_allocator());
    1619             :               return __result;
    1620             :             }
    1621             :           __catch(...)
    1622             :             {
    1623             :               _M_deallocate(__result, __n);
    1624             :               __throw_exception_again;
    1625             :             }
    1626             :         }
    1627             : 
    1628             : 
    1629             :       // Internal constructor functions follow.
    1630             : 
    1631             :       // Called by the range constructor to implement [23.1.1]/9
    1632             : 
    1633             : #if __cplusplus < 201103L
    1634             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1635             :       // 438. Ambiguity in the "do the right thing" clause
    1636             :       template<typename _Integer>
    1637             :         void
    1638             :         _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
    1639             :         {
    1640             :           this->_M_impl._M_start = _M_allocate(_S_check_init_len(
    1641             :                 static_cast<size_type>(__n), _M_get_Tp_allocator()));
    1642             :           this->_M_impl._M_end_of_storage =
    1643             :             this->_M_impl._M_start + static_cast<size_type>(__n);
    1644             :           _M_fill_initialize(static_cast<size_type>(__n), __value);
    1645             :         }
    1646             : 
    1647             :       // Called by the range constructor to implement [23.1.1]/9
    1648             :       template<typename _InputIterator>
    1649             :         void
    1650             :         _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
    1651             :                                __false_type)
    1652             :         {
    1653             :           _M_range_initialize(__first, __last,
    1654             :                               std::__iterator_category(__first));
    1655             :         }
    1656             : #endif
    1657             : 
    1658             :       // Called by the second initialize_dispatch above
    1659             :       template<typename _InputIterator>
    1660             :         _GLIBCXX20_CONSTEXPR
    1661             :         void
    1662             :         _M_range_initialize(_InputIterator __first, _InputIterator __last,
    1663             :                             std::input_iterator_tag)
    1664             :         {
    1665             :           __try {
    1666             :             for (; __first != __last; ++__first)
    1667             : #if __cplusplus >= 201103L
    1668             :               emplace_back(*__first);
    1669             : #else
    1670             :               push_back(*__first);
    1671             : #endif
    1672             :           } __catch(...) {
    1673             :             clear();
    1674             :             __throw_exception_again;
    1675             :           }
    1676             :         }
    1677             : 
    1678             :       // Called by the second initialize_dispatch above
    1679             :       template<typename _ForwardIterator>
    1680             :         _GLIBCXX20_CONSTEXPR
    1681             :         void
    1682             :         _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
    1683             :                             std::forward_iterator_tag)
    1684             :         {
    1685             :           const size_type __n = std::distance(__first, __last);
    1686             :           this->_M_impl._M_start
    1687             :             = this->_M_allocate(_S_check_init_len(__n, _M_get_Tp_allocator()));
    1688             :           this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
    1689             :           this->_M_impl._M_finish =
    1690             :             std::__uninitialized_copy_a(__first, __last,
    1691             :                                         this->_M_impl._M_start,
    1692             :                                         _M_get_Tp_allocator());
    1693             :         }
    1694             : 
    1695             :       // Called by the first initialize_dispatch above and by the
    1696             :       // vector(n,value,a) constructor.
    1697             :       _GLIBCXX20_CONSTEXPR
    1698             :       void
    1699             :       _M_fill_initialize(size_type __n, const value_type& __value)
    1700             :       {
    1701             :         this->_M_impl._M_finish =
    1702             :           std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
    1703             :                                         _M_get_Tp_allocator());
    1704             :       }
    1705             : 
    1706             : #if __cplusplus >= 201103L
    1707             :       // Called by the vector(n) constructor.
    1708             :       _GLIBCXX20_CONSTEXPR
    1709             :       void
    1710             :       _M_default_initialize(size_type __n)
    1711             :       {
    1712             :         this->_M_impl._M_finish =
    1713             :           std::__uninitialized_default_n_a(this->_M_impl._M_start, __n,
    1714             :                                            _M_get_Tp_allocator());
    1715             :       }
    1716             : #endif
    1717             : 
    1718             :       // Internal assign functions follow.  The *_aux functions do the actual
    1719             :       // assignment work for the range versions.
    1720             : 
    1721             :       // Called by the range assign to implement [23.1.1]/9
    1722             : 
    1723             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1724             :       // 438. Ambiguity in the "do the right thing" clause
    1725             :       template<typename _Integer>
    1726             :         _GLIBCXX20_CONSTEXPR
    1727             :         void
    1728             :         _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
    1729             :         { _M_fill_assign(__n, __val); }
    1730             : 
    1731             :       // Called by the range assign to implement [23.1.1]/9
    1732             :       template<typename _InputIterator>
    1733             :         _GLIBCXX20_CONSTEXPR
    1734             :         void
    1735             :         _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
    1736             :                            __false_type)
    1737             :         { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
    1738             : 
    1739             :       // Called by the second assign_dispatch above
    1740             :       template<typename _InputIterator>
    1741             :         _GLIBCXX20_CONSTEXPR
    1742             :         void
    1743             :         _M_assign_aux(_InputIterator __first, _InputIterator __last,
    1744             :                       std::input_iterator_tag);
    1745             : 
    1746             :       // Called by the second assign_dispatch above
    1747             :       template<typename _ForwardIterator>
    1748             :         _GLIBCXX20_CONSTEXPR
    1749             :         void
    1750             :         _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
    1751             :                       std::forward_iterator_tag);
    1752             : 
    1753             :       // Called by assign(n,t), and the range assign when it turns out
    1754             :       // to be the same thing.
    1755             :       _GLIBCXX20_CONSTEXPR
    1756             :       void
    1757             :       _M_fill_assign(size_type __n, const value_type& __val);
    1758             : 
    1759             :       // Internal insert functions follow.
    1760             : 
    1761             :       // Called by the range insert to implement [23.1.1]/9
    1762             : 
    1763             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1764             :       // 438. Ambiguity in the "do the right thing" clause
    1765             :       template<typename _Integer>
    1766             :         _GLIBCXX20_CONSTEXPR
    1767             :         void
    1768             :         _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
    1769             :                            __true_type)
    1770             :         { _M_fill_insert(__pos, __n, __val); }
    1771             : 
    1772             :       // Called by the range insert to implement [23.1.1]/9
    1773             :       template<typename _InputIterator>
    1774             :         _GLIBCXX20_CONSTEXPR
    1775             :         void
    1776             :         _M_insert_dispatch(iterator __pos, _InputIterator __first,
    1777             :                            _InputIterator __last, __false_type)
    1778             :         {
    1779             :           _M_range_insert(__pos, __first, __last,
    1780             :                           std::__iterator_category(__first));
    1781             :         }
    1782             : 
    1783             :       // Called by the second insert_dispatch above
    1784             :       template<typename _InputIterator>
    1785             :         _GLIBCXX20_CONSTEXPR
    1786             :         void
    1787             :         _M_range_insert(iterator __pos, _InputIterator __first,
    1788             :                         _InputIterator __last, std::input_iterator_tag);
    1789             : 
    1790             :       // Called by the second insert_dispatch above
    1791             :       template<typename _ForwardIterator>
    1792             :         _GLIBCXX20_CONSTEXPR
    1793             :         void
    1794             :         _M_range_insert(iterator __pos, _ForwardIterator __first,
    1795             :                         _ForwardIterator __last, std::forward_iterator_tag);
    1796             : 
    1797             :       // Called by insert(p,n,x), and the range insert when it turns out to be
    1798             :       // the same thing.
    1799             :       _GLIBCXX20_CONSTEXPR
    1800             :       void
    1801             :       _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
    1802             : 
    1803             : #if __cplusplus >= 201103L
    1804             :       // Called by resize(n).
    1805             :       _GLIBCXX20_CONSTEXPR
    1806             :       void
    1807             :       _M_default_append(size_type __n);
    1808             : 
    1809             :       _GLIBCXX20_CONSTEXPR
    1810             :       bool
    1811             :       _M_shrink_to_fit();
    1812             : #endif
    1813             : 
    1814             : #if __cplusplus < 201103L
    1815             :       // Called by insert(p,x)
    1816             :       void
    1817             :       _M_insert_aux(iterator __position, const value_type& __x);
    1818             : 
    1819             :       void
    1820             :       _M_realloc_insert(iterator __position, const value_type& __x);
    1821             : #else
    1822             :       // A value_type object constructed with _Alloc_traits::construct()
    1823             :       // and destroyed with _Alloc_traits::destroy().
    1824             :       struct _Temporary_value
    1825             :       {
    1826             :         template<typename... _Args>
    1827             :           _GLIBCXX20_CONSTEXPR explicit
    1828             :           _Temporary_value(vector* __vec, _Args&&... __args) : _M_this(__vec)
    1829             :           {
    1830             :             _Alloc_traits::construct(_M_this->_M_impl, _M_ptr(),
    1831             :                                      std::forward<_Args>(__args)...);
    1832             :           }
    1833             : 
    1834             :         _GLIBCXX20_CONSTEXPR
    1835             :         ~_Temporary_value()
    1836             :         { _Alloc_traits::destroy(_M_this->_M_impl, _M_ptr()); }
    1837             : 
    1838             :         _GLIBCXX20_CONSTEXPR value_type&
    1839             :         _M_val() noexcept { return _M_storage._M_val; }
    1840             : 
    1841             :       private:
    1842             :         _GLIBCXX20_CONSTEXPR _Tp*
    1843             :         _M_ptr() noexcept { return std::__addressof(_M_storage._M_val); }
    1844             : 
    1845             :         union _Storage
    1846             :         {
    1847             :           constexpr _Storage() : _M_byte() { }
    1848             :           _GLIBCXX20_CONSTEXPR ~_Storage() { }
    1849             :           _Storage& operator=(const _Storage&) = delete;
    1850             :           unsigned char _M_byte;
    1851             :           _Tp _M_val;
    1852             :         };
    1853             : 
    1854             :         vector*  _M_this;
    1855             :         _Storage _M_storage;
    1856             :       };
    1857             : 
    1858             :       // Called by insert(p,x) and other functions when insertion needs to
    1859             :       // reallocate or move existing elements. _Arg is either _Tp& or _Tp.
    1860             :       template<typename _Arg>
    1861             :         _GLIBCXX20_CONSTEXPR
    1862             :         void
    1863             :         _M_insert_aux(iterator __position, _Arg&& __arg);
    1864             : 
    1865             :       template<typename... _Args>
    1866             :         _GLIBCXX20_CONSTEXPR
    1867             :         void
    1868             :         _M_realloc_insert(iterator __position, _Args&&... __args);
    1869             : 
    1870             :       // Either move-construct at the end, or forward to _M_insert_aux.
    1871             :       _GLIBCXX20_CONSTEXPR
    1872             :       iterator
    1873             :       _M_insert_rval(const_iterator __position, value_type&& __v);
    1874             : 
    1875             :       // Try to emplace at the end, otherwise forward to _M_insert_aux.
    1876             :       template<typename... _Args>
    1877             :         _GLIBCXX20_CONSTEXPR
    1878             :         iterator
    1879             :         _M_emplace_aux(const_iterator __position, _Args&&... __args);
    1880             : 
    1881             :       // Emplacing an rvalue of the correct type can use _M_insert_rval.
    1882             :       _GLIBCXX20_CONSTEXPR
    1883             :       iterator
    1884             :       _M_emplace_aux(const_iterator __position, value_type&& __v)
    1885             :       { return _M_insert_rval(__position, std::move(__v)); }
    1886             : #endif
    1887             : 
    1888             :       // Called by _M_fill_insert, _M_insert_aux etc.
    1889             :       _GLIBCXX20_CONSTEXPR
    1890             :       size_type
    1891             :       _M_check_len(size_type __n, const char* __s) const
    1892             :       {
    1893             :         if (max_size() - size() < __n)
    1894             :           __throw_length_error(__N(__s));
    1895             : 
    1896             :         const size_type __len = size() + (std::max)(size(), __n);
    1897             :         return (__len < size() || __len > max_size()) ? max_size() : __len;
    1898             :       }
    1899             : 
    1900             :       // Called by constructors to check initial size.
    1901             :       static _GLIBCXX20_CONSTEXPR size_type
    1902             :       _S_check_init_len(size_type __n, const allocator_type& __a)
    1903             :       {
    1904             :         if (__n > _S_max_size(_Tp_alloc_type(__a)))
    1905             :           __throw_length_error(
    1906             :               __N("cannot create std::vector larger than max_size()"));
    1907             :         return __n;
    1908             :       }
    1909             : 
    1910             :       static _GLIBCXX20_CONSTEXPR size_type
    1911             :       _S_max_size(const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT
    1912             :       {
    1913             :         // std::distance(begin(), end()) cannot be greater than PTRDIFF_MAX,
    1914             :         // and realistically we can't store more than PTRDIFF_MAX/sizeof(T)
    1915             :         // (even if std::allocator_traits::max_size says we can).
    1916             :         const size_t __diffmax
    1917             :           = __gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(_Tp);
    1918             :         const size_t __allocmax = _Alloc_traits::max_size(__a);
    1919             :         return (std::min)(__diffmax, __allocmax);
    1920             :       }
    1921             : 
    1922             :       // Internal erase functions follow.
    1923             : 
    1924             :       // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
    1925             :       // _M_assign_aux.
    1926             :       _GLIBCXX20_CONSTEXPR
    1927             :       void
    1928             :       _M_erase_at_end(pointer __pos) _GLIBCXX_NOEXCEPT
    1929             :       {
    1930             :         if (size_type __n = this->_M_impl._M_finish - __pos)
    1931             :           {
    1932             :             std::_Destroy(__pos, this->_M_impl._M_finish,
    1933             :                           _M_get_Tp_allocator());
    1934             :             this->_M_impl._M_finish = __pos;
    1935             :             _GLIBCXX_ASAN_ANNOTATE_SHRINK(__n);
    1936             :           }
    1937             :       }
    1938             : 
    1939             :       _GLIBCXX20_CONSTEXPR
    1940             :       iterator
    1941             :       _M_erase(iterator __position);
    1942             : 
    1943             :       _GLIBCXX20_CONSTEXPR
    1944             :       iterator
    1945             :       _M_erase(iterator __first, iterator __last);
    1946             : 
    1947             : #if __cplusplus >= 201103L
    1948             :     private:
    1949             :       // Constant-time move assignment when source object's memory can be
    1950             :       // moved, either because the source's allocator will move too
    1951             :       // or because the allocators are equal.
    1952             :       _GLIBCXX20_CONSTEXPR
    1953             :       void
    1954             :       _M_move_assign(vector&& __x, true_type) noexcept
    1955             :       {
    1956             :         vector __tmp(get_allocator());
    1957             :         this->_M_impl._M_swap_data(__x._M_impl);
    1958             :         __tmp._M_impl._M_swap_data(__x._M_impl);
    1959             :         std::__alloc_on_move(_M_get_Tp_allocator(), __x._M_get_Tp_allocator());
    1960             :       }
    1961             : 
    1962             :       // Do move assignment when it might not be possible to move source
    1963             :       // object's memory, resulting in a linear-time operation.
    1964             :       _GLIBCXX20_CONSTEXPR
    1965             :       void
    1966             :       _M_move_assign(vector&& __x, false_type)
    1967             :       {
    1968             :         if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator())
    1969             :           _M_move_assign(std::move(__x), true_type());
    1970             :         else
    1971             :           {
    1972             :             // The rvalue's allocator cannot be moved and is not equal,
    1973             :             // so we need to individually move each element.
    1974             :             this->_M_assign_aux(std::make_move_iterator(__x.begin()),
    1975             :                                 std::make_move_iterator(__x.end()),
    1976             :                                 std::random_access_iterator_tag());
    1977             :             __x.clear();
    1978             :           }
    1979             :       }
    1980             : #endif
    1981             : 
    1982             :       template<typename _Up>
    1983             :         _GLIBCXX20_CONSTEXPR
    1984             :         _Up*
    1985             :         _M_data_ptr(_Up* __ptr) const _GLIBCXX_NOEXCEPT
    1986             :         { return __ptr; }
    1987             : 
    1988             : #if __cplusplus >= 201103L
    1989             :       template<typename _Ptr>
    1990             :         _GLIBCXX20_CONSTEXPR
    1991             :         typename std::pointer_traits<_Ptr>::element_type*
    1992             :         _M_data_ptr(_Ptr __ptr) const
    1993             :         { return empty() ? nullptr : std::__to_address(__ptr); }
    1994             : #else
    1995             :       template<typename _Up>
    1996             :         _Up*
    1997             :         _M_data_ptr(_Up* __ptr) _GLIBCXX_NOEXCEPT
    1998             :         { return __ptr; }
    1999             : 
    2000             :       template<typename _Ptr>
    2001             :         value_type*
    2002             :         _M_data_ptr(_Ptr __ptr)
    2003             :         { return empty() ? (value_type*)0 : __ptr.operator->(); }
    2004             : 
    2005             :       template<typename _Ptr>
    2006             :         const value_type*
    2007             :         _M_data_ptr(_Ptr __ptr) const
    2008             :         { return empty() ? (const value_type*)0 : __ptr.operator->(); }
    2009             : #endif
    2010             :     };
    2011             : 
    2012             : #if __cpp_deduction_guides >= 201606
    2013             :   template<typename _InputIterator, typename _ValT
    2014             :              = typename iterator_traits<_InputIterator>::value_type,
    2015             :            typename _Allocator = allocator<_ValT>,
    2016             :            typename = _RequireInputIter<_InputIterator>,
    2017             :            typename = _RequireAllocator<_Allocator>>
    2018             :     vector(_InputIterator, _InputIterator, _Allocator = _Allocator())
    2019             :       -> vector<_ValT, _Allocator>;
    2020             : #endif
    2021             : 
    2022             :   /**
    2023             :    *  @brief  Vector equality comparison.
    2024             :    *  @param  __x  A %vector.
    2025             :    *  @param  __y  A %vector of the same type as @a __x.
    2026             :    *  @return  True iff the size and elements of the vectors are equal.
    2027             :    *
    2028             :    *  This is an equivalence relation.  It is linear in the size of the
    2029             :    *  vectors.  Vectors are considered equivalent if their sizes are equal,
    2030             :    *  and if corresponding elements compare equal.
    2031             :   */
    2032             :   template<typename _Tp, typename _Alloc>
    2033             :     _GLIBCXX20_CONSTEXPR
    2034             :     inline bool
    2035             :     operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    2036             :     { return (__x.size() == __y.size()
    2037             :               && std::equal(__x.begin(), __x.end(), __y.begin())); }
    2038             : 
    2039             : #if __cpp_lib_three_way_comparison
    2040             :   /**
    2041             :    *  @brief  Vector ordering relation.
    2042             :    *  @param  __x  A `vector`.
    2043             :    *  @param  __y  A `vector` of the same type as `__x`.
    2044             :    *  @return  A value indicating whether `__x` is less than, equal to,
    2045             :    *           greater than, or incomparable with `__y`.
    2046             :    *
    2047             :    *  See `std::lexicographical_compare_three_way()` for how the determination
    2048             :    *  is made. This operator is used to synthesize relational operators like
    2049             :    *  `<` and `>=` etc.
    2050             :   */
    2051             :   template<typename _Tp, typename _Alloc>
    2052             :     _GLIBCXX20_CONSTEXPR
    2053             :     inline __detail::__synth3way_t<_Tp>
    2054             :     operator<=>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    2055             :     {
    2056             :       return std::lexicographical_compare_three_way(__x.begin(), __x.end(),
    2057             :                                                     __y.begin(), __y.end(),
    2058             :                                                     __detail::__synth3way);
    2059             :     }
    2060             : #else
    2061             :   /**
    2062             :    *  @brief  Vector ordering relation.
    2063             :    *  @param  __x  A %vector.
    2064             :    *  @param  __y  A %vector of the same type as @a __x.
    2065             :    *  @return  True iff @a __x is lexicographically less than @a __y.
    2066             :    *
    2067             :    *  This is a total ordering relation.  It is linear in the size of the
    2068             :    *  vectors.  The elements must be comparable with @c <.
    2069             :    *
    2070             :    *  See std::lexicographical_compare() for how the determination is made.
    2071             :   */
    2072             :   template<typename _Tp, typename _Alloc>
    2073             :     inline bool
    2074             :     operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    2075             :     { return std::lexicographical_compare(__x.begin(), __x.end(),
    2076             :                                           __y.begin(), __y.end()); }
    2077             : 
    2078             :   /// Based on operator==
    2079             :   template<typename _Tp, typename _Alloc>
    2080             :     inline bool
    2081             :     operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    2082             :     { return !(__x == __y); }
    2083             : 
    2084             :   /// Based on operator<
    2085             :   template<typename _Tp, typename _Alloc>
    2086             :     inline bool
    2087             :     operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    2088             :     { return __y < __x; }
    2089             : 
    2090             :   /// Based on operator<
    2091             :   template<typename _Tp, typename _Alloc>
    2092             :     inline bool
    2093             :     operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    2094             :     { return !(__y < __x); }
    2095             : 
    2096             :   /// Based on operator<
    2097             :   template<typename _Tp, typename _Alloc>
    2098             :     inline bool
    2099             :     operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
    2100             :     { return !(__x < __y); }
    2101             : #endif // three-way comparison
    2102             : 
    2103             :   /// See std::vector::swap().
    2104             :   template<typename _Tp, typename _Alloc>
    2105             :     _GLIBCXX20_CONSTEXPR
    2106             :     inline void
    2107             :     swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
    2108             :     _GLIBCXX_NOEXCEPT_IF(noexcept(__x.swap(__y)))
    2109             :     { __x.swap(__y); }
    2110             : 
    2111             : _GLIBCXX_END_NAMESPACE_CONTAINER
    2112             : 
    2113             : #if __cplusplus >= 201703L
    2114             :   namespace __detail::__variant
    2115             :   {
    2116             :     template<typename> struct _Never_valueless_alt; // see <variant>
    2117             : 
    2118             :     // Provide the strong exception-safety guarantee when emplacing a
    2119             :     // vector into a variant, but only if move assignment cannot throw.
    2120             :     template<typename _Tp, typename _Alloc>
    2121             :       struct _Never_valueless_alt<_GLIBCXX_STD_C::vector<_Tp, _Alloc>>
    2122             :       : std::is_nothrow_move_assignable<_GLIBCXX_STD_C::vector<_Tp, _Alloc>>
    2123             :       { };
    2124             :   }  // namespace __detail::__variant
    2125             : #endif // C++17
    2126             : 
    2127             : _GLIBCXX_END_NAMESPACE_VERSION
    2128             : } // namespace std
    2129             : 
    2130             : #endif /* _STL_VECTOR_H */

Generated by: LCOV version 1.16