use crate::util::Iterable;
use serde::{Deserialize, Serialize};
pub trait Buffer<T>: Iterable<T> {
fn __push(&mut self, item: T);
fn __pop(&mut self) -> Option<T>;
fn size(&self) -> usize;
fn is_empty(&self) -> bool {
self.size() == 0
}
fn capacity(&self) -> usize;
fn add(&mut self, new_item: T) -> Option<T> {
self.__push(new_item);
match self.size() > self.capacity() {
true => self.__pop(), false => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ArrayBuffer<T> {
inner: Vec<T>,
capacity: usize,
}
impl<T> ArrayBuffer<T> {
pub fn new(capacity: usize) -> Self {
Self {
inner: vec![],
capacity,
}
}
}
impl<T> Iterable<T> for ArrayBuffer<T> {
type Iter<'a> = core::slice::Iter<'a, T>
where
Self: 'a,
T: 'a;
fn iter(&self) -> Self::Iter<'_> {
self.inner.iter()
}
type IterMut<'a> = core::slice::IterMut<'a, T>
where
Self: 'a,
T: 'a;
fn iter_mut(&mut self) -> Self::IterMut<'_> {
self.inner.iter_mut()
}
}
impl<T> Buffer<T> for ArrayBuffer<T> {
fn __push(&mut self, item: T) {
self.inner.push(item)
}
fn __pop(&mut self) -> Option<T> {
self.inner.pop()
}
fn size(&self) -> usize {
self.inner.len()
}
fn capacity(&self) -> usize {
self.capacity
}
}