use std::marker::PhantomData;
use std::ops::{Deref, DerefMut};
use std::ptr::NonNull;
pub struct MkFrameBox<'a, T> {
ptr: NonNull<T>,
_marker: PhantomData<&'a T>,
}
impl<'a, T> MkFrameBox<'a, T> {
pub(crate) unsafe fn from_raw(ptr: *mut T) -> Option<Self> {
NonNull::new(ptr).map(|ptr| Self {
ptr,
_marker: PhantomData,
})
}
pub fn as_ptr(&self) -> *const T {
self.ptr.as_ptr()
}
pub fn as_mut_ptr(&mut self) -> *mut T {
self.ptr.as_ptr()
}
pub fn into_raw(self) -> *mut T {
let ptr = self.ptr.as_ptr();
std::mem::forget(self);
ptr
}
}
impl<'a, T> Deref for MkFrameBox<'a, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
unsafe { self.ptr.as_ref() }
}
}
impl<'a, T> DerefMut for MkFrameBox<'a, T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { self.ptr.as_mut() }
}
}