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