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