Skip to main content

reifydb_type/util/
bitvec.rs

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