rescale_core/buffer/
ring_buffer.rs1#[derive(Debug, Clone)]
4pub struct RingBuffer<T> {
5 buffer: Vec<T>,
6 write_pos: usize,
7 capacity: usize,
8}
9
10impl<T: Copy + Default> RingBuffer<T> {
11 pub fn new(capacity: usize) -> Self {
17 assert!(capacity > 0, "Capacity must be greater than 0");
18 Self {
19 buffer: vec![T::default(); capacity],
20 write_pos: 0,
21 capacity,
22 }
23 }
24
25 #[inline(always)]
27 pub fn push(&mut self, item: T) {
28 self.buffer[self.write_pos] = item;
29 self.write_pos = (self.write_pos + 1) % self.capacity;
30 }
31
32 #[inline(always)]
39 pub fn read_past(&self, delay_samples: usize) -> T {
40 assert!(
41 delay_samples < self.capacity,
42 "Delay exceeds buffer capacity"
43 );
44 let read_pos =
45 (self.write_pos + self.capacity - 1 - (delay_samples % self.capacity)) % self.capacity;
46 self.buffer[read_pos]
47 }
48
49 #[inline(always)]
51 pub fn capacity(&self) -> usize {
52 self.capacity
53 }
54
55 pub fn clear(&mut self) {
57 self.buffer.fill(T::default());
58 self.write_pos = 0;
59 }
60}