use std::collections::VecDeque;
#[derive(Debug)]
pub struct BoundedQueue<T> {
items: VecDeque<T>,
capacity: usize,
}
impl<T> BoundedQueue<T> {
pub fn new(capacity: usize) -> Self {
Self { items: VecDeque::with_capacity(capacity), capacity }
}
pub fn try_push(&mut self, item: T) -> Result<(), T> {
if self.items.len() >= self.capacity {
Err(item)
} else {
self.items.push_back(item);
Ok(())
}
}
pub fn pop(&mut self) -> Option<T> {
self.items.pop_front()
}
#[must_use]
pub fn peek(&self) -> Option<&T> {
self.items.front()
}
#[must_use]
pub fn len(&self) -> usize {
self.items.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.items.is_empty()
}
#[must_use]
pub fn is_full(&self) -> bool {
self.items.len() >= self.capacity
}
#[must_use]
pub fn capacity(&self) -> usize {
self.capacity
}
#[must_use]
pub fn remaining(&self) -> usize {
self.capacity.saturating_sub(self.items.len())
}
pub fn clear(&mut self) {
self.items.clear();
}
}
impl<T> Default for BoundedQueue<T> {
fn default() -> Self {
Self::new(16)
}
}