konst_kernel/
slice.rs

1#[cfg(feature = "__for_konst")]
2pub mod slice_for_konst;
3
4#[cfg(feature = "__for_konst")]
5pub use self::slice_for_konst::*;
6
7#[doc(hidden)]
8#[macro_export]
9macro_rules! __slice_from_impl {
10    ($slice:ident, $start:ident, $as_ptr:ident, $from_raw_parts:ident, $on_overflow:expr) => {{
11        #[allow(unused_variables, clippy::ptr_offset_with_cast)]
12        let (rem, overflowed) = $slice.len().overflowing_sub($start);
13
14        if overflowed {
15            return $on_overflow;
16        }
17
18        #[allow(clippy::ptr_offset_with_cast)]
19        unsafe {
20            core::slice::$from_raw_parts($slice.$as_ptr().offset($start as _), rem)
21        }
22    }};
23}
24
25#[doc(hidden)]
26#[macro_export]
27macro_rules! __slice_up_to_impl {
28    ($slice:ident, $len:ident, $as_ptr:ident, $from_raw_parts:ident, $on_overflow:expr) => {{
29        #[allow(unused_variables)]
30        let (rem, overflowed) = $slice.len().overflowing_sub($len);
31
32        if overflowed {
33            return $on_overflow;
34        }
35
36        // Doing this to get a slice up to length at compile-time
37        unsafe { core::slice::$from_raw_parts($slice.$as_ptr(), $len) }
38    }};
39}
40
41#[inline]
42pub const fn slice_from<T>(slice: &[T], start: usize) -> &[T] {
43    crate::__slice_from_impl!(slice, start, as_ptr, from_raw_parts, &[])
44}
45
46#[inline]
47pub const fn slice_up_to<T>(slice: &[T], len: usize) -> &[T] {
48    crate::__slice_up_to_impl!(slice, len, as_ptr, from_raw_parts, slice)
49}
50
51#[inline]
52pub const fn slice_range<T>(slice: &[T], start: usize, end: usize) -> &[T] {
53    slice_from(slice_up_to(slice, end), start)
54}