use std::mem::MaybeUninit;
use crate::sync::UnsafeCell;
pub(super) struct DataCell<T> {
value: UnsafeCell<MaybeUninit<T>>,
}
impl<T> DataCell<T> {
pub(super) fn new() -> Self {
Self {
value: UnsafeCell::new(MaybeUninit::uninit()),
}
}
pub(super) unsafe fn write(&self, value: T) {
self.value.with_mut(|p| unsafe { (*p).write(value) });
}
pub(super) unsafe fn read(&self) -> T {
self.value.with_mut(|p| unsafe { (*p).assume_init_read() })
}
pub(super) unsafe fn drop_in_place(&self) {
self.value.with_mut(|p| unsafe { (*p).assume_init_drop() });
}
}
unsafe impl<T: Send> Send for DataCell<T> {}
unsafe impl<T: Send> Sync for DataCell<T> {}