use core::{cell::UnsafeCell, sync::atomic};
pub struct Node<T> {
data: UnsafeCell<Option<T>>,
is_set: atomic::AtomicBool,
}
impl<T> Node<T> {
pub fn new() -> Self {
Self {
data: UnsafeCell::new(None),
is_set: atomic::AtomicBool::new(false),
}
}
pub fn is_set(&self) -> bool {
self.is_set.load(atomic::Ordering::Acquire)
}
pub fn store(&self, data: T) {
let d_ptr = self.data.get();
let mut_data = unsafe { &mut *d_ptr };
mut_data.replace(data);
self.is_set.store(true, atomic::Ordering::Release);
}
pub fn load(&self) -> T {
let d_ptr = self.data.get();
let mut_data = unsafe { &mut *d_ptr };
let data = mut_data.take().unwrap();
self.is_set.store(false, atomic::Ordering::Release);
data
}
}