4 use std::hint::black_box;
10 let idx_buf = BitSet::new_filled(i);
11 let elems: Vec<usize> = idx_buf.iter().collect();
12 let expected: Vec<usize> = (0..i).collect();
13 assert_eq!(elems, expected);
18 fn bitset_iter_works() {
19 let mut bitset: BitSet<usize> = BitSet::new_empty(100);
29 assert_eq!(bitset.iter().collect::<Vec<_>>(), [1, 10, 19, 62, 63, 64, 65, 66, 99]);
33 fn bitset_iter_works_2() {
34 let mut bitset: BitSet<usize> = BitSet::new_empty(320);
40 assert_eq!(bitset.iter().collect::<Vec<_>>(), [0, 127, 191, 255, 319]);
45 let mut set1: BitSet<usize> = BitSet::new_empty(65);
46 let mut set2: BitSet<usize> = BitSet::new_empty(65);
47 assert!(set1.insert(3));
48 assert!(!set1.insert(3));
49 assert!(set2.insert(5));
50 assert!(set2.insert(64));
51 assert!(set1.union(&set2));
52 assert!(!set1.union(&set2));
53 assert!(set1.contains(3));
54 assert!(!set1.contains(4));
55 assert!(set1.contains(5));
56 assert!(!set1.contains(63));
57 assert!(set1.contains(64));
62 let mut sparse038: HybridBitSet<usize> = HybridBitSet::new_empty(256);
63 assert!(sparse038.is_empty());
64 assert!(sparse038.insert(0));
65 assert!(sparse038.insert(1));
66 assert!(sparse038.insert(8));
67 assert!(sparse038.insert(3));
68 assert!(!sparse038.insert(3));
69 assert!(sparse038.remove(1));
70 assert!(!sparse038.is_empty());
71 assert_eq!(sparse038.iter().collect::<Vec<_>>(), [0, 3, 8]);
74 if i == 0 || i == 3 || i == 8 {
75 assert!(sparse038.contains(i));
77 assert!(!sparse038.contains(i));
81 let mut sparse01358 = sparse038.clone();
82 assert!(sparse01358.insert(1));
83 assert!(sparse01358.insert(5));
84 assert_eq!(sparse01358.iter().collect::<Vec<_>>(), [0, 1, 3, 5, 8]);
86 let mut dense10 = HybridBitSet::new_empty(256);
88 assert!(dense10.insert(i));
90 assert!(!dense10.is_empty());
91 assert_eq!(dense10.iter().collect::<Vec<_>>(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
93 let mut dense256 = HybridBitSet::new_empty(256);
94 assert!(dense256.is_empty());
95 dense256.insert_all();
96 assert!(!dense256.is_empty());
98 assert!(dense256.contains(i));
101 assert!(sparse038.superset(&sparse038)); // sparse + sparse (self)
102 assert!(sparse01358.superset(&sparse038)); // sparse + sparse
103 assert!(dense10.superset(&sparse038)); // dense + sparse
104 assert!(dense10.superset(&dense10)); // dense + dense (self)
105 assert!(dense256.superset(&dense10)); // dense + dense
107 let mut hybrid = sparse038.clone();
108 assert!(!sparse01358.union(&hybrid)); // no change
109 assert!(hybrid.union(&sparse01358));
110 assert!(hybrid.superset(&sparse01358) && sparse01358.superset(&hybrid));
111 assert!(!dense256.union(&dense10));
113 // dense / sparse where dense superset sparse
114 assert!(!dense10.clone().union(&sparse01358));
115 assert!(sparse01358.clone().union(&dense10));
116 assert!(dense10.clone().intersect(&sparse01358));
117 assert!(!sparse01358.clone().intersect(&dense10));
118 assert!(dense10.clone().subtract(&sparse01358));
119 assert!(sparse01358.clone().subtract(&dense10));
121 // dense / sparse where sparse superset dense
122 let dense038 = sparse038.to_dense();
123 assert!(!sparse01358.clone().union(&dense038));
124 assert!(dense038.clone().union(&sparse01358));
125 assert!(sparse01358.clone().intersect(&dense038));
126 assert!(!dense038.clone().intersect(&sparse01358));
127 assert!(sparse01358.clone().subtract(&dense038));
128 assert!(dense038.clone().subtract(&sparse01358));
130 let mut dense = dense10.clone();
131 assert!(dense.union(&dense256));
132 assert!(dense.superset(&dense256) && dense256.superset(&dense));
133 assert!(hybrid.union(&dense256));
134 assert!(hybrid.superset(&dense256) && dense256.superset(&hybrid));
136 assert!(!dense10.clone().intersect(&dense256));
137 assert!(dense256.clone().intersect(&dense10));
138 assert!(dense10.clone().subtract(&dense256));
139 assert!(dense256.clone().subtract(&dense10));
141 assert_eq!(dense256.iter().count(), 256);
142 let mut dense0 = dense256;
144 assert!(dense0.remove(i));
146 assert!(!dense0.remove(0));
147 assert!(dense0.is_empty());
151 fn chunked_bitset() {
152 let mut b0 = ChunkedBitSet::<usize>::new_empty(0);
153 let b0b = b0.clone();
154 assert_eq!(b0, ChunkedBitSet { domain_size: 0, chunks: Box::new([]), marker: PhantomData });
156 // There are no valid insert/remove/contains operations on a 0-domain
157 // bitset, but we can test `union`.
159 assert!(!b0.union(&b0b));
160 assert_eq!(b0.chunks(), vec![]);
161 assert_eq!(b0.count(), 0);
164 //-----------------------------------------------------------------------
166 let mut b1 = ChunkedBitSet::<usize>::new_empty(1);
169 ChunkedBitSet { domain_size: 1, chunks: Box::new([Zeros(1)]), marker: PhantomData }
173 assert!(!b1.contains(0));
174 assert_eq!(b1.count(), 0);
175 assert!(b1.insert(0));
176 assert!(b1.contains(0));
177 assert_eq!(b1.count(), 1);
178 assert_eq!(b1.chunks(), [Ones(1)]);
179 assert!(!b1.insert(0));
180 assert!(b1.remove(0));
181 assert!(!b1.contains(0));
182 assert_eq!(b1.count(), 0);
183 assert_eq!(b1.chunks(), [Zeros(1)]);
186 //-----------------------------------------------------------------------
188 let mut b100 = ChunkedBitSet::<usize>::new_filled(100);
191 ChunkedBitSet { domain_size: 100, chunks: Box::new([Ones(100)]), marker: PhantomData }
196 assert!(b100.contains(i));
198 assert_eq!(b100.count(), 100);
199 assert!(b100.remove(3));
200 assert!(b100.insert(3));
201 assert_eq!(b100.chunks(), vec![Ones(100)]);
203 b100.remove(20) && b100.remove(30) && b100.remove(40) && b100.remove(99) && b100.insert(30)
205 assert_eq!(b100.count(), 97);
206 assert!(!b100.contains(20) && b100.contains(30) && !b100.contains(99) && b100.contains(50));
214 0b11111111_11111111_11111110_11111111_11111111_11101111_11111111_11111111,
215 0b00000000_00000000_00000000_00000111_11111111_11111111_11111111_11111111,
216 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
222 let mut num_removed = 0;
228 assert_eq!(num_removed, 97);
229 assert_eq!(b100.chunks(), vec![Zeros(100)]);
232 //-----------------------------------------------------------------------
234 let mut b2548 = ChunkedBitSet::<usize>::new_empty(2548);
239 chunks: Box::new([Zeros(2048), Zeros(500)]),
244 b2548.assert_valid();
247 assert_eq!(b2548.chunks(), vec![Zeros(2048), Zeros(500)]);
250 assert!(b2548.contains(i));
252 assert_eq!(b2548.count(), 2548);
253 assert_eq!(b2548.chunks(), vec![Ones(2048), Ones(500)]);
254 b2548.assert_valid();
256 //-----------------------------------------------------------------------
258 let mut b4096 = ChunkedBitSet::<usize>::new_empty(4096);
263 chunks: Box::new([Zeros(2048), Zeros(2048)]),
268 b4096.assert_valid();
270 assert!(!b4096.contains(i));
272 assert!(b4096.insert(0) && b4096.insert(4095) && !b4096.insert(4095));
274 b4096.contains(0) && !b4096.contains(2047) && !b4096.contains(2048) && b4096.contains(4095)
280 Mixed(2048, 1, Rc::new([
281 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
282 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
284 Mixed(2048, 1, Rc::new([
285 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
286 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x8000_0000_0000_0000
290 assert_eq!(b4096.count(), 2);
291 b4096.assert_valid();
293 //-----------------------------------------------------------------------
295 let mut b10000 = ChunkedBitSet::<usize>::new_empty(10000);
300 chunks: Box::new([Zeros(2048), Zeros(2048), Zeros(2048), Zeros(2048), Zeros(1808),]),
305 b10000.assert_valid();
306 assert!(b10000.insert(3000) && b10000.insert(5000));
312 Mixed(2048, 1, Rc::new([
313 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0100_0000_0000_0000, 0,
314 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
316 Mixed(2048, 1, Rc::new([
317 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0100, 0,
318 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
324 let mut b10000b = ChunkedBitSet::<usize>::new_empty(10000);
325 b10000b.clone_from(&b10000);
326 assert_eq!(b10000, b10000b);
327 for i in 6000..7000 {
330 assert_eq!(b10000b.count(), 1002);
331 b10000b.assert_valid();
332 b10000b.clone_from(&b10000);
333 assert_eq!(b10000b.count(), 2);
334 for i in 2000..8000 {
337 b10000.union(&b10000b);
338 assert_eq!(b10000.count(), 6000);
339 b10000.union(&b10000b);
340 assert_eq!(b10000.count(), 6000);
341 b10000.assert_valid();
342 b10000b.assert_valid();
345 fn with_elements_chunked(elements: &[usize], domain_size: usize) -> ChunkedBitSet<usize> {
346 let mut s = ChunkedBitSet::new_empty(domain_size);
348 assert!(s.insert(e));
353 fn with_elements_standard(elements: &[usize], domain_size: usize) -> BitSet<usize> {
354 let mut s = BitSet::new_empty(domain_size);
356 assert!(s.insert(e));
362 fn chunked_bitset_into_bitset_operations() {
363 let a = vec![1, 5, 7, 11, 15, 2000, 3000];
364 let b = vec![3, 4, 11, 3000, 4000];
365 let aub = vec![1, 3, 4, 5, 7, 11, 15, 2000, 3000, 4000];
366 let aib = vec![11, 3000];
368 let b = with_elements_chunked(&b, 9876);
370 let mut union = with_elements_standard(&a, 9876);
371 assert!(union.union(&b));
372 assert!(!union.union(&b));
373 assert!(union.iter().eq(aub.iter().copied()));
375 let mut intersection = with_elements_standard(&a, 9876);
376 assert!(intersection.intersect(&b));
377 assert!(!intersection.intersect(&b));
378 assert!(intersection.iter().eq(aib.iter().copied()));
382 fn chunked_bitset_iter() {
383 fn check_iter(bit: &ChunkedBitSet<usize>, vec: &Vec<usize>) {
384 // Test collecting via both `.next()` and `.fold()` calls, to make sure both are correct
385 let mut collect_next = Vec::new();
386 let mut bit_iter = bit.iter();
387 while let Some(item) = bit_iter.next() {
388 collect_next.push(item);
390 assert_eq!(vec, &collect_next);
392 let collect_fold = bit.iter().fold(Vec::new(), |mut v, item| {
396 assert_eq!(vec, &collect_fold);
400 let vec: Vec<usize> = Vec::new();
401 let bit = with_elements_chunked(&vec, 9000);
402 check_iter(&bit, &vec);
406 let vec: Vec<usize> = (0..n).collect();
407 let bit = with_elements_chunked(&vec, n);
408 check_iter(&bit, &vec);
410 // Filled with trailing zeros
412 let vec: Vec<usize> = (0..n).collect();
413 let bit = with_elements_chunked(&vec, 2 * n);
414 check_iter(&bit, &vec);
418 let vec: Vec<usize> = vec![0, 1, 2, 2010, 2047, 2099, 6000, 6002, 6004];
419 let bit = with_elements_chunked(&vec, n);
420 check_iter(&bit, &vec);
425 let mut set: GrowableBitSet<usize> = GrowableBitSet::with_capacity(65);
427 assert!(set.insert(index));
428 assert!(!set.insert(index));
432 // Check if the bits set before growing are still set
434 assert!(set.contains(index));
437 // Check if the new bits are all un-set
438 for index in 65..128 {
439 assert!(!set.contains(index));
442 // Check that we can set all new bits without running out of bounds
443 for index in 65..128 {
444 assert!(set.insert(index));
445 assert!(!set.insert(index));
450 fn matrix_intersection() {
451 let mut matrix: BitMatrix<usize, usize> = BitMatrix::new(200, 200);
453 // (*) Elements reachable from both 2 and 65.
457 matrix.insert(2, 10); // (*)
458 matrix.insert(2, 64); // (*)
459 matrix.insert(2, 65);
460 matrix.insert(2, 130);
461 matrix.insert(2, 160); // (*)
463 matrix.insert(64, 133);
465 matrix.insert(65, 2);
466 matrix.insert(65, 8);
467 matrix.insert(65, 10); // (*)
468 matrix.insert(65, 64); // (*)
469 matrix.insert(65, 68);
470 matrix.insert(65, 133);
471 matrix.insert(65, 160); // (*)
473 let intersection = matrix.intersect_rows(2, 64);
474 assert!(intersection.is_empty());
476 let intersection = matrix.intersect_rows(2, 65);
477 assert_eq!(intersection, &[10, 64, 160]);
482 let mut matrix: BitMatrix<usize, usize> = BitMatrix::new(64, 100);
483 matrix.insert(3, 22);
484 matrix.insert(3, 75);
485 matrix.insert(2, 99);
487 matrix.union_rows(3, 5);
488 matrix.insert_all_into_row(6);
491 let mut iter = expected.iter();
492 for i in matrix.iter(2) {
493 let j = *iter.next().unwrap();
496 assert!(iter.next().is_none());
498 let expected = [22, 75];
499 let mut iter = expected.iter();
500 assert_eq!(matrix.count(3), expected.len());
501 for i in matrix.iter(3) {
502 let j = *iter.next().unwrap();
505 assert!(iter.next().is_none());
508 let mut iter = expected.iter();
509 assert_eq!(matrix.count(4), expected.len());
510 for i in matrix.iter(4) {
511 let j = *iter.next().unwrap();
514 assert!(iter.next().is_none());
516 let expected = [22, 75];
517 let mut iter = expected.iter();
518 assert_eq!(matrix.count(5), expected.len());
519 for i in matrix.iter(5) {
520 let j = *iter.next().unwrap();
523 assert!(iter.next().is_none());
525 assert_eq!(matrix.count(6), 100);
527 for (idx, i) in matrix.iter(6).enumerate() {
531 assert_eq!(count, 100);
533 if let Some(i) = matrix.iter(7).next() {
534 panic!("expected no elements in row, but contains element {:?}", i);
539 fn sparse_matrix_iter() {
540 let mut matrix: SparseBitMatrix<usize, usize> = SparseBitMatrix::new(100);
541 matrix.insert(3, 22);
542 matrix.insert(3, 75);
543 matrix.insert(2, 99);
545 matrix.union_rows(3, 5);
548 let mut iter = expected.iter();
549 for i in matrix.iter(2) {
550 let j = *iter.next().unwrap();
553 assert!(iter.next().is_none());
555 let expected = [22, 75];
556 let mut iter = expected.iter();
557 for i in matrix.iter(3) {
558 let j = *iter.next().unwrap();
561 assert!(iter.next().is_none());
564 let mut iter = expected.iter();
565 for i in matrix.iter(4) {
566 let j = *iter.next().unwrap();
569 assert!(iter.next().is_none());
571 let expected = [22, 75];
572 let mut iter = expected.iter();
573 for i in matrix.iter(5) {
574 let j = *iter.next().unwrap();
577 assert!(iter.next().is_none());
581 fn sparse_matrix_operations() {
582 let mut matrix: SparseBitMatrix<usize, usize> = SparseBitMatrix::new(100);
583 matrix.insert(3, 22);
584 matrix.insert(3, 75);
585 matrix.insert(2, 99);
588 let mut disjoint: HybridBitSet<usize> = HybridBitSet::new_empty(100);
591 let mut superset = HybridBitSet::new_empty(100);
596 let mut subset = HybridBitSet::new_empty(100);
599 // SparseBitMatrix::remove
601 let mut matrix = matrix.clone();
602 matrix.remove(3, 22);
603 assert!(!matrix.row(3).unwrap().contains(22));
605 assert!(matrix.row(0).is_none());
608 // SparseBitMatrix::clear
610 let mut matrix = matrix.clone();
612 assert!(!matrix.row(3).unwrap().contains(75));
614 assert!(matrix.row(0).is_none());
617 // SparseBitMatrix::intersect_row
619 let mut matrix = matrix.clone();
620 assert!(!matrix.intersect_row(3, &superset));
621 assert!(matrix.intersect_row(3, &subset));
622 matrix.intersect_row(0, &disjoint);
623 assert!(matrix.row(0).is_none());
626 // SparseBitMatrix::subtract_row
628 let mut matrix = matrix.clone();
629 assert!(!matrix.subtract_row(3, &disjoint));
630 assert!(matrix.subtract_row(3, &subset));
631 assert!(matrix.subtract_row(3, &superset));
632 matrix.intersect_row(0, &disjoint);
633 assert!(matrix.row(0).is_none());
636 // SparseBitMatrix::union_row
638 let mut matrix = matrix.clone();
639 assert!(!matrix.union_row(3, &subset));
640 assert!(matrix.union_row(3, &disjoint));
641 matrix.union_row(0, &disjoint);
642 assert!(matrix.row(0).is_some());
647 fn dense_insert_range() {
649 fn check<R>(domain: usize, range: R)
651 R: RangeBounds<usize> + Clone + IntoIterator<Item = usize> + std::fmt::Debug,
653 let mut set = BitSet::new_empty(domain);
654 set.insert_range(range.clone());
655 for i in set.iter() {
656 assert!(range.contains(&i));
658 for i in range.clone() {
659 assert!(set.contains(i), "{} in {:?}, inserted {:?}", i, set, range);
663 check(300, WORD_BITS..WORD_BITS * 2);
664 check(300, WORD_BITS - 1..WORD_BITS * 2);
665 check(300, WORD_BITS - 1..WORD_BITS);
670 check(300, 200..250);
673 check(300, WORD_BITS..=WORD_BITS * 2);
674 check(300, WORD_BITS - 1..=WORD_BITS * 2);
675 check(300, WORD_BITS - 1..=WORD_BITS);
676 check(300, 10..=100);
680 check(300, 200..=250);
682 for i in 0..WORD_BITS * 2 {
683 for j in i..WORD_BITS * 2 {
684 check(WORD_BITS * 2, i..j);
685 check(WORD_BITS * 2, i..=j);
693 fn dense_last_set_before() {
694 fn easy(set: &BitSet<usize>, needle: impl RangeBounds<usize>) -> Option<usize> {
695 let mut last_leq = None;
696 for e in set.iter() {
697 if needle.contains(&e) {
705 fn cmp(set: &BitSet<usize>, needle: impl RangeBounds<usize> + Clone + std::fmt::Debug) {
707 set.last_set_in(needle.clone()),
708 easy(set, needle.clone()),
714 let mut set = BitSet::new_empty(300);
716 set.insert(WORD_BITS);
717 cmp(&set, WORD_BITS..=WORD_BITS);
718 set.insert(WORD_BITS - 1);
719 cmp(&set, 0..=WORD_BITS - 1);
727 for i in 0..=WORD_BITS * 2 {
728 for j in i..=WORD_BITS * 2 {
729 for k in 0..WORD_BITS * 2 {
730 let mut set = BitSet::new_empty(300);
741 /// Merge dense hybrid set into empty sparse hybrid set.
743 fn union_hybrid_sparse_empty_to_dense(b: &mut Bencher) {
744 let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(256);
746 assert!(pre_dense.insert(i));
748 let pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(256);
750 let dense = pre_dense.clone();
751 let mut sparse = pre_sparse.clone();
752 sparse.union(&dense);
756 /// Merge dense hybrid set into full hybrid set with same indices.
758 fn union_hybrid_sparse_full_to_dense(b: &mut Bencher) {
759 let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(256);
761 assert!(pre_dense.insert(i));
763 let mut pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(256);
764 for i in 0..SPARSE_MAX {
765 assert!(pre_sparse.insert(i));
768 let dense = pre_dense.clone();
769 let mut sparse = pre_sparse.clone();
770 sparse.union(&dense);
774 /// Merge dense hybrid set into full hybrid set with indices over the whole domain.
776 fn union_hybrid_sparse_domain_to_dense(b: &mut Bencher) {
777 let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX * 64);
779 assert!(pre_dense.insert(i));
781 let mut pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX * 64);
782 for i in 0..SPARSE_MAX {
783 assert!(pre_sparse.insert(i * 64));
786 let dense = pre_dense.clone();
787 let mut sparse = pre_sparse.clone();
788 sparse.union(&dense);
792 /// Merge dense hybrid set into empty hybrid set where the domain is very small.
794 fn union_hybrid_sparse_empty_small_domain(b: &mut Bencher) {
795 let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX);
796 for i in 0..SPARSE_MAX {
797 assert!(pre_dense.insert(i));
799 let pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX);
801 let dense = pre_dense.clone();
802 let mut sparse = pre_sparse.clone();
803 sparse.union(&dense);
807 /// Merge dense hybrid set into full hybrid set where the domain is very small.
809 fn union_hybrid_sparse_full_small_domain(b: &mut Bencher) {
810 let mut pre_dense: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX);
811 for i in 0..SPARSE_MAX {
812 assert!(pre_dense.insert(i));
814 let mut pre_sparse: HybridBitSet<usize> = HybridBitSet::new_empty(SPARSE_MAX);
815 for i in 0..SPARSE_MAX {
816 assert!(pre_sparse.insert(i));
819 let dense = pre_dense.clone();
820 let mut sparse = pre_sparse.clone();
821 sparse.union(&dense);
826 fn bench_insert(b: &mut Bencher) {
827 let mut bs = BitSet::new_filled(99999usize);
829 black_box(bs.insert(black_box(100u32)));
834 fn bench_remove(b: &mut Bencher) {
835 let mut bs = BitSet::new_filled(99999usize);
837 black_box(bs.remove(black_box(100u32)));
842 fn bench_iter(b: &mut Bencher) {
843 let bs = BitSet::new_filled(99999usize);
845 bs.iter().map(|b: usize| black_box(b)).for_each(drop);
850 fn bench_intersect(b: &mut Bencher) {
851 let mut ba: BitSet<u32> = BitSet::new_filled(99999usize);
852 let bb = BitSet::new_filled(99999usize);
854 ba.intersect(black_box(&bb));