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