1// TR2 <dynamic_bitset> -*- C++ -*- 2 3// Copyright (C) 2009-2014 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/** @file tr2/dynamic_bitset 26 * This is a TR2 C++ Library header. 27 */ 28 29#ifndef _GLIBCXX_TR2_DYNAMIC_BITSET 30#define _GLIBCXX_TR2_DYNAMIC_BITSET 1 31 32#pragma GCC system_header 33 34#include <limits> 35#include <vector> 36#include <string> 37#include <memory> // For std::allocator 38#include <bits/functexcept.h> // For invalid_argument, out_of_range, 39 // overflow_error 40#include <iosfwd> 41#include <bits/cxxabi_forced.h> 42 43namespace std _GLIBCXX_VISIBILITY(default) 44{ 45namespace tr2 46{ 47_GLIBCXX_BEGIN_NAMESPACE_VERSION 48 49 /** 50 * Dynamic Bitset. 51 * 52 * See N2050, 53 * Proposal to Add a Dynamically Sizeable Bitset to the Standard Library. 54 */ 55namespace __detail 56{ 57 58template<typename T> 59class _Bool2UChar 60{ 61 typedef T type; 62}; 63 64template<> 65class _Bool2UChar<bool> 66{ 67public: 68 typedef unsigned char type; 69}; 70 71} 72 73 /** 74 * Base class, general case. 75 * 76 * See documentation for dynamic_bitset. 77 */ 78 template<typename _WordT = unsigned long long, 79 typename _Alloc = std::allocator<_WordT>> 80 struct __dynamic_bitset_base 81 { 82 static_assert(std::is_unsigned<_WordT>::value, "template argument " 83 "_WordT not an unsigned integral type"); 84 85 typedef _WordT block_type; 86 typedef _Alloc allocator_type; 87 typedef size_t size_type; 88 89 static const size_type _S_bits_per_block = __CHAR_BIT__ * sizeof(block_type); 90 static const size_type npos = static_cast<size_type>(-1); 91 92 /// 0 is the least significant word. 93 std::vector<block_type, allocator_type> _M_w; 94 95 explicit 96 __dynamic_bitset_base(const allocator_type& __alloc = allocator_type()) 97 : _M_w(__alloc) 98 { } 99 100 explicit 101 __dynamic_bitset_base(__dynamic_bitset_base&& __b) 102 { this->_M_w.swap(__b._M_w); } 103 104 explicit 105 __dynamic_bitset_base(size_type __nbits, unsigned long long __val = 0ULL, 106 const allocator_type& __alloc = allocator_type()) 107 : _M_w(__nbits / _S_bits_per_block 108 + (__nbits % _S_bits_per_block > 0), 109 __val, __alloc) 110 { 111 unsigned long long __mask = ~static_cast<block_type>(0); 112 size_t __n = std::min(this->_M_w.size(), 113 sizeof(unsigned long long) / sizeof(block_type)); 114 for (size_t __i = 0; __i < __n; ++__i) 115 { 116 this->_M_w[__i] = (__val & __mask) >> (__i * _S_bits_per_block); 117 __mask <<= _S_bits_per_block; 118 } 119 } 120 121 void 122 _M_assign(const __dynamic_bitset_base& __b) 123 { this->_M_w = __b._M_w; } 124 125 void 126 _M_swap(__dynamic_bitset_base& __b) 127 { this->_M_w.swap(__b._M_w); } 128 129 void 130 _M_clear() 131 { this->_M_w.clear(); } 132 133 void 134 _M_resize(size_t __nbits, bool __value) 135 { 136 size_t __sz = __nbits / _S_bits_per_block; 137 if (__nbits % _S_bits_per_block > 0) 138 ++__sz; 139 if (__sz != this->_M_w.size()) 140 { 141 block_type __val = 0; 142 if (__value) 143 __val = std::numeric_limits<block_type>::max(); 144 this->_M_w.resize(__sz, __val); 145 } 146 } 147 148 allocator_type 149 _M_get_allocator() const 150 { return this->_M_w.get_allocator(); } 151 152 static size_type 153 _S_whichword(size_type __pos) noexcept 154 { return __pos / _S_bits_per_block; } 155 156 static size_type 157 _S_whichbyte(size_type __pos) noexcept 158 { return (__pos % _S_bits_per_block) / __CHAR_BIT__; } 159 160 static size_type 161 _S_whichbit(size_type __pos) noexcept 162 { return __pos % _S_bits_per_block; } 163 164 static block_type 165 _S_maskbit(size_type __pos) noexcept 166 { return (static_cast<block_type>(1)) << _S_whichbit(__pos); } 167 168 block_type& 169 _M_getword(size_type __pos) 170 { return this->_M_w[_S_whichword(__pos)]; } 171 172 block_type 173 _M_getword(size_type __pos) const 174 { return this->_M_w[_S_whichword(__pos)]; } 175 176 block_type& 177 _M_hiword() 178 { return this->_M_w[_M_w.size() - 1]; } 179 180 block_type 181 _M_hiword() const 182 { return this->_M_w[_M_w.size() - 1]; } 183 184 void 185 _M_do_and(const __dynamic_bitset_base& __x) 186 { 187 if (__x._M_w.size() == this->_M_w.size()) 188 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 189 this->_M_w[__i] &= __x._M_w[__i]; 190 else 191 return; 192 } 193 194 void 195 _M_do_or(const __dynamic_bitset_base& __x) 196 { 197 if (__x._M_w.size() == this->_M_w.size()) 198 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 199 this->_M_w[__i] |= __x._M_w[__i]; 200 else 201 return; 202 } 203 204 void 205 _M_do_xor(const __dynamic_bitset_base& __x) 206 { 207 if (__x._M_w.size() == this->_M_w.size()) 208 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 209 this->_M_w[__i] ^= __x._M_w[__i]; 210 else 211 return; 212 } 213 214 void 215 _M_do_dif(const __dynamic_bitset_base& __x) 216 { 217 if (__x._M_w.size() == this->_M_w.size()) 218 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 219 this->_M_w[__i] &= ~__x._M_w[__i]; 220 else 221 return; 222 } 223 224 void 225 _M_do_left_shift(size_t __shift); 226 227 void 228 _M_do_right_shift(size_t __shift); 229 230 void 231 _M_do_flip() 232 { 233 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 234 this->_M_w[__i] = ~this->_M_w[__i]; 235 } 236 237 void 238 _M_do_set() 239 { 240 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 241 this->_M_w[__i] = ~static_cast<block_type>(0); 242 } 243 244 void 245 _M_do_reset() 246 { 247 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 248 this->_M_w[__i] = static_cast<block_type>(0); 249 } 250 251 bool 252 _M_is_equal(const __dynamic_bitset_base& __x) const 253 { 254 if (__x._M_w.size() == this->_M_w.size()) 255 { 256 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 257 if (this->_M_w[__i] != __x._M_w[__i]) 258 return false; 259 return true; 260 } 261 else 262 return false; 263 } 264 265 bool 266 _M_is_less(const __dynamic_bitset_base& __x) const 267 { 268 if (__x._M_w.size() == this->_M_w.size()) 269 { 270 for (size_t __i = this->_M_w.size(); __i > 0; --__i) 271 { 272 if (this->_M_w[__i-1] < __x._M_w[__i-1]) 273 return true; 274 else if (this->_M_w[__i-1] > __x._M_w[__i-1]) 275 return false; 276 } 277 return false; 278 } 279 else 280 return false; 281 } 282 283 size_t 284 _M_are_all_aux() const 285 { 286 for (size_t __i = 0; __i < this->_M_w.size() - 1; ++__i) 287 if (_M_w[__i] != ~static_cast<block_type>(0)) 288 return 0; 289 return ((this->_M_w.size() - 1) * _S_bits_per_block 290 + __builtin_popcountll(this->_M_hiword())); 291 } 292 293 bool 294 _M_is_any() const 295 { 296 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 297 if (this->_M_w[__i] != static_cast<block_type>(0)) 298 return true; 299 return false; 300 } 301 302 bool 303 _M_is_subset_of(const __dynamic_bitset_base& __b) 304 { 305 if (__b._M_w.size() == this->_M_w.size()) 306 { 307 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 308 if (this->_M_w[__i] != (this->_M_w[__i] | __b._M_w[__i])) 309 return false; 310 return true; 311 } 312 else 313 return false; 314 } 315 316 bool 317 _M_is_proper_subset_of(const __dynamic_bitset_base& __b) const 318 { 319 if (this->is_subset_of(__b)) 320 { 321 if (*this == __b) 322 return false; 323 else 324 return true; 325 } 326 else 327 return false; 328 } 329 330 size_t 331 _M_do_count() const 332 { 333 size_t __result = 0; 334 for (size_t __i = 0; __i < this->_M_w.size(); ++__i) 335 __result += __builtin_popcountll(this->_M_w[__i]); 336 return __result; 337 } 338 339 size_type 340 _M_size() const noexcept 341 { return this->_M_w.size(); } 342 343 unsigned long 344 _M_do_to_ulong() const; 345 346 unsigned long long 347 _M_do_to_ullong() const; 348 349 // find first "on" bit 350 size_type 351 _M_do_find_first(size_t __not_found) const; 352 353 // find the next "on" bit that follows "prev" 354 size_type 355 _M_do_find_next(size_t __prev, size_t __not_found) const; 356 357 // do append of block 358 void 359 _M_do_append_block(block_type __block, size_type __pos) 360 { 361 size_t __offset = __pos % _S_bits_per_block; 362 if (__offset == 0) 363 this->_M_w.push_back(__block); 364 else 365 { 366 this->_M_hiword() |= (__block << __offset); 367 this->_M_w.push_back(__block >> (_S_bits_per_block - __offset)); 368 } 369 } 370 }; 371 372 /** 373 * @brief The %dynamic_bitset class represents a sequence of bits. 374 * 375 * @ingroup containers 376 * 377 * (Note that %dynamic_bitset does @e not meet the formal 378 * requirements of a <a href="tables.html#65">container</a>. 379 * Mainly, it lacks iterators.) 380 * 381 * The template argument, @a Nb, may be any non-negative number, 382 * specifying the number of bits (e.g., "0", "12", "1024*1024"). 383 * 384 * In the general unoptimized case, storage is allocated in 385 * word-sized blocks. Let B be the number of bits in a word, then 386 * (Nb+(B-1))/B words will be used for storage. B - Nb%B bits are 387 * unused. (They are the high-order bits in the highest word.) It 388 * is a class invariant that those unused bits are always zero. 389 * 390 * If you think of %dynamic_bitset as "a simple array of bits," be 391 * aware that your mental picture is reversed: a %dynamic_bitset 392 * behaves the same way as bits in integers do, with the bit at 393 * index 0 in the "least significant / right-hand" position, and 394 * the bit at index Nb-1 in the "most significant / left-hand" 395 * position. Thus, unlike other containers, a %dynamic_bitset's 396 * index "counts from right to left," to put it very loosely. 397 * 398 * This behavior is preserved when translating to and from strings. 399 * For example, the first line of the following program probably 400 * prints "b('a') is 0001100001" on a modern ASCII system. 401 * 402 * @code 403 * #include <dynamic_bitset> 404 * #include <iostream> 405 * #include <sstream> 406 * 407 * using namespace std; 408 * 409 * int main() 410 * { 411 * long a = 'a'; 412 * dynamic_bitset b(a); 413 * 414 * cout << "b('a') is " << b << endl; 415 * 416 * ostringstream s; 417 * s << b; 418 * string str = s.str(); 419 * cout << "index 3 in the string is " << str[3] << " but\n" 420 * << "index 3 in the bitset is " << b[3] << endl; 421 * } 422 * @endcode 423 * 424 * Also see: 425 * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt12ch33s02.html 426 * for a description of extensions. 427 * 428 * Most of the actual code isn't contained in %dynamic_bitset<> 429 * itself, but in the base class __dynamic_bitset_base. The base 430 * class works with whole words, not with individual bits. This 431 * allows us to specialize __dynamic_bitset_base for the important 432 * special case where the %dynamic_bitset is only a single word. 433 * 434 * Extra confusion can result due to the fact that the storage for 435 * __dynamic_bitset_base @e is a vector, and is indexed as such. This is 436 * carefully encapsulated. 437 */ 438 template<typename _WordT = unsigned long long, 439 typename _Alloc = std::allocator<_WordT>> 440 class dynamic_bitset 441 : private __dynamic_bitset_base<_WordT, _Alloc> 442 { 443 static_assert(std::is_unsigned<_WordT>::value, "template argument " 444 "_WordT not an unsigned integral type"); 445 446 public: 447 448 typedef __dynamic_bitset_base<_WordT, _Alloc> _Base; 449 typedef _WordT block_type; 450 typedef _Alloc allocator_type; 451 typedef size_t size_type; 452 453 static const size_type bits_per_block = __CHAR_BIT__ * sizeof(block_type); 454 // Use this: constexpr size_type std::numeric_limits<size_type>::max(). 455 static const size_type npos = static_cast<size_type>(-1); 456 457 private: 458 459 // Clear the unused bits in the uppermost word. 460 void 461 _M_do_sanitize() 462 { 463 size_type __shift = this->_M_Nb % bits_per_block; 464 if (__shift > 0) 465 this->_M_hiword() &= ~((~static_cast<block_type>(0)) << __shift); 466 } 467 468 // Set the unused bits in the uppermost word. 469 void 470 _M_do_fill() 471 { 472 size_type __shift = this->_M_Nb % bits_per_block; 473 if (__shift > 0) 474 this->_M_hiword() |= ((~static_cast<block_type>(0)) << __shift); 475 } 476 477 /** 478 * These versions of single-bit set, reset, flip, and test 479 * do no range checking. 480 */ 481 dynamic_bitset<_WordT, _Alloc>& 482 _M_unchecked_set(size_type __pos) 483 { 484 this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); 485 return *this; 486 } 487 488 dynamic_bitset<_WordT, _Alloc>& 489 _M_unchecked_set(size_type __pos, int __val) 490 { 491 if (__val) 492 this->_M_getword(__pos) |= _Base::_S_maskbit(__pos); 493 else 494 this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); 495 return *this; 496 } 497 498 dynamic_bitset<_WordT, _Alloc>& 499 _M_unchecked_reset(size_type __pos) 500 { 501 this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos); 502 return *this; 503 } 504 505 dynamic_bitset<_WordT, _Alloc>& 506 _M_unchecked_flip(size_type __pos) 507 { 508 this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos); 509 return *this; 510 } 511 512 bool 513 _M_unchecked_test(size_type __pos) const 514 { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos)) 515 != static_cast<_WordT>(0)); } 516 517 size_type _M_Nb; 518 519 public: 520 /** 521 * This encapsulates the concept of a single bit. An instance 522 * of this class is a proxy for an actual bit; this way the 523 * individual bit operations are done as faster word-size 524 * bitwise instructions. 525 * 526 * Most users will never need to use this class directly; 527 * conversions to and from bool are automatic and should be 528 * transparent. Overloaded operators help to preserve the 529 * illusion. 530 * 531 * (On a typical system, this "bit %reference" is 64 times the 532 * size of an actual bit. Ha.) 533 */ 534 class reference 535 { 536 friend class dynamic_bitset; 537 538 block_type *_M_wp; 539 size_type _M_bpos; 540 541 // left undefined 542 reference(); 543 544 public: 545 reference(dynamic_bitset& __b, size_type __pos) 546 { 547 this->_M_wp = &__b._M_getword(__pos); 548 this->_M_bpos = _Base::_S_whichbit(__pos); 549 } 550 551 ~reference() 552 { } 553 554 // For b[i] = __x; 555 reference& 556 operator=(bool __x) 557 { 558 if (__x) 559 *this->_M_wp |= _Base::_S_maskbit(this->_M_bpos); 560 else 561 *this->_M_wp &= ~_Base::_S_maskbit(this->_M_bpos); 562 return *this; 563 } 564 565 // For b[i] = b[__j]; 566 reference& 567 operator=(const reference& __j) 568 { 569 if ((*(__j._M_wp) & _Base::_S_maskbit(__j._M_bpos))) 570 *this->_M_wp |= _Base::_S_maskbit(this->_M_bpos); 571 else 572 *this->_M_wp &= ~_Base::_S_maskbit(this->_M_bpos); 573 return *this; 574 } 575 576 // Flips the bit 577 bool 578 operator~() const 579 { return (*(_M_wp) & _Base::_S_maskbit(this->_M_bpos)) == 0; } 580 581 // For __x = b[i]; 582 operator bool() const 583 { return (*(this->_M_wp) & _Base::_S_maskbit(this->_M_bpos)) != 0; } 584 585 // For b[i].flip(); 586 reference& 587 flip() 588 { 589 *this->_M_wp ^= _Base::_S_maskbit(this->_M_bpos); 590 return *this; 591 } 592 }; 593 594 friend class reference; 595 596 typedef bool const_reference; 597 598 // 23.3.5.1 constructors: 599 /// All bits set to zero. 600 explicit 601 dynamic_bitset(const allocator_type& __alloc = allocator_type()) 602 : _Base(__alloc), _M_Nb(0) 603 { } 604 605 /// Initial bits bitwise-copied from a single word (others set to zero). 606 explicit 607 dynamic_bitset(size_type __nbits, unsigned long long __val = 0ULL, 608 const allocator_type& __alloc = allocator_type()) 609 : _Base(__nbits, __val, __alloc), 610 _M_Nb(__nbits) 611 { } 612 613 dynamic_bitset(initializer_list<block_type> __il, 614 const allocator_type& __alloc = allocator_type()) 615 : _Base(__alloc), _M_Nb(0) 616 { this->append(__il); } 617 618 /** 619 * @brief Use a subset of a string. 620 * @param __str A string of '0' and '1' characters. 621 * @param __pos Index of the first character in @p __str to use. 622 * @param __n The number of characters to copy. 623 * @throw std::out_of_range If @p __pos is bigger the size of @p __str. 624 * @throw std::invalid_argument If a character appears in the string 625 * which is neither '0' nor '1'. 626 */ 627 template<typename _CharT, typename _Traits, typename _Alloc1> 628 explicit 629 dynamic_bitset(const std::basic_string<_CharT, _Traits, _Alloc1>& __str, 630 typename basic_string<_CharT,_Traits,_Alloc1>::size_type 631 __pos = 0, 632 typename basic_string<_CharT,_Traits,_Alloc1>::size_type 633 __n = std::basic_string<_CharT, _Traits, _Alloc1>::npos, 634 _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'), 635 const allocator_type& __alloc = allocator_type()) 636 : _Base(__alloc), 637 _M_Nb(0) // Watch for npos. 638 { 639 if (__pos > __str.size()) 640 __throw_out_of_range(__N("dynamic_bitset::bitset initial position " 641 "not valid")); 642 643 // Watch for npos. 644 this->_M_Nb = (__n > __str.size() ? __str.size() - __pos : __n); 645 this->resize(this->_M_Nb); 646 this->_M_copy_from_string(__str, __pos, __n, 647 _CharT('0'), _CharT('1')); 648 } 649 650 /** 651 * @brief Construct from a string. 652 * @param __str A string of '0' and '1' characters. 653 * @throw std::invalid_argument If a character appears in the string 654 * which is neither '0' nor '1'. 655 */ 656 explicit 657 dynamic_bitset(const char* __str, 658 const allocator_type& __alloc = allocator_type()) 659 : _Base(__alloc) 660 { 661 size_t __len = 0; 662 if (__str) 663 while (__str[__len] != '\0') 664 ++__len; 665 this->resize(__len); 666 this->_M_copy_from_ptr<char,std::char_traits<char>> 667 (__str, __len, 0, __len, '0', '1'); 668 } 669 670 /** 671 * @brief Copy constructor. 672 */ 673 dynamic_bitset(const dynamic_bitset& __b) 674 : _Base(__b), _M_Nb(__b.size()) 675 { } 676 677 /** 678 * @brief Move constructor. 679 */ 680 dynamic_bitset(dynamic_bitset&& __b) 681 : _Base(std::forward<_Base>(__b)), _M_Nb(__b.size()) 682 { } 683 684 /** 685 * @brief Swap with another bitset. 686 */ 687 void 688 swap(dynamic_bitset& __b) 689 { 690 this->_M_swap(__b); 691 std::swap(this->_M_Nb, __b._M_Nb); 692 } 693 694 /** 695 * @brief Assignment. 696 */ 697 dynamic_bitset& 698 operator=(const dynamic_bitset& __b) 699 { 700 if (&__b != this) 701 { 702 this->_M_assign(__b); 703 this->_M_Nb = __b._M_Nb; 704 } 705 } 706 707 /** 708 * @brief Move assignment. 709 */ 710 dynamic_bitset& 711 operator=(dynamic_bitset&& __b) 712 { 713 this->swap(__b); 714 return *this; 715 } 716 717 /** 718 * @brief Return the allocator for the bitset. 719 */ 720 allocator_type 721 get_allocator() const 722 { return this->_M_get_allocator(); } 723 724 /** 725 * @brief Resize the bitset. 726 */ 727 void 728 resize(size_type __nbits, bool __value = false) 729 { 730 if (__value) 731 this->_M_do_fill(); 732 this->_M_resize(__nbits, __value); 733 this->_M_Nb = __nbits; 734 this->_M_do_sanitize(); 735 } 736 737 /** 738 * @brief Clear the bitset. 739 */ 740 void 741 clear() 742 { 743 this->_M_clear(); 744 this->_M_Nb = 0; 745 } 746 747 /** 748 * @brief Push a bit onto the high end of the bitset. 749 */ 750 void 751 push_back(bool __bit) 752 { 753 if (size_t __offset = this->size() % bits_per_block == 0) 754 this->_M_do_append_block(block_type(0), this->_M_Nb); 755 ++this->_M_Nb; 756 this->_M_unchecked_set(this->_M_Nb, __bit); 757 } 758 759 /** 760 * @brief Append a block. 761 */ 762 void 763 append(block_type __block) 764 { 765 this->_M_do_append_block(__block, this->_M_Nb); 766 this->_M_Nb += bits_per_block; 767 } 768 769 /** 770 * @brief 771 */ 772 void 773 append(initializer_list<block_type> __il) 774 { this->append(__il.begin(), __il.end()); } 775 776 /** 777 * @brief Append an iterator range of blocks. 778 */ 779 template <typename _BlockInputIterator> 780 void 781 append(_BlockInputIterator __first, _BlockInputIterator __last) 782 { 783 for (; __first != __last; ++__first) 784 this->append(*__first); 785 } 786 787 // 23.3.5.2 dynamic_bitset operations: 788 //@{ 789 /** 790 * @brief Operations on dynamic_bitsets. 791 * @param __rhs A same-sized dynamic_bitset. 792 * 793 * These should be self-explanatory. 794 */ 795 dynamic_bitset<_WordT, _Alloc>& 796 operator&=(const dynamic_bitset<_WordT, _Alloc>& __rhs) 797 { 798 this->_M_do_and(__rhs); 799 return *this; 800 } 801 802 dynamic_bitset<_WordT, _Alloc>& 803 operator&=(dynamic_bitset<_WordT, _Alloc>&& __rhs) 804 { 805 this->_M_do_and(std::move(__rhs)); 806 return *this; 807 } 808 809 dynamic_bitset<_WordT, _Alloc>& 810 operator|=(const dynamic_bitset<_WordT, _Alloc>& __rhs) 811 { 812 this->_M_do_or(__rhs); 813 return *this; 814 } 815 816 dynamic_bitset<_WordT, _Alloc>& 817 operator^=(const dynamic_bitset<_WordT, _Alloc>& __rhs) 818 { 819 this->_M_do_xor(__rhs); 820 return *this; 821 } 822 823 dynamic_bitset<_WordT, _Alloc>& 824 operator-=(const dynamic_bitset<_WordT, _Alloc>& __rhs) 825 { 826 this->_M_do_dif(__rhs); 827 return *this; 828 } 829 //@} 830 831 //@{ 832 /** 833 * @brief Operations on dynamic_bitsets. 834 * @param __pos The number of places to shift. 835 * 836 * These should be self-explanatory. 837 */ 838 dynamic_bitset<_WordT, _Alloc>& 839 operator<<=(size_type __pos) 840 { 841 if (__builtin_expect(__pos < this->_M_Nb, 1)) 842 { 843 this->_M_do_left_shift(__pos); 844 this->_M_do_sanitize(); 845 } 846 else 847 this->_M_do_reset(); 848 return *this; 849 } 850 851 dynamic_bitset<_WordT, _Alloc>& 852 operator>>=(size_type __pos) 853 { 854 if (__builtin_expect(__pos < this->_M_Nb, 1)) 855 { 856 this->_M_do_right_shift(__pos); 857 this->_M_do_sanitize(); 858 } 859 else 860 this->_M_do_reset(); 861 return *this; 862 } 863 //@} 864 865 // Set, reset, and flip. 866 /** 867 * @brief Sets every bit to true. 868 */ 869 dynamic_bitset<_WordT, _Alloc>& 870 set() 871 { 872 this->_M_do_set(); 873 this->_M_do_sanitize(); 874 return *this; 875 } 876 877 /** 878 * @brief Sets a given bit to a particular value. 879 * @param __pos The index of the bit. 880 * @param __val Either true or false, defaults to true. 881 * @throw std::out_of_range If @a __pos is bigger the size of the %set. 882 */ 883 dynamic_bitset<_WordT, _Alloc>& 884 set(size_type __pos, bool __val = true) 885 { 886 if (__pos >= _M_Nb) 887 __throw_out_of_range(__N("dynamic_bitset::set")); 888 return this->_M_unchecked_set(__pos, __val); 889 } 890 891 /** 892 * @brief Sets every bit to false. 893 */ 894 dynamic_bitset<_WordT, _Alloc>& 895 reset() 896 { 897 this->_M_do_reset(); 898 return *this; 899 } 900 901 /** 902 * @brief Sets a given bit to false. 903 * @param __pos The index of the bit. 904 * @throw std::out_of_range If @a __pos is bigger the size of the %set. 905 * 906 * Same as writing @c set(__pos, false). 907 */ 908 dynamic_bitset<_WordT, _Alloc>& 909 reset(size_type __pos) 910 { 911 if (__pos >= _M_Nb) 912 __throw_out_of_range(__N("dynamic_bitset::reset")); 913 return this->_M_unchecked_reset(__pos); 914 } 915 916 /** 917 * @brief Toggles every bit to its opposite value. 918 */ 919 dynamic_bitset<_WordT, _Alloc>& 920 flip() 921 { 922 this->_M_do_flip(); 923 this->_M_do_sanitize(); 924 return *this; 925 } 926 927 /** 928 * @brief Toggles a given bit to its opposite value. 929 * @param __pos The index of the bit. 930 * @throw std::out_of_range If @a __pos is bigger the size of the %set. 931 */ 932 dynamic_bitset<_WordT, _Alloc>& 933 flip(size_type __pos) 934 { 935 if (__pos >= _M_Nb) 936 __throw_out_of_range(__N("dynamic_bitset::flip")); 937 return this->_M_unchecked_flip(__pos); 938 } 939 940 /// See the no-argument flip(). 941 dynamic_bitset<_WordT, _Alloc> 942 operator~() const 943 { return dynamic_bitset<_WordT, _Alloc>(*this).flip(); } 944 945 //@{ 946 /** 947 * @brief Array-indexing support. 948 * @param __pos Index into the %dynamic_bitset. 949 * @return A bool for a 'const %dynamic_bitset'. For non-const 950 * bitsets, an instance of the reference proxy class. 951 * @note These operators do no range checking and throw no 952 * exceptions, as required by DR 11 to the standard. 953 */ 954 reference 955 operator[](size_type __pos) 956 { return reference(*this,__pos); } 957 958 const_reference 959 operator[](size_type __pos) const 960 { return _M_unchecked_test(__pos); } 961 //@} 962 963 /** 964 * @brief Returns a numerical interpretation of the %dynamic_bitset. 965 * @return The integral equivalent of the bits. 966 * @throw std::overflow_error If there are too many bits to be 967 * represented in an @c unsigned @c long. 968 */ 969 unsigned long 970 to_ulong() const 971 { return this->_M_do_to_ulong(); } 972 973 /** 974 * @brief Returns a numerical interpretation of the %dynamic_bitset. 975 * @return The integral equivalent of the bits. 976 * @throw std::overflow_error If there are too many bits to be 977 * represented in an @c unsigned @c long. 978 */ 979 unsigned long long 980 to_ullong() const 981 { return this->_M_do_to_ullong(); } 982 983 /** 984 * @brief Returns a character interpretation of the %dynamic_bitset. 985 * @return The string equivalent of the bits. 986 * 987 * Note the ordering of the bits: decreasing character positions 988 * correspond to increasing bit positions (see the main class notes for 989 * an example). 990 */ 991 template<typename _CharT = char, 992 typename _Traits = std::char_traits<_CharT>, 993 typename _Alloc1 = std::allocator<_CharT>> 994 std::basic_string<_CharT, _Traits, _Alloc1> 995 to_string(_CharT __zero = _CharT('0'), _CharT __one = _CharT('1')) const 996 { 997 std::basic_string<_CharT, _Traits, _Alloc1> __result; 998 _M_copy_to_string(__result, __zero, __one); 999 return __result; 1000 } 1001 1002 // Helper functions for string operations. 1003 template<typename _CharT, typename _Traits> 1004 void 1005 _M_copy_from_ptr(const _CharT*, size_t, size_t, size_t, 1006 _CharT, _CharT); 1007 1008 template<typename _CharT, typename _Traits, typename _Alloc1> 1009 void 1010 _M_copy_from_string(const std::basic_string<_CharT, 1011 _Traits, _Alloc1>& __str, size_t __pos, size_t __n, 1012 _CharT __zero = _CharT('0'), 1013 _CharT __one = _CharT('1')) 1014 { _M_copy_from_ptr<_CharT, _Traits>(__str.data(), __str.size(), 1015 __pos, __n, __zero, __one); } 1016 1017 template<typename _CharT, typename _Traits, typename _Alloc1> 1018 void 1019 _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc1>& __str, 1020 _CharT __zero = _CharT('0'), 1021 _CharT __one = _CharT('1')) const; 1022 1023 /// Returns the number of bits which are set. 1024 size_type 1025 count() const noexcept 1026 { return this->_M_do_count(); } 1027 1028 /// Returns the total number of bits. 1029 size_type 1030 size() const noexcept 1031 { return this->_M_Nb; } 1032 1033 /// Returns the total number of blocks. 1034 size_type 1035 num_blocks() const noexcept 1036 { return this->_M_size(); } 1037 1038 /// Returns true if the dynamic_bitset is empty. 1039 bool 1040 empty() const noexcept 1041 { return (this->_M_Nb == 0); } 1042 1043 /// Returns the maximum size of a dynamic_bitset object having the same 1044 /// type as *this. 1045 /// The real answer is max() * bits_per_block but is likely to overflow. 1046 constexpr size_type 1047 max_size() noexcept 1048 { return std::numeric_limits<block_type>::max(); } 1049 1050 /** 1051 * @brief Tests the value of a bit. 1052 * @param __pos The index of a bit. 1053 * @return The value at @a __pos. 1054 * @throw std::out_of_range If @a __pos is bigger the size of the %set. 1055 */ 1056 bool 1057 test(size_type __pos) const 1058 { 1059 if (__pos >= _M_Nb) 1060 __throw_out_of_range(__N("dynamic_bitset::test")); 1061 return _M_unchecked_test(__pos); 1062 } 1063 1064 /** 1065 * @brief Tests whether all the bits are on. 1066 * @return True if all the bits are set. 1067 */ 1068 bool 1069 all() const 1070 { return this->_M_are_all_aux() == _M_Nb; } 1071 1072 /** 1073 * @brief Tests whether any of the bits are on. 1074 * @return True if at least one bit is set. 1075 */ 1076 bool 1077 any() const 1078 { return this->_M_is_any(); } 1079 1080 /** 1081 * @brief Tests whether any of the bits are on. 1082 * @return True if none of the bits are set. 1083 */ 1084 bool 1085 none() const 1086 { return !this->_M_is_any(); } 1087 1088 //@{ 1089 /// Self-explanatory. 1090 dynamic_bitset<_WordT, _Alloc> 1091 operator<<(size_type __pos) const 1092 { return dynamic_bitset<_WordT, _Alloc>(*this) <<= __pos; } 1093 1094 dynamic_bitset<_WordT, _Alloc> 1095 operator>>(size_type __pos) const 1096 { return dynamic_bitset<_WordT, _Alloc>(*this) >>= __pos; } 1097 //@} 1098 1099 /** 1100 * @brief Finds the index of the first "on" bit. 1101 * @return The index of the first bit set, or size() if not found. 1102 * @sa find_next 1103 */ 1104 size_type 1105 find_first() const 1106 { return this->_M_do_find_first(this->_M_Nb); } 1107 1108 /** 1109 * @brief Finds the index of the next "on" bit after prev. 1110 * @return The index of the next bit set, or size() if not found. 1111 * @param __prev Where to start searching. 1112 * @sa find_first 1113 */ 1114 size_type 1115 find_next(size_t __prev) const 1116 { return this->_M_do_find_next(__prev, this->_M_Nb); } 1117 1118 bool 1119 is_subset_of(const dynamic_bitset& __b) const 1120 { return this->_M_is_subset_of(__b); } 1121 1122 bool 1123 is_proper_subset_of(const dynamic_bitset& __b) const 1124 { return this->_M_is_proper_subset_of(__b); } 1125 1126 friend bool 1127 operator==(const dynamic_bitset<_WordT, _Alloc>& __lhs, 1128 const dynamic_bitset<_WordT, _Alloc>& __rhs) 1129 { return __lhs._M_is_equal(__rhs); } 1130 1131 friend bool 1132 operator<(const dynamic_bitset<_WordT, _Alloc>& __lhs, 1133 const dynamic_bitset<_WordT, _Alloc>& __rhs) 1134 { return __lhs._M_is_less(__rhs); } 1135 }; 1136 1137 template<typename _WordT, typename _Alloc> 1138 template<typename _CharT, typename _Traits, typename _Alloc1> 1139 inline void 1140 dynamic_bitset<_WordT, _Alloc>:: 1141 _M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc1>& __str, 1142 _CharT __zero, _CharT __one) const 1143 { 1144 __str.assign(_M_Nb, __zero); 1145 for (size_t __i = _M_Nb; __i > 0; --__i) 1146 if (_M_unchecked_test(__i - 1)) 1147 _Traits::assign(__str[_M_Nb - __i], __one); 1148 } 1149 1150 1151 //@{ 1152 /// These comparisons for equality/inequality are, well, @e bitwise. 1153 1154 template<typename _WordT, typename _Alloc> 1155 inline bool 1156 operator!=(const dynamic_bitset<_WordT, _Alloc>& __lhs, 1157 const dynamic_bitset<_WordT, _Alloc>& __rhs) 1158 { return !(__lhs == __rhs); } 1159 1160 template<typename _WordT, typename _Alloc> 1161 inline bool 1162 operator<=(const dynamic_bitset<_WordT, _Alloc>& __lhs, 1163 const dynamic_bitset<_WordT, _Alloc>& __rhs) 1164 { return !(__lhs > __rhs); } 1165 1166 template<typename _WordT, typename _Alloc> 1167 inline bool 1168 operator>(const dynamic_bitset<_WordT, _Alloc>& __lhs, 1169 const dynamic_bitset<_WordT, _Alloc>& __rhs) 1170 { return __rhs < __lhs; } 1171 1172 template<typename _WordT, typename _Alloc> 1173 inline bool 1174 operator>=(const dynamic_bitset<_WordT, _Alloc>& __lhs, 1175 const dynamic_bitset<_WordT, _Alloc>& __rhs) 1176 { return !(__lhs < __rhs); } 1177 //@} 1178 1179 // 23.3.5.3 bitset operations: 1180 //@{ 1181 /** 1182 * @brief Global bitwise operations on bitsets. 1183 * @param __x A bitset. 1184 * @param __y A bitset of the same size as @a __x. 1185 * @return A new bitset. 1186 * 1187 * These should be self-explanatory. 1188 */ 1189 template<typename _WordT, typename _Alloc> 1190 inline dynamic_bitset<_WordT, _Alloc> 1191 operator&(const dynamic_bitset<_WordT, _Alloc>& __x, 1192 const dynamic_bitset<_WordT, _Alloc>& __y) 1193 { 1194 dynamic_bitset<_WordT, _Alloc> __result(__x); 1195 __result &= __y; 1196 return __result; 1197 } 1198 1199 template<typename _WordT, typename _Alloc> 1200 inline dynamic_bitset<_WordT, _Alloc> 1201 operator|(const dynamic_bitset<_WordT, _Alloc>& __x, 1202 const dynamic_bitset<_WordT, _Alloc>& __y) 1203 { 1204 dynamic_bitset<_WordT, _Alloc> __result(__x); 1205 __result |= __y; 1206 return __result; 1207 } 1208 1209 template <typename _WordT, typename _Alloc> 1210 inline dynamic_bitset<_WordT, _Alloc> 1211 operator^(const dynamic_bitset<_WordT, _Alloc>& __x, 1212 const dynamic_bitset<_WordT, _Alloc>& __y) 1213 { 1214 dynamic_bitset<_WordT, _Alloc> __result(__x); 1215 __result ^= __y; 1216 return __result; 1217 } 1218 1219 template <typename _WordT, typename _Alloc> 1220 inline dynamic_bitset<_WordT, _Alloc> 1221 operator-(const dynamic_bitset<_WordT, _Alloc>& __x, 1222 const dynamic_bitset<_WordT, _Alloc>& __y) 1223 { 1224 dynamic_bitset<_WordT, _Alloc> __result(__x); 1225 __result -= __y; 1226 return __result; 1227 } 1228 //@} 1229 1230 /** 1231 * @defgroup Global I/O operators for bitsets. 1232 * @{ 1233 * @brief Global I/O operators for bitsets. 1234 * 1235 * Direct I/O between streams and bitsets is supported. Output is 1236 * straightforward. Input will skip whitespace and only accept '0' 1237 * and '1' characters. The %dynamic_bitset will grow as necessary 1238 * to hold the string of bits. 1239 */ 1240 template <typename _CharT, typename _Traits, 1241 typename _WordT, typename _Alloc> 1242 inline std::basic_ostream<_CharT, _Traits>& 1243 operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1244 const dynamic_bitset<_WordT, _Alloc>& __x) 1245 { 1246 std::basic_string<_CharT, _Traits> __tmp; 1247 1248 const ctype<_CharT>& __ct = use_facet<ctype<_CharT>>(__os.getloc()); 1249 __x._M_copy_to_string(__tmp, __ct.widen('0'), __ct.widen('1')); 1250 return __os << __tmp; 1251 } 1252 /** 1253 * @} 1254 */ 1255 1256_GLIBCXX_END_NAMESPACE_VERSION 1257} // tr2 1258} // std 1259 1260#include <tr2/dynamic_bitset.tcc> 1261 1262#endif /* _GLIBCXX_TR2_DYNAMIC_BITSET */ 1263