use core::cell::UnsafeCell; use core::mem::MaybeUninit; use core::ptr; pub(crate) struct UninitCell(MaybeUninit>); impl UninitCell { pub const fn uninit() -> Self { Self(MaybeUninit::uninit()) } pub unsafe fn as_mut_ptr(&self) -> *mut T { (*self.0.as_ptr()).get() } #[allow(clippy::mut_from_ref)] pub unsafe fn as_mut(&self) -> &mut T { &mut *self.as_mut_ptr() } pub unsafe fn write(&self, val: T) { ptr::write(self.as_mut_ptr(), val) } pub unsafe fn drop_in_place(&self) { ptr::drop_in_place(self.as_mut_ptr()) } } impl UninitCell { pub unsafe fn read(&self) -> T { ptr::read(self.as_mut_ptr()) } }