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