1use std::ops::Not;
5
6use bitvec::view::BitView;
7
8use crate::BitBuffer;
9use crate::BufferMut;
10use crate::ByteBufferMut;
11use crate::bit::collect_bool_words;
12use crate::bit::get_bit_unchecked;
13use crate::bit::ops;
14use crate::bit::pack::collect_bool_words_multiversioned;
15use crate::bit::set_bit_unchecked;
16use crate::bit::unset_bit_unchecked;
17use crate::buffer_mut;
18
19#[inline(always)]
21pub(crate) fn fill_bits(slice: &mut [u8], start_bit: usize, end_bit: usize, value: bool) {
22 if start_bit >= end_bit {
23 return;
24 }
25
26 let fill_byte: u8 = if value { 0xFF } else { 0x00 };
27
28 let start_byte = start_bit / 8;
29 let start_rem = start_bit % 8;
30 let end_byte = end_bit / 8;
31 let end_rem = end_bit % 8;
32
33 if start_byte == end_byte {
34 let mask = ((1u8 << (end_rem - start_rem)) - 1) << start_rem;
36 if value {
37 slice[start_byte] |= mask;
38 } else {
39 slice[start_byte] &= !mask;
40 }
41 } else {
42 if start_rem != 0 {
44 let mask = !((1u8 << start_rem) - 1);
45 if value {
46 slice[start_byte] |= mask;
47 } else {
48 slice[start_byte] &= !mask;
49 }
50 }
51
52 let fill_start = if start_rem != 0 {
54 start_byte + 1
55 } else {
56 start_byte
57 };
58 if fill_start < end_byte {
59 slice[fill_start..end_byte].fill(fill_byte);
60 }
61
62 if end_rem != 0 {
64 let mask = (1u8 << end_rem) - 1;
65 if value {
66 slice[end_byte] |= mask;
67 } else {
68 slice[end_byte] &= !mask;
69 }
70 }
71 }
72}
73
74#[derive(Debug, Clone)]
94pub struct BitBufferMut {
95 buffer: ByteBufferMut,
96 offset: usize,
100 len: usize,
101}
102
103impl BitBufferMut {
104 #[inline]
106 pub fn from_buffer(buffer: ByteBufferMut, offset: usize, len: usize) -> Self {
107 assert!(
108 len <= buffer.len() * 8,
109 "Buffer len {} is too short for the given length {len}",
110 buffer.len()
111 );
112 Self {
113 buffer,
114 offset,
115 len,
116 }
117 }
118
119 pub fn copy_from(bit_buffer: &BitBuffer) -> Self {
121 Self {
122 buffer: ByteBufferMut::copy_from(bit_buffer.inner()),
123 offset: bit_buffer.offset(),
124 len: bit_buffer.len(),
125 }
126 }
127
128 #[inline]
130 pub fn with_capacity(capacity: usize) -> Self {
131 Self {
132 buffer: BufferMut::with_capacity(capacity.div_ceil(8)),
133 offset: 0,
134 len: 0,
135 }
136 }
137
138 #[inline]
140 pub fn new_set(len: usize) -> Self {
141 Self {
142 buffer: buffer_mut![0xFF; len.div_ceil(8)],
143 offset: 0,
144 len,
145 }
146 }
147
148 #[inline]
150 pub fn new_unset(len: usize) -> Self {
151 Self {
152 buffer: BufferMut::zeroed(len.div_ceil(8)),
153 offset: 0,
154 len,
155 }
156 }
157
158 #[inline(always)]
160 pub fn empty() -> Self {
161 Self::with_capacity(0)
162 }
163
164 #[inline]
166 pub fn full(value: bool, len: usize) -> Self {
167 if value {
168 Self::new_set(len)
169 } else {
170 Self::new_unset(len)
171 }
172 }
173
174 pub fn from_indices(len: usize, indices: impl IntoIterator<Item = usize>) -> BitBufferMut {
176 let mut buffer = BufferMut::<u64>::zeroed(len.div_ceil(64));
177 for idx in indices {
178 assert!(idx < len, "index {idx} exceeds len {len}");
179 buffer.as_mut_slice()[idx / 64] |= 1 << (idx % 64);
180 }
181
182 let mut buffer = buffer.into_byte_buffer();
183 buffer.truncate(len.div_ceil(8));
184
185 Self {
186 buffer,
187 offset: 0,
188 len,
189 }
190 }
191
192 #[inline]
210 pub fn collect_bool<F: FnMut(usize) -> bool>(len: usize, f: F) -> Self {
211 Self::collect_words(len, |words| collect_bool_words(words, len, f))
212 }
213
214 #[inline]
226 pub fn collect_bool_multiversioned<F: FnMut(usize) -> bool>(len: usize, f: F) -> Self {
227 Self::collect_words(len, |words| {
228 collect_bool_words_multiversioned(words, len, f)
229 })
230 }
231
232 #[inline]
235 fn collect_words(len: usize, fill: impl FnOnce(&mut [u64])) -> Self {
236 let num_words = len.div_ceil(64);
237 let mut buffer: BufferMut<u64> = BufferMut::with_capacity(num_words);
238 unsafe { buffer.set_len(num_words) };
242 fill(buffer.as_mut_slice());
243
244 let mut bytes = buffer.into_byte_buffer();
245 bytes.truncate(len.div_ceil(8));
246
247 Self {
248 buffer: bytes,
249 offset: 0,
250 len,
251 }
252 }
253
254 #[inline]
256 pub fn inner(&self) -> &ByteBufferMut {
257 &self.buffer
258 }
259
260 #[inline]
262 pub fn into_inner(self) -> ByteBufferMut {
263 self.buffer
264 }
265
266 #[inline(always)]
268 pub fn len(&self) -> usize {
269 self.len
270 }
271
272 #[inline(always)]
274 pub fn is_empty(&self) -> bool {
275 self.len == 0
276 }
277
278 #[inline(always)]
280 pub fn offset(&self) -> usize {
281 self.offset
282 }
283
284 #[inline(always)]
286 pub fn value(&self, index: usize) -> bool {
287 assert!(index < self.len);
288 unsafe { self.value_unchecked(index) }
290 }
291
292 #[inline(always)]
298 pub unsafe fn value_unchecked(&self, index: usize) -> bool {
299 unsafe { get_bit_unchecked(self.buffer.as_ptr(), self.offset + index) }
300 }
301
302 #[inline(always)]
304 pub fn capacity(&self) -> usize {
305 (self.buffer.capacity() * 8) - self.offset
306 }
307
308 #[inline]
310 pub fn reserve(&mut self, additional: usize) {
311 let required_bits = self.offset + self.len + additional;
312 let required_bytes = required_bits.div_ceil(8); let additional_bytes = required_bytes.saturating_sub(self.buffer.len());
315 self.buffer.reserve(additional_bytes);
316 }
317
318 #[inline]
320 pub fn clear(&mut self) {
321 self.buffer.clear();
324 self.len = 0;
325 self.offset = 0;
326 }
327
328 #[inline]
332 pub fn set_to(&mut self, index: usize, value: bool) {
333 if value {
334 self.set(index);
335 } else {
336 self.unset(index);
337 }
338 }
339
340 #[inline]
346 pub unsafe fn set_to_unchecked(&mut self, index: usize, value: bool) {
347 if value {
348 unsafe { self.set_unchecked(index) }
350 } else {
351 unsafe { self.unset_unchecked(index) }
353 }
354 }
355
356 #[inline]
360 pub fn set(&mut self, index: usize) {
361 assert!(index < self.len, "index {index} exceeds len {}", self.len);
362
363 unsafe { self.set_unchecked(index) };
365 }
366
367 #[inline]
371 pub fn unset(&mut self, index: usize) {
372 assert!(index < self.len, "index {index} exceeds len {}", self.len);
373
374 unsafe { self.unset_unchecked(index) };
376 }
377
378 #[inline]
386 pub unsafe fn set_unchecked(&mut self, index: usize) {
387 unsafe { set_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
389 }
390
391 #[inline]
399 pub unsafe fn unset_unchecked(&mut self, index: usize) {
400 unsafe { unset_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
402 }
403
404 #[inline(always)]
411 pub unsafe fn set_len(&mut self, new_len: usize) {
412 debug_assert!(
413 new_len <= self.capacity(),
414 "`set_len` requires that new_len <= capacity()"
415 );
416
417 let bytes_len = (self.offset + new_len).div_ceil(8);
419 unsafe { self.buffer.set_len(bytes_len) };
420
421 self.len = new_len;
422 }
423
424 #[inline]
428 pub fn truncate(&mut self, len: usize) {
429 if len > self.len {
430 return;
431 }
432
433 assert!(
434 self.offset <= usize::MAX - len,
435 "Truncate on BitBufferMut overflowed"
436 );
437 let end_bit = self.offset + len;
438 let new_len_bytes = end_bit.div_ceil(8);
439 self.buffer.truncate(new_len_bytes);
440 self.len = len;
441
442 if !end_bit.is_multiple_of(8) {
445 let keep = (1u8 << (end_bit % 8)) - 1;
446 self.buffer.as_mut_slice()[new_len_bytes - 1] &= keep;
447 }
448 }
449
450 #[inline]
452 pub fn append(&mut self, value: bool) {
453 if value {
454 self.append_true()
455 } else {
456 self.append_false()
457 }
458 }
459
460 #[inline]
462 pub fn append_true(&mut self) {
463 let bit_pos = self.offset + self.len;
464 let byte_pos = bit_pos / 8;
465 let bit_in_byte = bit_pos % 8;
466
467 if byte_pos >= self.buffer.len() {
469 self.buffer.push(0u8);
470 }
471
472 self.buffer.as_mut_slice()[byte_pos] |= 1 << bit_in_byte;
474 self.len += 1;
475 }
476
477 #[inline]
479 pub fn append_false(&mut self) {
480 let bit_pos = self.offset + self.len;
481 let byte_pos = bit_pos / 8;
482
483 if byte_pos >= self.buffer.len() {
485 self.buffer.push(0u8);
486 }
487
488 self.len += 1;
491 }
492
493 #[inline]
498 pub fn append_n(&mut self, value: bool, n: usize) {
499 if n == 0 {
500 return;
501 }
502
503 assert!(
504 self.offset
505 .checked_add(self.len)
506 .and_then(|v| v.checked_add(n))
507 .is_some(),
508 "Append on BitBufferMut overflowed"
509 );
510 let end_bit_pos = self.offset + self.len + n;
511 let required_bytes = end_bit_pos.div_ceil(8);
512
513 if required_bytes > self.buffer.len() {
515 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
516 }
517
518 let start = self.len;
519 self.len += n;
520 self.fill_range(start, self.len, value);
521 }
522
523 #[inline(always)]
528 pub fn fill_range(&mut self, start: usize, end: usize, value: bool) {
529 assert!(end <= self.len, "end {end} exceeds len {}", self.len);
530 assert!(start <= end, "start {start} exceeds end {end}");
531
532 unsafe { self.fill_range_unchecked(start, end, value) }
535 }
536
537 #[inline(always)]
543 pub unsafe fn fill_range_unchecked(&mut self, start: usize, end: usize, value: bool) {
544 fill_bits(
545 self.buffer.as_mut_slice(),
546 self.offset + start,
547 self.offset + end,
548 value,
549 );
550 }
551
552 pub fn append_buffer(&mut self, buffer: &BitBuffer) {
556 let bit_len = buffer.len();
557 if bit_len == 0 {
558 return;
559 }
560
561 let start_bit_pos = self.offset + self.len;
562 let end_bit_pos = start_bit_pos + bit_len;
563 let required_bytes = end_bit_pos.div_ceil(8);
564
565 if required_bytes > self.buffer.len() {
567 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
568 }
569
570 let dst_bit_offset = start_bit_pos % 8;
571 let src_bit_offset = buffer.offset();
572
573 if dst_bit_offset == 0 && src_bit_offset == 0 {
574 let dst_byte = start_bit_pos / 8;
576 let src_bytes = buffer.inner().as_slice();
577 let full_bytes = bit_len / 8;
578 self.buffer.as_mut_slice()[dst_byte..dst_byte + full_bytes]
579 .copy_from_slice(&src_bytes[..full_bytes]);
580 let rem = bit_len % 8;
581 if rem != 0 {
582 let mask = (1u8 << rem) - 1;
583 self.buffer.as_mut_slice()[dst_byte + full_bytes] |= src_bytes[full_bytes] & mask;
584 }
585 } else {
586 let self_slice = self
588 .buffer
589 .as_mut_slice()
590 .view_bits_mut::<bitvec::prelude::Lsb0>();
591 let other_slice = buffer
592 .inner()
593 .as_slice()
594 .view_bits::<bitvec::prelude::Lsb0>();
595 let source_range = src_bit_offset..src_bit_offset + bit_len;
596 self_slice[start_bit_pos..end_bit_pos].copy_from_bitslice(&other_slice[source_range]);
597 }
598
599 self.len += bit_len;
600 }
601
602 pub fn unsplit(&mut self, other: Self) {
610 if (self.offset + self.len).is_multiple_of(8) && other.offset == 0 {
611 self.buffer.unsplit(other.buffer);
613 self.len += other.len;
614 return;
615 }
616
617 self.append_buffer(&other.freeze())
619 }
620
621 #[inline]
623 pub fn freeze(self) -> BitBuffer {
624 BitBuffer::new_with_offset(self.buffer.freeze(), self.len, self.offset)
625 }
626
627 #[inline]
629 pub fn as_slice(&self) -> &[u8] {
630 self.buffer.as_slice()
631 }
632
633 #[inline]
635 pub fn as_mut_slice(&mut self) -> &mut [u8] {
636 self.buffer.as_mut_slice()
637 }
638}
639
640impl Default for BitBufferMut {
641 fn default() -> Self {
642 Self::with_capacity(0)
643 }
644}
645
646impl Not for BitBufferMut {
648 type Output = BitBufferMut;
649
650 #[inline]
651 fn not(mut self) -> Self::Output {
652 ops::bitwise_unary_op_mut(&mut self, |b| !b);
653 self
654 }
655}
656
657impl From<&[bool]> for BitBufferMut {
658 fn from(value: &[bool]) -> Self {
659 BitBufferMut::collect_bool_multiversioned(value.len(), |i| unsafe {
662 *value.get_unchecked(i)
663 })
664 }
665}
666
667impl From<&[u8]> for BitBufferMut {
669 fn from(value: &[u8]) -> Self {
670 BitBufferMut::collect_bool_multiversioned(
673 value.len(),
674 |i| unsafe { *value.get_unchecked(i) } > 0,
675 )
676 }
677}
678
679impl From<Vec<bool>> for BitBufferMut {
680 fn from(value: Vec<bool>) -> Self {
681 value.as_slice().into()
682 }
683}
684
685impl FromIterator<bool> for BitBufferMut {
686 #[inline]
687 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
688 let mut iter = iter.into_iter();
689
690 let (lower_bound, _) = iter.size_hint();
693
694 let mut buf = BitBufferMut::new_unset(lower_bound);
699 assert_eq!(buf.offset, 0);
700
701 let ptr = buf.buffer.as_mut_ptr();
703 for i in 0..lower_bound {
704 let Some(v) = iter.next() else {
705 unsafe { buf.set_len(i) };
708 return buf;
709 };
710
711 if v {
712 unsafe { set_bit_unchecked(ptr, i) }
714 }
715 }
716
717 for v in iter {
720 buf.append(v);
721 }
722
723 buf
724 }
725}
726
727#[cfg(test)]
728mod tests {
729 use rstest::rstest;
730
731 use crate::BufferMut;
732 use crate::bit::buf_mut::BitBufferMut;
733 use crate::bitbuffer;
734 use crate::bitbuffer_mut;
735 use crate::buffer_mut;
736
737 #[test]
738 fn test_bits_mut() {
739 let mut bools = bitbuffer_mut![false; 10];
740 bools.set_to(0, true);
741 bools.set_to(9, true);
742
743 let bools = bools.freeze();
744 assert!(bools.value(0));
745 for i in 1..=8 {
746 assert!(!bools.value(i));
747 }
748 assert!(bools.value(9));
749 }
750
751 #[test]
752 fn test_append_n() {
753 let mut bools = BitBufferMut::with_capacity(10);
754 assert_eq!(bools.len(), 0);
755 assert!(bools.is_empty());
756
757 bools.append(true);
758 bools.append_n(false, 8);
759 bools.append_n(true, 1);
760
761 let bools = bools.freeze();
762
763 assert_eq!(bools.true_count(), 2);
764 assert!(bools.value(0));
765 assert!(bools.value(9));
766 }
767
768 #[test]
769 fn append_false_after_truncate_reads_back_false() {
770 let mut bools = BitBufferMut::new_set(16);
773 bools.truncate(12);
774 bools.append_false();
775 bools.append_true();
776
777 let bools = bools.freeze();
778 assert_eq!(bools.len(), 14);
779 assert!(
780 !bools.value(12),
781 "appended false must read back false after truncate"
782 );
783 assert!(bools.value(13));
784 }
785
786 #[test]
787 fn test_reserve_ensures_len_plus_additional() {
788 let mut bits = BitBufferMut::with_capacity(10);
792 assert_eq!(bits.len(), 0);
793
794 bits.reserve(100);
795
796 assert!(bits.capacity() >= 100);
798
799 bits.append_n(true, 50);
800 assert_eq!(bits.len(), 50);
801
802 bits.reserve(100);
803
804 assert!(bits.capacity() >= 150);
806 }
807
808 #[test]
809 fn test_with_offset_zero() {
810 let buf = BufferMut::zeroed(2);
812 let mut bit_buf = BitBufferMut::from_buffer(buf, 0, 16);
813
814 bit_buf.set(0);
816 bit_buf.set(7);
817 bit_buf.set(8);
818 bit_buf.set(15);
819
820 assert!(bit_buf.value(0));
822 assert!(bit_buf.value(7));
823 assert!(bit_buf.value(8));
824 assert!(bit_buf.value(15));
825 assert!(!bit_buf.value(1));
826 assert!(!bit_buf.value(9));
827
828 assert_eq!(bit_buf.as_slice()[0], 0b10000001);
830 assert_eq!(bit_buf.as_slice()[1], 0b10000001);
831 }
832
833 #[test]
834 fn test_with_offset_within_byte() {
835 let buf = buffer_mut![0b11111111, 0b00000000, 0b00000000];
837 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 10);
838
839 assert!(bit_buf.value(0)); assert!(bit_buf.value(4)); assert!(!bit_buf.value(5)); bit_buf.set(7);
847 assert!(bit_buf.value(7));
848
849 bit_buf.unset(0);
851 assert!(!bit_buf.value(0));
852 }
853
854 #[test]
855 fn test_with_offset_byte_boundary() {
856 let buf = buffer_mut![0xFF, 0x00, 0xFF];
858 let mut bit_buf = BitBufferMut::from_buffer(buf, 8, 16);
859
860 for i in 0..8 {
862 assert!(!bit_buf.value(i));
863 }
864 for i in 8..16 {
866 assert!(bit_buf.value(i));
867 }
868
869 bit_buf.set(0);
871 bit_buf.set(3);
872 assert!(bit_buf.value(0));
873 assert!(bit_buf.value(3));
874 }
875
876 #[test]
877 fn test_with_large_offset() {
878 let buf = buffer_mut![0xFF, 0xFF, 0xFF, 0xFF];
880 let mut bit_buf = BitBufferMut::from_buffer(buf, 13, 10);
881
882 for i in 0..10 {
884 assert!(bit_buf.value(i));
885 }
886
887 bit_buf.unset(0);
889 bit_buf.unset(5);
890 bit_buf.unset(9);
891
892 assert!(!bit_buf.value(0));
893 assert!(bit_buf.value(1));
894 assert!(!bit_buf.value(5));
895 assert!(!bit_buf.value(9));
896 }
897
898 #[test]
899 fn test_append_with_offset() {
900 let buf = buffer_mut![0b11100000]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0); bit_buf.append(false); bit_buf.append(true); bit_buf.append(true); assert_eq!(bit_buf.len(), 3);
910 assert!(!bit_buf.value(0));
911 assert!(bit_buf.value(1));
912 assert!(bit_buf.value(2));
913 }
914
915 #[test]
916 fn test_append_n_with_offset_crossing_boundary() {
917 let buf = BufferMut::zeroed(4);
919 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
920
921 bit_buf.append_n(true, 10); assert_eq!(bit_buf.len(), 10);
925 for i in 0..10 {
926 assert!(bit_buf.value(i));
927 }
928
929 assert_eq!(bit_buf.as_slice()[0], 0b11100000);
933 assert_eq!(bit_buf.as_slice()[1], 0b01111111);
934 }
935
936 #[test]
937 fn test_truncate_with_offset() {
938 let buf = buffer_mut![0xFF, 0xFF];
939 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 12);
940
941 assert_eq!(bit_buf.len(), 12);
942
943 bit_buf.truncate(8);
945 assert_eq!(bit_buf.len(), 8);
946
947 bit_buf.truncate(3);
949 assert_eq!(bit_buf.len(), 3);
950
951 bit_buf.truncate(10);
953 assert_eq!(bit_buf.len(), 3);
954 }
955
956 #[test]
957 fn test_capacity_with_offset() {
958 let buf = buffer_mut![0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
961
962 assert!(bit_buf.capacity() >= 75);
965 assert_eq!(bit_buf.capacity() % 8, (80 - 5) % 8);
967 }
968
969 #[test]
970 fn test_reserve_with_offset() {
971 let buf = buffer_mut![0, 0]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
974
975 let initial_capacity = bit_buf.capacity();
977 assert!(initial_capacity >= 13);
978
979 bit_buf.reserve(20);
981
982 assert!(bit_buf.capacity() >= 20);
984 }
985
986 #[test]
987 fn test_freeze_with_offset() {
988 let buf = buffer_mut![0b11110000, 0b00001111];
989 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
990
991 bit_buf.set(0);
993 bit_buf.set(7);
994
995 let frozen = bit_buf.freeze();
997 assert_eq!(frozen.offset(), 4);
998 assert_eq!(frozen.len(), 8);
999
1000 assert!(frozen.value(0));
1002 assert!(frozen.value(7));
1003 }
1004
1005 #[cfg_attr(miri, ignore)] #[test]
1007 fn append_after_clear_reads_back_false() {
1008 let mut bools = BitBufferMut::new_set(16);
1011 bools.clear();
1012 bools.append_false();
1013 bools.append_buffer(&crate::BitBuffer::new_unset(8));
1014
1015 let bools = bools.freeze();
1016 assert_eq!(bools.len(), 9);
1017 assert_eq!(bools.true_count(), 0);
1018 }
1019
1020 #[cfg_attr(miri, ignore)] #[test]
1022 fn test_append_buffer_after_truncate() {
1023 let mut buf = BitBufferMut::new_set(16);
1026 buf.truncate(3);
1027 buf.append_buffer(&crate::BitBuffer::new_unset(8));
1028
1029 let frozen = buf.freeze();
1030 assert_eq!(frozen.len(), 11);
1031 for i in 0..3 {
1032 assert!(frozen.value(i), "bit {i} should be set");
1033 }
1034 for i in 3..11 {
1035 assert!(!frozen.value(i), "bit {i} should be unset");
1036 }
1037 }
1038
1039 #[rstest]
1040 #[case::both_aligned(0, 0)]
1041 #[case::dst_unaligned(3, 0)]
1042 #[case::src_unaligned(0, 5)]
1043 #[case::mismatched(3, 5)]
1044 #[case::equal_nonzero(5, 5)]
1045 #[cfg_attr(miri, ignore)] fn test_append_buffer_long(#[case] dst_prefix: usize, #[case] src_start: usize) {
1047 let source = crate::BitBuffer::from_iter((0..301).map(|i| i % 3 == 0));
1049 let source = source.slice(src_start..301);
1050
1051 let mut dest = BitBufferMut::with_capacity(512);
1052 dest.append_n(true, dst_prefix);
1053 dest.append_buffer(&source);
1054
1055 assert_eq!(dest.len(), dst_prefix + source.len());
1056 for i in 0..dst_prefix {
1057 assert!(dest.value(i), "prefix bit {i}");
1058 }
1059 for i in 0..source.len() {
1060 assert_eq!(dest.value(dst_prefix + i), source.value(i), "bit {i}");
1061 }
1062 }
1063
1064 #[cfg_attr(miri, ignore)] #[test]
1066 fn test_append_buffer_with_offsets() {
1067 let source = bitbuffer![false, false, true, true, false, true];
1069
1070 let buf = BufferMut::zeroed(4);
1072 let mut dest = BitBufferMut::from_buffer(buf, 3, 0);
1073
1074 dest.append(true);
1076 dest.append(false);
1077
1078 dest.append_buffer(&source);
1080
1081 assert_eq!(dest.len(), 8);
1082 assert!(dest.value(0)); assert!(!dest.value(1)); assert!(!dest.value(2)); assert!(!dest.value(3)); assert!(dest.value(4)); assert!(dest.value(5)); assert!(!dest.value(6)); assert!(dest.value(7)); }
1091
1092 #[test]
1093 fn test_set_unset_unchecked_with_offset() {
1094 let buf = BufferMut::zeroed(3);
1095 let mut bit_buf = BitBufferMut::from_buffer(buf, 7, 10);
1096
1097 unsafe {
1098 bit_buf.set_unchecked(0);
1099 bit_buf.set_unchecked(5);
1100 bit_buf.set_unchecked(9);
1101 }
1102
1103 assert!(bit_buf.value(0));
1104 assert!(bit_buf.value(5));
1105 assert!(bit_buf.value(9));
1106
1107 unsafe {
1108 bit_buf.unset_unchecked(5);
1109 }
1110
1111 assert!(!bit_buf.value(5));
1112 }
1113
1114 #[test]
1115 fn test_value_unchecked_with_offset() {
1116 let buf = buffer_mut![0b11110000, 0b00001111];
1117 let bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
1118
1119 unsafe {
1120 assert!(bit_buf.value_unchecked(0));
1122 assert!(bit_buf.value_unchecked(3));
1123
1124 assert!(bit_buf.value_unchecked(4));
1126 assert!(bit_buf.value_unchecked(7));
1127 }
1128 }
1129
1130 #[test]
1131 fn test_append_alternating_with_offset() {
1132 let buf = BufferMut::zeroed(4);
1133 let mut bit_buf = BitBufferMut::from_buffer(buf, 2, 0);
1134
1135 for i in 0..20 {
1137 bit_buf.append(i % 2 == 0);
1138 }
1139
1140 assert_eq!(bit_buf.len(), 20);
1141 for i in 0..20 {
1142 assert_eq!(bit_buf.value(i), i % 2 == 0);
1143 }
1144 }
1145
1146 #[test]
1147 fn test_new_set_new_unset() {
1148 let set_buf = bitbuffer_mut![true; 10];
1149 let unset_buf = bitbuffer_mut![false; 10];
1150
1151 for i in 0..10 {
1152 assert!(set_buf.value(i));
1153 assert!(!unset_buf.value(i));
1154 }
1155
1156 assert_eq!(set_buf.len(), 10);
1157 assert_eq!(unset_buf.len(), 10);
1158 }
1159
1160 #[test]
1161 fn test_append_n_false_with_offset() {
1162 let buf = BufferMut::zeroed(4);
1163 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1164
1165 bit_buf.append_n(false, 15);
1166
1167 assert_eq!(bit_buf.len(), 15);
1168 for i in 0..15 {
1169 assert!(!bit_buf.value(i));
1170 }
1171 }
1172
1173 #[test]
1174 fn test_append_n_true_with_offset() {
1175 let buf = BufferMut::zeroed(4);
1176 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1177
1178 bit_buf.append_n(true, 15);
1179
1180 assert_eq!(bit_buf.len(), 15);
1181 for i in 0..15 {
1182 assert!(bit_buf.value(i));
1183 }
1184 }
1185
1186 #[test]
1187 fn test_mixed_operations_with_offset() {
1188 let buf = BufferMut::zeroed(5);
1190 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
1191
1192 bit_buf.append_n(true, 5);
1194 bit_buf.append_n(false, 3);
1195 bit_buf.append(true);
1196
1197 assert_eq!(bit_buf.len(), 9);
1198
1199 bit_buf.set(6); bit_buf.unset(2); assert!(bit_buf.value(0));
1205 assert!(bit_buf.value(1));
1206 assert!(!bit_buf.value(2)); assert!(bit_buf.value(3));
1208 assert!(bit_buf.value(4));
1209 assert!(!bit_buf.value(5));
1210 assert!(bit_buf.value(6)); assert!(!bit_buf.value(7));
1212 assert!(bit_buf.value(8));
1213
1214 bit_buf.truncate(6);
1216 assert_eq!(bit_buf.len(), 6);
1217
1218 let frozen = bit_buf.freeze();
1220 assert_eq!(frozen.offset(), 3);
1221 assert_eq!(frozen.len(), 6);
1222 }
1223
1224 #[test]
1225 fn test_from_iterator_with_incorrect_size_hint() {
1226 struct LyingIterator {
1233 values: Vec<bool>,
1234 index: usize,
1235 }
1236
1237 impl Iterator for LyingIterator {
1238 type Item = bool;
1239
1240 fn next(&mut self) -> Option<Self::Item> {
1241 (self.index < self.values.len()).then(|| {
1242 let val = self.values[self.index];
1243 self.index += 1;
1244 val
1245 })
1246 }
1247
1248 fn size_hint(&self) -> (usize, Option<usize>) {
1249 let remaining = self.values.len() - self.index;
1252 let lower = remaining.min(5); let upper = Some(5); (lower, upper)
1255 }
1256 }
1257
1258 let lying_iter = LyingIterator {
1260 values: vec![
1261 true, false, true, false, true, false, true, false, true, false,
1262 ],
1263 index: 0,
1264 };
1265
1266 let bit_buf: BitBufferMut = lying_iter.collect();
1269
1270 assert_eq!(bit_buf.len(), 10);
1272 for i in 0..10 {
1273 assert_eq!(bit_buf.value(i), i % 2 == 0);
1274 }
1275 }
1276}