atomr_core/util/
bounded_queue.rs1use std::collections::VecDeque;
5
6#[derive(Debug)]
7pub struct BoundedQueue<T> {
8 cap: usize,
9 inner: VecDeque<T>,
10}
11
12impl<T> BoundedQueue<T> {
13 pub fn new(cap: usize) -> Self {
14 Self { cap, inner: VecDeque::with_capacity(cap) }
15 }
16
17 pub fn capacity(&self) -> usize {
18 self.cap
19 }
20
21 pub fn len(&self) -> usize {
22 self.inner.len()
23 }
24
25 pub fn is_empty(&self) -> bool {
26 self.inner.is_empty()
27 }
28
29 pub fn is_full(&self) -> bool {
30 self.inner.len() >= self.cap
31 }
32
33 pub fn push(&mut self, item: T) -> Result<(), T> {
34 if self.is_full() {
35 Err(item)
36 } else {
37 self.inner.push_back(item);
38 Ok(())
39 }
40 }
41
42 pub fn pop(&mut self) -> Option<T> {
43 self.inner.pop_front()
44 }
45
46 pub fn push_front(&mut self, item: T) -> Result<(), T> {
47 if self.is_full() {
48 Err(item)
49 } else {
50 self.inner.push_front(item);
51 Ok(())
52 }
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn fifo_order() {
62 let mut q = BoundedQueue::new(3);
63 q.push(1).unwrap();
64 q.push(2).unwrap();
65 q.push(3).unwrap();
66 assert!(q.is_full());
67 assert!(q.push(4).is_err());
68 assert_eq!(q.pop(), Some(1));
69 assert_eq!(q.pop(), Some(2));
70 assert_eq!(q.pop(), Some(3));
71 assert!(q.is_empty());
72 }
73}