use core::mem;
use core::ptr::NonNull;
use core::slice;
#[repr(C)]
#[derive(Copy, Clone)]
pub struct RustSlice {
pub(crate) ptr: NonNull<()>,
pub(crate) len: usize,
}
impl RustSlice {
pub fn from_ref<T>(s: &[T]) -> Self {
RustSlice {
ptr: NonNull::from(s).cast::<()>(),
len: s.len(),
}
}
pub fn from_mut<T>(s: &mut [T]) -> Self {
RustSlice {
len: s.len(),
ptr: NonNull::from(s).cast::<()>(),
}
}
pub unsafe fn as_slice<'a, T>(self) -> &'a [T] {
slice::from_raw_parts(self.ptr.as_ptr().cast::<T>(), self.len)
}
pub unsafe fn as_mut_slice<'a, T>(self) -> &'a mut [T] {
slice::from_raw_parts_mut(self.ptr.as_ptr().cast::<T>(), self.len)
}
}
const_assert_eq!(
mem::size_of::<Option<RustSlice>>(),
mem::size_of::<RustSlice>(),
);