offset_vec/offset/
check.rs

1use alloc::{boxed::Box, vec::Vec};
2
3use crate::{OffsetVec, VecLike};
4
5pub trait OffsetCheckRef {
6    #[inline]
7    fn offset_check_ref(&self) {}
8}
9
10pub trait OffsetCheck: OffsetCheckRef + Sized {
11    #[inline]
12    #[track_caller]
13    fn offset_check(self) -> Self {
14        self.offset_check_ref();
15        self
16    }
17}
18
19impl<T: OffsetCheckRef> OffsetCheck for T {}
20
21impl<T: OffsetCheckRef + ?Sized> OffsetCheckRef for &T {
22    #[inline]
23    #[track_caller]
24    fn offset_check_ref(&self) {
25        (**self).offset_check_ref();
26    }
27}
28impl<T: OffsetCheckRef + ?Sized> OffsetCheckRef for &mut T {
29    #[inline]
30    #[track_caller]
31    fn offset_check_ref(&self) {
32        (**self).offset_check_ref();
33    }
34}
35impl<T: OffsetCheckRef + ?Sized> OffsetCheckRef for Box<T> {
36    #[inline]
37    #[track_caller]
38    fn offset_check_ref(&self) {
39        (**self).offset_check_ref();
40    }
41}
42
43impl<T> OffsetCheckRef for [T] {}
44impl<T> OffsetCheckRef for Vec<T> {}
45impl<V: VecLike> OffsetCheckRef for OffsetVec<V> {
46    #[inline]
47    #[track_caller]
48    fn offset_check_ref(&self) {
49        #[cold]
50        #[track_caller]
51        #[inline(never)]
52        fn assert_failed(offset: usize, len: usize) -> ! {
53            panic!("offset {offset} out of length (is {len})");
54        }
55
56        let len = self.vec.len();
57        let offset = self.offset;
58
59        if offset > len {
60            assert_failed(offset, len);
61        }
62    }
63}