pub struct BufferFIFO<T, const N: usize> {
buffer: [T; N],
idx: usize,
cap: usize,
}
impl<T, const N: usize> BufferFIFO<T, N>
where
T: Default + Copy,
{
pub fn default() -> Self {
Self {
buffer: [T::default(); N],
cap: 0,
idx: 0,
}
}
pub fn write(&mut self, value: T) {
self.buffer[self.idx] = value;
self.idx = (self.idx + 1) % N;
if self.cap < N {
self.cap += 1;
}
}
pub fn read(&mut self) -> T {
let val = self.buffer[(self.idx + N - self.cap) % N];
if self.cap > 0 {
self.cap -= 1;
}
val
}
pub fn is_full(&self) -> bool {
self.cap == N
}
pub fn is_empty(&self) -> bool {
self.cap == 0
}
}