rustfst/algorithms/queues/
trivial_queue.rs

1use crate::algorithms::{Queue, QueueType};
2use crate::StateId;
3
4/// Trivial queue discipline; one may enqueue at most one state at a time. It
5/// can be used for strongly connected components with only one state and no
6/// self-loops.
7#[derive(Debug, Default, Clone)]
8pub struct TrivialQueue {
9    state: Option<StateId>,
10}
11
12impl Queue for TrivialQueue {
13    fn head(&mut self) -> Option<StateId> {
14        self.state
15    }
16
17    fn enqueue(&mut self, state: StateId) {
18        self.state = Some(state);
19    }
20
21    fn dequeue(&mut self) -> Option<StateId> {
22        self.state.take()
23    }
24
25    fn update(&mut self, _state: StateId) {}
26
27    fn is_empty(&self) -> bool {
28        self.state.is_none()
29    }
30
31    fn clear(&mut self) {
32        self.state = None;
33    }
34
35    fn queue_type(&self) -> QueueType {
36        QueueType::TrivialQueue
37    }
38}
39
40#[cfg(test)]
41mod test {
42    use super::*;
43
44    use anyhow::Result;
45
46    #[test]
47    fn test_trivial_queue() -> Result<()> {
48        let mut queue = TrivialQueue::default();
49
50        assert_eq!(queue.head(), None);
51
52        queue.enqueue(2);
53        queue.enqueue(3);
54        assert_eq!(queue.head(), Some(3));
55        queue.dequeue();
56        assert_eq!(queue.head(), None);
57
58        queue.enqueue(2);
59        queue.enqueue(3);
60        assert!(!queue.is_empty());
61        assert_eq!(queue.head(), Some(3));
62        queue.clear();
63        assert_eq!(queue.head(), None);
64        assert!(queue.is_empty());
65        Ok(())
66    }
67}