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