reifydb_type/util/
bitvec.rs

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