#[derive(Debug, Clone)]
pub struct RingBuffer<T> {
buffer: Vec<T>,
write_pos: usize,
capacity: usize,
}
impl<T: Copy + Default> RingBuffer<T> {
pub fn new(capacity: usize) -> Self {
assert!(capacity > 0, "Capacity must be greater than 0");
Self {
buffer: vec![T::default(); capacity],
write_pos: 0,
capacity,
}
}
#[inline(always)]
pub fn push(&mut self, item: T) {
self.buffer[self.write_pos] = item;
self.write_pos = (self.write_pos + 1) % self.capacity;
}
#[inline(always)]
pub fn read_past(&self, delay_samples: usize) -> T {
assert!(
delay_samples < self.capacity,
"Delay exceeds buffer capacity"
);
let read_pos =
(self.write_pos + self.capacity - 1 - (delay_samples % self.capacity)) % self.capacity;
self.buffer[read_pos]
}
#[inline(always)]
pub fn capacity(&self) -> usize {
self.capacity
}
pub fn clear(&mut self) {
self.buffer.fill(T::default());
self.write_pos = 0;
}
}