LCOV - code coverage report
Current view: top level - usr/include/c++/9/bits - stl_vector.h (source / functions) Hit Total Coverage
Test: ROSE Lines: 218 320 68.1 %
Date: 2022-12-08 13:48:47 Functions: 588 1587 37.1 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.14