Skip to main content

reifydb_value/util/
bitvec.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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); // 10101010
569			let b = BitVec::from_fn(8, |i| i < 4); // 11110000
570			let result = a.and(&b); // 10100000
571			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)); // was index 3
932			assert!(bv.get(1)); // was index 2
933			assert!(!bv.get(2)); // was index 1
934			assert!(bv.get(3)); // was index 0
935		}
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)); // was index 2
943			assert!(bv.get(1)); // was index 0
944			assert!(!bv.get(2)); // was index 3
945			assert!(!bv.get(3)); // was index 1
946		}
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]; // reversed
955			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]); // Wrong length should panic
965		}
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)); // true & true = true
1159			assert!(!result.get(1)); // true & false = false
1160			assert!(!result.get(2)); // false & true = false
1161			assert!(!result.get(3)); // false & false = false
1162		}
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); // Should panic due to different lengths
1182		}
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			// The final partial byte must be masked, or not() sets bits past len.
1247			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			// Over 64 bits, so the word-at-a-time path runs rather than only the byte tail.
1286			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)); // no copy
1426			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)); // copy-on-write
1433			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)); // no copy
1445
1446			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)); // copy-on-write
1451			assert!(!owned.get(3)); // original unchanged
1452			assert!(shared.get(3)); // new value set
1453		}
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)); // no copy
1463			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)); // copy-on-write
1470			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			// reorder allocates a fresh bits array even when the buffer is uniquely owned.
1479			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]); // identity reorder
1485			assert_ne!(ptr_before_shared, ptr_of(&shared)); // copy-on-write
1486		}
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			// Sizes straddle every byte and word boundary, where the tail masking goes wrong.
1535			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}