use std::ops::{Deref, DerefMut};
use std::ptr::NonNull;
pub struct MkPoolBox<T> {
ptr: NonNull<T>,
global: std::sync::Arc<crate::core::global::GlobalState>,
}
impl<T> MkPoolBox<T> {
pub(crate) unsafe fn from_raw(ptr: *mut T, global: std::sync::Arc<crate::core::global::GlobalState>) -> Option<Self> {
NonNull::new(ptr).map(|ptr| Self { ptr, global })
}
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<T> Deref for MkPoolBox<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
unsafe { self.ptr.as_ref() }
}
}
impl<T> DerefMut for MkPoolBox<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { self.ptr.as_mut() }
}
}
impl<T> Drop for MkPoolBox<T> {
fn drop(&mut self) {
unsafe {
std::ptr::drop_in_place(self.ptr.as_ptr());
let layout = std::alloc::Layout::new::<T>();
self.global.heap_free(self.ptr.as_ptr() as *mut u8, layout);
}
}
}
unsafe impl<T: Send> Send for MkPoolBox<T> {}
unsafe impl<T: Sync> Sync for MkPoolBox<T> {}