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