LCOV - code coverage report
Current view: top level - usr/include/c++/9/bits - stl_bvector.h (source / functions) Hit Total Coverage
Test: ROSE Lines: 171 233 73.4 %
Date: 2022-12-08 13:48:47 Functions: 10 14 71.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // vector<bool> specialization -*- 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-1999
      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_bvector.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_BVECTOR_H
      57             : #define _STL_BVECTOR_H 1
      58             : 
      59             : #if __cplusplus >= 201103L
      60             : #include <initializer_list>
      61             : #include <bits/functional_hash.h>
      62             : #endif
      63             : 
      64             : namespace std _GLIBCXX_VISIBILITY(default)
      65             : {
      66             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
      67             : _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
      68             : 
      69             :   typedef unsigned long _Bit_type;
      70             :   enum { _S_word_bit = int(__CHAR_BIT__ * sizeof(_Bit_type)) };
      71             : 
      72             :   struct _Bit_reference
      73             :   {
      74             :     _Bit_type * _M_p;
      75             :     _Bit_type _M_mask;
      76             : 
      77   296935495 :     _Bit_reference(_Bit_type * __x, _Bit_type __y)
      78             :     : _M_p(__x), _M_mask(__y) { }
      79             : 
      80             :     _Bit_reference() _GLIBCXX_NOEXCEPT : _M_p(0), _M_mask(0) { }
      81             : 
      82             : #if __cplusplus >= 201103L
      83             :     _Bit_reference(const _Bit_reference&) = default;
      84             : #endif
      85             : 
      86   151671515 :     operator bool() const _GLIBCXX_NOEXCEPT
      87   151671515 :     { return !!(*_M_p & _M_mask); }
      88             : 
      89             :     _Bit_reference&
      90   254417780 :     operator=(bool __x) _GLIBCXX_NOEXCEPT
      91             :     {
      92   254417780 :       if (__x)
      93     3950996 :         *_M_p |= _M_mask;
      94             :       else
      95   203916400 :         *_M_p &= ~_M_mask;
      96   111006840 :       return *this;
      97             :     }
      98             : 
      99             :     _Bit_reference&
     100           0 :     operator=(const _Bit_reference& __x) _GLIBCXX_NOEXCEPT
     101           0 :     { return *this = bool(__x); }
     102             : 
     103             :     bool
     104             :     operator==(const _Bit_reference& __x) const
     105             :     { return bool(*this) == bool(__x); }
     106             : 
     107             :     bool
     108             :     operator<(const _Bit_reference& __x) const
     109             :     { return !bool(*this) && bool(__x); }
     110             : 
     111             :     void
     112             :     flip() _GLIBCXX_NOEXCEPT
     113             :     { *_M_p ^= _M_mask; }
     114             :   };
     115             : 
     116             : #if __cplusplus >= 201103L
     117             :   inline void
     118             :   swap(_Bit_reference __x, _Bit_reference __y) noexcept
     119             :   {
     120             :     bool __tmp = __x;
     121             :     __x = __y;
     122             :     __y = __tmp;
     123             :   }
     124             : 
     125             :   inline void
     126             :   swap(_Bit_reference __x, bool& __y) noexcept
     127             :   {
     128             :     bool __tmp = __x;
     129             :     __x = __y;
     130             :     __y = __tmp;
     131             :   }
     132             : 
     133             :   inline void
     134             :   swap(bool& __x, _Bit_reference __y) noexcept
     135             :   {
     136             :     bool __tmp = __x;
     137             :     __x = __y;
     138             :     __y = __tmp;
     139             :   }
     140             : #endif
     141             : 
     142             :   struct _Bit_iterator_base
     143             :   : public std::iterator<std::random_access_iterator_tag, bool>
     144             :   {
     145             :     _Bit_type * _M_p;
     146             :     unsigned int _M_offset;
     147             : 
     148   316980920 :     _Bit_iterator_base(_Bit_type * __x, unsigned int __y)
     149    49015630 :     : _M_p(__x), _M_offset(__y) { }
     150             : 
     151             :     void
     152   322657335 :     _M_bump_up()
     153             :     {
     154   322657335 :       if (_M_offset++ == int(_S_word_bit) - 1)
     155             :         {
     156           0 :           _M_offset = 0;
     157           0 :           ++_M_p;
     158             :         }
     159             :     }
     160             : 
     161             :     void
     162           0 :     _M_bump_down()
     163             :     {
     164           0 :       if (_M_offset-- == 0)
     165             :         {
     166           0 :           _M_offset = int(_S_word_bit) - 1;
     167           0 :           --_M_p;
     168             :         }
     169             :     }
     170             : 
     171             :     void
     172    32656070 :     _M_incr(ptrdiff_t __i)
     173             :     {
     174    32656070 :       difference_type __n = __i + _M_offset;
     175    32656070 :       _M_p += __n / int(_S_word_bit);
     176    32656070 :       __n = __n % int(_S_word_bit);
     177    32656070 :       if (__n < 0)
     178             :         {
     179           0 :           __n += int(_S_word_bit);
     180           0 :           --_M_p;
     181             :         }
     182    32656070 :       _M_offset = static_cast<unsigned int>(__n);
     183             :     }
     184             : 
     185             :     bool
     186    11265765 :     operator==(const _Bit_iterator_base& __i) const
     187    11265765 :     { return _M_p == __i._M_p && _M_offset == __i._M_offset; }
     188             : 
     189             :     bool
     190             :     operator<(const _Bit_iterator_base& __i) const
     191             :     {
     192             :       return _M_p < __i._M_p
     193             :             || (_M_p == __i._M_p && _M_offset < __i._M_offset);
     194             :     }
     195             : 
     196             :     bool
     197     5841775 :     operator!=(const _Bit_iterator_base& __i) const
     198     5841775 :     { return !(*this == __i); }
     199             : 
     200             :     bool
     201             :     operator>(const _Bit_iterator_base& __i) const
     202             :     { return __i < *this; }
     203             : 
     204             :     bool
     205             :     operator<=(const _Bit_iterator_base& __i) const
     206             :     { return !(__i < *this); }
     207             : 
     208             :     bool
     209             :     operator>=(const _Bit_iterator_base& __i) const
     210             :     { return !(*this < __i); }
     211             :   };
     212             : 
     213             :   inline ptrdiff_t
     214   113864790 :   operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
     215             :   {
     216   113864790 :     return (int(_S_word_bit) * (__x._M_p - __y._M_p)
     217     5726960 :             + __x._M_offset - __y._M_offset);
     218             :   }
     219             : 
     220             :   struct _Bit_iterator : public _Bit_iterator_base
     221             :   {
     222             :     typedef _Bit_reference  reference;
     223             :     typedef _Bit_reference* pointer;
     224             :     typedef _Bit_iterator   iterator;
     225             : 
     226    73359123 :     _Bit_iterator() : _Bit_iterator_base(0, 0) { }
     227             : 
     228    92760280 :     _Bit_iterator(_Bit_type * __x, unsigned int __y)
     229    92760280 :     : _Bit_iterator_base(__x, __y) { }
     230             : 
     231             :     iterator
     232             :     _M_const_cast() const
     233             :     { return *this; }
     234             : 
     235             :     reference
     236   254417780 :     operator*() const
     237     1853690 :     { return reference(_M_p, 1UL << _M_offset); }
     238             : 
     239             :     iterator&
     240   109153840 :     operator++()
     241             :     {
     242   109153840 :       _M_bump_up();
     243   109153840 :       return *this;
     244             :     }
     245             : 
     246             :     iterator
     247    98712740 :     operator++(int)
     248             :     {
     249    98712740 :       iterator __tmp = *this;
     250     1852850 :       _M_bump_up();
     251     1852850 :       return __tmp;
     252             :     }
     253             : 
     254             :     iterator&
     255           0 :     operator--()
     256             :     {
     257           0 :       _M_bump_down();
     258           0 :       return *this;
     259             :     }
     260             : 
     261             :     iterator
     262             :     operator--(int)
     263             :     {
     264             :       iterator __tmp = *this;
     265             :       _M_bump_down();
     266             :       return __tmp;
     267             :     }
     268             : 
     269             :     iterator&
     270    32656070 :     operator+=(difference_type __i)
     271             :     {
     272    65312280 :       _M_incr(__i);
     273    32656070 :       return *this;
     274             :     }
     275             : 
     276             :     iterator&
     277           0 :     operator-=(difference_type __i)
     278             :     {
     279           0 :       *this += -__i;
     280           0 :       return *this;
     281             :     }
     282             : 
     283             :     iterator
     284    32656070 :     operator+(difference_type __i) const
     285             :     {
     286    32656070 :       iterator __tmp = *this;
     287          80 :       return __tmp += __i;
     288             :     }
     289             : 
     290             :     iterator
     291           0 :     operator-(difference_type __i) const
     292             :     {
     293           0 :       iterator __tmp = *this;
     294           0 :       return __tmp -= __i;
     295             :     }
     296             : 
     297             :     reference
     298             :     operator[](difference_type __i) const
     299             :     { return *(*this + __i); }
     300             :   };
     301             : 
     302             :   inline _Bit_iterator
     303             :   operator+(ptrdiff_t __n, const _Bit_iterator& __x)
     304             :   { return __x + __n; }
     305             : 
     306             :   struct _Bit_const_iterator : public _Bit_iterator_base
     307             :   {
     308             :     typedef bool                 reference;
     309             :     typedef bool                 const_reference;
     310             :     typedef const bool*          pointer;
     311             :     typedef _Bit_const_iterator  const_iterator;
     312             : 
     313             :     _Bit_const_iterator() : _Bit_iterator_base(0, 0) { }
     314             : 
     315   145322717 :     _Bit_const_iterator(_Bit_type * __x, unsigned int __y)
     316   145322717 :     : _Bit_iterator_base(__x, __y) { }
     317             : 
     318   115810390 :     _Bit_const_iterator(const _Bit_iterator& __x)
     319     1876140 :     : _Bit_iterator_base(__x._M_p, __x._M_offset) { }
     320             : 
     321             :     _Bit_iterator
     322      190381 :     _M_const_cast() const
     323      190381 :     { return _Bit_iterator(_M_p, _M_offset); }
     324             : 
     325             :     const_reference
     326   151671515 :     operator*() const
     327   109184491 :     { return _Bit_reference(_M_p, 1UL << _M_offset); }
     328             : 
     329             :     const_iterator&
     330   114790515 :     operator++()
     331             :     {
     332   114790515 :       _M_bump_up();
     333   109153840 :       return *this;
     334             :     }
     335             : 
     336             :     const_iterator
     337             :     operator++(int)
     338             :     {
     339             :       const_iterator __tmp = *this;
     340             :       _M_bump_up();
     341             :       return __tmp;
     342             :     }
     343             : 
     344             :     const_iterator&
     345             :     operator--()
     346             :     {
     347             :       _M_bump_down();
     348             :       return *this;
     349             :     }
     350             : 
     351             :     const_iterator
     352             :     operator--(int)
     353             :     {
     354             :       const_iterator __tmp = *this;
     355             :       _M_bump_down();
     356             :       return __tmp;
     357             :     }
     358             : 
     359             :     const_iterator&
     360             :     operator+=(difference_type __i)
     361             :     {
     362             :       _M_incr(__i);
     363             :       return *this;
     364             :     }
     365             : 
     366             :     const_iterator&
     367             :     operator-=(difference_type __i)
     368             :     {
     369             :       *this += -__i;
     370             :       return *this;
     371             :     }
     372             : 
     373             :     const_iterator
     374             :     operator+(difference_type __i) const
     375             :     {
     376             :       const_iterator __tmp = *this;
     377             :       return __tmp += __i;
     378             :     }
     379             : 
     380             :     const_iterator
     381             :     operator-(difference_type __i) const
     382             :     {
     383             :       const_iterator __tmp = *this;
     384             :       return __tmp -= __i;
     385             :     }
     386             : 
     387             :     const_reference
     388             :     operator[](difference_type __i) const
     389             :     { return *(*this + __i); }
     390             :   };
     391             : 
     392             :   inline _Bit_const_iterator
     393             :   operator+(ptrdiff_t __n, const _Bit_const_iterator& __x)
     394             :   { return __x + __n; }
     395             : 
     396             :   inline void
     397           0 :   __fill_bvector(_Bit_type * __v,
     398             :                  unsigned int __first, unsigned int __last, bool __x)
     399             :   {
     400           0 :     const _Bit_type __fmask = ~0ul << __first;
     401           0 :     const _Bit_type __lmask = ~0ul >> (_S_word_bit - __last);
     402           0 :     const _Bit_type __mask = __fmask & __lmask;
     403             : 
     404           0 :     if (__x)
     405           0 :       *__v |= __mask;
     406             :     else
     407           0 :       *__v &= ~__mask;
     408             :   }
     409             : 
     410             :   inline void
     411           0 :   fill(_Bit_iterator __first, _Bit_iterator __last, const bool& __x)
     412             :   {
     413           0 :     if (__first._M_p != __last._M_p)
     414             :       {
     415           0 :         _Bit_type* __first_p = __first._M_p;
     416           0 :         if (__first._M_offset != 0)
     417           0 :           __fill_bvector(__first_p++, __first._M_offset, _S_word_bit, __x);
     418             : 
     419           0 :         __builtin_memset(__first_p, __x ? ~0 : 0,
     420           0 :                          (__last._M_p - __first_p) * sizeof(_Bit_type));
     421             : 
     422           0 :         if (__last._M_offset != 0)
     423           0 :           __fill_bvector(__last._M_p, 0, __last._M_offset, __x);
     424             :       }
     425           0 :     else if (__first._M_offset != __last._M_offset)
     426           0 :       __fill_bvector(__first._M_p, __first._M_offset, __last._M_offset, __x);
     427           0 :   }
     428             : 
     429             :   template<typename _Alloc>
     430             :     struct _Bvector_base
     431             :     {
     432             :       typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
     433             :         rebind<_Bit_type>::other _Bit_alloc_type;
     434             :       typedef typename __gnu_cxx::__alloc_traits<_Bit_alloc_type>
     435             :         _Bit_alloc_traits;
     436             :       typedef typename _Bit_alloc_traits::pointer _Bit_pointer;
     437             : 
     438             :       struct _Bvector_impl_data
     439             :       {
     440             :         _Bit_iterator   _M_start;
     441             :         _Bit_iterator   _M_finish;
     442             :         _Bit_pointer    _M_end_of_storage;
     443             : 
     444    41548502 :         _Bvector_impl_data() _GLIBCXX_NOEXCEPT
     445    41548502 :         : _M_start(), _M_finish(), _M_end_of_storage()
     446             :         { }
     447             : 
     448             : #if __cplusplus >= 201103L
     449           0 :         _Bvector_impl_data(_Bvector_impl_data&& __x) noexcept
     450             :         : _M_start(__x._M_start), _M_finish(__x._M_finish)
     451           0 :         , _M_end_of_storage(__x._M_end_of_storage)
     452           0 :         { __x._M_reset(); }
     453             : 
     454             :         void
     455    19026981 :         _M_move_data(_Bvector_impl_data&& __x) noexcept
     456             :         {
     457    19026981 :           this->_M_start = __x._M_start;
     458    19026981 :           this->_M_finish = __x._M_finish;
     459    19026981 :           this->_M_end_of_storage = __x._M_end_of_storage;
     460    19026981 :           __x._M_reset();
     461             :         }
     462             : #endif
     463             : 
     464             :         void
     465    31810721 :         _M_reset() _GLIBCXX_NOEXCEPT
     466             :         {
     467    31810721 :           _M_start = _M_finish = _Bit_iterator();
     468    31810721 :           _M_end_of_storage = _Bit_pointer();
     469    12783740 :         }
     470             :       };
     471             : 
     472    25437621 :       struct _Bvector_impl
     473             :         : public _Bit_alloc_type, public _Bvector_impl_data
     474             :         {
     475             :         public:
     476    16338762 :           _Bvector_impl() _GLIBCXX_NOEXCEPT_IF(
     477             :                 is_nothrow_default_constructible<_Bit_alloc_type>::value)
     478    16283437 :           : _Bit_alloc_type()
     479             :           { }
     480             : 
     481    25209740 :           _Bvector_impl(const _Bit_alloc_type& __a) _GLIBCXX_NOEXCEPT
     482    25209740 :           : _Bit_alloc_type(__a)
     483             :           { }
     484             : 
     485             : #if __cplusplus >= 201103L
     486           0 :         _Bvector_impl(_Bvector_impl&&) = default;
     487             : #endif
     488             : 
     489             :         _Bit_type*
     490   140580370 :         _M_end_addr() const _GLIBCXX_NOEXCEPT
     491             :         {
     492     1852890 :           if (this->_M_end_of_storage)
     493   135041980 :             return std::__addressof(this->_M_end_of_storage[-1]) + 1;
     494             :           return 0;
     495             :         }
     496             :       };
     497             : 
     498             :     public:
     499             :       typedef _Alloc allocator_type;
     500             : 
     501             :       _Bit_alloc_type&
     502    19026981 :       _M_get_Bit_allocator() _GLIBCXX_NOEXCEPT
     503    19026981 :       { return this->_M_impl; }
     504             : 
     505             :       const _Bit_alloc_type&
     506     3705740 :       _M_get_Bit_allocator() const _GLIBCXX_NOEXCEPT
     507     3705740 :       { return this->_M_impl; }
     508             : 
     509             :       allocator_type
     510             :       get_allocator() const _GLIBCXX_NOEXCEPT
     511             :       { return allocator_type(_M_get_Bit_allocator()); }
     512             : 
     513             : #if __cplusplus >= 201103L
     514    16338762 :       _Bvector_base() = default;
     515             : #else
     516             :       _Bvector_base() { }
     517             : #endif
     518             : 
     519    25209740 :       _Bvector_base(const allocator_type& __a)
     520          40 :       : _M_impl(__a) { }
     521             : 
     522             : #if __cplusplus >= 201103L
     523           0 :       _Bvector_base(_Bvector_base&&) = default;
     524             : #endif
     525             : 
     526    25437621 :       ~_Bvector_base()
     527    25437621 :       { this->_M_deallocate(); }
     528             : 
     529             :     protected:
     530             :       _Bvector_impl _M_impl;
     531             : 
     532             :       _Bit_pointer
     533    28894640 :       _M_allocate(size_t __n)
     534     1852930 :       { return _Bit_alloc_traits::allocate(_M_impl, _S_nword(__n)); }
     535             : 
     536             :       void
     537    48149402 :       _M_deallocate()
     538             :       {
     539    48149402 :         if (_M_impl._M_start._M_p)
     540             :           {
     541    12783740 :             const size_t __n = _M_impl._M_end_addr() - _M_impl._M_start._M_p;
     542    25567480 :             _Bit_alloc_traits::deallocate(_M_impl,
     543    12783740 :                                           _M_impl._M_end_of_storage - __n,
     544             :                                           __n);
     545    12783740 :             _M_impl._M_reset();
     546             :           }
     547    48149402 :       }
     548             : 
     549             : #if __cplusplus >= 201103L
     550             :       void
     551    19026981 :       _M_move_data(_Bvector_base&& __x) noexcept
     552    19026981 :       { _M_impl._M_move_data(std::move(__x._M_impl)); }
     553             : #endif
     554             : 
     555             :       static size_t
     556     1852930 :       _S_nword(size_t __n)
     557     1852890 :       { return (__n + int(_S_word_bit) - 1) / int(_S_word_bit); }
     558             :     };
     559             : 
     560             : _GLIBCXX_END_NAMESPACE_CONTAINER
     561             : _GLIBCXX_END_NAMESPACE_VERSION
     562             : } // namespace std
     563             : 
     564             : // Declare a partial specialization of vector<T, Alloc>.
     565             : #include <bits/stl_vector.h>
     566             : 
     567             : namespace std _GLIBCXX_VISIBILITY(default)
     568             : {
     569             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
     570             : _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     571             : 
     572             :   /**
     573             :    *  @brief  A specialization of vector for booleans which offers fixed time
     574             :    *  access to individual elements in any order.
     575             :    *
     576             :    *  @ingroup sequences
     577             :    *
     578             :    *  @tparam _Alloc  Allocator type.
     579             :    *
     580             :    *  Note that vector<bool> does not actually meet the requirements for being
     581             :    *  a container.  This is because the reference and pointer types are not
     582             :    *  really references and pointers to bool.  See DR96 for details.  @see
     583             :    *  vector for function documentation.
     584             :    *
     585             :    *  In some terminology a %vector can be described as a dynamic
     586             :    *  C-style array, it offers fast and efficient access to individual
     587             :    *  elements in any order and saves the user from worrying about
     588             :    *  memory and size allocation.  Subscripting ( @c [] ) access is
     589             :    *  also provided as with C-style arrays.
     590             :   */
     591             :   template<typename _Alloc>
     592             :     class vector<bool, _Alloc> : protected _Bvector_base<_Alloc>
     593             :     {
     594             :       typedef _Bvector_base<_Alloc>                       _Base;
     595             :       typedef typename _Base::_Bit_pointer              _Bit_pointer;
     596             :       typedef typename _Base::_Bit_alloc_traits         _Bit_alloc_traits;
     597             : 
     598             : #if __cplusplus >= 201103L
     599             :       friend struct std::hash<vector>;
     600             : #endif
     601             : 
     602             :     public:
     603             :       typedef bool                                      value_type;
     604             :       typedef size_t                                    size_type;
     605             :       typedef ptrdiff_t                                 difference_type;
     606             :       typedef _Bit_reference                            reference;
     607             :       typedef bool                                      const_reference;
     608             :       typedef _Bit_reference*                           pointer;
     609             :       typedef const bool*                               const_pointer;
     610             :       typedef _Bit_iterator                             iterator;
     611             :       typedef _Bit_const_iterator                       const_iterator;
     612             :       typedef std::reverse_iterator<const_iterator>       const_reverse_iterator;
     613             :       typedef std::reverse_iterator<iterator>             reverse_iterator;
     614             :       typedef _Alloc                                    allocator_type;
     615             : 
     616             :       allocator_type
     617             :       get_allocator() const
     618             :       { return _Base::get_allocator(); }
     619             : 
     620             :     protected:
     621             :       using _Base::_M_allocate;
     622             :       using _Base::_M_deallocate;
     623             :       using _Base::_S_nword;
     624             :       using _Base::_M_get_Bit_allocator;
     625             : 
     626             :     public:
     627             : #if __cplusplus >= 201103L
     628    16338762 :       vector() = default;
     629             : #else
     630             :       vector() { }
     631             : #endif
     632             : 
     633             :       explicit
     634             :       vector(const allocator_type& __a)
     635             :       : _Base(__a) { }
     636             : 
     637             : #if __cplusplus >= 201103L
     638             :       explicit
     639           0 :       vector(size_type __n, const allocator_type& __a = allocator_type())
     640           0 :       : vector(__n, false, __a)
     641             :       { }
     642             : 
     643    25209700 :       vector(size_type __n, const bool& __value,
     644             :              const allocator_type& __a = allocator_type())
     645             : #else
     646             :       explicit
     647             :       vector(size_type __n, const bool& __value = bool(),
     648             :              const allocator_type& __a = allocator_type())
     649             : #endif
     650    25209700 :       : _Base(__a)
     651             :       {
     652    25209700 :         _M_initialize(__n);
     653    25209700 :         _M_initialize_value(__value);
     654    25209700 :       }
     655             : 
     656          40 :       vector(const vector& __x)
     657          40 :       : _Base(_Bit_alloc_traits::_S_select_on_copy(__x._M_get_Bit_allocator()))
     658             :       {
     659          40 :         _M_initialize(__x.size());
     660          40 :         _M_copy_aligned(__x.begin(), __x.end(), this->_M_impl._M_start);
     661          40 :       }
     662             : 
     663             : #if __cplusplus >= 201103L
     664           0 :       vector(vector&&) = default;
     665             : 
     666             :       vector(vector&& __x, const allocator_type& __a)
     667             :       noexcept(_Bit_alloc_traits::_S_always_equal())
     668             :       : _Base(__a)
     669             :       {
     670             :         if (__x.get_allocator() == __a)
     671             :           this->_M_move_data(std::move(__x));
     672             :         else
     673             :           {
     674             :             _M_initialize(__x.size());
     675             :             _M_copy_aligned(__x.begin(), __x.end(), begin());
     676             :             __x.clear();
     677             :           }
     678             :       }
     679             : 
     680             :       vector(const vector& __x, const allocator_type& __a)
     681             :       : _Base(__a)
     682             :       {
     683             :         _M_initialize(__x.size());
     684             :         _M_copy_aligned(__x.begin(), __x.end(), this->_M_impl._M_start);
     685             :       }
     686             : 
     687             :       vector(initializer_list<bool> __l,
     688             :              const allocator_type& __a = allocator_type())
     689             :       : _Base(__a)
     690             :       {
     691             :         _M_initialize_range(__l.begin(), __l.end(),
     692             :                             random_access_iterator_tag());
     693             :       }
     694             : #endif
     695             : 
     696             : #if __cplusplus >= 201103L
     697             :       template<typename _InputIterator,
     698             :                typename = std::_RequireInputIter<_InputIterator>>
     699             :         vector(_InputIterator __first, _InputIterator __last,
     700             :                const allocator_type& __a = allocator_type())
     701             :         : _Base(__a)
     702             :         { _M_initialize_dispatch(__first, __last, __false_type()); }
     703             : #else
     704             :       template<typename _InputIterator>
     705             :         vector(_InputIterator __first, _InputIterator __last,
     706             :                const allocator_type& __a = allocator_type())
     707             :         : _Base(__a)
     708             :         {
     709             :           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
     710             :           _M_initialize_dispatch(__first, __last, _Integral());
     711             :         }
     712             : #endif
     713             : 
     714    25437621 :       ~vector() _GLIBCXX_NOEXCEPT { }
     715             : 
     716             :       vector&
     717     2021210 :       operator=(const vector& __x)
     718             :       {
     719     2021210 :         if (&__x == this)
     720             :           return *this;
     721             : #if __cplusplus >= 201103L
     722             :         if (_Bit_alloc_traits::_S_propagate_on_copy_assign())
     723             :           {
     724             :             if (this->_M_get_Bit_allocator() != __x._M_get_Bit_allocator())
     725             :               {
     726             :                 this->_M_deallocate();
     727             :                 std::__alloc_on_copy(_M_get_Bit_allocator(),
     728             :                                      __x._M_get_Bit_allocator());
     729             :                 _M_initialize(__x.size());
     730             :               }
     731             :             else
     732             :               std::__alloc_on_copy(_M_get_Bit_allocator(),
     733             :                                    __x._M_get_Bit_allocator());
     734             :           }
     735             : #endif
     736     4042420 :         if (__x.size() > capacity())
     737             :           {
     738     1832060 :             this->_M_deallocate();
     739     1832060 :             _M_initialize(__x.size());
     740             :           }
     741     4042420 :         this->_M_impl._M_finish = _M_copy_aligned(__x.begin(), __x.end(),
     742             :                                                   begin());
     743     2021210 :         return *this;
     744             :       }
     745             : 
     746             : #if __cplusplus >= 201103L
     747             :       vector&
     748    19026981 :       operator=(vector&& __x) noexcept(_Bit_alloc_traits::_S_nothrow_move())
     749             :       {
     750             :         if (_Bit_alloc_traits::_S_propagate_on_move_assign()
     751             :             || this->_M_get_Bit_allocator() == __x._M_get_Bit_allocator())
     752             :           {
     753    19026981 :             this->_M_deallocate();
     754    19026981 :             this->_M_move_data(std::move(__x));
     755    19026981 :             std::__alloc_on_move(_M_get_Bit_allocator(),
     756             :                                  __x._M_get_Bit_allocator());
     757             :           }
     758             :         else
     759             :           {
     760             :             if (__x.size() > capacity())
     761             :               {
     762             :                 this->_M_deallocate();
     763             :                 _M_initialize(__x.size());
     764             :               }
     765             :             this->_M_impl._M_finish = _M_copy_aligned(__x.begin(), __x.end(),
     766             :                                                       begin());
     767             :             __x.clear();
     768             :           }
     769             :         return *this;
     770             :       }
     771             : 
     772             :       vector&
     773             :       operator=(initializer_list<bool> __l)
     774             :       {
     775             :         this->assign (__l.begin(), __l.end());
     776             :         return *this;
     777             :       }
     778             : #endif
     779             : 
     780             :       // assign(), a generalized assignment member function.  Two
     781             :       // versions: one that takes a count, and one that takes a range.
     782             :       // The range version is a member template, so we dispatch on whether
     783             :       // or not the type is an integer.
     784             :       void
     785             :       assign(size_type __n, const bool& __x)
     786             :       { _M_fill_assign(__n, __x); }
     787             : 
     788             : #if __cplusplus >= 201103L
     789             :       template<typename _InputIterator,
     790             :                typename = std::_RequireInputIter<_InputIterator>>
     791             :         void
     792             :         assign(_InputIterator __first, _InputIterator __last)
     793             :         { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
     794             : #else
     795             :       template<typename _InputIterator>
     796             :         void
     797             :         assign(_InputIterator __first, _InputIterator __last)
     798             :         {
     799             :           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
     800             :           _M_assign_dispatch(__first, __last, _Integral());
     801             :         }
     802             : #endif
     803             : 
     804             : #if __cplusplus >= 201103L
     805             :       void
     806             :       assign(initializer_list<bool> __l)
     807             :       { _M_assign_aux(__l.begin(), __l.end(), random_access_iterator_tag()); }
     808             : #endif
     809             : 
     810             :       iterator
     811    15102760 :       begin() _GLIBCXX_NOEXCEPT
     812     1852850 :       { return iterator(this->_M_impl._M_start._M_p, 0); }
     813             : 
     814             :       const_iterator
     815   102546677 :       begin() const _GLIBCXX_NOEXCEPT
     816   102546677 :       { return const_iterator(this->_M_impl._M_start._M_p, 0); }
     817             : 
     818             :       iterator
     819    14553620 :       end() _GLIBCXX_NOEXCEPT
     820     7467180 :       { return this->_M_impl._M_finish; }
     821             : 
     822             :       const_iterator
     823   108343080 :       end() const _GLIBCXX_NOEXCEPT
     824     7840870 :       { return this->_M_impl._M_finish; }
     825             : 
     826             :       reverse_iterator
     827             :       rbegin() _GLIBCXX_NOEXCEPT
     828             :       { return reverse_iterator(end()); }
     829             : 
     830             :       const_reverse_iterator
     831             :       rbegin() const _GLIBCXX_NOEXCEPT
     832             :       { return const_reverse_iterator(end()); }
     833             : 
     834             :       reverse_iterator
     835             :       rend() _GLIBCXX_NOEXCEPT
     836             :       { return reverse_iterator(begin()); }
     837             : 
     838             :       const_reverse_iterator
     839             :       rend() const _GLIBCXX_NOEXCEPT
     840             :       { return const_reverse_iterator(begin()); }
     841             : 
     842             : #if __cplusplus >= 201103L
     843             :       const_iterator
     844           0 :       cbegin() const noexcept
     845           0 :       { return const_iterator(this->_M_impl._M_start._M_p, 0); }
     846             : 
     847             :       const_iterator
     848             :       cend() const noexcept
     849             :       { return this->_M_impl._M_finish; }
     850             : 
     851             :       const_reverse_iterator
     852             :       crbegin() const noexcept
     853             :       { return const_reverse_iterator(end()); }
     854             : 
     855             :       const_reverse_iterator
     856             :       crend() const noexcept
     857             :       { return const_reverse_iterator(begin()); }
     858             : #endif
     859             : 
     860             :       size_type
     861   100502427 :       size() const _GLIBCXX_NOEXCEPT
     862    92943527 :       { return size_type(end() - begin()); }
     863             : 
     864             :       size_type
     865     3705700 :       max_size() const _GLIBCXX_NOEXCEPT
     866             :       {
     867     5558560 :         const size_type __isize =
     868             :           __gnu_cxx::__numeric_traits<difference_type>::__max
     869             :           - int(_S_word_bit) + 1;
     870             :         const size_type __asize
     871     5558560 :           = _Bit_alloc_traits::max_size(_M_get_Bit_allocator());
     872             :         return (__asize <= __isize / int(_S_word_bit)
     873             :                 ? __asize * int(_S_word_bit) : __isize);
     874             :       }
     875             : 
     876             :       size_type
     877     2021210 :       capacity() const _GLIBCXX_NOEXCEPT
     878             :       { return size_type(const_iterator(this->_M_impl._M_end_addr(), 0)
     879     2210370 :                          - begin()); }
     880             : 
     881             :       bool
     882             :       empty() const _GLIBCXX_NOEXCEPT
     883             :       { return begin() == end(); }
     884             : 
     885             :       reference
     886    46551300 :       operator[](size_type __n)
     887             :       {
     888    46551300 :         return *iterator(this->_M_impl._M_start._M_p
     889    34342800 :                          + __n / int(_S_word_bit), __n % int(_S_word_bit));
     890             :       }
     891             : 
     892             :       const_reference
     893    36880600 :       operator[](size_type __n) const
     894             :       {
     895    36880600 :         return *const_iterator(this->_M_impl._M_start._M_p
     896     5003390 :                              + __n / int(_S_word_bit), __n % int(_S_word_bit));
     897             :       }
     898             : 
     899             :     protected:
     900             :       void
     901             :       _M_range_check(size_type __n) const
     902             :       {
     903             :         if (__n >= this->size())
     904             :           __throw_out_of_range_fmt(__N("vector<bool>::_M_range_check: __n "
     905             :                                        "(which is %zu) >= this->size() "
     906             :                                        "(which is %zu)"),
     907             :                                    __n, this->size());
     908             :       }
     909             : 
     910             :     public:
     911             :       reference
     912             :       at(size_type __n)
     913             :       { _M_range_check(__n); return (*this)[__n]; }
     914             : 
     915             :       const_reference
     916             :       at(size_type __n) const
     917             :       { _M_range_check(__n); return (*this)[__n]; }
     918             : 
     919             :       void
     920             :       reserve(size_type __n)
     921             :       {
     922             :         if (__n > max_size())
     923             :           __throw_length_error(__N("vector::reserve"));
     924             :         if (capacity() < __n)
     925             :           _M_reallocate(__n);
     926             :       }
     927             : 
     928             :       reference
     929             :       front()
     930             :       { return *begin(); }
     931             : 
     932             :       const_reference
     933             :       front() const
     934             :       { return *begin(); }
     935             : 
     936             :       reference
     937             :       back()
     938             :       { return *(end() - 1); }
     939             : 
     940             :       const_reference
     941             :       back() const
     942             :       { return *(end() - 1); }
     943             : 
     944             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
     945             :       // DR 464. Suggestion for new member functions in standard containers.
     946             :       // N.B. DR 464 says nothing about vector<bool> but we need something
     947             :       // here due to the way we are implementing DR 464 in the debug-mode
     948             :       // vector class.
     949             :       void
     950             :       data() _GLIBCXX_NOEXCEPT { }
     951             : 
     952             :       void
     953    93098400 :       push_back(bool __x)
     954             :       {
     955   184534000 :         if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
     956   182872000 :           *this->_M_impl._M_finish++ = __x;
     957             :         else
     958     1662470 :           _M_insert_aux(end(), __x);
     959    93098400 :       }
     960             : 
     961             :       void
     962             :       swap(vector& __x) _GLIBCXX_NOEXCEPT
     963             :       {
     964             :         std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
     965             :         std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
     966             :         std::swap(this->_M_impl._M_end_of_storage,
     967             :                   __x._M_impl._M_end_of_storage);
     968             :         _Bit_alloc_traits::_S_on_swap(_M_get_Bit_allocator(),
     969             :                                       __x._M_get_Bit_allocator());
     970             :       }
     971             : 
     972             :       // [23.2.5]/1, third-to-last entry in synopsis listing
     973             :       static void
     974             :       swap(reference __x, reference __y) _GLIBCXX_NOEXCEPT
     975             :       {
     976             :         bool __tmp = __x;
     977             :         __x = __y;
     978             :         __y = __tmp;
     979             :       }
     980             : 
     981             :       iterator
     982             : #if __cplusplus >= 201103L
     983     5614330 :       insert(const_iterator __position, const bool& __x = bool())
     984             : #else
     985             :       insert(iterator __position, const bool& __x = bool())
     986             : #endif
     987             :       {
     988     5614330 :         const difference_type __n = __position - begin();
     989     5614330 :         if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr()
     990     5614330 :             && __position == end())
     991    10847900 :           *this->_M_impl._M_finish++ = __x;
     992             :         else
     993      190381 :           _M_insert_aux(__position._M_const_cast(), __x);
     994     5614330 :         return begin() + __n;
     995             :       }
     996             : 
     997             : #if __cplusplus >= 201103L
     998             :       template<typename _InputIterator,
     999             :                typename = std::_RequireInputIter<_InputIterator>>
    1000             :         iterator
    1001             :         insert(const_iterator __position,
    1002             :                _InputIterator __first, _InputIterator __last)
    1003             :         {
    1004             :           difference_type __offset = __position - cbegin();
    1005             :           _M_insert_dispatch(__position._M_const_cast(),
    1006             :                              __first, __last, __false_type());
    1007             :           return begin() + __offset;
    1008             :         }
    1009             : #else
    1010             :       template<typename _InputIterator>
    1011             :         void
    1012             :         insert(iterator __position,
    1013             :                _InputIterator __first, _InputIterator __last)
    1014             :         {
    1015             :           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
    1016             :           _M_insert_dispatch(__position, __first, __last, _Integral());
    1017             :         }
    1018             : #endif
    1019             : 
    1020             : #if __cplusplus >= 201103L
    1021             :       iterator
    1022           0 :       insert(const_iterator __position, size_type __n, const bool& __x)
    1023             :       {
    1024           0 :         difference_type __offset = __position - cbegin();
    1025           0 :         _M_fill_insert(__position._M_const_cast(), __n, __x);
    1026           0 :         return begin() + __offset;
    1027             :       }
    1028             : #else
    1029             :       void
    1030             :       insert(iterator __position, size_type __n, const bool& __x)
    1031             :       { _M_fill_insert(__position, __n, __x); }
    1032             : #endif
    1033             : 
    1034             : #if __cplusplus >= 201103L
    1035             :       iterator
    1036             :       insert(const_iterator __p, initializer_list<bool> __l)
    1037             :       { return this->insert(__p, __l.begin(), __l.end()); }
    1038             : #endif
    1039             : 
    1040             :       void
    1041             :       pop_back()
    1042             :       { --this->_M_impl._M_finish; }
    1043             : 
    1044             :       iterator
    1045             : #if __cplusplus >= 201103L
    1046             :       erase(const_iterator __position)
    1047             : #else
    1048             :       erase(iterator __position)
    1049             : #endif
    1050             :       { return _M_erase(__position._M_const_cast()); }
    1051             : 
    1052             :       iterator
    1053             : #if __cplusplus >= 201103L
    1054             :       erase(const_iterator __first, const_iterator __last)
    1055             : #else
    1056             :       erase(iterator __first, iterator __last)
    1057             : #endif
    1058             :       { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
    1059             : 
    1060             :       void
    1061           0 :       resize(size_type __new_size, bool __x = bool())
    1062             :       {
    1063           0 :         if (__new_size < size())
    1064           0 :           _M_erase_at_end(begin() + difference_type(__new_size));
    1065             :         else
    1066           0 :           insert(end(), __new_size - size(), __x);
    1067           0 :       }
    1068             : 
    1069             : #if __cplusplus >= 201103L
    1070             :       void
    1071             :       shrink_to_fit()
    1072             :       { _M_shrink_to_fit(); }
    1073             : #endif
    1074             : 
    1075             :       void
    1076             :       flip() _GLIBCXX_NOEXCEPT
    1077             :       {
    1078             :         _Bit_type * const __end = this->_M_impl._M_end_addr();
    1079             :         for (_Bit_type * __p = this->_M_impl._M_start._M_p; __p != __end; ++__p)
    1080             :           *__p = ~*__p;
    1081             :       }
    1082             : 
    1083             :       void
    1084             :       clear() _GLIBCXX_NOEXCEPT
    1085             :       { _M_erase_at_end(begin()); }
    1086             : 
    1087             : #if __cplusplus >= 201103L
    1088             :       template<typename... _Args>
    1089             : #if __cplusplus > 201402L
    1090             :         reference
    1091             : #else
    1092             :         void
    1093             : #endif
    1094             :         emplace_back(_Args&&... __args)
    1095             :         {
    1096             :           push_back(bool(__args...));
    1097             : #if __cplusplus > 201402L
    1098             :           return back();
    1099             : #endif
    1100             :         }
    1101             : 
    1102             :       template<typename... _Args>
    1103             :         iterator
    1104             :         emplace(const_iterator __pos, _Args&&... __args)
    1105             :         { return insert(__pos, bool(__args...)); }
    1106             : #endif
    1107             : 
    1108             :     protected:
    1109             :       // Precondition: __first._M_offset == 0 && __result._M_offset == 0.
    1110             :       iterator
    1111     3874100 :       _M_copy_aligned(const_iterator __first, const_iterator __last,
    1112             :                       iterator __result)
    1113             :       {
    1114     3874100 :         _Bit_type* __q = std::copy(__first._M_p, __last._M_p, __result._M_p);
    1115     3874100 :         return std::copy(const_iterator(__last._M_p, 0), __last,
    1116     3874100 :                          iterator(__q, 0));
    1117             :       }
    1118             : 
    1119             :       void
    1120    27041740 :       _M_initialize(size_type __n)
    1121             :       {
    1122    27041740 :         if (__n)
    1123             :           {
    1124    27041740 :             _Bit_pointer __q = this->_M_allocate(__n);
    1125    27041740 :             this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
    1126    27041740 :             this->_M_impl._M_start = iterator(std::__addressof(*__q), 0);
    1127             :           }
    1128             :         else
    1129             :           {
    1130           0 :             this->_M_impl._M_end_of_storage = _Bit_pointer();
    1131           0 :             this->_M_impl._M_start = iterator(0, 0);
    1132             :           }
    1133    27041740 :         this->_M_impl._M_finish = this->_M_impl._M_start + difference_type(__n);
    1134             : 
    1135    27041740 :       }
    1136             : 
    1137             :       void
    1138    25209700 :       _M_initialize_value(bool __x)
    1139             :       {
    1140    25209700 :         if (_Bit_type* __p = this->_M_impl._M_start._M_p)
    1141    25209700 :           __builtin_memset(__p, __x ? ~0 : 0,
    1142    50419400 :                            (this->_M_impl._M_end_addr() - __p)
    1143             :                            * sizeof(_Bit_type));
    1144    25209700 :       }
    1145             : 
    1146             :       void
    1147             :       _M_reallocate(size_type __n);
    1148             : 
    1149             : #if __cplusplus >= 201103L
    1150             :       bool
    1151             :       _M_shrink_to_fit();
    1152             : #endif
    1153             : 
    1154             :       // Check whether it's an integral type.  If so, it's not an iterator.
    1155             : 
    1156             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1157             :       // 438. Ambiguity in the "do the right thing" clause
    1158             :       template<typename _Integer>
    1159             :         void
    1160             :         _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
    1161             :         {
    1162             :           _M_initialize(static_cast<size_type>(__n));
    1163             :           _M_initialize_value(__x);
    1164             :         }
    1165             : 
    1166             :       template<typename _InputIterator>
    1167             :         void
    1168             :         _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
    1169             :                                __false_type)
    1170             :         { _M_initialize_range(__first, __last,
    1171             :                               std::__iterator_category(__first)); }
    1172             : 
    1173             :       template<typename _InputIterator>
    1174             :         void
    1175             :         _M_initialize_range(_InputIterator __first, _InputIterator __last,
    1176             :                             std::input_iterator_tag)
    1177             :         {
    1178             :           for (; __first != __last; ++__first)
    1179             :             push_back(*__first);
    1180             :         }
    1181             : 
    1182             :       template<typename _ForwardIterator>
    1183             :         void
    1184             :         _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
    1185             :                             std::forward_iterator_tag)
    1186             :         {
    1187             :           const size_type __n = std::distance(__first, __last);
    1188             :           _M_initialize(__n);
    1189             :           std::copy(__first, __last, this->_M_impl._M_start);
    1190             :         }
    1191             : 
    1192             : #if __cplusplus < 201103L
    1193             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1194             :       // 438. Ambiguity in the "do the right thing" clause
    1195             :       template<typename _Integer>
    1196             :         void
    1197             :         _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
    1198             :         { _M_fill_assign(__n, __val); }
    1199             : 
    1200             :       template<class _InputIterator>
    1201             :         void
    1202             :         _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
    1203             :                            __false_type)
    1204             :         { _M_assign_aux(__first, __last, std::__iterator_category(__first)); }
    1205             : #endif
    1206             : 
    1207             :       void
    1208             :       _M_fill_assign(size_t __n, bool __x)
    1209             :       {
    1210             :         if (__n > size())
    1211             :           {
    1212             :             _M_initialize_value(__x);
    1213             :             insert(end(), __n - size(), __x);
    1214             :           }
    1215             :         else
    1216             :           {
    1217             :             _M_erase_at_end(begin() + __n);
    1218             :             _M_initialize_value(__x);
    1219             :           }
    1220             :       }
    1221             : 
    1222             :       template<typename _InputIterator>
    1223             :         void
    1224             :         _M_assign_aux(_InputIterator __first, _InputIterator __last,
    1225             :                       std::input_iterator_tag)
    1226             :         {
    1227             :           iterator __cur = begin();
    1228             :           for (; __first != __last && __cur != end(); ++__cur, (void)++__first)
    1229             :             *__cur = *__first;
    1230             :           if (__first == __last)
    1231             :             _M_erase_at_end(__cur);
    1232             :           else
    1233             :             insert(end(), __first, __last);
    1234             :         }
    1235             : 
    1236             :       template<typename _ForwardIterator>
    1237             :         void
    1238             :         _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
    1239             :                       std::forward_iterator_tag)
    1240             :         {
    1241             :           const size_type __len = std::distance(__first, __last);
    1242             :           if (__len < size())
    1243             :             _M_erase_at_end(std::copy(__first, __last, begin()));
    1244             :           else
    1245             :             {
    1246             :               _ForwardIterator __mid = __first;
    1247             :               std::advance(__mid, size());
    1248             :               std::copy(__first, __mid, begin());
    1249             :               insert(end(), __mid, __last);
    1250             :             }
    1251             :         }
    1252             : 
    1253             :       // Check whether it's an integral type.  If so, it's not an iterator.
    1254             : 
    1255             :       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    1256             :       // 438. Ambiguity in the "do the right thing" clause
    1257             :       template<typename _Integer>
    1258             :         void
    1259             :         _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
    1260             :                            __true_type)
    1261             :         { _M_fill_insert(__pos, __n, __x); }
    1262             : 
    1263             :       template<typename _InputIterator>
    1264             :         void
    1265             :         _M_insert_dispatch(iterator __pos,
    1266             :                            _InputIterator __first, _InputIterator __last,
    1267             :                            __false_type)
    1268             :         { _M_insert_range(__pos, __first, __last,
    1269             :                           std::__iterator_category(__first)); }
    1270             : 
    1271             :       void
    1272             :       _M_fill_insert(iterator __position, size_type __n, bool __x);
    1273             : 
    1274             :       template<typename _InputIterator>
    1275             :         void
    1276             :         _M_insert_range(iterator __pos, _InputIterator __first,
    1277             :                         _InputIterator __last, std::input_iterator_tag)
    1278             :         {
    1279             :           for (; __first != __last; ++__first)
    1280             :             {
    1281             :               __pos = insert(__pos, *__first);
    1282             :               ++__pos;
    1283             :             }
    1284             :         }
    1285             : 
    1286             :       template<typename _ForwardIterator>
    1287             :         void
    1288             :         _M_insert_range(iterator __position, _ForwardIterator __first,
    1289             :                         _ForwardIterator __last, std::forward_iterator_tag);
    1290             : 
    1291             :       void
    1292             :       _M_insert_aux(iterator __position, bool __x);
    1293             : 
    1294             :       size_type
    1295     1852850 :       _M_check_len(size_type __n, const char* __s) const
    1296             :       {
    1297     1852850 :         if (max_size() - size() < __n)
    1298           0 :           __throw_length_error(__N(__s));
    1299             : 
    1300     1852850 :         const size_type __len = size() + std::max(size(), __n);
    1301     1852850 :         return (__len < size() || __len > max_size()) ? max_size() : __len;
    1302             :       }
    1303             : 
    1304             :       void
    1305           0 :       _M_erase_at_end(iterator __pos)
    1306           0 :       { this->_M_impl._M_finish = __pos; }
    1307             : 
    1308             :       iterator
    1309             :       _M_erase(iterator __pos);
    1310             : 
    1311             :       iterator
    1312             :       _M_erase(iterator __first, iterator __last);
    1313             :   };
    1314             : 
    1315             : _GLIBCXX_END_NAMESPACE_CONTAINER
    1316             : _GLIBCXX_END_NAMESPACE_VERSION
    1317             : } // namespace std
    1318             : 
    1319             : #if __cplusplus >= 201103L
    1320             : 
    1321             : namespace std _GLIBCXX_VISIBILITY(default)
    1322             : {
    1323             : _GLIBCXX_BEGIN_NAMESPACE_VERSION
    1324             : 
    1325             :   // DR 1182.
    1326             :   /// std::hash specialization for vector<bool>.
    1327             :   template<typename _Alloc>
    1328             :     struct hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>
    1329             :     : public __hash_base<size_t, _GLIBCXX_STD_C::vector<bool, _Alloc>>
    1330             :     {
    1331             :       size_t
    1332             :       operator()(const _GLIBCXX_STD_C::vector<bool, _Alloc>&) const noexcept;
    1333             :     };
    1334             : 
    1335             : _GLIBCXX_END_NAMESPACE_VERSION
    1336             : }// namespace std
    1337             : 
    1338             : #endif // C++11
    1339             : 
    1340             : #endif

Generated by: LCOV version 1.14