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