scurve_motion/
buffer_fifo.rs

1/// A simple FIFO buffer implementation with a fixed-size array.
2pub struct BufferFIFO<T, const N: usize> {
3    buffer: [T; N],
4    idx: usize,
5    cap: usize,
6}
7
8impl<T, const N: usize> BufferFIFO<T, N>
9where
10    T: Default + Copy,
11{
12    /// Creates a new BufferFIFO with default values.
13    pub fn default() -> Self {
14        Self {
15            buffer: [T::default(); N],
16            cap: 0,
17            idx: 0,
18        }
19    }
20
21    /// Writes a value into the buffer, overwriting if full.
22    pub fn write(&mut self, value: T) {
23        self.buffer[self.idx] = value;
24        self.idx = (self.idx + 1) % N;
25        if self.cap < N {
26            self.cap += 1;
27        }
28    }
29
30    /// Reads (and removes) the oldest value in the buffer.
31    pub fn read(&mut self) -> T {
32        let val = self.buffer[(self.idx + N - self.cap) % N];
33        if self.cap > 0 {
34            self.cap -= 1;
35        }
36        val
37    }
38
39    /// Checks if the buffer is full.
40    pub fn is_full(&self) -> bool {
41        self.cap == N
42    }
43
44    /// Checks if the buffer is empty.
45    pub fn is_empty(&self) -> bool {
46        self.cap == 0
47    }
48}