37 lines
656 B
Rust
37 lines
656 B
Rust
|
pub struct RingBuffer<T, const N: usize>
|
||
|
where
|
||
|
T: Clone + Copy,
|
||
|
{
|
||
|
data: [Option<T>; N],
|
||
|
pointer: usize,
|
||
|
}
|
||
|
|
||
|
impl<T, const N: usize> RingBuffer<T, N>
|
||
|
where
|
||
|
T: Clone + Copy,
|
||
|
{
|
||
|
pub fn new() -> Self {
|
||
|
Self {
|
||
|
data: [None; N],
|
||
|
pointer: 0,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub fn data(&self) -> Vec<&T> {
|
||
|
let mut d = Vec::new();
|
||
|
|
||
|
for date in self.data.iter() {
|
||
|
if let Some(t) = date.as_ref() {
|
||
|
d.push(t);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
d
|
||
|
}
|
||
|
|
||
|
pub fn push(&mut self, t: T) {
|
||
|
self.data[self.pointer] = Some(t);
|
||
|
self.pointer = (self.pointer + 1) % N;
|
||
|
}
|
||
|
}
|