1use std::ops::Not;
5
6use bitvec::view::BitView;
7
8use crate::BitBuffer;
9use crate::BufferMut;
10use crate::ByteBufferMut;
11use crate::bit::get_bit_unchecked;
12use crate::bit::ops;
13use crate::bit::set_bit_unchecked;
14use crate::bit::unset_bit_unchecked;
15use crate::buffer_mut;
16
17#[inline(always)]
19fn fill_bits(slice: &mut [u8], start_bit: usize, end_bit: usize, value: bool) {
20 if start_bit >= end_bit {
21 return;
22 }
23
24 let fill_byte: u8 = if value { 0xFF } else { 0x00 };
25
26 let start_byte = start_bit / 8;
27 let start_rem = start_bit % 8;
28 let end_byte = end_bit / 8;
29 let end_rem = end_bit % 8;
30
31 if start_byte == end_byte {
32 let mask = ((1u8 << (end_rem - start_rem)) - 1) << start_rem;
34 if value {
35 slice[start_byte] |= mask;
36 } else {
37 slice[start_byte] &= !mask;
38 }
39 } else {
40 if start_rem != 0 {
42 let mask = !((1u8 << start_rem) - 1);
43 if value {
44 slice[start_byte] |= mask;
45 } else {
46 slice[start_byte] &= !mask;
47 }
48 }
49
50 let fill_start = if start_rem != 0 {
52 start_byte + 1
53 } else {
54 start_byte
55 };
56 if fill_start < end_byte {
57 slice[fill_start..end_byte].fill(fill_byte);
58 }
59
60 if end_rem != 0 {
62 let mask = (1u8 << end_rem) - 1;
63 if value {
64 slice[end_byte] |= mask;
65 } else {
66 slice[end_byte] &= !mask;
67 }
68 }
69 }
70}
71
72#[derive(Debug, Clone)]
92pub struct BitBufferMut {
93 buffer: ByteBufferMut,
94 offset: usize,
98 len: usize,
99}
100
101impl BitBufferMut {
102 pub fn from_buffer(buffer: ByteBufferMut, offset: usize, len: usize) -> Self {
104 assert!(
105 len <= buffer.len() * 8,
106 "Buffer len {} is too short for the given length {len}",
107 buffer.len()
108 );
109 Self {
110 buffer,
111 offset,
112 len,
113 }
114 }
115
116 pub fn copy_from(bit_buffer: &BitBuffer) -> Self {
118 Self {
119 buffer: ByteBufferMut::copy_from(bit_buffer.inner()),
120 offset: bit_buffer.offset(),
121 len: bit_buffer.len(),
122 }
123 }
124
125 pub fn with_capacity(capacity: usize) -> Self {
127 Self {
128 buffer: BufferMut::with_capacity(capacity.div_ceil(8)),
129 offset: 0,
130 len: 0,
131 }
132 }
133
134 pub fn new_set(len: usize) -> Self {
136 Self {
137 buffer: buffer_mut![0xFF; len.div_ceil(8)],
138 offset: 0,
139 len,
140 }
141 }
142
143 pub fn new_unset(len: usize) -> Self {
145 Self {
146 buffer: BufferMut::zeroed(len.div_ceil(8)),
147 offset: 0,
148 len,
149 }
150 }
151
152 #[inline(always)]
154 pub fn empty() -> Self {
155 Self::with_capacity(0)
156 }
157
158 pub fn full(value: bool, len: usize) -> Self {
160 if value {
161 Self::new_set(len)
162 } else {
163 Self::new_unset(len)
164 }
165 }
166
167 pub fn from_indices(len: usize, indices: &[usize]) -> BitBufferMut {
169 let mut buf = BitBufferMut::new_unset(len);
170 indices.iter().for_each(|&idx| buf.set(idx));
172 buf
173 }
174
175 #[inline]
177 pub fn collect_bool<F: FnMut(usize) -> bool>(len: usize, mut f: F) -> Self {
178 let mut buffer = BufferMut::with_capacity(len.div_ceil(64) * 8);
179
180 let chunks = len / 64;
181 let remainder = len % 64;
182 for chunk in 0..chunks {
183 let mut packed = 0;
184 for bit_idx in 0..64 {
185 let i = bit_idx + chunk * 64;
186 packed |= (f(i) as u64) << bit_idx;
187 }
188
189 unsafe { buffer.push_unchecked(packed) }
191 }
192
193 if remainder != 0 {
194 let mut packed = 0;
195 for bit_idx in 0..remainder {
196 let i = bit_idx + chunks * 64;
197 packed |= (f(i) as u64) << bit_idx;
198 }
199
200 unsafe { buffer.push_unchecked(packed) }
202 }
203
204 buffer.truncate(len.div_ceil(8));
205
206 Self {
207 buffer: buffer.into_byte_buffer(),
208 offset: 0,
209 len,
210 }
211 }
212
213 pub fn inner(&self) -> &ByteBufferMut {
215 &self.buffer
216 }
217
218 pub fn into_inner(self) -> ByteBufferMut {
220 self.buffer
221 }
222
223 #[inline(always)]
225 pub fn len(&self) -> usize {
226 self.len
227 }
228
229 #[inline(always)]
231 pub fn is_empty(&self) -> bool {
232 self.len == 0
233 }
234
235 #[inline(always)]
237 pub fn offset(&self) -> usize {
238 self.offset
239 }
240
241 #[inline(always)]
243 pub fn value(&self, index: usize) -> bool {
244 assert!(index < self.len);
245 unsafe { self.value_unchecked(index) }
247 }
248
249 #[inline(always)]
255 pub unsafe fn value_unchecked(&self, index: usize) -> bool {
256 unsafe { get_bit_unchecked(self.buffer.as_ptr(), self.offset + index) }
257 }
258
259 #[inline(always)]
261 pub fn capacity(&self) -> usize {
262 (self.buffer.capacity() * 8) - self.offset
263 }
264
265 pub fn reserve(&mut self, additional: usize) {
267 let required_bits = self.offset + self.len + additional;
268 let required_bytes = required_bits.div_ceil(8); let additional_bytes = required_bytes.saturating_sub(self.buffer.len());
271 self.buffer.reserve(additional_bytes);
272 }
273
274 pub fn clear(&mut self) {
276 self.len = 0;
278 self.offset = 0;
279 }
280
281 pub fn set_to(&mut self, index: usize, value: bool) {
285 if value {
286 self.set(index);
287 } else {
288 self.unset(index);
289 }
290 }
291
292 pub unsafe fn set_to_unchecked(&mut self, index: usize, value: bool) {
298 if value {
299 unsafe { self.set_unchecked(index) }
301 } else {
302 unsafe { self.unset_unchecked(index) }
304 }
305 }
306
307 pub fn set(&mut self, index: usize) {
311 assert!(index < self.len, "index {index} exceeds len {}", self.len);
312
313 unsafe { self.set_unchecked(index) };
315 }
316
317 #[inline]
321 pub fn unset(&mut self, index: usize) {
322 assert!(index < self.len, "index {index} exceeds len {}", self.len);
323
324 unsafe { self.unset_unchecked(index) };
326 }
327
328 #[inline]
336 pub unsafe fn set_unchecked(&mut self, index: usize) {
337 unsafe { set_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
339 }
340
341 #[inline]
349 pub unsafe fn unset_unchecked(&mut self, index: usize) {
350 unsafe { unset_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
352 }
353
354 #[inline(always)]
361 pub unsafe fn set_len(&mut self, new_len: usize) {
362 debug_assert!(
363 new_len <= self.capacity(),
364 "`set_len` requires that new_len <= capacity()"
365 );
366
367 let bytes_len = (self.offset + new_len).div_ceil(8);
369 unsafe { self.buffer.set_len(bytes_len) };
370
371 self.len = new_len;
372 }
373
374 pub fn truncate(&mut self, len: usize) {
378 if len > self.len {
379 return;
380 }
381
382 let new_len_bytes = (self.offset + len).div_ceil(8);
383 self.buffer.truncate(new_len_bytes);
384 self.len = len;
385 }
386
387 pub fn append(&mut self, value: bool) {
389 if value {
390 self.append_true()
391 } else {
392 self.append_false()
393 }
394 }
395
396 pub fn append_true(&mut self) {
398 let bit_pos = self.offset + self.len;
399 let byte_pos = bit_pos / 8;
400 let bit_in_byte = bit_pos % 8;
401
402 if byte_pos >= self.buffer.len() {
404 self.buffer.push(0u8);
405 }
406
407 self.buffer.as_mut_slice()[byte_pos] |= 1 << bit_in_byte;
409 self.len += 1;
410 }
411
412 pub fn append_false(&mut self) {
414 let bit_pos = self.offset + self.len;
415 let byte_pos = bit_pos / 8;
416 let bit_in_byte = bit_pos % 8;
417
418 if byte_pos >= self.buffer.len() {
420 self.buffer.push(0u8);
421 }
422
423 if bit_in_byte != 0 {
425 self.buffer.as_mut_slice()[byte_pos] &= !(1 << bit_in_byte);
426 }
427
428 self.len += 1;
429 }
430
431 #[inline]
436 pub fn append_n(&mut self, value: bool, n: usize) {
437 if n == 0 {
438 return;
439 }
440
441 let end_bit_pos = self.offset + self.len + n;
442 let required_bytes = end_bit_pos.div_ceil(8);
443
444 if required_bytes > self.buffer.len() {
446 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
447 }
448
449 let start = self.len;
450 self.len += n;
451 self.fill_range(start, self.len, value);
452 }
453
454 #[inline(always)]
459 pub fn fill_range(&mut self, start: usize, end: usize, value: bool) {
460 assert!(end <= self.len, "end {end} exceeds len {}", self.len);
461 assert!(start <= end, "start {start} exceeds end {end}");
462
463 unsafe { self.fill_range_unchecked(start, end, value) }
466 }
467
468 #[inline(always)]
474 pub unsafe fn fill_range_unchecked(&mut self, start: usize, end: usize, value: bool) {
475 fill_bits(
476 self.buffer.as_mut_slice(),
477 self.offset + start,
478 self.offset + end,
479 value,
480 );
481 }
482
483 pub fn append_buffer(&mut self, buffer: &BitBuffer) {
487 let bit_len = buffer.len();
488 if bit_len == 0 {
489 return;
490 }
491
492 let start_bit_pos = self.offset + self.len;
493 let end_bit_pos = start_bit_pos + bit_len;
494 let required_bytes = end_bit_pos.div_ceil(8);
495
496 if required_bytes > self.buffer.len() {
498 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
499 }
500
501 let self_slice = self
503 .buffer
504 .as_mut_slice()
505 .view_bits_mut::<bitvec::prelude::Lsb0>();
506 let other_slice = buffer
507 .inner()
508 .as_slice()
509 .view_bits::<bitvec::prelude::Lsb0>();
510
511 let source_range = buffer.offset()..buffer.offset() + bit_len;
513 self_slice[start_bit_pos..end_bit_pos].copy_from_bitslice(&other_slice[source_range]);
514
515 self.len += bit_len;
516 }
517
518 pub fn unsplit(&mut self, other: Self) {
526 if (self.offset + self.len).is_multiple_of(8) && other.offset == 0 {
527 self.buffer.unsplit(other.buffer);
529 self.len += other.len;
530 return;
531 }
532
533 self.append_buffer(&other.freeze())
535 }
536
537 pub fn freeze(self) -> BitBuffer {
539 BitBuffer::new_with_offset(self.buffer.freeze(), self.len, self.offset)
540 }
541
542 pub fn as_slice(&self) -> &[u8] {
544 self.buffer.as_slice()
545 }
546
547 pub fn as_mut_slice(&mut self) -> &mut [u8] {
549 self.buffer.as_mut_slice()
550 }
551}
552
553impl Default for BitBufferMut {
554 fn default() -> Self {
555 Self::with_capacity(0)
556 }
557}
558
559impl Not for BitBufferMut {
561 type Output = BitBufferMut;
562
563 #[inline]
564 fn not(mut self) -> Self::Output {
565 ops::bitwise_unary_op_mut(&mut self, |b| !b);
566 self
567 }
568}
569
570impl From<&[bool]> for BitBufferMut {
571 fn from(value: &[bool]) -> Self {
572 BitBufferMut::collect_bool(value.len(), |i| value[i])
573 }
574}
575
576impl From<&[u8]> for BitBufferMut {
578 fn from(value: &[u8]) -> Self {
579 BitBufferMut::collect_bool(value.len(), |i| value[i] > 0)
580 }
581}
582
583impl From<Vec<bool>> for BitBufferMut {
584 fn from(value: Vec<bool>) -> Self {
585 value.as_slice().into()
586 }
587}
588
589impl FromIterator<bool> for BitBufferMut {
590 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
591 let mut iter = iter.into_iter();
592
593 let (lower_bound, _) = iter.size_hint();
596
597 let mut buf = BitBufferMut::new_unset(lower_bound);
602 assert_eq!(buf.offset, 0);
603
604 let ptr = buf.buffer.as_mut_ptr();
606 for i in 0..lower_bound {
607 let Some(v) = iter.next() else {
608 unsafe { buf.set_len(i) };
611 return buf;
612 };
613
614 if v {
615 unsafe { set_bit_unchecked(ptr, i) }
617 }
618 }
619
620 for v in iter {
622 buf.append(v);
623 }
624
625 buf
626 }
627}
628
629#[cfg(test)]
630mod tests {
631 use crate::BufferMut;
632 use crate::bit::buf_mut::BitBufferMut;
633 use crate::bitbuffer;
634 use crate::bitbuffer_mut;
635 use crate::buffer_mut;
636
637 #[test]
638 fn test_bits_mut() {
639 let mut bools = bitbuffer_mut![false; 10];
640 bools.set_to(0, true);
641 bools.set_to(9, true);
642
643 let bools = bools.freeze();
644 assert!(bools.value(0));
645 for i in 1..=8 {
646 assert!(!bools.value(i));
647 }
648 assert!(bools.value(9));
649 }
650
651 #[test]
652 fn test_append_n() {
653 let mut bools = BitBufferMut::with_capacity(10);
654 assert_eq!(bools.len(), 0);
655 assert!(bools.is_empty());
656
657 bools.append(true);
658 bools.append_n(false, 8);
659 bools.append_n(true, 1);
660
661 let bools = bools.freeze();
662
663 assert_eq!(bools.true_count(), 2);
664 assert!(bools.value(0));
665 assert!(bools.value(9));
666 }
667
668 #[test]
669 fn test_reserve_ensures_len_plus_additional() {
670 let mut bits = BitBufferMut::with_capacity(10);
674 assert_eq!(bits.len(), 0);
675
676 bits.reserve(100);
677
678 assert!(bits.capacity() >= 100);
680
681 bits.append_n(true, 50);
682 assert_eq!(bits.len(), 50);
683
684 bits.reserve(100);
685
686 assert!(bits.capacity() >= 150);
688 }
689
690 #[test]
691 fn test_with_offset_zero() {
692 let buf = BufferMut::zeroed(2);
694 let mut bit_buf = BitBufferMut::from_buffer(buf, 0, 16);
695
696 bit_buf.set(0);
698 bit_buf.set(7);
699 bit_buf.set(8);
700 bit_buf.set(15);
701
702 assert!(bit_buf.value(0));
704 assert!(bit_buf.value(7));
705 assert!(bit_buf.value(8));
706 assert!(bit_buf.value(15));
707 assert!(!bit_buf.value(1));
708 assert!(!bit_buf.value(9));
709
710 assert_eq!(bit_buf.as_slice()[0], 0b10000001);
712 assert_eq!(bit_buf.as_slice()[1], 0b10000001);
713 }
714
715 #[test]
716 fn test_with_offset_within_byte() {
717 let buf = buffer_mut![0b11111111, 0b00000000, 0b00000000];
719 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 10);
720
721 assert!(bit_buf.value(0)); assert!(bit_buf.value(4)); assert!(!bit_buf.value(5)); bit_buf.set(7);
729 assert!(bit_buf.value(7));
730
731 bit_buf.unset(0);
733 assert!(!bit_buf.value(0));
734 }
735
736 #[test]
737 fn test_with_offset_byte_boundary() {
738 let buf = buffer_mut![0xFF, 0x00, 0xFF];
740 let mut bit_buf = BitBufferMut::from_buffer(buf, 8, 16);
741
742 for i in 0..8 {
744 assert!(!bit_buf.value(i));
745 }
746 for i in 8..16 {
748 assert!(bit_buf.value(i));
749 }
750
751 bit_buf.set(0);
753 bit_buf.set(3);
754 assert!(bit_buf.value(0));
755 assert!(bit_buf.value(3));
756 }
757
758 #[test]
759 fn test_with_large_offset() {
760 let buf = buffer_mut![0xFF, 0xFF, 0xFF, 0xFF];
762 let mut bit_buf = BitBufferMut::from_buffer(buf, 13, 10);
763
764 for i in 0..10 {
766 assert!(bit_buf.value(i));
767 }
768
769 bit_buf.unset(0);
771 bit_buf.unset(5);
772 bit_buf.unset(9);
773
774 assert!(!bit_buf.value(0));
775 assert!(bit_buf.value(1));
776 assert!(!bit_buf.value(5));
777 assert!(!bit_buf.value(9));
778 }
779
780 #[test]
781 fn test_append_with_offset() {
782 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);
792 assert!(!bit_buf.value(0));
793 assert!(bit_buf.value(1));
794 assert!(bit_buf.value(2));
795 }
796
797 #[test]
798 fn test_append_n_with_offset_crossing_boundary() {
799 let buf = BufferMut::zeroed(4);
801 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
802
803 bit_buf.append_n(true, 10); assert_eq!(bit_buf.len(), 10);
807 for i in 0..10 {
808 assert!(bit_buf.value(i));
809 }
810
811 assert_eq!(bit_buf.as_slice()[0], 0b11100000);
815 assert_eq!(bit_buf.as_slice()[1], 0b01111111);
816 }
817
818 #[test]
819 fn test_truncate_with_offset() {
820 let buf = buffer_mut![0xFF, 0xFF];
821 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 12);
822
823 assert_eq!(bit_buf.len(), 12);
824
825 bit_buf.truncate(8);
827 assert_eq!(bit_buf.len(), 8);
828
829 bit_buf.truncate(3);
831 assert_eq!(bit_buf.len(), 3);
832
833 bit_buf.truncate(10);
835 assert_eq!(bit_buf.len(), 3);
836 }
837
838 #[test]
839 fn test_capacity_with_offset() {
840 let buf = buffer_mut![0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
843
844 assert!(bit_buf.capacity() >= 75);
847 assert_eq!(bit_buf.capacity() % 8, (80 - 5) % 8);
849 }
850
851 #[test]
852 fn test_reserve_with_offset() {
853 let buf = buffer_mut![0, 0]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
856
857 let initial_capacity = bit_buf.capacity();
859 assert!(initial_capacity >= 13);
860
861 bit_buf.reserve(20);
863
864 assert!(bit_buf.capacity() >= 20);
866 }
867
868 #[test]
869 fn test_freeze_with_offset() {
870 let buf = buffer_mut![0b11110000, 0b00001111];
871 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
872
873 bit_buf.set(0);
875 bit_buf.set(7);
876
877 let frozen = bit_buf.freeze();
879 assert_eq!(frozen.offset(), 4);
880 assert_eq!(frozen.len(), 8);
881
882 assert!(frozen.value(0));
884 assert!(frozen.value(7));
885 }
886
887 #[cfg_attr(miri, ignore)] #[test]
889 fn test_append_buffer_with_offsets() {
890 let source = bitbuffer![false, false, true, true, false, true];
892
893 let buf = BufferMut::zeroed(4);
895 let mut dest = BitBufferMut::from_buffer(buf, 3, 0);
896
897 dest.append(true);
899 dest.append(false);
900
901 dest.append_buffer(&source);
903
904 assert_eq!(dest.len(), 8);
905 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)); }
914
915 #[test]
916 fn test_set_unset_unchecked_with_offset() {
917 let buf = BufferMut::zeroed(3);
918 let mut bit_buf = BitBufferMut::from_buffer(buf, 7, 10);
919
920 unsafe {
921 bit_buf.set_unchecked(0);
922 bit_buf.set_unchecked(5);
923 bit_buf.set_unchecked(9);
924 }
925
926 assert!(bit_buf.value(0));
927 assert!(bit_buf.value(5));
928 assert!(bit_buf.value(9));
929
930 unsafe {
931 bit_buf.unset_unchecked(5);
932 }
933
934 assert!(!bit_buf.value(5));
935 }
936
937 #[test]
938 fn test_value_unchecked_with_offset() {
939 let buf = buffer_mut![0b11110000, 0b00001111];
940 let bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
941
942 unsafe {
943 assert!(bit_buf.value_unchecked(0));
945 assert!(bit_buf.value_unchecked(3));
946
947 assert!(bit_buf.value_unchecked(4));
949 assert!(bit_buf.value_unchecked(7));
950 }
951 }
952
953 #[test]
954 fn test_append_alternating_with_offset() {
955 let buf = BufferMut::zeroed(4);
956 let mut bit_buf = BitBufferMut::from_buffer(buf, 2, 0);
957
958 for i in 0..20 {
960 bit_buf.append(i % 2 == 0);
961 }
962
963 assert_eq!(bit_buf.len(), 20);
964 for i in 0..20 {
965 assert_eq!(bit_buf.value(i), i % 2 == 0);
966 }
967 }
968
969 #[test]
970 fn test_new_set_new_unset() {
971 let set_buf = bitbuffer_mut![true; 10];
972 let unset_buf = bitbuffer_mut![false; 10];
973
974 for i in 0..10 {
975 assert!(set_buf.value(i));
976 assert!(!unset_buf.value(i));
977 }
978
979 assert_eq!(set_buf.len(), 10);
980 assert_eq!(unset_buf.len(), 10);
981 }
982
983 #[test]
984 fn test_append_n_false_with_offset() {
985 let buf = BufferMut::zeroed(4);
986 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
987
988 bit_buf.append_n(false, 15);
989
990 assert_eq!(bit_buf.len(), 15);
991 for i in 0..15 {
992 assert!(!bit_buf.value(i));
993 }
994 }
995
996 #[test]
997 fn test_append_n_true_with_offset() {
998 let buf = BufferMut::zeroed(4);
999 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1000
1001 bit_buf.append_n(true, 15);
1002
1003 assert_eq!(bit_buf.len(), 15);
1004 for i in 0..15 {
1005 assert!(bit_buf.value(i));
1006 }
1007 }
1008
1009 #[test]
1010 fn test_mixed_operations_with_offset() {
1011 let buf = BufferMut::zeroed(5);
1013 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
1014
1015 bit_buf.append_n(true, 5);
1017 bit_buf.append_n(false, 3);
1018 bit_buf.append(true);
1019
1020 assert_eq!(bit_buf.len(), 9);
1021
1022 bit_buf.set(6); bit_buf.unset(2); assert!(bit_buf.value(0));
1028 assert!(bit_buf.value(1));
1029 assert!(!bit_buf.value(2)); assert!(bit_buf.value(3));
1031 assert!(bit_buf.value(4));
1032 assert!(!bit_buf.value(5));
1033 assert!(bit_buf.value(6)); assert!(!bit_buf.value(7));
1035 assert!(bit_buf.value(8));
1036
1037 bit_buf.truncate(6);
1039 assert_eq!(bit_buf.len(), 6);
1040
1041 let frozen = bit_buf.freeze();
1043 assert_eq!(frozen.offset(), 3);
1044 assert_eq!(frozen.len(), 6);
1045 }
1046
1047 #[test]
1048 fn test_from_iterator_with_incorrect_size_hint() {
1049 struct LyingIterator {
1056 values: Vec<bool>,
1057 index: usize,
1058 }
1059
1060 impl Iterator for LyingIterator {
1061 type Item = bool;
1062
1063 fn next(&mut self) -> Option<Self::Item> {
1064 (self.index < self.values.len()).then(|| {
1065 let val = self.values[self.index];
1066 self.index += 1;
1067 val
1068 })
1069 }
1070
1071 fn size_hint(&self) -> (usize, Option<usize>) {
1072 let remaining = self.values.len() - self.index;
1075 let lower = remaining.min(5); let upper = Some(5); (lower, upper)
1078 }
1079 }
1080
1081 let lying_iter = LyingIterator {
1083 values: vec![
1084 true, false, true, false, true, false, true, false, true, false,
1085 ],
1086 index: 0,
1087 };
1088
1089 let bit_buf: BitBufferMut = lying_iter.collect();
1092
1093 assert_eq!(bit_buf.len(), 10);
1095 for i in 0..10 {
1096 assert_eq!(bit_buf.value(i), i % 2 == 0);
1097 }
1098 }
1099}