forked from almeida995544/fe-Bountiful
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqueue.rs
More file actions
61 lines (50 loc) · 1.52 KB
/
Copy pathqueue.rs
File metadata and controls
61 lines (50 loc) · 1.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use std::collections::VecDeque;
use cranelift_entity::{EntityRef, SecondaryMap};
pub(crate) struct WorkQueue<N: EntityRef> {
queued: SecondaryMap<N, bool>,
pending: VecDeque<N>,
}
impl<N: EntityRef> WorkQueue<N> {
pub(crate) fn with_seed(count: usize, seed: impl IntoIterator<Item = N>) -> Self {
let mut queued = SecondaryMap::new();
queued.resize(count);
let mut queue = Self {
queued,
pending: VecDeque::new(),
};
for node in seed {
queue.push(node);
}
queue
}
pub(crate) fn push(&mut self, node: N) {
if !self.queued[node] {
self.queued[node] = true;
self.pending.push_back(node);
}
}
pub(crate) fn pop(&mut self) -> Option<N> {
let node = self.pending.pop_front()?;
self.queued[node] = false;
Some(node)
}
}
#[cfg(test)]
mod tests {
use cranelift_entity::{EntityRef, entity_impl};
use super::WorkQueue;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
struct Node(u32);
entity_impl!(Node);
#[test]
fn deduplicates_nodes() {
let mut queue = WorkQueue::with_seed(3, [Node::new(0), Node::new(1), Node::new(2)]);
assert_eq!(queue.pop(), Some(Node::new(0)));
queue.push(Node::new(1));
queue.push(Node::new(1));
queue.push(Node::new(1));
assert_eq!(queue.pop(), Some(Node::new(1)));
assert_eq!(queue.pop(), Some(Node::new(2)));
assert_eq!(queue.pop(), None);
}
}