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