Skip to main content

atomr_core/util/
bounded_queue.rs

1//! A simple bounded FIFO queue used by bounded mailboxes.
2//! akka.net: `Util/BoundedQueue.cs`.
3
4use 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}