scurve_motion/
buffer_fifo.rs1pub 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 pub fn default() -> Self {
14 Self {
15 buffer: [T::default(); N],
16 cap: 0,
17 idx: 0,
18 }
19 }
20
21 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 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 pub fn is_full(&self) -> bool {
41 self.cap == N
42 }
43
44 pub fn is_empty(&self) -> bool {
46 self.cap == 0
47 }
48}