bit_cursor/
sub_cursor.rs

1use std::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
2
3use bitvec::{order::Msb0, slice::BitSlice, vec::BitVec};
4
5use crate::bit_cursor::BitCursor;
6
7pub trait SubCursor<R> {
8    type Output<'a>
9    where
10        Self: 'a;
11    fn sub_cursor(&self, range: R) -> Self::Output<'_>;
12}
13
14macro_rules! impl_sub_cursor {
15    ($range_type:ty,$type:ty) => {
16        impl SubCursor<$range_type> for $type {
17            type Output<'a>
18                = BitCursor<&'a BitSlice<u8, Msb0>>
19            where
20                Self: 'a;
21
22            fn sub_cursor(&self, range: $range_type) -> Self::Output<'_> {
23                let slice = &self.remaining_slice()[range];
24                BitCursor::new(slice)
25            }
26        }
27    };
28}
29
30impl_sub_cursor!(Range<usize>, BitCursor<BitVec<u8, Msb0>>);
31impl_sub_cursor!(RangeFrom<usize>, BitCursor<BitVec<u8, Msb0>>);
32impl_sub_cursor!(RangeFull, BitCursor<BitVec<u8, Msb0>>);
33impl_sub_cursor!(RangeInclusive<usize>, BitCursor<BitVec<u8, Msb0>>);
34impl_sub_cursor!(RangeTo<usize>, BitCursor<BitVec<u8, Msb0>>);
35impl_sub_cursor!(RangeToInclusive<usize>, BitCursor<BitVec<u8, Msb0>>);
36
37impl_sub_cursor!(Range<usize>, BitCursor<&BitSlice<u8, Msb0>>);
38impl_sub_cursor!(RangeFrom<usize>, BitCursor<&BitSlice<u8, Msb0>>);
39impl_sub_cursor!(RangeFull, BitCursor<&BitSlice<u8, Msb0>>);
40impl_sub_cursor!(RangeInclusive<usize>, BitCursor<&BitSlice<u8, Msb0>>);
41impl_sub_cursor!(RangeTo<usize>, BitCursor<&BitSlice<u8, Msb0>>);
42impl_sub_cursor!(RangeToInclusive<usize>, BitCursor<&BitSlice<u8, Msb0>>);