1use std::{fmt, ops::Deref, sync::Arc};
5
6use serde::{Deserialize, Deserializer, Serialize, Serializer};
7
8use crate::storage::DataBitVec;
9
10#[derive(Clone, Debug, PartialEq)]
11pub struct BitVec {
12 inner: Arc<BitVecInner>,
13}
14
15impl Default for BitVec {
16 fn default() -> Self {
17 Self {
18 inner: Arc::new(BitVecInner {
19 bits: vec![],
20 len: 0,
21 }),
22 }
23 }
24}
25
26impl From<&BitVec> for BitVec {
27 fn from(value: &BitVec) -> Self {
28 value.clone()
29 }
30}
31
32impl From<Vec<bool>> for BitVec {
33 fn from(value: Vec<bool>) -> Self {
34 BitVec::from_slice(&value)
35 }
36}
37
38impl<const N: usize> From<[bool; N]> for BitVec {
39 fn from(value: [bool; N]) -> Self {
40 BitVec::from_slice(&value)
41 }
42}
43
44#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
45pub struct BitVecInner {
46 bits: Vec<u8>,
47 len: usize,
48}
49
50pub struct BitVecIter {
51 inner: Arc<BitVecInner>,
52 pos: usize,
53}
54
55impl Iterator for BitVecIter {
56 type Item = bool;
57
58 fn next(&mut self) -> Option<Self::Item> {
59 if self.pos >= self.inner.len {
60 return None;
61 }
62
63 let byte = self.inner.bits[self.pos / 8];
64 let bit = (byte >> (self.pos % 8)) & 1;
65 self.pos += 1;
66 Some(bit != 0)
67 }
68}
69
70impl BitVec {
71 pub fn repeat(len: usize, value: bool) -> Self {
72 if value {
73 BitVec::from_fn(len, |_| true)
74 } else {
75 let byte_count = len.div_ceil(8);
76 BitVec {
77 inner: Arc::new(BitVecInner {
78 bits: vec![0x00; byte_count],
79 len,
80 }),
81 }
82 }
83 }
84
85 pub fn from_slice(slice: &[bool]) -> Self {
86 let mut bv = BitVec::repeat(slice.len(), false);
87 for (i, &val) in slice.iter().enumerate() {
88 if val {
89 bv.set(i, true);
90 }
91 }
92 bv
93 }
94
95 pub fn empty() -> Self {
96 Self {
97 inner: Arc::new(BitVecInner {
98 bits: Vec::new(),
99 len: 0,
100 }),
101 }
102 }
103
104 pub fn from_fn(len: usize, mut f: impl FnMut(usize) -> bool) -> Self {
105 let mut bv = BitVec::repeat(len, false);
106 for i in 0..len {
107 if f(i) {
108 bv.set(i, true);
109 }
110 }
111 bv
112 }
113
114 pub fn take(&self, n: usize) -> BitVec {
115 let len = n.min(self.inner.len);
116
117 let byte_len = len.div_ceil(8);
118 let mut bits = vec![0u8; byte_len];
119
120 for i in 0..len {
121 let orig_byte = self.inner.bits[i / 8];
122 let bit = (orig_byte >> (i % 8)) & 1;
123 if bit != 0 {
124 bits[i / 8] |= 1 << (i % 8);
125 }
126 }
127
128 BitVec {
129 inner: Arc::new(BitVecInner {
130 bits,
131 len,
132 }),
133 }
134 }
135
136 fn make_mut(&mut self) -> &mut BitVecInner {
137 Arc::make_mut(&mut self.inner)
138 }
139
140 pub fn extend(&mut self, other: &BitVec) {
141 let start_len = self.len();
142 let other_len = other.len();
143 let total_len = start_len + other_len;
144 let total_byte_len = total_len.div_ceil(8);
145
146 let inner = self.make_mut();
147 inner.bits.resize(total_byte_len, 0);
148
149 for i in 0..other_len {
150 let bit = other.get(i);
151 if bit {
152 let idx = start_len + i;
153 let byte = &mut inner.bits[idx / 8];
154 let bit_pos = idx % 8;
155 *byte |= 1 << bit_pos;
156 }
157 }
158
159 inner.len = total_len;
160 }
161
162 pub fn clear(&mut self) {
164 let inner = self.make_mut();
165 inner.bits.clear();
166 inner.len = 0;
167 }
168
169 pub fn push(&mut self, bit: bool) {
170 let inner = self.make_mut();
171 let byte_index = inner.len / 8;
172 let bit_index = inner.len % 8;
173
174 if byte_index >= inner.bits.len() {
175 inner.bits.push(0);
176 }
177
178 if bit {
179 inner.bits[byte_index] |= 1 << bit_index;
180 }
181
182 inner.len += 1;
183 }
184
185 pub fn len(&self) -> usize {
186 self.inner.len
187 }
188
189 pub fn is_empty(&self) -> bool {
190 self.len() == 0
191 }
192
193 pub fn capacity(&self) -> usize {
194 self.inner.bits.capacity() * 8
195 }
196
197 pub fn get(&self, idx: usize) -> bool {
198 assert!(idx < self.inner.len);
199 let byte = self.inner.bits[idx / 8];
200 let bit = idx % 8;
201 (byte >> bit) & 1 != 0
202 }
203
204 pub fn set(&mut self, idx: usize, value: bool) {
205 assert!(idx < self.inner.len);
206 let inner = self.make_mut();
207 let byte = &mut inner.bits[idx / 8];
208 let bit = idx % 8;
209 if value {
210 *byte |= 1 << bit;
211 } else {
212 *byte &= !(1 << bit);
213 }
214 }
215
216 pub fn iter(&self) -> BitVecIter {
217 BitVecIter {
218 inner: self.inner.clone(),
219 pos: 0,
220 }
221 }
222
223 pub fn and(&self, other: &Self) -> Self {
224 assert_eq!(self.len(), other.len());
225 let len = self.len();
226 let byte_count = len.div_ceil(8);
227 let mut result_bits = vec![0u8; byte_count];
228
229 let chunks = byte_count / 8;
231 let mut i = 0;
232
233 for _ in 0..chunks {
235 let a = u64::from_le_bytes([
236 self.inner.bits[i],
237 self.inner.bits[i + 1],
238 self.inner.bits[i + 2],
239 self.inner.bits[i + 3],
240 self.inner.bits[i + 4],
241 self.inner.bits[i + 5],
242 self.inner.bits[i + 6],
243 self.inner.bits[i + 7],
244 ]);
245 let b = u64::from_le_bytes([
246 other.inner.bits[i],
247 other.inner.bits[i + 1],
248 other.inner.bits[i + 2],
249 other.inner.bits[i + 3],
250 other.inner.bits[i + 4],
251 other.inner.bits[i + 5],
252 other.inner.bits[i + 6],
253 other.inner.bits[i + 7],
254 ]);
255 let result = a & b;
256 result_bits[i..i + 8].copy_from_slice(&result.to_le_bytes());
257 i += 8;
258 }
259
260 while i < byte_count {
262 result_bits[i] = self.inner.bits[i] & other.inner.bits[i];
263 i += 1;
264 }
265
266 BitVec {
267 inner: Arc::new(BitVecInner {
268 bits: result_bits,
269 len,
270 }),
271 }
272 }
273
274 pub fn to_vec(&self) -> Vec<bool> {
275 self.iter().collect()
276 }
277
278 pub fn count_ones(&self) -> usize {
279 let mut count = self.inner.bits.iter().map(|&byte| byte.count_ones() as usize).sum();
281
282 let full_bytes = self.inner.len / 8;
284 let remainder_bits = self.inner.len % 8;
285
286 if remainder_bits > 0 && full_bytes < self.inner.bits.len() {
287 let last_byte = self.inner.bits[full_bytes];
288 let mask = (1u8 << remainder_bits) - 1;
290 count -= (last_byte & !mask).count_ones() as usize;
292 }
293
294 count
295 }
296
297 pub fn all_ones(&self) -> bool {
298 self.count_ones() == self.inner.len
299 }
300
301 pub fn count_zeros(&self) -> usize {
302 self.inner.len - self.count_ones()
303 }
304
305 pub fn any(&self) -> bool {
306 let full_bytes = self.inner.len / 8;
308 for i in 0..full_bytes {
309 if self.inner.bits[i] != 0 {
310 return true;
311 }
312 }
313
314 let remainder_bits = self.inner.len % 8;
316 if remainder_bits > 0 && full_bytes < self.inner.bits.len() {
317 let last_byte = self.inner.bits[full_bytes];
318 let mask = (1u8 << remainder_bits) - 1;
319 return (last_byte & mask) != 0;
320 }
321
322 false
323 }
324
325 pub fn none(&self) -> bool {
326 !self.any()
327 }
328
329 pub fn or(&self, other: &Self) -> Self {
330 assert_eq!(self.len(), other.len());
331 let len = self.len();
332 let byte_count = len.div_ceil(8);
333 let mut result_bits = vec![0u8; byte_count];
334
335 let chunks = byte_count / 8;
337 let mut i = 0;
338
339 for _ in 0..chunks {
341 let a = u64::from_le_bytes([
342 self.inner.bits[i],
343 self.inner.bits[i + 1],
344 self.inner.bits[i + 2],
345 self.inner.bits[i + 3],
346 self.inner.bits[i + 4],
347 self.inner.bits[i + 5],
348 self.inner.bits[i + 6],
349 self.inner.bits[i + 7],
350 ]);
351 let b = u64::from_le_bytes([
352 other.inner.bits[i],
353 other.inner.bits[i + 1],
354 other.inner.bits[i + 2],
355 other.inner.bits[i + 3],
356 other.inner.bits[i + 4],
357 other.inner.bits[i + 5],
358 other.inner.bits[i + 6],
359 other.inner.bits[i + 7],
360 ]);
361 let result = a | b;
362 result_bits[i..i + 8].copy_from_slice(&result.to_le_bytes());
363 i += 8;
364 }
365
366 while i < byte_count {
368 result_bits[i] = self.inner.bits[i] | other.inner.bits[i];
369 i += 1;
370 }
371
372 BitVec {
373 inner: Arc::new(BitVecInner {
374 bits: result_bits,
375 len,
376 }),
377 }
378 }
379
380 pub fn is_owned(&self) -> bool {
381 Arc::strong_count(&self.inner) == 1
382 }
383
384 pub fn is_shared(&self) -> bool {
385 Arc::strong_count(&self.inner) > 1
386 }
387
388 pub fn with_capacity(capacity: usize) -> Self {
389 let byte_capacity = capacity.div_ceil(8);
390 Self {
391 inner: Arc::new(BitVecInner {
392 bits: Vec::with_capacity(byte_capacity),
393 len: 0,
394 }),
395 }
396 }
397
398 pub fn try_into_raw(self) -> Result<(Vec<u8>, usize), Self> {
401 match Arc::try_unwrap(self.inner) {
402 Ok(inner) => Ok((inner.bits, inner.len)),
403 Err(arc) => Err(BitVec {
404 inner: arc,
405 }),
406 }
407 }
408
409 pub fn from_raw(bits: Vec<u8>, len: usize) -> Self {
411 BitVec {
412 inner: Arc::new(BitVecInner {
413 bits,
414 len,
415 }),
416 }
417 }
418
419 pub fn reorder(&mut self, indices: &[usize]) {
420 assert_eq!(self.len(), indices.len());
421 let len = self.len();
422 let byte_count = len.div_ceil(8);
423 let mut new_bits = vec![0u8; byte_count];
424
425 for (new_idx, &old_idx) in indices.iter().enumerate() {
427 if self.get(old_idx) {
428 let byte_idx = new_idx / 8;
429 let bit_idx = new_idx % 8;
430 new_bits[byte_idx] |= 1 << bit_idx;
431 }
432 }
433
434 let inner = self.make_mut();
436 inner.bits = new_bits;
437 }
438}
439
440impl fmt::Display for BitVec {
441 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
442 for bit in self.iter() {
443 write!(
444 f,
445 "{}",
446 if bit {
447 '1'
448 } else {
449 '0'
450 }
451 )?;
452 }
453 Ok(())
454 }
455}
456
457impl Deref for BitVec {
458 type Target = BitVecInner;
459
460 fn deref(&self) -> &Self::Target {
461 &self.inner
462 }
463}
464
465impl Serialize for BitVec {
466 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
467 where
468 S: Serializer,
469 {
470 self.inner.serialize(serializer)
471 }
472}
473
474impl<'de> Deserialize<'de> for BitVec {
475 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
476 where
477 D: Deserializer<'de>,
478 {
479 let inner = BitVecInner::deserialize(deserializer)?;
480 Ok(BitVec {
481 inner: Arc::new(inner),
482 })
483 }
484}
485
486impl DataBitVec for BitVec {
487 fn spawn(&self, capacity: usize) -> Self {
488 BitVec::with_capacity(capacity)
489 }
490
491 fn push(&mut self, bit: bool) {
492 BitVec::push(self, bit)
493 }
494
495 fn get(&self, idx: usize) -> bool {
496 BitVec::get(self, idx)
497 }
498
499 fn set(&mut self, idx: usize, value: bool) {
500 BitVec::set(self, idx, value)
501 }
502
503 fn len(&self) -> usize {
504 BitVec::len(self)
505 }
506
507 fn clear(&mut self) {
508 BitVec::clear(self)
509 }
510
511 fn extend_from(&mut self, other: &Self) {
512 BitVec::extend(self, other)
513 }
514
515 fn count_ones(&self) -> usize {
516 BitVec::count_ones(self)
517 }
518
519 fn iter(&self) -> impl Iterator<Item = bool> + '_ {
520 BitVec::iter(self)
521 }
522
523 fn capacity(&self) -> usize {
524 BitVec::capacity(self)
525 }
526
527 fn take(&self, n: usize) -> Self {
528 BitVec::take(self, n)
529 }
530}
531
532#[cfg(test)]
533pub mod tests {
534 mod new {
535 use crate::util::bitvec::BitVec;
536
537 #[test]
538 fn test_all_false() {
539 let bv = BitVec::repeat(10, false);
540 assert_eq!(bv.len(), 10);
541 for i in 0..10 {
542 assert!(!bv.get(i), "expected bit {} to be false", i);
543 }
544 }
545
546 #[test]
547 fn test_all_true() {
548 let bv = BitVec::repeat(10, true);
549 assert_eq!(bv.len(), 10);
550 for i in 0..10 {
551 assert!(bv.get(i), "expected bit {} to be true", i);
552 }
553 }
554 }
555
556 mod get_and_set {
557 use crate::util::bitvec::BitVec;
558
559 #[test]
560 fn test_ok() {
561 let mut bv = BitVec::repeat(16, false);
562 bv.set(3, true);
563 bv.set(7, true);
564 bv.set(15, true);
565
566 assert!(bv.get(3));
567 assert!(bv.get(7));
568 assert!(bv.get(15));
569 assert!(!bv.get(0));
570 assert!(!bv.get(14));
571 }
572
573 #[test]
574 #[should_panic(expected = "assertion failed")]
575 fn test_get_out_of_bounds() {
576 let bv = BitVec::repeat(8, false);
577 bv.get(8);
578 }
579
580 #[test]
581 #[should_panic(expected = "assertion failed")]
582 fn test_set_out_of_bounds() {
583 let mut bv = BitVec::repeat(8, false);
584 bv.set(8, true);
585 }
586 }
587
588 mod from_fn {
589 use crate::util::bitvec::BitVec;
590
591 #[test]
592 fn test_ok() {
593 let bv = BitVec::from_fn(10, |i| i % 2 == 0);
594 for i in 0..10 {
595 assert_eq!(bv.get(i), i % 2 == 0, "bit {} mismatch", i);
596 }
597 }
598 }
599
600 mod iter {
601 use crate::util::bitvec::BitVec;
602
603 #[test]
604 fn test_ok() {
605 let bv = BitVec::from_fn(4, |i| i % 2 == 0);
606 let collected: Vec<bool> = bv.iter().collect();
607 assert_eq!(collected, vec![true, false, true, false]);
608 }
609
610 #[test]
611 fn test_empty() {
612 let bv = BitVec::from_fn(0, |i| i % 2 == 0);
613 let collected: Vec<bool> = bv.iter().collect();
614 assert_eq!(collected, Vec::<bool>::new());
615 }
616 }
617
618 mod and {
619 use crate::util::bitvec::BitVec;
620
621 #[test]
622 fn test_ok() {
623 let a = BitVec::from_fn(8, |i| i % 2 == 0); let b = BitVec::from_fn(8, |i| i < 4); let result = a.and(&b); let expected = [true, false, true, false, false, false, false, false];
627 for i in 0..8 {
628 assert_eq!(result.get(i), expected[i], "mismatch at bit {}", i);
629 }
630 }
631 }
632
633 mod from_slice {
634 use crate::util::bitvec::BitVec;
635
636 #[test]
637 fn test_empty_slice() {
638 let bv = BitVec::from_slice(&[]);
639 assert_eq!(bv.len(), 0);
640 }
641
642 #[test]
643 fn test_single_bit() {
644 let bv = BitVec::from_slice(&[true]);
645 assert_eq!(bv.len(), 1);
646 assert!(bv.get(0));
647
648 let bv = BitVec::from_slice(&[false]);
649 assert_eq!(bv.len(), 1);
650 assert!(!bv.get(0));
651 }
652
653 #[test]
654 fn test_multiple_bits() {
655 let bv = BitVec::from_slice(&[true, false, true, false, true]);
656 assert_eq!(bv.len(), 5);
657 assert!(bv.get(0));
658 assert!(!bv.get(1));
659 assert!(bv.get(2));
660 assert!(!bv.get(3));
661 assert!(bv.get(4));
662 }
663
664 #[test]
665 fn test_cross_byte_boundary() {
666 let input = [true, false, true, false, true, false, true, false, true];
667 let bv = BitVec::from_slice(&input);
668 assert_eq!(bv.len(), 9);
669 for i in 0..9 {
670 assert_eq!(bv.get(i), input[i], "mismatch at bit {}", i);
671 }
672 }
673
674 #[test]
675 fn test_large_slice() {
676 let input: Vec<bool> = (0..1000).map(|i| i % 3 == 0).collect();
677 let bv = BitVec::from_slice(&input);
678 assert_eq!(bv.len(), 1000);
679 for i in 0..1000 {
680 assert_eq!(bv.get(i), input[i], "mismatch at bit {}", i);
681 }
682 }
683 }
684
685 mod from_array {
686 use crate::util::bitvec::BitVec;
687
688 #[test]
689 fn test_from_array_1() {
690 let bv = BitVec::from([true]);
691 assert_eq!(bv.len(), 1);
692 assert!(bv.get(0));
693 }
694
695 #[test]
696 fn test_from_array_2() {
697 let bv = BitVec::from([true, false]);
698 assert_eq!(bv.len(), 2);
699 assert!(bv.get(0));
700 assert!(!bv.get(1));
701 }
702
703 #[test]
704 fn test_from_array_4() {
705 let bv = BitVec::from([true, false, true, false]);
706 assert_eq!(bv.len(), 4);
707 assert!(bv.get(0));
708 assert!(!bv.get(1));
709 assert!(bv.get(2));
710 assert!(!bv.get(3));
711 }
712
713 #[test]
714 fn test_from_array_large() {
715 let bv = BitVec::from([true; 16]);
716 assert_eq!(bv.len(), 16);
717 for i in 0..16 {
718 assert!(bv.get(i), "expected bit {} to be true", i);
719 }
720 }
721
722 #[test]
723 fn test_from_array_cross_byte() {
724 let bv = BitVec::from([true, false, true, false, true, false, true, false, true]);
725 assert_eq!(bv.len(), 9);
726 for i in 0..9 {
727 assert_eq!(bv.get(i), i % 2 == 0, "mismatch at bit {}", i);
728 }
729 }
730 }
731
732 mod from_vec {
733 use crate::util::bitvec::BitVec;
734
735 #[test]
736 fn test_from_vec_empty() {
737 let bv = BitVec::from(Vec::<bool>::new());
738 assert_eq!(bv.len(), 0);
739 }
740
741 #[test]
742 fn test_from_vec_small() {
743 let bv = BitVec::from(vec![true, false, true]);
744 assert_eq!(bv.len(), 3);
745 assert!(bv.get(0));
746 assert!(!bv.get(1));
747 assert!(bv.get(2));
748 }
749
750 #[test]
751 fn test_from_vec_large() {
752 let input: Vec<bool> = (0..100).map(|i| i % 7 == 0).collect();
753 let bv = BitVec::from(input.clone());
754 assert_eq!(bv.len(), 100);
755 for i in 0..100 {
756 assert_eq!(bv.get(i), input[i], "mismatch at bit {}", i);
757 }
758 }
759 }
760
761 mod empty {
762 use crate::util::bitvec::BitVec;
763
764 #[test]
765 fn test_empty() {
766 let bv = BitVec::empty();
767 assert_eq!(bv.len(), 0);
768 assert!(bv.none());
769 assert!(!bv.any());
770 assert_eq!(bv.count_ones(), 0);
771 }
772
773 #[test]
774 fn test_empty_operations() {
775 let mut bv = BitVec::empty();
776
777 bv.push(true);
779 assert_eq!(bv.len(), 1);
780 assert!(bv.get(0));
781
782 let other = BitVec::from([false, true]);
784 bv.extend(&other);
785 assert_eq!(bv.len(), 3);
786 assert!(bv.get(0));
787 assert!(!bv.get(1));
788 assert!(bv.get(2));
789 }
790 }
791
792 mod take {
793 use crate::util::bitvec::BitVec;
794
795 #[test]
796 fn test_take_empty() {
797 let bv = BitVec::empty();
798 let taken = bv.take(5);
799 assert_eq!(taken.len(), 0);
800 }
801
802 #[test]
803 fn test_take_less_than_available() {
804 let bv = BitVec::from([true, false, true, false, true]);
805 let taken = bv.take(3);
806 assert_eq!(taken.len(), 3);
807 assert!(taken.get(0));
808 assert!(!taken.get(1));
809 assert!(taken.get(2));
810 }
811
812 #[test]
813 fn test_take_exact_length() {
814 let bv = BitVec::from([true, false, true]);
815 let taken = bv.take(3);
816 assert_eq!(taken.len(), 3);
817 assert!(taken.get(0));
818 assert!(!taken.get(1));
819 assert!(taken.get(2));
820 }
821
822 #[test]
823 fn test_take_more_than_available() {
824 let bv = BitVec::from([true, false]);
825 let taken = bv.take(5);
826 assert_eq!(taken.len(), 2);
827 assert!(taken.get(0));
828 assert!(!taken.get(1));
829 }
830
831 #[test]
832 fn test_take_zero() {
833 let bv = BitVec::from([true, false, true]);
834 let taken = bv.take(0);
835 assert_eq!(taken.len(), 0);
836 }
837
838 #[test]
839 fn test_take_cross_byte_boundary() {
840 let bv = BitVec::from([true, false, true, false, true, false, true, false, true]);
841 let taken = bv.take(6);
842 assert_eq!(taken.len(), 6);
843 for i in 0..6 {
844 assert_eq!(taken.get(i), i % 2 == 0, "mismatch at bit {}", i);
845 }
846 }
847 }
848
849 mod extend {
850 use crate::util::bitvec::BitVec;
851
852 #[test]
853 fn test_extend_empty_to_empty() {
854 let mut bv1 = BitVec::empty();
855 let bv2 = BitVec::empty();
856 bv1.extend(&bv2);
857 assert_eq!(bv1.len(), 0);
858 }
859
860 #[test]
861 fn test_extend_empty_to_nonempty() {
862 let mut bv1 = BitVec::from([true, false]);
863 let bv2 = BitVec::empty();
864 bv1.extend(&bv2);
865 assert_eq!(bv1.len(), 2);
866 assert!(bv1.get(0));
867 assert!(!bv1.get(1));
868 }
869
870 #[test]
871 fn test_extend_nonempty_to_empty() {
872 let mut bv1 = BitVec::empty();
873 let bv2 = BitVec::from([true, false]);
874 bv1.extend(&bv2);
875 assert_eq!(bv1.len(), 2);
876 assert!(bv1.get(0));
877 assert!(!bv1.get(1));
878 }
879
880 #[test]
881 fn test_extend_basic() {
882 let mut bv1 = BitVec::from([true, false]);
883 let bv2 = BitVec::from([false, true]);
884 bv1.extend(&bv2);
885 assert_eq!(bv1.len(), 4);
886 assert!(bv1.get(0));
887 assert!(!bv1.get(1));
888 assert!(!bv1.get(2));
889 assert!(bv1.get(3));
890 }
891
892 #[test]
893 fn test_extend_cross_byte_boundary() {
894 let mut bv1 = BitVec::from([true, false, true, false, true, false]);
895 let bv2 = BitVec::from([false, true, false]);
896 bv1.extend(&bv2);
897 assert_eq!(bv1.len(), 9);
898
899 let expected = [true, false, true, false, true, false, false, true, false];
900 for i in 0..9 {
901 assert_eq!(bv1.get(i), expected[i], "mismatch at bit {}", i);
902 }
903 }
904
905 #[test]
906 fn test_extend_large() {
907 let mut bv1 = BitVec::from_fn(50, |i| i % 2 == 0);
908 let bv2 = BitVec::from_fn(50, |i| i % 3 == 0);
909 bv1.extend(&bv2);
910 assert_eq!(bv1.len(), 100);
911
912 for i in 0..50 {
913 assert_eq!(bv1.get(i), i % 2 == 0, "first half mismatch at bit {}", i);
914 }
915 for i in 50..100 {
916 assert_eq!(bv1.get(i), (i - 50) % 3 == 0, "second half mismatch at bit {}", i);
917 }
918 }
919 }
920
921 mod push {
922 use crate::util::bitvec::BitVec;
923
924 #[test]
925 fn test_push_to_empty() {
926 let mut bv = BitVec::empty();
927 bv.push(true);
928 assert_eq!(bv.len(), 1);
929 assert!(bv.get(0));
930 }
931
932 #[test]
933 fn test_push_alternating() {
934 let mut bv = BitVec::empty();
935 for i in 0..10 {
936 bv.push(i % 2 == 0);
937 }
938 assert_eq!(bv.len(), 10);
939 for i in 0..10 {
940 assert_eq!(bv.get(i), i % 2 == 0, "mismatch at bit {}", i);
941 }
942 }
943
944 #[test]
945 fn test_push_cross_byte_boundary() {
946 let mut bv = BitVec::empty();
947 for i in 0..17 {
948 bv.push(i % 3 == 0);
949 }
950 assert_eq!(bv.len(), 17);
951 for i in 0..17 {
952 assert_eq!(bv.get(i), i % 3 == 0, "mismatch at bit {}", i);
953 }
954 }
955
956 #[test]
957 fn test_push_many() {
958 let mut bv = BitVec::empty();
959 for i in 0..1000 {
960 bv.push(i % 7 == 0);
961 }
962 assert_eq!(bv.len(), 1000);
963 for i in 0..1000 {
964 assert_eq!(bv.get(i), i % 7 == 0, "mismatch at bit {}", i);
965 }
966 }
967 }
968
969 mod reorder {
970 use crate::util::bitvec::BitVec;
971
972 #[test]
973 fn test_reorder_identity() {
974 let mut bv = BitVec::from([true, false, true, false]);
975 bv.reorder(&[0, 1, 2, 3]);
976 assert_eq!(bv.len(), 4);
977 assert!(bv.get(0));
978 assert!(!bv.get(1));
979 assert!(bv.get(2));
980 assert!(!bv.get(3));
981 }
982
983 #[test]
984 fn test_reorder_reverse() {
985 let mut bv = BitVec::from([true, false, true, false]);
986 bv.reorder(&[3, 2, 1, 0]);
987 assert_eq!(bv.len(), 4);
988 assert!(!bv.get(0)); assert!(bv.get(1)); assert!(!bv.get(2)); assert!(bv.get(3)); }
993
994 #[test]
995 fn test_reorder_custom() {
996 let mut bv = BitVec::from([true, false, true, false]);
997 bv.reorder(&[2, 0, 3, 1]);
998 assert_eq!(bv.len(), 4);
999 assert!(bv.get(0)); assert!(bv.get(1)); assert!(!bv.get(2)); assert!(!bv.get(3)); }
1004
1005 #[test]
1006 fn test_reorder_cross_byte_boundary() {
1007 let mut bv = BitVec::from([true, false, true, false, true, false, true, false, true]);
1008 bv.reorder(&[8, 7, 6, 5, 4, 3, 2, 1, 0]);
1009 assert_eq!(bv.len(), 9);
1010
1011 let expected = [true, false, true, false, true, false, true, false, true]; for i in 0..9 {
1013 assert_eq!(bv.get(i), expected[8 - i], "mismatch at bit {}", i);
1014 }
1015 }
1016
1017 #[test]
1018 #[should_panic(expected = "assertion `left == right` failed")]
1019 fn test_reorder_wrong_length() {
1020 let mut bv = BitVec::from([true, false, true]);
1021 bv.reorder(&[0, 1]); }
1023 }
1024
1025 mod count_ones {
1026 use crate::util::bitvec::BitVec;
1027
1028 #[test]
1029 fn test_count_ones_empty() {
1030 let bv = BitVec::empty();
1031 assert_eq!(bv.count_ones(), 0);
1032 }
1033
1034 #[test]
1035 fn test_count_ones_all_false() {
1036 let bv = BitVec::repeat(10, false);
1037 assert_eq!(bv.count_ones(), 0);
1038 }
1039
1040 #[test]
1041 fn test_count_ones_all_true() {
1042 let bv = BitVec::repeat(10, true);
1043 assert_eq!(bv.count_ones(), 10);
1044 }
1045
1046 #[test]
1047 fn test_count_ones_mixed() {
1048 let bv = BitVec::from([true, false, true, false, true]);
1049 assert_eq!(bv.count_ones(), 3);
1050 }
1051
1052 #[test]
1053 fn test_count_ones_alternating() {
1054 let bv = BitVec::from_fn(100, |i| i % 2 == 0);
1055 assert_eq!(bv.count_ones(), 50);
1056 }
1057
1058 #[test]
1059 fn test_count_ones_cross_byte_boundary() {
1060 let bv = BitVec::from_fn(17, |i| i % 3 == 0);
1061 let expected = (0..17).filter(|&i| i % 3 == 0).count();
1062 assert_eq!(bv.count_ones(), expected);
1063 }
1064 }
1065
1066 mod any_none {
1067 use crate::util::bitvec::BitVec;
1068
1069 #[test]
1070 fn test_any_none_empty() {
1071 let bv = BitVec::empty();
1072 assert!(!bv.any());
1073 assert!(bv.none());
1074 }
1075
1076 #[test]
1077 fn test_any_none_all_false() {
1078 let bv = BitVec::repeat(10, false);
1079 assert!(!bv.any());
1080 assert!(bv.none());
1081 }
1082
1083 #[test]
1084 fn test_any_none_all_true() {
1085 let bv = BitVec::repeat(10, true);
1086 assert!(bv.any());
1087 assert!(!bv.none());
1088 }
1089
1090 #[test]
1091 fn test_any_none_mixed() {
1092 let bv = BitVec::from([false, false, true, false]);
1093 assert!(bv.any());
1094 assert!(!bv.none());
1095 }
1096
1097 #[test]
1098 fn test_any_none_single_true() {
1099 let bv = BitVec::from([true]);
1100 assert!(bv.any());
1101 assert!(!bv.none());
1102 }
1103
1104 #[test]
1105 fn test_any_none_single_false() {
1106 let bv = BitVec::from([false]);
1107 assert!(!bv.any());
1108 assert!(bv.none());
1109 }
1110 }
1111
1112 mod to_vec {
1113 use crate::util::bitvec::BitVec;
1114
1115 #[test]
1116 fn test_to_vec_empty() {
1117 let bv = BitVec::empty();
1118 assert_eq!(bv.to_vec(), Vec::<bool>::new());
1119 }
1120
1121 #[test]
1122 fn test_to_vec_small() {
1123 let bv = BitVec::from([true, false, true]);
1124 assert_eq!(bv.to_vec(), vec![true, false, true]);
1125 }
1126
1127 #[test]
1128 fn test_to_vec_cross_byte_boundary() {
1129 let input = [true, false, true, false, true, false, true, false, true];
1130 let bv = BitVec::from(input);
1131 assert_eq!(bv.to_vec(), input.to_vec());
1132 }
1133
1134 #[test]
1135 fn test_to_vec_large() {
1136 let input: Vec<bool> = (0..100).map(|i| i % 3 == 0).collect();
1137 let bv = BitVec::from(input.clone());
1138 assert_eq!(bv.to_vec(), input);
1139 }
1140 }
1141
1142 mod display {
1143 use crate::util::bitvec::BitVec;
1144
1145 #[test]
1146 fn test_display_empty() {
1147 let bv = BitVec::empty();
1148 assert_eq!(format!("{}", bv), "");
1149 }
1150
1151 #[test]
1152 fn test_display_small() {
1153 let bv = BitVec::from([true, false, true]);
1154 assert_eq!(format!("{}", bv), "101");
1155 }
1156
1157 #[test]
1158 fn test_display_all_false() {
1159 let bv = BitVec::repeat(5, false);
1160 assert_eq!(format!("{}", bv), "00000");
1161 }
1162
1163 #[test]
1164 fn test_display_all_true() {
1165 let bv = BitVec::repeat(5, true);
1166 assert_eq!(format!("{}", bv), "11111");
1167 }
1168
1169 #[test]
1170 fn test_display_cross_byte_boundary() {
1171 let bv = BitVec::from([true, false, true, false, true, false, true, false, true]);
1172 assert_eq!(format!("{}", bv), "101010101");
1173 }
1174 }
1175
1176 mod and_operation {
1177 use crate::util::bitvec::BitVec;
1178
1179 #[test]
1180 fn test_and_empty() {
1181 let a = BitVec::empty();
1182 let b = BitVec::empty();
1183 let result = a.and(&b);
1184 assert_eq!(result.len(), 0);
1185 }
1186
1187 #[test]
1188 fn test_and_all_true() {
1189 let a = BitVec::repeat(5, true);
1190 let b = BitVec::repeat(5, true);
1191 let result = a.and(&b);
1192 assert_eq!(result.len(), 5);
1193 for i in 0..5 {
1194 assert!(result.get(i), "expected bit {} to be true", i);
1195 }
1196 }
1197
1198 #[test]
1199 fn test_and_all_false() {
1200 let a = BitVec::repeat(5, false);
1201 let b = BitVec::repeat(5, false);
1202 let result = a.and(&b);
1203 assert_eq!(result.len(), 5);
1204 for i in 0..5 {
1205 assert!(!result.get(i), "expected bit {} to be false", i);
1206 }
1207 }
1208
1209 #[test]
1210 fn test_and_mixed() {
1211 let a = BitVec::from([true, true, false, false]);
1212 let b = BitVec::from([true, false, true, false]);
1213 let result = a.and(&b);
1214 assert_eq!(result.len(), 4);
1215 assert!(result.get(0)); assert!(!result.get(1)); assert!(!result.get(2)); assert!(!result.get(3)); }
1220
1221 #[test]
1222 fn test_and_cross_byte_boundary() {
1223 let a = BitVec::from_fn(17, |i| i % 2 == 0);
1224 let b = BitVec::from_fn(17, |i| i % 3 == 0);
1225 let result = a.and(&b);
1226 assert_eq!(result.len(), 17);
1227 for i in 0..17 {
1228 let expected = (i % 2 == 0) && (i % 3 == 0);
1229 assert_eq!(result.get(i), expected, "mismatch at bit {}", i);
1230 }
1231 }
1232
1233 #[test]
1234 #[should_panic(expected = "assertion `left == right` failed")]
1235 fn test_and_different_lengths() {
1236 let a = BitVec::repeat(3, true);
1237 let b = BitVec::repeat(5, true);
1238 a.and(&b); }
1240 }
1241
1242 mod edge_cases {
1243 use crate::util::bitvec::BitVec;
1244
1245 #[test]
1246 fn test_single_bit_operations() {
1247 let mut bv = BitVec::from([true]);
1248 assert_eq!(bv.len(), 1);
1249 assert!(bv.get(0));
1250 assert_eq!(bv.count_ones(), 1);
1251 assert!(bv.any());
1252 assert!(!bv.none());
1253
1254 bv.set(0, false);
1255 assert!(!bv.get(0));
1256 assert_eq!(bv.count_ones(), 0);
1257 assert!(!bv.any());
1258 assert!(bv.none());
1259 }
1260
1261 #[test]
1262 fn test_exactly_one_byte() {
1263 let input = [true, false, true, false, true, false, true, false];
1264 let bv = BitVec::from(input);
1265 assert_eq!(bv.len(), 8);
1266 for i in 0..8 {
1267 assert_eq!(bv.get(i), input[i], "mismatch at bit {}", i);
1268 }
1269 }
1270
1271 #[test]
1272 fn test_exactly_multiple_bytes() {
1273 let input: Vec<bool> = (0..16).map(|i| i % 2 == 0).collect();
1274 let bv = BitVec::from(input.clone());
1275 assert_eq!(bv.len(), 16);
1276 for i in 0..16 {
1277 assert_eq!(bv.get(i), input[i], "mismatch at bit {}", i);
1278 }
1279 }
1280
1281 #[test]
1282 fn test_one_bit_past_byte_boundary() {
1283 let input: Vec<bool> = (0..9).map(|i| i % 2 == 0).collect();
1284 let bv = BitVec::from(input.clone());
1285 assert_eq!(bv.len(), 9);
1286 for i in 0..9 {
1287 assert_eq!(bv.get(i), input[i], "mismatch at bit {}", i);
1288 }
1289 }
1290
1291 #[test]
1292 fn test_seven_bits_in_byte() {
1293 let input = [true, false, true, false, true, false, true];
1294 let bv = BitVec::from(input);
1295 assert_eq!(bv.len(), 7);
1296 for i in 0..7 {
1297 assert_eq!(bv.get(i), input[i], "mismatch at bit {}", i);
1298 }
1299 }
1300 }
1301
1302 mod cow_behavior {
1303 use crate::util::bitvec::BitVec;
1304
1305 #[test]
1306 fn test_is_owned() {
1307 let mut owned = BitVec::with_capacity(16);
1308 owned.push(true);
1309 owned.push(false);
1310
1311 assert!(owned.is_owned());
1312
1313 let shared = owned.clone();
1314 assert!(!owned.is_owned());
1315 assert!(!shared.is_owned());
1316
1317 drop(shared);
1318
1319 assert!(owned.is_owned());
1320 }
1321
1322 #[test]
1323 fn test_is_shared() {
1324 let mut owned = BitVec::with_capacity(16);
1325 owned.push(true);
1326 owned.push(false);
1327
1328 assert!(!owned.is_shared());
1329
1330 let shared = owned.clone();
1331 assert!(owned.is_shared());
1332 assert!(shared.is_shared());
1333
1334 drop(shared);
1335
1336 assert!(!owned.is_shared());
1337 }
1338
1339 #[test]
1340 fn test_push_cow() {
1341 let mut owned = BitVec::with_capacity(16);
1342 owned.push(true);
1343 owned.push(false);
1344
1345 let ptr_before_owned = ptr_of(&owned);
1346 owned.push(true);
1347 assert_eq!(ptr_before_owned, ptr_of(&owned)); assert_eq!(owned.len(), 3);
1349
1350 let mut shared = owned.clone();
1351
1352 let ptr_before_shared = ptr_of(&shared);
1353 shared.push(true);
1354 assert_ne!(ptr_before_shared, ptr_of(&shared)); assert_eq!(owned.len(), 3);
1356 assert_eq!(shared.len(), 4);
1357 }
1358
1359 #[test]
1360 fn test_set_cow() {
1361 let mut owned = BitVec::repeat(8, false);
1362 owned.set(1, true);
1363
1364 let ptr_before_owned = ptr_of(&owned);
1365 owned.set(2, true);
1366 assert_eq!(ptr_before_owned, ptr_of(&owned)); let mut shared = owned.clone();
1369
1370 let ptr_before_shared = ptr_of(&shared);
1371 shared.set(3, true);
1372 assert_ne!(ptr_before_shared, ptr_of(&shared)); assert!(!owned.get(3)); assert!(shared.get(3)); }
1376
1377 #[test]
1378 fn test_extend_cow() {
1379 let mut owned = BitVec::repeat(4, false);
1380 let extension = BitVec::repeat(4, true);
1381
1382 let ptr_before_owned = ptr_of(&owned);
1383 owned.extend(&extension);
1384 assert_eq!(ptr_before_owned, ptr_of(&owned)); assert_eq!(owned.len(), 8);
1386
1387 let mut shared = owned.clone();
1388
1389 let ptr_before_shared = ptr_of(&shared);
1390 shared.extend(&extension);
1391 assert_ne!(ptr_before_shared, ptr_of(&shared)); assert_eq!(owned.len(), 8);
1393 assert_eq!(shared.len(), 12);
1394 }
1395
1396 #[test]
1397 fn test_reorder_cow() {
1398 let mut owned = BitVec::from_fn(4, |i| i % 2 == 0);
1399
1400 owned.reorder(&[1, 0, 3, 2]);
1402
1403 let mut shared = owned.clone();
1404
1405 let ptr_before_shared = ptr_of(&shared);
1406 shared.reorder(&[0, 1, 2, 3]); assert_ne!(ptr_before_shared, ptr_of(&shared)); }
1409
1410 fn ptr_of(v: &BitVec) -> *const u8 {
1411 v.inner.bits.as_ptr()
1412 }
1413 }
1414
1415 mod stress_tests {
1416 use crate::util::bitvec::BitVec;
1417
1418 #[test]
1419 fn test_large_bitvec_operations() {
1420 let size = 10000;
1421 let mut bv = BitVec::empty();
1422
1423 for i in 0..size {
1425 bv.push(i % 17 == 0);
1426 }
1427 assert_eq!(bv.len(), size);
1428
1429 for i in 0..size {
1431 assert_eq!(bv.get(i), i % 17 == 0, "mismatch at bit {}", i);
1432 }
1433
1434 let expected_ones = (0..size).filter(|&i| i % 17 == 0).count();
1436 assert_eq!(bv.count_ones(), expected_ones);
1437 }
1438
1439 #[test]
1440 fn test_large_extend_operations() {
1441 let size = 5000;
1442 let mut bv1 = BitVec::from_fn(size, |i| i % 13 == 0);
1443 let bv2 = BitVec::from_fn(size, |i| i % 19 == 0);
1444
1445 bv1.extend(&bv2);
1446 assert_eq!(bv1.len(), size * 2);
1447
1448 for i in 0..size {
1450 assert_eq!(bv1.get(i), i % 13 == 0, "first half mismatch at bit {}", i);
1451 }
1452
1453 for i in size..(size * 2) {
1455 assert_eq!(bv1.get(i), (i - size) % 19 == 0, "second half mismatch at bit {}", i);
1456 }
1457 }
1458
1459 #[test]
1460 fn test_many_byte_boundaries() {
1461 for size in [7, 8, 9, 15, 16, 17, 31, 32, 33, 63, 64, 65, 127, 128, 129] {
1463 let bv = BitVec::from_fn(size, |i| i % 3 == 0);
1464 assert_eq!(bv.len(), size);
1465
1466 for i in 0..size {
1467 assert_eq!(bv.get(i), i % 3 == 0, "size {} mismatch at bit {}", size, i);
1468 }
1469
1470 let expected_ones = (0..size).filter(|&i| i % 3 == 0).count();
1471 assert_eq!(bv.count_ones(), expected_ones, "count_ones mismatch for size {}", size);
1472 }
1473 }
1474
1475 #[test]
1476 fn test_multiple_and_operations() {
1477 let size = 1000;
1478 let a = BitVec::from_fn(size, |i| i % 2 == 0);
1479 let b = BitVec::from_fn(size, |i| i % 3 == 0);
1480 let c = BitVec::from_fn(size, |i| i % 5 == 0);
1481
1482 let ab = a.and(&b);
1483 let abc = ab.and(&c);
1484
1485 assert_eq!(abc.len(), size);
1486 for i in 0..size {
1487 let expected = (i % 2 == 0) && (i % 3 == 0) && (i % 5 == 0);
1488 assert_eq!(abc.get(i), expected, "mismatch at bit {}", i);
1489 }
1490 }
1491
1492 #[test]
1493 fn test_comptokenize_reorder_pattern() {
1494 let size = 100;
1495 let mut bv = BitVec::from_fn(size, |i| i % 7 == 0);
1496
1497 let mut indices: Vec<usize> = (0..size).collect();
1499 indices.reverse();
1500
1501 let original_values: Vec<bool> = bv.to_vec();
1502 bv.reorder(&indices);
1503
1504 for i in 0..size {
1506 let original_index = indices[i];
1507 assert_eq!(
1508 bv.get(i),
1509 original_values[original_index],
1510 "reorder mismatch at position {}",
1511 i
1512 );
1513 }
1514 }
1515 }
1516
1517 mod property_based_tests {
1518 use crate::util::bitvec::BitVec;
1519
1520 #[test]
1521 fn test_roundtrip_conversions() {
1522 let patterns = [
1524 vec![],
1525 vec![true],
1526 vec![false],
1527 vec![true, false],
1528 vec![false, true],
1529 (0..50).map(|i| i % 2 == 0).collect::<Vec<_>>(),
1530 (0..50).map(|i| i % 3 == 0).collect::<Vec<_>>(),
1531 (0..100).map(|i| i % 7 == 0).collect::<Vec<_>>(),
1532 ];
1533
1534 for pattern in patterns {
1535 let bv = BitVec::from(pattern.clone());
1537 let result = bv.to_vec();
1538 assert_eq!(pattern, result, "roundtrip failed for pattern length {}", pattern.len());
1539
1540 let bv2 = BitVec::from_slice(&pattern);
1542 let result2 = bv2.to_vec();
1543 assert_eq!(
1544 pattern,
1545 result2,
1546 "slice roundtrip failed for pattern length {}",
1547 pattern.len()
1548 );
1549
1550 if pattern.len() <= 32 {
1551 let bv3 = BitVec::from_slice(&pattern);
1554 assert_eq!(bv3.len(), pattern.len());
1555 for (i, &expected) in pattern.iter().enumerate() {
1556 assert_eq!(
1557 bv3.get(i),
1558 expected,
1559 "array conversion mismatch at bit {}",
1560 i
1561 );
1562 }
1563 }
1564 }
1565 }
1566
1567 #[test]
1568 fn test_invariants() {
1569 let patterns =
1570 [vec![], vec![true], vec![false], (0..100).map(|i| i % 5 == 0).collect::<Vec<_>>()];
1571
1572 for pattern in patterns {
1573 let bv = BitVec::from(pattern.clone());
1574
1575 assert_eq!(bv.len(), pattern.len());
1577
1578 let count_ones = bv.count_ones();
1580 let count_zeros = pattern.iter().filter(|&&b| !b).count();
1581 assert_eq!(count_ones + count_zeros, pattern.len());
1582
1583 if count_ones > 0 {
1585 assert!(bv.any());
1586 assert!(!bv.none());
1587 } else {
1588 assert!(!bv.any());
1589 assert!(bv.none());
1590 }
1591
1592 for (i, &expected) in pattern.iter().enumerate() {
1594 assert_eq!(bv.get(i), expected, "get() inconsistency at bit {}", i);
1595 }
1596 }
1597 }
1598
1599 #[test]
1600 fn test_extend_preserves_original() {
1601 let original = BitVec::from([true, false, true]);
1602 let extension = BitVec::from([false, true]);
1603
1604 let mut extended = original.clone();
1605 extended.extend(&extension);
1606
1607 assert_eq!(original.len(), 3);
1609 assert!(original.get(0));
1610 assert!(!original.get(1));
1611 assert!(original.get(2));
1612
1613 assert_eq!(extended.len(), 5);
1615 assert!(extended.get(0));
1616 assert!(!extended.get(1));
1617 assert!(extended.get(2));
1618 assert!(!extended.get(3));
1619 assert!(extended.get(4));
1620 }
1621
1622 #[test]
1623 fn test_and_operation_properties() {
1624 let a = BitVec::from([true, true, false, false]);
1625 let b = BitVec::from([true, false, true, false]);
1626
1627 let result = a.and(&b);
1628
1629 assert!(result.count_ones() <= a.count_ones());
1632 assert!(result.count_ones() <= b.count_ones());
1633
1634 let result2 = b.and(&a);
1636 assert_eq!(result.to_vec(), result2.to_vec());
1637
1638 let self_and = a.and(&a);
1640 assert_eq!(a.to_vec(), self_and.to_vec());
1641 }
1642 }
1643}