konst/
utils.rs

1#[cfg(feature = "mut_refs")]
2mod mut_refs {
3    use core::mem::ManuallyDrop;
4
5    #[repr(C)]
6    #[doc(hidden)]
7    pub(crate) union BorrowMut<'a, T: ?Sized> {
8        ptr: *mut T,
9        reff: ManuallyDrop<&'a mut T>,
10    }
11
12    pub(crate) const unsafe fn deref_raw_mut_ptr<'a, T: ?Sized>(ptr: *mut T) -> &'a mut T {
13        ManuallyDrop::into_inner(BorrowMut { ptr }.reff)
14    }
15
16    pub(crate) const unsafe fn slice_from_raw_parts_mut<'a, T>(
17        ptr: *mut T,
18        len: usize,
19    ) -> &'a mut [T] {
20        let ptr = core::ptr::slice_from_raw_parts_mut(ptr, len);
21        ManuallyDrop::into_inner(BorrowMut { ptr }.reff)
22    }
23}
24
25#[doc(hidden)]
26#[cfg(feature = "mut_refs")]
27pub(crate) use mut_refs::{deref_raw_mut_ptr, slice_from_raw_parts_mut, BorrowMut};
28
29#[doc(hidden)]
30#[cfg(feature = "rust_1_64")]
31pub(crate) const unsafe fn slice_from_raw_parts<'a, T>(ptr: *const T, len: usize) -> &'a [T] {
32    let ptr = core::ptr::slice_from_raw_parts(ptr, len);
33    crate::utils_1_56::PtrToRef { ptr }.reff
34}
35
36#[allow(dead_code)]
37#[inline]
38pub(crate) const fn saturating_sub(l: usize, r: usize) -> usize {
39    let (sub, overflowed) = l.overflowing_sub(r);
40    if overflowed {
41        0
42    } else {
43        sub
44    }
45}
46
47#[inline]
48#[cfg(feature = "rust_1_64")]
49#[allow(dead_code)]
50pub(crate) const fn min_usize(l: usize, r: usize) -> usize {
51    if l < r {
52        l
53    } else {
54        r
55    }
56}