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::pack::collect_bool_words_multiversioned;
15use crate::bit::set_bit_unchecked;
16use crate::bit::unset_bit_unchecked;
17use crate::buffer_mut;
18
19#[inline(always)]
21pub(crate) fn fill_bits(slice: &mut [u8], start_bit: usize, end_bit: usize, value: bool) {
22 if start_bit >= end_bit {
23 return;
24 }
25
26 let fill_byte: u8 = if value { 0xFF } else { 0x00 };
27
28 let start_byte = start_bit / 8;
29 let start_rem = start_bit % 8;
30 let end_byte = end_bit / 8;
31 let end_rem = end_bit % 8;
32
33 if start_byte == end_byte {
34 let mask = ((1u8 << (end_rem - start_rem)) - 1) << start_rem;
36 if value {
37 slice[start_byte] |= mask;
38 } else {
39 slice[start_byte] &= !mask;
40 }
41 } else {
42 if start_rem != 0 {
44 let mask = !((1u8 << start_rem) - 1);
45 if value {
46 slice[start_byte] |= mask;
47 } else {
48 slice[start_byte] &= !mask;
49 }
50 }
51
52 let fill_start = if start_rem != 0 {
54 start_byte + 1
55 } else {
56 start_byte
57 };
58 if fill_start < end_byte {
59 slice[fill_start..end_byte].fill(fill_byte);
60 }
61
62 if end_rem != 0 {
64 let mask = (1u8 << end_rem) - 1;
65 if value {
66 slice[end_byte] |= mask;
67 } else {
68 slice[end_byte] &= !mask;
69 }
70 }
71 }
72}
73
74#[derive(Debug, Clone)]
94pub struct BitBufferMut {
95 buffer: ByteBufferMut,
96 offset: usize,
100 len: usize,
101}
102
103impl BitBufferMut {
104 pub fn from_buffer(buffer: ByteBufferMut, offset: usize, len: usize) -> Self {
106 assert!(
107 len <= buffer.len() * 8,
108 "Buffer len {} is too short for the given length {len}",
109 buffer.len()
110 );
111 Self {
112 buffer,
113 offset,
114 len,
115 }
116 }
117
118 pub fn copy_from(bit_buffer: &BitBuffer) -> Self {
120 Self {
121 buffer: ByteBufferMut::copy_from(bit_buffer.inner()),
122 offset: bit_buffer.offset(),
123 len: bit_buffer.len(),
124 }
125 }
126
127 pub fn with_capacity(capacity: usize) -> Self {
129 Self {
130 buffer: BufferMut::with_capacity(capacity.div_ceil(8)),
131 offset: 0,
132 len: 0,
133 }
134 }
135
136 pub fn new_set(len: usize) -> Self {
138 Self {
139 buffer: buffer_mut![0xFF; len.div_ceil(8)],
140 offset: 0,
141 len,
142 }
143 }
144
145 pub fn new_unset(len: usize) -> Self {
147 Self {
148 buffer: BufferMut::zeroed(len.div_ceil(8)),
149 offset: 0,
150 len,
151 }
152 }
153
154 #[inline(always)]
156 pub fn empty() -> Self {
157 Self::with_capacity(0)
158 }
159
160 pub fn full(value: bool, len: usize) -> Self {
162 if value {
163 Self::new_set(len)
164 } else {
165 Self::new_unset(len)
166 }
167 }
168
169 pub fn from_indices(len: usize, indices: impl IntoIterator<Item = usize>) -> BitBufferMut {
171 let mut buffer = BufferMut::<u64>::zeroed(len.div_ceil(64));
172 for idx in indices {
173 assert!(idx < len, "index {idx} exceeds len {len}");
174 buffer.as_mut_slice()[idx / 64] |= 1 << (idx % 64);
175 }
176
177 let mut buffer = buffer.into_byte_buffer();
178 buffer.truncate(len.div_ceil(8));
179
180 Self {
181 buffer,
182 offset: 0,
183 len,
184 }
185 }
186
187 #[inline]
205 pub fn collect_bool<F: FnMut(usize) -> bool>(len: usize, f: F) -> Self {
206 Self::collect_words(len, |words| collect_bool_words(words, len, f))
207 }
208
209 #[inline]
221 pub fn collect_bool_multiversioned<F: FnMut(usize) -> bool>(len: usize, f: F) -> Self {
222 Self::collect_words(len, |words| {
223 collect_bool_words_multiversioned(words, len, f)
224 })
225 }
226
227 #[inline]
230 fn collect_words(len: usize, fill: impl FnOnce(&mut [u64])) -> Self {
231 let num_words = len.div_ceil(64);
232 let mut buffer: BufferMut<u64> = BufferMut::with_capacity(num_words);
233 unsafe { buffer.set_len(num_words) };
237 fill(buffer.as_mut_slice());
238
239 let mut bytes = buffer.into_byte_buffer();
240 bytes.truncate(len.div_ceil(8));
241
242 Self {
243 buffer: bytes,
244 offset: 0,
245 len,
246 }
247 }
248
249 pub fn inner(&self) -> &ByteBufferMut {
251 &self.buffer
252 }
253
254 pub fn into_inner(self) -> ByteBufferMut {
256 self.buffer
257 }
258
259 #[inline(always)]
261 pub fn len(&self) -> usize {
262 self.len
263 }
264
265 #[inline(always)]
267 pub fn is_empty(&self) -> bool {
268 self.len == 0
269 }
270
271 #[inline(always)]
273 pub fn offset(&self) -> usize {
274 self.offset
275 }
276
277 #[inline(always)]
279 pub fn value(&self, index: usize) -> bool {
280 assert!(index < self.len);
281 unsafe { self.value_unchecked(index) }
283 }
284
285 #[inline(always)]
291 pub unsafe fn value_unchecked(&self, index: usize) -> bool {
292 unsafe { get_bit_unchecked(self.buffer.as_ptr(), self.offset + index) }
293 }
294
295 #[inline(always)]
297 pub fn capacity(&self) -> usize {
298 (self.buffer.capacity() * 8) - self.offset
299 }
300
301 pub fn reserve(&mut self, additional: usize) {
303 let required_bits = self.offset + self.len + additional;
304 let required_bytes = required_bits.div_ceil(8); let additional_bytes = required_bytes.saturating_sub(self.buffer.len());
307 self.buffer.reserve(additional_bytes);
308 }
309
310 pub fn clear(&mut self) {
312 self.buffer.clear();
315 self.len = 0;
316 self.offset = 0;
317 }
318
319 #[inline]
323 pub fn set_to(&mut self, index: usize, value: bool) {
324 if value {
325 self.set(index);
326 } else {
327 self.unset(index);
328 }
329 }
330
331 #[inline]
337 pub unsafe fn set_to_unchecked(&mut self, index: usize, value: bool) {
338 if value {
339 unsafe { self.set_unchecked(index) }
341 } else {
342 unsafe { self.unset_unchecked(index) }
344 }
345 }
346
347 #[inline]
351 pub fn set(&mut self, index: usize) {
352 assert!(index < self.len, "index {index} exceeds len {}", self.len);
353
354 unsafe { self.set_unchecked(index) };
356 }
357
358 #[inline]
362 pub fn unset(&mut self, index: usize) {
363 assert!(index < self.len, "index {index} exceeds len {}", self.len);
364
365 unsafe { self.unset_unchecked(index) };
367 }
368
369 #[inline]
377 pub unsafe fn set_unchecked(&mut self, index: usize) {
378 unsafe { set_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
380 }
381
382 #[inline]
390 pub unsafe fn unset_unchecked(&mut self, index: usize) {
391 unsafe { unset_bit_unchecked(self.buffer.as_mut_ptr(), self.offset + index) }
393 }
394
395 #[inline(always)]
402 pub unsafe fn set_len(&mut self, new_len: usize) {
403 debug_assert!(
404 new_len <= self.capacity(),
405 "`set_len` requires that new_len <= capacity()"
406 );
407
408 let bytes_len = (self.offset + new_len).div_ceil(8);
410 unsafe { self.buffer.set_len(bytes_len) };
411
412 self.len = new_len;
413 }
414
415 pub fn truncate(&mut self, len: usize) {
419 if len > self.len {
420 return;
421 }
422
423 assert!(
424 self.offset <= usize::MAX - len,
425 "Truncate on BitBufferMut overflowed"
426 );
427 let end_bit = self.offset + len;
428 let new_len_bytes = end_bit.div_ceil(8);
429 self.buffer.truncate(new_len_bytes);
430 self.len = len;
431
432 if !end_bit.is_multiple_of(8) {
435 let keep = (1u8 << (end_bit % 8)) - 1;
436 self.buffer.as_mut_slice()[new_len_bytes - 1] &= keep;
437 }
438 }
439
440 #[inline]
442 pub fn append(&mut self, value: bool) {
443 if value {
444 self.append_true()
445 } else {
446 self.append_false()
447 }
448 }
449
450 #[inline]
452 pub fn append_true(&mut self) {
453 let bit_pos = self.offset + self.len;
454 let byte_pos = bit_pos / 8;
455 let bit_in_byte = bit_pos % 8;
456
457 if byte_pos >= self.buffer.len() {
459 self.buffer.push(0u8);
460 }
461
462 self.buffer.as_mut_slice()[byte_pos] |= 1 << bit_in_byte;
464 self.len += 1;
465 }
466
467 #[inline]
469 pub fn append_false(&mut self) {
470 let bit_pos = self.offset + self.len;
471 let byte_pos = bit_pos / 8;
472
473 if byte_pos >= self.buffer.len() {
475 self.buffer.push(0u8);
476 }
477
478 self.len += 1;
481 }
482
483 #[inline]
488 pub fn append_n(&mut self, value: bool, n: usize) {
489 if n == 0 {
490 return;
491 }
492
493 assert!(
494 self.offset
495 .checked_add(self.len)
496 .and_then(|v| v.checked_add(n))
497 .is_some(),
498 "Append on BitBufferMut overflowed"
499 );
500 let end_bit_pos = self.offset + self.len + n;
501 let required_bytes = end_bit_pos.div_ceil(8);
502
503 if required_bytes > self.buffer.len() {
505 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
506 }
507
508 let start = self.len;
509 self.len += n;
510 self.fill_range(start, self.len, value);
511 }
512
513 #[inline(always)]
518 pub fn fill_range(&mut self, start: usize, end: usize, value: bool) {
519 assert!(end <= self.len, "end {end} exceeds len {}", self.len);
520 assert!(start <= end, "start {start} exceeds end {end}");
521
522 unsafe { self.fill_range_unchecked(start, end, value) }
525 }
526
527 #[inline(always)]
533 pub unsafe fn fill_range_unchecked(&mut self, start: usize, end: usize, value: bool) {
534 fill_bits(
535 self.buffer.as_mut_slice(),
536 self.offset + start,
537 self.offset + end,
538 value,
539 );
540 }
541
542 pub fn append_buffer(&mut self, buffer: &BitBuffer) {
546 let bit_len = buffer.len();
547 if bit_len == 0 {
548 return;
549 }
550
551 let start_bit_pos = self.offset + self.len;
552 let end_bit_pos = start_bit_pos + bit_len;
553 let required_bytes = end_bit_pos.div_ceil(8);
554
555 if required_bytes > self.buffer.len() {
557 self.buffer.push_n(0x00, required_bytes - self.buffer.len());
558 }
559
560 let dst_bit_offset = start_bit_pos % 8;
561 let src_bit_offset = buffer.offset();
562
563 if dst_bit_offset == 0 && src_bit_offset == 0 {
564 let dst_byte = start_bit_pos / 8;
566 let src_bytes = buffer.inner().as_slice();
567 let full_bytes = bit_len / 8;
568 self.buffer.as_mut_slice()[dst_byte..dst_byte + full_bytes]
569 .copy_from_slice(&src_bytes[..full_bytes]);
570 let rem = bit_len % 8;
571 if rem != 0 {
572 let mask = (1u8 << rem) - 1;
573 self.buffer.as_mut_slice()[dst_byte + full_bytes] |= src_bytes[full_bytes] & mask;
574 }
575 } else {
576 let self_slice = self
578 .buffer
579 .as_mut_slice()
580 .view_bits_mut::<bitvec::prelude::Lsb0>();
581 let other_slice = buffer
582 .inner()
583 .as_slice()
584 .view_bits::<bitvec::prelude::Lsb0>();
585 let source_range = src_bit_offset..src_bit_offset + bit_len;
586 self_slice[start_bit_pos..end_bit_pos].copy_from_bitslice(&other_slice[source_range]);
587 }
588
589 self.len += bit_len;
590 }
591
592 pub fn unsplit(&mut self, other: Self) {
600 if (self.offset + self.len).is_multiple_of(8) && other.offset == 0 {
601 self.buffer.unsplit(other.buffer);
603 self.len += other.len;
604 return;
605 }
606
607 self.append_buffer(&other.freeze())
609 }
610
611 pub fn freeze(self) -> BitBuffer {
613 BitBuffer::new_with_offset(self.buffer.freeze(), self.len, self.offset)
614 }
615
616 pub fn as_slice(&self) -> &[u8] {
618 self.buffer.as_slice()
619 }
620
621 pub fn as_mut_slice(&mut self) -> &mut [u8] {
623 self.buffer.as_mut_slice()
624 }
625}
626
627impl Default for BitBufferMut {
628 fn default() -> Self {
629 Self::with_capacity(0)
630 }
631}
632
633impl Not for BitBufferMut {
635 type Output = BitBufferMut;
636
637 #[inline]
638 fn not(mut self) -> Self::Output {
639 ops::bitwise_unary_op_mut(&mut self, |b| !b);
640 self
641 }
642}
643
644impl From<&[bool]> for BitBufferMut {
645 fn from(value: &[bool]) -> Self {
646 BitBufferMut::collect_bool_multiversioned(value.len(), |i| unsafe {
649 *value.get_unchecked(i)
650 })
651 }
652}
653
654impl From<&[u8]> for BitBufferMut {
656 fn from(value: &[u8]) -> Self {
657 BitBufferMut::collect_bool_multiversioned(
660 value.len(),
661 |i| unsafe { *value.get_unchecked(i) } > 0,
662 )
663 }
664}
665
666impl From<Vec<bool>> for BitBufferMut {
667 fn from(value: Vec<bool>) -> Self {
668 value.as_slice().into()
669 }
670}
671
672impl FromIterator<bool> for BitBufferMut {
673 #[inline]
674 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
675 let mut iter = iter.into_iter();
676
677 let (lower_bound, _) = iter.size_hint();
680
681 let mut buf = BitBufferMut::new_unset(lower_bound);
686 assert_eq!(buf.offset, 0);
687
688 let ptr = buf.buffer.as_mut_ptr();
690 for i in 0..lower_bound {
691 let Some(v) = iter.next() else {
692 unsafe { buf.set_len(i) };
695 return buf;
696 };
697
698 if v {
699 unsafe { set_bit_unchecked(ptr, i) }
701 }
702 }
703
704 for v in iter {
707 buf.append(v);
708 }
709
710 buf
711 }
712}
713
714#[cfg(test)]
715mod tests {
716 use rstest::rstest;
717
718 use crate::BufferMut;
719 use crate::bit::buf_mut::BitBufferMut;
720 use crate::bitbuffer;
721 use crate::bitbuffer_mut;
722 use crate::buffer_mut;
723
724 #[test]
725 fn test_bits_mut() {
726 let mut bools = bitbuffer_mut![false; 10];
727 bools.set_to(0, true);
728 bools.set_to(9, true);
729
730 let bools = bools.freeze();
731 assert!(bools.value(0));
732 for i in 1..=8 {
733 assert!(!bools.value(i));
734 }
735 assert!(bools.value(9));
736 }
737
738 #[test]
739 fn test_append_n() {
740 let mut bools = BitBufferMut::with_capacity(10);
741 assert_eq!(bools.len(), 0);
742 assert!(bools.is_empty());
743
744 bools.append(true);
745 bools.append_n(false, 8);
746 bools.append_n(true, 1);
747
748 let bools = bools.freeze();
749
750 assert_eq!(bools.true_count(), 2);
751 assert!(bools.value(0));
752 assert!(bools.value(9));
753 }
754
755 #[test]
756 fn append_false_after_truncate_reads_back_false() {
757 let mut bools = BitBufferMut::new_set(16);
760 bools.truncate(12);
761 bools.append_false();
762 bools.append_true();
763
764 let bools = bools.freeze();
765 assert_eq!(bools.len(), 14);
766 assert!(
767 !bools.value(12),
768 "appended false must read back false after truncate"
769 );
770 assert!(bools.value(13));
771 }
772
773 #[test]
774 fn test_reserve_ensures_len_plus_additional() {
775 let mut bits = BitBufferMut::with_capacity(10);
779 assert_eq!(bits.len(), 0);
780
781 bits.reserve(100);
782
783 assert!(bits.capacity() >= 100);
785
786 bits.append_n(true, 50);
787 assert_eq!(bits.len(), 50);
788
789 bits.reserve(100);
790
791 assert!(bits.capacity() >= 150);
793 }
794
795 #[test]
796 fn test_with_offset_zero() {
797 let buf = BufferMut::zeroed(2);
799 let mut bit_buf = BitBufferMut::from_buffer(buf, 0, 16);
800
801 bit_buf.set(0);
803 bit_buf.set(7);
804 bit_buf.set(8);
805 bit_buf.set(15);
806
807 assert!(bit_buf.value(0));
809 assert!(bit_buf.value(7));
810 assert!(bit_buf.value(8));
811 assert!(bit_buf.value(15));
812 assert!(!bit_buf.value(1));
813 assert!(!bit_buf.value(9));
814
815 assert_eq!(bit_buf.as_slice()[0], 0b10000001);
817 assert_eq!(bit_buf.as_slice()[1], 0b10000001);
818 }
819
820 #[test]
821 fn test_with_offset_within_byte() {
822 let buf = buffer_mut![0b11111111, 0b00000000, 0b00000000];
824 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 10);
825
826 assert!(bit_buf.value(0)); assert!(bit_buf.value(4)); assert!(!bit_buf.value(5)); bit_buf.set(7);
834 assert!(bit_buf.value(7));
835
836 bit_buf.unset(0);
838 assert!(!bit_buf.value(0));
839 }
840
841 #[test]
842 fn test_with_offset_byte_boundary() {
843 let buf = buffer_mut![0xFF, 0x00, 0xFF];
845 let mut bit_buf = BitBufferMut::from_buffer(buf, 8, 16);
846
847 for i in 0..8 {
849 assert!(!bit_buf.value(i));
850 }
851 for i in 8..16 {
853 assert!(bit_buf.value(i));
854 }
855
856 bit_buf.set(0);
858 bit_buf.set(3);
859 assert!(bit_buf.value(0));
860 assert!(bit_buf.value(3));
861 }
862
863 #[test]
864 fn test_with_large_offset() {
865 let buf = buffer_mut![0xFF, 0xFF, 0xFF, 0xFF];
867 let mut bit_buf = BitBufferMut::from_buffer(buf, 13, 10);
868
869 for i in 0..10 {
871 assert!(bit_buf.value(i));
872 }
873
874 bit_buf.unset(0);
876 bit_buf.unset(5);
877 bit_buf.unset(9);
878
879 assert!(!bit_buf.value(0));
880 assert!(bit_buf.value(1));
881 assert!(!bit_buf.value(5));
882 assert!(!bit_buf.value(9));
883 }
884
885 #[test]
886 fn test_append_with_offset() {
887 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);
897 assert!(!bit_buf.value(0));
898 assert!(bit_buf.value(1));
899 assert!(bit_buf.value(2));
900 }
901
902 #[test]
903 fn test_append_n_with_offset_crossing_boundary() {
904 let buf = BufferMut::zeroed(4);
906 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
907
908 bit_buf.append_n(true, 10); assert_eq!(bit_buf.len(), 10);
912 for i in 0..10 {
913 assert!(bit_buf.value(i));
914 }
915
916 assert_eq!(bit_buf.as_slice()[0], 0b11100000);
920 assert_eq!(bit_buf.as_slice()[1], 0b01111111);
921 }
922
923 #[test]
924 fn test_truncate_with_offset() {
925 let buf = buffer_mut![0xFF, 0xFF];
926 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 12);
927
928 assert_eq!(bit_buf.len(), 12);
929
930 bit_buf.truncate(8);
932 assert_eq!(bit_buf.len(), 8);
933
934 bit_buf.truncate(3);
936 assert_eq!(bit_buf.len(), 3);
937
938 bit_buf.truncate(10);
940 assert_eq!(bit_buf.len(), 3);
941 }
942
943 #[test]
944 fn test_capacity_with_offset() {
945 let buf = buffer_mut![0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
948
949 assert!(bit_buf.capacity() >= 75);
952 assert_eq!(bit_buf.capacity() % 8, (80 - 5) % 8);
954 }
955
956 #[test]
957 fn test_reserve_with_offset() {
958 let buf = buffer_mut![0, 0]; let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
961
962 let initial_capacity = bit_buf.capacity();
964 assert!(initial_capacity >= 13);
965
966 bit_buf.reserve(20);
968
969 assert!(bit_buf.capacity() >= 20);
971 }
972
973 #[test]
974 fn test_freeze_with_offset() {
975 let buf = buffer_mut![0b11110000, 0b00001111];
976 let mut bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
977
978 bit_buf.set(0);
980 bit_buf.set(7);
981
982 let frozen = bit_buf.freeze();
984 assert_eq!(frozen.offset(), 4);
985 assert_eq!(frozen.len(), 8);
986
987 assert!(frozen.value(0));
989 assert!(frozen.value(7));
990 }
991
992 #[cfg_attr(miri, ignore)] #[test]
994 fn append_after_clear_reads_back_false() {
995 let mut bools = BitBufferMut::new_set(16);
998 bools.clear();
999 bools.append_false();
1000 bools.append_buffer(&crate::BitBuffer::new_unset(8));
1001
1002 let bools = bools.freeze();
1003 assert_eq!(bools.len(), 9);
1004 assert_eq!(bools.true_count(), 0);
1005 }
1006
1007 #[cfg_attr(miri, ignore)] #[test]
1009 fn test_append_buffer_after_truncate() {
1010 let mut buf = BitBufferMut::new_set(16);
1013 buf.truncate(3);
1014 buf.append_buffer(&crate::BitBuffer::new_unset(8));
1015
1016 let frozen = buf.freeze();
1017 assert_eq!(frozen.len(), 11);
1018 for i in 0..3 {
1019 assert!(frozen.value(i), "bit {i} should be set");
1020 }
1021 for i in 3..11 {
1022 assert!(!frozen.value(i), "bit {i} should be unset");
1023 }
1024 }
1025
1026 #[rstest]
1027 #[case::both_aligned(0, 0)]
1028 #[case::dst_unaligned(3, 0)]
1029 #[case::src_unaligned(0, 5)]
1030 #[case::mismatched(3, 5)]
1031 #[case::equal_nonzero(5, 5)]
1032 #[cfg_attr(miri, ignore)] fn test_append_buffer_long(#[case] dst_prefix: usize, #[case] src_start: usize) {
1034 let source = crate::BitBuffer::from_iter((0..301).map(|i| i % 3 == 0));
1036 let source = source.slice(src_start..301);
1037
1038 let mut dest = BitBufferMut::with_capacity(512);
1039 dest.append_n(true, dst_prefix);
1040 dest.append_buffer(&source);
1041
1042 assert_eq!(dest.len(), dst_prefix + source.len());
1043 for i in 0..dst_prefix {
1044 assert!(dest.value(i), "prefix bit {i}");
1045 }
1046 for i in 0..source.len() {
1047 assert_eq!(dest.value(dst_prefix + i), source.value(i), "bit {i}");
1048 }
1049 }
1050
1051 #[cfg_attr(miri, ignore)] #[test]
1053 fn test_append_buffer_with_offsets() {
1054 let source = bitbuffer![false, false, true, true, false, true];
1056
1057 let buf = BufferMut::zeroed(4);
1059 let mut dest = BitBufferMut::from_buffer(buf, 3, 0);
1060
1061 dest.append(true);
1063 dest.append(false);
1064
1065 dest.append_buffer(&source);
1067
1068 assert_eq!(dest.len(), 8);
1069 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)); }
1078
1079 #[test]
1080 fn test_set_unset_unchecked_with_offset() {
1081 let buf = BufferMut::zeroed(3);
1082 let mut bit_buf = BitBufferMut::from_buffer(buf, 7, 10);
1083
1084 unsafe {
1085 bit_buf.set_unchecked(0);
1086 bit_buf.set_unchecked(5);
1087 bit_buf.set_unchecked(9);
1088 }
1089
1090 assert!(bit_buf.value(0));
1091 assert!(bit_buf.value(5));
1092 assert!(bit_buf.value(9));
1093
1094 unsafe {
1095 bit_buf.unset_unchecked(5);
1096 }
1097
1098 assert!(!bit_buf.value(5));
1099 }
1100
1101 #[test]
1102 fn test_value_unchecked_with_offset() {
1103 let buf = buffer_mut![0b11110000, 0b00001111];
1104 let bit_buf = BitBufferMut::from_buffer(buf, 4, 8);
1105
1106 unsafe {
1107 assert!(bit_buf.value_unchecked(0));
1109 assert!(bit_buf.value_unchecked(3));
1110
1111 assert!(bit_buf.value_unchecked(4));
1113 assert!(bit_buf.value_unchecked(7));
1114 }
1115 }
1116
1117 #[test]
1118 fn test_append_alternating_with_offset() {
1119 let buf = BufferMut::zeroed(4);
1120 let mut bit_buf = BitBufferMut::from_buffer(buf, 2, 0);
1121
1122 for i in 0..20 {
1124 bit_buf.append(i % 2 == 0);
1125 }
1126
1127 assert_eq!(bit_buf.len(), 20);
1128 for i in 0..20 {
1129 assert_eq!(bit_buf.value(i), i % 2 == 0);
1130 }
1131 }
1132
1133 #[test]
1134 fn test_new_set_new_unset() {
1135 let set_buf = bitbuffer_mut![true; 10];
1136 let unset_buf = bitbuffer_mut![false; 10];
1137
1138 for i in 0..10 {
1139 assert!(set_buf.value(i));
1140 assert!(!unset_buf.value(i));
1141 }
1142
1143 assert_eq!(set_buf.len(), 10);
1144 assert_eq!(unset_buf.len(), 10);
1145 }
1146
1147 #[test]
1148 fn test_append_n_false_with_offset() {
1149 let buf = BufferMut::zeroed(4);
1150 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1151
1152 bit_buf.append_n(false, 15);
1153
1154 assert_eq!(bit_buf.len(), 15);
1155 for i in 0..15 {
1156 assert!(!bit_buf.value(i));
1157 }
1158 }
1159
1160 #[test]
1161 fn test_append_n_true_with_offset() {
1162 let buf = BufferMut::zeroed(4);
1163 let mut bit_buf = BitBufferMut::from_buffer(buf, 5, 0);
1164
1165 bit_buf.append_n(true, 15);
1166
1167 assert_eq!(bit_buf.len(), 15);
1168 for i in 0..15 {
1169 assert!(bit_buf.value(i));
1170 }
1171 }
1172
1173 #[test]
1174 fn test_mixed_operations_with_offset() {
1175 let buf = BufferMut::zeroed(5);
1177 let mut bit_buf = BitBufferMut::from_buffer(buf, 3, 0);
1178
1179 bit_buf.append_n(true, 5);
1181 bit_buf.append_n(false, 3);
1182 bit_buf.append(true);
1183
1184 assert_eq!(bit_buf.len(), 9);
1185
1186 bit_buf.set(6); bit_buf.unset(2); assert!(bit_buf.value(0));
1192 assert!(bit_buf.value(1));
1193 assert!(!bit_buf.value(2)); assert!(bit_buf.value(3));
1195 assert!(bit_buf.value(4));
1196 assert!(!bit_buf.value(5));
1197 assert!(bit_buf.value(6)); assert!(!bit_buf.value(7));
1199 assert!(bit_buf.value(8));
1200
1201 bit_buf.truncate(6);
1203 assert_eq!(bit_buf.len(), 6);
1204
1205 let frozen = bit_buf.freeze();
1207 assert_eq!(frozen.offset(), 3);
1208 assert_eq!(frozen.len(), 6);
1209 }
1210
1211 #[test]
1212 fn test_from_iterator_with_incorrect_size_hint() {
1213 struct LyingIterator {
1220 values: Vec<bool>,
1221 index: usize,
1222 }
1223
1224 impl Iterator for LyingIterator {
1225 type Item = bool;
1226
1227 fn next(&mut self) -> Option<Self::Item> {
1228 (self.index < self.values.len()).then(|| {
1229 let val = self.values[self.index];
1230 self.index += 1;
1231 val
1232 })
1233 }
1234
1235 fn size_hint(&self) -> (usize, Option<usize>) {
1236 let remaining = self.values.len() - self.index;
1239 let lower = remaining.min(5); let upper = Some(5); (lower, upper)
1242 }
1243 }
1244
1245 let lying_iter = LyingIterator {
1247 values: vec![
1248 true, false, true, false, true, false, true, false, true, false,
1249 ],
1250 index: 0,
1251 };
1252
1253 let bit_buf: BitBufferMut = lying_iter.collect();
1256
1257 assert_eq!(bit_buf.len(), 10);
1259 for i in 0..10 {
1260 assert_eq!(bit_buf.value(i), i % 2 == 0);
1261 }
1262 }
1263}