use std::marker::PhantomData;
use std::ops::{Deref, DerefMut};
use std::ptr::NonNull;
pub struct MkFrameSlice<'a, T> {
ptr: NonNull<T>,
len: usize,
_marker: PhantomData<&'a [T]>,
}
impl<'a, T> MkFrameSlice<'a, T> {
pub(crate) unsafe fn from_raw_parts(ptr: *mut T, len: usize) -> Option<Self> {
NonNull::new(ptr).map(|ptr| Self {
ptr,
len,
_marker: PhantomData,
})
}
pub fn len(&self) -> usize {
self.len
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
pub fn as_ptr(&self) -> *const T {
self.ptr.as_ptr()
}
pub fn as_mut_ptr(&mut self) -> *mut T {
self.ptr.as_ptr()
}
}
impl<'a, T> Deref for MkFrameSlice<'a, T> {
type Target = [T];
fn deref(&self) -> &Self::Target {
unsafe { std::slice::from_raw_parts(self.ptr.as_ptr(), self.len) }
}
}
impl<'a, T> DerefMut for MkFrameSlice<'a, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { std::slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len) }
}
}