Skip to main content

reifydb_type/util/
bitvec.rs

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