use std::collections::VecDeque;
#[derive(Debug)]
pub struct SizedQueue<T> {
size: usize,
queue: VecDeque<T>,
}
impl<T> SizedQueue<T> {
pub fn new(size: usize) -> Self {
SizedQueue {
size,
queue: VecDeque::with_capacity(size),
}
}
pub fn len(&self) -> usize {
self.queue.len()
}
pub fn capacity(&self) -> usize {
self.size
}
pub fn resize(&mut self, size: usize) -> usize {
let old_size = self.queue.len();
let dropped = if old_size > size {
self.queue.truncate(size);
old_size - size
} else {
if size > old_size {
self.queue.try_reserve(size - old_size).ok();
}
0
};
dropped
}
pub fn push(&mut self, item: T) {
if self.queue.len() < self.size {
self.queue.push_back(item);
} else {
drop(item);
}
}
pub fn pop(&mut self) -> Option<T> {
self.queue.pop_front()
}
}