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)]
20pub(crate) fn 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 #[inline]
279 pub fn set_to(&mut self, index: usize, value: bool) {
280 if value {
281 self.set(index);
282 } else {
283 self.unset(index);
284 }
285 }
286
287 #[inline]
293 pub unsafe fn set_to_unchecked(&mut self, index: usize, value: bool) {
294 if value {
295 unsafe { self.set_unchecked(index) }
297 } else {
298 unsafe { self.unset_unchecked(index) }
300 }
301 }
302
303 #[inline]
307 pub fn set(&mut self, index: usize) {
308 assert!(index < self.len, "index {index} exceeds len {}", self.len);
309
310 unsafe { self.set_unchecked(index) };
312 }
313
314 #[inline]
318 pub fn unset(&mut self, index: usize) {
319 assert!(index < self.len, "index {index} exceeds len {}", self.len);
320
321 unsafe { self.unset_unchecked(index) };
323 }
324
325 #[inline]
333 pub unsafe fn set_unchecked(&mut self, index: usize) {
334 unsafe { set_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
336 }
337
338 #[inline]
346 pub unsafe fn unset_unchecked(&mut self, index: usize) {
347 unsafe { unset_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
349 }
350
351 #[inline(always)]
358 pub unsafe fn set_len(&mut self, new_len: usize) {
359 debug_assert!(
360 new_len <= self.capacity(),
361 "`set_len` requires that new_len <= capacity()"
362 );
363
364 let bytes_len = (self.offset + new_len).div_ceil(8);
366 unsafe { self.buffer.set_len(bytes_len) };
367
368 self.len = new_len;
369 }
370
371 pub fn truncate(&mut self, len: usize) {
375 if len > self.len {
376 return;
377 }
378
379 let end_bit = self.offset + len;
380 let new_len_bytes = end_bit.div_ceil(8);
381 self.buffer.truncate(new_len_bytes);
382 self.len = len;
383
384 if !end_bit.is_multiple_of(8) {
387 let keep = (1u8 << (end_bit % 8)) - 1;
388 self.buffer.as_mut_slice()[new_len_bytes - 1] &= keep;
389 }
390 }
391
392 #[inline]
394 pub fn append(&mut self, value: bool) {
395 if value {
396 self.append_true()
397 } else {
398 self.append_false()
399 }
400 }
401
402 #[inline]
404 pub fn append_true(&mut self) {
405 let bit_pos = self.offset + self.len;
406 let byte_pos = bit_pos / 8;
407 let bit_in_byte = bit_pos % 8;
408
409 if byte_pos >= self.buffer.len() {
411 self.buffer.push(0u8);
412 }
413
414 self.buffer.as_mut_slice()[byte_pos] |= 1 << bit_in_byte;
416 self.len += 1;
417 }
418
419 #[inline]
421 pub fn append_false(&mut self) {
422 let bit_pos = self.offset + self.len;
423 let byte_pos = bit_pos / 8;
424
425 if byte_pos >= self.buffer.len() {
427 self.buffer.push(0u8);
428 }
429
430 self.len += 1;
433 }
434
435 #[inline]
440 pub fn append_n(&mut self, value: bool, n: usize) {
441 if n == 0 {
442 return;
443 }
444
445 let end_bit_pos = self.offset + self.len + n;
446 let required_bytes = end_bit_pos.div_ceil(8);
447
448 if required_bytes > self.buffer.len() {
450 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
451 }
452
453 let start = self.len;
454 self.len += n;
455 self.fill_range(start, self.len, value);
456 }
457
458 #[inline(always)]
463 pub fn fill_range(&mut self, start: usize, end: usize, value: bool) {
464 assert!(end <= self.len, "end {end} exceeds len {}", self.len);
465 assert!(start <= end, "start {start} exceeds end {end}");
466
467 unsafe { self.fill_range_unchecked(start, end, value) }
470 }
471
472 #[inline(always)]
478 pub unsafe fn fill_range_unchecked(&mut self, start: usize, end: usize, value: bool) {
479 fill_bits(
480 self.buffer.as_mut_slice(),
481 self.offset + start,
482 self.offset + end,
483 value,
484 );
485 }
486
487 pub fn append_buffer(&mut self, buffer: &BitBuffer) {
491 let bit_len = buffer.len();
492 if bit_len == 0 {
493 return;
494 }
495
496 let start_bit_pos = self.offset + self.len;
497 let end_bit_pos = start_bit_pos + bit_len;
498 let required_bytes = end_bit_pos.div_ceil(8);
499
500 if required_bytes > self.buffer.len() {
502 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
503 }
504
505 let dst_bit_offset = start_bit_pos % 8;
506 let src_bit_offset = buffer.offset();
507
508 if dst_bit_offset == 0 && src_bit_offset == 0 {
509 let dst_byte = start_bit_pos / 8;
511 let src_bytes = buffer.inner().as_slice();
512 let full_bytes = bit_len / 8;
513 self.buffer.as_mut_slice()[dst_byte..dst_byte + full_bytes]
514 .copy_from_slice(&src_bytes[..full_bytes]);
515 let rem = bit_len % 8;
516 if rem != 0 {
517 let mask = (1u8 << rem) - 1;
518 self.buffer.as_mut_slice()[dst_byte + full_bytes] |= src_bytes[full_bytes] & mask;
519 }
520 } else {
521 let self_slice = self
523 .buffer
524 .as_mut_slice()
525 .view_bits_mut::<bitvec::prelude::Lsb0>();
526 let other_slice = buffer
527 .inner()
528 .as_slice()
529 .view_bits::<bitvec::prelude::Lsb0>();
530 let source_range = src_bit_offset..src_bit_offset + bit_len;
531 self_slice[start_bit_pos..end_bit_pos].copy_from_bitslice(&other_slice[source_range]);
532 }
533
534 self.len += bit_len;
535 }
536
537 pub fn unsplit(&mut self, other: Self) {
545 if (self.offset + self.len).is_multiple_of(8) && other.offset == 0 {
546 self.buffer.unsplit(other.buffer);
548 self.len += other.len;
549 return;
550 }
551
552 self.append_buffer(&other.freeze())
554 }
555
556 pub fn freeze(self) -> BitBuffer {
558 BitBuffer::new_with_offset(self.buffer.freeze(), self.len, self.offset)
559 }
560
561 pub fn as_slice(&self) -> &[u8] {
563 self.buffer.as_slice()
564 }
565
566 pub fn as_mut_slice(&mut self) -> &mut [u8] {
568 self.buffer.as_mut_slice()
569 }
570}
571
572impl Default for BitBufferMut {
573 fn default() -> Self {
574 Self::with_capacity(0)
575 }
576}
577
578impl Not for BitBufferMut {
580 type Output = BitBufferMut;
581
582 #[inline]
583 fn not(mut self) -> Self::Output {
584 ops::bitwise_unary_op_mut(&mut self, |b| !b);
585 self
586 }
587}
588
589impl From<&[bool]> for BitBufferMut {
590 fn from(value: &[bool]) -> Self {
591 BitBufferMut::collect_bool(value.len(), |i| value[i])
592 }
593}
594
595impl From<&[u8]> for BitBufferMut {
597 fn from(value: &[u8]) -> Self {
598 BitBufferMut::collect_bool(value.len(), |i| value[i] > 0)
599 }
600}
601
602impl From<Vec<bool>> for BitBufferMut {
603 fn from(value: Vec<bool>) -> Self {
604 value.as_slice().into()
605 }
606}
607
608impl FromIterator<bool> for BitBufferMut {
609 #[inline]
610 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
611 let mut iter = iter.into_iter();
612
613 let (lower_bound, _) = iter.size_hint();
616
617 let mut buf = BitBufferMut::new_unset(lower_bound);
622 assert_eq!(buf.offset, 0);
623
624 let ptr = buf.buffer.as_mut_ptr();
626 for i in 0..lower_bound {
627 let Some(v) = iter.next() else {
628 unsafe { buf.set_len(i) };
631 return buf;
632 };
633
634 if v {
635 unsafe { set_bit_unchecked(ptr, i) }
637 }
638 }
639
640 for v in iter {
643 buf.append(v);
644 }
645
646 buf
647 }
648}
649
650#[cfg(test)]
651mod tests {
652 use crate::BufferMut;
653 use crate::bit::buf_mut::BitBufferMut;
654 use crate::bitbuffer;
655 use crate::bitbuffer_mut;
656 use crate::buffer_mut;
657
658 #[test]
659 fn test_bits_mut() {
660 let mut bools = bitbuffer_mut![false; 10];
661 bools.set_to(0, true);
662 bools.set_to(9, true);
663
664 let bools = bools.freeze();
665 assert!(bools.value(0));
666 for i in 1..=8 {
667 assert!(!bools.value(i));
668 }
669 assert!(bools.value(9));
670 }
671
672 #[test]
673 fn test_append_n() {
674 let mut bools = BitBufferMut::with_capacity(10);
675 assert_eq!(bools.len(), 0);
676 assert!(bools.is_empty());
677
678 bools.append(true);
679 bools.append_n(false, 8);
680 bools.append_n(true, 1);
681
682 let bools = bools.freeze();
683
684 assert_eq!(bools.true_count(), 2);
685 assert!(bools.value(0));
686 assert!(bools.value(9));
687 }
688
689 #[test]
690 fn append_false_after_truncate_reads_back_false() {
691 let mut bools = BitBufferMut::new_set(16);
694 bools.truncate(12);
695 bools.append_false();
696 bools.append_true();
697
698 let bools = bools.freeze();
699 assert_eq!(bools.len(), 14);
700 assert!(
701 !bools.value(12),
702 "appended false must read back false after truncate"
703 );
704 assert!(bools.value(13));
705 }
706
707 #[test]
708 fn test_reserve_ensures_len_plus_additional() {
709 let mut bits = BitBufferMut::with_capacity(10);
713 assert_eq!(bits.len(), 0);
714
715 bits.reserve(100);
716
717 assert!(bits.capacity() >= 100);
719
720 bits.append_n(true, 50);
721 assert_eq!(bits.len(), 50);
722
723 bits.reserve(100);
724
725 assert!(bits.capacity() >= 150);
727 }
728
729 #[test]
730 fn test_with_offset_zero() {
731 let buf = BufferMut::zeroed(2);
733 let mut bit_buf = BitBufferMut::from_buffer(buf, 0, 16);
734
735 bit_buf.set(0);
737 bit_buf.set(7);
738 bit_buf.set(8);
739 bit_buf.set(15);
740
741 assert!(bit_buf.value(0));
743 assert!(bit_buf.value(7));
744 assert!(bit_buf.value(8));
745 assert!(bit_buf.value(15));
746 assert!(!bit_buf.value(1));
747 assert!(!bit_buf.value(9));
748
749 assert_eq!(bit_buf.as_slice()[0], 0b10000001);
751 assert_eq!(bit_buf.as_slice()[1], 0b10000001);
752 }
753
754 #[test]
755 fn test_with_offset_within_byte() {
756 let buf = buffer_mut![0b11111111, 0b00000000, 0b00000000];
758 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 10);
759
760 assert!(bit_buf.value(0)); assert!(bit_buf.value(4)); assert!(!bit_buf.value(5)); bit_buf.set(7);
768 assert!(bit_buf.value(7));
769
770 bit_buf.unset(0);
772 assert!(!bit_buf.value(0));
773 }
774
775 #[test]
776 fn test_with_offset_byte_boundary() {
777 let buf = buffer_mut![0xFF, 0x00, 0xFF];
779 let mut bit_buf = BitBufferMut::from_buffer(buf, 8, 16);
780
781 for i in 0..8 {
783 assert!(!bit_buf.value(i));
784 }
785 for i in 8..16 {
787 assert!(bit_buf.value(i));
788 }
789
790 bit_buf.set(0);
792 bit_buf.set(3);
793 assert!(bit_buf.value(0));
794 assert!(bit_buf.value(3));
795 }
796
797 #[test]
798 fn test_with_large_offset() {
799 let buf = buffer_mut![0xFF, 0xFF, 0xFF, 0xFF];
801 let mut bit_buf = BitBufferMut::from_buffer(buf, 13, 10);
802
803 for i in 0..10 {
805 assert!(bit_buf.value(i));
806 }
807
808 bit_buf.unset(0);
810 bit_buf.unset(5);
811 bit_buf.unset(9);
812
813 assert!(!bit_buf.value(0));
814 assert!(bit_buf.value(1));
815 assert!(!bit_buf.value(5));
816 assert!(!bit_buf.value(9));
817 }
818
819 #[test]
820 fn test_append_with_offset() {
821 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);
831 assert!(!bit_buf.value(0));
832 assert!(bit_buf.value(1));
833 assert!(bit_buf.value(2));
834 }
835
836 #[test]
837 fn test_append_n_with_offset_crossing_boundary() {
838 let buf = BufferMut::zeroed(4);
840 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
841
842 bit_buf.append_n(true, 10); assert_eq!(bit_buf.len(), 10);
846 for i in 0..10 {
847 assert!(bit_buf.value(i));
848 }
849
850 assert_eq!(bit_buf.as_slice()[0], 0b11100000);
854 assert_eq!(bit_buf.as_slice()[1], 0b01111111);
855 }
856
857 #[test]
858 fn test_truncate_with_offset() {
859 let buf = buffer_mut![0xFF, 0xFF];
860 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 12);
861
862 assert_eq!(bit_buf.len(), 12);
863
864 bit_buf.truncate(8);
866 assert_eq!(bit_buf.len(), 8);
867
868 bit_buf.truncate(3);
870 assert_eq!(bit_buf.len(), 3);
871
872 bit_buf.truncate(10);
874 assert_eq!(bit_buf.len(), 3);
875 }
876
877 #[test]
878 fn test_capacity_with_offset() {
879 let buf = buffer_mut![0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
882
883 assert!(bit_buf.capacity() >= 75);
886 assert_eq!(bit_buf.capacity() % 8, (80 - 5) % 8);
888 }
889
890 #[test]
891 fn test_reserve_with_offset() {
892 let buf = buffer_mut![0, 0]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
895
896 let initial_capacity = bit_buf.capacity();
898 assert!(initial_capacity >= 13);
899
900 bit_buf.reserve(20);
902
903 assert!(bit_buf.capacity() >= 20);
905 }
906
907 #[test]
908 fn test_freeze_with_offset() {
909 let buf = buffer_mut![0b11110000, 0b00001111];
910 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
911
912 bit_buf.set(0);
914 bit_buf.set(7);
915
916 let frozen = bit_buf.freeze();
918 assert_eq!(frozen.offset(), 4);
919 assert_eq!(frozen.len(), 8);
920
921 assert!(frozen.value(0));
923 assert!(frozen.value(7));
924 }
925
926 #[cfg_attr(miri, ignore)] #[test]
928 fn test_append_buffer_with_offsets() {
929 let source = bitbuffer![false, false, true, true, false, true];
931
932 let buf = BufferMut::zeroed(4);
934 let mut dest = BitBufferMut::from_buffer(buf, 3, 0);
935
936 dest.append(true);
938 dest.append(false);
939
940 dest.append_buffer(&source);
942
943 assert_eq!(dest.len(), 8);
944 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)); }
953
954 #[test]
955 fn test_set_unset_unchecked_with_offset() {
956 let buf = BufferMut::zeroed(3);
957 let mut bit_buf = BitBufferMut::from_buffer(buf, 7, 10);
958
959 unsafe {
960 bit_buf.set_unchecked(0);
961 bit_buf.set_unchecked(5);
962 bit_buf.set_unchecked(9);
963 }
964
965 assert!(bit_buf.value(0));
966 assert!(bit_buf.value(5));
967 assert!(bit_buf.value(9));
968
969 unsafe {
970 bit_buf.unset_unchecked(5);
971 }
972
973 assert!(!bit_buf.value(5));
974 }
975
976 #[test]
977 fn test_value_unchecked_with_offset() {
978 let buf = buffer_mut![0b11110000, 0b00001111];
979 let bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
980
981 unsafe {
982 assert!(bit_buf.value_unchecked(0));
984 assert!(bit_buf.value_unchecked(3));
985
986 assert!(bit_buf.value_unchecked(4));
988 assert!(bit_buf.value_unchecked(7));
989 }
990 }
991
992 #[test]
993 fn test_append_alternating_with_offset() {
994 let buf = BufferMut::zeroed(4);
995 let mut bit_buf = BitBufferMut::from_buffer(buf, 2, 0);
996
997 for i in 0..20 {
999 bit_buf.append(i % 2 == 0);
1000 }
1001
1002 assert_eq!(bit_buf.len(), 20);
1003 for i in 0..20 {
1004 assert_eq!(bit_buf.value(i), i % 2 == 0);
1005 }
1006 }
1007
1008 #[test]
1009 fn test_new_set_new_unset() {
1010 let set_buf = bitbuffer_mut![true; 10];
1011 let unset_buf = bitbuffer_mut![false; 10];
1012
1013 for i in 0..10 {
1014 assert!(set_buf.value(i));
1015 assert!(!unset_buf.value(i));
1016 }
1017
1018 assert_eq!(set_buf.len(), 10);
1019 assert_eq!(unset_buf.len(), 10);
1020 }
1021
1022 #[test]
1023 fn test_append_n_false_with_offset() {
1024 let buf = BufferMut::zeroed(4);
1025 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1026
1027 bit_buf.append_n(false, 15);
1028
1029 assert_eq!(bit_buf.len(), 15);
1030 for i in 0..15 {
1031 assert!(!bit_buf.value(i));
1032 }
1033 }
1034
1035 #[test]
1036 fn test_append_n_true_with_offset() {
1037 let buf = BufferMut::zeroed(4);
1038 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1039
1040 bit_buf.append_n(true, 15);
1041
1042 assert_eq!(bit_buf.len(), 15);
1043 for i in 0..15 {
1044 assert!(bit_buf.value(i));
1045 }
1046 }
1047
1048 #[test]
1049 fn test_mixed_operations_with_offset() {
1050 let buf = BufferMut::zeroed(5);
1052 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
1053
1054 bit_buf.append_n(true, 5);
1056 bit_buf.append_n(false, 3);
1057 bit_buf.append(true);
1058
1059 assert_eq!(bit_buf.len(), 9);
1060
1061 bit_buf.set(6); bit_buf.unset(2); assert!(bit_buf.value(0));
1067 assert!(bit_buf.value(1));
1068 assert!(!bit_buf.value(2)); assert!(bit_buf.value(3));
1070 assert!(bit_buf.value(4));
1071 assert!(!bit_buf.value(5));
1072 assert!(bit_buf.value(6)); assert!(!bit_buf.value(7));
1074 assert!(bit_buf.value(8));
1075
1076 bit_buf.truncate(6);
1078 assert_eq!(bit_buf.len(), 6);
1079
1080 let frozen = bit_buf.freeze();
1082 assert_eq!(frozen.offset(), 3);
1083 assert_eq!(frozen.len(), 6);
1084 }
1085
1086 #[test]
1087 fn test_from_iterator_with_incorrect_size_hint() {
1088 struct LyingIterator {
1095 values: Vec<bool>,
1096 index: usize,
1097 }
1098
1099 impl Iterator for LyingIterator {
1100 type Item = bool;
1101
1102 fn next(&mut self) -> Option<Self::Item> {
1103 (self.index < self.values.len()).then(|| {
1104 let val = self.values[self.index];
1105 self.index += 1;
1106 val
1107 })
1108 }
1109
1110 fn size_hint(&self) -> (usize, Option<usize>) {
1111 let remaining = self.values.len() - self.index;
1114 let lower = remaining.min(5); let upper = Some(5); (lower, upper)
1117 }
1118 }
1119
1120 let lying_iter = LyingIterator {
1122 values: vec![
1123 true, false, true, false, true, false, true, false, true, false,
1124 ],
1125 index: 0,
1126 };
1127
1128 let bit_buf: BitBufferMut = lying_iter.collect();
1131
1132 assert_eq!(bit_buf.len(), 10);
1134 for i in 0..10 {
1135 assert_eq!(bit_buf.value(i), i % 2 == 0);
1136 }
1137 }
1138}