offset-vec 0.3.6

Packer for Vec and String etc, for all methods index add a offset
Documentation
use alloc::{boxed::Box, vec::Vec};

use crate::{OffsetVec, VecLike};

pub trait OffsetCheckRef {
    #[inline]
    fn offset_check_ref(&self) {}
}

pub trait OffsetCheck: OffsetCheckRef + Sized {
    #[inline]
    #[track_caller]
    fn offset_check(self) -> Self {
        self.offset_check_ref();
        self
    }
}

impl<T: OffsetCheckRef> OffsetCheck for T {}

impl<T: OffsetCheckRef + ?Sized> OffsetCheckRef for &T {
    #[inline]
    #[track_caller]
    fn offset_check_ref(&self) {
        (**self).offset_check_ref();
    }
}
impl<T: OffsetCheckRef + ?Sized> OffsetCheckRef for &mut T {
    #[inline]
    #[track_caller]
    fn offset_check_ref(&self) {
        (**self).offset_check_ref();
    }
}
impl<T: OffsetCheckRef + ?Sized> OffsetCheckRef for Box<T> {
    #[inline]
    #[track_caller]
    fn offset_check_ref(&self) {
        (**self).offset_check_ref();
    }
}

impl<T> OffsetCheckRef for [T] {}
impl<T> OffsetCheckRef for Vec<T> {}
impl<V: VecLike> OffsetCheckRef for OffsetVec<V> {
    #[inline]
    #[track_caller]
    fn offset_check_ref(&self) {
        #[cold]
        #[track_caller]
        #[inline(never)]
        fn assert_failed(offset: usize, len: usize) -> ! {
            panic!("offset {offset} out of length (is {len})");
        }

        let len = self.vec.len();
        let offset = self.offset;

        if offset > len {
            assert_failed(offset, len);
        }
    }
}