use core::alloc::Layout;
use core::mem::MaybeUninit;
use core::ptr::NonNull;
pub fn slice_from_raw_parts<T>(data: NonNull<T>, len: usize) -> NonNull<[T]> {
let slice = core::ptr::slice_from_raw_parts_mut(data.as_ptr(), len);
unsafe { NonNull::new_unchecked(slice) }
}
pub fn slice_assume_init<T>(data: NonNull<[MaybeUninit<T>]>) -> NonNull<[T]> {
let len = data.len();
let ptr = data.as_ptr() as *mut MaybeUninit<T>;
let ptr = unsafe { NonNull::new_unchecked(ptr.cast()) };
slice_from_raw_parts(ptr, len)
}
pub fn dangling<T>(layout: Layout) -> NonNull<T> {
NonNull::new(layout.align() as _).unwrap_or(NonNull::dangling())
}
pub const fn from_usize<T>(value: usize) -> Option<NonNull<T>> { from_ptr(value as *mut T) }
pub const fn from_ptr<T>(ptr: *mut T) -> Option<NonNull<T>> { unsafe { core::mem::transmute(ptr) } }