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