use super::{RbBase, RbRead, RbWrite};
use crate::{
consumer::PopIterator,
utils::{slice_assume_init_mut, slice_assume_init_ref},
Consumer, Producer,
};
use core::{
iter::Chain,
ops::{Deref, DerefMut},
slice,
};
#[cfg(feature = "alloc")]
use alloc::{rc::Rc, sync::Arc};
pub trait Rb<T>: RbRead<T> + RbWrite<T> {
#[inline]
fn capacity(&self) -> usize {
<Self as RbBase<T>>::capacity_nonzero(self).get()
}
fn len(&self) -> usize {
self.occupied_len()
}
#[inline]
fn free_len(&self) -> usize {
self.vacant_len()
}
#[inline]
fn as_slices(&self) -> (&[T], &[T]) {
unsafe {
let (left, right) = self.occupied_slices();
(slice_assume_init_ref(left), slice_assume_init_ref(right))
}
}
#[inline]
fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) {
unsafe {
let (left, right) = self.occupied_slices();
(slice_assume_init_mut(left), slice_assume_init_mut(right))
}
}
#[inline]
fn pop(&mut self) -> Option<T> {
unsafe { Consumer::new(self as &Self) }.pop()
}
fn pop_iter(&mut self) -> PopIterator<'_, T, RbWrap<Self>> {
PopIterator::new(unsafe { &*(self as *const Self as *const RbWrap<Self>) })
}
fn iter(&self) -> Chain<slice::Iter<T>, slice::Iter<T>> {
let (left, right) = self.as_slices();
left.iter().chain(right.iter())
}
fn iter_mut(&mut self) -> Chain<slice::IterMut<T>, slice::IterMut<T>> {
let (left, right) = self.as_mut_slices();
left.iter_mut().chain(right.iter_mut())
}
fn skip(&mut self, count: usize) -> usize {
assert!(count <= self.len());
unsafe { self.skip_internal(Some(count)) };
count
}
#[inline]
fn clear(&mut self) -> usize {
unsafe { self.skip_internal(None) }
}
#[inline]
fn push(&mut self, elem: T) -> Result<(), T> {
unsafe { Producer::new(self as &Self) }.push(elem)
}
fn push_overwrite(&mut self, elem: T) -> Option<T> {
let ret = if self.is_full() { self.pop() } else { None };
let _ = self.push(elem);
ret
}
#[inline]
fn push_iter<I: Iterator<Item = T>>(&mut self, iter: &mut I) {
unsafe { Producer::new(self as &Self) }.push_iter(iter);
}
fn push_iter_overwrite<I: Iterator<Item = T>>(&mut self, iter: I) {
for elem in iter {
self.push_overwrite(elem);
}
}
fn pop_slice(&mut self, elems: &mut [T])
where
T: Copy,
{
assert!(elems.len() <= self.len());
let _ = unsafe { Consumer::new(self as &Self) }.pop_slice(elems);
}
fn push_slice(&mut self, elems: &[T])
where
T: Copy,
{
assert!(elems.len() <= self.free_len());
let _ = unsafe { Producer::new(self as &Self) }.push_slice(elems);
}
fn push_slice_overwrite(&mut self, elems: &[T])
where
T: Copy,
{
if elems.len() > self.free_len() {
self.skip(usize::min(elems.len() - self.free_len(), self.len()));
}
self.push_slice(if elems.len() > self.free_len() {
&elems[(elems.len() - self.free_len())..]
} else {
elems
});
}
}
pub trait RbRef: Deref<Target = Self::Rb> {
type Rb: ?Sized;
}
impl<B: ?Sized> RbRef for RbWrap<B> {
type Rb = B;
}
impl<'a, B: ?Sized> RbRef for &'a B {
type Rb = B;
}
#[cfg(feature = "alloc")]
impl<B: ?Sized> RbRef for Rc<B> {
type Rb = B;
}
#[cfg(feature = "alloc")]
impl<B: ?Sized> RbRef for Arc<B> {
type Rb = B;
}
#[repr(transparent)]
pub struct RbWrap<B: ?Sized>(pub B);
impl<B: ?Sized> Deref for RbWrap<B> {
type Target = B;
fn deref(&self) -> &B {
&self.0
}
}
impl<B: ?Sized> DerefMut for RbWrap<B> {
fn deref_mut(&mut self) -> &mut B {
&mut self.0
}
}