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::set_bit_unchecked;
15use crate::bit::unset_bit_unchecked;
16use crate::buffer_mut;
17
18#[inline(always)]
20pub(crate) fn fill_bits(slice: &mut [u8], start_bit: usize, end_bit: usize, value: bool) {
21 if start_bit >= end_bit {
22 return;
23 }
24
25 let fill_byte: u8 = if value { 0xFF } else { 0x00 };
26
27 let start_byte = start_bit / 8;
28 let start_rem = start_bit % 8;
29 let end_byte = end_bit / 8;
30 let end_rem = end_bit % 8;
31
32 if start_byte == end_byte {
33 let mask = ((1u8 << (end_rem - start_rem)) - 1) << start_rem;
35 if value {
36 slice[start_byte] |= mask;
37 } else {
38 slice[start_byte] &= !mask;
39 }
40 } else {
41 if start_rem != 0 {
43 let mask = !((1u8 << start_rem) - 1);
44 if value {
45 slice[start_byte] |= mask;
46 } else {
47 slice[start_byte] &= !mask;
48 }
49 }
50
51 let fill_start = if start_rem != 0 {
53 start_byte + 1
54 } else {
55 start_byte
56 };
57 if fill_start < end_byte {
58 slice[fill_start..end_byte].fill(fill_byte);
59 }
60
61 if end_rem != 0 {
63 let mask = (1u8 << end_rem) - 1;
64 if value {
65 slice[end_byte] |= mask;
66 } else {
67 slice[end_byte] &= !mask;
68 }
69 }
70 }
71}
72
73#[derive(Debug, Clone)]
93pub struct BitBufferMut {
94 buffer: ByteBufferMut,
95 offset: usize,
99 len: usize,
100}
101
102impl BitBufferMut {
103 pub fn from_buffer(buffer: ByteBufferMut, offset: usize, len: usize) -> Self {
105 assert!(
106 len <= buffer.len() * 8,
107 "Buffer len {} is too short for the given length {len}",
108 buffer.len()
109 );
110 Self {
111 buffer,
112 offset,
113 len,
114 }
115 }
116
117 pub fn copy_from(bit_buffer: &BitBuffer) -> Self {
119 Self {
120 buffer: ByteBufferMut::copy_from(bit_buffer.inner()),
121 offset: bit_buffer.offset(),
122 len: bit_buffer.len(),
123 }
124 }
125
126 pub fn with_capacity(capacity: usize) -> Self {
128 Self {
129 buffer: BufferMut::with_capacity(capacity.div_ceil(8)),
130 offset: 0,
131 len: 0,
132 }
133 }
134
135 pub fn new_set(len: usize) -> Self {
137 Self {
138 buffer: buffer_mut![0xFF; len.div_ceil(8)],
139 offset: 0,
140 len,
141 }
142 }
143
144 pub fn new_unset(len: usize) -> Self {
146 Self {
147 buffer: BufferMut::zeroed(len.div_ceil(8)),
148 offset: 0,
149 len,
150 }
151 }
152
153 #[inline(always)]
155 pub fn empty() -> Self {
156 Self::with_capacity(0)
157 }
158
159 pub fn full(value: bool, len: usize) -> Self {
161 if value {
162 Self::new_set(len)
163 } else {
164 Self::new_unset(len)
165 }
166 }
167
168 pub fn from_indices(len: usize, indices: impl IntoIterator<Item = usize>) -> BitBufferMut {
170 let mut buffer = BufferMut::<u64>::zeroed(len.div_ceil(64));
171 for idx in indices {
172 assert!(idx < len, "index {idx} exceeds len {len}");
173 buffer.as_mut_slice()[idx / 64] |= 1 << (idx % 64);
174 }
175
176 let mut buffer = buffer.into_byte_buffer();
177 buffer.truncate(len.div_ceil(8));
178
179 Self {
180 buffer,
181 offset: 0,
182 len,
183 }
184 }
185
186 #[inline]
188 pub fn collect_bool<F: FnMut(usize) -> bool>(len: usize, f: F) -> Self {
189 let num_words = len.div_ceil(64);
190 let mut buffer: BufferMut<u64> = BufferMut::with_capacity(num_words);
191 unsafe { buffer.set_len(num_words) };
195 collect_bool_words(buffer.as_mut_slice(), len, f);
196
197 let mut bytes = buffer.into_byte_buffer();
198 bytes.truncate(len.div_ceil(8));
199
200 Self {
201 buffer: bytes,
202 offset: 0,
203 len,
204 }
205 }
206
207 pub fn inner(&self) -> &ByteBufferMut {
209 &self.buffer
210 }
211
212 pub fn into_inner(self) -> ByteBufferMut {
214 self.buffer
215 }
216
217 #[inline(always)]
219 pub fn len(&self) -> usize {
220 self.len
221 }
222
223 #[inline(always)]
225 pub fn is_empty(&self) -> bool {
226 self.len == 0
227 }
228
229 #[inline(always)]
231 pub fn offset(&self) -> usize {
232 self.offset
233 }
234
235 #[inline(always)]
237 pub fn value(&self, index: usize) -> bool {
238 assert!(index < self.len);
239 unsafe { self.value_unchecked(index) }
241 }
242
243 #[inline(always)]
249 pub unsafe fn value_unchecked(&self, index: usize) -> bool {
250 unsafe { get_bit_unchecked(self.buffer.as_ptr(), self.offset + index) }
251 }
252
253 #[inline(always)]
255 pub fn capacity(&self) -> usize {
256 (self.buffer.capacity() * 8) - self.offset
257 }
258
259 pub fn reserve(&mut self, additional: usize) {
261 let required_bits = self.offset + self.len + additional;
262 let required_bytes = required_bits.div_ceil(8); let additional_bytes = required_bytes.saturating_sub(self.buffer.len());
265 self.buffer.reserve(additional_bytes);
266 }
267
268 pub fn clear(&mut self) {
270 self.buffer.clear();
273 self.len = 0;
274 self.offset = 0;
275 }
276
277 #[inline]
281 pub fn set_to(&mut self, index: usize, value: bool) {
282 if value {
283 self.set(index);
284 } else {
285 self.unset(index);
286 }
287 }
288
289 #[inline]
295 pub unsafe fn set_to_unchecked(&mut self, index: usize, value: bool) {
296 if value {
297 unsafe { self.set_unchecked(index) }
299 } else {
300 unsafe { self.unset_unchecked(index) }
302 }
303 }
304
305 #[inline]
309 pub fn set(&mut self, index: usize) {
310 assert!(index < self.len, "index {index} exceeds len {}", self.len);
311
312 unsafe { self.set_unchecked(index) };
314 }
315
316 #[inline]
320 pub fn unset(&mut self, index: usize) {
321 assert!(index < self.len, "index {index} exceeds len {}", self.len);
322
323 unsafe { self.unset_unchecked(index) };
325 }
326
327 #[inline]
335 pub unsafe fn set_unchecked(&mut self, index: usize) {
336 unsafe { set_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
338 }
339
340 #[inline]
348 pub unsafe fn unset_unchecked(&mut self, index: usize) {
349 unsafe { unset_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
351 }
352
353 #[inline(always)]
360 pub unsafe fn set_len(&mut self, new_len: usize) {
361 debug_assert!(
362 new_len <= self.capacity(),
363 "`set_len` requires that new_len <= capacity()"
364 );
365
366 let bytes_len = (self.offset + new_len).div_ceil(8);
368 unsafe { self.buffer.set_len(bytes_len) };
369
370 self.len = new_len;
371 }
372
373 pub fn truncate(&mut self, len: usize) {
377 if len > self.len {
378 return;
379 }
380
381 let end_bit = self.offset + len;
382 let new_len_bytes = end_bit.div_ceil(8);
383 self.buffer.truncate(new_len_bytes);
384 self.len = len;
385
386 if !end_bit.is_multiple_of(8) {
389 let keep = (1u8 << (end_bit % 8)) - 1;
390 self.buffer.as_mut_slice()[new_len_bytes - 1] &= keep;
391 }
392 }
393
394 #[inline]
396 pub fn append(&mut self, value: bool) {
397 if value {
398 self.append_true()
399 } else {
400 self.append_false()
401 }
402 }
403
404 #[inline]
406 pub fn append_true(&mut self) {
407 let bit_pos = self.offset + self.len;
408 let byte_pos = bit_pos / 8;
409 let bit_in_byte = bit_pos % 8;
410
411 if byte_pos >= self.buffer.len() {
413 self.buffer.push(0u8);
414 }
415
416 self.buffer.as_mut_slice()[byte_pos] |= 1 << bit_in_byte;
418 self.len += 1;
419 }
420
421 #[inline]
423 pub fn append_false(&mut self) {
424 let bit_pos = self.offset + self.len;
425 let byte_pos = bit_pos / 8;
426
427 if byte_pos >= self.buffer.len() {
429 self.buffer.push(0u8);
430 }
431
432 self.len += 1;
435 }
436
437 #[inline]
442 pub fn append_n(&mut self, value: bool, n: usize) {
443 if n == 0 {
444 return;
445 }
446
447 let end_bit_pos = self.offset + self.len + n;
448 let required_bytes = end_bit_pos.div_ceil(8);
449
450 if required_bytes > self.buffer.len() {
452 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
453 }
454
455 let start = self.len;
456 self.len += n;
457 self.fill_range(start, self.len, value);
458 }
459
460 #[inline(always)]
465 pub fn fill_range(&mut self, start: usize, end: usize, value: bool) {
466 assert!(end <= self.len, "end {end} exceeds len {}", self.len);
467 assert!(start <= end, "start {start} exceeds end {end}");
468
469 unsafe { self.fill_range_unchecked(start, end, value) }
472 }
473
474 #[inline(always)]
480 pub unsafe fn fill_range_unchecked(&mut self, start: usize, end: usize, value: bool) {
481 fill_bits(
482 self.buffer.as_mut_slice(),
483 self.offset + start,
484 self.offset + end,
485 value,
486 );
487 }
488
489 pub fn append_buffer(&mut self, buffer: &BitBuffer) {
493 let bit_len = buffer.len();
494 if bit_len == 0 {
495 return;
496 }
497
498 let start_bit_pos = self.offset + self.len;
499 let end_bit_pos = start_bit_pos + bit_len;
500 let required_bytes = end_bit_pos.div_ceil(8);
501
502 if required_bytes > self.buffer.len() {
504 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
505 }
506
507 let dst_bit_offset = start_bit_pos % 8;
508 let src_bit_offset = buffer.offset();
509
510 if dst_bit_offset == 0 && src_bit_offset == 0 {
511 let dst_byte = start_bit_pos / 8;
513 let src_bytes = buffer.inner().as_slice();
514 let full_bytes = bit_len / 8;
515 self.buffer.as_mut_slice()[dst_byte..dst_byte + full_bytes]
516 .copy_from_slice(&src_bytes[..full_bytes]);
517 let rem = bit_len % 8;
518 if rem != 0 {
519 let mask = (1u8 << rem) - 1;
520 self.buffer.as_mut_slice()[dst_byte + full_bytes] |= src_bytes[full_bytes] & mask;
521 }
522 } else {
523 let self_slice = self
525 .buffer
526 .as_mut_slice()
527 .view_bits_mut::<bitvec::prelude::Lsb0>();
528 let other_slice = buffer
529 .inner()
530 .as_slice()
531 .view_bits::<bitvec::prelude::Lsb0>();
532 let source_range = src_bit_offset..src_bit_offset + bit_len;
533 self_slice[start_bit_pos..end_bit_pos].copy_from_bitslice(&other_slice[source_range]);
534 }
535
536 self.len += bit_len;
537 }
538
539 pub fn unsplit(&mut self, other: Self) {
547 if (self.offset + self.len).is_multiple_of(8) && other.offset == 0 {
548 self.buffer.unsplit(other.buffer);
550 self.len += other.len;
551 return;
552 }
553
554 self.append_buffer(&other.freeze())
556 }
557
558 pub fn freeze(self) -> BitBuffer {
560 BitBuffer::new_with_offset(self.buffer.freeze(), self.len, self.offset)
561 }
562
563 pub fn as_slice(&self) -> &[u8] {
565 self.buffer.as_slice()
566 }
567
568 pub fn as_mut_slice(&mut self) -> &mut [u8] {
570 self.buffer.as_mut_slice()
571 }
572}
573
574impl Default for BitBufferMut {
575 fn default() -> Self {
576 Self::with_capacity(0)
577 }
578}
579
580impl Not for BitBufferMut {
582 type Output = BitBufferMut;
583
584 #[inline]
585 fn not(mut self) -> Self::Output {
586 ops::bitwise_unary_op_mut(&mut self, |b| !b);
587 self
588 }
589}
590
591impl From<&[bool]> for BitBufferMut {
592 fn from(value: &[bool]) -> Self {
593 BitBufferMut::collect_bool(value.len(), |i| value[i])
594 }
595}
596
597impl From<&[u8]> for BitBufferMut {
599 fn from(value: &[u8]) -> Self {
600 BitBufferMut::collect_bool(value.len(), |i| value[i] > 0)
601 }
602}
603
604impl From<Vec<bool>> for BitBufferMut {
605 fn from(value: Vec<bool>) -> Self {
606 value.as_slice().into()
607 }
608}
609
610impl FromIterator<bool> for BitBufferMut {
611 #[inline]
612 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
613 let mut iter = iter.into_iter();
614
615 let (lower_bound, _) = iter.size_hint();
618
619 let mut buf = BitBufferMut::new_unset(lower_bound);
624 assert_eq!(buf.offset, 0);
625
626 let ptr = buf.buffer.as_mut_ptr();
628 for i in 0..lower_bound {
629 let Some(v) = iter.next() else {
630 unsafe { buf.set_len(i) };
633 return buf;
634 };
635
636 if v {
637 unsafe { set_bit_unchecked(ptr, i) }
639 }
640 }
641
642 for v in iter {
645 buf.append(v);
646 }
647
648 buf
649 }
650}
651
652#[cfg(test)]
653mod tests {
654 use rstest::rstest;
655
656 use crate::BufferMut;
657 use crate::bit::buf_mut::BitBufferMut;
658 use crate::bitbuffer;
659 use crate::bitbuffer_mut;
660 use crate::buffer_mut;
661
662 #[test]
663 fn test_bits_mut() {
664 let mut bools = bitbuffer_mut![false; 10];
665 bools.set_to(0, true);
666 bools.set_to(9, true);
667
668 let bools = bools.freeze();
669 assert!(bools.value(0));
670 for i in 1..=8 {
671 assert!(!bools.value(i));
672 }
673 assert!(bools.value(9));
674 }
675
676 #[test]
677 fn test_append_n() {
678 let mut bools = BitBufferMut::with_capacity(10);
679 assert_eq!(bools.len(), 0);
680 assert!(bools.is_empty());
681
682 bools.append(true);
683 bools.append_n(false, 8);
684 bools.append_n(true, 1);
685
686 let bools = bools.freeze();
687
688 assert_eq!(bools.true_count(), 2);
689 assert!(bools.value(0));
690 assert!(bools.value(9));
691 }
692
693 #[test]
694 fn append_false_after_truncate_reads_back_false() {
695 let mut bools = BitBufferMut::new_set(16);
698 bools.truncate(12);
699 bools.append_false();
700 bools.append_true();
701
702 let bools = bools.freeze();
703 assert_eq!(bools.len(), 14);
704 assert!(
705 !bools.value(12),
706 "appended false must read back false after truncate"
707 );
708 assert!(bools.value(13));
709 }
710
711 #[test]
712 fn test_reserve_ensures_len_plus_additional() {
713 let mut bits = BitBufferMut::with_capacity(10);
717 assert_eq!(bits.len(), 0);
718
719 bits.reserve(100);
720
721 assert!(bits.capacity() >= 100);
723
724 bits.append_n(true, 50);
725 assert_eq!(bits.len(), 50);
726
727 bits.reserve(100);
728
729 assert!(bits.capacity() >= 150);
731 }
732
733 #[test]
734 fn test_with_offset_zero() {
735 let buf = BufferMut::zeroed(2);
737 let mut bit_buf = BitBufferMut::from_buffer(buf, 0, 16);
738
739 bit_buf.set(0);
741 bit_buf.set(7);
742 bit_buf.set(8);
743 bit_buf.set(15);
744
745 assert!(bit_buf.value(0));
747 assert!(bit_buf.value(7));
748 assert!(bit_buf.value(8));
749 assert!(bit_buf.value(15));
750 assert!(!bit_buf.value(1));
751 assert!(!bit_buf.value(9));
752
753 assert_eq!(bit_buf.as_slice()[0], 0b10000001);
755 assert_eq!(bit_buf.as_slice()[1], 0b10000001);
756 }
757
758 #[test]
759 fn test_with_offset_within_byte() {
760 let buf = buffer_mut![0b11111111, 0b00000000, 0b00000000];
762 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 10);
763
764 assert!(bit_buf.value(0)); assert!(bit_buf.value(4)); assert!(!bit_buf.value(5)); bit_buf.set(7);
772 assert!(bit_buf.value(7));
773
774 bit_buf.unset(0);
776 assert!(!bit_buf.value(0));
777 }
778
779 #[test]
780 fn test_with_offset_byte_boundary() {
781 let buf = buffer_mut![0xFF, 0x00, 0xFF];
783 let mut bit_buf = BitBufferMut::from_buffer(buf, 8, 16);
784
785 for i in 0..8 {
787 assert!(!bit_buf.value(i));
788 }
789 for i in 8..16 {
791 assert!(bit_buf.value(i));
792 }
793
794 bit_buf.set(0);
796 bit_buf.set(3);
797 assert!(bit_buf.value(0));
798 assert!(bit_buf.value(3));
799 }
800
801 #[test]
802 fn test_with_large_offset() {
803 let buf = buffer_mut![0xFF, 0xFF, 0xFF, 0xFF];
805 let mut bit_buf = BitBufferMut::from_buffer(buf, 13, 10);
806
807 for i in 0..10 {
809 assert!(bit_buf.value(i));
810 }
811
812 bit_buf.unset(0);
814 bit_buf.unset(5);
815 bit_buf.unset(9);
816
817 assert!(!bit_buf.value(0));
818 assert!(bit_buf.value(1));
819 assert!(!bit_buf.value(5));
820 assert!(!bit_buf.value(9));
821 }
822
823 #[test]
824 fn test_append_with_offset() {
825 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);
835 assert!(!bit_buf.value(0));
836 assert!(bit_buf.value(1));
837 assert!(bit_buf.value(2));
838 }
839
840 #[test]
841 fn test_append_n_with_offset_crossing_boundary() {
842 let buf = BufferMut::zeroed(4);
844 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
845
846 bit_buf.append_n(true, 10); assert_eq!(bit_buf.len(), 10);
850 for i in 0..10 {
851 assert!(bit_buf.value(i));
852 }
853
854 assert_eq!(bit_buf.as_slice()[0], 0b11100000);
858 assert_eq!(bit_buf.as_slice()[1], 0b01111111);
859 }
860
861 #[test]
862 fn test_truncate_with_offset() {
863 let buf = buffer_mut![0xFF, 0xFF];
864 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 12);
865
866 assert_eq!(bit_buf.len(), 12);
867
868 bit_buf.truncate(8);
870 assert_eq!(bit_buf.len(), 8);
871
872 bit_buf.truncate(3);
874 assert_eq!(bit_buf.len(), 3);
875
876 bit_buf.truncate(10);
878 assert_eq!(bit_buf.len(), 3);
879 }
880
881 #[test]
882 fn test_capacity_with_offset() {
883 let buf = buffer_mut![0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
886
887 assert!(bit_buf.capacity() >= 75);
890 assert_eq!(bit_buf.capacity() % 8, (80 - 5) % 8);
892 }
893
894 #[test]
895 fn test_reserve_with_offset() {
896 let buf = buffer_mut![0, 0]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
899
900 let initial_capacity = bit_buf.capacity();
902 assert!(initial_capacity >= 13);
903
904 bit_buf.reserve(20);
906
907 assert!(bit_buf.capacity() >= 20);
909 }
910
911 #[test]
912 fn test_freeze_with_offset() {
913 let buf = buffer_mut![0b11110000, 0b00001111];
914 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
915
916 bit_buf.set(0);
918 bit_buf.set(7);
919
920 let frozen = bit_buf.freeze();
922 assert_eq!(frozen.offset(), 4);
923 assert_eq!(frozen.len(), 8);
924
925 assert!(frozen.value(0));
927 assert!(frozen.value(7));
928 }
929
930 #[cfg_attr(miri, ignore)] #[test]
932 fn append_after_clear_reads_back_false() {
933 let mut bools = BitBufferMut::new_set(16);
936 bools.clear();
937 bools.append_false();
938 bools.append_buffer(&crate::BitBuffer::new_unset(8));
939
940 let bools = bools.freeze();
941 assert_eq!(bools.len(), 9);
942 assert_eq!(bools.true_count(), 0);
943 }
944
945 #[cfg_attr(miri, ignore)] #[test]
947 fn test_append_buffer_after_truncate() {
948 let mut buf = BitBufferMut::new_set(16);
951 buf.truncate(3);
952 buf.append_buffer(&crate::BitBuffer::new_unset(8));
953
954 let frozen = buf.freeze();
955 assert_eq!(frozen.len(), 11);
956 for i in 0..3 {
957 assert!(frozen.value(i), "bit {i} should be set");
958 }
959 for i in 3..11 {
960 assert!(!frozen.value(i), "bit {i} should be unset");
961 }
962 }
963
964 #[rstest]
965 #[case::both_aligned(0, 0)]
966 #[case::dst_unaligned(3, 0)]
967 #[case::src_unaligned(0, 5)]
968 #[case::mismatched(3, 5)]
969 #[case::equal_nonzero(5, 5)]
970 #[cfg_attr(miri, ignore)] fn test_append_buffer_long(#[case] dst_prefix: usize, #[case] src_start: usize) {
972 let source = crate::BitBuffer::from_iter((0..301).map(|i| i % 3 == 0));
974 let source = source.slice(src_start..301);
975
976 let mut dest = BitBufferMut::with_capacity(512);
977 dest.append_n(true, dst_prefix);
978 dest.append_buffer(&source);
979
980 assert_eq!(dest.len(), dst_prefix + source.len());
981 for i in 0..dst_prefix {
982 assert!(dest.value(i), "prefix bit {i}");
983 }
984 for i in 0..source.len() {
985 assert_eq!(dest.value(dst_prefix + i), source.value(i), "bit {i}");
986 }
987 }
988
989 #[cfg_attr(miri, ignore)] #[test]
991 fn test_append_buffer_with_offsets() {
992 let source = bitbuffer![false, false, true, true, false, true];
994
995 let buf = BufferMut::zeroed(4);
997 let mut dest = BitBufferMut::from_buffer(buf, 3, 0);
998
999 dest.append(true);
1001 dest.append(false);
1002
1003 dest.append_buffer(&source);
1005
1006 assert_eq!(dest.len(), 8);
1007 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)); }
1016
1017 #[test]
1018 fn test_set_unset_unchecked_with_offset() {
1019 let buf = BufferMut::zeroed(3);
1020 let mut bit_buf = BitBufferMut::from_buffer(buf, 7, 10);
1021
1022 unsafe {
1023 bit_buf.set_unchecked(0);
1024 bit_buf.set_unchecked(5);
1025 bit_buf.set_unchecked(9);
1026 }
1027
1028 assert!(bit_buf.value(0));
1029 assert!(bit_buf.value(5));
1030 assert!(bit_buf.value(9));
1031
1032 unsafe {
1033 bit_buf.unset_unchecked(5);
1034 }
1035
1036 assert!(!bit_buf.value(5));
1037 }
1038
1039 #[test]
1040 fn test_value_unchecked_with_offset() {
1041 let buf = buffer_mut![0b11110000, 0b00001111];
1042 let bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
1043
1044 unsafe {
1045 assert!(bit_buf.value_unchecked(0));
1047 assert!(bit_buf.value_unchecked(3));
1048
1049 assert!(bit_buf.value_unchecked(4));
1051 assert!(bit_buf.value_unchecked(7));
1052 }
1053 }
1054
1055 #[test]
1056 fn test_append_alternating_with_offset() {
1057 let buf = BufferMut::zeroed(4);
1058 let mut bit_buf = BitBufferMut::from_buffer(buf, 2, 0);
1059
1060 for i in 0..20 {
1062 bit_buf.append(i % 2 == 0);
1063 }
1064
1065 assert_eq!(bit_buf.len(), 20);
1066 for i in 0..20 {
1067 assert_eq!(bit_buf.value(i), i % 2 == 0);
1068 }
1069 }
1070
1071 #[test]
1072 fn test_new_set_new_unset() {
1073 let set_buf = bitbuffer_mut![true; 10];
1074 let unset_buf = bitbuffer_mut![false; 10];
1075
1076 for i in 0..10 {
1077 assert!(set_buf.value(i));
1078 assert!(!unset_buf.value(i));
1079 }
1080
1081 assert_eq!(set_buf.len(), 10);
1082 assert_eq!(unset_buf.len(), 10);
1083 }
1084
1085 #[test]
1086 fn test_append_n_false_with_offset() {
1087 let buf = BufferMut::zeroed(4);
1088 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1089
1090 bit_buf.append_n(false, 15);
1091
1092 assert_eq!(bit_buf.len(), 15);
1093 for i in 0..15 {
1094 assert!(!bit_buf.value(i));
1095 }
1096 }
1097
1098 #[test]
1099 fn test_append_n_true_with_offset() {
1100 let buf = BufferMut::zeroed(4);
1101 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1102
1103 bit_buf.append_n(true, 15);
1104
1105 assert_eq!(bit_buf.len(), 15);
1106 for i in 0..15 {
1107 assert!(bit_buf.value(i));
1108 }
1109 }
1110
1111 #[test]
1112 fn test_mixed_operations_with_offset() {
1113 let buf = BufferMut::zeroed(5);
1115 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
1116
1117 bit_buf.append_n(true, 5);
1119 bit_buf.append_n(false, 3);
1120 bit_buf.append(true);
1121
1122 assert_eq!(bit_buf.len(), 9);
1123
1124 bit_buf.set(6); bit_buf.unset(2); assert!(bit_buf.value(0));
1130 assert!(bit_buf.value(1));
1131 assert!(!bit_buf.value(2)); assert!(bit_buf.value(3));
1133 assert!(bit_buf.value(4));
1134 assert!(!bit_buf.value(5));
1135 assert!(bit_buf.value(6)); assert!(!bit_buf.value(7));
1137 assert!(bit_buf.value(8));
1138
1139 bit_buf.truncate(6);
1141 assert_eq!(bit_buf.len(), 6);
1142
1143 let frozen = bit_buf.freeze();
1145 assert_eq!(frozen.offset(), 3);
1146 assert_eq!(frozen.len(), 6);
1147 }
1148
1149 #[test]
1150 fn test_from_iterator_with_incorrect_size_hint() {
1151 struct LyingIterator {
1158 values: Vec<bool>,
1159 index: usize,
1160 }
1161
1162 impl Iterator for LyingIterator {
1163 type Item = bool;
1164
1165 fn next(&mut self) -> Option<Self::Item> {
1166 (self.index < self.values.len()).then(|| {
1167 let val = self.values[self.index];
1168 self.index += 1;
1169 val
1170 })
1171 }
1172
1173 fn size_hint(&self) -> (usize, Option<usize>) {
1174 let remaining = self.values.len() - self.index;
1177 let lower = remaining.min(5); let upper = Some(5); (lower, upper)
1180 }
1181 }
1182
1183 let lying_iter = LyingIterator {
1185 values: vec![
1186 true, false, true, false, true, false, true, false, true, false,
1187 ],
1188 index: 0,
1189 };
1190
1191 let bit_buf: BitBufferMut = lying_iter.collect();
1194
1195 assert_eq!(bit_buf.len(), 10);
1197 for i in 0..10 {
1198 assert_eq!(bit_buf.value(i), i % 2 == 0);
1199 }
1200 }
1201}