use crate::error::Error;
#[derive(Debug)]
pub struct CircularVec<T> {
inner: std::collections::VecDeque<T>,
}
impl<T> CircularVec<T> {
pub fn new(capacity: usize) -> Self {
Self {
inner: std::collections::VecDeque::with_capacity(capacity),
}
}
pub fn push(&mut self, item: T) -> Result<(), Error> {
if self.inner.len() == self.inner.capacity() {
self.inner
.pop_front()
.ok_or(Error::CircularVecPopFrontError)?;
}
self.inner.push_back(item);
Ok(())
}
pub fn contains(&self, item: &T) -> bool
where
T: PartialEq,
{
self.inner.contains(item)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_push_and_contains() {
let mut cv = CircularVec::new(2);
assert!(cv.push(1).is_ok());
assert!(cv.push(2).is_ok());
assert!(cv.contains(&1));
assert!(cv.contains(&2));
assert!(cv.push(3).is_ok());
assert!(!cv.contains(&1));
assert!(cv.contains(&2));
assert!(cv.contains(&3));
}
}