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
use super::EdgeContainer;
use crate::types::NodeID;
use rustc_hash::FxHashSet;
#[derive(MallocSizeOf)]
pub struct UnionEdgeContainer<'a> {
containers: Vec<&'a dyn EdgeContainer>,
}
impl<'a> UnionEdgeContainer<'a> {
pub fn new(containers: Vec<&'a dyn EdgeContainer>) -> UnionEdgeContainer<'a> {
UnionEdgeContainer { containers }
}
}
impl<'a> EdgeContainer for UnionEdgeContainer<'a> {
fn get_outgoing_edges<'b>(&'b self, node: NodeID) -> Box<dyn Iterator<Item = NodeID> + 'b> {
let mut targets = FxHashSet::default();
for c in self.containers.iter() {
targets.extend(c.get_outgoing_edges(node));
}
Box::from(targets.into_iter())
}
fn get_ingoing_edges<'b>(&'b self, node: NodeID) -> Box<dyn Iterator<Item = NodeID> + 'b> {
let mut sources = FxHashSet::default();
for c in self.containers.iter() {
sources.extend(c.get_ingoing_edges(node));
}
Box::from(sources.into_iter())
}
fn source_nodes<'b>(&'b self) -> Box<dyn Iterator<Item = NodeID> + 'b> {
let mut sources = FxHashSet::default();
for c in self.containers.iter() {
sources.extend(c.source_nodes());
}
Box::from(sources.into_iter())
}
}