buffex 0.0.1

BUFFer EXtensions: ring buffer and buffer chaining.
Documentation
use core::borrow::BorrowMut;
use abs_buff::{
    IoSliceMut, IoSliceRef, TrReclaimIoSliceRef, TrReclaimIoSliceMut,
};
use atomex::{
    x_deps::funty,
    TrAtomicData, TrCmpxchOrderings,
};
use asyncex::x_deps::atomex;

use super::buffer_::RingBuffer;

pub struct Reclaim<'a, P, T, D, O>(&'a RingBuffer<P, T, D, O>)
where
    P: BorrowMut<[T]>,
    T: Clone,
    D: TrAtomicData + funty::Unsigned,
    O: TrCmpxchOrderings;

impl<'a, P, T, D, O> Reclaim<'a, P, T, D, O>
where
    P: BorrowMut<[T]>,
    T: Clone,
    D: TrAtomicData + funty::Unsigned,
    O: TrCmpxchOrderings,
{
    pub(super) const fn new(ring_buffer: &'a RingBuffer<P, T, D, O>) -> Self {
        Reclaim(ring_buffer)
    }
}

impl<'a, P, T, D, O> TrReclaimIoSliceRef<T> for Reclaim<'a, P, T, D, O>
where
    P: BorrowMut<[T]>,
    T: Clone,
    D: TrAtomicData + funty::Unsigned,
    O: TrCmpxchOrderings,
{
    fn reclaim_ref(self, slice_ref: &mut IoSliceRef<'_, T, Self>) {
        let x = self.0.state().reader_forward(slice_ref.len());
        assert!(x.is_ok());
    }
}

impl<'a, P, T, D, O> TrReclaimIoSliceMut<T> for Reclaim<'a, P, T, D, O>
where
    P: BorrowMut<[T]>,
    T: Clone,
    D: TrAtomicData + funty::Unsigned,
    O: TrCmpxchOrderings,
{
    fn reclaim_mut(self, slice_mut: &mut IoSliceMut<'_, T, Self>) {
        let x = self.0.state().writer_forward(slice_mut.len());
        assert!(x.is_ok())
    }
}