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