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: impl IntoIterator<Item = usize>) -> BitBufferMut {
169 let mut buffer = BufferMut::<u64>::zeroed(len.div_ceil(64));
170 for idx in indices {
171 assert!(idx < len, "index {idx} exceeds len {len}");
172 buffer.as_mut_slice()[idx / 64] |= 1 << (idx % 64);
173 }
174
175 let mut buffer = buffer.into_byte_buffer();
176 buffer.truncate(len.div_ceil(8));
177
178 Self {
179 buffer,
180 offset: 0,
181 len,
182 }
183 }
184
185 #[inline]
187 pub fn collect_bool<F: FnMut(usize) -> bool>(len: usize, mut f: F) -> Self {
188 let mut buffer = BufferMut::with_capacity(len.div_ceil(64) * 8);
189
190 let chunks = len / 64;
191 let remainder = len % 64;
192 for chunk in 0..chunks {
193 let mut packed = 0;
194 for bit_idx in 0..64 {
195 let i = bit_idx + chunk * 64;
196 packed |= (f(i) as u64) << bit_idx;
197 }
198
199 unsafe { buffer.push_unchecked(packed) }
201 }
202
203 if remainder != 0 {
204 let mut packed = 0;
205 for bit_idx in 0..remainder {
206 let i = bit_idx + chunks * 64;
207 packed |= (f(i) as u64) << bit_idx;
208 }
209
210 unsafe { buffer.push_unchecked(packed) }
212 }
213
214 buffer.truncate(len.div_ceil(8));
215
216 Self {
217 buffer: buffer.into_byte_buffer(),
218 offset: 0,
219 len,
220 }
221 }
222
223 pub fn inner(&self) -> &ByteBufferMut {
225 &self.buffer
226 }
227
228 pub fn into_inner(self) -> ByteBufferMut {
230 self.buffer
231 }
232
233 #[inline(always)]
235 pub fn len(&self) -> usize {
236 self.len
237 }
238
239 #[inline(always)]
241 pub fn is_empty(&self) -> bool {
242 self.len == 0
243 }
244
245 #[inline(always)]
247 pub fn offset(&self) -> usize {
248 self.offset
249 }
250
251 #[inline(always)]
253 pub fn value(&self, index: usize) -> bool {
254 assert!(index < self.len);
255 unsafe { self.value_unchecked(index) }
257 }
258
259 #[inline(always)]
265 pub unsafe fn value_unchecked(&self, index: usize) -> bool {
266 unsafe { get_bit_unchecked(self.buffer.as_ptr(), self.offset + index) }
267 }
268
269 #[inline(always)]
271 pub fn capacity(&self) -> usize {
272 (self.buffer.capacity() * 8) - self.offset
273 }
274
275 pub fn reserve(&mut self, additional: usize) {
277 let required_bits = self.offset + self.len + additional;
278 let required_bytes = required_bits.div_ceil(8); let additional_bytes = required_bytes.saturating_sub(self.buffer.len());
281 self.buffer.reserve(additional_bytes);
282 }
283
284 pub fn clear(&mut self) {
286 self.len = 0;
288 self.offset = 0;
289 }
290
291 pub fn set_to(&mut self, index: usize, value: bool) {
295 if value {
296 self.set(index);
297 } else {
298 self.unset(index);
299 }
300 }
301
302 pub unsafe fn set_to_unchecked(&mut self, index: usize, value: bool) {
308 if value {
309 unsafe { self.set_unchecked(index) }
311 } else {
312 unsafe { self.unset_unchecked(index) }
314 }
315 }
316
317 pub fn set(&mut self, index: usize) {
321 assert!(index < self.len, "index {index} exceeds len {}", self.len);
322
323 unsafe { self.set_unchecked(index) };
325 }
326
327 #[inline]
331 pub fn unset(&mut self, index: usize) {
332 assert!(index < self.len, "index {index} exceeds len {}", self.len);
333
334 unsafe { self.unset_unchecked(index) };
336 }
337
338 #[inline]
346 pub unsafe fn set_unchecked(&mut self, index: usize) {
347 unsafe { set_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
349 }
350
351 #[inline]
359 pub unsafe fn unset_unchecked(&mut self, index: usize) {
360 unsafe { unset_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
362 }
363
364 #[inline(always)]
371 pub unsafe fn set_len(&mut self, new_len: usize) {
372 debug_assert!(
373 new_len <= self.capacity(),
374 "`set_len` requires that new_len <= capacity()"
375 );
376
377 let bytes_len = (self.offset + new_len).div_ceil(8);
379 unsafe { self.buffer.set_len(bytes_len) };
380
381 self.len = new_len;
382 }
383
384 pub fn truncate(&mut self, len: usize) {
388 if len > self.len {
389 return;
390 }
391
392 let new_len_bytes = (self.offset + len).div_ceil(8);
393 self.buffer.truncate(new_len_bytes);
394 self.len = len;
395 }
396
397 pub fn append(&mut self, value: bool) {
399 if value {
400 self.append_true()
401 } else {
402 self.append_false()
403 }
404 }
405
406 pub fn append_true(&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 self.buffer.as_mut_slice()[byte_pos] |= 1 << bit_in_byte;
419 self.len += 1;
420 }
421
422 pub fn append_false(&mut self) {
424 let bit_pos = self.offset + self.len;
425 let byte_pos = bit_pos / 8;
426 let bit_in_byte = bit_pos % 8;
427
428 if byte_pos >= self.buffer.len() {
430 self.buffer.push(0u8);
431 }
432
433 if bit_in_byte != 0 {
435 self.buffer.as_mut_slice()[byte_pos] &= !(1 << bit_in_byte);
436 }
437
438 self.len += 1;
439 }
440
441 #[inline]
446 pub fn append_n(&mut self, value: bool, n: usize) {
447 if n == 0 {
448 return;
449 }
450
451 let end_bit_pos = self.offset + self.len + n;
452 let required_bytes = end_bit_pos.div_ceil(8);
453
454 if required_bytes > self.buffer.len() {
456 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
457 }
458
459 let start = self.len;
460 self.len += n;
461 self.fill_range(start, self.len, value);
462 }
463
464 #[inline(always)]
469 pub fn fill_range(&mut self, start: usize, end: usize, value: bool) {
470 assert!(end <= self.len, "end {end} exceeds len {}", self.len);
471 assert!(start <= end, "start {start} exceeds end {end}");
472
473 unsafe { self.fill_range_unchecked(start, end, value) }
476 }
477
478 #[inline(always)]
484 pub unsafe fn fill_range_unchecked(&mut self, start: usize, end: usize, value: bool) {
485 fill_bits(
486 self.buffer.as_mut_slice(),
487 self.offset + start,
488 self.offset + end,
489 value,
490 );
491 }
492
493 pub fn append_buffer(&mut self, buffer: &BitBuffer) {
497 let bit_len = buffer.len();
498 if bit_len == 0 {
499 return;
500 }
501
502 let start_bit_pos = self.offset + self.len;
503 let end_bit_pos = start_bit_pos + bit_len;
504 let required_bytes = end_bit_pos.div_ceil(8);
505
506 if required_bytes > self.buffer.len() {
508 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
509 }
510
511 let self_slice = self
513 .buffer
514 .as_mut_slice()
515 .view_bits_mut::<bitvec::prelude::Lsb0>();
516 let other_slice = buffer
517 .inner()
518 .as_slice()
519 .view_bits::<bitvec::prelude::Lsb0>();
520
521 let source_range = buffer.offset()..buffer.offset() + bit_len;
523 self_slice[start_bit_pos..end_bit_pos].copy_from_bitslice(&other_slice[source_range]);
524
525 self.len += bit_len;
526 }
527
528 pub fn unsplit(&mut self, other: Self) {
536 if (self.offset + self.len).is_multiple_of(8) && other.offset == 0 {
537 self.buffer.unsplit(other.buffer);
539 self.len += other.len;
540 return;
541 }
542
543 self.append_buffer(&other.freeze())
545 }
546
547 pub fn freeze(self) -> BitBuffer {
549 BitBuffer::new_with_offset(self.buffer.freeze(), self.len, self.offset)
550 }
551
552 pub fn as_slice(&self) -> &[u8] {
554 self.buffer.as_slice()
555 }
556
557 pub fn as_mut_slice(&mut self) -> &mut [u8] {
559 self.buffer.as_mut_slice()
560 }
561}
562
563impl Default for BitBufferMut {
564 fn default() -> Self {
565 Self::with_capacity(0)
566 }
567}
568
569impl Not for BitBufferMut {
571 type Output = BitBufferMut;
572
573 #[inline]
574 fn not(mut self) -> Self::Output {
575 ops::bitwise_unary_op_mut(&mut self, |b| !b);
576 self
577 }
578}
579
580impl From<&[bool]> for BitBufferMut {
581 fn from(value: &[bool]) -> Self {
582 BitBufferMut::collect_bool(value.len(), |i| value[i])
583 }
584}
585
586impl From<&[u8]> for BitBufferMut {
588 fn from(value: &[u8]) -> Self {
589 BitBufferMut::collect_bool(value.len(), |i| value[i] > 0)
590 }
591}
592
593impl From<Vec<bool>> for BitBufferMut {
594 fn from(value: Vec<bool>) -> Self {
595 value.as_slice().into()
596 }
597}
598
599impl FromIterator<bool> for BitBufferMut {
600 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
601 let mut iter = iter.into_iter();
602
603 let (lower_bound, _) = iter.size_hint();
606
607 let mut buf = BitBufferMut::new_unset(lower_bound);
612 assert_eq!(buf.offset, 0);
613
614 let ptr = buf.buffer.as_mut_ptr();
616 for i in 0..lower_bound {
617 let Some(v) = iter.next() else {
618 unsafe { buf.set_len(i) };
621 return buf;
622 };
623
624 if v {
625 unsafe { set_bit_unchecked(ptr, i) }
627 }
628 }
629
630 for v in iter {
632 buf.append(v);
633 }
634
635 buf
636 }
637}
638
639#[cfg(test)]
640mod tests {
641 use crate::BufferMut;
642 use crate::bit::buf_mut::BitBufferMut;
643 use crate::bitbuffer;
644 use crate::bitbuffer_mut;
645 use crate::buffer_mut;
646
647 #[test]
648 fn test_bits_mut() {
649 let mut bools = bitbuffer_mut![false; 10];
650 bools.set_to(0, true);
651 bools.set_to(9, true);
652
653 let bools = bools.freeze();
654 assert!(bools.value(0));
655 for i in 1..=8 {
656 assert!(!bools.value(i));
657 }
658 assert!(bools.value(9));
659 }
660
661 #[test]
662 fn test_append_n() {
663 let mut bools = BitBufferMut::with_capacity(10);
664 assert_eq!(bools.len(), 0);
665 assert!(bools.is_empty());
666
667 bools.append(true);
668 bools.append_n(false, 8);
669 bools.append_n(true, 1);
670
671 let bools = bools.freeze();
672
673 assert_eq!(bools.true_count(), 2);
674 assert!(bools.value(0));
675 assert!(bools.value(9));
676 }
677
678 #[test]
679 fn test_reserve_ensures_len_plus_additional() {
680 let mut bits = BitBufferMut::with_capacity(10);
684 assert_eq!(bits.len(), 0);
685
686 bits.reserve(100);
687
688 assert!(bits.capacity() >= 100);
690
691 bits.append_n(true, 50);
692 assert_eq!(bits.len(), 50);
693
694 bits.reserve(100);
695
696 assert!(bits.capacity() >= 150);
698 }
699
700 #[test]
701 fn test_with_offset_zero() {
702 let buf = BufferMut::zeroed(2);
704 let mut bit_buf = BitBufferMut::from_buffer(buf, 0, 16);
705
706 bit_buf.set(0);
708 bit_buf.set(7);
709 bit_buf.set(8);
710 bit_buf.set(15);
711
712 assert!(bit_buf.value(0));
714 assert!(bit_buf.value(7));
715 assert!(bit_buf.value(8));
716 assert!(bit_buf.value(15));
717 assert!(!bit_buf.value(1));
718 assert!(!bit_buf.value(9));
719
720 assert_eq!(bit_buf.as_slice()[0], 0b10000001);
722 assert_eq!(bit_buf.as_slice()[1], 0b10000001);
723 }
724
725 #[test]
726 fn test_with_offset_within_byte() {
727 let buf = buffer_mut![0b11111111, 0b00000000, 0b00000000];
729 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 10);
730
731 assert!(bit_buf.value(0)); assert!(bit_buf.value(4)); assert!(!bit_buf.value(5)); bit_buf.set(7);
739 assert!(bit_buf.value(7));
740
741 bit_buf.unset(0);
743 assert!(!bit_buf.value(0));
744 }
745
746 #[test]
747 fn test_with_offset_byte_boundary() {
748 let buf = buffer_mut![0xFF, 0x00, 0xFF];
750 let mut bit_buf = BitBufferMut::from_buffer(buf, 8, 16);
751
752 for i in 0..8 {
754 assert!(!bit_buf.value(i));
755 }
756 for i in 8..16 {
758 assert!(bit_buf.value(i));
759 }
760
761 bit_buf.set(0);
763 bit_buf.set(3);
764 assert!(bit_buf.value(0));
765 assert!(bit_buf.value(3));
766 }
767
768 #[test]
769 fn test_with_large_offset() {
770 let buf = buffer_mut![0xFF, 0xFF, 0xFF, 0xFF];
772 let mut bit_buf = BitBufferMut::from_buffer(buf, 13, 10);
773
774 for i in 0..10 {
776 assert!(bit_buf.value(i));
777 }
778
779 bit_buf.unset(0);
781 bit_buf.unset(5);
782 bit_buf.unset(9);
783
784 assert!(!bit_buf.value(0));
785 assert!(bit_buf.value(1));
786 assert!(!bit_buf.value(5));
787 assert!(!bit_buf.value(9));
788 }
789
790 #[test]
791 fn test_append_with_offset() {
792 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);
802 assert!(!bit_buf.value(0));
803 assert!(bit_buf.value(1));
804 assert!(bit_buf.value(2));
805 }
806
807 #[test]
808 fn test_append_n_with_offset_crossing_boundary() {
809 let buf = BufferMut::zeroed(4);
811 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
812
813 bit_buf.append_n(true, 10); assert_eq!(bit_buf.len(), 10);
817 for i in 0..10 {
818 assert!(bit_buf.value(i));
819 }
820
821 assert_eq!(bit_buf.as_slice()[0], 0b11100000);
825 assert_eq!(bit_buf.as_slice()[1], 0b01111111);
826 }
827
828 #[test]
829 fn test_truncate_with_offset() {
830 let buf = buffer_mut![0xFF, 0xFF];
831 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 12);
832
833 assert_eq!(bit_buf.len(), 12);
834
835 bit_buf.truncate(8);
837 assert_eq!(bit_buf.len(), 8);
838
839 bit_buf.truncate(3);
841 assert_eq!(bit_buf.len(), 3);
842
843 bit_buf.truncate(10);
845 assert_eq!(bit_buf.len(), 3);
846 }
847
848 #[test]
849 fn test_capacity_with_offset() {
850 let buf = buffer_mut![0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
853
854 assert!(bit_buf.capacity() >= 75);
857 assert_eq!(bit_buf.capacity() % 8, (80 - 5) % 8);
859 }
860
861 #[test]
862 fn test_reserve_with_offset() {
863 let buf = buffer_mut![0, 0]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
866
867 let initial_capacity = bit_buf.capacity();
869 assert!(initial_capacity >= 13);
870
871 bit_buf.reserve(20);
873
874 assert!(bit_buf.capacity() >= 20);
876 }
877
878 #[test]
879 fn test_freeze_with_offset() {
880 let buf = buffer_mut![0b11110000, 0b00001111];
881 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
882
883 bit_buf.set(0);
885 bit_buf.set(7);
886
887 let frozen = bit_buf.freeze();
889 assert_eq!(frozen.offset(), 4);
890 assert_eq!(frozen.len(), 8);
891
892 assert!(frozen.value(0));
894 assert!(frozen.value(7));
895 }
896
897 #[cfg_attr(miri, ignore)] #[test]
899 fn test_append_buffer_with_offsets() {
900 let source = bitbuffer![false, false, true, true, false, true];
902
903 let buf = BufferMut::zeroed(4);
905 let mut dest = BitBufferMut::from_buffer(buf, 3, 0);
906
907 dest.append(true);
909 dest.append(false);
910
911 dest.append_buffer(&source);
913
914 assert_eq!(dest.len(), 8);
915 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)); }
924
925 #[test]
926 fn test_set_unset_unchecked_with_offset() {
927 let buf = BufferMut::zeroed(3);
928 let mut bit_buf = BitBufferMut::from_buffer(buf, 7, 10);
929
930 unsafe {
931 bit_buf.set_unchecked(0);
932 bit_buf.set_unchecked(5);
933 bit_buf.set_unchecked(9);
934 }
935
936 assert!(bit_buf.value(0));
937 assert!(bit_buf.value(5));
938 assert!(bit_buf.value(9));
939
940 unsafe {
941 bit_buf.unset_unchecked(5);
942 }
943
944 assert!(!bit_buf.value(5));
945 }
946
947 #[test]
948 fn test_value_unchecked_with_offset() {
949 let buf = buffer_mut![0b11110000, 0b00001111];
950 let bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
951
952 unsafe {
953 assert!(bit_buf.value_unchecked(0));
955 assert!(bit_buf.value_unchecked(3));
956
957 assert!(bit_buf.value_unchecked(4));
959 assert!(bit_buf.value_unchecked(7));
960 }
961 }
962
963 #[test]
964 fn test_append_alternating_with_offset() {
965 let buf = BufferMut::zeroed(4);
966 let mut bit_buf = BitBufferMut::from_buffer(buf, 2, 0);
967
968 for i in 0..20 {
970 bit_buf.append(i % 2 == 0);
971 }
972
973 assert_eq!(bit_buf.len(), 20);
974 for i in 0..20 {
975 assert_eq!(bit_buf.value(i), i % 2 == 0);
976 }
977 }
978
979 #[test]
980 fn test_new_set_new_unset() {
981 let set_buf = bitbuffer_mut![true; 10];
982 let unset_buf = bitbuffer_mut![false; 10];
983
984 for i in 0..10 {
985 assert!(set_buf.value(i));
986 assert!(!unset_buf.value(i));
987 }
988
989 assert_eq!(set_buf.len(), 10);
990 assert_eq!(unset_buf.len(), 10);
991 }
992
993 #[test]
994 fn test_append_n_false_with_offset() {
995 let buf = BufferMut::zeroed(4);
996 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
997
998 bit_buf.append_n(false, 15);
999
1000 assert_eq!(bit_buf.len(), 15);
1001 for i in 0..15 {
1002 assert!(!bit_buf.value(i));
1003 }
1004 }
1005
1006 #[test]
1007 fn test_append_n_true_with_offset() {
1008 let buf = BufferMut::zeroed(4);
1009 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1010
1011 bit_buf.append_n(true, 15);
1012
1013 assert_eq!(bit_buf.len(), 15);
1014 for i in 0..15 {
1015 assert!(bit_buf.value(i));
1016 }
1017 }
1018
1019 #[test]
1020 fn test_mixed_operations_with_offset() {
1021 let buf = BufferMut::zeroed(5);
1023 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
1024
1025 bit_buf.append_n(true, 5);
1027 bit_buf.append_n(false, 3);
1028 bit_buf.append(true);
1029
1030 assert_eq!(bit_buf.len(), 9);
1031
1032 bit_buf.set(6); bit_buf.unset(2); assert!(bit_buf.value(0));
1038 assert!(bit_buf.value(1));
1039 assert!(!bit_buf.value(2)); assert!(bit_buf.value(3));
1041 assert!(bit_buf.value(4));
1042 assert!(!bit_buf.value(5));
1043 assert!(bit_buf.value(6)); assert!(!bit_buf.value(7));
1045 assert!(bit_buf.value(8));
1046
1047 bit_buf.truncate(6);
1049 assert_eq!(bit_buf.len(), 6);
1050
1051 let frozen = bit_buf.freeze();
1053 assert_eq!(frozen.offset(), 3);
1054 assert_eq!(frozen.len(), 6);
1055 }
1056
1057 #[test]
1058 fn test_from_iterator_with_incorrect_size_hint() {
1059 struct LyingIterator {
1066 values: Vec<bool>,
1067 index: usize,
1068 }
1069
1070 impl Iterator for LyingIterator {
1071 type Item = bool;
1072
1073 fn next(&mut self) -> Option<Self::Item> {
1074 (self.index < self.values.len()).then(|| {
1075 let val = self.values[self.index];
1076 self.index += 1;
1077 val
1078 })
1079 }
1080
1081 fn size_hint(&self) -> (usize, Option<usize>) {
1082 let remaining = self.values.len() - self.index;
1085 let lower = remaining.min(5); let upper = Some(5); (lower, upper)
1088 }
1089 }
1090
1091 let lying_iter = LyingIterator {
1093 values: vec![
1094 true, false, true, false, true, false, true, false, true, false,
1095 ],
1096 index: 0,
1097 };
1098
1099 let bit_buf: BitBufferMut = lying_iter.collect();
1102
1103 assert_eq!(bit_buf.len(), 10);
1105 for i in 0..10 {
1106 assert_eq!(bit_buf.value(i), i % 2 == 0);
1107 }
1108 }
1109}