use std::marker::PhantomData;
use crate::utils::wrapping_id::WrappedId;
#[derive(Debug)]
pub struct SequenceBuffer<K: WrappedId, T, const N: usize> {
buffer: [Option<T>; N],
_marker: PhantomData<K>,
}
impl<K: WrappedId, T, const N: usize> Default for SequenceBuffer<K, T, N> {
fn default() -> Self {
Self::new()
}
}
impl<K: WrappedId, T, const N: usize> SequenceBuffer<K, T, N> {
pub fn new() -> Self {
Self {
buffer: std::array::from_fn(|_| None),
_marker: PhantomData,
}
}
pub fn push(&mut self, key: &K, value: T) {
let index = self.index(key);
self.buffer[index] = Some(value);
}
pub fn get(&self, key: &K) -> Option<&T> {
let index = self.index(key);
self.buffer[index].as_ref()
}
pub fn remove(&mut self, key: &K) -> Option<T> {
let index = self.index(key);
self.buffer[index].take()
}
pub fn clear(&mut self) {
for i in 0..N {
self.buffer[i] = None;
}
}
fn index(&self, key: &K) -> usize {
key.rem(N)
}
}
#[cfg(test)]
mod tests {
use crate::packet::message::MessageId;
use super::*;
#[test]
fn test_sequence_buffer() {
let mut buffer = SequenceBuffer::<MessageId, u8, 32>::new();
buffer.push(&MessageId(0), 0);
assert_eq!(buffer.get(&MessageId(0)), Some(&0));
assert_eq!(buffer.remove(&MessageId(0)), Some(0));
buffer.push(&MessageId(0), 0);
buffer.push(&MessageId(32), 1);
assert_eq!(buffer.get(&MessageId(0)), Some(&1));
}
}