use crate::prelude::*;
macro_rules! buf_gen_boilerplate {
() => {
#[must_use]
pub fn len(&self) -> usize {
self.buffer.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.buffer.is_empty()
}
#[must_use]
pub fn as_slice(&self) -> &[B::Item] {
self.buffer.as_slice()
}
pub fn as_mut_slice(&mut self) -> &mut [B::Item]
where
B: BufferMut,
{
self.buffer.as_mut_slice()
}
pub const fn index(&self) -> usize {
self.index
}
};
}
#[derive(Clone, Debug)]
pub struct OnceBuf<B: buf::Buffer> {
pub buffer: B,
index: usize,
}
impl<B: buf::Buffer> OnceBuf<B> {
#[must_use]
pub const fn new(buffer: B) -> Self {
Self { buffer, index: 0 }
}
buf_gen_boilerplate!();
}
impl<B: buf::Buffer> Signal for OnceBuf<B> {
type Sample = B::Item;
fn get(&self) -> B::Item {
self.buffer.get(self.index).unwrap_or_default()
}
}
impl<B: buf::Buffer> SignalMut for OnceBuf<B> {
fn advance(&mut self) {
self.index += 1;
}
fn retrigger(&mut self) {
self.index = 0;
}
}
impl<B: buf::Buffer> Base for OnceBuf<B> {
impl_base!();
}
impl<B: buf::Buffer> Stop for OnceBuf<B> {
fn stop(&mut self) {
self.index = self.buffer.len();
}
}
impl<B: buf::Buffer> Done for OnceBuf<B> {
fn is_done(&self) -> bool {
self.index >= self.buffer.len()
}
}
impl<B: buf::Buffer> Panic for OnceBuf<B> {
fn panic(&mut self) {
self.stop();
}
}
#[derive(Clone, Debug)]
pub struct LoopBuf<B: buf::Buffer> {
pub buffer: B,
index: usize,
}
impl<B: buf::Buffer> LoopBuf<B> {
#[must_use]
pub const fn new(buffer: B) -> Self {
Self { buffer, index: 0 }
}
buf_gen_boilerplate!();
}
impl<B: buf::Buffer> Signal for LoopBuf<B> {
type Sample = B::Item;
fn get(&self) -> B::Item {
self.buffer[self.index]
}
}
impl<B: buf::Buffer> SignalMut for LoopBuf<B> {
fn advance(&mut self) {
crate::mod_inc(self.len(), &mut self.index);
}
fn retrigger(&mut self) {
self.index = 0;
}
}
impl<B: buf::Buffer> Base for LoopBuf<B> {
impl_base!();
}