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<Vec<bool>> for BitBufferMut {
577 fn from(value: Vec<bool>) -> Self {
578 value.as_slice().into()
579 }
580}
581
582impl FromIterator<bool> for BitBufferMut {
583 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
584 let mut iter = iter.into_iter();
585
586 let (lower_bound, _) = iter.size_hint();
589
590 let mut buf = BitBufferMut::new_unset(lower_bound);
595 assert_eq!(buf.offset, 0);
596
597 let ptr = buf.buffer.as_mut_ptr();
599 for i in 0..lower_bound {
600 let Some(v) = iter.next() else {
601 unsafe { buf.set_len(i) };
604 return buf;
605 };
606
607 if v {
608 unsafe { set_bit_unchecked(ptr, i) }
610 }
611 }
612
613 for v in iter {
615 buf.append(v);
616 }
617
618 buf
619 }
620}
621
622#[cfg(test)]
623mod tests {
624 use crate::BufferMut;
625 use crate::bit::buf_mut::BitBufferMut;
626 use crate::bitbuffer;
627 use crate::bitbuffer_mut;
628 use crate::buffer_mut;
629
630 #[test]
631 fn test_bits_mut() {
632 let mut bools = bitbuffer_mut![false; 10];
633 bools.set_to(0, true);
634 bools.set_to(9, true);
635
636 let bools = bools.freeze();
637 assert!(bools.value(0));
638 for i in 1..=8 {
639 assert!(!bools.value(i));
640 }
641 assert!(bools.value(9));
642 }
643
644 #[test]
645 fn test_append_n() {
646 let mut bools = BitBufferMut::with_capacity(10);
647 assert_eq!(bools.len(), 0);
648 assert!(bools.is_empty());
649
650 bools.append(true);
651 bools.append_n(false, 8);
652 bools.append_n(true, 1);
653
654 let bools = bools.freeze();
655
656 assert_eq!(bools.true_count(), 2);
657 assert!(bools.value(0));
658 assert!(bools.value(9));
659 }
660
661 #[test]
662 fn test_reserve_ensures_len_plus_additional() {
663 let mut bits = BitBufferMut::with_capacity(10);
667 assert_eq!(bits.len(), 0);
668
669 bits.reserve(100);
670
671 assert!(bits.capacity() >= 100);
673
674 bits.append_n(true, 50);
675 assert_eq!(bits.len(), 50);
676
677 bits.reserve(100);
678
679 assert!(bits.capacity() >= 150);
681 }
682
683 #[test]
684 fn test_with_offset_zero() {
685 let buf = BufferMut::zeroed(2);
687 let mut bit_buf = BitBufferMut::from_buffer(buf, 0, 16);
688
689 bit_buf.set(0);
691 bit_buf.set(7);
692 bit_buf.set(8);
693 bit_buf.set(15);
694
695 assert!(bit_buf.value(0));
697 assert!(bit_buf.value(7));
698 assert!(bit_buf.value(8));
699 assert!(bit_buf.value(15));
700 assert!(!bit_buf.value(1));
701 assert!(!bit_buf.value(9));
702
703 assert_eq!(bit_buf.as_slice()[0], 0b10000001);
705 assert_eq!(bit_buf.as_slice()[1], 0b10000001);
706 }
707
708 #[test]
709 fn test_with_offset_within_byte() {
710 let buf = buffer_mut![0b11111111, 0b00000000, 0b00000000];
712 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 10);
713
714 assert!(bit_buf.value(0)); assert!(bit_buf.value(4)); assert!(!bit_buf.value(5)); bit_buf.set(7);
722 assert!(bit_buf.value(7));
723
724 bit_buf.unset(0);
726 assert!(!bit_buf.value(0));
727 }
728
729 #[test]
730 fn test_with_offset_byte_boundary() {
731 let buf = buffer_mut![0xFF, 0x00, 0xFF];
733 let mut bit_buf = BitBufferMut::from_buffer(buf, 8, 16);
734
735 for i in 0..8 {
737 assert!(!bit_buf.value(i));
738 }
739 for i in 8..16 {
741 assert!(bit_buf.value(i));
742 }
743
744 bit_buf.set(0);
746 bit_buf.set(3);
747 assert!(bit_buf.value(0));
748 assert!(bit_buf.value(3));
749 }
750
751 #[test]
752 fn test_with_large_offset() {
753 let buf = buffer_mut![0xFF, 0xFF, 0xFF, 0xFF];
755 let mut bit_buf = BitBufferMut::from_buffer(buf, 13, 10);
756
757 for i in 0..10 {
759 assert!(bit_buf.value(i));
760 }
761
762 bit_buf.unset(0);
764 bit_buf.unset(5);
765 bit_buf.unset(9);
766
767 assert!(!bit_buf.value(0));
768 assert!(bit_buf.value(1));
769 assert!(!bit_buf.value(5));
770 assert!(!bit_buf.value(9));
771 }
772
773 #[test]
774 fn test_append_with_offset() {
775 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);
785 assert!(!bit_buf.value(0));
786 assert!(bit_buf.value(1));
787 assert!(bit_buf.value(2));
788 }
789
790 #[test]
791 fn test_append_n_with_offset_crossing_boundary() {
792 let buf = BufferMut::zeroed(4);
794 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
795
796 bit_buf.append_n(true, 10); assert_eq!(bit_buf.len(), 10);
800 for i in 0..10 {
801 assert!(bit_buf.value(i));
802 }
803
804 assert_eq!(bit_buf.as_slice()[0], 0b11100000);
808 assert_eq!(bit_buf.as_slice()[1], 0b01111111);
809 }
810
811 #[test]
812 fn test_truncate_with_offset() {
813 let buf = buffer_mut![0xFF, 0xFF];
814 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 12);
815
816 assert_eq!(bit_buf.len(), 12);
817
818 bit_buf.truncate(8);
820 assert_eq!(bit_buf.len(), 8);
821
822 bit_buf.truncate(3);
824 assert_eq!(bit_buf.len(), 3);
825
826 bit_buf.truncate(10);
828 assert_eq!(bit_buf.len(), 3);
829 }
830
831 #[test]
832 fn test_capacity_with_offset() {
833 let buf = buffer_mut![0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
836
837 assert!(bit_buf.capacity() >= 75);
840 assert_eq!(bit_buf.capacity() % 8, (80 - 5) % 8);
842 }
843
844 #[test]
845 fn test_reserve_with_offset() {
846 let buf = buffer_mut![0, 0]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
849
850 let initial_capacity = bit_buf.capacity();
852 assert!(initial_capacity >= 13);
853
854 bit_buf.reserve(20);
856
857 assert!(bit_buf.capacity() >= 20);
859 }
860
861 #[test]
862 fn test_freeze_with_offset() {
863 let buf = buffer_mut![0b11110000, 0b00001111];
864 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
865
866 bit_buf.set(0);
868 bit_buf.set(7);
869
870 let frozen = bit_buf.freeze();
872 assert_eq!(frozen.offset(), 4);
873 assert_eq!(frozen.len(), 8);
874
875 assert!(frozen.value(0));
877 assert!(frozen.value(7));
878 }
879
880 #[cfg_attr(miri, ignore)] #[test]
882 fn test_append_buffer_with_offsets() {
883 let source = bitbuffer![false, false, true, true, false, true];
885
886 let buf = BufferMut::zeroed(4);
888 let mut dest = BitBufferMut::from_buffer(buf, 3, 0);
889
890 dest.append(true);
892 dest.append(false);
893
894 dest.append_buffer(&source);
896
897 assert_eq!(dest.len(), 8);
898 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)); }
907
908 #[test]
909 fn test_set_unset_unchecked_with_offset() {
910 let buf = BufferMut::zeroed(3);
911 let mut bit_buf = BitBufferMut::from_buffer(buf, 7, 10);
912
913 unsafe {
914 bit_buf.set_unchecked(0);
915 bit_buf.set_unchecked(5);
916 bit_buf.set_unchecked(9);
917 }
918
919 assert!(bit_buf.value(0));
920 assert!(bit_buf.value(5));
921 assert!(bit_buf.value(9));
922
923 unsafe {
924 bit_buf.unset_unchecked(5);
925 }
926
927 assert!(!bit_buf.value(5));
928 }
929
930 #[test]
931 fn test_value_unchecked_with_offset() {
932 let buf = buffer_mut![0b11110000, 0b00001111];
933 let bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
934
935 unsafe {
936 assert!(bit_buf.value_unchecked(0));
938 assert!(bit_buf.value_unchecked(3));
939
940 assert!(bit_buf.value_unchecked(4));
942 assert!(bit_buf.value_unchecked(7));
943 }
944 }
945
946 #[test]
947 fn test_append_alternating_with_offset() {
948 let buf = BufferMut::zeroed(4);
949 let mut bit_buf = BitBufferMut::from_buffer(buf, 2, 0);
950
951 for i in 0..20 {
953 bit_buf.append(i % 2 == 0);
954 }
955
956 assert_eq!(bit_buf.len(), 20);
957 for i in 0..20 {
958 assert_eq!(bit_buf.value(i), i % 2 == 0);
959 }
960 }
961
962 #[test]
963 fn test_new_set_new_unset() {
964 let set_buf = bitbuffer_mut![true; 10];
965 let unset_buf = bitbuffer_mut![false; 10];
966
967 for i in 0..10 {
968 assert!(set_buf.value(i));
969 assert!(!unset_buf.value(i));
970 }
971
972 assert_eq!(set_buf.len(), 10);
973 assert_eq!(unset_buf.len(), 10);
974 }
975
976 #[test]
977 fn test_append_n_false_with_offset() {
978 let buf = BufferMut::zeroed(4);
979 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
980
981 bit_buf.append_n(false, 15);
982
983 assert_eq!(bit_buf.len(), 15);
984 for i in 0..15 {
985 assert!(!bit_buf.value(i));
986 }
987 }
988
989 #[test]
990 fn test_append_n_true_with_offset() {
991 let buf = BufferMut::zeroed(4);
992 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
993
994 bit_buf.append_n(true, 15);
995
996 assert_eq!(bit_buf.len(), 15);
997 for i in 0..15 {
998 assert!(bit_buf.value(i));
999 }
1000 }
1001
1002 #[test]
1003 fn test_mixed_operations_with_offset() {
1004 let buf = BufferMut::zeroed(5);
1006 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
1007
1008 bit_buf.append_n(true, 5);
1010 bit_buf.append_n(false, 3);
1011 bit_buf.append(true);
1012
1013 assert_eq!(bit_buf.len(), 9);
1014
1015 bit_buf.set(6); bit_buf.unset(2); assert!(bit_buf.value(0));
1021 assert!(bit_buf.value(1));
1022 assert!(!bit_buf.value(2)); assert!(bit_buf.value(3));
1024 assert!(bit_buf.value(4));
1025 assert!(!bit_buf.value(5));
1026 assert!(bit_buf.value(6)); assert!(!bit_buf.value(7));
1028 assert!(bit_buf.value(8));
1029
1030 bit_buf.truncate(6);
1032 assert_eq!(bit_buf.len(), 6);
1033
1034 let frozen = bit_buf.freeze();
1036 assert_eq!(frozen.offset(), 3);
1037 assert_eq!(frozen.len(), 6);
1038 }
1039
1040 #[test]
1041 fn test_from_iterator_with_incorrect_size_hint() {
1042 struct LyingIterator {
1049 values: Vec<bool>,
1050 index: usize,
1051 }
1052
1053 impl Iterator for LyingIterator {
1054 type Item = bool;
1055
1056 fn next(&mut self) -> Option<Self::Item> {
1057 (self.index < self.values.len()).then(|| {
1058 let val = self.values[self.index];
1059 self.index += 1;
1060 val
1061 })
1062 }
1063
1064 fn size_hint(&self) -> (usize, Option<usize>) {
1065 let remaining = self.values.len() - self.index;
1068 let lower = remaining.min(5); let upper = Some(5); (lower, upper)
1071 }
1072 }
1073
1074 let lying_iter = LyingIterator {
1076 values: vec![
1077 true, false, true, false, true, false, true, false, true, false,
1078 ],
1079 index: 0,
1080 };
1081
1082 let bit_buf: BitBufferMut = lying_iter.collect();
1085
1086 assert_eq!(bit_buf.len(), 10);
1088 for i in 0..10 {
1089 assert_eq!(bit_buf.value(i), i % 2 == 0);
1090 }
1091 }
1092}