110d565efSmrg// <bitset> -*- C++ -*- 210d565efSmrg 3*ec02198aSmrg// Copyright (C) 2001-2020 Free Software Foundation, Inc. 410d565efSmrg// 510d565efSmrg// This file is part of the GNU ISO C++ Library. This library is free 610d565efSmrg// software; you can redistribute it and/or modify it under the 710d565efSmrg// terms of the GNU General Public License as published by the 810d565efSmrg// Free Software Foundation; either version 3, or (at your option) 910d565efSmrg// any later version. 1010d565efSmrg 1110d565efSmrg// This library is distributed in the hope that it will be useful, 1210d565efSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 1310d565efSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1410d565efSmrg// GNU General Public License for more details. 1510d565efSmrg 1610d565efSmrg// Under Section 7 of GPL version 3, you are granted additional 1710d565efSmrg// permissions described in the GCC Runtime Library Exception, version 1810d565efSmrg// 3.1, as published by the Free Software Foundation. 1910d565efSmrg 2010d565efSmrg// You should have received a copy of the GNU General Public License and 2110d565efSmrg// a copy of the GCC Runtime Library Exception along with this program; 2210d565efSmrg// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2310d565efSmrg// <http://www.gnu.org/licenses/>. 2410d565efSmrg 2510d565efSmrg/* 2610d565efSmrg * Copyright (c) 1998 2710d565efSmrg * Silicon Graphics Computer Systems, Inc. 2810d565efSmrg * 2910d565efSmrg * Permission to use, copy, modify, distribute and sell this software 3010d565efSmrg * and its documentation for any purpose is hereby granted without fee, 3110d565efSmrg * provided that the above copyright notice appear in all copies and 3210d565efSmrg * that both that copyright notice and this permission notice appear 3310d565efSmrg * in supporting documentation. Silicon Graphics makes no 3410d565efSmrg * representations about the suitability of this software for any 3510d565efSmrg * purpose. It is provided "as is" without express or implied warranty. 3610d565efSmrg */ 3710d565efSmrg 3810d565efSmrg/** @file include/bitset 3910d565efSmrg * This is a Standard C++ Library header. 4010d565efSmrg */ 4110d565efSmrg 4210d565efSmrg#ifndef _GLIBCXX_BITSET 4310d565efSmrg#define _GLIBCXX_BITSET 1 4410d565efSmrg 4510d565efSmrg#pragma GCC system_header 4610d565efSmrg 4710d565efSmrg#include <string> 4810d565efSmrg#include <bits/functexcept.h> // For invalid_argument, out_of_range, 4910d565efSmrg // overflow_error 5010d565efSmrg#include <iosfwd> 5110d565efSmrg#include <bits/cxxabi_forced.h> 5210d565efSmrg 53c7a68eb7Smrg#if __cplusplus >= 201103L 54c7a68eb7Smrg# include <bits/functional_hash.h> 55c7a68eb7Smrg#endif 56c7a68eb7Smrg 5710d565efSmrg#define _GLIBCXX_BITSET_BITS_PER_WORD (__CHAR_BIT__ * __SIZEOF_LONG__) 5810d565efSmrg#define _GLIBCXX_BITSET_WORDS(__n) \ 5910d565efSmrg ((__n) / _GLIBCXX_BITSET_BITS_PER_WORD + \ 6010d565efSmrg ((__n) % _GLIBCXX_BITSET_BITS_PER_WORD == 0 ? 0 : 1)) 6110d565efSmrg 6210d565efSmrg#define _GLIBCXX_BITSET_BITS_PER_ULL (__CHAR_BIT__ * __SIZEOF_LONG_LONG__) 6310d565efSmrg 6410d565efSmrgnamespace std _GLIBCXX_VISIBILITY(default) 6510d565efSmrg{ 6610d565efSmrg_GLIBCXX_BEGIN_NAMESPACE_CONTAINER 6710d565efSmrg 6810d565efSmrg /** 6910d565efSmrg * Base class, general case. It is a class invariant that _Nw will be 7010d565efSmrg * nonnegative. 7110d565efSmrg * 7210d565efSmrg * See documentation for bitset. 7310d565efSmrg */ 7410d565efSmrg template<size_t _Nw> 7510d565efSmrg struct _Base_bitset 7610d565efSmrg { 7710d565efSmrg typedef unsigned long _WordT; 7810d565efSmrg 7910d565efSmrg /// 0 is the least significant word. 8010d565efSmrg _WordT _M_w[_Nw]; 8110d565efSmrg 8210d565efSmrg _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT 8310d565efSmrg : _M_w() { } 8410d565efSmrg 8510d565efSmrg#if __cplusplus >= 201103L 8610d565efSmrg constexpr _Base_bitset(unsigned long long __val) noexcept 8710d565efSmrg : _M_w{ _WordT(__val) 8810d565efSmrg#if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__ 8910d565efSmrg , _WordT(__val >> _GLIBCXX_BITSET_BITS_PER_WORD) 9010d565efSmrg#endif 9110d565efSmrg } { } 9210d565efSmrg#else 9310d565efSmrg _Base_bitset(unsigned long __val) 9410d565efSmrg : _M_w() 9510d565efSmrg { _M_w[0] = __val; } 9610d565efSmrg#endif 9710d565efSmrg 9810d565efSmrg static _GLIBCXX_CONSTEXPR size_t 9910d565efSmrg _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT 10010d565efSmrg { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; } 10110d565efSmrg 10210d565efSmrg static _GLIBCXX_CONSTEXPR size_t 10310d565efSmrg _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT 10410d565efSmrg { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; } 10510d565efSmrg 10610d565efSmrg static _GLIBCXX_CONSTEXPR size_t 10710d565efSmrg _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT 10810d565efSmrg { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; } 10910d565efSmrg 11010d565efSmrg static _GLIBCXX_CONSTEXPR _WordT 11110d565efSmrg _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT 11210d565efSmrg { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } 11310d565efSmrg 11410d565efSmrg _WordT& 11510d565efSmrg _M_getword(size_t __pos) _GLIBCXX_NOEXCEPT 11610d565efSmrg { return _M_w[_S_whichword(__pos)]; } 11710d565efSmrg 11810d565efSmrg _GLIBCXX_CONSTEXPR _WordT 11910d565efSmrg _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT 12010d565efSmrg { return _M_w[_S_whichword(__pos)]; } 12110d565efSmrg 12210d565efSmrg#if __cplusplus >= 201103L 12310d565efSmrg const _WordT* 12410d565efSmrg _M_getdata() const noexcept 12510d565efSmrg { return _M_w; } 12610d565efSmrg#endif 12710d565efSmrg 12810d565efSmrg _WordT& 12910d565efSmrg _M_hiword() _GLIBCXX_NOEXCEPT 13010d565efSmrg { return _M_w[_Nw - 1]; } 13110d565efSmrg 13210d565efSmrg _GLIBCXX_CONSTEXPR _WordT 13310d565efSmrg _M_hiword() const _GLIBCXX_NOEXCEPT 13410d565efSmrg { return _M_w[_Nw - 1]; } 13510d565efSmrg 13610d565efSmrg void 13710d565efSmrg _M_do_and(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT 13810d565efSmrg { 13910d565efSmrg for (size_t __i = 0; __i < _Nw; __i++) 14010d565efSmrg _M_w[__i] &= __x._M_w[__i]; 14110d565efSmrg } 14210d565efSmrg 14310d565efSmrg void 14410d565efSmrg _M_do_or(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT 14510d565efSmrg { 14610d565efSmrg for (size_t __i = 0; __i < _Nw; __i++) 14710d565efSmrg _M_w[__i] |= __x._M_w[__i]; 14810d565efSmrg } 14910d565efSmrg 15010d565efSmrg void 15110d565efSmrg _M_do_xor(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT 15210d565efSmrg { 15310d565efSmrg for (size_t __i = 0; __i < _Nw; __i++) 15410d565efSmrg _M_w[__i] ^= __x._M_w[__i]; 15510d565efSmrg } 15610d565efSmrg 15710d565efSmrg void 15810d565efSmrg _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT; 15910d565efSmrg 16010d565efSmrg void 16110d565efSmrg _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT; 16210d565efSmrg 16310d565efSmrg void 16410d565efSmrg _M_do_flip() _GLIBCXX_NOEXCEPT 16510d565efSmrg { 16610d565efSmrg for (size_t __i = 0; __i < _Nw; __i++) 16710d565efSmrg _M_w[__i] = ~_M_w[__i]; 16810d565efSmrg } 16910d565efSmrg 17010d565efSmrg void 17110d565efSmrg _M_do_set() _GLIBCXX_NOEXCEPT 17210d565efSmrg { 17310d565efSmrg for (size_t __i = 0; __i < _Nw; __i++) 17410d565efSmrg _M_w[__i] = ~static_cast<_WordT>(0); 17510d565efSmrg } 17610d565efSmrg 17710d565efSmrg void 17810d565efSmrg _M_do_reset() _GLIBCXX_NOEXCEPT 17910d565efSmrg { __builtin_memset(_M_w, 0, _Nw * sizeof(_WordT)); } 18010d565efSmrg 18110d565efSmrg bool 18210d565efSmrg _M_is_equal(const _Base_bitset<_Nw>& __x) const _GLIBCXX_NOEXCEPT 18310d565efSmrg { 18410d565efSmrg for (size_t __i = 0; __i < _Nw; ++__i) 18510d565efSmrg if (_M_w[__i] != __x._M_w[__i]) 18610d565efSmrg return false; 18710d565efSmrg return true; 18810d565efSmrg } 18910d565efSmrg 19010d565efSmrg template<size_t _Nb> 19110d565efSmrg bool 19210d565efSmrg _M_are_all() const _GLIBCXX_NOEXCEPT 19310d565efSmrg { 19410d565efSmrg for (size_t __i = 0; __i < _Nw - 1; __i++) 19510d565efSmrg if (_M_w[__i] != ~static_cast<_WordT>(0)) 19610d565efSmrg return false; 19710d565efSmrg return _M_hiword() == (~static_cast<_WordT>(0) 19810d565efSmrg >> (_Nw * _GLIBCXX_BITSET_BITS_PER_WORD 19910d565efSmrg - _Nb)); 20010d565efSmrg } 20110d565efSmrg 20210d565efSmrg bool 20310d565efSmrg _M_is_any() const _GLIBCXX_NOEXCEPT 20410d565efSmrg { 20510d565efSmrg for (size_t __i = 0; __i < _Nw; __i++) 20610d565efSmrg if (_M_w[__i] != static_cast<_WordT>(0)) 20710d565efSmrg return true; 20810d565efSmrg return false; 20910d565efSmrg } 21010d565efSmrg 21110d565efSmrg size_t 21210d565efSmrg _M_do_count() const _GLIBCXX_NOEXCEPT 21310d565efSmrg { 21410d565efSmrg size_t __result = 0; 21510d565efSmrg for (size_t __i = 0; __i < _Nw; __i++) 21610d565efSmrg __result += __builtin_popcountl(_M_w[__i]); 21710d565efSmrg return __result; 21810d565efSmrg } 21910d565efSmrg 22010d565efSmrg unsigned long 22110d565efSmrg _M_do_to_ulong() const; 22210d565efSmrg 22310d565efSmrg#if __cplusplus >= 201103L 22410d565efSmrg unsigned long long 22510d565efSmrg _M_do_to_ullong() const; 22610d565efSmrg#endif 22710d565efSmrg 22810d565efSmrg // find first "on" bit 22910d565efSmrg size_t 23010d565efSmrg _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT; 23110d565efSmrg 23210d565efSmrg // find the next "on" bit that follows "prev" 23310d565efSmrg size_t 23410d565efSmrg _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT; 23510d565efSmrg }; 23610d565efSmrg 23710d565efSmrg // Definitions of non-inline functions from _Base_bitset. 23810d565efSmrg template<size_t _Nw> 23910d565efSmrg void 24010d565efSmrg _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT 24110d565efSmrg { 24210d565efSmrg if (__builtin_expect(__shift != 0, 1)) 24310d565efSmrg { 24410d565efSmrg const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD; 24510d565efSmrg const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD; 24610d565efSmrg 24710d565efSmrg if (__offset == 0) 24810d565efSmrg for (size_t __n = _Nw - 1; __n >= __wshift; --__n) 24910d565efSmrg _M_w[__n] = _M_w[__n - __wshift]; 25010d565efSmrg else 25110d565efSmrg { 25210d565efSmrg const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD 25310d565efSmrg - __offset); 25410d565efSmrg for (size_t __n = _Nw - 1; __n > __wshift; --__n) 25510d565efSmrg _M_w[__n] = ((_M_w[__n - __wshift] << __offset) 25610d565efSmrg | (_M_w[__n - __wshift - 1] >> __sub_offset)); 25710d565efSmrg _M_w[__wshift] = _M_w[0] << __offset; 25810d565efSmrg } 25910d565efSmrg 26010d565efSmrg std::fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0)); 26110d565efSmrg } 26210d565efSmrg } 26310d565efSmrg 26410d565efSmrg template<size_t _Nw> 26510d565efSmrg void 26610d565efSmrg _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT 26710d565efSmrg { 26810d565efSmrg if (__builtin_expect(__shift != 0, 1)) 26910d565efSmrg { 27010d565efSmrg const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD; 27110d565efSmrg const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD; 27210d565efSmrg const size_t __limit = _Nw - __wshift - 1; 27310d565efSmrg 27410d565efSmrg if (__offset == 0) 27510d565efSmrg for (size_t __n = 0; __n <= __limit; ++__n) 27610d565efSmrg _M_w[__n] = _M_w[__n + __wshift]; 27710d565efSmrg else 27810d565efSmrg { 27910d565efSmrg const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD 28010d565efSmrg - __offset); 28110d565efSmrg for (size_t __n = 0; __n < __limit; ++__n) 28210d565efSmrg _M_w[__n] = ((_M_w[__n + __wshift] >> __offset) 28310d565efSmrg | (_M_w[__n + __wshift + 1] << __sub_offset)); 28410d565efSmrg _M_w[__limit] = _M_w[_Nw-1] >> __offset; 28510d565efSmrg } 28610d565efSmrg 28710d565efSmrg std::fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0)); 28810d565efSmrg } 28910d565efSmrg } 29010d565efSmrg 29110d565efSmrg template<size_t _Nw> 29210d565efSmrg unsigned long 29310d565efSmrg _Base_bitset<_Nw>::_M_do_to_ulong() const 29410d565efSmrg { 29510d565efSmrg for (size_t __i = 1; __i < _Nw; ++__i) 29610d565efSmrg if (_M_w[__i]) 29710d565efSmrg __throw_overflow_error(__N("_Base_bitset::_M_do_to_ulong")); 29810d565efSmrg return _M_w[0]; 29910d565efSmrg } 30010d565efSmrg 30110d565efSmrg#if __cplusplus >= 201103L 30210d565efSmrg template<size_t _Nw> 30310d565efSmrg unsigned long long 30410d565efSmrg _Base_bitset<_Nw>::_M_do_to_ullong() const 30510d565efSmrg { 30610d565efSmrg const bool __dw = sizeof(unsigned long long) > sizeof(unsigned long); 30710d565efSmrg for (size_t __i = 1 + __dw; __i < _Nw; ++__i) 30810d565efSmrg if (_M_w[__i]) 30910d565efSmrg __throw_overflow_error(__N("_Base_bitset::_M_do_to_ullong")); 31010d565efSmrg 31110d565efSmrg if (__dw) 31210d565efSmrg return _M_w[0] + (static_cast<unsigned long long>(_M_w[1]) 31310d565efSmrg << _GLIBCXX_BITSET_BITS_PER_WORD); 31410d565efSmrg return _M_w[0]; 31510d565efSmrg } 31610d565efSmrg#endif 31710d565efSmrg 31810d565efSmrg template<size_t _Nw> 31910d565efSmrg size_t 32010d565efSmrg _Base_bitset<_Nw>:: 32110d565efSmrg _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT 32210d565efSmrg { 32310d565efSmrg for (size_t __i = 0; __i < _Nw; __i++) 32410d565efSmrg { 32510d565efSmrg _WordT __thisword = _M_w[__i]; 32610d565efSmrg if (__thisword != static_cast<_WordT>(0)) 32710d565efSmrg return (__i * _GLIBCXX_BITSET_BITS_PER_WORD 32810d565efSmrg + __builtin_ctzl(__thisword)); 32910d565efSmrg } 33010d565efSmrg // not found, so return an indication of failure. 33110d565efSmrg return __not_found; 33210d565efSmrg } 33310d565efSmrg 33410d565efSmrg template<size_t _Nw> 33510d565efSmrg size_t 33610d565efSmrg _Base_bitset<_Nw>:: 33710d565efSmrg _M_do_find_next(size_t __prev, size_t __not_found) const _GLIBCXX_NOEXCEPT 33810d565efSmrg { 33910d565efSmrg // make bound inclusive 34010d565efSmrg ++__prev; 34110d565efSmrg 34210d565efSmrg // check out of bounds 34310d565efSmrg if (__prev >= _Nw * _GLIBCXX_BITSET_BITS_PER_WORD) 34410d565efSmrg return __not_found; 34510d565efSmrg 34610d565efSmrg // search first word 34710d565efSmrg size_t __i = _S_whichword(__prev); 34810d565efSmrg _WordT __thisword = _M_w[__i]; 34910d565efSmrg 35010d565efSmrg // mask off bits below bound 35110d565efSmrg __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev); 35210d565efSmrg 35310d565efSmrg if (__thisword != static_cast<_WordT>(0)) 35410d565efSmrg return (__i * _GLIBCXX_BITSET_BITS_PER_WORD 35510d565efSmrg + __builtin_ctzl(__thisword)); 35610d565efSmrg 35710d565efSmrg // check subsequent words 35810d565efSmrg __i++; 35910d565efSmrg for (; __i < _Nw; __i++) 36010d565efSmrg { 36110d565efSmrg __thisword = _M_w[__i]; 36210d565efSmrg if (__thisword != static_cast<_WordT>(0)) 36310d565efSmrg return (__i * _GLIBCXX_BITSET_BITS_PER_WORD 36410d565efSmrg + __builtin_ctzl(__thisword)); 36510d565efSmrg } 36610d565efSmrg // not found, so return an indication of failure. 36710d565efSmrg return __not_found; 36810d565efSmrg } // end _M_do_find_next 36910d565efSmrg 37010d565efSmrg /** 37110d565efSmrg * Base class, specialization for a single word. 37210d565efSmrg * 37310d565efSmrg * See documentation for bitset. 37410d565efSmrg */ 37510d565efSmrg template<> 37610d565efSmrg struct _Base_bitset<1> 37710d565efSmrg { 37810d565efSmrg typedef unsigned long _WordT; 37910d565efSmrg _WordT _M_w; 38010d565efSmrg 38110d565efSmrg _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT 38210d565efSmrg : _M_w(0) 38310d565efSmrg { } 38410d565efSmrg 38510d565efSmrg#if __cplusplus >= 201103L 38610d565efSmrg constexpr _Base_bitset(unsigned long long __val) noexcept 38710d565efSmrg#else 38810d565efSmrg _Base_bitset(unsigned long __val) 38910d565efSmrg#endif 39010d565efSmrg : _M_w(__val) 39110d565efSmrg { } 39210d565efSmrg 39310d565efSmrg static _GLIBCXX_CONSTEXPR size_t 39410d565efSmrg _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT 39510d565efSmrg { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; } 39610d565efSmrg 39710d565efSmrg static _GLIBCXX_CONSTEXPR size_t 39810d565efSmrg _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT 39910d565efSmrg { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; } 40010d565efSmrg 40110d565efSmrg static _GLIBCXX_CONSTEXPR size_t 40210d565efSmrg _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT 40310d565efSmrg { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; } 40410d565efSmrg 40510d565efSmrg static _GLIBCXX_CONSTEXPR _WordT 40610d565efSmrg _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT 40710d565efSmrg { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } 40810d565efSmrg 40910d565efSmrg _WordT& 41010d565efSmrg _M_getword(size_t) _GLIBCXX_NOEXCEPT 41110d565efSmrg { return _M_w; } 41210d565efSmrg 41310d565efSmrg _GLIBCXX_CONSTEXPR _WordT 41410d565efSmrg _M_getword(size_t) const _GLIBCXX_NOEXCEPT 41510d565efSmrg { return _M_w; } 41610d565efSmrg 41710d565efSmrg#if __cplusplus >= 201103L 41810d565efSmrg const _WordT* 41910d565efSmrg _M_getdata() const noexcept 42010d565efSmrg { return &_M_w; } 42110d565efSmrg#endif 42210d565efSmrg 42310d565efSmrg _WordT& 42410d565efSmrg _M_hiword() _GLIBCXX_NOEXCEPT 42510d565efSmrg { return _M_w; } 42610d565efSmrg 42710d565efSmrg _GLIBCXX_CONSTEXPR _WordT 42810d565efSmrg _M_hiword() const _GLIBCXX_NOEXCEPT 42910d565efSmrg { return _M_w; } 43010d565efSmrg 43110d565efSmrg void 43210d565efSmrg _M_do_and(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT 43310d565efSmrg { _M_w &= __x._M_w; } 43410d565efSmrg 43510d565efSmrg void 43610d565efSmrg _M_do_or(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT 43710d565efSmrg { _M_w |= __x._M_w; } 43810d565efSmrg 43910d565efSmrg void 44010d565efSmrg _M_do_xor(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT 44110d565efSmrg { _M_w ^= __x._M_w; } 44210d565efSmrg 44310d565efSmrg void 44410d565efSmrg _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT 44510d565efSmrg { _M_w <<= __shift; } 44610d565efSmrg 44710d565efSmrg void 44810d565efSmrg _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT 44910d565efSmrg { _M_w >>= __shift; } 45010d565efSmrg 45110d565efSmrg void 45210d565efSmrg _M_do_flip() _GLIBCXX_NOEXCEPT 45310d565efSmrg { _M_w = ~_M_w; } 45410d565efSmrg 45510d565efSmrg void 45610d565efSmrg _M_do_set() _GLIBCXX_NOEXCEPT 45710d565efSmrg { _M_w = ~static_cast<_WordT>(0); } 45810d565efSmrg 45910d565efSmrg void 46010d565efSmrg _M_do_reset() _GLIBCXX_NOEXCEPT 46110d565efSmrg { _M_w = 0; } 46210d565efSmrg 46310d565efSmrg bool 46410d565efSmrg _M_is_equal(const _Base_bitset<1>& __x) const _GLIBCXX_NOEXCEPT 46510d565efSmrg { return _M_w == __x._M_w; } 46610d565efSmrg 46710d565efSmrg template<size_t _Nb> 46810d565efSmrg bool 46910d565efSmrg _M_are_all() const _GLIBCXX_NOEXCEPT 47010d565efSmrg { return _M_w == (~static_cast<_WordT>(0) 47110d565efSmrg >> (_GLIBCXX_BITSET_BITS_PER_WORD - _Nb)); } 47210d565efSmrg 47310d565efSmrg bool 47410d565efSmrg _M_is_any() const _GLIBCXX_NOEXCEPT 47510d565efSmrg { return _M_w != 0; } 47610d565efSmrg 47710d565efSmrg size_t 47810d565efSmrg _M_do_count() const _GLIBCXX_NOEXCEPT 47910d565efSmrg { return __builtin_popcountl(_M_w); } 48010d565efSmrg 48110d565efSmrg unsigned long 48210d565efSmrg _M_do_to_ulong() const _GLIBCXX_NOEXCEPT 48310d565efSmrg { return _M_w; } 48410d565efSmrg 48510d565efSmrg#if __cplusplus >= 201103L 48610d565efSmrg unsigned long long 48710d565efSmrg _M_do_to_ullong() const noexcept 48810d565efSmrg { return _M_w; } 48910d565efSmrg#endif 49010d565efSmrg 49110d565efSmrg size_t 49210d565efSmrg _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT 49310d565efSmrg { 49410d565efSmrg if (_M_w != 0) 49510d565efSmrg return __builtin_ctzl(_M_w); 49610d565efSmrg else 49710d565efSmrg return __not_found; 49810d565efSmrg } 49910d565efSmrg 50010d565efSmrg // find the next "on" bit that follows "prev" 50110d565efSmrg size_t 50210d565efSmrg _M_do_find_next(size_t __prev, size_t __not_found) const 50310d565efSmrg _GLIBCXX_NOEXCEPT 50410d565efSmrg { 50510d565efSmrg ++__prev; 50610d565efSmrg if (__prev >= ((size_t) _GLIBCXX_BITSET_BITS_PER_WORD)) 50710d565efSmrg return __not_found; 50810d565efSmrg 50910d565efSmrg _WordT __x = _M_w >> __prev; 51010d565efSmrg if (__x != 0) 51110d565efSmrg return __builtin_ctzl(__x) + __prev; 51210d565efSmrg else 51310d565efSmrg return __not_found; 51410d565efSmrg } 51510d565efSmrg }; 51610d565efSmrg 51710d565efSmrg /** 51810d565efSmrg * Base class, specialization for no storage (zero-length %bitset). 51910d565efSmrg * 52010d565efSmrg * See documentation for bitset. 52110d565efSmrg */ 52210d565efSmrg template<> 52310d565efSmrg struct _Base_bitset<0> 52410d565efSmrg { 52510d565efSmrg typedef unsigned long _WordT; 52610d565efSmrg 52710d565efSmrg _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT 52810d565efSmrg { } 52910d565efSmrg 53010d565efSmrg#if __cplusplus >= 201103L 53110d565efSmrg constexpr _Base_bitset(unsigned long long) noexcept 53210d565efSmrg#else 53310d565efSmrg _Base_bitset(unsigned long) 53410d565efSmrg#endif 53510d565efSmrg { } 53610d565efSmrg 53710d565efSmrg static _GLIBCXX_CONSTEXPR size_t 53810d565efSmrg _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT 53910d565efSmrg { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; } 54010d565efSmrg 54110d565efSmrg static _GLIBCXX_CONSTEXPR size_t 54210d565efSmrg _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT 54310d565efSmrg { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; } 54410d565efSmrg 54510d565efSmrg static _GLIBCXX_CONSTEXPR size_t 54610d565efSmrg _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT 54710d565efSmrg { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; } 54810d565efSmrg 54910d565efSmrg static _GLIBCXX_CONSTEXPR _WordT 55010d565efSmrg _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT 55110d565efSmrg { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } 55210d565efSmrg 55310d565efSmrg // This would normally give access to the data. The bounds-checking 55410d565efSmrg // in the bitset class will prevent the user from getting this far, 55510d565efSmrg // but (1) it must still return an lvalue to compile, and (2) the 55610d565efSmrg // user might call _Unchecked_set directly, in which case this /needs/ 55710d565efSmrg // to fail. Let's not penalize zero-length users unless they actually 55810d565efSmrg // make an unchecked call; all the memory ugliness is therefore 55910d565efSmrg // localized to this single should-never-get-this-far function. 56010d565efSmrg _WordT& 56110d565efSmrg _M_getword(size_t) _GLIBCXX_NOEXCEPT 56210d565efSmrg { 56310d565efSmrg __throw_out_of_range(__N("_Base_bitset::_M_getword")); 56410d565efSmrg return *new _WordT; 56510d565efSmrg } 56610d565efSmrg 56710d565efSmrg _GLIBCXX_CONSTEXPR _WordT 568c7a68eb7Smrg _M_getword(size_t) const _GLIBCXX_NOEXCEPT 56910d565efSmrg { return 0; } 57010d565efSmrg 57110d565efSmrg _GLIBCXX_CONSTEXPR _WordT 57210d565efSmrg _M_hiword() const _GLIBCXX_NOEXCEPT 57310d565efSmrg { return 0; } 57410d565efSmrg 57510d565efSmrg void 57610d565efSmrg _M_do_and(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT 57710d565efSmrg { } 57810d565efSmrg 57910d565efSmrg void 58010d565efSmrg _M_do_or(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT 58110d565efSmrg { } 58210d565efSmrg 58310d565efSmrg void 58410d565efSmrg _M_do_xor(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT 58510d565efSmrg { } 58610d565efSmrg 58710d565efSmrg void 58810d565efSmrg _M_do_left_shift(size_t) _GLIBCXX_NOEXCEPT 58910d565efSmrg { } 59010d565efSmrg 59110d565efSmrg void 59210d565efSmrg _M_do_right_shift(size_t) _GLIBCXX_NOEXCEPT 59310d565efSmrg { } 59410d565efSmrg 59510d565efSmrg void 59610d565efSmrg _M_do_flip() _GLIBCXX_NOEXCEPT 59710d565efSmrg { } 59810d565efSmrg 59910d565efSmrg void 60010d565efSmrg _M_do_set() _GLIBCXX_NOEXCEPT 60110d565efSmrg { } 60210d565efSmrg 60310d565efSmrg void 60410d565efSmrg _M_do_reset() _GLIBCXX_NOEXCEPT 60510d565efSmrg { } 60610d565efSmrg 60710d565efSmrg // Are all empty bitsets equal to each other? Are they equal to 60810d565efSmrg // themselves? How to compare a thing which has no state? What is 60910d565efSmrg // the sound of one zero-length bitset clapping? 61010d565efSmrg bool 61110d565efSmrg _M_is_equal(const _Base_bitset<0>&) const _GLIBCXX_NOEXCEPT 61210d565efSmrg { return true; } 61310d565efSmrg 61410d565efSmrg template<size_t _Nb> 61510d565efSmrg bool 61610d565efSmrg _M_are_all() const _GLIBCXX_NOEXCEPT 61710d565efSmrg { return true; } 61810d565efSmrg 61910d565efSmrg bool 62010d565efSmrg _M_is_any() const _GLIBCXX_NOEXCEPT 62110d565efSmrg { return false; } 62210d565efSmrg 62310d565efSmrg size_t 62410d565efSmrg _M_do_count() const _GLIBCXX_NOEXCEPT 62510d565efSmrg { return 0; } 62610d565efSmrg 62710d565efSmrg unsigned long 62810d565efSmrg _M_do_to_ulong() const _GLIBCXX_NOEXCEPT 62910d565efSmrg { return 0; } 63010d565efSmrg 63110d565efSmrg#if __cplusplus >= 201103L 63210d565efSmrg unsigned long long 63310d565efSmrg _M_do_to_ullong() const noexcept 63410d565efSmrg { return 0; } 63510d565efSmrg#endif 63610d565efSmrg 63710d565efSmrg // Normally "not found" is the size, but that could also be 63810d565efSmrg // misinterpreted as an index in this corner case. Oh well. 63910d565efSmrg size_t 64010d565efSmrg _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT 64110d565efSmrg { return 0; } 64210d565efSmrg 64310d565efSmrg size_t 64410d565efSmrg _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT 64510d565efSmrg { return 0; } 64610d565efSmrg }; 64710d565efSmrg 64810d565efSmrg 64910d565efSmrg // Helper class to zero out the unused high-order bits in the highest word. 65010d565efSmrg template<size_t _Extrabits> 65110d565efSmrg struct _Sanitize 65210d565efSmrg { 65310d565efSmrg typedef unsigned long _WordT; 65410d565efSmrg 65510d565efSmrg static void 65610d565efSmrg _S_do_sanitize(_WordT& __val) _GLIBCXX_NOEXCEPT 65710d565efSmrg { __val &= ~((~static_cast<_WordT>(0)) << _Extrabits); } 65810d565efSmrg }; 65910d565efSmrg 66010d565efSmrg template<> 66110d565efSmrg struct _Sanitize<0> 66210d565efSmrg { 66310d565efSmrg typedef unsigned long _WordT; 66410d565efSmrg 66510d565efSmrg static void 66610d565efSmrg _S_do_sanitize(_WordT) _GLIBCXX_NOEXCEPT { } 66710d565efSmrg }; 66810d565efSmrg 66910d565efSmrg#if __cplusplus >= 201103L 67010d565efSmrg template<size_t _Nb, bool = (_Nb < _GLIBCXX_BITSET_BITS_PER_ULL)> 67110d565efSmrg struct _Sanitize_val 67210d565efSmrg { 67310d565efSmrg static constexpr unsigned long long 67410d565efSmrg _S_do_sanitize_val(unsigned long long __val) 67510d565efSmrg { return __val; } 67610d565efSmrg }; 67710d565efSmrg 67810d565efSmrg template<size_t _Nb> 67910d565efSmrg struct _Sanitize_val<_Nb, true> 68010d565efSmrg { 68110d565efSmrg static constexpr unsigned long long 68210d565efSmrg _S_do_sanitize_val(unsigned long long __val) 68310d565efSmrg { return __val & ~((~static_cast<unsigned long long>(0)) << _Nb); } 68410d565efSmrg }; 68510d565efSmrg#endif 68610d565efSmrg 68710d565efSmrg /** 68810d565efSmrg * @brief The %bitset class represents a @e fixed-size sequence of bits. 68910d565efSmrg * @ingroup utilities 69010d565efSmrg * 69110d565efSmrg * (Note that %bitset does @e not meet the formal requirements of a 69210d565efSmrg * <a href="tables.html#65">container</a>. Mainly, it lacks iterators.) 69310d565efSmrg * 69410d565efSmrg * The template argument, @a Nb, may be any non-negative number, 69510d565efSmrg * specifying the number of bits (e.g., "0", "12", "1024*1024"). 69610d565efSmrg * 69710d565efSmrg * In the general unoptimized case, storage is allocated in word-sized 69810d565efSmrg * blocks. Let B be the number of bits in a word, then (Nb+(B-1))/B 69910d565efSmrg * words will be used for storage. B - Nb%B bits are unused. (They are 70010d565efSmrg * the high-order bits in the highest word.) It is a class invariant 70110d565efSmrg * that those unused bits are always zero. 70210d565efSmrg * 70310d565efSmrg * If you think of %bitset as <em>a simple array of bits</em>, be 70410d565efSmrg * aware that your mental picture is reversed: a %bitset behaves 70510d565efSmrg * the same way as bits in integers do, with the bit at index 0 in 70610d565efSmrg * the <em>least significant / right-hand</em> position, and the bit at 70710d565efSmrg * index Nb-1 in the <em>most significant / left-hand</em> position. 70810d565efSmrg * Thus, unlike other containers, a %bitset's index <em>counts from 70910d565efSmrg * right to left</em>, to put it very loosely. 71010d565efSmrg * 71110d565efSmrg * This behavior is preserved when translating to and from strings. For 71210d565efSmrg * example, the first line of the following program probably prints 71310d565efSmrg * <em>b('a') is 0001100001</em> on a modern ASCII system. 71410d565efSmrg * 71510d565efSmrg * @code 71610d565efSmrg * #include <bitset> 71710d565efSmrg * #include <iostream> 71810d565efSmrg * #include <sstream> 71910d565efSmrg * 72010d565efSmrg * using namespace std; 72110d565efSmrg * 72210d565efSmrg * int main() 72310d565efSmrg * { 72410d565efSmrg * long a = 'a'; 72510d565efSmrg * bitset<10> b(a); 72610d565efSmrg * 72710d565efSmrg * cout << "b('a') is " << b << endl; 72810d565efSmrg * 72910d565efSmrg * ostringstream s; 73010d565efSmrg * s << b; 73110d565efSmrg * string str = s.str(); 73210d565efSmrg * cout << "index 3 in the string is " << str[3] << " but\n" 73310d565efSmrg * << "index 3 in the bitset is " << b[3] << endl; 73410d565efSmrg * } 73510d565efSmrg * @endcode 73610d565efSmrg * 73710d565efSmrg * Also see: 73810d565efSmrg * https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_containers.html 73910d565efSmrg * for a description of extensions. 74010d565efSmrg * 74110d565efSmrg * Most of the actual code isn't contained in %bitset<> itself, but in the 74210d565efSmrg * base class _Base_bitset. The base class works with whole words, not with 74310d565efSmrg * individual bits. This allows us to specialize _Base_bitset for the 74410d565efSmrg * important special case where the %bitset is only a single word. 74510d565efSmrg * 74610d565efSmrg * Extra confusion can result due to the fact that the storage for 74710d565efSmrg * _Base_bitset @e is a regular array, and is indexed as such. This is 74810d565efSmrg * carefully encapsulated. 74910d565efSmrg */ 75010d565efSmrg template<size_t _Nb> 75110d565efSmrg class bitset 75210d565efSmrg : private _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> 75310d565efSmrg { 75410d565efSmrg private: 75510d565efSmrg typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base; 75610d565efSmrg typedef unsigned long _WordT; 75710d565efSmrg 75810d565efSmrg template<class _CharT, class _Traits, class _Alloc> 75910d565efSmrg void 76010d565efSmrg _M_check_initial_position(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 76110d565efSmrg size_t __position) const 76210d565efSmrg { 76310d565efSmrg if (__position > __s.size()) 76410d565efSmrg __throw_out_of_range_fmt(__N("bitset::bitset: __position " 76510d565efSmrg "(which is %zu) > __s.size() " 76610d565efSmrg "(which is %zu)"), 76710d565efSmrg __position, __s.size()); 76810d565efSmrg } 76910d565efSmrg 77010d565efSmrg void _M_check(size_t __position, const char *__s) const 77110d565efSmrg { 77210d565efSmrg if (__position >= _Nb) 77310d565efSmrg __throw_out_of_range_fmt(__N("%s: __position (which is %zu) " 77410d565efSmrg ">= _Nb (which is %zu)"), 77510d565efSmrg __s, __position, _Nb); 77610d565efSmrg } 77710d565efSmrg 77810d565efSmrg void 77910d565efSmrg _M_do_sanitize() _GLIBCXX_NOEXCEPT 78010d565efSmrg { 78110d565efSmrg typedef _Sanitize<_Nb % _GLIBCXX_BITSET_BITS_PER_WORD> __sanitize_type; 78210d565efSmrg __sanitize_type::_S_do_sanitize(this->_M_hiword()); 78310d565efSmrg } 78410d565efSmrg 78510d565efSmrg#if __cplusplus >= 201103L 786c7a68eb7Smrg friend struct std::hash<bitset>; 78710d565efSmrg#endif 78810d565efSmrg 78910d565efSmrg public: 79010d565efSmrg /** 79110d565efSmrg * This encapsulates the concept of a single bit. An instance of this 79210d565efSmrg * class is a proxy for an actual bit; this way the individual bit 79310d565efSmrg * operations are done as faster word-size bitwise instructions. 79410d565efSmrg * 79510d565efSmrg * Most users will never need to use this class directly; conversions 79610d565efSmrg * to and from bool are automatic and should be transparent. Overloaded 79710d565efSmrg * operators help to preserve the illusion. 79810d565efSmrg * 79910d565efSmrg * (On a typical system, this <em>bit %reference</em> is 64 80010d565efSmrg * times the size of an actual bit. Ha.) 80110d565efSmrg */ 80210d565efSmrg class reference 80310d565efSmrg { 80410d565efSmrg friend class bitset; 80510d565efSmrg 80610d565efSmrg _WordT* _M_wp; 80710d565efSmrg size_t _M_bpos; 80810d565efSmrg 80910d565efSmrg // left undefined 81010d565efSmrg reference(); 81110d565efSmrg 81210d565efSmrg public: 81310d565efSmrg reference(bitset& __b, size_t __pos) _GLIBCXX_NOEXCEPT 81410d565efSmrg { 81510d565efSmrg _M_wp = &__b._M_getword(__pos); 81610d565efSmrg _M_bpos = _Base::_S_whichbit(__pos); 81710d565efSmrg } 81810d565efSmrg 8190fc04c29Smrg#if __cplusplus >= 201103L 8200fc04c29Smrg reference(const reference&) = default; 8210fc04c29Smrg#endif 8220fc04c29Smrg 82310d565efSmrg ~reference() _GLIBCXX_NOEXCEPT 82410d565efSmrg { } 82510d565efSmrg 82610d565efSmrg // For b[i] = __x; 82710d565efSmrg reference& 82810d565efSmrg operator=(bool __x) _GLIBCXX_NOEXCEPT 82910d565efSmrg { 83010d565efSmrg if (__x) 83110d565efSmrg *_M_wp |= _Base::_S_maskbit(_M_bpos); 83210d565efSmrg else 83310d565efSmrg *_M_wp &= ~_Base::_S_maskbit(_M_bpos); 83410d565efSmrg return *this; 83510d565efSmrg } 83610d565efSmrg 83710d565efSmrg // For b[i] = b[__j]; 83810d565efSmrg reference& 83910d565efSmrg operator=(const reference& __j) _GLIBCXX_NOEXCEPT 84010d565efSmrg { 84110d565efSmrg if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos))) 84210d565efSmrg *_M_wp |= _Base::_S_maskbit(_M_bpos); 84310d565efSmrg else 84410d565efSmrg *_M_wp &= ~_Base::_S_maskbit(_M_bpos); 84510d565efSmrg return *this; 84610d565efSmrg } 84710d565efSmrg 84810d565efSmrg // Flips the bit 84910d565efSmrg bool 85010d565efSmrg operator~() const _GLIBCXX_NOEXCEPT 85110d565efSmrg { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; } 85210d565efSmrg 85310d565efSmrg // For __x = b[i]; 85410d565efSmrg operator bool() const _GLIBCXX_NOEXCEPT 85510d565efSmrg { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; } 85610d565efSmrg 85710d565efSmrg // For b[i].flip(); 85810d565efSmrg reference& 85910d565efSmrg flip() _GLIBCXX_NOEXCEPT 86010d565efSmrg { 86110d565efSmrg *_M_wp ^= _Base::_S_maskbit(_M_bpos); 86210d565efSmrg return *this; 86310d565efSmrg } 86410d565efSmrg }; 86510d565efSmrg friend class reference; 86610d565efSmrg 86710d565efSmrg // 23.3.5.1 constructors: 86810d565efSmrg /// All bits set to zero. 86910d565efSmrg _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT 87010d565efSmrg { } 87110d565efSmrg 87210d565efSmrg /// Initial bits bitwise-copied from a single word (others set to zero). 87310d565efSmrg#if __cplusplus >= 201103L 87410d565efSmrg constexpr bitset(unsigned long long __val) noexcept 87510d565efSmrg : _Base(_Sanitize_val<_Nb>::_S_do_sanitize_val(__val)) { } 87610d565efSmrg#else 87710d565efSmrg bitset(unsigned long __val) 87810d565efSmrg : _Base(__val) 87910d565efSmrg { _M_do_sanitize(); } 88010d565efSmrg#endif 88110d565efSmrg 88210d565efSmrg /** 88310d565efSmrg * Use a subset of a string. 88410d565efSmrg * @param __s A string of @a 0 and @a 1 characters. 88510d565efSmrg * @param __position Index of the first character in @a __s to use; 88610d565efSmrg * defaults to zero. 88710d565efSmrg * @throw std::out_of_range If @a pos is bigger the size of @a __s. 88810d565efSmrg * @throw std::invalid_argument If a character appears in the string 88910d565efSmrg * which is neither @a 0 nor @a 1. 89010d565efSmrg */ 89110d565efSmrg template<class _CharT, class _Traits, class _Alloc> 89210d565efSmrg explicit 89310d565efSmrg bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 89410d565efSmrg size_t __position = 0) 89510d565efSmrg : _Base() 89610d565efSmrg { 89710d565efSmrg _M_check_initial_position(__s, __position); 89810d565efSmrg _M_copy_from_string(__s, __position, 89910d565efSmrg std::basic_string<_CharT, _Traits, _Alloc>::npos, 90010d565efSmrg _CharT('0'), _CharT('1')); 90110d565efSmrg } 90210d565efSmrg 90310d565efSmrg /** 90410d565efSmrg * Use a subset of a string. 90510d565efSmrg * @param __s A string of @a 0 and @a 1 characters. 90610d565efSmrg * @param __position Index of the first character in @a __s to use. 90710d565efSmrg * @param __n The number of characters to copy. 90810d565efSmrg * @throw std::out_of_range If @a __position is bigger the size 90910d565efSmrg * of @a __s. 91010d565efSmrg * @throw std::invalid_argument If a character appears in the string 91110d565efSmrg * which is neither @a 0 nor @a 1. 91210d565efSmrg */ 91310d565efSmrg template<class _CharT, class _Traits, class _Alloc> 91410d565efSmrg bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 91510d565efSmrg size_t __position, size_t __n) 91610d565efSmrg : _Base() 91710d565efSmrg { 91810d565efSmrg _M_check_initial_position(__s, __position); 91910d565efSmrg _M_copy_from_string(__s, __position, __n, _CharT('0'), _CharT('1')); 92010d565efSmrg } 92110d565efSmrg 92210d565efSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 92310d565efSmrg // 396. what are characters zero and one. 92410d565efSmrg template<class _CharT, class _Traits, class _Alloc> 92510d565efSmrg bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 92610d565efSmrg size_t __position, size_t __n, 92710d565efSmrg _CharT __zero, _CharT __one = _CharT('1')) 92810d565efSmrg : _Base() 92910d565efSmrg { 93010d565efSmrg _M_check_initial_position(__s, __position); 93110d565efSmrg _M_copy_from_string(__s, __position, __n, __zero, __one); 93210d565efSmrg } 93310d565efSmrg 93410d565efSmrg#if __cplusplus >= 201103L 93510d565efSmrg /** 93610d565efSmrg * Construct from a character %array. 93710d565efSmrg * @param __str An %array of characters @a zero and @a one. 93810d565efSmrg * @param __n The number of characters to use. 93910d565efSmrg * @param __zero The character corresponding to the value 0. 94010d565efSmrg * @param __one The character corresponding to the value 1. 94110d565efSmrg * @throw std::invalid_argument If a character appears in the string 94210d565efSmrg * which is neither @a __zero nor @a __one. 94310d565efSmrg */ 94410d565efSmrg template<typename _CharT> 94510d565efSmrg explicit 94610d565efSmrg bitset(const _CharT* __str, 94710d565efSmrg typename std::basic_string<_CharT>::size_type __n 94810d565efSmrg = std::basic_string<_CharT>::npos, 94910d565efSmrg _CharT __zero = _CharT('0'), _CharT __one = _CharT('1')) 95010d565efSmrg : _Base() 95110d565efSmrg { 95210d565efSmrg if (!__str) 95310d565efSmrg __throw_logic_error(__N("bitset::bitset(const _CharT*, ...)")); 95410d565efSmrg 95510d565efSmrg if (__n == std::basic_string<_CharT>::npos) 95610d565efSmrg __n = std::char_traits<_CharT>::length(__str); 95710d565efSmrg _M_copy_from_ptr<_CharT, std::char_traits<_CharT>>(__str, __n, 0, 95810d565efSmrg __n, __zero, 95910d565efSmrg __one); 96010d565efSmrg } 96110d565efSmrg#endif 96210d565efSmrg 96310d565efSmrg // 23.3.5.2 bitset operations: 964*ec02198aSmrg ///@{ 96510d565efSmrg /** 96610d565efSmrg * Operations on bitsets. 96710d565efSmrg * @param __rhs A same-sized bitset. 96810d565efSmrg * 96910d565efSmrg * These should be self-explanatory. 97010d565efSmrg */ 97110d565efSmrg bitset<_Nb>& 97210d565efSmrg operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT 97310d565efSmrg { 97410d565efSmrg this->_M_do_and(__rhs); 97510d565efSmrg return *this; 97610d565efSmrg } 97710d565efSmrg 97810d565efSmrg bitset<_Nb>& 97910d565efSmrg operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT 98010d565efSmrg { 98110d565efSmrg this->_M_do_or(__rhs); 98210d565efSmrg return *this; 98310d565efSmrg } 98410d565efSmrg 98510d565efSmrg bitset<_Nb>& 98610d565efSmrg operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT 98710d565efSmrg { 98810d565efSmrg this->_M_do_xor(__rhs); 98910d565efSmrg return *this; 99010d565efSmrg } 991*ec02198aSmrg ///@} 99210d565efSmrg 993*ec02198aSmrg ///@{ 99410d565efSmrg /** 99510d565efSmrg * Operations on bitsets. 99610d565efSmrg * @param __position The number of places to shift. 99710d565efSmrg * 99810d565efSmrg * These should be self-explanatory. 99910d565efSmrg */ 100010d565efSmrg bitset<_Nb>& 100110d565efSmrg operator<<=(size_t __position) _GLIBCXX_NOEXCEPT 100210d565efSmrg { 100310d565efSmrg if (__builtin_expect(__position < _Nb, 1)) 100410d565efSmrg { 100510d565efSmrg this->_M_do_left_shift(__position); 100610d565efSmrg this->_M_do_sanitize(); 100710d565efSmrg } 100810d565efSmrg else 100910d565efSmrg this->_M_do_reset(); 101010d565efSmrg return *this; 101110d565efSmrg } 101210d565efSmrg 101310d565efSmrg bitset<_Nb>& 101410d565efSmrg operator>>=(size_t __position) _GLIBCXX_NOEXCEPT 101510d565efSmrg { 101610d565efSmrg if (__builtin_expect(__position < _Nb, 1)) 101710d565efSmrg { 101810d565efSmrg this->_M_do_right_shift(__position); 101910d565efSmrg this->_M_do_sanitize(); 102010d565efSmrg } 102110d565efSmrg else 102210d565efSmrg this->_M_do_reset(); 102310d565efSmrg return *this; 102410d565efSmrg } 1025*ec02198aSmrg ///@} 102610d565efSmrg 1027*ec02198aSmrg ///@{ 102810d565efSmrg /** 102910d565efSmrg * These versions of single-bit set, reset, flip, and test are 103010d565efSmrg * extensions from the SGI version. They do no range checking. 103110d565efSmrg * @ingroup SGIextensions 103210d565efSmrg */ 103310d565efSmrg bitset<_Nb>& 103410d565efSmrg _Unchecked_set(size_t __pos) _GLIBCXX_NOEXCEPT 103510d565efSmrg { 103610d565efSmrg this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); 103710d565efSmrg return *this; 103810d565efSmrg } 103910d565efSmrg 104010d565efSmrg bitset<_Nb>& 104110d565efSmrg _Unchecked_set(size_t __pos, int __val) _GLIBCXX_NOEXCEPT 104210d565efSmrg { 104310d565efSmrg if (__val) 104410d565efSmrg this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); 104510d565efSmrg else 104610d565efSmrg this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); 104710d565efSmrg return *this; 104810d565efSmrg } 104910d565efSmrg 105010d565efSmrg bitset<_Nb>& 105110d565efSmrg _Unchecked_reset(size_t __pos) _GLIBCXX_NOEXCEPT 105210d565efSmrg { 105310d565efSmrg this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); 105410d565efSmrg return *this; 105510d565efSmrg } 105610d565efSmrg 105710d565efSmrg bitset<_Nb>& 105810d565efSmrg _Unchecked_flip(size_t __pos) _GLIBCXX_NOEXCEPT 105910d565efSmrg { 106010d565efSmrg this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos); 106110d565efSmrg return *this; 106210d565efSmrg } 106310d565efSmrg 106410d565efSmrg _GLIBCXX_CONSTEXPR bool 106510d565efSmrg _Unchecked_test(size_t __pos) const _GLIBCXX_NOEXCEPT 106610d565efSmrg { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos)) 106710d565efSmrg != static_cast<_WordT>(0)); } 1068*ec02198aSmrg ///@} 106910d565efSmrg 107010d565efSmrg // Set, reset, and flip. 107110d565efSmrg /** 107210d565efSmrg * @brief Sets every bit to true. 107310d565efSmrg */ 107410d565efSmrg bitset<_Nb>& 107510d565efSmrg set() _GLIBCXX_NOEXCEPT 107610d565efSmrg { 107710d565efSmrg this->_M_do_set(); 107810d565efSmrg this->_M_do_sanitize(); 107910d565efSmrg return *this; 108010d565efSmrg } 108110d565efSmrg 108210d565efSmrg /** 108310d565efSmrg * @brief Sets a given bit to a particular value. 108410d565efSmrg * @param __position The index of the bit. 108510d565efSmrg * @param __val Either true or false, defaults to true. 108610d565efSmrg * @throw std::out_of_range If @a pos is bigger the size of the %set. 108710d565efSmrg */ 108810d565efSmrg bitset<_Nb>& 108910d565efSmrg set(size_t __position, bool __val = true) 109010d565efSmrg { 109110d565efSmrg this->_M_check(__position, __N("bitset::set")); 109210d565efSmrg return _Unchecked_set(__position, __val); 109310d565efSmrg } 109410d565efSmrg 109510d565efSmrg /** 109610d565efSmrg * @brief Sets every bit to false. 109710d565efSmrg */ 109810d565efSmrg bitset<_Nb>& 109910d565efSmrg reset() _GLIBCXX_NOEXCEPT 110010d565efSmrg { 110110d565efSmrg this->_M_do_reset(); 110210d565efSmrg return *this; 110310d565efSmrg } 110410d565efSmrg 110510d565efSmrg /** 110610d565efSmrg * @brief Sets a given bit to false. 110710d565efSmrg * @param __position The index of the bit. 110810d565efSmrg * @throw std::out_of_range If @a pos is bigger the size of the %set. 110910d565efSmrg * 111010d565efSmrg * Same as writing @c set(pos,false). 111110d565efSmrg */ 111210d565efSmrg bitset<_Nb>& 111310d565efSmrg reset(size_t __position) 111410d565efSmrg { 111510d565efSmrg this->_M_check(__position, __N("bitset::reset")); 111610d565efSmrg return _Unchecked_reset(__position); 111710d565efSmrg } 111810d565efSmrg 111910d565efSmrg /** 112010d565efSmrg * @brief Toggles every bit to its opposite value. 112110d565efSmrg */ 112210d565efSmrg bitset<_Nb>& 112310d565efSmrg flip() _GLIBCXX_NOEXCEPT 112410d565efSmrg { 112510d565efSmrg this->_M_do_flip(); 112610d565efSmrg this->_M_do_sanitize(); 112710d565efSmrg return *this; 112810d565efSmrg } 112910d565efSmrg 113010d565efSmrg /** 113110d565efSmrg * @brief Toggles a given bit to its opposite value. 113210d565efSmrg * @param __position The index of the bit. 113310d565efSmrg * @throw std::out_of_range If @a pos is bigger the size of the %set. 113410d565efSmrg */ 113510d565efSmrg bitset<_Nb>& 113610d565efSmrg flip(size_t __position) 113710d565efSmrg { 113810d565efSmrg this->_M_check(__position, __N("bitset::flip")); 113910d565efSmrg return _Unchecked_flip(__position); 114010d565efSmrg } 114110d565efSmrg 114210d565efSmrg /// See the no-argument flip(). 114310d565efSmrg bitset<_Nb> 114410d565efSmrg operator~() const _GLIBCXX_NOEXCEPT 114510d565efSmrg { return bitset<_Nb>(*this).flip(); } 114610d565efSmrg 1147*ec02198aSmrg ///@{ 114810d565efSmrg /** 114910d565efSmrg * @brief Array-indexing support. 115010d565efSmrg * @param __position Index into the %bitset. 115110d565efSmrg * @return A bool for a <em>const %bitset</em>. For non-const 115210d565efSmrg * bitsets, an instance of the reference proxy class. 115310d565efSmrg * @note These operators do no range checking and throw no exceptions, 115410d565efSmrg * as required by DR 11 to the standard. 115510d565efSmrg * 115610d565efSmrg * _GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already 115710d565efSmrg * resolves DR 11 (items 1 and 2), but does not do the range-checking 115810d565efSmrg * required by that DR's resolution. -pme 115910d565efSmrg * The DR has since been changed: range-checking is a precondition 116010d565efSmrg * (users' responsibility), and these functions must not throw. -pme 116110d565efSmrg */ 116210d565efSmrg reference 116310d565efSmrg operator[](size_t __position) 116410d565efSmrg { return reference(*this, __position); } 116510d565efSmrg 116610d565efSmrg _GLIBCXX_CONSTEXPR bool 116710d565efSmrg operator[](size_t __position) const 116810d565efSmrg { return _Unchecked_test(__position); } 1169*ec02198aSmrg ///@} 117010d565efSmrg 117110d565efSmrg /** 117210d565efSmrg * @brief Returns a numerical interpretation of the %bitset. 117310d565efSmrg * @return The integral equivalent of the bits. 117410d565efSmrg * @throw std::overflow_error If there are too many bits to be 117510d565efSmrg * represented in an @c unsigned @c long. 117610d565efSmrg */ 117710d565efSmrg unsigned long 117810d565efSmrg to_ulong() const 117910d565efSmrg { return this->_M_do_to_ulong(); } 118010d565efSmrg 118110d565efSmrg#if __cplusplus >= 201103L 118210d565efSmrg unsigned long long 118310d565efSmrg to_ullong() const 118410d565efSmrg { return this->_M_do_to_ullong(); } 118510d565efSmrg#endif 118610d565efSmrg 118710d565efSmrg /** 118810d565efSmrg * @brief Returns a character interpretation of the %bitset. 118910d565efSmrg * @return The string equivalent of the bits. 119010d565efSmrg * 119110d565efSmrg * Note the ordering of the bits: decreasing character positions 119210d565efSmrg * correspond to increasing bit positions (see the main class notes for 119310d565efSmrg * an example). 119410d565efSmrg */ 119510d565efSmrg template<class _CharT, class _Traits, class _Alloc> 119610d565efSmrg std::basic_string<_CharT, _Traits, _Alloc> 119710d565efSmrg to_string() const 119810d565efSmrg { 119910d565efSmrg std::basic_string<_CharT, _Traits, _Alloc> __result; 120010d565efSmrg _M_copy_to_string(__result, _CharT('0'), _CharT('1')); 120110d565efSmrg return __result; 120210d565efSmrg } 120310d565efSmrg 120410d565efSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 120510d565efSmrg // 396. what are characters zero and one. 120610d565efSmrg template<class _CharT, class _Traits, class _Alloc> 120710d565efSmrg std::basic_string<_CharT, _Traits, _Alloc> 120810d565efSmrg to_string(_CharT __zero, _CharT __one = _CharT('1')) const 120910d565efSmrg { 121010d565efSmrg std::basic_string<_CharT, _Traits, _Alloc> __result; 121110d565efSmrg _M_copy_to_string(__result, __zero, __one); 121210d565efSmrg return __result; 121310d565efSmrg } 121410d565efSmrg 121510d565efSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 121610d565efSmrg // 434. bitset::to_string() hard to use. 121710d565efSmrg template<class _CharT, class _Traits> 121810d565efSmrg std::basic_string<_CharT, _Traits, std::allocator<_CharT> > 121910d565efSmrg to_string() const 122010d565efSmrg { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); } 122110d565efSmrg 122210d565efSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 122310d565efSmrg // 853. to_string needs updating with zero and one. 122410d565efSmrg template<class _CharT, class _Traits> 122510d565efSmrg std::basic_string<_CharT, _Traits, std::allocator<_CharT> > 122610d565efSmrg to_string(_CharT __zero, _CharT __one = _CharT('1')) const 122710d565efSmrg { return to_string<_CharT, _Traits, 122810d565efSmrg std::allocator<_CharT> >(__zero, __one); } 122910d565efSmrg 123010d565efSmrg template<class _CharT> 123110d565efSmrg std::basic_string<_CharT, std::char_traits<_CharT>, 123210d565efSmrg std::allocator<_CharT> > 123310d565efSmrg to_string() const 123410d565efSmrg { 123510d565efSmrg return to_string<_CharT, std::char_traits<_CharT>, 123610d565efSmrg std::allocator<_CharT> >(); 123710d565efSmrg } 123810d565efSmrg 123910d565efSmrg template<class _CharT> 124010d565efSmrg std::basic_string<_CharT, std::char_traits<_CharT>, 124110d565efSmrg std::allocator<_CharT> > 124210d565efSmrg to_string(_CharT __zero, _CharT __one = _CharT('1')) const 124310d565efSmrg { 124410d565efSmrg return to_string<_CharT, std::char_traits<_CharT>, 124510d565efSmrg std::allocator<_CharT> >(__zero, __one); 124610d565efSmrg } 124710d565efSmrg 124810d565efSmrg std::basic_string<char, std::char_traits<char>, std::allocator<char> > 124910d565efSmrg to_string() const 125010d565efSmrg { 125110d565efSmrg return to_string<char, std::char_traits<char>, 125210d565efSmrg std::allocator<char> >(); 125310d565efSmrg } 125410d565efSmrg 125510d565efSmrg std::basic_string<char, std::char_traits<char>, std::allocator<char> > 125610d565efSmrg to_string(char __zero, char __one = '1') const 125710d565efSmrg { 125810d565efSmrg return to_string<char, std::char_traits<char>, 125910d565efSmrg std::allocator<char> >(__zero, __one); 126010d565efSmrg } 126110d565efSmrg 126210d565efSmrg // Helper functions for string operations. 126310d565efSmrg template<class _CharT, class _Traits> 126410d565efSmrg void 126510d565efSmrg _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t, 126610d565efSmrg _CharT, _CharT); 126710d565efSmrg 126810d565efSmrg template<class _CharT, class _Traits, class _Alloc> 126910d565efSmrg void 127010d565efSmrg _M_copy_from_string(const std::basic_string<_CharT, 127110d565efSmrg _Traits, _Alloc>& __s, size_t __pos, size_t __n, 127210d565efSmrg _CharT __zero, _CharT __one) 127310d565efSmrg { _M_copy_from_ptr<_CharT, _Traits>(__s.data(), __s.size(), __pos, __n, 127410d565efSmrg __zero, __one); } 127510d565efSmrg 127610d565efSmrg template<class _CharT, class _Traits, class _Alloc> 127710d565efSmrg void 127810d565efSmrg _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>&, 127910d565efSmrg _CharT, _CharT) const; 128010d565efSmrg 128110d565efSmrg // NB: Backward compat. 128210d565efSmrg template<class _CharT, class _Traits, class _Alloc> 128310d565efSmrg void 128410d565efSmrg _M_copy_from_string(const std::basic_string<_CharT, 128510d565efSmrg _Traits, _Alloc>& __s, size_t __pos, size_t __n) 128610d565efSmrg { _M_copy_from_string(__s, __pos, __n, _CharT('0'), _CharT('1')); } 128710d565efSmrg 128810d565efSmrg template<class _CharT, class _Traits, class _Alloc> 128910d565efSmrg void 129010d565efSmrg _M_copy_to_string(std::basic_string<_CharT, _Traits,_Alloc>& __s) const 129110d565efSmrg { _M_copy_to_string(__s, _CharT('0'), _CharT('1')); } 129210d565efSmrg 129310d565efSmrg /// Returns the number of bits which are set. 129410d565efSmrg size_t 129510d565efSmrg count() const _GLIBCXX_NOEXCEPT 129610d565efSmrg { return this->_M_do_count(); } 129710d565efSmrg 129810d565efSmrg /// Returns the total number of bits. 129910d565efSmrg _GLIBCXX_CONSTEXPR size_t 130010d565efSmrg size() const _GLIBCXX_NOEXCEPT 130110d565efSmrg { return _Nb; } 130210d565efSmrg 1303*ec02198aSmrg ///@{ 130410d565efSmrg /// These comparisons for equality/inequality are, well, @e bitwise. 130510d565efSmrg bool 130610d565efSmrg operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT 130710d565efSmrg { return this->_M_is_equal(__rhs); } 130810d565efSmrg 1309*ec02198aSmrg#if __cpp_impl_three_way_comparison < 201907L 131010d565efSmrg bool 131110d565efSmrg operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT 131210d565efSmrg { return !this->_M_is_equal(__rhs); } 1313*ec02198aSmrg#endif 1314*ec02198aSmrg ///@} 131510d565efSmrg 131610d565efSmrg /** 131710d565efSmrg * @brief Tests the value of a bit. 131810d565efSmrg * @param __position The index of a bit. 131910d565efSmrg * @return The value at @a pos. 132010d565efSmrg * @throw std::out_of_range If @a pos is bigger the size of the %set. 132110d565efSmrg */ 132210d565efSmrg bool 132310d565efSmrg test(size_t __position) const 132410d565efSmrg { 132510d565efSmrg this->_M_check(__position, __N("bitset::test")); 132610d565efSmrg return _Unchecked_test(__position); 132710d565efSmrg } 132810d565efSmrg 132910d565efSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 133010d565efSmrg // DR 693. std::bitset::all() missing. 133110d565efSmrg /** 133210d565efSmrg * @brief Tests whether all the bits are on. 133310d565efSmrg * @return True if all the bits are set. 133410d565efSmrg */ 133510d565efSmrg bool 133610d565efSmrg all() const _GLIBCXX_NOEXCEPT 133710d565efSmrg { return this->template _M_are_all<_Nb>(); } 133810d565efSmrg 133910d565efSmrg /** 134010d565efSmrg * @brief Tests whether any of the bits are on. 134110d565efSmrg * @return True if at least one bit is set. 134210d565efSmrg */ 134310d565efSmrg bool 134410d565efSmrg any() const _GLIBCXX_NOEXCEPT 134510d565efSmrg { return this->_M_is_any(); } 134610d565efSmrg 134710d565efSmrg /** 134810d565efSmrg * @brief Tests whether any of the bits are on. 134910d565efSmrg * @return True if none of the bits are set. 135010d565efSmrg */ 135110d565efSmrg bool 135210d565efSmrg none() const _GLIBCXX_NOEXCEPT 135310d565efSmrg { return !this->_M_is_any(); } 135410d565efSmrg 1355*ec02198aSmrg ///@{ 135610d565efSmrg /// Self-explanatory. 135710d565efSmrg bitset<_Nb> 135810d565efSmrg operator<<(size_t __position) const _GLIBCXX_NOEXCEPT 135910d565efSmrg { return bitset<_Nb>(*this) <<= __position; } 136010d565efSmrg 136110d565efSmrg bitset<_Nb> 136210d565efSmrg operator>>(size_t __position) const _GLIBCXX_NOEXCEPT 136310d565efSmrg { return bitset<_Nb>(*this) >>= __position; } 1364*ec02198aSmrg ///@} 136510d565efSmrg 136610d565efSmrg /** 136710d565efSmrg * @brief Finds the index of the first "on" bit. 136810d565efSmrg * @return The index of the first bit set, or size() if not found. 136910d565efSmrg * @ingroup SGIextensions 137010d565efSmrg * @sa _Find_next 137110d565efSmrg */ 137210d565efSmrg size_t 137310d565efSmrg _Find_first() const _GLIBCXX_NOEXCEPT 137410d565efSmrg { return this->_M_do_find_first(_Nb); } 137510d565efSmrg 137610d565efSmrg /** 137710d565efSmrg * @brief Finds the index of the next "on" bit after prev. 137810d565efSmrg * @return The index of the next bit set, or size() if not found. 137910d565efSmrg * @param __prev Where to start searching. 138010d565efSmrg * @ingroup SGIextensions 138110d565efSmrg * @sa _Find_first 138210d565efSmrg */ 138310d565efSmrg size_t 138410d565efSmrg _Find_next(size_t __prev) const _GLIBCXX_NOEXCEPT 138510d565efSmrg { return this->_M_do_find_next(__prev, _Nb); } 138610d565efSmrg }; 138710d565efSmrg 138810d565efSmrg // Definitions of non-inline member functions. 138910d565efSmrg template<size_t _Nb> 139010d565efSmrg template<class _CharT, class _Traits> 139110d565efSmrg void 139210d565efSmrg bitset<_Nb>:: 139310d565efSmrg _M_copy_from_ptr(const _CharT* __s, size_t __len, 139410d565efSmrg size_t __pos, size_t __n, _CharT __zero, _CharT __one) 139510d565efSmrg { 139610d565efSmrg reset(); 139710d565efSmrg const size_t __nbits = std::min(_Nb, std::min(__n, size_t(__len - __pos))); 139810d565efSmrg for (size_t __i = __nbits; __i > 0; --__i) 139910d565efSmrg { 140010d565efSmrg const _CharT __c = __s[__pos + __nbits - __i]; 140110d565efSmrg if (_Traits::eq(__c, __zero)) 140210d565efSmrg ; 140310d565efSmrg else if (_Traits::eq(__c, __one)) 140410d565efSmrg _Unchecked_set(__i - 1); 140510d565efSmrg else 140610d565efSmrg __throw_invalid_argument(__N("bitset::_M_copy_from_ptr")); 140710d565efSmrg } 140810d565efSmrg } 140910d565efSmrg 141010d565efSmrg template<size_t _Nb> 141110d565efSmrg template<class _CharT, class _Traits, class _Alloc> 141210d565efSmrg void 141310d565efSmrg bitset<_Nb>:: 141410d565efSmrg _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>& __s, 141510d565efSmrg _CharT __zero, _CharT __one) const 141610d565efSmrg { 141710d565efSmrg __s.assign(_Nb, __zero); 141810d565efSmrg for (size_t __i = _Nb; __i > 0; --__i) 141910d565efSmrg if (_Unchecked_test(__i - 1)) 142010d565efSmrg _Traits::assign(__s[_Nb - __i], __one); 142110d565efSmrg } 142210d565efSmrg 142310d565efSmrg // 23.3.5.3 bitset operations: 1424*ec02198aSmrg ///@{ 142510d565efSmrg /** 142610d565efSmrg * @brief Global bitwise operations on bitsets. 142710d565efSmrg * @param __x A bitset. 142810d565efSmrg * @param __y A bitset of the same size as @a __x. 142910d565efSmrg * @return A new bitset. 143010d565efSmrg * 143110d565efSmrg * These should be self-explanatory. 143210d565efSmrg */ 143310d565efSmrg template<size_t _Nb> 143410d565efSmrg inline bitset<_Nb> 143510d565efSmrg operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT 143610d565efSmrg { 143710d565efSmrg bitset<_Nb> __result(__x); 143810d565efSmrg __result &= __y; 143910d565efSmrg return __result; 144010d565efSmrg } 144110d565efSmrg 144210d565efSmrg template<size_t _Nb> 144310d565efSmrg inline bitset<_Nb> 144410d565efSmrg operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT 144510d565efSmrg { 144610d565efSmrg bitset<_Nb> __result(__x); 144710d565efSmrg __result |= __y; 144810d565efSmrg return __result; 144910d565efSmrg } 145010d565efSmrg 145110d565efSmrg template <size_t _Nb> 145210d565efSmrg inline bitset<_Nb> 145310d565efSmrg operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT 145410d565efSmrg { 145510d565efSmrg bitset<_Nb> __result(__x); 145610d565efSmrg __result ^= __y; 145710d565efSmrg return __result; 145810d565efSmrg } 1459*ec02198aSmrg ///@} 146010d565efSmrg 1461*ec02198aSmrg ///@{ 146210d565efSmrg /** 146310d565efSmrg * @brief Global I/O operators for bitsets. 146410d565efSmrg * 146510d565efSmrg * Direct I/O between streams and bitsets is supported. Output is 146610d565efSmrg * straightforward. Input will skip whitespace, only accept @a 0 and @a 1 146710d565efSmrg * characters, and will only extract as many digits as the %bitset will 146810d565efSmrg * hold. 146910d565efSmrg */ 147010d565efSmrg template<class _CharT, class _Traits, size_t _Nb> 147110d565efSmrg std::basic_istream<_CharT, _Traits>& 147210d565efSmrg operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x) 147310d565efSmrg { 147410d565efSmrg typedef typename _Traits::char_type char_type; 147510d565efSmrg typedef std::basic_istream<_CharT, _Traits> __istream_type; 147610d565efSmrg typedef typename __istream_type::ios_base __ios_base; 147710d565efSmrg 147810d565efSmrg std::basic_string<_CharT, _Traits> __tmp; 147910d565efSmrg __tmp.reserve(_Nb); 148010d565efSmrg 148110d565efSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 148210d565efSmrg // 303. Bitset input operator underspecified 148310d565efSmrg const char_type __zero = __is.widen('0'); 148410d565efSmrg const char_type __one = __is.widen('1'); 148510d565efSmrg 148610d565efSmrg typename __ios_base::iostate __state = __ios_base::goodbit; 148710d565efSmrg typename __istream_type::sentry __sentry(__is); 148810d565efSmrg if (__sentry) 148910d565efSmrg { 149010d565efSmrg __try 149110d565efSmrg { 149210d565efSmrg for (size_t __i = _Nb; __i > 0; --__i) 149310d565efSmrg { 149410d565efSmrg static typename _Traits::int_type __eof = _Traits::eof(); 149510d565efSmrg 149610d565efSmrg typename _Traits::int_type __c1 = __is.rdbuf()->sbumpc(); 149710d565efSmrg if (_Traits::eq_int_type(__c1, __eof)) 149810d565efSmrg { 149910d565efSmrg __state |= __ios_base::eofbit; 150010d565efSmrg break; 150110d565efSmrg } 150210d565efSmrg else 150310d565efSmrg { 150410d565efSmrg const char_type __c2 = _Traits::to_char_type(__c1); 150510d565efSmrg if (_Traits::eq(__c2, __zero)) 150610d565efSmrg __tmp.push_back(__zero); 150710d565efSmrg else if (_Traits::eq(__c2, __one)) 150810d565efSmrg __tmp.push_back(__one); 150910d565efSmrg else if (_Traits:: 151010d565efSmrg eq_int_type(__is.rdbuf()->sputbackc(__c2), 151110d565efSmrg __eof)) 151210d565efSmrg { 151310d565efSmrg __state |= __ios_base::failbit; 151410d565efSmrg break; 151510d565efSmrg } 151610d565efSmrg } 151710d565efSmrg } 151810d565efSmrg } 151910d565efSmrg __catch(__cxxabiv1::__forced_unwind&) 152010d565efSmrg { 152110d565efSmrg __is._M_setstate(__ios_base::badbit); 152210d565efSmrg __throw_exception_again; 152310d565efSmrg } 152410d565efSmrg __catch(...) 152510d565efSmrg { __is._M_setstate(__ios_base::badbit); } 152610d565efSmrg } 152710d565efSmrg 152810d565efSmrg if (__tmp.empty() && _Nb) 152910d565efSmrg __state |= __ios_base::failbit; 153010d565efSmrg else 153110d565efSmrg __x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb, 153210d565efSmrg __zero, __one); 153310d565efSmrg if (__state) 153410d565efSmrg __is.setstate(__state); 153510d565efSmrg return __is; 153610d565efSmrg } 153710d565efSmrg 153810d565efSmrg template <class _CharT, class _Traits, size_t _Nb> 153910d565efSmrg std::basic_ostream<_CharT, _Traits>& 154010d565efSmrg operator<<(std::basic_ostream<_CharT, _Traits>& __os, 154110d565efSmrg const bitset<_Nb>& __x) 154210d565efSmrg { 154310d565efSmrg std::basic_string<_CharT, _Traits> __tmp; 154410d565efSmrg 154510d565efSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 154610d565efSmrg // 396. what are characters zero and one. 154710d565efSmrg const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__os.getloc()); 154810d565efSmrg __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1')); 154910d565efSmrg return __os << __tmp; 155010d565efSmrg } 1551*ec02198aSmrg ///@} 155210d565efSmrg 155310d565efSmrg_GLIBCXX_END_NAMESPACE_CONTAINER 155410d565efSmrg} // namespace std 155510d565efSmrg 155610d565efSmrg#undef _GLIBCXX_BITSET_WORDS 155710d565efSmrg#undef _GLIBCXX_BITSET_BITS_PER_WORD 155810d565efSmrg#undef _GLIBCXX_BITSET_BITS_PER_ULL 155910d565efSmrg 156010d565efSmrg#if __cplusplus >= 201103L 156110d565efSmrg 156210d565efSmrgnamespace std _GLIBCXX_VISIBILITY(default) 156310d565efSmrg{ 156410d565efSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 156510d565efSmrg 156610d565efSmrg // DR 1182. 156710d565efSmrg /// std::hash specialization for bitset. 156810d565efSmrg template<size_t _Nb> 156910d565efSmrg struct hash<_GLIBCXX_STD_C::bitset<_Nb>> 157010d565efSmrg : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<_Nb>> 157110d565efSmrg { 157210d565efSmrg size_t 157310d565efSmrg operator()(const _GLIBCXX_STD_C::bitset<_Nb>& __b) const noexcept 157410d565efSmrg { 157510d565efSmrg const size_t __clength = (_Nb + __CHAR_BIT__ - 1) / __CHAR_BIT__; 157610d565efSmrg return std::_Hash_impl::hash(__b._M_getdata(), __clength); 157710d565efSmrg } 157810d565efSmrg }; 157910d565efSmrg 158010d565efSmrg template<> 158110d565efSmrg struct hash<_GLIBCXX_STD_C::bitset<0>> 158210d565efSmrg : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<0>> 158310d565efSmrg { 158410d565efSmrg size_t 158510d565efSmrg operator()(const _GLIBCXX_STD_C::bitset<0>&) const noexcept 158610d565efSmrg { return 0; } 158710d565efSmrg }; 158810d565efSmrg 158910d565efSmrg_GLIBCXX_END_NAMESPACE_VERSION 159010d565efSmrg} // namespace 159110d565efSmrg 159210d565efSmrg#endif // C++11 159310d565efSmrg 159410d565efSmrg#ifdef _GLIBCXX_DEBUG 159510d565efSmrg# include <debug/bitset> 159610d565efSmrg#endif 159710d565efSmrg 159810d565efSmrg#endif /* _GLIBCXX_BITSET */ 1599