1use std::ops::Not;
5
6use arrow_buffer::bit_chunk_iterator::{BitChunks, UnalignedBitChunk};
7use bitvec::view::BitView;
8
9use crate::bit::{get_bit_unchecked, ops, set_bit_unchecked, unset_bit_unchecked};
10use crate::{BitBuffer, BufferMut, ByteBufferMut, buffer_mut};
11
12#[derive(Debug, Clone, Eq)]
32pub struct BitBufferMut {
33 buffer: ByteBufferMut,
34 offset: usize,
38 len: usize,
39}
40
41impl PartialEq for BitBufferMut {
42 fn eq(&self, other: &Self) -> bool {
43 if self.len != other.len {
44 return false;
45 }
46
47 self.chunks()
48 .iter_padded()
49 .zip(other.chunks().iter_padded())
50 .all(|(a, b)| a == b)
51 }
52}
53
54impl BitBufferMut {
55 pub fn from_buffer(buffer: ByteBufferMut, offset: usize, len: usize) -> Self {
57 assert!(
58 len <= buffer.len() * 8,
59 "Buffer len {} is too short for the given length {len}",
60 buffer.len()
61 );
62 Self {
63 buffer,
64 offset,
65 len,
66 }
67 }
68
69 pub fn copy_from(bit_buffer: &BitBuffer) -> Self {
71 Self {
72 buffer: ByteBufferMut::copy_from(bit_buffer.inner()),
73 offset: bit_buffer.offset(),
74 len: bit_buffer.len(),
75 }
76 }
77
78 pub fn with_capacity(capacity: usize) -> Self {
80 Self {
81 buffer: BufferMut::with_capacity(capacity.div_ceil(8)),
82 offset: 0,
83 len: 0,
84 }
85 }
86
87 pub fn new_set(len: usize) -> Self {
89 Self {
90 buffer: buffer_mut![0xFF; len.div_ceil(8)],
91 offset: 0,
92 len,
93 }
94 }
95
96 pub fn new_unset(len: usize) -> Self {
98 Self {
99 buffer: BufferMut::zeroed(len.div_ceil(8)),
100 offset: 0,
101 len,
102 }
103 }
104
105 #[inline(always)]
107 pub fn empty() -> Self {
108 Self::with_capacity(0)
109 }
110
111 pub fn full(value: bool, len: usize) -> Self {
113 if value {
114 Self::new_set(len)
115 } else {
116 Self::new_unset(len)
117 }
118 }
119
120 pub fn inner(&self) -> &ByteBufferMut {
122 &self.buffer
123 }
124
125 pub fn into_inner(self) -> ByteBufferMut {
127 self.buffer
128 }
129
130 #[inline(always)]
132 pub fn len(&self) -> usize {
133 self.len
134 }
135
136 #[inline(always)]
138 pub fn is_empty(&self) -> bool {
139 self.len == 0
140 }
141
142 #[inline(always)]
144 pub fn offset(&self) -> usize {
145 self.offset
146 }
147
148 #[inline(always)]
150 pub fn value(&self, index: usize) -> bool {
151 assert!(index < self.len);
152 unsafe { self.value_unchecked(index) }
154 }
155
156 #[inline(always)]
162 pub unsafe fn value_unchecked(&self, index: usize) -> bool {
163 unsafe { get_bit_unchecked(self.buffer.as_ptr(), self.offset + index) }
164 }
165
166 pub fn chunks(&self) -> BitChunks<'_> {
170 BitChunks::new(self.buffer.as_slice(), self.offset, self.len)
171 }
172
173 #[inline(always)]
175 pub fn capacity(&self) -> usize {
176 (self.buffer.capacity() * 8) - self.offset
177 }
178
179 pub fn reserve(&mut self, additional: usize) {
181 let required_bits = self.offset + self.len + additional;
182 let required_bytes = required_bits.div_ceil(8); let additional_bytes = required_bytes.saturating_sub(self.buffer.len());
185 self.buffer.reserve(additional_bytes);
186 }
187
188 pub fn clear(&mut self) {
190 self.len = 0;
192 self.offset = 0;
193 }
194
195 pub fn set_to(&mut self, index: usize, value: bool) {
199 if value {
200 self.set(index);
201 } else {
202 self.unset(index);
203 }
204 }
205
206 pub unsafe fn set_to_unchecked(&mut self, index: usize, value: bool) {
212 if value {
213 unsafe { self.set_unchecked(index) }
215 } else {
216 unsafe { self.unset_unchecked(index) }
218 }
219 }
220
221 pub fn set(&mut self, index: usize) {
225 assert!(index < self.len, "index {index} exceeds len {}", self.len);
226
227 unsafe { self.set_unchecked(index) };
229 }
230
231 pub fn unset(&mut self, index: usize) {
235 assert!(index < self.len, "index {index} exceeds len {}", self.len);
236
237 unsafe { self.unset_unchecked(index) };
239 }
240
241 unsafe fn set_unchecked(&mut self, index: usize) {
249 unsafe { set_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
251 }
252
253 unsafe fn unset_unchecked(&mut self, index: usize) {
261 unsafe { unset_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
263 }
264
265 #[inline(always)]
272 pub unsafe fn set_len(&mut self, new_len: usize) {
273 debug_assert!(
274 new_len <= self.capacity(),
275 "`set_len` requires that new_len <= capacity()"
276 );
277 self.len = new_len;
278 }
279
280 pub fn truncate(&mut self, len: usize) {
284 if len > self.len {
285 return;
286 }
287
288 let new_len_bytes = (self.offset + len).div_ceil(8);
289 self.buffer.truncate(new_len_bytes);
290 self.len = len;
291 }
292
293 pub fn append(&mut self, value: bool) {
295 if value {
296 self.append_true()
297 } else {
298 self.append_false()
299 }
300 }
301
302 pub fn append_true(&mut self) {
304 let bit_pos = self.offset + self.len;
305 let byte_pos = bit_pos / 8;
306 let bit_in_byte = bit_pos % 8;
307
308 if byte_pos >= self.buffer.len() {
310 self.buffer.push(0u8);
311 }
312
313 self.buffer.as_mut_slice()[byte_pos] |= 1 << bit_in_byte;
315 self.len += 1;
316 }
317
318 pub fn append_false(&mut self) {
320 let bit_pos = self.offset + self.len;
321 let byte_pos = bit_pos / 8;
322 let bit_in_byte = bit_pos % 8;
323
324 if byte_pos >= self.buffer.len() {
326 self.buffer.push(0u8);
327 }
328
329 if bit_in_byte != 0 {
331 self.buffer.as_mut_slice()[byte_pos] &= !(1 << bit_in_byte);
332 }
333
334 self.len += 1;
335 }
336
337 pub fn append_n(&mut self, value: bool, n: usize) {
342 if n == 0 {
343 return;
344 }
345
346 let start_bit_pos = self.offset + self.len;
347 let end_bit_pos = start_bit_pos + n;
348 let required_bytes = end_bit_pos.div_ceil(8);
349
350 if required_bytes > self.buffer.len() {
352 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
353 }
354
355 let fill_byte = if value { 0xFF } else { 0x00 };
356
357 let start_byte = start_bit_pos / 8;
359 let start_bit = start_bit_pos % 8;
360 let end_byte = end_bit_pos / 8;
361 let end_bit = end_bit_pos % 8;
362
363 let slice = self.buffer.as_mut_slice();
364
365 if start_byte == end_byte {
366 let mask = ((1u8 << (end_bit - start_bit)) - 1) << start_bit;
368 if value {
369 slice[start_byte] |= mask;
370 } else {
371 slice[start_byte] &= !mask;
372 }
373 } else {
374 if start_bit != 0 {
376 let mask = !((1u8 << start_bit) - 1);
377 if value {
378 slice[start_byte] |= mask;
379 } else {
380 slice[start_byte] &= !mask;
381 }
382 }
383
384 let fill_start = if start_bit != 0 {
386 start_byte + 1
387 } else {
388 start_byte
389 };
390 let fill_end = end_byte;
391 if fill_start < fill_end {
392 slice[fill_start..fill_end].fill(fill_byte);
393 }
394
395 if end_bit != 0 {
397 let mask = (1u8 << end_bit) - 1;
398 if value {
399 slice[end_byte] |= mask;
400 } else {
401 slice[end_byte] &= !mask;
402 }
403 }
404 }
405
406 self.len += n;
407 }
408
409 pub fn append_buffer(&mut self, buffer: &BitBuffer) {
413 let bit_len = buffer.len();
414 if bit_len == 0 {
415 return;
416 }
417
418 let start_bit_pos = self.offset + self.len;
419 let end_bit_pos = start_bit_pos + bit_len;
420 let required_bytes = end_bit_pos.div_ceil(8);
421
422 if required_bytes > self.buffer.len() {
424 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
425 }
426
427 let self_slice = self
429 .buffer
430 .as_mut_slice()
431 .view_bits_mut::<bitvec::prelude::Lsb0>();
432 let other_slice = buffer
433 .inner()
434 .as_slice()
435 .view_bits::<bitvec::prelude::Lsb0>();
436
437 let source_range = buffer.offset()..buffer.offset() + bit_len;
439 self_slice[start_bit_pos..end_bit_pos].copy_from_bitslice(&other_slice[source_range]);
440
441 self.len += bit_len;
442 }
443
444 pub fn split_off(&mut self, at: usize) -> Self {
452 assert!(at <= self.len, "index {at} exceeds len {}", self.len);
453
454 let new_offset = self.offset;
455 let new_len = self.len - at;
456
457 if (self.offset + at) % 8 == 0 {
459 let byte_pos = (self.offset + at) / 8;
460 let new_buffer = self.buffer.split_off(byte_pos);
461 self.len = at;
462 return Self {
463 buffer: new_buffer,
464 offset: new_offset,
465 len: new_len,
466 };
467 }
468
469 let mut new_buffer = BitBufferMut::with_capacity(new_len);
471 for i in 0..new_len {
472 let value = self.value(at + i);
473 new_buffer.append(value);
474 }
475
476 self.truncate(at);
478
479 new_buffer
480 }
481
482 pub fn unsplit(&mut self, other: Self) {
490 if (self.offset + self.len) % 8 == 0 && other.offset == 0 {
491 self.buffer.unsplit(other.buffer);
493 self.len += other.len;
494 return;
495 }
496
497 self.append_buffer(&other.freeze())
499 }
500
501 pub fn freeze(self) -> BitBuffer {
503 BitBuffer::new_with_offset(self.buffer.freeze(), self.len, self.offset)
504 }
505
506 pub fn as_slice(&self) -> &[u8] {
508 self.buffer.as_slice()
509 }
510
511 pub fn as_mut_slice(&mut self) -> &mut [u8] {
513 self.buffer.as_mut_slice()
514 }
515
516 pub fn as_mut_ptr(&mut self) -> *mut u8 {
518 self.buffer.as_mut_ptr()
519 }
520
521 pub fn unaligned_chunks(&self) -> UnalignedBitChunk<'_> {
523 UnalignedBitChunk::new(self.buffer.as_slice(), self.offset, self.len)
524 }
525
526 pub fn true_count(&self) -> usize {
528 self.unaligned_chunks().count_ones()
529 }
530
531 pub fn false_count(&self) -> usize {
533 self.len - self.true_count()
534 }
535}
536
537impl Default for BitBufferMut {
538 fn default() -> Self {
539 Self::with_capacity(0)
540 }
541}
542
543impl Not for BitBufferMut {
545 type Output = BitBufferMut;
546
547 fn not(mut self) -> Self::Output {
548 ops::bitwise_unary_op_mut(&mut self, |b| !b);
549 self
550 }
551}
552
553impl From<&[bool]> for BitBufferMut {
554 fn from(value: &[bool]) -> Self {
555 BitBuffer::collect_bool(value.len(), |i| value[i]).into_mut()
556 }
557}
558
559impl From<Vec<bool>> for BitBufferMut {
560 fn from(value: Vec<bool>) -> Self {
561 value.as_slice().into()
562 }
563}
564
565impl FromIterator<bool> for BitBufferMut {
566 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
567 let mut iter = iter.into_iter();
568
569 let (lower_bound, _) = iter.size_hint();
572
573 let mut buf = BitBufferMut::new_unset(lower_bound);
578 assert_eq!(buf.offset, 0);
579
580 let ptr = buf.buffer.as_mut_ptr();
582 for i in 0..lower_bound {
583 let Some(v) = iter.next() else {
584 unsafe { buf.set_len(i) };
587 return buf;
588 };
589
590 if v {
591 unsafe { set_bit_unchecked(ptr, i) }
593 }
594 }
595
596 for v in iter {
598 buf.append(v);
599 }
600
601 buf
602 }
603}
604
605#[cfg(test)]
606mod tests {
607 use crate::bit::buf_mut::BitBufferMut;
608 use crate::{BufferMut, bitbuffer, bitbuffer_mut, buffer_mut};
609
610 #[test]
611 fn test_bits_mut() {
612 let mut bools = bitbuffer_mut![false; 10];
613 bools.set_to(0, true);
614 bools.set_to(9, true);
615
616 let bools = bools.freeze();
617 assert!(bools.value(0));
618 for i in 1..=8 {
619 assert!(!bools.value(i));
620 }
621 assert!(bools.value(9));
622 }
623
624 #[test]
625 fn test_append_n() {
626 let mut bools = BitBufferMut::with_capacity(10);
627 assert_eq!(bools.len(), 0);
628 assert!(bools.is_empty());
629
630 bools.append(true);
631 bools.append_n(false, 8);
632 bools.append_n(true, 1);
633
634 let bools = bools.freeze();
635
636 assert_eq!(bools.true_count(), 2);
637 assert!(bools.value(0));
638 assert!(bools.value(9));
639 }
640
641 #[test]
642 fn test_reserve_ensures_len_plus_additional() {
643 let mut bits = BitBufferMut::with_capacity(10);
647 assert_eq!(bits.len(), 0);
648
649 bits.reserve(100);
650
651 assert!(bits.capacity() >= 100);
653
654 bits.append_n(true, 50);
655 assert_eq!(bits.len(), 50);
656
657 bits.reserve(100);
658
659 assert!(bits.capacity() >= 150);
661 }
662
663 #[test]
664 fn test_with_offset_zero() {
665 let buf = BufferMut::zeroed(2);
667 let mut bit_buf = BitBufferMut::from_buffer(buf, 0, 16);
668
669 bit_buf.set(0);
671 bit_buf.set(7);
672 bit_buf.set(8);
673 bit_buf.set(15);
674
675 assert!(bit_buf.value(0));
677 assert!(bit_buf.value(7));
678 assert!(bit_buf.value(8));
679 assert!(bit_buf.value(15));
680 assert!(!bit_buf.value(1));
681 assert!(!bit_buf.value(9));
682
683 assert_eq!(bit_buf.as_slice()[0], 0b10000001);
685 assert_eq!(bit_buf.as_slice()[1], 0b10000001);
686 }
687
688 #[test]
689 fn test_with_offset_within_byte() {
690 let buf = buffer_mut![0b11111111, 0b00000000, 0b00000000];
692 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 10);
693
694 assert!(bit_buf.value(0)); assert!(bit_buf.value(4)); assert!(!bit_buf.value(5)); bit_buf.set(7);
702 assert!(bit_buf.value(7));
703
704 bit_buf.unset(0);
706 assert!(!bit_buf.value(0));
707 }
708
709 #[test]
710 fn test_with_offset_byte_boundary() {
711 let buf = buffer_mut![0xFF, 0x00, 0xFF];
713 let mut bit_buf = BitBufferMut::from_buffer(buf, 8, 16);
714
715 for i in 0..8 {
717 assert!(!bit_buf.value(i));
718 }
719 for i in 8..16 {
721 assert!(bit_buf.value(i));
722 }
723
724 bit_buf.set(0);
726 bit_buf.set(3);
727 assert!(bit_buf.value(0));
728 assert!(bit_buf.value(3));
729 }
730
731 #[test]
732 fn test_with_large_offset() {
733 let buf = buffer_mut![0xFF, 0xFF, 0xFF, 0xFF];
735 let mut bit_buf = BitBufferMut::from_buffer(buf, 13, 10);
736
737 for i in 0..10 {
739 assert!(bit_buf.value(i));
740 }
741
742 bit_buf.unset(0);
744 bit_buf.unset(5);
745 bit_buf.unset(9);
746
747 assert!(!bit_buf.value(0));
748 assert!(bit_buf.value(1));
749 assert!(!bit_buf.value(5));
750 assert!(!bit_buf.value(9));
751 }
752
753 #[test]
754 fn test_append_with_offset() {
755 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);
765 assert!(!bit_buf.value(0));
766 assert!(bit_buf.value(1));
767 assert!(bit_buf.value(2));
768 }
769
770 #[test]
771 fn test_append_n_with_offset_crossing_boundary() {
772 let buf = BufferMut::zeroed(4);
774 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
775
776 bit_buf.append_n(true, 10); assert_eq!(bit_buf.len(), 10);
780 for i in 0..10 {
781 assert!(bit_buf.value(i));
782 }
783
784 assert_eq!(bit_buf.as_slice()[0], 0b11100000);
788 assert_eq!(bit_buf.as_slice()[1], 0b01111111);
789 }
790
791 #[test]
792 fn test_truncate_with_offset() {
793 let buf = buffer_mut![0xFF, 0xFF];
794 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 12);
795
796 assert_eq!(bit_buf.len(), 12);
797
798 bit_buf.truncate(8);
800 assert_eq!(bit_buf.len(), 8);
801
802 bit_buf.truncate(3);
804 assert_eq!(bit_buf.len(), 3);
805
806 bit_buf.truncate(10);
808 assert_eq!(bit_buf.len(), 3);
809 }
810
811 #[test]
812 fn test_capacity_with_offset() {
813 let buf = buffer_mut![0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
816
817 assert!(bit_buf.capacity() >= 75);
820 assert_eq!(bit_buf.capacity() % 8, (80 - 5) % 8);
822 }
823
824 #[test]
825 fn test_reserve_with_offset() {
826 let buf = buffer_mut![0, 0]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
829
830 let initial_capacity = bit_buf.capacity();
832 assert!(initial_capacity >= 13);
833
834 bit_buf.reserve(20);
836
837 assert!(bit_buf.capacity() >= 20);
839 }
840
841 #[test]
842 fn test_freeze_with_offset() {
843 let buf = buffer_mut![0b11110000, 0b00001111];
844 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
845
846 bit_buf.set(0);
848 bit_buf.set(7);
849
850 let frozen = bit_buf.freeze();
852 assert_eq!(frozen.offset(), 4);
853 assert_eq!(frozen.len(), 8);
854
855 assert!(frozen.value(0));
857 assert!(frozen.value(7));
858 }
859
860 #[cfg_attr(miri, ignore)] #[test]
862 fn test_append_buffer_with_offsets() {
863 let source = bitbuffer![false, false, true, true, false, true];
865
866 let buf = BufferMut::zeroed(4);
868 let mut dest = BitBufferMut::from_buffer(buf, 3, 0);
869
870 dest.append(true);
872 dest.append(false);
873
874 dest.append_buffer(&source);
876
877 assert_eq!(dest.len(), 8);
878 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)); }
887
888 #[test]
889 fn test_set_unset_unchecked_with_offset() {
890 let buf = BufferMut::zeroed(3);
891 let mut bit_buf = BitBufferMut::from_buffer(buf, 7, 10);
892
893 unsafe {
894 bit_buf.set_unchecked(0);
895 bit_buf.set_unchecked(5);
896 bit_buf.set_unchecked(9);
897 }
898
899 assert!(bit_buf.value(0));
900 assert!(bit_buf.value(5));
901 assert!(bit_buf.value(9));
902
903 unsafe {
904 bit_buf.unset_unchecked(5);
905 }
906
907 assert!(!bit_buf.value(5));
908 }
909
910 #[test]
911 fn test_value_unchecked_with_offset() {
912 let buf = buffer_mut![0b11110000, 0b00001111];
913 let bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
914
915 unsafe {
916 assert!(bit_buf.value_unchecked(0));
918 assert!(bit_buf.value_unchecked(3));
919
920 assert!(bit_buf.value_unchecked(4));
922 assert!(bit_buf.value_unchecked(7));
923 }
924 }
925
926 #[test]
927 fn test_append_alternating_with_offset() {
928 let buf = BufferMut::zeroed(4);
929 let mut bit_buf = BitBufferMut::from_buffer(buf, 2, 0);
930
931 for i in 0..20 {
933 bit_buf.append(i % 2 == 0);
934 }
935
936 assert_eq!(bit_buf.len(), 20);
937 for i in 0..20 {
938 assert_eq!(bit_buf.value(i), i % 2 == 0);
939 }
940 }
941
942 #[test]
943 fn test_new_set_new_unset() {
944 let set_buf = bitbuffer_mut![true; 10];
945 let unset_buf = bitbuffer_mut![false; 10];
946
947 for i in 0..10 {
948 assert!(set_buf.value(i));
949 assert!(!unset_buf.value(i));
950 }
951
952 assert_eq!(set_buf.len(), 10);
953 assert_eq!(unset_buf.len(), 10);
954 }
955
956 #[test]
957 fn test_append_n_false_with_offset() {
958 let buf = BufferMut::zeroed(4);
959 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
960
961 bit_buf.append_n(false, 15);
962
963 assert_eq!(bit_buf.len(), 15);
964 for i in 0..15 {
965 assert!(!bit_buf.value(i));
966 }
967 }
968
969 #[test]
970 fn test_append_n_true_with_offset() {
971 let buf = BufferMut::zeroed(4);
972 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
973
974 bit_buf.append_n(true, 15);
975
976 assert_eq!(bit_buf.len(), 15);
977 for i in 0..15 {
978 assert!(bit_buf.value(i));
979 }
980 }
981
982 #[test]
983 fn test_mixed_operations_with_offset() {
984 let buf = BufferMut::zeroed(5);
986 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
987
988 bit_buf.append_n(true, 5);
990 bit_buf.append_n(false, 3);
991 bit_buf.append(true);
992
993 assert_eq!(bit_buf.len(), 9);
994
995 bit_buf.set(6); bit_buf.unset(2); assert!(bit_buf.value(0));
1001 assert!(bit_buf.value(1));
1002 assert!(!bit_buf.value(2)); assert!(bit_buf.value(3));
1004 assert!(bit_buf.value(4));
1005 assert!(!bit_buf.value(5));
1006 assert!(bit_buf.value(6)); assert!(!bit_buf.value(7));
1008 assert!(bit_buf.value(8));
1009
1010 bit_buf.truncate(6);
1012 assert_eq!(bit_buf.len(), 6);
1013
1014 let frozen = bit_buf.freeze();
1016 assert_eq!(frozen.offset(), 3);
1017 assert_eq!(frozen.len(), 6);
1018 }
1019
1020 #[test]
1021 fn test_from_iterator_with_incorrect_size_hint() {
1022 struct LyingIterator {
1029 values: Vec<bool>,
1030 index: usize,
1031 }
1032
1033 impl Iterator for LyingIterator {
1034 type Item = bool;
1035
1036 fn next(&mut self) -> Option<Self::Item> {
1037 (self.index < self.values.len()).then(|| {
1038 let val = self.values[self.index];
1039 self.index += 1;
1040 val
1041 })
1042 }
1043
1044 fn size_hint(&self) -> (usize, Option<usize>) {
1045 let remaining = self.values.len() - self.index;
1048 let lower = remaining.min(5); let upper = Some(5); (lower, upper)
1051 }
1052 }
1053
1054 let lying_iter = LyingIterator {
1056 values: vec![
1057 true, false, true, false, true, false, true, false, true, false,
1058 ],
1059 index: 0,
1060 };
1061
1062 let bit_buf: BitBufferMut = lying_iter.collect();
1065
1066 assert_eq!(bit_buf.len(), 10);
1068 for i in 0..10 {
1069 assert_eq!(bit_buf.value(i), i % 2 == 0);
1070 }
1071 }
1072}