use slabigator::Slab;
struct FifoQueue<T> {
slab: Slab<T>,
}
impl<T: Clone> FifoQueue<T> {
fn new(capacity: usize) -> Result<Self, slabigator::Error> {
Ok(Self {
slab: Slab::with_capacity(capacity)?,
})
}
fn enqueue(&mut self, item: T) -> Result<(), slabigator::Error> {
self.slab.push_front(item)?;
Ok(())
}
fn dequeue(&mut self) -> Option<T> {
self.slab.pop_back()
}
fn len(&self) -> usize {
self.slab.len()
}
fn is_empty(&self) -> bool {
self.slab.is_empty()
}
#[allow(dead_code)]
fn is_full(&self) -> bool {
self.slab.len() == self.slab.capacity()
}
fn clear(&mut self) {
self.slab.clear();
}
}
fn main() {
let mut queue = FifoQueue::new(5).expect("Failed to create queue");
for i in 1..=5 {
println!("Enqueuing: {}", i);
queue.enqueue(i).expect("Queue should have space");
}
if let Err(e) = queue.enqueue(6) {
println!("As expected, can't enqueue to full queue: {}", e);
}
while let Some(item) = queue.dequeue() {
println!("Dequeued: {}", item);
}
println!("Queue is now empty: {}", queue.is_empty());
println!("Reusing queue...");
for i in 10..=12 {
println!("Enqueuing: {}", i);
queue.enqueue(i).expect("Queue should have space");
}
println!("Queue length: {}", queue.len());
queue.clear();
println!("After clear, queue is empty: {}", queue.is_empty());
}