1 use crate::fx::FxHashMap;
11 successors: FxHashMap<usize, Vec<usize>>,
12 predecessors: FxHashMap<usize, Vec<usize>>,
16 pub fn new(start_node: usize, edges: &[(usize, usize)]) -> Self {
17 let mut graph = TestGraph {
18 num_nodes: start_node + 1,
20 successors: FxHashMap::default(),
21 predecessors: FxHashMap::default(),
23 for &(source, target) in edges {
24 graph.num_nodes = max(graph.num_nodes, source + 1);
25 graph.num_nodes = max(graph.num_nodes, target + 1);
26 graph.successors.entry(source).or_default().push(target);
27 graph.predecessors.entry(target).or_default().push(source);
29 for node in 0..graph.num_nodes {
30 graph.successors.entry(node).or_default();
31 graph.predecessors.entry(node).or_default();
37 impl DirectedGraph for TestGraph {
41 impl WithStartNode for TestGraph {
42 fn start_node(&self) -> usize {
47 impl WithNumNodes for TestGraph {
48 fn num_nodes(&self) -> usize {
53 impl WithPredecessors for TestGraph {
54 fn predecessors(&self, node: usize) -> <Self as GraphPredecessors<'_>>::Iter {
55 self.predecessors[&node].iter().cloned()
59 impl WithSuccessors for TestGraph {
60 fn successors(&self, node: usize) -> <Self as GraphSuccessors<'_>>::Iter {
61 self.successors[&node].iter().cloned()
65 impl<'graph> GraphPredecessors<'graph> for TestGraph {
67 type Iter = iter::Cloned<slice::Iter<'graph, usize>>;
70 impl<'graph> GraphSuccessors<'graph> for TestGraph {
72 type Iter = iter::Cloned<slice::Iter<'graph, usize>>;