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)]
20fn 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.len = 0;
272 self.offset = 0;
273 }
274
275 pub fn set_to(&mut self, index: usize, value: bool) {
279 if value {
280 self.set(index);
281 } else {
282 self.unset(index);
283 }
284 }
285
286 pub unsafe fn set_to_unchecked(&mut self, index: usize, value: bool) {
292 if value {
293 unsafe { self.set_unchecked(index) }
295 } else {
296 unsafe { self.unset_unchecked(index) }
298 }
299 }
300
301 pub fn set(&mut self, index: usize) {
305 assert!(index < self.len, "index {index} exceeds len {}", self.len);
306
307 unsafe { self.set_unchecked(index) };
309 }
310
311 #[inline]
315 pub fn unset(&mut self, index: usize) {
316 assert!(index < self.len, "index {index} exceeds len {}", self.len);
317
318 unsafe { self.unset_unchecked(index) };
320 }
321
322 #[inline]
330 pub unsafe fn set_unchecked(&mut self, index: usize) {
331 unsafe { set_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
333 }
334
335 #[inline]
343 pub unsafe fn unset_unchecked(&mut self, index: usize) {
344 unsafe { unset_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
346 }
347
348 #[inline(always)]
355 pub unsafe fn set_len(&mut self, new_len: usize) {
356 debug_assert!(
357 new_len <= self.capacity(),
358 "`set_len` requires that new_len <= capacity()"
359 );
360
361 let bytes_len = (self.offset + new_len).div_ceil(8);
363 unsafe { self.buffer.set_len(bytes_len) };
364
365 self.len = new_len;
366 }
367
368 pub fn truncate(&mut self, len: usize) {
372 if len > self.len {
373 return;
374 }
375
376 let new_len_bytes = (self.offset + len).div_ceil(8);
377 self.buffer.truncate(new_len_bytes);
378 self.len = len;
379 }
380
381 pub fn append(&mut self, value: bool) {
383 if value {
384 self.append_true()
385 } else {
386 self.append_false()
387 }
388 }
389
390 pub fn append_true(&mut self) {
392 let bit_pos = self.offset + self.len;
393 let byte_pos = bit_pos / 8;
394 let bit_in_byte = bit_pos % 8;
395
396 if byte_pos >= self.buffer.len() {
398 self.buffer.push(0u8);
399 }
400
401 self.buffer.as_mut_slice()[byte_pos] |= 1 << bit_in_byte;
403 self.len += 1;
404 }
405
406 pub fn append_false(&mut self) {
408 let bit_pos = self.offset + self.len;
409 let byte_pos = bit_pos / 8;
410 let bit_in_byte = bit_pos % 8;
411
412 if byte_pos >= self.buffer.len() {
414 self.buffer.push(0u8);
415 }
416
417 if bit_in_byte != 0 {
419 self.buffer.as_mut_slice()[byte_pos] &= !(1 << bit_in_byte);
420 }
421
422 self.len += 1;
423 }
424
425 #[inline]
430 pub fn append_n(&mut self, value: bool, n: usize) {
431 if n == 0 {
432 return;
433 }
434
435 let end_bit_pos = self.offset + self.len + n;
436 let required_bytes = end_bit_pos.div_ceil(8);
437
438 if required_bytes > self.buffer.len() {
440 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
441 }
442
443 let start = self.len;
444 self.len += n;
445 self.fill_range(start, self.len, value);
446 }
447
448 #[inline(always)]
453 pub fn fill_range(&mut self, start: usize, end: usize, value: bool) {
454 assert!(end <= self.len, "end {end} exceeds len {}", self.len);
455 assert!(start <= end, "start {start} exceeds end {end}");
456
457 unsafe { self.fill_range_unchecked(start, end, value) }
460 }
461
462 #[inline(always)]
468 pub unsafe fn fill_range_unchecked(&mut self, start: usize, end: usize, value: bool) {
469 fill_bits(
470 self.buffer.as_mut_slice(),
471 self.offset + start,
472 self.offset + end,
473 value,
474 );
475 }
476
477 pub fn append_buffer(&mut self, buffer: &BitBuffer) {
481 let bit_len = buffer.len();
482 if bit_len == 0 {
483 return;
484 }
485
486 let start_bit_pos = self.offset + self.len;
487 let end_bit_pos = start_bit_pos + bit_len;
488 let required_bytes = end_bit_pos.div_ceil(8);
489
490 if required_bytes > self.buffer.len() {
492 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
493 }
494
495 let self_slice = self
497 .buffer
498 .as_mut_slice()
499 .view_bits_mut::<bitvec::prelude::Lsb0>();
500 let other_slice = buffer
501 .inner()
502 .as_slice()
503 .view_bits::<bitvec::prelude::Lsb0>();
504
505 let source_range = buffer.offset()..buffer.offset() + bit_len;
507 self_slice[start_bit_pos..end_bit_pos].copy_from_bitslice(&other_slice[source_range]);
508
509 self.len += bit_len;
510 }
511
512 pub fn unsplit(&mut self, other: Self) {
520 if (self.offset + self.len).is_multiple_of(8) && other.offset == 0 {
521 self.buffer.unsplit(other.buffer);
523 self.len += other.len;
524 return;
525 }
526
527 self.append_buffer(&other.freeze())
529 }
530
531 pub fn freeze(self) -> BitBuffer {
533 BitBuffer::new_with_offset(self.buffer.freeze(), self.len, self.offset)
534 }
535
536 pub fn as_slice(&self) -> &[u8] {
538 self.buffer.as_slice()
539 }
540
541 pub fn as_mut_slice(&mut self) -> &mut [u8] {
543 self.buffer.as_mut_slice()
544 }
545}
546
547impl Default for BitBufferMut {
548 fn default() -> Self {
549 Self::with_capacity(0)
550 }
551}
552
553impl Not for BitBufferMut {
555 type Output = BitBufferMut;
556
557 #[inline]
558 fn not(mut self) -> Self::Output {
559 ops::bitwise_unary_op_mut(&mut self, |b| !b);
560 self
561 }
562}
563
564impl From<&[bool]> for BitBufferMut {
565 fn from(value: &[bool]) -> Self {
566 BitBufferMut::collect_bool(value.len(), |i| value[i])
567 }
568}
569
570impl From<&[u8]> for BitBufferMut {
572 fn from(value: &[u8]) -> Self {
573 BitBufferMut::collect_bool(value.len(), |i| value[i] > 0)
574 }
575}
576
577impl From<Vec<bool>> for BitBufferMut {
578 fn from(value: Vec<bool>) -> Self {
579 value.as_slice().into()
580 }
581}
582
583impl FromIterator<bool> for BitBufferMut {
584 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
585 let mut iter = iter.into_iter();
586
587 let (lower_bound, _) = iter.size_hint();
590
591 let mut buf = BitBufferMut::new_unset(lower_bound);
596 assert_eq!(buf.offset, 0);
597
598 let ptr = buf.buffer.as_mut_ptr();
600 for i in 0..lower_bound {
601 let Some(v) = iter.next() else {
602 unsafe { buf.set_len(i) };
605 return buf;
606 };
607
608 if v {
609 unsafe { set_bit_unchecked(ptr, i) }
611 }
612 }
613
614 for v in iter {
616 buf.append(v);
617 }
618
619 buf
620 }
621}
622
623#[cfg(test)]
624mod tests {
625 use crate::BufferMut;
626 use crate::bit::buf_mut::BitBufferMut;
627 use crate::bitbuffer;
628 use crate::bitbuffer_mut;
629 use crate::buffer_mut;
630
631 #[test]
632 fn test_bits_mut() {
633 let mut bools = bitbuffer_mut![false; 10];
634 bools.set_to(0, true);
635 bools.set_to(9, true);
636
637 let bools = bools.freeze();
638 assert!(bools.value(0));
639 for i in 1..=8 {
640 assert!(!bools.value(i));
641 }
642 assert!(bools.value(9));
643 }
644
645 #[test]
646 fn test_append_n() {
647 let mut bools = BitBufferMut::with_capacity(10);
648 assert_eq!(bools.len(), 0);
649 assert!(bools.is_empty());
650
651 bools.append(true);
652 bools.append_n(false, 8);
653 bools.append_n(true, 1);
654
655 let bools = bools.freeze();
656
657 assert_eq!(bools.true_count(), 2);
658 assert!(bools.value(0));
659 assert!(bools.value(9));
660 }
661
662 #[test]
663 fn test_reserve_ensures_len_plus_additional() {
664 let mut bits = BitBufferMut::with_capacity(10);
668 assert_eq!(bits.len(), 0);
669
670 bits.reserve(100);
671
672 assert!(bits.capacity() >= 100);
674
675 bits.append_n(true, 50);
676 assert_eq!(bits.len(), 50);
677
678 bits.reserve(100);
679
680 assert!(bits.capacity() >= 150);
682 }
683
684 #[test]
685 fn test_with_offset_zero() {
686 let buf = BufferMut::zeroed(2);
688 let mut bit_buf = BitBufferMut::from_buffer(buf, 0, 16);
689
690 bit_buf.set(0);
692 bit_buf.set(7);
693 bit_buf.set(8);
694 bit_buf.set(15);
695
696 assert!(bit_buf.value(0));
698 assert!(bit_buf.value(7));
699 assert!(bit_buf.value(8));
700 assert!(bit_buf.value(15));
701 assert!(!bit_buf.value(1));
702 assert!(!bit_buf.value(9));
703
704 assert_eq!(bit_buf.as_slice()[0], 0b10000001);
706 assert_eq!(bit_buf.as_slice()[1], 0b10000001);
707 }
708
709 #[test]
710 fn test_with_offset_within_byte() {
711 let buf = buffer_mut![0b11111111, 0b00000000, 0b00000000];
713 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 10);
714
715 assert!(bit_buf.value(0)); assert!(bit_buf.value(4)); assert!(!bit_buf.value(5)); bit_buf.set(7);
723 assert!(bit_buf.value(7));
724
725 bit_buf.unset(0);
727 assert!(!bit_buf.value(0));
728 }
729
730 #[test]
731 fn test_with_offset_byte_boundary() {
732 let buf = buffer_mut![0xFF, 0x00, 0xFF];
734 let mut bit_buf = BitBufferMut::from_buffer(buf, 8, 16);
735
736 for i in 0..8 {
738 assert!(!bit_buf.value(i));
739 }
740 for i in 8..16 {
742 assert!(bit_buf.value(i));
743 }
744
745 bit_buf.set(0);
747 bit_buf.set(3);
748 assert!(bit_buf.value(0));
749 assert!(bit_buf.value(3));
750 }
751
752 #[test]
753 fn test_with_large_offset() {
754 let buf = buffer_mut![0xFF, 0xFF, 0xFF, 0xFF];
756 let mut bit_buf = BitBufferMut::from_buffer(buf, 13, 10);
757
758 for i in 0..10 {
760 assert!(bit_buf.value(i));
761 }
762
763 bit_buf.unset(0);
765 bit_buf.unset(5);
766 bit_buf.unset(9);
767
768 assert!(!bit_buf.value(0));
769 assert!(bit_buf.value(1));
770 assert!(!bit_buf.value(5));
771 assert!(!bit_buf.value(9));
772 }
773
774 #[test]
775 fn test_append_with_offset() {
776 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);
786 assert!(!bit_buf.value(0));
787 assert!(bit_buf.value(1));
788 assert!(bit_buf.value(2));
789 }
790
791 #[test]
792 fn test_append_n_with_offset_crossing_boundary() {
793 let buf = BufferMut::zeroed(4);
795 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
796
797 bit_buf.append_n(true, 10); assert_eq!(bit_buf.len(), 10);
801 for i in 0..10 {
802 assert!(bit_buf.value(i));
803 }
804
805 assert_eq!(bit_buf.as_slice()[0], 0b11100000);
809 assert_eq!(bit_buf.as_slice()[1], 0b01111111);
810 }
811
812 #[test]
813 fn test_truncate_with_offset() {
814 let buf = buffer_mut![0xFF, 0xFF];
815 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 12);
816
817 assert_eq!(bit_buf.len(), 12);
818
819 bit_buf.truncate(8);
821 assert_eq!(bit_buf.len(), 8);
822
823 bit_buf.truncate(3);
825 assert_eq!(bit_buf.len(), 3);
826
827 bit_buf.truncate(10);
829 assert_eq!(bit_buf.len(), 3);
830 }
831
832 #[test]
833 fn test_capacity_with_offset() {
834 let buf = buffer_mut![0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
837
838 assert!(bit_buf.capacity() >= 75);
841 assert_eq!(bit_buf.capacity() % 8, (80 - 5) % 8);
843 }
844
845 #[test]
846 fn test_reserve_with_offset() {
847 let buf = buffer_mut![0, 0]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
850
851 let initial_capacity = bit_buf.capacity();
853 assert!(initial_capacity >= 13);
854
855 bit_buf.reserve(20);
857
858 assert!(bit_buf.capacity() >= 20);
860 }
861
862 #[test]
863 fn test_freeze_with_offset() {
864 let buf = buffer_mut![0b11110000, 0b00001111];
865 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
866
867 bit_buf.set(0);
869 bit_buf.set(7);
870
871 let frozen = bit_buf.freeze();
873 assert_eq!(frozen.offset(), 4);
874 assert_eq!(frozen.len(), 8);
875
876 assert!(frozen.value(0));
878 assert!(frozen.value(7));
879 }
880
881 #[cfg_attr(miri, ignore)] #[test]
883 fn test_append_buffer_with_offsets() {
884 let source = bitbuffer![false, false, true, true, false, true];
886
887 let buf = BufferMut::zeroed(4);
889 let mut dest = BitBufferMut::from_buffer(buf, 3, 0);
890
891 dest.append(true);
893 dest.append(false);
894
895 dest.append_buffer(&source);
897
898 assert_eq!(dest.len(), 8);
899 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)); }
908
909 #[test]
910 fn test_set_unset_unchecked_with_offset() {
911 let buf = BufferMut::zeroed(3);
912 let mut bit_buf = BitBufferMut::from_buffer(buf, 7, 10);
913
914 unsafe {
915 bit_buf.set_unchecked(0);
916 bit_buf.set_unchecked(5);
917 bit_buf.set_unchecked(9);
918 }
919
920 assert!(bit_buf.value(0));
921 assert!(bit_buf.value(5));
922 assert!(bit_buf.value(9));
923
924 unsafe {
925 bit_buf.unset_unchecked(5);
926 }
927
928 assert!(!bit_buf.value(5));
929 }
930
931 #[test]
932 fn test_value_unchecked_with_offset() {
933 let buf = buffer_mut![0b11110000, 0b00001111];
934 let bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
935
936 unsafe {
937 assert!(bit_buf.value_unchecked(0));
939 assert!(bit_buf.value_unchecked(3));
940
941 assert!(bit_buf.value_unchecked(4));
943 assert!(bit_buf.value_unchecked(7));
944 }
945 }
946
947 #[test]
948 fn test_append_alternating_with_offset() {
949 let buf = BufferMut::zeroed(4);
950 let mut bit_buf = BitBufferMut::from_buffer(buf, 2, 0);
951
952 for i in 0..20 {
954 bit_buf.append(i % 2 == 0);
955 }
956
957 assert_eq!(bit_buf.len(), 20);
958 for i in 0..20 {
959 assert_eq!(bit_buf.value(i), i % 2 == 0);
960 }
961 }
962
963 #[test]
964 fn test_new_set_new_unset() {
965 let set_buf = bitbuffer_mut![true; 10];
966 let unset_buf = bitbuffer_mut![false; 10];
967
968 for i in 0..10 {
969 assert!(set_buf.value(i));
970 assert!(!unset_buf.value(i));
971 }
972
973 assert_eq!(set_buf.len(), 10);
974 assert_eq!(unset_buf.len(), 10);
975 }
976
977 #[test]
978 fn test_append_n_false_with_offset() {
979 let buf = BufferMut::zeroed(4);
980 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
981
982 bit_buf.append_n(false, 15);
983
984 assert_eq!(bit_buf.len(), 15);
985 for i in 0..15 {
986 assert!(!bit_buf.value(i));
987 }
988 }
989
990 #[test]
991 fn test_append_n_true_with_offset() {
992 let buf = BufferMut::zeroed(4);
993 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
994
995 bit_buf.append_n(true, 15);
996
997 assert_eq!(bit_buf.len(), 15);
998 for i in 0..15 {
999 assert!(bit_buf.value(i));
1000 }
1001 }
1002
1003 #[test]
1004 fn test_mixed_operations_with_offset() {
1005 let buf = BufferMut::zeroed(5);
1007 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
1008
1009 bit_buf.append_n(true, 5);
1011 bit_buf.append_n(false, 3);
1012 bit_buf.append(true);
1013
1014 assert_eq!(bit_buf.len(), 9);
1015
1016 bit_buf.set(6); bit_buf.unset(2); assert!(bit_buf.value(0));
1022 assert!(bit_buf.value(1));
1023 assert!(!bit_buf.value(2)); assert!(bit_buf.value(3));
1025 assert!(bit_buf.value(4));
1026 assert!(!bit_buf.value(5));
1027 assert!(bit_buf.value(6)); assert!(!bit_buf.value(7));
1029 assert!(bit_buf.value(8));
1030
1031 bit_buf.truncate(6);
1033 assert_eq!(bit_buf.len(), 6);
1034
1035 let frozen = bit_buf.freeze();
1037 assert_eq!(frozen.offset(), 3);
1038 assert_eq!(frozen.len(), 6);
1039 }
1040
1041 #[test]
1042 fn test_from_iterator_with_incorrect_size_hint() {
1043 struct LyingIterator {
1050 values: Vec<bool>,
1051 index: usize,
1052 }
1053
1054 impl Iterator for LyingIterator {
1055 type Item = bool;
1056
1057 fn next(&mut self) -> Option<Self::Item> {
1058 (self.index < self.values.len()).then(|| {
1059 let val = self.values[self.index];
1060 self.index += 1;
1061 val
1062 })
1063 }
1064
1065 fn size_hint(&self) -> (usize, Option<usize>) {
1066 let remaining = self.values.len() - self.index;
1069 let lower = remaining.min(5); let upper = Some(5); (lower, upper)
1072 }
1073 }
1074
1075 let lying_iter = LyingIterator {
1077 values: vec![
1078 true, false, true, false, true, false, true, false, true, false,
1079 ],
1080 index: 0,
1081 };
1082
1083 let bit_buf: BitBufferMut = lying_iter.collect();
1086
1087 assert_eq!(bit_buf.len(), 10);
1089 for i in 0..10 {
1090 assert_eq!(bit_buf.value(i), i % 2 == 0);
1091 }
1092 }
1093}