Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
BitVectorTest.cpp
Go to the documentation of this file.
4#include "test/storm_gtest.h"
5
6TEST(BitVectorTest, InitToZero) {
8
9 for (uint_fast64_t i = 0; i < 32; ++i) {
10 ASSERT_FALSE(vector.get(i));
11 }
12
13 ASSERT_TRUE(vector.empty());
14 ASSERT_FALSE(vector.full());
15}
16
17TEST(BitVectorTest, InitToOne) {
18 storm::storage::BitVector vector(32, true);
19
20 for (uint_fast64_t i = 0; i < 32; ++i) {
21 ASSERT_TRUE(vector.get(i));
22 }
23 ASSERT_FALSE(vector.empty());
24 ASSERT_TRUE(vector.full());
25}
26
27TEST(BitVectorTest, InitFromIterator) {
28 std::vector<uint_fast64_t> valueVector = {0, 4, 10};
29 storm::storage::BitVector vector(32, valueVector.begin(), valueVector.end());
30
31 ASSERT_EQ(32ul, vector.size());
32
33 for (uint_fast64_t i = 0; i < 32; ++i) {
34 if (i == 0 || i == 4 || i == 10) {
35 ASSERT_TRUE(vector.get(i));
36 } else {
37 ASSERT_FALSE(vector.get(i));
38 }
39 }
40}
41
42TEST(BitVectorTest, InitFromIntVector) {
43 std::vector<uint_fast64_t> valueVector = {0, 4, 10};
44 storm::storage::BitVector vector(32, valueVector);
45
46 ASSERT_EQ(32ul, vector.size());
47
48 for (uint_fast64_t i = 0; i < 32; ++i) {
49 if (i == 0 || i == 4 || i == 10) {
50 ASSERT_TRUE(vector.get(i));
51 } else {
52 ASSERT_FALSE(vector.get(i));
53 }
54 }
55}
56
57TEST(BitVectorTest, GetSet) {
59
60 for (uint_fast64_t i = 0; i < 32; ++i) {
61 vector.set(i, i % 2 == 0);
62 }
63
64 for (uint_fast64_t i = 0; i < 32; ++i) {
65 ASSERT_EQ(i % 2 == 0, vector.get(i));
66 }
67}
68
69TEST(BitVectorTest, GetAsInt) {
71
72 vector.set(62);
73 vector.set(63);
74 vector.set(64);
75 vector.set(65);
76
77 EXPECT_EQ(3ul, vector.getAsInt(0, 64));
78 EXPECT_EQ(1ul, vector.getAsInt(62, 1));
79 EXPECT_EQ(3ul, vector.getAsInt(62, 2));
80 EXPECT_EQ(7ul, vector.getAsInt(62, 3));
81 EXPECT_EQ(15ul, vector.getAsInt(62, 4));
82
83 vector.set(64, false);
84
85 EXPECT_EQ(1ul, vector.getAsInt(62, 1));
86 EXPECT_EQ(3ul, vector.getAsInt(62, 2));
87 EXPECT_EQ(6ul, vector.getAsInt(62, 3));
88 EXPECT_EQ(13ul, vector.getAsInt(62, 4));
89
90 vector.set(61);
91 vector.set(62, false);
92 EXPECT_EQ(2ul, vector.getAsInt(61, 2));
93}
94
95TEST(BitVectorTest, SetFromInt) {
97
98 vector.setFromInt(62, 1, 1);
99
100 EXPECT_TRUE(vector.get(62));
101 EXPECT_FALSE(vector.get(63));
102 EXPECT_FALSE(vector.get(64));
103 EXPECT_FALSE(vector.get(65));
104
105 vector.setFromInt(61, 2, 2);
106
107 EXPECT_TRUE(vector.get(61));
108 EXPECT_FALSE(vector.get(62));
109 EXPECT_FALSE(vector.get(63));
110
111 vector.setFromInt(61, 3, 5);
112
113 EXPECT_TRUE(vector.get(61));
114 EXPECT_FALSE(vector.get(62));
115 EXPECT_TRUE(vector.get(63));
116
117 vector = storm::storage::BitVector(77);
118 vector.setFromInt(62, 4, 15);
119
120 EXPECT_TRUE(vector.get(62));
121 EXPECT_TRUE(vector.get(63));
122 EXPECT_TRUE(vector.get(64));
123 EXPECT_TRUE(vector.get(65));
124
125 vector.setFromInt(62, 5, 17);
126}
127
128TEST(BitVectorTest, GetSetInt) {
129 storm::storage::BitVector vector(77);
130
131 vector.setFromInt(63, 3, 2);
132 EXPECT_EQ(2ul, vector.getAsInt(63, 3));
133}
134
135TEST(BitVectorDeathTest, GetSetAssertion) {
136 storm::storage::BitVector vector(32);
137
138#ifndef NDEBUG
139#ifdef WINDOWS
140 EXPECT_EXIT(vector.get(32), ::testing::ExitedWithCode(0), ".*");
141 EXPECT_EXIT(vector.set(32), ::testing::ExitedWithCode(0), ".*");
142#else
143 EXPECT_DEATH_IF_SUPPORTED(vector.get(32), "");
144 EXPECT_DEATH_IF_SUPPORTED(vector.set(32), "");
145#endif
146#else
147 std::cerr << "WARNING: Not testing GetSetAssertions, as they are disabled in release mode.\n";
148 SUCCEED();
149#endif
150}
151
152TEST(BitVectorTest, Resize) {
153 storm::storage::BitVector vector(32);
154
155 for (uint_fast64_t i = 0; i < 32; ++i) {
156 vector.set(i);
157 }
158
159 vector.resize(70);
160
161 ASSERT_EQ(70ul, vector.size());
162 ASSERT_EQ(32ul, vector.getNumberOfSetBits());
163
164 for (uint_fast64_t i = 0; i < 32; ++i) {
165 ASSERT_TRUE(vector.get(i));
166 }
167 bool result;
168 for (uint_fast64_t i = 32; i < 70; ++i) {
169 result = true;
170 ASSERT_NO_THROW(result = vector.get(i));
171 ASSERT_FALSE(result);
172 }
173
174 vector.resize(72, true);
175
176 ASSERT_EQ(72ul, vector.size());
177 ASSERT_EQ(34ul, vector.getNumberOfSetBits());
178
179 for (uint_fast64_t i = 0; i < 32; ++i) {
180 ASSERT_TRUE(vector.get(i));
181 }
182 for (uint_fast64_t i = 32; i < 70; ++i) {
183 result = true;
184 ASSERT_NO_THROW(result = vector.get(i));
185 ASSERT_FALSE(result);
186 }
187 for (uint_fast64_t i = 70; i < 72; ++i) {
188 ASSERT_TRUE(vector.get(i));
189 }
190
191 vector.resize(16, 0);
192 ASSERT_EQ(16ul, vector.size());
193 ASSERT_EQ(16ul, vector.getNumberOfSetBits());
194
195 for (uint_fast64_t i = 0; i < 16; ++i) {
196 ASSERT_TRUE(vector.get(i));
197 }
198
199 vector.resize(65, 1);
200 ASSERT_EQ(65ul, vector.size());
201 ASSERT_TRUE(vector.full());
202}
203
204TEST(BitVectorTest, OperatorAnd) {
205 storm::storage::BitVector vector1(32);
206 storm::storage::BitVector vector2(32);
207
208 for (int i = 0; i < 32; ++i) {
209 vector1.set(i, i % 2 == 0);
210 vector2.set(i, i % 2 == 1);
211 }
212 vector1.set(31);
213 vector2.set(31);
214
215 storm::storage::BitVector andResult = vector1 & vector2;
216 for (uint_fast64_t i = 0; i < 31; ++i) {
217 ASSERT_FALSE(andResult.get(i));
218 }
219 ASSERT_TRUE(andResult.get(31));
220}
221
222TEST(BitVectorTest, OperatorAndEqual) {
223 storm::storage::BitVector vector1(32);
224 storm::storage::BitVector vector2(32);
225
226 for (int i = 0; i < 32; ++i) {
227 vector1.set(i, i % 2 == 0);
228 vector2.set(i, i % 2 == 1);
229 }
230 vector1.set(31);
231 vector2.set(31);
232
233 vector1 &= vector2;
234
235 for (uint_fast64_t i = 0; i < 31; ++i) {
236 ASSERT_FALSE(vector1.get(i));
237 }
238 ASSERT_TRUE(vector1.get(31));
239}
240
241TEST(BitVectorTest, OperatorOr) {
242 storm::storage::BitVector vector1(32);
243 storm::storage::BitVector vector2(32);
244
245 for (uint_fast64_t i = 0; i < 32; ++i) {
246 vector1.set(i, i % 2 == 0);
247 vector2.set(i, i % 2 == 1);
248 }
249 vector1.set(31, false);
250 vector2.set(31, false);
251
252 storm::storage::BitVector orResult = vector1 | vector2;
253
254 for (uint_fast64_t i = 0; i < 31; ++i) {
255 ASSERT_TRUE(orResult.get(i));
256 }
257 ASSERT_FALSE(orResult.get(31));
258}
259
260TEST(BitVectorTest, OperatorOrEqual) {
261 storm::storage::BitVector vector1(32);
262 storm::storage::BitVector vector2(32);
263
264 for (uint_fast64_t i = 0; i < 32; ++i) {
265 vector1.set(i, i % 2 == 0);
266 vector2.set(i, i % 2 == 1);
267 }
268 vector1.set(31, false);
269 vector2.set(31, false);
270
271 vector1 |= vector2;
272
273 for (uint_fast64_t i = 0; i < 31; ++i) {
274 ASSERT_TRUE(vector1.get(i));
275 }
276 ASSERT_FALSE(vector1.get(31));
277}
278
279TEST(BitVectorTest, OperatorXor) {
280 storm::storage::BitVector vector1(32);
281 storm::storage::BitVector vector2(32);
282
283 for (uint_fast64_t i = 0; i < 32; ++i) {
284 vector1.set(i);
285 vector2.set(i, i % 2 == 1);
286 }
287
288 storm::storage::BitVector vector3 = vector1 ^ vector2;
289 storm::storage::BitVector vector4 = ~vector2;
290 storm::storage::BitVector vector5 = vector1 ^ vector1;
291
292 for (uint_fast64_t i = 0; i < 32; ++i) {
293 ASSERT_EQ(vector3.get(i), vector4.get(i));
294 ASSERT_FALSE(vector5.get(i));
295 }
296}
297
298TEST(BitVectorTest, OperatorModulo) {
299 storm::storage::BitVector vector1(32);
300 storm::storage::BitVector vector2(32);
301
302 for (uint_fast64_t i = 0; i < 15; ++i) {
303 vector2.set(i, i % 2 == 0);
304 }
305
306 vector1.set(2);
307 vector1.set(5);
308 vector1.set(6);
309
310 storm::storage::BitVector moduloResult = vector1 % vector2;
311
312 ASSERT_EQ(8ul, moduloResult.size());
313 ASSERT_EQ(2ul, moduloResult.getNumberOfSetBits());
314
315 for (uint_fast64_t i = 0; i < 8; ++i) {
316 if (i == 1 || i == 3) {
317 ASSERT_TRUE(moduloResult.get(i));
318 } else {
319 ASSERT_FALSE(moduloResult.get(i));
320 }
321 }
322}
323
324TEST(BitVectorTest, OperatorNot) {
325 storm::storage::BitVector vector1(32);
326 storm::storage::BitVector vector2(32);
327
328 for (uint_fast64_t i = 0; i < 32; ++i) {
329 vector1.set(i, i % 2 == 0);
330 vector2.set(i, i % 2 == 1);
331 }
332
333 storm::storage::BitVector notResult = ~vector2;
334
335 for (uint_fast64_t i = 0; i < 32; ++i) {
336 ASSERT_EQ(vector1.get(i), notResult.get(i));
337 }
338}
339
340TEST(BitVectorTest, Complement) {
341 storm::storage::BitVector vector1(32);
342 storm::storage::BitVector vector2(32);
343
344 for (uint_fast64_t i = 0; i < 32; ++i) {
345 vector1.set(i, i % 2 == 0);
346 vector2.set(i, i % 2 == 1);
347 }
348
349 vector2.complement();
350
351 for (uint_fast64_t i = 0; i < 32; ++i) {
352 ASSERT_EQ(vector1.get(i), vector2.get(i));
353 }
354}
355
356TEST(BitVectorTest, Increment) {
357 storm::storage::BitVector vector1(130, false);
358 storm::storage::BitVector vector2(130, false);
359
360 vector1.increment();
361 EXPECT_EQ(1ull, vector1.getNumberOfSetBits());
362 vector2.set(0, true);
363 EXPECT_EQ(vector1, vector2);
364
365 vector1.increment();
366 EXPECT_EQ(1ull, vector1.getNumberOfSetBits());
367 vector2.clear();
368 vector2.set(1, true);
369 EXPECT_EQ(vector1, vector2);
370
371 vector1.increment();
372 EXPECT_EQ(2ull, vector1.getNumberOfSetBits());
373 vector2.set(0, true);
374 EXPECT_EQ(vector1, vector2);
375
376 vector1.clear();
377 for (uint_fast64_t i = 0; i < 66; ++i) {
378 vector1.set(i, true);
379 }
380 vector1.increment();
381 EXPECT_EQ(1ull, vector1.getNumberOfSetBits());
382 vector2.clear();
383 vector2.set(66, true);
384 EXPECT_EQ(vector1, vector2);
385
386 vector1.increment();
387 EXPECT_EQ(2ull, vector1.getNumberOfSetBits());
388 vector2.set(0, true);
389 EXPECT_EQ(vector1, vector2);
390
391 vector1.clear();
392 vector1.complement();
393 EXPECT_TRUE(vector1.full());
394 vector1.increment();
395 EXPECT_TRUE(vector1.empty());
396}
397
398TEST(BitVectorTest, permute) {
399 storm::storage::BitVector vector1(9, {3, 5});
400 std::vector<uint64_t> inversePermutation = {0, 1, 3, 2, 4, 6, 5, 8, 7};
401 storm::storage::BitVector vector2 = vector1.permute(inversePermutation);
402 EXPECT_EQ(vector1.getNumberOfSetBits(), vector2.getNumberOfSetBits());
403 EXPECT_TRUE(vector2.get(2));
404 EXPECT_TRUE(vector2.get(6));
405}
406
407TEST(BitVectorTest, permuteGrouped) {
408 storm::storage::BitVector vector1(6, {0, 2, 5});
409 std::vector<uint64_t> inversePermutation = {1, 0, 2};
410 std::vector<uint64_t> groupIndices = {0, 3, 5, 6};
411 storm::storage::BitVector permuted = vector1.permuteGroupedVector(inversePermutation, groupIndices);
412 storm::storage::BitVector expected(6, {2, 4, 5});
413 EXPECT_EQ(expected, permuted);
414}
415
416TEST(BitVectorTest, Implies) {
417 storm::storage::BitVector vector1(32);
418 storm::storage::BitVector vector2(32, true);
419
420 for (uint_fast64_t i = 0; i < 32; ++i) {
421 vector1.set(i, i % 2 == 0);
422 }
423 vector2.set(31, false);
424 vector2.set(30, false);
425
426 storm::storage::BitVector impliesResult = vector1.implies(vector2);
427
428 for (uint_fast64_t i = 0; i < 30; ++i) {
429 ASSERT_TRUE(impliesResult.get(i));
430 }
431 ASSERT_FALSE(impliesResult.get(30));
432 ASSERT_TRUE(impliesResult.get(31));
433}
434
435TEST(BitVectorTest, Subset) {
436 storm::storage::BitVector vector1(32);
437 storm::storage::BitVector vector2(32, true);
438
439 for (uint_fast64_t i = 0; i < 32; ++i) {
440 vector1.set(i, i % 2 == 0);
441 }
442
443 ASSERT_TRUE(vector1.isSubsetOf(vector2));
444
445 vector2.set(16, false);
446
447 ASSERT_FALSE(vector1.isSubsetOf(vector2));
448}
449
450TEST(BitVectorTest, Disjoint) {
451 storm::storage::BitVector vector1(32);
452 storm::storage::BitVector vector2(32);
453
454 for (uint_fast64_t i = 0; i < 32; ++i) {
455 vector1.set(i, i % 2 == 0);
456 vector2.set(i, i % 2 == 1);
457 }
458
459 ASSERT_TRUE(vector1.isDisjointFrom(vector2));
460
461 vector2.set(16, true);
462
463 ASSERT_FALSE(vector1.isDisjointFrom(vector2));
464}
465
466TEST(BitVectorTest, Empty) {
467 storm::storage::BitVector vector(32);
468
469 ASSERT_TRUE(vector.empty());
470
471 vector.set(17, true);
472
473 ASSERT_FALSE(vector.empty());
474
475 vector.set(17, false);
476 vector.set(18, false);
477
478 ASSERT_TRUE(vector.empty());
479}
480
481TEST(BitVectorTest, Full) {
482 storm::storage::BitVector vector(32, true);
483
484 ASSERT_TRUE(vector.full());
485
486 vector.set(17, false);
487
488 ASSERT_FALSE(vector.full());
489
490 vector.set(17, true);
491 vector.set(18, true);
492
493 ASSERT_TRUE(vector.full());
494}
495
496TEST(BitVectorTest, NumberOfSetBits) {
497 storm::storage::BitVector vector(32);
498
499 for (uint_fast64_t i = 0; i < 32; ++i) {
500 vector.set(i, i % 2 == 0);
501 }
502
503 ASSERT_EQ(16ul, vector.getNumberOfSetBits());
504}
505
506TEST(BitVectorTest, NumberOfSetBitsBeforeIndex) {
507 storm::storage::BitVector vector(32);
508
509 for (uint_fast64_t i = 0; i < 32; ++i) {
510 vector.set(i, i % 2 == 0);
511 }
512
513 ASSERT_EQ(7ul, vector.getNumberOfSetBitsBeforeIndex(14));
514}
515
516TEST(BitVectorTest, BeginEnd) {
517 storm::storage::BitVector vector(32);
518
519 ASSERT_TRUE(vector.begin() == vector.end());
520
521 vector.set(17);
522
523 ASSERT_FALSE(vector.begin() == vector.end());
524
525 vector.set(17, false);
526
527 ASSERT_TRUE(vector.begin() == vector.end());
528}
529
530TEST(BitVectorTest, NextSetIndex) {
531 storm::storage::BitVector vector(32);
532
533 vector.set(14);
534 vector.set(17);
535
536 ASSERT_EQ(14ul, vector.getNextSetIndex(14));
537 ASSERT_EQ(17ul, vector.getNextSetIndex(15));
538 ASSERT_EQ(17ul, vector.getNextSetIndex(16));
539 ASSERT_EQ(17ul, vector.getNextSetIndex(17));
540 ASSERT_EQ(vector.size(), vector.getNextSetIndex(18));
541}
542
543TEST(BitVectorTest, NextUnsetIndex) {
544 storm::storage::BitVector vector(32);
545
546 vector.set(14);
547 vector.set(17);
548
549 vector.complement();
550
551 ASSERT_EQ(14ul, vector.getNextUnsetIndex(14));
552 ASSERT_EQ(17ul, vector.getNextUnsetIndex(15));
553 ASSERT_EQ(17ul, vector.getNextUnsetIndex(16));
554 ASSERT_EQ(17ul, vector.getNextUnsetIndex(17));
555 ASSERT_EQ(vector.size(), vector.getNextUnsetIndex(18));
556}
557
558TEST(BitVectorTest, SequenceBefore) {
559 storm::storage::BitVector vector(65);
560
561 vector.set(14);
562 vector.set(17);
563 vector.set(64);
564
565 auto vector_compl = ~vector;
566
567 for (uint64_t i = 0; i <= 65; ++i) {
568 uint64_t expected;
569 if (i <= 14) {
570 expected = 0ul;
571 } else if (i <= 17) {
572 expected = 15ul;
573 } else if (i <= 64) {
574 expected = 18ul;
575 } else {
576 expected = 65ul;
577 }
578 ASSERT_EQ(expected, vector.getStartOfZeroSequenceBefore(i)) << " input index is i=" << i;
579 ASSERT_EQ(expected, vector_compl.getStartOfOneSequenceBefore(i)) << " input index is i=" << i;
580 }
581}
582
583TEST(BitVectorTest, Iterator) {
584 storm::storage::BitVector vector(32);
585
586 for (uint64_t i = 0; i < 32; ++i) {
587 vector.set(i, i % 2 == 0);
588 }
589
590 uint64_t i = 0;
591 for (auto bit : vector) {
592 ASSERT_EQ(i, bit);
593 i += 2;
594 }
595 ASSERT_EQ(i, 32ull);
596}
597
598TEST(BitVectorTest, ReverseIterator) {
599 storm::storage::BitVector vector(547490);
600
601 uint64_t i = 2;
602 for (; i < vector.size(); i += 3) {
603 vector.set(i, true);
604 }
605
606 for (auto bitIt = vector.rbegin(); bitIt != vector.rend(); ++bitIt) {
607 i -= 3;
608 ASSERT_EQ(i, *bitIt);
609 }
610 ASSERT_EQ(i, 2ull);
611}
612
613TEST(BitVectorTest, CompareAndSwap) {
614 storm::storage::BitVector vector(140);
615 vector.setFromInt(0, 64, 2377830234574424100);
616 vector.setFromInt(64, 64, 1152921504607379586);
617 vector.setFromInt(128, 12, 2080);
618
619 bool result = vector.compareAndSwap(0, 68, 68);
620 ASSERT_FALSE(result);
621
622 result = vector.compareAndSwap(68, 0, 68);
623 ASSERT_TRUE(result);
624}
625
626TEST(BitVectorTest, Concat) {
627 storm::storage::BitVector vector1(64, {3, 5});
628 storm::storage::BitVector vector2(65, {10, 12});
629
630 vector1.concat(vector2);
631 ASSERT_EQ(129ul, vector1.size());
632 ASSERT_TRUE(vector1.get(3));
633 ASSERT_TRUE(vector1.get(5));
634 ASSERT_TRUE(vector1.get(10 + 64));
635 ASSERT_TRUE(vector1.get(12 + 64));
636 ASSERT_EQ(4ul, vector1.getNumberOfSetBits());
637}
638
639TEST(BitVectorTest, Expand) {
640 storm::storage::BitVector vector1(64, {3, 5});
641 vector1.expandSize();
642 ASSERT_EQ(64ul, vector1.size());
643 ASSERT_EQ(2ul, vector1.getNumberOfSetBits());
644 storm::storage::BitVector vector2(65, {10, 12});
645 vector2.expandSize();
646 ASSERT_EQ(128ul, vector2.size());
647 ASSERT_EQ(2ul, vector2.getNumberOfSetBits());
648}
649
650TEST(BitVectorTest, Assignment) {
651 storm::storage::BitVector v1(10), v2(100000);
652 v1 = v2;
653 v1.set(9999);
654 ASSERT_TRUE(v1.get(9999));
655}
TEST(BitVectorTest, InitToZero)
PositionIteratorType Iterator
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:18
void complement()
Negates all bits in the bit vector.
bool compareAndSwap(uint_fast64_t start1, uint_fast64_t start2, uint_fast64_t length)
Compare two intervals [start1, start1+length] and [start2, start2+length] and swap them if the second...
const_reverse_iterator rbegin() const
Returns a reverse iterator to the indices of the set bits in the bit vector.
bool isDisjointFrom(BitVector const &other) const
Checks whether none of the bits that are set in the current bit vector are also set in the given bit ...
bool full() const
Retrieves whether all bits are set in this bit vector.
const_reverse_iterator rend() const
Returns a reverse iterator pointing at the element past the front of the bit vector.
const_iterator end() const
Returns an iterator pointing at the element past the back of the bit vector.
uint_fast64_t getNextSetIndex(uint_fast64_t startingIndex) const
Retrieves the index of the bit that is the next bit set to true in the bit vector.
void setFromInt(uint_fast64_t bitIndex, uint_fast64_t numberOfBits, uint64_t value)
Sets the selected number of lowermost bits of the provided value at the given bit index.
bool empty() const
Retrieves whether no bits are set to true in this bit vector.
void clear()
Removes all set bits from the bit vector.
bool isSubsetOf(BitVector const &other) const
Checks whether all bits that are set in the current bit vector are also set in the given bit vector.
BitVector implies(BitVector const &other) const
Performs a logical "implies" with the given bit vector.
void resize(uint_fast64_t newLength, bool init=false)
Resizes the bit vector to hold the given new number of bits.
BitVector permute(std::vector< uint64_t > const &inversePermutation) const
Apply a permutation of entries.
void increment()
Increments the (unsigned) number represented by this BitVector by one.
const_iterator begin() const
Returns an iterator to the indices of the set bits in the bit vector.
uint64_t getStartOfZeroSequenceBefore(uint64_t endIndex) const
Retrieves the smallest index i such that all bits in the range [i,endIndex) are 0.
void set(uint_fast64_t index, bool value=true)
Sets the given truth value at the given index.
size_t size() const
Retrieves the number of bits this bit vector can store.
uint_fast64_t getNextUnsetIndex(uint_fast64_t startingIndex) const
Retrieves the index of the bit that is the next bit set to false in the bit vector.
uint_fast64_t getNumberOfSetBits() const
Returns the number of bits that are set to true in this bit vector.
uint_fast64_t getAsInt(uint_fast64_t bitIndex, uint_fast64_t numberOfBits) const
Retrieves the content of the current bit vector at the given index for the given number of bits as an...
void expandSize(bool init=false)
bool get(uint_fast64_t index) const
Retrieves the truth value of the bit at the given index and performs a bound check.
BitVector permuteGroupedVector(std::vector< uint64_t > const &inversePermutation, std::vector< uint64_t > const &rowGroupIndices) const
Apply a permutation of entries assuming a grouped vector.
uint_fast64_t getNumberOfSetBitsBeforeIndex(uint_fast64_t index) const
Retrieves the number of bits set in this bit vector with an index strictly smaller than the given one...
void concat(BitVector const &extension)
Concatenate this bitvector with another bitvector.