use core::ops::{Deref, DerefMut};
use core::ptr::NonNull;
#[derive(PartialEq, Eq)]
#[repr(transparent)]
pub struct FuriBox<T: ?Sized>(NonNull<T>);
impl<T> FuriBox<T> {
pub fn new(value: T) -> Self {
let ptr = unsafe { crate::aligned_malloc(size_of::<T>(), align_of::<T>()) as *mut T };
assert!(!ptr.is_null());
assert!(ptr.is_aligned());
unsafe {
ptr.write(value);
FuriBox::from_raw(ptr)
}
}
pub fn into_raw(b: FuriBox<T>) -> *mut T {
b.0.as_ptr()
}
pub unsafe fn from_raw(raw: *mut T) -> Self {
FuriBox(unsafe { NonNull::new_unchecked(raw) })
}
pub fn as_ptr(b: &FuriBox<T>) -> *const T {
b.0.as_ptr().cast_const()
}
pub fn as_mut_ptr(b: &mut FuriBox<T>) -> *mut T {
b.0.as_ptr()
}
}
impl<T: ?Sized> Drop for FuriBox<T> {
fn drop(&mut self) {
unsafe { crate::aligned_free(self.0.as_ptr().cast()) }
}
}
impl<T: ?Sized> AsRef<T> for FuriBox<T> {
fn as_ref(&self) -> &T {
unsafe { self.0.as_ref() }
}
}
impl<T: ?Sized> AsMut<T> for FuriBox<T> {
fn as_mut(&mut self) -> &mut T {
unsafe { self.0.as_mut() }
}
}
impl<T: ?Sized> Deref for FuriBox<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
unsafe { self.0.as_ref() }
}
}
impl<T: ?Sized> DerefMut for FuriBox<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { self.0.as_mut() }
}
}