use std::mem;
use crate::depot::queue::ring;
pub unsafe trait RingCell: crate::depot::raw::RingStore {
unsafe fn publish(&self, state: ring::State<Self::Word>);
fn take_front(&self) -> Option<Self::Item> {
let mut state = self.state();
if state.is_empty() {
return None;
}
let index = unsafe { state.pop_front(self.capacity()) };
let value = unsafe { self.entries().add(index).read().assume_init() };
unsafe { self.publish(state) };
Some(value)
}
unsafe fn insert<const FRONT: bool>(&self, value: Self::Item) {
let mut state = self.state();
let index = unsafe { state.push::<FRONT>(self.capacity()) };
unsafe {
self.entries()
.cast_mut()
.add(index)
.write(mem::MaybeUninit::new(value))
};
unsafe { self.publish(state) };
}
}
mod rings;
pub(crate) use rings::drop_ring;