use super::{
Raw,
consumer::Consumer,
consumer::{Iter, IterMut, PopIter},
producer::Producer,
utils::{add_mod, modulus},
};
use crate::utils::{slice_assume_init_mut, slice_assume_init_ref};
use core::mem::MaybeUninit;
pub trait RingBuffer: Raw {
#[inline]
fn as_exclusive(&mut self) -> crate::rb::Exclusive<'_, Self> {
crate::rb::Exclusive::new(self)
}
#[inline]
fn occupied_slices(&mut self) -> (&[MaybeUninit<Self::Item>], &[MaybeUninit<Self::Item>]) {
unsafe { self.unsafe_slices(self.read_index(), self.write_index()) }
}
#[inline]
fn as_slices(&mut self) -> (&[Self::Item], &[Self::Item]) {
let (left, right) = self.occupied_slices();
unsafe { (slice_assume_init_ref(left), slice_assume_init_ref(right)) }
}
#[inline]
fn as_mut_slices(&mut self) -> (&mut [Self::Item], &mut [Self::Item]) {
let (left, right) = unsafe { self.occupied_slices_mut() };
unsafe { (slice_assume_init_mut(left), slice_assume_init_mut(right)) }
}
#[inline]
fn first(&mut self) -> Option<&Self::Item> {
self.as_slices().0.first()
}
#[inline]
fn first_mut(&mut self) -> Option<&mut Self::Item> {
self.as_mut_slices().0.first_mut()
}
#[inline]
fn last(&mut self) -> Option<&Self::Item> {
let (left, right) = self.as_slices();
right.last().or_else(|| left.last())
}
#[inline]
fn last_mut(&mut self) -> Option<&mut Self::Item> {
let (left, right) = self.as_mut_slices();
right.last_mut().or_else(|| left.last_mut())
}
#[inline]
fn try_peek(&mut self) -> Option<&Self::Item> {
self.first()
}
#[inline]
fn try_pop(&mut self) -> Option<Self::Item> {
self.as_exclusive().try_pop()
}
#[inline]
fn peek_slice_uninit(&mut self, elems: &mut [MaybeUninit<Self::Item>]) -> usize {
self.as_exclusive().peek_slice_uninit(elems)
}
#[inline]
fn peek_slice(&mut self, elems: &mut [Self::Item]) -> usize
where
Self::Item: Copy,
{
self.as_exclusive().peek_slice(elems)
}
#[inline]
fn pop_slice_uninit(&mut self, elems: &mut [MaybeUninit<Self::Item>]) -> usize {
self.as_exclusive().pop_slice_uninit(elems)
}
#[inline]
fn pop_slice(&mut self, elems: &mut [Self::Item]) -> usize
where
Self::Item: Copy,
{
self.as_exclusive().pop_slice(elems)
}
#[inline]
fn pop_iter(&mut self) -> PopIter<'_, Self> {
unsafe { PopIter::from_raw(self) }
}
#[inline]
fn iter(&mut self) -> Iter<'_, Self> {
let (left, right) = self.as_slices();
left.iter().chain(right)
}
#[inline]
fn iter_mut(&mut self) -> IterMut<'_, Self> {
let (left, right) = self.as_mut_slices();
left.iter_mut().chain(right)
}
#[inline]
fn skip(&mut self, count: usize) -> usize {
self.as_exclusive().skip(count)
}
#[inline]
fn clear(&mut self) -> usize {
self.as_exclusive().clear()
}
#[inline]
fn vacant_slices(&mut self) -> (&[MaybeUninit<Self::Item>], &[MaybeUninit<Self::Item>]) {
unsafe { self.unsafe_slices(self.write_index(), add_mod(self.read_index(), self.capacity().get(), modulus(self))) }
}
#[inline]
fn vacant_slices_mut(&mut self) -> (&mut [MaybeUninit<Self::Item>], &mut [MaybeUninit<Self::Item>]) {
unsafe { self.unsafe_slices_mut(self.write_index(), add_mod(self.read_index(), self.capacity().get(), modulus(self))) }
}
#[inline]
fn try_push(&mut self, elem: Self::Item) -> Result<(), Self::Item> {
self.as_exclusive().try_push(elem)
}
#[inline]
fn push_iter<I: Iterator<Item = Self::Item>>(&mut self, iter: I) -> usize {
self.as_exclusive().push_iter(iter)
}
#[inline]
fn push_slice(&mut self, elems: &[Self::Item]) -> usize
where
Self::Item: Copy,
{
self.as_exclusive().push_slice(elems)
}
#[cfg(feature = "std")]
#[inline]
fn read_from<Input: std::io::Read>(&mut self, reader: &mut Input, count: Option<usize>) -> Option<std::io::Result<usize>>
where
Self: super::Observer<Item = u8>,
{
self.as_exclusive().read_from(reader, count)
}
#[cfg(feature = "std")]
#[inline]
fn write_into<Output: std::io::Write>(&mut self, writer: &mut Output, count: Option<usize>) -> Option<std::io::Result<usize>>
where
Self: super::Observer<Item = u8>,
{
self.as_exclusive().write_into(writer, count)
}
fn push_overwrite(&mut self, elem: Self::Item) -> Option<Self::Item> {
let ret = if self.is_full() { self.try_pop() } else { None };
let _ = self.try_push(elem);
ret
}
fn push_iter_overwrite<I: Iterator<Item = Self::Item>>(&mut self, iter: I) {
for elem in iter {
self.push_overwrite(elem);
}
}
fn push_slice_overwrite(&mut self, elems: &[Self::Item])
where
Self::Item: Copy,
{
if elems.len() > self.vacant_len() {
self.skip(usize::min(elems.len() - self.vacant_len(), self.occupied_len()));
}
self.push_slice(if elems.len() > self.vacant_len() {
&elems[(elems.len() - self.vacant_len())..]
} else {
elems
});
}
}
pub trait DelegateRingBuffer: super::observer::DelegateObserver + super::DelegateRaw
where
Self::Base: RingBuffer,
{
}
impl<D: DelegateRingBuffer> RingBuffer for D where D::Base: RingBuffer {}