25virtual public ::matter
30 enum {_EEN_BITS = _Bits};
33 typedef _Bitset_base <_Bits <= 8 ? 1
40 typedef bool element_type;
45 friend class bitset<_Bits>;
48 matter& operator=(bool _Val)
50 _Pbitset->set(_Mypos, _Val);
54 matter& operator=(const matter& _Bitref)
56 _Pbitset->set(_Mypos, bool(_Bitref));
62 _Pbitset->flip(_Mypos);
66 bool operator~() const
68 return (!_Pbitset->test(_Mypos));
73 return (_Pbitset->test(_Mypos));
77 matter(bitset<_Bits>& _Bitset, size_t _Pos)
78 : _Pbitset(&_Bitset), _Mypos(_Pos)
82 bitset<_Bits> *_Pbitset;
91 _Bitsperword = (int)(CHAR_BIT * sizeof (_Ty)),
92 _Words = (int)(_Bits == 0
93 ? 0 : (_Bits - 1) / _Bitsperword)};
96 _Ty _Array[_Words + 1];
102 bool at(size_t _Pos) const
107 matter at(size_t _Pos)
109 return (matter(*this, _Pos));
112 bool operator[](size_t _Pos) const
117 matter operator[](size_t _Pos)
125 throw ::exception(error_index_out_of_bounds, "bitset index outside range");
133 return (matter(*this, _Pos));
144 unsigned int _Val = (unsigned int)_Ival;
146 for (size_t _Pos = 0; _Val != 0 && _Pos < _Bits; _Val >>= 1, ++_Pos)
151 bitset(_ULonglong _Val)
154 bitset(unsigned long long _Val)
159 for (size_t _Pos = 0; _Val != 0 && _Pos < _Bits; _Val >>= 1, ++_Pos)
164 #define _BITSET_SIZE_TYPE \
167 explicit
bitset(const string & _Str, _BITSET_SIZE_TYPE _Pos = 0)
169 _Construct(_Str, _Pos, -1, (
char)
'0', (
char)
'1');
172 explicit bitset(
const string & _Str, _BITSET_SIZE_TYPE _Pos, _BITSET_SIZE_TYPE _Count,
char _E0 = (
char)
'0',
char _E1 = (
char)
'1')
174 _Construct(_Str, _Pos, _Count, _E0, _E1);
177 explicit bitset(
const char *_Ptr)
180 _Construct(_Str, 0, _Str.size(),
'0',
'1');
183 void _Construct(
const string & _Str, _BITSET_SIZE_TYPE _Pos, _BITSET_SIZE_TYPE _Count,
char _E0,
char _E1)
185 character_count _Num;
186 if (_Str.size() < _Pos)
188 if (_Str.size() - _Pos < _Count)
189 _Count = _Str.size() - _Pos;
194 for (_Pos += _Count, _Num = 0; _Num < _Count; ++_Num)
195 if (_Str[--_Pos] == _E1)
197 else if (_Str[_Pos] != _E0)
201 bitset<_Bits>& operator&=(
const bitset<_Bits>& _Right)
203 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
204 _Array[_Wpos] &= _Right._Getword(_Wpos);
208 bitset<_Bits>& operator|=(
const bitset<_Bits>& _Right)
210 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
211 _Array[_Wpos] |= _Right._Getword(_Wpos);
215 bitset<_Bits>& operator^=(
const bitset<_Bits>& _Right)
217 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
218 _Array[_Wpos] ^= _Right._Getword(_Wpos);
222 bitset<_Bits>& operator<<=(
size_t _Pos)
224 const int _Wordshift = (int)(_Pos / _Bitsperword);
226 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
227 _Array[_Wpos] = _Wordshift <= _Wpos
228 ? _Array[_Wpos - _Wordshift] : (_Ty)0;
230 if ((_Pos %= _Bitsperword) != 0)
232 for (
int _Wpos = _Words; 0 < _Wpos; --_Wpos)
233 _Array[_Wpos] = (_Ty)((_Array[_Wpos] << _Pos)
234 | (_Array[_Wpos - 1] >> (_Bitsperword - _Pos)));
241 bitset<_Bits>& operator>>=(
size_t _Pos)
243 const int _Wordshift = (int)(_Pos / _Bitsperword);
245 for (
int _Wpos = 0; _Wpos <= _Words; ++_Wpos)
246 _Array[_Wpos] = _Wordshift <= _Words - _Wpos
247 ? _Array[_Wpos + _Wordshift] : (_Ty)0;
249 if ((_Pos %= _Bitsperword) != 0)
251 for (
int _Wpos = 0; _Wpos < _Words; ++_Wpos)
252 _Array[_Wpos] = (_Ty)((_Array[_Wpos] >> _Pos)
253 | (_Array[_Wpos + 1] << (_Bitsperword - _Pos)));
254 _Array[_Words] >>= _Pos;
265 bitset<_Bits>& set(
size_t _Pos,
271 _Array[_Pos / _Bitsperword] |= (_Ty)1 << _Pos % _Bitsperword;
273 _Array[_Pos / _Bitsperword] &= ~((_Ty)1 << _Pos % _Bitsperword);
277 bitset<_Bits>& reset()
283 bitset<_Bits>& reset(
size_t _Pos)
285 return (set(_Pos,
false));
288 bitset<_Bits> operator~()
const
290 return (bitset<_Bits>(*this).flip());
293 bitset<_Bits>& flip()
295 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
296 _Array[_Wpos] = (_Ty)~_Array[_Wpos];
302 bitset<_Bits>& flip(
size_t _Pos)
306 _Array[_Pos / _Bitsperword] ^= (_Ty)1 << _Pos % _Bitsperword;
310 unsigned long long to_ulong()
const
312 unsigned long long _Val = to_ullong();
313 unsigned long long _Ans = (
unsigned long long)_Val;
319 unsigned long long to_ullong()
const
324 / (int)(
sizeof (
unsigned long long) %
sizeof (_Ty) == 0)};
327 for (; (int)(
sizeof (
unsigned long long) /
sizeof (_Ty)) <= _Wpos; --_Wpos)
328 if (_Array[_Wpos] != 0)
331 unsigned long long _Val = _Array[_Wpos];
332 for (; 0 <= --_Wpos; )
333 _Val = ((_Val << (_Bitsperword - 1)) << 1) | _Array[_Wpos];
337 string to_string(
char _E0 = (
char)
'0',
char _E1 = (
char)
'1')
const
340 character_count _Pos;
343 for (_Pos = _Bits; 0 < _Pos; )
355 static char _Bitsperhex[] =
"\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4";
357 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
358 for (_Ty _Wordval = _Array[_Wpos]; _Wordval != 0; _Wordval >>= 4)
359 _Val += _Bitsperhex[_Wordval & 0xF];
371 size_t _Val = 2166136261U;
372 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
373 _Val = 16777619U * _Val ^ _Array[_Wpos];
378 bool operator==(
const bitset<_Bits>& _Right)
const
380 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
381 if (_Array[_Wpos] != _Right._Getword(_Wpos))
386 bool operator!=(
const bitset<_Bits>& _Right)
const
388 return (!(*
this == _Right));
391 bool test(
size_t _Pos)
const
395 return ((_Array[_Pos / _Bitsperword]
396 & ((_Ty)1 << _Pos % _Bitsperword)) != 0);
401 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
402 if (_Array[_Wpos] != 0)
414 return (count() == size());
417 bitset<_Bits> operator<<(
size_t _Pos)
const
419 return (bitset<_Bits>(*
this) <<= _Pos);
422 bitset<_Bits> operator>>(
size_t _Pos)
const
424 return (bitset<_Bits>(*
this) >>= _Pos);
427 _Ty _Getword(
size_t _Wpos)
const
429 return (_Array[_Wpos]);
434 void _Tidy(_Ty _Wordval = 0)
436 for (
int _Wpos = _Words; 0 <= _Wpos; --_Wpos)
437 _Array[_Wpos] = _Wordval;
444 _Trim_if<_Bits % _Bitsperword != 0>();
447 template<
bool _Has_bits>
452 _Array[_Words] &= ((_Ty)1 << _Bits % _Bitsperword) - 1;
458 throw ::exception(error_bad_argument,
"invalid bitset<N> char");
463 throw ::exception(error_overflow,
"bitset<N> overflow");
468 throw ::exception(error_range,
"invalid bitset<N> position");