Skip to main content

reifydb_type/util/
bitvec.rs

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