@@ -36,7 +36,10 @@ struct bitset {
36
36
37
37
size_type size () const { return m_num_bits; }
38
38
39
- size_type num_blocks () const { return m_bits.size (); }
39
+ size_type num_blocks () const {
40
+ assert (m_bits.size () == calc_num_blocks (m_num_bits));
41
+ return m_bits.size ();
42
+ }
40
43
41
44
void resize (size_type num_bits) {
42
45
m_bits.resize (calc_num_blocks (num_bits), 0 );
@@ -54,16 +57,56 @@ struct bitset {
54
57
m_bits[block_index (pos)] &= ~bit_mask (pos);
55
58
}
56
59
60
+ bool test (size_type pos) const {
61
+ return (*this )[pos];
62
+ }
63
+
57
64
bool operator [](size_type pos) const {
58
65
assert (pos < m_num_bits);
59
66
return !!(m_bits[block_index (pos)] & bit_mask (pos));
60
67
}
61
68
69
+ void flip (size_type pos) {
70
+ assert (pos < m_num_bits);
71
+ if (test (pos))
72
+ clear (pos);
73
+ else
74
+ set (pos);
75
+ }
76
+
77
+ void flip () {
78
+ for (auto & byte : m_bits)
79
+ byte = ~byte;
80
+ zero_unused_bits ();
81
+ }
82
+
83
+ bool all () const {
84
+ auto sz = size ();
85
+ for (size_t i=0 ; i<sz; ++i)
86
+ if (!test (i))
87
+ return false ;
88
+ return true ;
89
+ }
90
+
91
+ bool none () const {
92
+ for (auto & byte : m_bits)
93
+ if (byte)
94
+ return false ;
95
+ return true ;
96
+ }
97
+
62
98
void zero_all_bits () {
63
99
for (auto & byte : m_bits)
64
100
byte = 0 ;
65
101
}
66
102
103
+ bitset operator |=(const bitset& o) {
104
+ assert (size () == o.size ());
105
+ for (size_t i=0 ; i<m_bits.size (); ++i)
106
+ m_bits[i] |= o.m_bits [i];
107
+ return *this ;
108
+ }
109
+
67
110
void zero_unused_bits () {
68
111
assert (m_bits.size () == calc_num_blocks (m_num_bits));
69
112
@@ -107,6 +150,27 @@ struct bitset {
107
150
return res;
108
151
}
109
152
153
+ static bitset from_string (std::string_view s) {
154
+ bitset bs;
155
+ auto num_bits = s.size ();
156
+ bs.resize (num_bits);
157
+
158
+ for (size_t i = 0 ; i < num_bits; ++i) {
159
+ switch (s[i]) {
160
+ case ' 0' :
161
+ break ; // nothing to do, all bits initially 0
162
+ case ' 1' :
163
+ bs.set (num_bits - i - 1 ); // high bitset indexes come first in the JSON representation
164
+ break ;
165
+ default :
166
+ throw std::invalid_argument ( " unexpected character in bitset string representation" );
167
+ break ;
168
+ }
169
+ }
170
+ assert (bs.unused_bits_zeroed ());
171
+ return bs;
172
+ }
173
+
110
174
void print () const {
111
175
auto s = to_string ();
112
176
if (!s.empty ())
0 commit comments