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 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}