offset_vec/offset/
check.rs1use 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}