use super::shared::Shared;
use cpu::fence_release;
use std::sync::Arc;
pub struct MpscBatchSlots<'a, T> {
pub(super) shared: &'a Arc<Shared<T>>,
pub(super) start: i64,
pub(super) count: usize,
pub(super) published: bool,
}
impl<'a, T> MpscBatchSlots<'a, T> {
#[inline]
pub fn get_mut(&mut self, index: usize) -> &mut T {
assert!(index < self.count);
unsafe { self.shared.buffer.get_mut(self.start + index as i64) }
}
#[inline]
pub fn get(&self, index: usize) -> &T {
assert!(index < self.count);
unsafe { self.shared.buffer.get(self.start + index as i64) }
}
#[inline]
pub fn len(&self) -> usize {
self.count
}
#[inline]
pub fn is_empty(&self) -> bool {
self.count == 0
}
#[inline]
pub fn publish(mut self) {
self.do_publish();
}
fn do_publish(&mut self) {
if self.published {
return;
}
fence_release();
self.shared.mark_published_batch(self.start, self.count);
self.published = true;
}
}
impl<'a, T> Drop for MpscBatchSlots<'a, T> {
fn drop(&mut self) {
self.do_publish();
}
}