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>>);