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