bit-cursor 0.1.5

A cursor that supports bit-level reads and writes
Documentation
use std::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};

use bitvec::{order::Msb0, slice::BitSlice, vec::BitVec};

use crate::bit_cursor::BitCursor;

pub trait SubCursor<R> {
    type Output<'a>
    where
        Self: 'a;
    fn sub_cursor(&self, range: R) -> Self::Output<'_>;
}

macro_rules! impl_sub_cursor {
    ($range_type:ty,$type:ty) => {
        impl SubCursor<$range_type> for $type {
            type Output<'a>
                = BitCursor<&'a BitSlice<u8, Msb0>>
            where
                Self: 'a;

            fn sub_cursor(&self, range: $range_type) -> Self::Output<'_> {
                let slice = &self.remaining_slice()[range];
                BitCursor::new(slice)
            }
        }
    };
}

impl_sub_cursor!(Range<usize>, BitCursor<BitVec<u8, Msb0>>);
impl_sub_cursor!(RangeFrom<usize>, BitCursor<BitVec<u8, Msb0>>);
impl_sub_cursor!(RangeFull, BitCursor<BitVec<u8, Msb0>>);
impl_sub_cursor!(RangeInclusive<usize>, BitCursor<BitVec<u8, Msb0>>);
impl_sub_cursor!(RangeTo<usize>, BitCursor<BitVec<u8, Msb0>>);
impl_sub_cursor!(RangeToInclusive<usize>, BitCursor<BitVec<u8, Msb0>>);

impl_sub_cursor!(Range<usize>, BitCursor<&BitSlice<u8, Msb0>>);
impl_sub_cursor!(RangeFrom<usize>, BitCursor<&BitSlice<u8, Msb0>>);
impl_sub_cursor!(RangeFull, BitCursor<&BitSlice<u8, Msb0>>);
impl_sub_cursor!(RangeInclusive<usize>, BitCursor<&BitSlice<u8, Msb0>>);
impl_sub_cursor!(RangeTo<usize>, BitCursor<&BitSlice<u8, Msb0>>);
impl_sub_cursor!(RangeToInclusive<usize>, BitCursor<&BitSlice<u8, Msb0>>);