Skip to main content

rescale_core/buffer/
ring_buffer.rs

1//! Ring Buffer (Circular Buffer) generic fixed-size zero-allocation.
2
3#[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    /// Membuat RingBuffer baru dengan kapasitas tetap
12    ///
13    /// # Panics
14    ///
15    /// Panik jika `capacity` bernilai nol.
16    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    /// Menulis satu elemen ke posisi write saat ini dan memajukan pointer
26    #[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    /// Membaca elemen dari masa lalu sejauh `delay_samples` yang lalu.
33    /// delay_samples = 0 berarti elemen yang baru saja di-push.
34    ///
35    /// # Panics
36    ///
37    /// Panik jika `delay_samples` lebih besar atau sama dengan kapasitas.
38    #[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    /// Mengembalikan kapasitas buffer
50    #[inline(always)]
51    pub fn capacity(&self) -> usize {
52        self.capacity
53    }
54
55    /// Reset seluruh buffer ke default value
56    pub fn clear(&mut self) {
57        self.buffer.fill(T::default());
58        self.write_pos = 0;
59    }
60}