1 // <bitset> -*- C++ -*- 2 3 // Copyright (C) 2001-2013 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /* 26 * Copyright (c) 1998 27 * Silicon Graphics Computer Systems, Inc. 28 * 29 * Permission to use, copy, modify, distribute and sell this software 30 * and its documentation for any purpose is hereby granted without fee, 31 * provided that the above copyright notice appear in all copies and 32 * that both that copyright notice and this permission notice appear 33 * in supporting documentation. Silicon Graphics makes no 34 * representations about the suitability of this software for any 35 * purpose. It is provided "as is" without express or implied warranty. 36 */ 37 38 /** @file include/bitset 39 * This is a Standard C++ Library header. 40 */ 41 42 #ifndef _GLIBCXX_BITSET 43 #define _GLIBCXX_BITSET 1 44 45 #pragma GCC system_header 46 47 #include <string> 48 #include <bits/functexcept.h> // For invalid_argument, out_of_range, 49 // overflow_error 50 #include <iosfwd> 51 #include <bits/cxxabi_forced.h> 52 53 #define _GLIBCXX_BITSET_BITS_PER_WORD (__CHAR_BIT__ * __SIZEOF_LONG__) 54 #define _GLIBCXX_BITSET_WORDS(__n) \ 55 ((__n) / _GLIBCXX_BITSET_BITS_PER_WORD + \ 56 ((__n) % _GLIBCXX_BITSET_BITS_PER_WORD == 0 ? 0 : 1)) 57 58 #define _GLIBCXX_BITSET_BITS_PER_ULL (__CHAR_BIT__ * __SIZEOF_LONG_LONG__) 59 60 namespace std _GLIBCXX_VISIBILITY(default) 61 { 62 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 63 64 /** 65 * Base class, general case. It is a class invariant that _Nw will be 66 * nonnegative. 67 * 68 * See documentation for bitset. 69 */ 70 template<size_t _Nw> 71 struct _Base_bitset 72 { 73 typedef unsigned long _WordT; 74 75 /// 0 is the least significant word. 76 _WordT _M_w[_Nw]; 77 78 _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT 79 : _M_w() { } 80 81 #if __cplusplus >= 201103L 82 constexpr _Base_bitset(unsigned long long __val) noexcept 83 : _M_w{ _WordT(__val) 84 #if __SIZEOF_LONG_LONG__ > __SIZEOF_LONG__ 85 , _WordT(__val >> _GLIBCXX_BITSET_BITS_PER_WORD) 86 #endif 87 } { } 88 #else 89 _Base_bitset(unsigned long __val) 90 : _M_w() 91 { _M_w[0] = __val; } 92 #endif 93 94 static _GLIBCXX_CONSTEXPR size_t 95 _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT 96 { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; } 97 98 static _GLIBCXX_CONSTEXPR size_t 99 _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT 100 { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; } 101 102 static _GLIBCXX_CONSTEXPR size_t 103 _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT 104 { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; } 105 106 static _GLIBCXX_CONSTEXPR _WordT 107 _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT 108 { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } 109 110 _WordT& 111 _M_getword(size_t __pos) _GLIBCXX_NOEXCEPT 112 { return _M_w[_S_whichword(__pos)]; } 113 114 _GLIBCXX_CONSTEXPR _WordT 115 _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT 116 { return _M_w[_S_whichword(__pos)]; } 117 118 #if __cplusplus >= 201103L 119 const _WordT* 120 _M_getdata() const noexcept 121 { return _M_w; } 122 #endif 123 124 _WordT& 125 _M_hiword() _GLIBCXX_NOEXCEPT 126 { return _M_w[_Nw - 1]; } 127 128 _GLIBCXX_CONSTEXPR _WordT 129 _M_hiword() const _GLIBCXX_NOEXCEPT 130 { return _M_w[_Nw - 1]; } 131 132 void 133 _M_do_and(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT 134 { 135 for (size_t __i = 0; __i < _Nw; __i++) 136 _M_w[__i] &= __x._M_w[__i]; 137 } 138 139 void 140 _M_do_or(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT 141 { 142 for (size_t __i = 0; __i < _Nw; __i++) 143 _M_w[__i] |= __x._M_w[__i]; 144 } 145 146 void 147 _M_do_xor(const _Base_bitset<_Nw>& __x) _GLIBCXX_NOEXCEPT 148 { 149 for (size_t __i = 0; __i < _Nw; __i++) 150 _M_w[__i] ^= __x._M_w[__i]; 151 } 152 153 void 154 _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT; 155 156 void 157 _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT; 158 159 void 160 _M_do_flip() _GLIBCXX_NOEXCEPT 161 { 162 for (size_t __i = 0; __i < _Nw; __i++) 163 _M_w[__i] = ~_M_w[__i]; 164 } 165 166 void 167 _M_do_set() _GLIBCXX_NOEXCEPT 168 { 169 for (size_t __i = 0; __i < _Nw; __i++) 170 _M_w[__i] = ~static_cast<_WordT>(0); 171 } 172 173 void 174 _M_do_reset() _GLIBCXX_NOEXCEPT 175 { __builtin_memset(_M_w, 0, _Nw * sizeof(_WordT)); } 176 177 bool 178 _M_is_equal(const _Base_bitset<_Nw>& __x) const _GLIBCXX_NOEXCEPT 179 { 180 for (size_t __i = 0; __i < _Nw; ++__i) 181 if (_M_w[__i] != __x._M_w[__i]) 182 return false; 183 return true; 184 } 185 186 template<size_t _Nb> 187 bool 188 _M_are_all() const _GLIBCXX_NOEXCEPT 189 { 190 for (size_t __i = 0; __i < _Nw - 1; __i++) 191 if (_M_w[__i] != ~static_cast<_WordT>(0)) 192 return false; 193 return _M_hiword() == (~static_cast<_WordT>(0) 194 >> (_Nw * _GLIBCXX_BITSET_BITS_PER_WORD 195 - _Nb)); 196 } 197 198 bool 199 _M_is_any() const _GLIBCXX_NOEXCEPT 200 { 201 for (size_t __i = 0; __i < _Nw; __i++) 202 if (_M_w[__i] != static_cast<_WordT>(0)) 203 return true; 204 return false; 205 } 206 207 size_t 208 _M_do_count() const _GLIBCXX_NOEXCEPT 209 { 210 size_t __result = 0; 211 for (size_t __i = 0; __i < _Nw; __i++) 212 __result += __builtin_popcountl(_M_w[__i]); 213 return __result; 214 } 215 216 unsigned long 217 _M_do_to_ulong() const; 218 219 #if __cplusplus >= 201103L 220 unsigned long long 221 _M_do_to_ullong() const; 222 #endif 223 224 // find first "on" bit 225 size_t 226 _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT; 227 228 // find the next "on" bit that follows "prev" 229 size_t 230 _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT; 231 }; 232 233 // Definitions of non-inline functions from _Base_bitset. 234 template<size_t _Nw> 235 void 236 _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT 237 { 238 if (__builtin_expect(__shift != 0, 1)) 239 { 240 const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD; 241 const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD; 242 243 if (__offset == 0) 244 for (size_t __n = _Nw - 1; __n >= __wshift; --__n) 245 _M_w[__n] = _M_w[__n - __wshift]; 246 else 247 { 248 const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD 249 - __offset); 250 for (size_t __n = _Nw - 1; __n > __wshift; --__n) 251 _M_w[__n] = ((_M_w[__n - __wshift] << __offset) 252 | (_M_w[__n - __wshift - 1] >> __sub_offset)); 253 _M_w[__wshift] = _M_w[0] << __offset; 254 } 255 256 std::fill(_M_w + 0, _M_w + __wshift, static_cast<_WordT>(0)); 257 } 258 } 259 260 template<size_t _Nw> 261 void 262 _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT 263 { 264 if (__builtin_expect(__shift != 0, 1)) 265 { 266 const size_t __wshift = __shift / _GLIBCXX_BITSET_BITS_PER_WORD; 267 const size_t __offset = __shift % _GLIBCXX_BITSET_BITS_PER_WORD; 268 const size_t __limit = _Nw - __wshift - 1; 269 270 if (__offset == 0) 271 for (size_t __n = 0; __n <= __limit; ++__n) 272 _M_w[__n] = _M_w[__n + __wshift]; 273 else 274 { 275 const size_t __sub_offset = (_GLIBCXX_BITSET_BITS_PER_WORD 276 - __offset); 277 for (size_t __n = 0; __n < __limit; ++__n) 278 _M_w[__n] = ((_M_w[__n + __wshift] >> __offset) 279 | (_M_w[__n + __wshift + 1] << __sub_offset)); 280 _M_w[__limit] = _M_w[_Nw-1] >> __offset; 281 } 282 283 std::fill(_M_w + __limit + 1, _M_w + _Nw, static_cast<_WordT>(0)); 284 } 285 } 286 287 template<size_t _Nw> 288 unsigned long 289 _Base_bitset<_Nw>::_M_do_to_ulong() const 290 { 291 for (size_t __i = 1; __i < _Nw; ++__i) 292 if (_M_w[__i]) 293 __throw_overflow_error(__N("_Base_bitset::_M_do_to_ulong")); 294 return _M_w[0]; 295 } 296 297 #if __cplusplus >= 201103L 298 template<size_t _Nw> 299 unsigned long long 300 _Base_bitset<_Nw>::_M_do_to_ullong() const 301 { 302 const bool __dw = sizeof(unsigned long long) > sizeof(unsigned long); 303 for (size_t __i = 1 + __dw; __i < _Nw; ++__i) 304 if (_M_w[__i]) 305 __throw_overflow_error(__N("_Base_bitset::_M_do_to_ullong")); 306 307 if (__dw) 308 return _M_w[0] + (static_cast<unsigned long long>(_M_w[1]) 309 << _GLIBCXX_BITSET_BITS_PER_WORD); 310 return _M_w[0]; 311 } 312 #endif 313 314 template<size_t _Nw> 315 size_t 316 _Base_bitset<_Nw>:: 317 _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT 318 { 319 for (size_t __i = 0; __i < _Nw; __i++) 320 { 321 _WordT __thisword = _M_w[__i]; 322 if (__thisword != static_cast<_WordT>(0)) 323 return (__i * _GLIBCXX_BITSET_BITS_PER_WORD 324 + __builtin_ctzl(__thisword)); 325 } 326 // not found, so return an indication of failure. 327 return __not_found; 328 } 329 330 template<size_t _Nw> 331 size_t 332 _Base_bitset<_Nw>:: 333 _M_do_find_next(size_t __prev, size_t __not_found) const _GLIBCXX_NOEXCEPT 334 { 335 // make bound inclusive 336 ++__prev; 337 338 // check out of bounds 339 if (__prev >= _Nw * _GLIBCXX_BITSET_BITS_PER_WORD) 340 return __not_found; 341 342 // search first word 343 size_t __i = _S_whichword(__prev); 344 _WordT __thisword = _M_w[__i]; 345 346 // mask off bits below bound 347 __thisword &= (~static_cast<_WordT>(0)) << _S_whichbit(__prev); 348 349 if (__thisword != static_cast<_WordT>(0)) 350 return (__i * _GLIBCXX_BITSET_BITS_PER_WORD 351 + __builtin_ctzl(__thisword)); 352 353 // check subsequent words 354 __i++; 355 for (; __i < _Nw; __i++) 356 { 357 __thisword = _M_w[__i]; 358 if (__thisword != static_cast<_WordT>(0)) 359 return (__i * _GLIBCXX_BITSET_BITS_PER_WORD 360 + __builtin_ctzl(__thisword)); 361 } 362 // not found, so return an indication of failure. 363 return __not_found; 364 } // end _M_do_find_next 365 366 /** 367 * Base class, specialization for a single word. 368 * 369 * See documentation for bitset. 370 */ 371 template<> 372 struct _Base_bitset<1> 373 { 374 typedef unsigned long _WordT; 375 _WordT _M_w; 376 377 _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT 378 : _M_w(0) 379 { } 380 381 #if __cplusplus >= 201103L 382 constexpr _Base_bitset(unsigned long long __val) noexcept 383 #else 384 _Base_bitset(unsigned long __val) 385 #endif 386 : _M_w(__val) 387 { } 388 389 static _GLIBCXX_CONSTEXPR size_t 390 _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT 391 { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; } 392 393 static _GLIBCXX_CONSTEXPR size_t 394 _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT 395 { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; } 396 397 static _GLIBCXX_CONSTEXPR size_t 398 _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT 399 { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; } 400 401 static _GLIBCXX_CONSTEXPR _WordT 402 _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT 403 { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } 404 405 _WordT& 406 _M_getword(size_t) _GLIBCXX_NOEXCEPT 407 { return _M_w; } 408 409 _GLIBCXX_CONSTEXPR _WordT 410 _M_getword(size_t) const _GLIBCXX_NOEXCEPT 411 { return _M_w; } 412 413 #if __cplusplus >= 201103L 414 const _WordT* 415 _M_getdata() const noexcept 416 { return &_M_w; } 417 #endif 418 419 _WordT& 420 _M_hiword() _GLIBCXX_NOEXCEPT 421 { return _M_w; } 422 423 _GLIBCXX_CONSTEXPR _WordT 424 _M_hiword() const _GLIBCXX_NOEXCEPT 425 { return _M_w; } 426 427 void 428 _M_do_and(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT 429 { _M_w &= __x._M_w; } 430 431 void 432 _M_do_or(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT 433 { _M_w |= __x._M_w; } 434 435 void 436 _M_do_xor(const _Base_bitset<1>& __x) _GLIBCXX_NOEXCEPT 437 { _M_w ^= __x._M_w; } 438 439 void 440 _M_do_left_shift(size_t __shift) _GLIBCXX_NOEXCEPT 441 { _M_w <<= __shift; } 442 443 void 444 _M_do_right_shift(size_t __shift) _GLIBCXX_NOEXCEPT 445 { _M_w >>= __shift; } 446 447 void 448 _M_do_flip() _GLIBCXX_NOEXCEPT 449 { _M_w = ~_M_w; } 450 451 void 452 _M_do_set() _GLIBCXX_NOEXCEPT 453 { _M_w = ~static_cast<_WordT>(0); } 454 455 void 456 _M_do_reset() _GLIBCXX_NOEXCEPT 457 { _M_w = 0; } 458 459 bool 460 _M_is_equal(const _Base_bitset<1>& __x) const _GLIBCXX_NOEXCEPT 461 { return _M_w == __x._M_w; } 462 463 template<size_t _Nb> 464 bool 465 _M_are_all() const _GLIBCXX_NOEXCEPT 466 { return _M_w == (~static_cast<_WordT>(0) 467 >> (_GLIBCXX_BITSET_BITS_PER_WORD - _Nb)); } 468 469 bool 470 _M_is_any() const _GLIBCXX_NOEXCEPT 471 { return _M_w != 0; } 472 473 size_t 474 _M_do_count() const _GLIBCXX_NOEXCEPT 475 { return __builtin_popcountl(_M_w); } 476 477 unsigned long 478 _M_do_to_ulong() const _GLIBCXX_NOEXCEPT 479 { return _M_w; } 480 481 #if __cplusplus >= 201103L 482 unsigned long long 483 _M_do_to_ullong() const noexcept 484 { return _M_w; } 485 #endif 486 487 size_t 488 _M_do_find_first(size_t __not_found) const _GLIBCXX_NOEXCEPT 489 { 490 if (_M_w != 0) 491 return __builtin_ctzl(_M_w); 492 else 493 return __not_found; 494 } 495 496 // find the next "on" bit that follows "prev" 497 size_t 498 _M_do_find_next(size_t __prev, size_t __not_found) const 499 _GLIBCXX_NOEXCEPT 500 { 501 ++__prev; 502 if (__prev >= ((size_t) _GLIBCXX_BITSET_BITS_PER_WORD)) 503 return __not_found; 504 505 _WordT __x = _M_w >> __prev; 506 if (__x != 0) 507 return __builtin_ctzl(__x) + __prev; 508 else 509 return __not_found; 510 } 511 }; 512 513 /** 514 * Base class, specialization for no storage (zero-length %bitset). 515 * 516 * See documentation for bitset. 517 */ 518 template<> 519 struct _Base_bitset<0> 520 { 521 typedef unsigned long _WordT; 522 523 _GLIBCXX_CONSTEXPR _Base_bitset() _GLIBCXX_NOEXCEPT 524 { } 525 526 #if __cplusplus >= 201103L 527 constexpr _Base_bitset(unsigned long long) noexcept 528 #else 529 _Base_bitset(unsigned long) 530 #endif 531 { } 532 533 static _GLIBCXX_CONSTEXPR size_t 534 _S_whichword(size_t __pos) _GLIBCXX_NOEXCEPT 535 { return __pos / _GLIBCXX_BITSET_BITS_PER_WORD; } 536 537 static _GLIBCXX_CONSTEXPR size_t 538 _S_whichbyte(size_t __pos) _GLIBCXX_NOEXCEPT 539 { return (__pos % _GLIBCXX_BITSET_BITS_PER_WORD) / __CHAR_BIT__; } 540 541 static _GLIBCXX_CONSTEXPR size_t 542 _S_whichbit(size_t __pos) _GLIBCXX_NOEXCEPT 543 { return __pos % _GLIBCXX_BITSET_BITS_PER_WORD; } 544 545 static _GLIBCXX_CONSTEXPR _WordT 546 _S_maskbit(size_t __pos) _GLIBCXX_NOEXCEPT 547 { return (static_cast<_WordT>(1)) << _S_whichbit(__pos); } 548 549 // This would normally give access to the data. The bounds-checking 550 // in the bitset class will prevent the user from getting this far, 551 // but (1) it must still return an lvalue to compile, and (2) the 552 // user might call _Unchecked_set directly, in which case this /needs/ 553 // to fail. Let's not penalize zero-length users unless they actually 554 // make an unchecked call; all the memory ugliness is therefore 555 // localized to this single should-never-get-this-far function. 556 _WordT& 557 _M_getword(size_t) _GLIBCXX_NOEXCEPT 558 { 559 __throw_out_of_range(__N("_Base_bitset::_M_getword")); 560 return *new _WordT; 561 } 562 563 _GLIBCXX_CONSTEXPR _WordT 564 _M_getword(size_t __pos) const _GLIBCXX_NOEXCEPT 565 { return 0; } 566 567 _GLIBCXX_CONSTEXPR _WordT 568 _M_hiword() const _GLIBCXX_NOEXCEPT 569 { return 0; } 570 571 void 572 _M_do_and(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT 573 { } 574 575 void 576 _M_do_or(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT 577 { } 578 579 void 580 _M_do_xor(const _Base_bitset<0>&) _GLIBCXX_NOEXCEPT 581 { } 582 583 void 584 _M_do_left_shift(size_t) _GLIBCXX_NOEXCEPT 585 { } 586 587 void 588 _M_do_right_shift(size_t) _GLIBCXX_NOEXCEPT 589 { } 590 591 void 592 _M_do_flip() _GLIBCXX_NOEXCEPT 593 { } 594 595 void 596 _M_do_set() _GLIBCXX_NOEXCEPT 597 { } 598 599 void 600 _M_do_reset() _GLIBCXX_NOEXCEPT 601 { } 602 603 // Are all empty bitsets equal to each other? Are they equal to 604 // themselves? How to compare a thing which has no state? What is 605 // the sound of one zero-length bitset clapping? 606 bool 607 _M_is_equal(const _Base_bitset<0>&) const _GLIBCXX_NOEXCEPT 608 { return true; } 609 610 template<size_t _Nb> 611 bool 612 _M_are_all() const _GLIBCXX_NOEXCEPT 613 { return true; } 614 615 bool 616 _M_is_any() const _GLIBCXX_NOEXCEPT 617 { return false; } 618 619 size_t 620 _M_do_count() const _GLIBCXX_NOEXCEPT 621 { return 0; } 622 623 unsigned long 624 _M_do_to_ulong() const _GLIBCXX_NOEXCEPT 625 { return 0; } 626 627 #if __cplusplus >= 201103L 628 unsigned long long 629 _M_do_to_ullong() const noexcept 630 { return 0; } 631 #endif 632 633 // Normally "not found" is the size, but that could also be 634 // misinterpreted as an index in this corner case. Oh well. 635 size_t 636 _M_do_find_first(size_t) const _GLIBCXX_NOEXCEPT 637 { return 0; } 638 639 size_t 640 _M_do_find_next(size_t, size_t) const _GLIBCXX_NOEXCEPT 641 { return 0; } 642 }; 643 644 645 // Helper class to zero out the unused high-order bits in the highest word. 646 template<size_t _Extrabits> 647 struct _Sanitize 648 { 649 typedef unsigned long _WordT; 650 651 static void 652 _S_do_sanitize(_WordT& __val) _GLIBCXX_NOEXCEPT 653 { __val &= ~((~static_cast<_WordT>(0)) << _Extrabits); } 654 }; 655 656 template<> 657 struct _Sanitize<0> 658 { 659 typedef unsigned long _WordT; 660 661 static void 662 _S_do_sanitize(_WordT) _GLIBCXX_NOEXCEPT { } 663 }; 664 665 #if __cplusplus >= 201103L 666 template<size_t _Nb, bool = _Nb < _GLIBCXX_BITSET_BITS_PER_ULL> 667 struct _Sanitize_val 668 { 669 static constexpr unsigned long long 670 _S_do_sanitize_val(unsigned long long __val) 671 { return __val; } 672 }; 673 674 template<size_t _Nb> 675 struct _Sanitize_val<_Nb, true> 676 { 677 static constexpr unsigned long long 678 _S_do_sanitize_val(unsigned long long __val) 679 { return __val & ~((~static_cast<unsigned long long>(0)) << _Nb); } 680 }; 681 #endif 682 683 /** 684 * The %bitset class represents a @e fixed-size sequence of bits. 685 * 686 * @ingroup containers 687 * 688 * (Note that %bitset does @e not meet the formal requirements of a 689 * <a href="tables.html#65">container</a>. Mainly, it lacks iterators.) 690 * 691 * The template argument, @a Nb, may be any non-negative number, 692 * specifying the number of bits (e.g., "0", "12", "1024*1024"). 693 * 694 * In the general unoptimized case, storage is allocated in word-sized 695 * blocks. Let B be the number of bits in a word, then (Nb+(B-1))/B 696 * words will be used for storage. B - Nb%B bits are unused. (They are 697 * the high-order bits in the highest word.) It is a class invariant 698 * that those unused bits are always zero. 699 * 700 * If you think of %bitset as <em>a simple array of bits</em>, be 701 * aware that your mental picture is reversed: a %bitset behaves 702 * the same way as bits in integers do, with the bit at index 0 in 703 * the <em>least significant / right-hand</em> position, and the bit at 704 * index Nb-1 in the <em>most significant / left-hand</em> position. 705 * Thus, unlike other containers, a %bitset's index <em>counts from 706 * right to left</em>, to put it very loosely. 707 * 708 * This behavior is preserved when translating to and from strings. For 709 * example, the first line of the following program probably prints 710 * <em>b('a') is 0001100001</em> on a modern ASCII system. 711 * 712 * @code 713 * #include <bitset> 714 * #include <iostream> 715 * #include <sstream> 716 * 717 * using namespace std; 718 * 719 * int main() 720 * { 721 * long a = 'a'; 722 * bitset<10> b(a); 723 * 724 * cout << "b('a') is " << b << endl; 725 * 726 * ostringstream s; 727 * s << b; 728 * string str = s.str(); 729 * cout << "index 3 in the string is " << str[3] << " but\n" 730 * << "index 3 in the bitset is " << b[3] << endl; 731 * } 732 * @endcode 733 * 734 * Also see: 735 * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt12ch33s02.html 736 * for a description of extensions. 737 * 738 * Most of the actual code isn't contained in %bitset<> itself, but in the 739 * base class _Base_bitset. The base class works with whole words, not with 740 * individual bits. This allows us to specialize _Base_bitset for the 741 * important special case where the %bitset is only a single word. 742 * 743 * Extra confusion can result due to the fact that the storage for 744 * _Base_bitset @e is a regular array, and is indexed as such. This is 745 * carefully encapsulated. 746 */ 747 template<size_t _Nb> 748 class bitset 749 : private _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> 750 { 751 private: 752 typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base; 753 typedef unsigned long _WordT; 754 755 void 756 _M_do_sanitize() _GLIBCXX_NOEXCEPT 757 { 758 typedef _Sanitize<_Nb % _GLIBCXX_BITSET_BITS_PER_WORD> __sanitize_type; 759 __sanitize_type::_S_do_sanitize(this->_M_hiword()); 760 } 761 762 #if __cplusplus >= 201103L 763 template<typename> friend struct hash; 764 #endif 765 766 public: 767 /** 768 * This encapsulates the concept of a single bit. An instance of this 769 * class is a proxy for an actual bit; this way the individual bit 770 * operations are done as faster word-size bitwise instructions. 771 * 772 * Most users will never need to use this class directly; conversions 773 * to and from bool are automatic and should be transparent. Overloaded 774 * operators help to preserve the illusion. 775 * 776 * (On a typical system, this <em>bit %reference</em> is 64 777 * times the size of an actual bit. Ha.) 778 */ 779 class reference 780 { 781 friend class bitset; 782 783 _WordT* _M_wp; 784 size_t _M_bpos; 785 786 // left undefined 787 reference(); 788 789 public: 790 reference(bitset& __b, size_t __pos) _GLIBCXX_NOEXCEPT 791 { 792 _M_wp = &__b._M_getword(__pos); 793 _M_bpos = _Base::_S_whichbit(__pos); 794 } 795 796 ~reference() _GLIBCXX_NOEXCEPT 797 { } 798 799 // For b[i] = __x; 800 reference& 801 operator=(bool __x) _GLIBCXX_NOEXCEPT 802 { 803 if (__x) 804 *_M_wp |= _Base::_S_maskbit(_M_bpos); 805 else 806 *_M_wp &= ~_Base::_S_maskbit(_M_bpos); 807 return *this; 808 } 809 810 // For b[i] = b[__j]; 811 reference& 812 operator=(const reference& __j) _GLIBCXX_NOEXCEPT 813 { 814 if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos))) 815 *_M_wp |= _Base::_S_maskbit(_M_bpos); 816 else 817 *_M_wp &= ~_Base::_S_maskbit(_M_bpos); 818 return *this; 819 } 820 821 // Flips the bit 822 bool 823 operator~() const _GLIBCXX_NOEXCEPT 824 { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) == 0; } 825 826 // For __x = b[i]; 827 operator bool() const _GLIBCXX_NOEXCEPT 828 { return (*(_M_wp) & _Base::_S_maskbit(_M_bpos)) != 0; } 829 830 // For b[i].flip(); 831 reference& 832 flip() _GLIBCXX_NOEXCEPT 833 { 834 *_M_wp ^= _Base::_S_maskbit(_M_bpos); 835 return *this; 836 } 837 }; 838 friend class reference; 839 840 // 23.3.5.1 constructors: 841 /// All bits set to zero. 842 _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT 843 { } 844 845 /// Initial bits bitwise-copied from a single word (others set to zero). 846 #if __cplusplus >= 201103L 847 constexpr bitset(unsigned long long __val) noexcept 848 : _Base(_Sanitize_val<_Nb>::_S_do_sanitize_val(__val)) { } 849 #else 850 bitset(unsigned long __val) 851 : _Base(__val) 852 { _M_do_sanitize(); } 853 #endif 854 855 /** 856 * Use a subset of a string. 857 * @param __s A string of @a 0 and @a 1 characters. 858 * @param __position Index of the first character in @a __s to use; 859 * defaults to zero. 860 * @throw std::out_of_range If @a pos is bigger the size of @a __s. 861 * @throw std::invalid_argument If a character appears in the string 862 * which is neither @a 0 nor @a 1. 863 */ 864 template<class _CharT, class _Traits, class _Alloc> 865 explicit 866 bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 867 size_t __position = 0) 868 : _Base() 869 { 870 if (__position > __s.size()) 871 __throw_out_of_range(__N("bitset::bitset initial position " 872 "not valid")); 873 _M_copy_from_string(__s, __position, 874 std::basic_string<_CharT, _Traits, _Alloc>::npos, 875 _CharT('0'), _CharT('1')); 876 } 877 878 /** 879 * Use a subset of a string. 880 * @param __s A string of @a 0 and @a 1 characters. 881 * @param __position Index of the first character in @a __s to use. 882 * @param __n The number of characters to copy. 883 * @throw std::out_of_range If @a __position is bigger the size 884 * of @a __s. 885 * @throw std::invalid_argument If a character appears in the string 886 * which is neither @a 0 nor @a 1. 887 */ 888 template<class _CharT, class _Traits, class _Alloc> 889 bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 890 size_t __position, size_t __n) 891 : _Base() 892 { 893 if (__position > __s.size()) 894 __throw_out_of_range(__N("bitset::bitset initial position " 895 "not valid")); 896 _M_copy_from_string(__s, __position, __n, _CharT('0'), _CharT('1')); 897 } 898 899 // _GLIBCXX_RESOLVE_LIB_DEFECTS 900 // 396. what are characters zero and one. 901 template<class _CharT, class _Traits, class _Alloc> 902 bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __s, 903 size_t __position, size_t __n, 904 _CharT __zero, _CharT __one = _CharT('1')) 905 : _Base() 906 { 907 if (__position > __s.size()) 908 __throw_out_of_range(__N("bitset::bitset initial position " 909 "not valid")); 910 _M_copy_from_string(__s, __position, __n, __zero, __one); 911 } 912 913 #if __cplusplus >= 201103L 914 /** 915 * Construct from a character %array. 916 * @param __str An %array of characters @a zero and @a one. 917 * @param __n The number of characters to use. 918 * @param __zero The character corresponding to the value 0. 919 * @param __one The character corresponding to the value 1. 920 * @throw std::invalid_argument If a character appears in the string 921 * which is neither @a __zero nor @a __one. 922 */ 923 template<typename _CharT> 924 explicit 925 bitset(const _CharT* __str, 926 typename std::basic_string<_CharT>::size_type __n 927 = std::basic_string<_CharT>::npos, 928 _CharT __zero = _CharT('0'), _CharT __one = _CharT('1')) 929 : _Base() 930 { 931 if (!__str) 932 __throw_logic_error(__N("bitset::bitset(const _CharT*, ...)")); 933 934 if (__n == std::basic_string<_CharT>::npos) 935 __n = std::char_traits<_CharT>::length(__str); 936 _M_copy_from_ptr<_CharT, std::char_traits<_CharT>>(__str, __n, 0, 937 __n, __zero, 938 __one); 939 } 940 #endif 941 942 // 23.3.5.2 bitset operations: 943 //@{ 944 /** 945 * Operations on bitsets. 946 * @param __rhs A same-sized bitset. 947 * 948 * These should be self-explanatory. 949 */ 950 bitset<_Nb>& 951 operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT 952 { 953 this->_M_do_and(__rhs); 954 return *this; 955 } 956 957 bitset<_Nb>& 958 operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT 959 { 960 this->_M_do_or(__rhs); 961 return *this; 962 } 963 964 bitset<_Nb>& 965 operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT 966 { 967 this->_M_do_xor(__rhs); 968 return *this; 969 } 970 //@} 971 972 //@{ 973 /** 974 * Operations on bitsets. 975 * @param __position The number of places to shift. 976 * 977 * These should be self-explanatory. 978 */ 979 bitset<_Nb>& 980 operator<<=(size_t __position) _GLIBCXX_NOEXCEPT 981 { 982 if (__builtin_expect(__position < _Nb, 1)) 983 { 984 this->_M_do_left_shift(__position); 985 this->_M_do_sanitize(); 986 } 987 else 988 this->_M_do_reset(); 989 return *this; 990 } 991 992 bitset<_Nb>& 993 operator>>=(size_t __position) _GLIBCXX_NOEXCEPT 994 { 995 if (__builtin_expect(__position < _Nb, 1)) 996 { 997 this->_M_do_right_shift(__position); 998 this->_M_do_sanitize(); 999 } 1000 else 1001 this->_M_do_reset(); 1002 return *this; 1003 } 1004 //@} 1005 1006 //@{ 1007 /** 1008 * These versions of single-bit set, reset, flip, and test are 1009 * extensions from the SGI version. They do no range checking. 1010 * @ingroup SGIextensions 1011 */ 1012 bitset<_Nb>& 1013 _Unchecked_set(size_t __pos) _GLIBCXX_NOEXCEPT 1014 { 1015 this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); 1016 return *this; 1017 } 1018 1019 bitset<_Nb>& 1020 _Unchecked_set(size_t __pos, int __val) _GLIBCXX_NOEXCEPT 1021 { 1022 if (__val) 1023 this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); 1024 else 1025 this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); 1026 return *this; 1027 } 1028 1029 bitset<_Nb>& 1030 _Unchecked_reset(size_t __pos) _GLIBCXX_NOEXCEPT 1031 { 1032 this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); 1033 return *this; 1034 } 1035 1036 bitset<_Nb>& 1037 _Unchecked_flip(size_t __pos) _GLIBCXX_NOEXCEPT 1038 { 1039 this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos); 1040 return *this; 1041 } 1042 1043 _GLIBCXX_CONSTEXPR bool 1044 _Unchecked_test(size_t __pos) const _GLIBCXX_NOEXCEPT 1045 { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos)) 1046 != static_cast<_WordT>(0)); } 1047 //@} 1048 1049 // Set, reset, and flip. 1050 /** 1051 * @brief Sets every bit to true. 1052 */ 1053 bitset<_Nb>& 1054 set() _GLIBCXX_NOEXCEPT 1055 { 1056 this->_M_do_set(); 1057 this->_M_do_sanitize(); 1058 return *this; 1059 } 1060 1061 /** 1062 * @brief Sets a given bit to a particular value. 1063 * @param __position The index of the bit. 1064 * @param __val Either true or false, defaults to true. 1065 * @throw std::out_of_range If @a pos is bigger the size of the %set. 1066 */ 1067 bitset<_Nb>& 1068 set(size_t __position, bool __val = true) 1069 { 1070 if (__position >= _Nb) 1071 __throw_out_of_range(__N("bitset::set")); 1072 return _Unchecked_set(__position, __val); 1073 } 1074 1075 /** 1076 * @brief Sets every bit to false. 1077 */ 1078 bitset<_Nb>& 1079 reset() _GLIBCXX_NOEXCEPT 1080 { 1081 this->_M_do_reset(); 1082 return *this; 1083 } 1084 1085 /** 1086 * @brief Sets a given bit to false. 1087 * @param __position The index of the bit. 1088 * @throw std::out_of_range If @a pos is bigger the size of the %set. 1089 * 1090 * Same as writing @c set(pos,false). 1091 */ 1092 bitset<_Nb>& 1093 reset(size_t __position) 1094 { 1095 if (__position >= _Nb) 1096 __throw_out_of_range(__N("bitset::reset")); 1097 return _Unchecked_reset(__position); 1098 } 1099 1100 /** 1101 * @brief Toggles every bit to its opposite value. 1102 */ 1103 bitset<_Nb>& 1104 flip() _GLIBCXX_NOEXCEPT 1105 { 1106 this->_M_do_flip(); 1107 this->_M_do_sanitize(); 1108 return *this; 1109 } 1110 1111 /** 1112 * @brief Toggles a given bit to its opposite value. 1113 * @param __position The index of the bit. 1114 * @throw std::out_of_range If @a pos is bigger the size of the %set. 1115 */ 1116 bitset<_Nb>& 1117 flip(size_t __position) 1118 { 1119 if (__position >= _Nb) 1120 __throw_out_of_range(__N("bitset::flip")); 1121 return _Unchecked_flip(__position); 1122 } 1123 1124 /// See the no-argument flip(). 1125 bitset<_Nb> 1126 operator~() const _GLIBCXX_NOEXCEPT 1127 { return bitset<_Nb>(*this).flip(); } 1128 1129 //@{ 1130 /** 1131 * @brief Array-indexing support. 1132 * @param __position Index into the %bitset. 1133 * @return A bool for a <em>const %bitset</em>. For non-const 1134 * bitsets, an instance of the reference proxy class. 1135 * @note These operators do no range checking and throw no exceptions, 1136 * as required by DR 11 to the standard. 1137 * 1138 * _GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already 1139 * resolves DR 11 (items 1 and 2), but does not do the range-checking 1140 * required by that DR's resolution. -pme 1141 * The DR has since been changed: range-checking is a precondition 1142 * (users' responsibility), and these functions must not throw. -pme 1143 */ 1144 reference 1145 operator[](size_t __position) 1146 { return reference(*this, __position); } 1147 1148 _GLIBCXX_CONSTEXPR bool 1149 operator[](size_t __position) const 1150 { return _Unchecked_test(__position); } 1151 //@} 1152 1153 /** 1154 * @brief Returns a numerical interpretation of the %bitset. 1155 * @return The integral equivalent of the bits. 1156 * @throw std::overflow_error If there are too many bits to be 1157 * represented in an @c unsigned @c long. 1158 */ 1159 unsigned long 1160 to_ulong() const 1161 { return this->_M_do_to_ulong(); } 1162 1163 #if __cplusplus >= 201103L 1164 unsigned long long 1165 to_ullong() const 1166 { return this->_M_do_to_ullong(); } 1167 #endif 1168 1169 /** 1170 * @brief Returns a character interpretation of the %bitset. 1171 * @return The string equivalent of the bits. 1172 * 1173 * Note the ordering of the bits: decreasing character positions 1174 * correspond to increasing bit positions (see the main class notes for 1175 * an example). 1176 */ 1177 template<class _CharT, class _Traits, class _Alloc> 1178 std::basic_string<_CharT, _Traits, _Alloc> 1179 to_string() const 1180 { 1181 std::basic_string<_CharT, _Traits, _Alloc> __result; 1182 _M_copy_to_string(__result, _CharT('0'), _CharT('1')); 1183 return __result; 1184 } 1185 1186 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1187 // 396. what are characters zero and one. 1188 template<class _CharT, class _Traits, class _Alloc> 1189 std::basic_string<_CharT, _Traits, _Alloc> 1190 to_string(_CharT __zero, _CharT __one = _CharT('1')) const 1191 { 1192 std::basic_string<_CharT, _Traits, _Alloc> __result; 1193 _M_copy_to_string(__result, __zero, __one); 1194 return __result; 1195 } 1196 1197 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1198 // 434. bitset::to_string() hard to use. 1199 template<class _CharT, class _Traits> 1200 std::basic_string<_CharT, _Traits, std::allocator<_CharT> > 1201 to_string() const 1202 { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); } 1203 1204 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1205 // 853. to_string needs updating with zero and one. 1206 template<class _CharT, class _Traits> 1207 std::basic_string<_CharT, _Traits, std::allocator<_CharT> > 1208 to_string(_CharT __zero, _CharT __one = _CharT('1')) const 1209 { return to_string<_CharT, _Traits, 1210 std::allocator<_CharT> >(__zero, __one); } 1211 1212 template<class _CharT> 1213 std::basic_string<_CharT, std::char_traits<_CharT>, 1214 std::allocator<_CharT> > 1215 to_string() const 1216 { 1217 return to_string<_CharT, std::char_traits<_CharT>, 1218 std::allocator<_CharT> >(); 1219 } 1220 1221 template<class _CharT> 1222 std::basic_string<_CharT, std::char_traits<_CharT>, 1223 std::allocator<_CharT> > 1224 to_string(_CharT __zero, _CharT __one = _CharT('1')) const 1225 { 1226 return to_string<_CharT, std::char_traits<_CharT>, 1227 std::allocator<_CharT> >(__zero, __one); 1228 } 1229 1230 std::basic_string<char, std::char_traits<char>, std::allocator<char> > 1231 to_string() const 1232 { 1233 return to_string<char, std::char_traits<char>, 1234 std::allocator<char> >(); 1235 } 1236 1237 std::basic_string<char, std::char_traits<char>, std::allocator<char> > 1238 to_string(char __zero, char __one = '1') const 1239 { 1240 return to_string<char, std::char_traits<char>, 1241 std::allocator<char> >(__zero, __one); 1242 } 1243 1244 // Helper functions for string operations. 1245 template<class _CharT, class _Traits> 1246 void 1247 _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t, 1248 _CharT, _CharT); 1249 1250 template<class _CharT, class _Traits, class _Alloc> 1251 void 1252 _M_copy_from_string(const std::basic_string<_CharT, 1253 _Traits, _Alloc>& __s, size_t __pos, size_t __n, 1254 _CharT __zero, _CharT __one) 1255 { _M_copy_from_ptr<_CharT, _Traits>(__s.data(), __s.size(), __pos, __n, 1256 __zero, __one); } 1257 1258 template<class _CharT, class _Traits, class _Alloc> 1259 void 1260 _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>&, 1261 _CharT, _CharT) const; 1262 1263 // NB: Backward compat. 1264 template<class _CharT, class _Traits, class _Alloc> 1265 void 1266 _M_copy_from_string(const std::basic_string<_CharT, 1267 _Traits, _Alloc>& __s, size_t __pos, size_t __n) 1268 { _M_copy_from_string(__s, __pos, __n, _CharT('0'), _CharT('1')); } 1269 1270 template<class _CharT, class _Traits, class _Alloc> 1271 void 1272 _M_copy_to_string(std::basic_string<_CharT, _Traits,_Alloc>& __s) const 1273 { _M_copy_to_string(__s, _CharT('0'), _CharT('1')); } 1274 1275 /// Returns the number of bits which are set. 1276 size_t 1277 count() const _GLIBCXX_NOEXCEPT 1278 { return this->_M_do_count(); } 1279 1280 /// Returns the total number of bits. 1281 _GLIBCXX_CONSTEXPR size_t 1282 size() const _GLIBCXX_NOEXCEPT 1283 { return _Nb; } 1284 1285 //@{ 1286 /// These comparisons for equality/inequality are, well, @e bitwise. 1287 bool 1288 operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT 1289 { return this->_M_is_equal(__rhs); } 1290 1291 bool 1292 operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT 1293 { return !this->_M_is_equal(__rhs); } 1294 //@} 1295 1296 /** 1297 * @brief Tests the value of a bit. 1298 * @param __position The index of a bit. 1299 * @return The value at @a pos. 1300 * @throw std::out_of_range If @a pos is bigger the size of the %set. 1301 */ 1302 bool 1303 test(size_t __position) const 1304 { 1305 if (__position >= _Nb) 1306 __throw_out_of_range(__N("bitset::test")); 1307 return _Unchecked_test(__position); 1308 } 1309 1310 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1311 // DR 693. std::bitset::all() missing. 1312 /** 1313 * @brief Tests whether all the bits are on. 1314 * @return True if all the bits are set. 1315 */ 1316 bool 1317 all() const _GLIBCXX_NOEXCEPT 1318 { return this->template _M_are_all<_Nb>(); } 1319 1320 /** 1321 * @brief Tests whether any of the bits are on. 1322 * @return True if at least one bit is set. 1323 */ 1324 bool 1325 any() const _GLIBCXX_NOEXCEPT 1326 { return this->_M_is_any(); } 1327 1328 /** 1329 * @brief Tests whether any of the bits are on. 1330 * @return True if none of the bits are set. 1331 */ 1332 bool 1333 none() const _GLIBCXX_NOEXCEPT 1334 { return !this->_M_is_any(); } 1335 1336 //@{ 1337 /// Self-explanatory. 1338 bitset<_Nb> 1339 operator<<(size_t __position) const _GLIBCXX_NOEXCEPT 1340 { return bitset<_Nb>(*this) <<= __position; } 1341 1342 bitset<_Nb> 1343 operator>>(size_t __position) const _GLIBCXX_NOEXCEPT 1344 { return bitset<_Nb>(*this) >>= __position; } 1345 //@} 1346 1347 /** 1348 * @brief Finds the index of the first "on" bit. 1349 * @return The index of the first bit set, or size() if not found. 1350 * @ingroup SGIextensions 1351 * @sa _Find_next 1352 */ 1353 size_t 1354 _Find_first() const _GLIBCXX_NOEXCEPT 1355 { return this->_M_do_find_first(_Nb); } 1356 1357 /** 1358 * @brief Finds the index of the next "on" bit after prev. 1359 * @return The index of the next bit set, or size() if not found. 1360 * @param __prev Where to start searching. 1361 * @ingroup SGIextensions 1362 * @sa _Find_first 1363 */ 1364 size_t 1365 _Find_next(size_t __prev) const _GLIBCXX_NOEXCEPT 1366 { return this->_M_do_find_next(__prev, _Nb); } 1367 }; 1368 1369 // Definitions of non-inline member functions. 1370 template<size_t _Nb> 1371 template<class _CharT, class _Traits> 1372 void 1373 bitset<_Nb>:: 1374 _M_copy_from_ptr(const _CharT* __s, size_t __len, 1375 size_t __pos, size_t __n, _CharT __zero, _CharT __one) 1376 { 1377 reset(); 1378 const size_t __nbits = std::min(_Nb, std::min(__n, size_t(__len - __pos))); 1379 for (size_t __i = __nbits; __i > 0; --__i) 1380 { 1381 const _CharT __c = __s[__pos + __nbits - __i]; 1382 if (_Traits::eq(__c, __zero)) 1383 ; 1384 else if (_Traits::eq(__c, __one)) 1385 _Unchecked_set(__i - 1); 1386 else 1387 __throw_invalid_argument(__N("bitset::_M_copy_from_ptr")); 1388 } 1389 } 1390 1391 template<size_t _Nb> 1392 template<class _CharT, class _Traits, class _Alloc> 1393 void 1394 bitset<_Nb>:: 1395 _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>& __s, 1396 _CharT __zero, _CharT __one) const 1397 { 1398 __s.assign(_Nb, __zero); 1399 for (size_t __i = _Nb; __i > 0; --__i) 1400 if (_Unchecked_test(__i - 1)) 1401 _Traits::assign(__s[_Nb - __i], __one); 1402 } 1403 1404 // 23.3.5.3 bitset operations: 1405 //@{ 1406 /** 1407 * @brief Global bitwise operations on bitsets. 1408 * @param __x A bitset. 1409 * @param __y A bitset of the same size as @a __x. 1410 * @return A new bitset. 1411 * 1412 * These should be self-explanatory. 1413 */ 1414 template<size_t _Nb> 1415 inline bitset<_Nb> 1416 operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT 1417 { 1418 bitset<_Nb> __result(__x); 1419 __result &= __y; 1420 return __result; 1421 } 1422 1423 template<size_t _Nb> 1424 inline bitset<_Nb> 1425 operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT 1426 { 1427 bitset<_Nb> __result(__x); 1428 __result |= __y; 1429 return __result; 1430 } 1431 1432 template <size_t _Nb> 1433 inline bitset<_Nb> 1434 operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT 1435 { 1436 bitset<_Nb> __result(__x); 1437 __result ^= __y; 1438 return __result; 1439 } 1440 //@} 1441 1442 //@{ 1443 /** 1444 * @brief Global I/O operators for bitsets. 1445 * 1446 * Direct I/O between streams and bitsets is supported. Output is 1447 * straightforward. Input will skip whitespace, only accept @a 0 and @a 1 1448 * characters, and will only extract as many digits as the %bitset will 1449 * hold. 1450 */ 1451 template<class _CharT, class _Traits, size_t _Nb> 1452 std::basic_istream<_CharT, _Traits>& 1453 operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x) 1454 { 1455 typedef typename _Traits::char_type char_type; 1456 typedef std::basic_istream<_CharT, _Traits> __istream_type; 1457 typedef typename __istream_type::ios_base __ios_base; 1458 1459 std::basic_string<_CharT, _Traits> __tmp; 1460 __tmp.reserve(_Nb); 1461 1462 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1463 // 303. Bitset input operator underspecified 1464 const char_type __zero = __is.widen('0'); 1465 const char_type __one = __is.widen('1'); 1466 1467 typename __ios_base::iostate __state = __ios_base::goodbit; 1468 typename __istream_type::sentry __sentry(__is); 1469 if (__sentry) 1470 { 1471 __try 1472 { 1473 for (size_t __i = _Nb; __i > 0; --__i) 1474 { 1475 static typename _Traits::int_type __eof = _Traits::eof(); 1476 1477 typename _Traits::int_type __c1 = __is.rdbuf()->sbumpc(); 1478 if (_Traits::eq_int_type(__c1, __eof)) 1479 { 1480 __state |= __ios_base::eofbit; 1481 break; 1482 } 1483 else 1484 { 1485 const char_type __c2 = _Traits::to_char_type(__c1); 1486 if (_Traits::eq(__c2, __zero)) 1487 __tmp.push_back(__zero); 1488 else if (_Traits::eq(__c2, __one)) 1489 __tmp.push_back(__one); 1490 else if (_Traits:: 1491 eq_int_type(__is.rdbuf()->sputbackc(__c2), 1492 __eof)) 1493 { 1494 __state |= __ios_base::failbit; 1495 break; 1496 } 1497 } 1498 } 1499 } 1500 __catch(__cxxabiv1::__forced_unwind&) 1501 { 1502 __is._M_setstate(__ios_base::badbit); 1503 __throw_exception_again; 1504 } 1505 __catch(...) 1506 { __is._M_setstate(__ios_base::badbit); } 1507 } 1508 1509 if (__tmp.empty() && _Nb) 1510 __state |= __ios_base::failbit; 1511 else 1512 __x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb, 1513 __zero, __one); 1514 if (__state) 1515 __is.setstate(__state); 1516 return __is; 1517 } 1518 1519 template <class _CharT, class _Traits, size_t _Nb> 1520 std::basic_ostream<_CharT, _Traits>& 1521 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1522 const bitset<_Nb>& __x) 1523 { 1524 std::basic_string<_CharT, _Traits> __tmp; 1525 1526 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1527 // 396. what are characters zero and one. 1528 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__os.getloc()); 1529 __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1')); 1530 return __os << __tmp; 1531 } 1532 //@} 1533 1534 _GLIBCXX_END_NAMESPACE_CONTAINER 1535 } // namespace std 1536 1537 #undef _GLIBCXX_BITSET_WORDS 1538 #undef _GLIBCXX_BITSET_BITS_PER_WORD 1539 #undef _GLIBCXX_BITSET_BITS_PER_ULL 1540 1541 #if __cplusplus >= 201103L 1542 1543 #include <bits/functional_hash.h> 1544 1545 namespace std _GLIBCXX_VISIBILITY(default) 1546 { 1547 _GLIBCXX_BEGIN_NAMESPACE_VERSION 1548 1549 // DR 1182. 1550 /// std::hash specialization for bitset. 1551 template<size_t _Nb> 1552 struct hash<_GLIBCXX_STD_C::bitset<_Nb>> 1553 : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<_Nb>> 1554 { 1555 size_t 1556 operator()(const _GLIBCXX_STD_C::bitset<_Nb>& __b) const noexcept 1557 { 1558 const size_t __clength = (_Nb + __CHAR_BIT__ - 1) / __CHAR_BIT__; 1559 return std::_Hash_impl::hash(__b._M_getdata(), __clength); 1560 } 1561 }; 1562 1563 template<> 1564 struct hash<_GLIBCXX_STD_C::bitset<0>> 1565 : public __hash_base<size_t, _GLIBCXX_STD_C::bitset<0>> 1566 { 1567 size_t 1568 operator()(const _GLIBCXX_STD_C::bitset<0>&) const noexcept 1569 { return 0; } 1570 }; 1571 1572 _GLIBCXX_END_NAMESPACE_VERSION 1573 } // namespace 1574 1575 #endif // C++11 1576 1577 #ifdef _GLIBCXX_DEBUG 1578 # include <debug/bitset> 1579 #endif 1580 1581 #ifdef _GLIBCXX_PROFILE 1582 # include <profile/bitset> 1583 #endif 1584 1585 #endif /* _GLIBCXX_BITSET */ 1586