11debfc3dSmrg// <bitset> -*- C++ -*- 21debfc3dSmrg 3*8feb0f0bSmrg// Copyright (C) 2001-2020 Free Software Foundation, Inc. 41debfc3dSmrg// 51debfc3dSmrg// This file is part of the GNU ISO C++ Library. This library is free 61debfc3dSmrg// software; you can redistribute it and/or modify it under the 71debfc3dSmrg// terms of the GNU General Public License as published by the 81debfc3dSmrg// Free Software Foundation; either version 3, or (at your option) 91debfc3dSmrg// any later version. 101debfc3dSmrg 111debfc3dSmrg// This library is distributed in the hope that it will be useful, 121debfc3dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 131debfc3dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141debfc3dSmrg// GNU General Public License for more details. 151debfc3dSmrg 161debfc3dSmrg// Under Section 7 of GPL version 3, you are granted additional 171debfc3dSmrg// permissions described in the GCC Runtime Library Exception, version 181debfc3dSmrg// 3.1, as published by the Free Software Foundation. 191debfc3dSmrg 201debfc3dSmrg// You should have received a copy of the GNU General Public License and 211debfc3dSmrg// a copy of the GCC Runtime Library Exception along with this program; 221debfc3dSmrg// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 231debfc3dSmrg// <http://www.gnu.org/licenses/>. 241debfc3dSmrg 251debfc3dSmrg/* 261debfc3dSmrg * Copyright (c) 1998 271debfc3dSmrg * Silicon Graphics Computer Systems, Inc. 281debfc3dSmrg * 291debfc3dSmrg * Permission to use, copy, modify, distribute and sell this software 301debfc3dSmrg * and its documentation for any purpose is hereby granted without fee, 311debfc3dSmrg * provided that the above copyright notice appear in all copies and 321debfc3dSmrg * that both that copyright notice and this permission notice appear 331debfc3dSmrg * in supporting documentation. Silicon Graphics makes no 341debfc3dSmrg * representations about the suitability of this software for any 351debfc3dSmrg * purpose. It is provided "as is" without express or implied warranty. 361debfc3dSmrg */ 371debfc3dSmrg 381debfc3dSmrg/** @file include/bitset 391debfc3dSmrg * This is a Standard C++ Library header. 401debfc3dSmrg */ 411debfc3dSmrg 421debfc3dSmrg#ifndef _GLIBCXX_BITSET 431debfc3dSmrg#define _GLIBCXX_BITSET 1 441debfc3dSmrg 451debfc3dSmrg#pragma GCC system_header 461debfc3dSmrg 471debfc3dSmrg#include <string> 481debfc3dSmrg#include <bits/functexcept.h> // For invalid_argument, out_of_range, 491debfc3dSmrg // overflow_error 501debfc3dSmrg#include <iosfwd> 511debfc3dSmrg#include <bits/cxxabi_forced.h> 521debfc3dSmrg 53a2dc1f3fSmrg#if __cplusplus >= 201103L 54a2dc1f3fSmrg# include <bits/functional_hash.h> 55a2dc1f3fSmrg#endif 56a2dc1f3fSmrg 571debfc3dSmrg#define _GLIBCXX_BITSET_BITS_PER_WORD (__CHAR_BIT__ * __SIZEOF_LONG__) 581debfc3dSmrg#define _GLIBCXX_BITSET_WORDS(__n) \ 591debfc3dSmrg ((__n) / _GLIBCXX_BITSET_BITS_PER_WORD + \ 601debfc3dSmrg ((__n) % _GLIBCXX_BITSET_BITS_PER_WORD == 0 ? 0 : 1)) 611debfc3dSmrg 621debfc3dSmrg#define _GLIBCXX_BITSET_BITS_PER_ULL (__CHAR_BIT__ * __SIZEOF_LONG_LONG__) 631debfc3dSmrg 641debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default) 651debfc3dSmrg{ 661debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_CONTAINER 671debfc3dSmrg 681debfc3dSmrg /** 691debfc3dSmrg * Base class, general case. It is a class invariant that _Nw will be 701debfc3dSmrg * nonnegative. 711debfc3dSmrg * 721debfc3dSmrg * See documentation for bitset. 731debfc3dSmrg */ 741debfc3dSmrg template<size_t _Nw> 751debfc3dSmrg struct _Base_bitset 761debfc3dSmrg { 771debfc3dSmrg typedef unsigned long _WordT; 781debfc3dSmrg 791debfc3dSmrg /// 0 is the least significant word. 801debfc3dSmrg _WordT _M_w[_Nw]; 811debfc3dSmrg 821debfc3dSmrg _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT 831debfc3dSmrg : _M_w() { } 841debfc3dSmrg 851debfc3dSmrg#if __cplusplus >= 201103L 861debfc3dSmrg constexpr _Base_bitset(unsigned long long __val) noexcept 871debfc3dSmrg : _M_w{ _WordT(__val) 881debfc3dSmrg#if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__ 891debfc3dSmrg , _WordT(__val >> _GLIBCXX_BITSET_BITS_PER_WORD) 901debfc3dSmrg#endif 911debfc3dSmrg } { } 921debfc3dSmrg#else 931debfc3dSmrg _Base_bitset(unsigned long __val) 941debfc3dSmrg : _M_w() 951debfc3dSmrg { _M_w[0] = __val; } 961debfc3dSmrg#endif 971debfc3dSmrg 981debfc3dSmrg static _GLIBCXX_CONSTEXPR size_t 991debfc3dSmrg _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT 1001debfc3dSmrg { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; } 1011debfc3dSmrg 1021debfc3dSmrg static _GLIBCXX_CONSTEXPR size_t 1031debfc3dSmrg _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT 1041debfc3dSmrg { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; } 1051debfc3dSmrg 1061debfc3dSmrg static _GLIBCXX_CONSTEXPR size_t 1071debfc3dSmrg _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT 1081debfc3dSmrg { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; } 1091debfc3dSmrg 1101debfc3dSmrg static _GLIBCXX_CONSTEXPR _WordT 1111debfc3dSmrg _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT 1121debfc3dSmrg { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } 1131debfc3dSmrg 1141debfc3dSmrg _WordT& 1151debfc3dSmrg _M_getword(size_t __pos) _GLIBCXX_NOEXCEPT 1161debfc3dSmrg { return _M_w[_S_whichword(__pos)]; } 1171debfc3dSmrg 1181debfc3dSmrg _GLIBCXX_CONSTEXPR _WordT 1191debfc3dSmrg _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT 1201debfc3dSmrg { return _M_w[_S_whichword(__pos)]; } 1211debfc3dSmrg 1221debfc3dSmrg#if __cplusplus >= 201103L 1231debfc3dSmrg const _WordT* 1241debfc3dSmrg _M_getdata() const noexcept 1251debfc3dSmrg { return _M_w; } 1261debfc3dSmrg#endif 1271debfc3dSmrg 1281debfc3dSmrg _WordT& 1291debfc3dSmrg _M_hiword() _GLIBCXX_NOEXCEPT 1301debfc3dSmrg { return _M_w[_Nw - 1]; } 1311debfc3dSmrg 1321debfc3dSmrg _GLIBCXX_CONSTEXPR _WordT 1331debfc3dSmrg _M_hiword() const _GLIBCXX_NOEXCEPT 1341debfc3dSmrg { return _M_w[_Nw - 1]; } 1351debfc3dSmrg 1361debfc3dSmrg void 1371debfc3dSmrg _M_do_and(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT 1381debfc3dSmrg { 1391debfc3dSmrg for (size_t __i = 0; __i < _Nw; __i++) 1401debfc3dSmrg _M_w[__i] &= __x._M_w[__i]; 1411debfc3dSmrg } 1421debfc3dSmrg 1431debfc3dSmrg void 1441debfc3dSmrg _M_do_or(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT 1451debfc3dSmrg { 1461debfc3dSmrg for (size_t __i = 0; __i < _Nw; __i++) 1471debfc3dSmrg _M_w[__i] |= __x._M_w[__i]; 1481debfc3dSmrg } 1491debfc3dSmrg 1501debfc3dSmrg void 1511debfc3dSmrg _M_do_xor(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT 1521debfc3dSmrg { 1531debfc3dSmrg for (size_t __i = 0; __i < _Nw; __i++) 1541debfc3dSmrg _M_w[__i] ^= __x._M_w[__i]; 1551debfc3dSmrg } 1561debfc3dSmrg 1571debfc3dSmrg void 1581debfc3dSmrg _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT; 1591debfc3dSmrg 1601debfc3dSmrg void 1611debfc3dSmrg _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT; 1621debfc3dSmrg 1631debfc3dSmrg void 1641debfc3dSmrg _M_do_flip() _GLIBCXX_NOEXCEPT 1651debfc3dSmrg { 1661debfc3dSmrg for (size_t __i = 0; __i < _Nw; __i++) 1671debfc3dSmrg _M_w[__i] = ~_M_w[__i]; 1681debfc3dSmrg } 1691debfc3dSmrg 1701debfc3dSmrg void 1711debfc3dSmrg _M_do_set() _GLIBCXX_NOEXCEPT 1721debfc3dSmrg { 1731debfc3dSmrg for (size_t __i = 0; __i < _Nw; __i++) 1741debfc3dSmrg _M_w[__i] = ~static_cast<_WordT>(0); 1751debfc3dSmrg } 1761debfc3dSmrg 1771debfc3dSmrg void 1781debfc3dSmrg _M_do_reset() _GLIBCXX_NOEXCEPT 1791debfc3dSmrg { __builtin_memset(_M_w, 0, _Nw * sizeof(_WordT)); } 1801debfc3dSmrg 1811debfc3dSmrg bool 1821debfc3dSmrg _M_is_equal(const _Base_bitset<_Nw>& __x) const _GLIBCXX_NOEXCEPT 1831debfc3dSmrg { 1841debfc3dSmrg for (size_t __i = 0; __i < _Nw; ++__i) 1851debfc3dSmrg if (_M_w[__i] != __x._M_w[__i]) 1861debfc3dSmrg return false; 1871debfc3dSmrg return true; 1881debfc3dSmrg } 1891debfc3dSmrg 1901debfc3dSmrg template<size_t _Nb> 1911debfc3dSmrg bool 1921debfc3dSmrg _M_are_all() const _GLIBCXX_NOEXCEPT 1931debfc3dSmrg { 1941debfc3dSmrg for (size_t __i = 0; __i < _Nw - 1; __i++) 1951debfc3dSmrg if (_M_w[__i] != ~static_cast<_WordT>(0)) 1961debfc3dSmrg return false; 1971debfc3dSmrg return _M_hiword() == (~static_cast<_WordT>(0) 1981debfc3dSmrg >> (_Nw * _GLIBCXX_BITSET_BITS_PER_WORD 1991debfc3dSmrg - _Nb)); 2001debfc3dSmrg } 2011debfc3dSmrg 2021debfc3dSmrg bool 2031debfc3dSmrg _M_is_any() const _GLIBCXX_NOEXCEPT 2041debfc3dSmrg { 2051debfc3dSmrg for (size_t __i = 0; __i < _Nw; __i++) 2061debfc3dSmrg if (_M_w[__i] != static_cast<_WordT>(0)) 2071debfc3dSmrg return true; 2081debfc3dSmrg return false; 2091debfc3dSmrg } 2101debfc3dSmrg 2111debfc3dSmrg size_t 2121debfc3dSmrg _M_do_count() const _GLIBCXX_NOEXCEPT 2131debfc3dSmrg { 2141debfc3dSmrg size_t __result = 0; 2151debfc3dSmrg for (size_t __i = 0; __i < _Nw; __i++) 2161debfc3dSmrg __result += __builtin_popcountl(_M_w[__i]); 2171debfc3dSmrg return __result; 2181debfc3dSmrg } 2191debfc3dSmrg 2201debfc3dSmrg unsigned long 2211debfc3dSmrg _M_do_to_ulong() const; 2221debfc3dSmrg 2231debfc3dSmrg#if __cplusplus >= 201103L 2241debfc3dSmrg unsigned long long 2251debfc3dSmrg _M_do_to_ullong() const; 2261debfc3dSmrg#endif 2271debfc3dSmrg 2281debfc3dSmrg // find first "on" bit 2291debfc3dSmrg size_t 2301debfc3dSmrg _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT; 2311debfc3dSmrg 2321debfc3dSmrg // find the next "on" bit that follows "prev" 2331debfc3dSmrg size_t 2341debfc3dSmrg _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT; 2351debfc3dSmrg }; 2361debfc3dSmrg 2371debfc3dSmrg // Definitions of non-inline functions from _Base_bitset. 2381debfc3dSmrg template<size_t _Nw> 2391debfc3dSmrg void 2401debfc3dSmrg _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT 2411debfc3dSmrg { 2421debfc3dSmrg if (__builtin_expect(__shift != 0, 1)) 2431debfc3dSmrg { 2441debfc3dSmrg const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD; 2451debfc3dSmrg const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD; 2461debfc3dSmrg 2471debfc3dSmrg if (__offset == 0) 2481debfc3dSmrg for (size_t __n = _Nw - 1; __n >= __wshift; --__n) 2491debfc3dSmrg _M_w[__n] = _M_w[__n - __wshift]; 2501debfc3dSmrg else 2511debfc3dSmrg { 2521debfc3dSmrg const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD 2531debfc3dSmrg - __offset); 2541debfc3dSmrg for (size_t __n = _Nw - 1; __n > __wshift; --__n) 2551debfc3dSmrg _M_w[__n] = ((_M_w[__n - __wshift] << __offset) 2561debfc3dSmrg | (_M_w[__n - __wshift - 1] >> __sub_offset)); 2571debfc3dSmrg _M_w[__wshift] = _M_w[0] << __offset; 2581debfc3dSmrg } 2591debfc3dSmrg 2601debfc3dSmrg std::fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0)); 2611debfc3dSmrg } 2621debfc3dSmrg } 2631debfc3dSmrg 2641debfc3dSmrg template<size_t _Nw> 2651debfc3dSmrg void 2661debfc3dSmrg _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT 2671debfc3dSmrg { 2681debfc3dSmrg if (__builtin_expect(__shift != 0, 1)) 2691debfc3dSmrg { 2701debfc3dSmrg const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD; 2711debfc3dSmrg const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD; 2721debfc3dSmrg const size_t __limit = _Nw - __wshift - 1; 2731debfc3dSmrg 2741debfc3dSmrg if (__offset == 0) 2751debfc3dSmrg for (size_t __n = 0; __n <= __limit; ++__n) 2761debfc3dSmrg _M_w[__n] = _M_w[__n + __wshift]; 2771debfc3dSmrg else 2781debfc3dSmrg { 2791debfc3dSmrg const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD 2801debfc3dSmrg - __offset); 2811debfc3dSmrg for (size_t __n = 0; __n < __limit; ++__n) 2821debfc3dSmrg _M_w[__n] = ((_M_w[__n + __wshift] >> __offset) 2831debfc3dSmrg | (_M_w[__n + __wshift + 1] << __sub_offset)); 2841debfc3dSmrg _M_w[__limit] = _M_w[_Nw-1] >> __offset; 2851debfc3dSmrg } 2861debfc3dSmrg 2871debfc3dSmrg std::fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0)); 2881debfc3dSmrg } 2891debfc3dSmrg } 2901debfc3dSmrg 2911debfc3dSmrg template<size_t _Nw> 2921debfc3dSmrg unsigned long 2931debfc3dSmrg _Base_bitset<_Nw>::_M_do_to_ulong() const 2941debfc3dSmrg { 2951debfc3dSmrg for (size_t __i = 1; __i < _Nw; ++__i) 2961debfc3dSmrg if (_M_w[__i]) 2971debfc3dSmrg __throw_overflow_error(__N("_Base_bitset::_M_do_to_ulong")); 2981debfc3dSmrg return _M_w[0]; 2991debfc3dSmrg } 3001debfc3dSmrg 3011debfc3dSmrg#if __cplusplus >= 201103L 3021debfc3dSmrg template<size_t _Nw> 3031debfc3dSmrg unsigned long long 3041debfc3dSmrg _Base_bitset<_Nw>::_M_do_to_ullong() const 3051debfc3dSmrg { 3061debfc3dSmrg const bool __dw = sizeof(unsigned long long) > sizeof(unsigned long); 3071debfc3dSmrg for (size_t __i = 1 + __dw; __i < _Nw; ++__i) 3081debfc3dSmrg if (_M_w[__i]) 3091debfc3dSmrg __throw_overflow_error(__N("_Base_bitset::_M_do_to_ullong")); 3101debfc3dSmrg 3111debfc3dSmrg if (__dw) 3121debfc3dSmrg return _M_w[0] + (static_cast<unsigned long long>(_M_w[1]) 3131debfc3dSmrg << _GLIBCXX_BITSET_BITS_PER_WORD); 3141debfc3dSmrg return _M_w[0]; 3151debfc3dSmrg } 3161debfc3dSmrg#endif 3171debfc3dSmrg 3181debfc3dSmrg template<size_t _Nw> 3191debfc3dSmrg size_t 3201debfc3dSmrg _Base_bitset<_Nw>:: 3211debfc3dSmrg _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT 3221debfc3dSmrg { 3231debfc3dSmrg for (size_t __i = 0; __i < _Nw; __i++) 3241debfc3dSmrg { 3251debfc3dSmrg _WordT __thisword = _M_w[__i]; 3261debfc3dSmrg if (__thisword != static_cast<_WordT>(0)) 3271debfc3dSmrg return (__i * _GLIBCXX_BITSET_BITS_PER_WORD 3281debfc3dSmrg + __builtin_ctzl(__thisword)); 3291debfc3dSmrg } 3301debfc3dSmrg // not found, so return an indication of failure. 3311debfc3dSmrg return __not_found; 3321debfc3dSmrg } 3331debfc3dSmrg 3341debfc3dSmrg template<size_t _Nw> 3351debfc3dSmrg size_t 3361debfc3dSmrg _Base_bitset<_Nw>:: 3371debfc3dSmrg _M_do_find_next(size_t __prev, size_t __not_found) const _GLIBCXX_NOEXCEPT 3381debfc3dSmrg { 3391debfc3dSmrg // make bound inclusive 3401debfc3dSmrg ++__prev; 3411debfc3dSmrg 3421debfc3dSmrg // check out of bounds 3431debfc3dSmrg if (__prev >= _Nw * _GLIBCXX_BITSET_BITS_PER_WORD) 3441debfc3dSmrg return __not_found; 3451debfc3dSmrg 3461debfc3dSmrg // search first word 3471debfc3dSmrg size_t __i = _S_whichword(__prev); 3481debfc3dSmrg _WordT __thisword = _M_w[__i]; 3491debfc3dSmrg 3501debfc3dSmrg // mask off bits below bound 3511debfc3dSmrg __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev); 3521debfc3dSmrg 3531debfc3dSmrg if (__thisword != static_cast<_WordT>(0)) 3541debfc3dSmrg return (__i * _GLIBCXX_BITSET_BITS_PER_WORD 3551debfc3dSmrg + __builtin_ctzl(__thisword)); 3561debfc3dSmrg 3571debfc3dSmrg // check subsequent words 3581debfc3dSmrg __i++; 3591debfc3dSmrg for (; __i < _Nw; __i++) 3601debfc3dSmrg { 3611debfc3dSmrg __thisword = _M_w[__i]; 3621debfc3dSmrg if (__thisword != static_cast<_WordT>(0)) 3631debfc3dSmrg return (__i * _GLIBCXX_BITSET_BITS_PER_WORD 3641debfc3dSmrg + __builtin_ctzl(__thisword)); 3651debfc3dSmrg } 3661debfc3dSmrg // not found, so return an indication of failure. 3671debfc3dSmrg return __not_found; 3681debfc3dSmrg } // end _M_do_find_next 3691debfc3dSmrg 3701debfc3dSmrg /** 3711debfc3dSmrg * Base class, specialization for a single word. 3721debfc3dSmrg * 3731debfc3dSmrg * See documentation for bitset. 3741debfc3dSmrg */ 3751debfc3dSmrg template<> 3761debfc3dSmrg struct _Base_bitset<1> 3771debfc3dSmrg { 3781debfc3dSmrg typedef unsigned long _WordT; 3791debfc3dSmrg _WordT _M_w; 3801debfc3dSmrg 3811debfc3dSmrg _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT 3821debfc3dSmrg : _M_w(0) 3831debfc3dSmrg { } 3841debfc3dSmrg 3851debfc3dSmrg#if __cplusplus >= 201103L 3861debfc3dSmrg constexpr _Base_bitset(unsigned long long __val) noexcept 3871debfc3dSmrg#else 3881debfc3dSmrg _Base_bitset(unsigned long __val) 3891debfc3dSmrg#endif 3901debfc3dSmrg : _M_w(__val) 3911debfc3dSmrg { } 3921debfc3dSmrg 3931debfc3dSmrg static _GLIBCXX_CONSTEXPR size_t 3941debfc3dSmrg _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT 3951debfc3dSmrg { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; } 3961debfc3dSmrg 3971debfc3dSmrg static _GLIBCXX_CONSTEXPR size_t 3981debfc3dSmrg _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT 3991debfc3dSmrg { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; } 4001debfc3dSmrg 4011debfc3dSmrg static _GLIBCXX_CONSTEXPR size_t 4021debfc3dSmrg _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT 4031debfc3dSmrg { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; } 4041debfc3dSmrg 4051debfc3dSmrg static _GLIBCXX_CONSTEXPR _WordT 4061debfc3dSmrg _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT 4071debfc3dSmrg { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } 4081debfc3dSmrg 4091debfc3dSmrg _WordT& 4101debfc3dSmrg _M_getword(size_t) _GLIBCXX_NOEXCEPT 4111debfc3dSmrg { return _M_w; } 4121debfc3dSmrg 4131debfc3dSmrg _GLIBCXX_CONSTEXPR _WordT 4141debfc3dSmrg _M_getword(size_t) const _GLIBCXX_NOEXCEPT 4151debfc3dSmrg { return _M_w; } 4161debfc3dSmrg 4171debfc3dSmrg#if __cplusplus >= 201103L 4181debfc3dSmrg const _WordT* 4191debfc3dSmrg _M_getdata() const noexcept 4201debfc3dSmrg { return &_M_w; } 4211debfc3dSmrg#endif 4221debfc3dSmrg 4231debfc3dSmrg _WordT& 4241debfc3dSmrg _M_hiword() _GLIBCXX_NOEXCEPT 4251debfc3dSmrg { return _M_w; } 4261debfc3dSmrg 4271debfc3dSmrg _GLIBCXX_CONSTEXPR _WordT 4281debfc3dSmrg _M_hiword() const _GLIBCXX_NOEXCEPT 4291debfc3dSmrg { return _M_w; } 4301debfc3dSmrg 4311debfc3dSmrg void 4321debfc3dSmrg _M_do_and(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT 4331debfc3dSmrg { _M_w &= __x._M_w; } 4341debfc3dSmrg 4351debfc3dSmrg void 4361debfc3dSmrg _M_do_or(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT 4371debfc3dSmrg { _M_w |= __x._M_w; } 4381debfc3dSmrg 4391debfc3dSmrg void 4401debfc3dSmrg _M_do_xor(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT 4411debfc3dSmrg { _M_w ^= __x._M_w; } 4421debfc3dSmrg 4431debfc3dSmrg void 4441debfc3dSmrg _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT 4451debfc3dSmrg { _M_w <<= __shift; } 4461debfc3dSmrg 4471debfc3dSmrg void 4481debfc3dSmrg _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT 4491debfc3dSmrg { _M_w >>= __shift; } 4501debfc3dSmrg 4511debfc3dSmrg void 4521debfc3dSmrg _M_do_flip() _GLIBCXX_NOEXCEPT 4531debfc3dSmrg { _M_w = ~_M_w; } 4541debfc3dSmrg 4551debfc3dSmrg void 4561debfc3dSmrg _M_do_set() _GLIBCXX_NOEXCEPT 4571debfc3dSmrg { _M_w = ~static_cast<_WordT>(0); } 4581debfc3dSmrg 4591debfc3dSmrg void 4601debfc3dSmrg _M_do_reset() _GLIBCXX_NOEXCEPT 4611debfc3dSmrg { _M_w = 0; } 4621debfc3dSmrg 4631debfc3dSmrg bool 4641debfc3dSmrg _M_is_equal(const _Base_bitset<1>& __x) const _GLIBCXX_NOEXCEPT 4651debfc3dSmrg { return _M_w == __x._M_w; } 4661debfc3dSmrg 4671debfc3dSmrg template<size_t _Nb> 4681debfc3dSmrg bool 4691debfc3dSmrg _M_are_all() const _GLIBCXX_NOEXCEPT 4701debfc3dSmrg { return _M_w == (~static_cast<_WordT>(0) 4711debfc3dSmrg >> (_GLIBCXX_BITSET_BITS_PER_WORD - _Nb)); } 4721debfc3dSmrg 4731debfc3dSmrg bool 4741debfc3dSmrg _M_is_any() const _GLIBCXX_NOEXCEPT 4751debfc3dSmrg { return _M_w != 0; } 4761debfc3dSmrg 4771debfc3dSmrg size_t 4781debfc3dSmrg _M_do_count() const _GLIBCXX_NOEXCEPT 4791debfc3dSmrg { return __builtin_popcountl(_M_w); } 4801debfc3dSmrg 4811debfc3dSmrg unsigned long 4821debfc3dSmrg _M_do_to_ulong() const _GLIBCXX_NOEXCEPT 4831debfc3dSmrg { return _M_w; } 4841debfc3dSmrg 4851debfc3dSmrg#if __cplusplus >= 201103L 4861debfc3dSmrg unsigned long long 4871debfc3dSmrg _M_do_to_ullong() const noexcept 4881debfc3dSmrg { return _M_w; } 4891debfc3dSmrg#endif 4901debfc3dSmrg 4911debfc3dSmrg size_t 4921debfc3dSmrg _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT 4931debfc3dSmrg { 4941debfc3dSmrg if (_M_w != 0) 4951debfc3dSmrg return __builtin_ctzl(_M_w); 4961debfc3dSmrg else 4971debfc3dSmrg return __not_found; 4981debfc3dSmrg } 4991debfc3dSmrg 5001debfc3dSmrg // find the next "on" bit that follows "prev" 5011debfc3dSmrg size_t 5021debfc3dSmrg _M_do_find_next(size_t __prev, size_t __not_found) const 5031debfc3dSmrg _GLIBCXX_NOEXCEPT 5041debfc3dSmrg { 5051debfc3dSmrg ++__prev; 5061debfc3dSmrg if (__prev >= ((size_t) _GLIBCXX_BITSET_BITS_PER_WORD)) 5071debfc3dSmrg return __not_found; 5081debfc3dSmrg 5091debfc3dSmrg _WordT __x = _M_w >> __prev; 5101debfc3dSmrg if (__x != 0) 5111debfc3dSmrg return __builtin_ctzl(__x) + __prev; 5121debfc3dSmrg else 5131debfc3dSmrg return __not_found; 5141debfc3dSmrg } 5151debfc3dSmrg }; 5161debfc3dSmrg 5171debfc3dSmrg /** 5181debfc3dSmrg * Base class, specialization for no storage (zero-length %bitset). 5191debfc3dSmrg * 5201debfc3dSmrg * See documentation for bitset. 5211debfc3dSmrg */ 5221debfc3dSmrg template<> 5231debfc3dSmrg struct _Base_bitset<0> 5241debfc3dSmrg { 5251debfc3dSmrg typedef unsigned long _WordT; 5261debfc3dSmrg 5271debfc3dSmrg _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT 5281debfc3dSmrg { } 5291debfc3dSmrg 5301debfc3dSmrg#if __cplusplus >= 201103L 5311debfc3dSmrg constexpr _Base_bitset(unsigned long long) noexcept 5321debfc3dSmrg#else 5331debfc3dSmrg _Base_bitset(unsigned long) 5341debfc3dSmrg#endif 5351debfc3dSmrg { } 5361debfc3dSmrg 5371debfc3dSmrg static _GLIBCXX_CONSTEXPR size_t 5381debfc3dSmrg _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT 5391debfc3dSmrg { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; } 5401debfc3dSmrg 5411debfc3dSmrg static _GLIBCXX_CONSTEXPR size_t 5421debfc3dSmrg _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT 5431debfc3dSmrg { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; } 5441debfc3dSmrg 5451debfc3dSmrg static _GLIBCXX_CONSTEXPR size_t 5461debfc3dSmrg _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT 5471debfc3dSmrg { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; } 5481debfc3dSmrg 5491debfc3dSmrg static _GLIBCXX_CONSTEXPR _WordT 5501debfc3dSmrg _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT 5511debfc3dSmrg { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } 5521debfc3dSmrg 5531debfc3dSmrg // This would normally give access to the data. The bounds-checking 5541debfc3dSmrg // in the bitset class will prevent the user from getting this far, 5551debfc3dSmrg // but (1) it must still return an lvalue to compile, and (2) the 5561debfc3dSmrg // user might call _Unchecked_set directly, in which case this /needs/ 5571debfc3dSmrg // to fail. Let's not penalize zero-length users unless they actually 5581debfc3dSmrg // make an unchecked call; all the memory ugliness is therefore 5591debfc3dSmrg // localized to this single should-never-get-this-far function. 5601debfc3dSmrg _WordT& 5611debfc3dSmrg _M_getword(size_t) _GLIBCXX_NOEXCEPT 5621debfc3dSmrg { 5631debfc3dSmrg __throw_out_of_range(__N("_Base_bitset::_M_getword")); 5641debfc3dSmrg return *new _WordT; 5651debfc3dSmrg } 5661debfc3dSmrg 5671debfc3dSmrg _GLIBCXX_CONSTEXPR _WordT 568a2dc1f3fSmrg _M_getword(size_t) const _GLIBCXX_NOEXCEPT 5691debfc3dSmrg { return 0; } 5701debfc3dSmrg 5711debfc3dSmrg _GLIBCXX_CONSTEXPR _WordT 5721debfc3dSmrg _M_hiword() const _GLIBCXX_NOEXCEPT 5731debfc3dSmrg { return 0; } 5741debfc3dSmrg 5751debfc3dSmrg void 5761debfc3dSmrg _M_do_and(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT 5771debfc3dSmrg { } 5781debfc3dSmrg 5791debfc3dSmrg void 5801debfc3dSmrg _M_do_or(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT 5811debfc3dSmrg { } 5821debfc3dSmrg 5831debfc3dSmrg void 5841debfc3dSmrg _M_do_xor(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT 5851debfc3dSmrg { } 5861debfc3dSmrg 5871debfc3dSmrg void 5881debfc3dSmrg _M_do_left_shift(size_t) _GLIBCXX_NOEXCEPT 5891debfc3dSmrg { } 5901debfc3dSmrg 5911debfc3dSmrg void 5921debfc3dSmrg _M_do_right_shift(size_t) _GLIBCXX_NOEXCEPT 5931debfc3dSmrg { } 5941debfc3dSmrg 5951debfc3dSmrg void 5961debfc3dSmrg _M_do_flip() _GLIBCXX_NOEXCEPT 5971debfc3dSmrg { } 5981debfc3dSmrg 5991debfc3dSmrg void 6001debfc3dSmrg _M_do_set() _GLIBCXX_NOEXCEPT 6011debfc3dSmrg { } 6021debfc3dSmrg 6031debfc3dSmrg void 6041debfc3dSmrg _M_do_reset() _GLIBCXX_NOEXCEPT 6051debfc3dSmrg { } 6061debfc3dSmrg 6071debfc3dSmrg // Are all empty bitsets equal to each other? Are they equal to 6081debfc3dSmrg // themselves? How to compare a thing which has no state? What is 6091debfc3dSmrg // the sound of one zero-length bitset clapping? 6101debfc3dSmrg bool 6111debfc3dSmrg _M_is_equal(const _Base_bitset<0>&) const _GLIBCXX_NOEXCEPT 6121debfc3dSmrg { return true; } 6131debfc3dSmrg 6141debfc3dSmrg template<size_t _Nb> 6151debfc3dSmrg bool 6161debfc3dSmrg _M_are_all() const _GLIBCXX_NOEXCEPT 6171debfc3dSmrg { return true; } 6181debfc3dSmrg 6191debfc3dSmrg bool 6201debfc3dSmrg _M_is_any() const _GLIBCXX_NOEXCEPT 6211debfc3dSmrg { return false; } 6221debfc3dSmrg 6231debfc3dSmrg size_t 6241debfc3dSmrg _M_do_count() const _GLIBCXX_NOEXCEPT 6251debfc3dSmrg { return 0; } 6261debfc3dSmrg 6271debfc3dSmrg unsigned long 6281debfc3dSmrg _M_do_to_ulong() const _GLIBCXX_NOEXCEPT 6291debfc3dSmrg { return 0; } 6301debfc3dSmrg 6311debfc3dSmrg#if __cplusplus >= 201103L 6321debfc3dSmrg unsigned long long 6331debfc3dSmrg _M_do_to_ullong() const noexcept 6341debfc3dSmrg { return 0; } 6351debfc3dSmrg#endif 6361debfc3dSmrg 6371debfc3dSmrg // Normally "not found" is the size, but that could also be 6381debfc3dSmrg // misinterpreted as an index in this corner case. Oh well. 6391debfc3dSmrg size_t 6401debfc3dSmrg _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT 6411debfc3dSmrg { return 0; } 6421debfc3dSmrg 6431debfc3dSmrg size_t 6441debfc3dSmrg _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT 6451debfc3dSmrg { return 0; } 6461debfc3dSmrg }; 6471debfc3dSmrg 6481debfc3dSmrg 6491debfc3dSmrg // Helper class to zero out the unused high-order bits in the highest word. 6501debfc3dSmrg template<size_t _Extrabits> 6511debfc3dSmrg struct _Sanitize 6521debfc3dSmrg { 6531debfc3dSmrg typedef unsigned long _WordT; 6541debfc3dSmrg 6551debfc3dSmrg static void 6561debfc3dSmrg _S_do_sanitize(_WordT& __val) _GLIBCXX_NOEXCEPT 6571debfc3dSmrg { __val &= ~((~static_cast<_WordT>(0)) << _Extrabits); } 6581debfc3dSmrg }; 6591debfc3dSmrg 6601debfc3dSmrg template<> 6611debfc3dSmrg struct _Sanitize<0> 6621debfc3dSmrg { 6631debfc3dSmrg typedef unsigned long _WordT; 6641debfc3dSmrg 6651debfc3dSmrg static void 6661debfc3dSmrg _S_do_sanitize(_WordT) _GLIBCXX_NOEXCEPT { } 6671debfc3dSmrg }; 6681debfc3dSmrg 6691debfc3dSmrg#if __cplusplus >= 201103L 6701debfc3dSmrg template<size_t _Nb, bool = (_Nb < _GLIBCXX_BITSET_BITS_PER_ULL)> 6711debfc3dSmrg struct _Sanitize_val 6721debfc3dSmrg { 6731debfc3dSmrg static constexpr unsigned long long 6741debfc3dSmrg _S_do_sanitize_val(unsigned long long __val) 6751debfc3dSmrg { return __val; } 6761debfc3dSmrg }; 6771debfc3dSmrg 6781debfc3dSmrg template<size_t _Nb> 6791debfc3dSmrg struct _Sanitize_val<_Nb, true> 6801debfc3dSmrg { 6811debfc3dSmrg static constexpr unsigned long long 6821debfc3dSmrg _S_do_sanitize_val(unsigned long long __val) 6831debfc3dSmrg { return __val & ~((~static_cast<unsigned long long>(0)) << _Nb); } 6841debfc3dSmrg }; 6851debfc3dSmrg#endif 6861debfc3dSmrg 6871debfc3dSmrg /** 6881debfc3dSmrg * @brief The %bitset class represents a @e fixed-size sequence of bits. 6891debfc3dSmrg * @ingroup utilities 6901debfc3dSmrg * 6911debfc3dSmrg * (Note that %bitset does @e not meet the formal requirements of a 6921debfc3dSmrg * <a href="tables.html#65">container</a>. Mainly, it lacks iterators.) 6931debfc3dSmrg * 6941debfc3dSmrg * The template argument, @a Nb, may be any non-negative number, 6951debfc3dSmrg * specifying the number of bits (e.g., "0", "12", "1024*1024"). 6961debfc3dSmrg * 6971debfc3dSmrg * In the general unoptimized case, storage is allocated in word-sized 6981debfc3dSmrg * blocks. Let B be the number of bits in a word, then (Nb+(B-1))/B 6991debfc3dSmrg * words will be used for storage. B - Nb%B bits are unused. (They are 7001debfc3dSmrg * the high-order bits in the highest word.) It is a class invariant 7011debfc3dSmrg * that those unused bits are always zero. 7021debfc3dSmrg * 7031debfc3dSmrg * If you think of %bitset as <em>a simple array of bits</em>, be 7041debfc3dSmrg * aware that your mental picture is reversed: a %bitset behaves 7051debfc3dSmrg * the same way as bits in integers do, with the bit at index 0 in 7061debfc3dSmrg * the <em>least significant / right-hand</em> position, and the bit at 7071debfc3dSmrg * index Nb-1 in the <em>most significant / left-hand</em> position. 7081debfc3dSmrg * Thus, unlike other containers, a %bitset's index <em>counts from 7091debfc3dSmrg * right to left</em>, to put it very loosely. 7101debfc3dSmrg * 7111debfc3dSmrg * This behavior is preserved when translating to and from strings. For 7121debfc3dSmrg * example, the first line of the following program probably prints 7131debfc3dSmrg * <em>b('a') is 0001100001</em> on a modern ASCII system. 7141debfc3dSmrg * 7151debfc3dSmrg * @code 7161debfc3dSmrg * #include <bitset> 7171debfc3dSmrg * #include <iostream> 7181debfc3dSmrg * #include <sstream> 7191debfc3dSmrg * 7201debfc3dSmrg * using namespace std; 7211debfc3dSmrg * 7221debfc3dSmrg * int main() 7231debfc3dSmrg * { 7241debfc3dSmrg * long a = 'a'; 7251debfc3dSmrg * bitset<10> b(a); 7261debfc3dSmrg * 7271debfc3dSmrg * cout << "b('a') is " << b << endl; 7281debfc3dSmrg * 7291debfc3dSmrg * ostringstream s; 7301debfc3dSmrg * s << b; 7311debfc3dSmrg * string str = s.str(); 7321debfc3dSmrg * cout << "index 3 in the string is " << str[3] << " but\n" 7331debfc3dSmrg * << "index 3 in the bitset is " << b[3] << endl; 7341debfc3dSmrg * } 7351debfc3dSmrg * @endcode 7361debfc3dSmrg * 7371debfc3dSmrg * Also see: 7381debfc3dSmrg * https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_containers.html 7391debfc3dSmrg * for a description of extensions. 7401debfc3dSmrg * 7411debfc3dSmrg * Most of the actual code isn't contained in %bitset<> itself, but in the 7421debfc3dSmrg * base class _Base_bitset. The base class works with whole words, not with 7431debfc3dSmrg * individual bits. This allows us to specialize _Base_bitset for the 7441debfc3dSmrg * important special case where the %bitset is only a single word. 7451debfc3dSmrg * 7461debfc3dSmrg * Extra confusion can result due to the fact that the storage for 7471debfc3dSmrg * _Base_bitset @e is a regular array, and is indexed as such. This is 7481debfc3dSmrg * carefully encapsulated. 7491debfc3dSmrg */ 7501debfc3dSmrg template<size_t _Nb> 7511debfc3dSmrg class bitset 7521debfc3dSmrg : private _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> 7531debfc3dSmrg { 7541debfc3dSmrg private: 7551debfc3dSmrg typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base; 7561debfc3dSmrg typedef unsigned long _WordT; 7571debfc3dSmrg 7581debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 7591debfc3dSmrg void 7601debfc3dSmrg _M_check_initial_position(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 7611debfc3dSmrg size_t __position) const 7621debfc3dSmrg { 7631debfc3dSmrg if (__position > __s.size()) 7641debfc3dSmrg __throw_out_of_range_fmt(__N("bitset::bitset: __position " 7651debfc3dSmrg "(which is %zu) > __s.size() " 7661debfc3dSmrg "(which is %zu)"), 7671debfc3dSmrg __position, __s.size()); 7681debfc3dSmrg } 7691debfc3dSmrg 7701debfc3dSmrg void _M_check(size_t __position, const char *__s) const 7711debfc3dSmrg { 7721debfc3dSmrg if (__position >= _Nb) 7731debfc3dSmrg __throw_out_of_range_fmt(__N("%s: __position (which is %zu) " 7741debfc3dSmrg ">= _Nb (which is %zu)"), 7751debfc3dSmrg __s, __position, _Nb); 7761debfc3dSmrg } 7771debfc3dSmrg 7781debfc3dSmrg void 7791debfc3dSmrg _M_do_sanitize() _GLIBCXX_NOEXCEPT 7801debfc3dSmrg { 7811debfc3dSmrg typedef _Sanitize<_Nb % _GLIBCXX_BITSET_BITS_PER_WORD> __sanitize_type; 7821debfc3dSmrg __sanitize_type::_S_do_sanitize(this->_M_hiword()); 7831debfc3dSmrg } 7841debfc3dSmrg 7851debfc3dSmrg#if __cplusplus >= 201103L 786a2dc1f3fSmrg friend struct std::hash<bitset>; 7871debfc3dSmrg#endif 7881debfc3dSmrg 7891debfc3dSmrg public: 7901debfc3dSmrg /** 7911debfc3dSmrg * This encapsulates the concept of a single bit. An instance of this 7921debfc3dSmrg * class is a proxy for an actual bit; this way the individual bit 7931debfc3dSmrg * operations are done as faster word-size bitwise instructions. 7941debfc3dSmrg * 7951debfc3dSmrg * Most users will never need to use this class directly; conversions 7961debfc3dSmrg * to and from bool are automatic and should be transparent. Overloaded 7971debfc3dSmrg * operators help to preserve the illusion. 7981debfc3dSmrg * 7991debfc3dSmrg * (On a typical system, this <em>bit %reference</em> is 64 8001debfc3dSmrg * times the size of an actual bit. Ha.) 8011debfc3dSmrg */ 8021debfc3dSmrg class reference 8031debfc3dSmrg { 8041debfc3dSmrg friend class bitset; 8051debfc3dSmrg 8061debfc3dSmrg _WordT* _M_wp; 8071debfc3dSmrg size_t _M_bpos; 8081debfc3dSmrg 8091debfc3dSmrg // left undefined 8101debfc3dSmrg reference(); 8111debfc3dSmrg 8121debfc3dSmrg public: 8131debfc3dSmrg reference(bitset& __b, size_t __pos) _GLIBCXX_NOEXCEPT 8141debfc3dSmrg { 8151debfc3dSmrg _M_wp = &__b._M_getword(__pos); 8161debfc3dSmrg _M_bpos = _Base::_S_whichbit(__pos); 8171debfc3dSmrg } 8181debfc3dSmrg 819c0a68be4Smrg#if __cplusplus >= 201103L 820c0a68be4Smrg reference(const reference&) = default; 821c0a68be4Smrg#endif 822c0a68be4Smrg 8231debfc3dSmrg ~reference() _GLIBCXX_NOEXCEPT 8241debfc3dSmrg { } 8251debfc3dSmrg 8261debfc3dSmrg // For b[i] = __x; 8271debfc3dSmrg reference& 8281debfc3dSmrg operator=(bool __x) _GLIBCXX_NOEXCEPT 8291debfc3dSmrg { 8301debfc3dSmrg if (__x) 8311debfc3dSmrg *_M_wp |= _Base::_S_maskbit(_M_bpos); 8321debfc3dSmrg else 8331debfc3dSmrg *_M_wp &= ~_Base::_S_maskbit(_M_bpos); 8341debfc3dSmrg return *this; 8351debfc3dSmrg } 8361debfc3dSmrg 8371debfc3dSmrg // For b[i] = b[__j]; 8381debfc3dSmrg reference& 8391debfc3dSmrg operator=(const reference& __j) _GLIBCXX_NOEXCEPT 8401debfc3dSmrg { 8411debfc3dSmrg if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos))) 8421debfc3dSmrg *_M_wp |= _Base::_S_maskbit(_M_bpos); 8431debfc3dSmrg else 8441debfc3dSmrg *_M_wp &= ~_Base::_S_maskbit(_M_bpos); 8451debfc3dSmrg return *this; 8461debfc3dSmrg } 8471debfc3dSmrg 8481debfc3dSmrg // Flips the bit 8491debfc3dSmrg bool 8501debfc3dSmrg operator~() const _GLIBCXX_NOEXCEPT 8511debfc3dSmrg { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; } 8521debfc3dSmrg 8531debfc3dSmrg // For __x = b[i]; 8541debfc3dSmrg operator bool() const _GLIBCXX_NOEXCEPT 8551debfc3dSmrg { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; } 8561debfc3dSmrg 8571debfc3dSmrg // For b[i].flip(); 8581debfc3dSmrg reference& 8591debfc3dSmrg flip() _GLIBCXX_NOEXCEPT 8601debfc3dSmrg { 8611debfc3dSmrg *_M_wp ^= _Base::_S_maskbit(_M_bpos); 8621debfc3dSmrg return *this; 8631debfc3dSmrg } 8641debfc3dSmrg }; 8651debfc3dSmrg friend class reference; 8661debfc3dSmrg 8671debfc3dSmrg // 23.3.5.1 constructors: 8681debfc3dSmrg /// All bits set to zero. 8691debfc3dSmrg _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT 8701debfc3dSmrg { } 8711debfc3dSmrg 8721debfc3dSmrg /// Initial bits bitwise-copied from a single word (others set to zero). 8731debfc3dSmrg#if __cplusplus >= 201103L 8741debfc3dSmrg constexpr bitset(unsigned long long __val) noexcept 8751debfc3dSmrg : _Base(_Sanitize_val<_Nb>::_S_do_sanitize_val(__val)) { } 8761debfc3dSmrg#else 8771debfc3dSmrg bitset(unsigned long __val) 8781debfc3dSmrg : _Base(__val) 8791debfc3dSmrg { _M_do_sanitize(); } 8801debfc3dSmrg#endif 8811debfc3dSmrg 8821debfc3dSmrg /** 8831debfc3dSmrg * Use a subset of a string. 8841debfc3dSmrg * @param __s A string of @a 0 and @a 1 characters. 8851debfc3dSmrg * @param __position Index of the first character in @a __s to use; 8861debfc3dSmrg * defaults to zero. 8871debfc3dSmrg * @throw std::out_of_range If @a pos is bigger the size of @a __s. 8881debfc3dSmrg * @throw std::invalid_argument If a character appears in the string 8891debfc3dSmrg * which is neither @a 0 nor @a 1. 8901debfc3dSmrg */ 8911debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 8921debfc3dSmrg explicit 8931debfc3dSmrg bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 8941debfc3dSmrg size_t __position = 0) 8951debfc3dSmrg : _Base() 8961debfc3dSmrg { 8971debfc3dSmrg _M_check_initial_position(__s, __position); 8981debfc3dSmrg _M_copy_from_string(__s, __position, 8991debfc3dSmrg std::basic_string<_CharT, _Traits, _Alloc>::npos, 9001debfc3dSmrg _CharT('0'), _CharT('1')); 9011debfc3dSmrg } 9021debfc3dSmrg 9031debfc3dSmrg /** 9041debfc3dSmrg * Use a subset of a string. 9051debfc3dSmrg * @param __s A string of @a 0 and @a 1 characters. 9061debfc3dSmrg * @param __position Index of the first character in @a __s to use. 9071debfc3dSmrg * @param __n The number of characters to copy. 9081debfc3dSmrg * @throw std::out_of_range If @a __position is bigger the size 9091debfc3dSmrg * of @a __s. 9101debfc3dSmrg * @throw std::invalid_argument If a character appears in the string 9111debfc3dSmrg * which is neither @a 0 nor @a 1. 9121debfc3dSmrg */ 9131debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 9141debfc3dSmrg bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 9151debfc3dSmrg size_t __position, size_t __n) 9161debfc3dSmrg : _Base() 9171debfc3dSmrg { 9181debfc3dSmrg _M_check_initial_position(__s, __position); 9191debfc3dSmrg _M_copy_from_string(__s, __position, __n, _CharT('0'), _CharT('1')); 9201debfc3dSmrg } 9211debfc3dSmrg 9221debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 9231debfc3dSmrg // 396. what are characters zero and one. 9241debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 9251debfc3dSmrg bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 9261debfc3dSmrg size_t __position, size_t __n, 9271debfc3dSmrg _CharT __zero, _CharT __one = _CharT('1')) 9281debfc3dSmrg : _Base() 9291debfc3dSmrg { 9301debfc3dSmrg _M_check_initial_position(__s, __position); 9311debfc3dSmrg _M_copy_from_string(__s, __position, __n, __zero, __one); 9321debfc3dSmrg } 9331debfc3dSmrg 9341debfc3dSmrg#if __cplusplus >= 201103L 9351debfc3dSmrg /** 9361debfc3dSmrg * Construct from a character %array. 9371debfc3dSmrg * @param __str An %array of characters @a zero and @a one. 9381debfc3dSmrg * @param __n The number of characters to use. 9391debfc3dSmrg * @param __zero The character corresponding to the value 0. 9401debfc3dSmrg * @param __one The character corresponding to the value 1. 9411debfc3dSmrg * @throw std::invalid_argument If a character appears in the string 9421debfc3dSmrg * which is neither @a __zero nor @a __one. 9431debfc3dSmrg */ 9441debfc3dSmrg template<typename _CharT> 9451debfc3dSmrg explicit 9461debfc3dSmrg bitset(const _CharT* __str, 9471debfc3dSmrg typename std::basic_string<_CharT>::size_type __n 9481debfc3dSmrg = std::basic_string<_CharT>::npos, 9491debfc3dSmrg _CharT __zero = _CharT('0'), _CharT __one = _CharT('1')) 9501debfc3dSmrg : _Base() 9511debfc3dSmrg { 9521debfc3dSmrg if (!__str) 9531debfc3dSmrg __throw_logic_error(__N("bitset::bitset(const _CharT*, ...)")); 9541debfc3dSmrg 9551debfc3dSmrg if (__n == std::basic_string<_CharT>::npos) 9561debfc3dSmrg __n = std::char_traits<_CharT>::length(__str); 9571debfc3dSmrg _M_copy_from_ptr<_CharT, std::char_traits<_CharT>>(__str, __n, 0, 9581debfc3dSmrg __n, __zero, 9591debfc3dSmrg __one); 9601debfc3dSmrg } 9611debfc3dSmrg#endif 9621debfc3dSmrg 9631debfc3dSmrg // 23.3.5.2 bitset operations: 964*8feb0f0bSmrg ///@{ 9651debfc3dSmrg /** 9661debfc3dSmrg * Operations on bitsets. 9671debfc3dSmrg * @param __rhs A same-sized bitset. 9681debfc3dSmrg * 9691debfc3dSmrg * These should be self-explanatory. 9701debfc3dSmrg */ 9711debfc3dSmrg bitset<_Nb>& 9721debfc3dSmrg operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT 9731debfc3dSmrg { 9741debfc3dSmrg this->_M_do_and(__rhs); 9751debfc3dSmrg return *this; 9761debfc3dSmrg } 9771debfc3dSmrg 9781debfc3dSmrg bitset<_Nb>& 9791debfc3dSmrg operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT 9801debfc3dSmrg { 9811debfc3dSmrg this->_M_do_or(__rhs); 9821debfc3dSmrg return *this; 9831debfc3dSmrg } 9841debfc3dSmrg 9851debfc3dSmrg bitset<_Nb>& 9861debfc3dSmrg operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT 9871debfc3dSmrg { 9881debfc3dSmrg this->_M_do_xor(__rhs); 9891debfc3dSmrg return *this; 9901debfc3dSmrg } 991*8feb0f0bSmrg ///@} 9921debfc3dSmrg 993*8feb0f0bSmrg ///@{ 9941debfc3dSmrg /** 9951debfc3dSmrg * Operations on bitsets. 9961debfc3dSmrg * @param __position The number of places to shift. 9971debfc3dSmrg * 9981debfc3dSmrg * These should be self-explanatory. 9991debfc3dSmrg */ 10001debfc3dSmrg bitset<_Nb>& 10011debfc3dSmrg operator<<=(size_t __position) _GLIBCXX_NOEXCEPT 10021debfc3dSmrg { 10031debfc3dSmrg if (__builtin_expect(__position < _Nb, 1)) 10041debfc3dSmrg { 10051debfc3dSmrg this->_M_do_left_shift(__position); 10061debfc3dSmrg this->_M_do_sanitize(); 10071debfc3dSmrg } 10081debfc3dSmrg else 10091debfc3dSmrg this->_M_do_reset(); 10101debfc3dSmrg return *this; 10111debfc3dSmrg } 10121debfc3dSmrg 10131debfc3dSmrg bitset<_Nb>& 10141debfc3dSmrg operator>>=(size_t __position) _GLIBCXX_NOEXCEPT 10151debfc3dSmrg { 10161debfc3dSmrg if (__builtin_expect(__position < _Nb, 1)) 10171debfc3dSmrg { 10181debfc3dSmrg this->_M_do_right_shift(__position); 10191debfc3dSmrg this->_M_do_sanitize(); 10201debfc3dSmrg } 10211debfc3dSmrg else 10221debfc3dSmrg this->_M_do_reset(); 10231debfc3dSmrg return *this; 10241debfc3dSmrg } 1025*8feb0f0bSmrg ///@} 10261debfc3dSmrg 1027*8feb0f0bSmrg ///@{ 10281debfc3dSmrg /** 10291debfc3dSmrg * These versions of single-bit set, reset, flip, and test are 10301debfc3dSmrg * extensions from the SGI version. They do no range checking. 10311debfc3dSmrg * @ingroup SGIextensions 10321debfc3dSmrg */ 10331debfc3dSmrg bitset<_Nb>& 10341debfc3dSmrg _Unchecked_set(size_t __pos) _GLIBCXX_NOEXCEPT 10351debfc3dSmrg { 10361debfc3dSmrg this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); 10371debfc3dSmrg return *this; 10381debfc3dSmrg } 10391debfc3dSmrg 10401debfc3dSmrg bitset<_Nb>& 10411debfc3dSmrg _Unchecked_set(size_t __pos, int __val) _GLIBCXX_NOEXCEPT 10421debfc3dSmrg { 10431debfc3dSmrg if (__val) 10441debfc3dSmrg this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); 10451debfc3dSmrg else 10461debfc3dSmrg this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); 10471debfc3dSmrg return *this; 10481debfc3dSmrg } 10491debfc3dSmrg 10501debfc3dSmrg bitset<_Nb>& 10511debfc3dSmrg _Unchecked_reset(size_t __pos) _GLIBCXX_NOEXCEPT 10521debfc3dSmrg { 10531debfc3dSmrg this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); 10541debfc3dSmrg return *this; 10551debfc3dSmrg } 10561debfc3dSmrg 10571debfc3dSmrg bitset<_Nb>& 10581debfc3dSmrg _Unchecked_flip(size_t __pos) _GLIBCXX_NOEXCEPT 10591debfc3dSmrg { 10601debfc3dSmrg this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos); 10611debfc3dSmrg return *this; 10621debfc3dSmrg } 10631debfc3dSmrg 10641debfc3dSmrg _GLIBCXX_CONSTEXPR bool 10651debfc3dSmrg _Unchecked_test(size_t __pos) const _GLIBCXX_NOEXCEPT 10661debfc3dSmrg { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos)) 10671debfc3dSmrg != static_cast<_WordT>(0)); } 1068*8feb0f0bSmrg ///@} 10691debfc3dSmrg 10701debfc3dSmrg // Set, reset, and flip. 10711debfc3dSmrg /** 10721debfc3dSmrg * @brief Sets every bit to true. 10731debfc3dSmrg */ 10741debfc3dSmrg bitset<_Nb>& 10751debfc3dSmrg set() _GLIBCXX_NOEXCEPT 10761debfc3dSmrg { 10771debfc3dSmrg this->_M_do_set(); 10781debfc3dSmrg this->_M_do_sanitize(); 10791debfc3dSmrg return *this; 10801debfc3dSmrg } 10811debfc3dSmrg 10821debfc3dSmrg /** 10831debfc3dSmrg * @brief Sets a given bit to a particular value. 10841debfc3dSmrg * @param __position The index of the bit. 10851debfc3dSmrg * @param __val Either true or false, defaults to true. 10861debfc3dSmrg * @throw std::out_of_range If @a pos is bigger the size of the %set. 10871debfc3dSmrg */ 10881debfc3dSmrg bitset<_Nb>& 10891debfc3dSmrg set(size_t __position, bool __val = true) 10901debfc3dSmrg { 10911debfc3dSmrg this->_M_check(__position, __N("bitset::set")); 10921debfc3dSmrg return _Unchecked_set(__position, __val); 10931debfc3dSmrg } 10941debfc3dSmrg 10951debfc3dSmrg /** 10961debfc3dSmrg * @brief Sets every bit to false. 10971debfc3dSmrg */ 10981debfc3dSmrg bitset<_Nb>& 10991debfc3dSmrg reset() _GLIBCXX_NOEXCEPT 11001debfc3dSmrg { 11011debfc3dSmrg this->_M_do_reset(); 11021debfc3dSmrg return *this; 11031debfc3dSmrg } 11041debfc3dSmrg 11051debfc3dSmrg /** 11061debfc3dSmrg * @brief Sets a given bit to false. 11071debfc3dSmrg * @param __position The index of the bit. 11081debfc3dSmrg * @throw std::out_of_range If @a pos is bigger the size of the %set. 11091debfc3dSmrg * 11101debfc3dSmrg * Same as writing @c set(pos,false). 11111debfc3dSmrg */ 11121debfc3dSmrg bitset<_Nb>& 11131debfc3dSmrg reset(size_t __position) 11141debfc3dSmrg { 11151debfc3dSmrg this->_M_check(__position, __N("bitset::reset")); 11161debfc3dSmrg return _Unchecked_reset(__position); 11171debfc3dSmrg } 11181debfc3dSmrg 11191debfc3dSmrg /** 11201debfc3dSmrg * @brief Toggles every bit to its opposite value. 11211debfc3dSmrg */ 11221debfc3dSmrg bitset<_Nb>& 11231debfc3dSmrg flip() _GLIBCXX_NOEXCEPT 11241debfc3dSmrg { 11251debfc3dSmrg this->_M_do_flip(); 11261debfc3dSmrg this->_M_do_sanitize(); 11271debfc3dSmrg return *this; 11281debfc3dSmrg } 11291debfc3dSmrg 11301debfc3dSmrg /** 11311debfc3dSmrg * @brief Toggles a given bit to its opposite value. 11321debfc3dSmrg * @param __position The index of the bit. 11331debfc3dSmrg * @throw std::out_of_range If @a pos is bigger the size of the %set. 11341debfc3dSmrg */ 11351debfc3dSmrg bitset<_Nb>& 11361debfc3dSmrg flip(size_t __position) 11371debfc3dSmrg { 11381debfc3dSmrg this->_M_check(__position, __N("bitset::flip")); 11391debfc3dSmrg return _Unchecked_flip(__position); 11401debfc3dSmrg } 11411debfc3dSmrg 11421debfc3dSmrg /// See the no-argument flip(). 11431debfc3dSmrg bitset<_Nb> 11441debfc3dSmrg operator~() const _GLIBCXX_NOEXCEPT 11451debfc3dSmrg { return bitset<_Nb>(*this).flip(); } 11461debfc3dSmrg 1147*8feb0f0bSmrg ///@{ 11481debfc3dSmrg /** 11491debfc3dSmrg * @brief Array-indexing support. 11501debfc3dSmrg * @param __position Index into the %bitset. 11511debfc3dSmrg * @return A bool for a <em>const %bitset</em>. For non-const 11521debfc3dSmrg * bitsets, an instance of the reference proxy class. 11531debfc3dSmrg * @note These operators do no range checking and throw no exceptions, 11541debfc3dSmrg * as required by DR 11 to the standard. 11551debfc3dSmrg * 11561debfc3dSmrg * _GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already 11571debfc3dSmrg * resolves DR 11 (items 1 and 2), but does not do the range-checking 11581debfc3dSmrg * required by that DR's resolution. -pme 11591debfc3dSmrg * The DR has since been changed: range-checking is a precondition 11601debfc3dSmrg * (users' responsibility), and these functions must not throw. -pme 11611debfc3dSmrg */ 11621debfc3dSmrg reference 11631debfc3dSmrg operator[](size_t __position) 11641debfc3dSmrg { return reference(*this, __position); } 11651debfc3dSmrg 11661debfc3dSmrg _GLIBCXX_CONSTEXPR bool 11671debfc3dSmrg operator[](size_t __position) const 11681debfc3dSmrg { return _Unchecked_test(__position); } 1169*8feb0f0bSmrg ///@} 11701debfc3dSmrg 11711debfc3dSmrg /** 11721debfc3dSmrg * @brief Returns a numerical interpretation of the %bitset. 11731debfc3dSmrg * @return The integral equivalent of the bits. 11741debfc3dSmrg * @throw std::overflow_error If there are too many bits to be 11751debfc3dSmrg * represented in an @c unsigned @c long. 11761debfc3dSmrg */ 11771debfc3dSmrg unsigned long 11781debfc3dSmrg to_ulong() const 11791debfc3dSmrg { return this->_M_do_to_ulong(); } 11801debfc3dSmrg 11811debfc3dSmrg#if __cplusplus >= 201103L 11821debfc3dSmrg unsigned long long 11831debfc3dSmrg to_ullong() const 11841debfc3dSmrg { return this->_M_do_to_ullong(); } 11851debfc3dSmrg#endif 11861debfc3dSmrg 11871debfc3dSmrg /** 11881debfc3dSmrg * @brief Returns a character interpretation of the %bitset. 11891debfc3dSmrg * @return The string equivalent of the bits. 11901debfc3dSmrg * 11911debfc3dSmrg * Note the ordering of the bits: decreasing character positions 11921debfc3dSmrg * correspond to increasing bit positions (see the main class notes for 11931debfc3dSmrg * an example). 11941debfc3dSmrg */ 11951debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 11961debfc3dSmrg std::basic_string<_CharT, _Traits, _Alloc> 11971debfc3dSmrg to_string() const 11981debfc3dSmrg { 11991debfc3dSmrg std::basic_string<_CharT, _Traits, _Alloc> __result; 12001debfc3dSmrg _M_copy_to_string(__result, _CharT('0'), _CharT('1')); 12011debfc3dSmrg return __result; 12021debfc3dSmrg } 12031debfc3dSmrg 12041debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 12051debfc3dSmrg // 396. what are characters zero and one. 12061debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 12071debfc3dSmrg std::basic_string<_CharT, _Traits, _Alloc> 12081debfc3dSmrg to_string(_CharT __zero, _CharT __one = _CharT('1')) const 12091debfc3dSmrg { 12101debfc3dSmrg std::basic_string<_CharT, _Traits, _Alloc> __result; 12111debfc3dSmrg _M_copy_to_string(__result, __zero, __one); 12121debfc3dSmrg return __result; 12131debfc3dSmrg } 12141debfc3dSmrg 12151debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 12161debfc3dSmrg // 434. bitset::to_string() hard to use. 12171debfc3dSmrg template<class _CharT, class _Traits> 12181debfc3dSmrg std::basic_string<_CharT, _Traits, std::allocator<_CharT> > 12191debfc3dSmrg to_string() const 12201debfc3dSmrg { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); } 12211debfc3dSmrg 12221debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 12231debfc3dSmrg // 853. to_string needs updating with zero and one. 12241debfc3dSmrg template<class _CharT, class _Traits> 12251debfc3dSmrg std::basic_string<_CharT, _Traits, std::allocator<_CharT> > 12261debfc3dSmrg to_string(_CharT __zero, _CharT __one = _CharT('1')) const 12271debfc3dSmrg { return to_string<_CharT, _Traits, 12281debfc3dSmrg std::allocator<_CharT> >(__zero, __one); } 12291debfc3dSmrg 12301debfc3dSmrg template<class _CharT> 12311debfc3dSmrg std::basic_string<_CharT, std::char_traits<_CharT>, 12321debfc3dSmrg std::allocator<_CharT> > 12331debfc3dSmrg to_string() const 12341debfc3dSmrg { 12351debfc3dSmrg return to_string<_CharT, std::char_traits<_CharT>, 12361debfc3dSmrg std::allocator<_CharT> >(); 12371debfc3dSmrg } 12381debfc3dSmrg 12391debfc3dSmrg template<class _CharT> 12401debfc3dSmrg std::basic_string<_CharT, std::char_traits<_CharT>, 12411debfc3dSmrg std::allocator<_CharT> > 12421debfc3dSmrg to_string(_CharT __zero, _CharT __one = _CharT('1')) const 12431debfc3dSmrg { 12441debfc3dSmrg return to_string<_CharT, std::char_traits<_CharT>, 12451debfc3dSmrg std::allocator<_CharT> >(__zero, __one); 12461debfc3dSmrg } 12471debfc3dSmrg 12481debfc3dSmrg std::basic_string<char, std::char_traits<char>, std::allocator<char> > 12491debfc3dSmrg to_string() const 12501debfc3dSmrg { 12511debfc3dSmrg return to_string<char, std::char_traits<char>, 12521debfc3dSmrg std::allocator<char> >(); 12531debfc3dSmrg } 12541debfc3dSmrg 12551debfc3dSmrg std::basic_string<char, std::char_traits<char>, std::allocator<char> > 12561debfc3dSmrg to_string(char __zero, char __one = '1') const 12571debfc3dSmrg { 12581debfc3dSmrg return to_string<char, std::char_traits<char>, 12591debfc3dSmrg std::allocator<char> >(__zero, __one); 12601debfc3dSmrg } 12611debfc3dSmrg 12621debfc3dSmrg // Helper functions for string operations. 12631debfc3dSmrg template<class _CharT, class _Traits> 12641debfc3dSmrg void 12651debfc3dSmrg _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t, 12661debfc3dSmrg _CharT, _CharT); 12671debfc3dSmrg 12681debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 12691debfc3dSmrg void 12701debfc3dSmrg _M_copy_from_string(const std::basic_string<_CharT, 12711debfc3dSmrg _Traits, _Alloc>& __s, size_t __pos, size_t __n, 12721debfc3dSmrg _CharT __zero, _CharT __one) 12731debfc3dSmrg { _M_copy_from_ptr<_CharT, _Traits>(__s.data(), __s.size(), __pos, __n, 12741debfc3dSmrg __zero, __one); } 12751debfc3dSmrg 12761debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 12771debfc3dSmrg void 12781debfc3dSmrg _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>&, 12791debfc3dSmrg _CharT, _CharT) const; 12801debfc3dSmrg 12811debfc3dSmrg // NB: Backward compat. 12821debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 12831debfc3dSmrg void 12841debfc3dSmrg _M_copy_from_string(const std::basic_string<_CharT, 12851debfc3dSmrg _Traits, _Alloc>& __s, size_t __pos, size_t __n) 12861debfc3dSmrg { _M_copy_from_string(__s, __pos, __n, _CharT('0'), _CharT('1')); } 12871debfc3dSmrg 12881debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 12891debfc3dSmrg void 12901debfc3dSmrg _M_copy_to_string(std::basic_string<_CharT, _Traits,_Alloc>& __s) const 12911debfc3dSmrg { _M_copy_to_string(__s, _CharT('0'), _CharT('1')); } 12921debfc3dSmrg 12931debfc3dSmrg /// Returns the number of bits which are set. 12941debfc3dSmrg size_t 12951debfc3dSmrg count() const _GLIBCXX_NOEXCEPT 12961debfc3dSmrg { return this->_M_do_count(); } 12971debfc3dSmrg 12981debfc3dSmrg /// Returns the total number of bits. 12991debfc3dSmrg _GLIBCXX_CONSTEXPR size_t 13001debfc3dSmrg size() const _GLIBCXX_NOEXCEPT 13011debfc3dSmrg { return _Nb; } 13021debfc3dSmrg 1303*8feb0f0bSmrg ///@{ 13041debfc3dSmrg /// These comparisons for equality/inequality are, well, @e bitwise. 13051debfc3dSmrg bool 13061debfc3dSmrg operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT 13071debfc3dSmrg { return this->_M_is_equal(__rhs); } 13081debfc3dSmrg 1309*8feb0f0bSmrg#if __cpp_impl_three_way_comparison < 201907L 13101debfc3dSmrg bool 13111debfc3dSmrg operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT 13121debfc3dSmrg { return !this->_M_is_equal(__rhs); } 1313*8feb0f0bSmrg#endif 1314*8feb0f0bSmrg ///@} 13151debfc3dSmrg 13161debfc3dSmrg /** 13171debfc3dSmrg * @brief Tests the value of a bit. 13181debfc3dSmrg * @param __position The index of a bit. 13191debfc3dSmrg * @return The value at @a pos. 13201debfc3dSmrg * @throw std::out_of_range If @a pos is bigger the size of the %set. 13211debfc3dSmrg */ 13221debfc3dSmrg bool 13231debfc3dSmrg test(size_t __position) const 13241debfc3dSmrg { 13251debfc3dSmrg this->_M_check(__position, __N("bitset::test")); 13261debfc3dSmrg return _Unchecked_test(__position); 13271debfc3dSmrg } 13281debfc3dSmrg 13291debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 13301debfc3dSmrg // DR 693. std::bitset::all() missing. 13311debfc3dSmrg /** 13321debfc3dSmrg * @brief Tests whether all the bits are on. 13331debfc3dSmrg * @return True if all the bits are set. 13341debfc3dSmrg */ 13351debfc3dSmrg bool 13361debfc3dSmrg all() const _GLIBCXX_NOEXCEPT 13371debfc3dSmrg { return this->template _M_are_all<_Nb>(); } 13381debfc3dSmrg 13391debfc3dSmrg /** 13401debfc3dSmrg * @brief Tests whether any of the bits are on. 13411debfc3dSmrg * @return True if at least one bit is set. 13421debfc3dSmrg */ 13431debfc3dSmrg bool 13441debfc3dSmrg any() const _GLIBCXX_NOEXCEPT 13451debfc3dSmrg { return this->_M_is_any(); } 13461debfc3dSmrg 13471debfc3dSmrg /** 13481debfc3dSmrg * @brief Tests whether any of the bits are on. 13491debfc3dSmrg * @return True if none of the bits are set. 13501debfc3dSmrg */ 13511debfc3dSmrg bool 13521debfc3dSmrg none() const _GLIBCXX_NOEXCEPT 13531debfc3dSmrg { return !this->_M_is_any(); } 13541debfc3dSmrg 1355*8feb0f0bSmrg ///@{ 13561debfc3dSmrg /// Self-explanatory. 13571debfc3dSmrg bitset<_Nb> 13581debfc3dSmrg operator<<(size_t __position) const _GLIBCXX_NOEXCEPT 13591debfc3dSmrg { return bitset<_Nb>(*this) <<= __position; } 13601debfc3dSmrg 13611debfc3dSmrg bitset<_Nb> 13621debfc3dSmrg operator>>(size_t __position) const _GLIBCXX_NOEXCEPT 13631debfc3dSmrg { return bitset<_Nb>(*this) >>= __position; } 1364*8feb0f0bSmrg ///@} 13651debfc3dSmrg 13661debfc3dSmrg /** 13671debfc3dSmrg * @brief Finds the index of the first "on" bit. 13681debfc3dSmrg * @return The index of the first bit set, or size() if not found. 13691debfc3dSmrg * @ingroup SGIextensions 13701debfc3dSmrg * @sa _Find_next 13711debfc3dSmrg */ 13721debfc3dSmrg size_t 13731debfc3dSmrg _Find_first() const _GLIBCXX_NOEXCEPT 13741debfc3dSmrg { return this->_M_do_find_first(_Nb); } 13751debfc3dSmrg 13761debfc3dSmrg /** 13771debfc3dSmrg * @brief Finds the index of the next "on" bit after prev. 13781debfc3dSmrg * @return The index of the next bit set, or size() if not found. 13791debfc3dSmrg * @param __prev Where to start searching. 13801debfc3dSmrg * @ingroup SGIextensions 13811debfc3dSmrg * @sa _Find_first 13821debfc3dSmrg */ 13831debfc3dSmrg size_t 13841debfc3dSmrg _Find_next(size_t __prev) const _GLIBCXX_NOEXCEPT 13851debfc3dSmrg { return this->_M_do_find_next(__prev, _Nb); } 13861debfc3dSmrg }; 13871debfc3dSmrg 13881debfc3dSmrg // Definitions of non-inline member functions. 13891debfc3dSmrg template<size_t _Nb> 13901debfc3dSmrg template<class _CharT, class _Traits> 13911debfc3dSmrg void 13921debfc3dSmrg bitset<_Nb>:: 13931debfc3dSmrg _M_copy_from_ptr(const _CharT* __s, size_t __len, 13941debfc3dSmrg size_t __pos, size_t __n, _CharT __zero, _CharT __one) 13951debfc3dSmrg { 13961debfc3dSmrg reset(); 13971debfc3dSmrg const size_t __nbits = std::min(_Nb, std::min(__n, size_t(__len - __pos))); 13981debfc3dSmrg for (size_t __i = __nbits; __i > 0; --__i) 13991debfc3dSmrg { 14001debfc3dSmrg const _CharT __c = __s[__pos + __nbits - __i]; 14011debfc3dSmrg if (_Traits::eq(__c, __zero)) 14021debfc3dSmrg ; 14031debfc3dSmrg else if (_Traits::eq(__c, __one)) 14041debfc3dSmrg _Unchecked_set(__i - 1); 14051debfc3dSmrg else 14061debfc3dSmrg __throw_invalid_argument(__N("bitset::_M_copy_from_ptr")); 14071debfc3dSmrg } 14081debfc3dSmrg } 14091debfc3dSmrg 14101debfc3dSmrg template<size_t _Nb> 14111debfc3dSmrg template<class _CharT, class _Traits, class _Alloc> 14121debfc3dSmrg void 14131debfc3dSmrg bitset<_Nb>:: 14141debfc3dSmrg _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>& __s, 14151debfc3dSmrg _CharT __zero, _CharT __one) const 14161debfc3dSmrg { 14171debfc3dSmrg __s.assign(_Nb, __zero); 14181debfc3dSmrg for (size_t __i = _Nb; __i > 0; --__i) 14191debfc3dSmrg if (_Unchecked_test(__i - 1)) 14201debfc3dSmrg _Traits::assign(__s[_Nb - __i], __one); 14211debfc3dSmrg } 14221debfc3dSmrg 14231debfc3dSmrg // 23.3.5.3 bitset operations: 1424*8feb0f0bSmrg ///@{ 14251debfc3dSmrg /** 14261debfc3dSmrg * @brief Global bitwise operations on bitsets. 14271debfc3dSmrg * @param __x A bitset. 14281debfc3dSmrg * @param __y A bitset of the same size as @a __x. 14291debfc3dSmrg * @return A new bitset. 14301debfc3dSmrg * 14311debfc3dSmrg * These should be self-explanatory. 14321debfc3dSmrg */ 14331debfc3dSmrg template<size_t _Nb> 14341debfc3dSmrg inline bitset<_Nb> 14351debfc3dSmrg operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT 14361debfc3dSmrg { 14371debfc3dSmrg bitset<_Nb> __result(__x); 14381debfc3dSmrg __result &= __y; 14391debfc3dSmrg return __result; 14401debfc3dSmrg } 14411debfc3dSmrg 14421debfc3dSmrg template<size_t _Nb> 14431debfc3dSmrg inline bitset<_Nb> 14441debfc3dSmrg operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT 14451debfc3dSmrg { 14461debfc3dSmrg bitset<_Nb> __result(__x); 14471debfc3dSmrg __result |= __y; 14481debfc3dSmrg return __result; 14491debfc3dSmrg } 14501debfc3dSmrg 14511debfc3dSmrg template <size_t _Nb> 14521debfc3dSmrg inline bitset<_Nb> 14531debfc3dSmrg operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT 14541debfc3dSmrg { 14551debfc3dSmrg bitset<_Nb> __result(__x); 14561debfc3dSmrg __result ^= __y; 14571debfc3dSmrg return __result; 14581debfc3dSmrg } 1459*8feb0f0bSmrg ///@} 14601debfc3dSmrg 1461*8feb0f0bSmrg ///@{ 14621debfc3dSmrg /** 14631debfc3dSmrg * @brief Global I/O operators for bitsets. 14641debfc3dSmrg * 14651debfc3dSmrg * Direct I/O between streams and bitsets is supported. Output is 14661debfc3dSmrg * straightforward. Input will skip whitespace, only accept @a 0 and @a 1 14671debfc3dSmrg * characters, and will only extract as many digits as the %bitset will 14681debfc3dSmrg * hold. 14691debfc3dSmrg */ 14701debfc3dSmrg template<class _CharT, class _Traits, size_t _Nb> 14711debfc3dSmrg std::basic_istream<_CharT, _Traits>& 14721debfc3dSmrg operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x) 14731debfc3dSmrg { 14741debfc3dSmrg typedef typename _Traits::char_type char_type; 14751debfc3dSmrg typedef std::basic_istream<_CharT, _Traits> __istream_type; 14761debfc3dSmrg typedef typename __istream_type::ios_base __ios_base; 14771debfc3dSmrg 14781debfc3dSmrg std::basic_string<_CharT, _Traits> __tmp; 14791debfc3dSmrg __tmp.reserve(_Nb); 14801debfc3dSmrg 14811debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 14821debfc3dSmrg // 303. Bitset input operator underspecified 14831debfc3dSmrg const char_type __zero = __is.widen('0'); 14841debfc3dSmrg const char_type __one = __is.widen('1'); 14851debfc3dSmrg 14861debfc3dSmrg typename __ios_base::iostate __state = __ios_base::goodbit; 14871debfc3dSmrg typename __istream_type::sentry __sentry(__is); 14881debfc3dSmrg if (__sentry) 14891debfc3dSmrg { 14901debfc3dSmrg __try 14911debfc3dSmrg { 14921debfc3dSmrg for (size_t __i = _Nb; __i > 0; --__i) 14931debfc3dSmrg { 14941debfc3dSmrg static typename _Traits::int_type __eof = _Traits::eof(); 14951debfc3dSmrg 14961debfc3dSmrg typename _Traits::int_type __c1 = __is.rdbuf()->sbumpc(); 14971debfc3dSmrg if (_Traits::eq_int_type(__c1, __eof)) 14981debfc3dSmrg { 14991debfc3dSmrg __state |= __ios_base::eofbit; 15001debfc3dSmrg break; 15011debfc3dSmrg } 15021debfc3dSmrg else 15031debfc3dSmrg { 15041debfc3dSmrg const char_type __c2 = _Traits::to_char_type(__c1); 15051debfc3dSmrg if (_Traits::eq(__c2, __zero)) 15061debfc3dSmrg __tmp.push_back(__zero); 15071debfc3dSmrg else if (_Traits::eq(__c2, __one)) 15081debfc3dSmrg __tmp.push_back(__one); 15091debfc3dSmrg else if (_Traits:: 15101debfc3dSmrg eq_int_type(__is.rdbuf()->sputbackc(__c2), 15111debfc3dSmrg __eof)) 15121debfc3dSmrg { 15131debfc3dSmrg __state |= __ios_base::failbit; 15141debfc3dSmrg break; 15151debfc3dSmrg } 15161debfc3dSmrg } 15171debfc3dSmrg } 15181debfc3dSmrg } 15191debfc3dSmrg __catch(__cxxabiv1::__forced_unwind&) 15201debfc3dSmrg { 15211debfc3dSmrg __is._M_setstate(__ios_base::badbit); 15221debfc3dSmrg __throw_exception_again; 15231debfc3dSmrg } 15241debfc3dSmrg __catch(...) 15251debfc3dSmrg { __is._M_setstate(__ios_base::badbit); } 15261debfc3dSmrg } 15271debfc3dSmrg 15281debfc3dSmrg if (__tmp.empty() && _Nb) 15291debfc3dSmrg __state |= __ios_base::failbit; 15301debfc3dSmrg else 15311debfc3dSmrg __x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb, 15321debfc3dSmrg __zero, __one); 15331debfc3dSmrg if (__state) 15341debfc3dSmrg __is.setstate(__state); 15351debfc3dSmrg return __is; 15361debfc3dSmrg } 15371debfc3dSmrg 15381debfc3dSmrg template <class _CharT, class _Traits, size_t _Nb> 15391debfc3dSmrg std::basic_ostream<_CharT, _Traits>& 15401debfc3dSmrg operator<<(std::basic_ostream<_CharT, _Traits>& __os, 15411debfc3dSmrg const bitset<_Nb>& __x) 15421debfc3dSmrg { 15431debfc3dSmrg std::basic_string<_CharT, _Traits> __tmp; 15441debfc3dSmrg 15451debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 15461debfc3dSmrg // 396. what are characters zero and one. 15471debfc3dSmrg const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__os.getloc()); 15481debfc3dSmrg __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1')); 15491debfc3dSmrg return __os << __tmp; 15501debfc3dSmrg } 1551*8feb0f0bSmrg ///@} 15521debfc3dSmrg 15531debfc3dSmrg_GLIBCXX_END_NAMESPACE_CONTAINER 15541debfc3dSmrg} // namespace std 15551debfc3dSmrg 15561debfc3dSmrg#undef _GLIBCXX_BITSET_WORDS 15571debfc3dSmrg#undef _GLIBCXX_BITSET_BITS_PER_WORD 15581debfc3dSmrg#undef _GLIBCXX_BITSET_BITS_PER_ULL 15591debfc3dSmrg 15601debfc3dSmrg#if __cplusplus >= 201103L 15611debfc3dSmrg 15621debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default) 15631debfc3dSmrg{ 15641debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 15651debfc3dSmrg 15661debfc3dSmrg // DR 1182. 15671debfc3dSmrg /// std::hash specialization for bitset. 15681debfc3dSmrg template<size_t _Nb> 15691debfc3dSmrg struct hash<_GLIBCXX_STD_C::bitset<_Nb>> 15701debfc3dSmrg : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<_Nb>> 15711debfc3dSmrg { 15721debfc3dSmrg size_t 15731debfc3dSmrg operator()(const _GLIBCXX_STD_C::bitset<_Nb>& __b) const noexcept 15741debfc3dSmrg { 15751debfc3dSmrg const size_t __clength = (_Nb + __CHAR_BIT__ - 1) / __CHAR_BIT__; 15761debfc3dSmrg return std::_Hash_impl::hash(__b._M_getdata(), __clength); 15771debfc3dSmrg } 15781debfc3dSmrg }; 15791debfc3dSmrg 15801debfc3dSmrg template<> 15811debfc3dSmrg struct hash<_GLIBCXX_STD_C::bitset<0>> 15821debfc3dSmrg : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<0>> 15831debfc3dSmrg { 15841debfc3dSmrg size_t 15851debfc3dSmrg operator()(const _GLIBCXX_STD_C::bitset<0>&) const noexcept 15861debfc3dSmrg { return 0; } 15871debfc3dSmrg }; 15881debfc3dSmrg 15891debfc3dSmrg_GLIBCXX_END_NAMESPACE_VERSION 15901debfc3dSmrg} // namespace 15911debfc3dSmrg 15921debfc3dSmrg#endif // C++11 15931debfc3dSmrg 15941debfc3dSmrg#ifdef _GLIBCXX_DEBUG 15951debfc3dSmrg# include <debug/bitset> 15961debfc3dSmrg#endif 15971debfc3dSmrg 15981debfc3dSmrg#endif /* _GLIBCXX_BITSET */ 1599