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