#![cfg_attr(not(any(test, feature = "proptest")), no_std)]
pub mod storage;
pub use storage::Storage;
pub mod masking;
pub use masking::MaskingBuffer;
pub mod iter;
use iter::{Iter, IterMut, Drain};
pub mod prop;
mod tests;
pub trait RingBuffer {
type Item;
fn cap(&self) -> usize;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn is_full(&self) -> bool {
self.len() == self.cap()
}
fn get(&self, off: usize) -> Option<&Self::Item>;
fn get_mut(&mut self, off: usize) -> Option<&mut Self::Item> {
if off < self.len() {
Some(unsafe { self.get_disjoint_mut(off) })
} else { None }
}
unsafe fn get_disjoint_mut(&self, off: usize) -> &mut Self::Item;
fn iter(&self) -> Iter<'_, Self> {
Iter::new(self)
}
fn iter_mut(&mut self) -> IterMut<'_, Self> {
IterMut::new(self)
}
fn enqueue(&mut self, item: Self::Item) -> Option<Self::Item>;
fn dequeue(&mut self) -> Option<Self::Item>;
fn skip_one(&mut self) {
let _ = self.dequeue();
}
fn skip(&mut self, num: usize) {
for _ in 0 .. core::cmp::min(num, self.len()) {
self.skip_one();
}
}
fn clear(&mut self) {
for _ in 0 .. self.len() {
self.skip_one();
}
}
fn drain(&mut self) -> Drain<'_, Self> {
Drain::new(self)
}
}
impl<RB: RingBuffer> RingBuffer for &mut RB {
type Item = RB::Item;
fn cap(&self) -> usize {
RB::cap(*self)
}
fn len(&self) -> usize {
RB::len(*self)
}
fn get(&self, off: usize) -> Option<&Self::Item> {
RB::get(*self, off)
}
fn get_mut(&mut self, off: usize) -> Option<&mut Self::Item> {
RB::get_mut(*self, off)
}
unsafe fn get_disjoint_mut(&self, off: usize) -> &mut Self::Item {
RB::get_disjoint_mut(*self, off)
}
fn enqueue(&mut self, item: Self::Item) -> Option<Self::Item> {
RB::enqueue(*self, item)
}
fn dequeue(&mut self) -> Option<Self::Item> {
RB::dequeue(*self)
}
fn skip(&mut self, num: usize) {
RB::skip(*self, num)
}
fn clear(&mut self) {
RB::clear(*self)
}
}