2016-06-09 22:49:07 +00:00
|
|
|
use std::cmp::max;
|
|
|
|
|
2018-07-02 14:40:03 +00:00
|
|
|
use super::*;
|
2019-02-08 16:36:22 +00:00
|
|
|
use crate::fx::FxHashMap;
|
2016-06-09 22:49:07 +00:00
|
|
|
|
2025-03-06 03:25:44 +00:00
|
|
|
pub(super) struct TestGraph {
|
2016-06-09 22:49:07 +00:00
|
|
|
num_nodes: usize,
|
|
|
|
start_node: usize,
|
2018-08-18 10:55:43 +00:00
|
|
|
successors: FxHashMap<usize, Vec<usize>>,
|
|
|
|
predecessors: FxHashMap<usize, Vec<usize>>,
|
2016-06-09 22:49:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl TestGraph {
|
2025-03-06 03:25:44 +00:00
|
|
|
pub(super) fn new(start_node: usize, edges: &[(usize, usize)]) -> Self {
|
2016-06-09 22:49:07 +00:00
|
|
|
let mut graph = TestGraph {
|
|
|
|
num_nodes: start_node + 1,
|
2017-08-07 05:54:09 +00:00
|
|
|
start_node,
|
2018-08-18 10:55:43 +00:00
|
|
|
successors: FxHashMap::default(),
|
|
|
|
predecessors: FxHashMap::default(),
|
2016-06-09 22:49:07 +00:00
|
|
|
};
|
|
|
|
for &(source, target) in edges {
|
|
|
|
graph.num_nodes = max(graph.num_nodes, source + 1);
|
|
|
|
graph.num_nodes = max(graph.num_nodes, target + 1);
|
2018-07-21 19:43:31 +00:00
|
|
|
graph.successors.entry(source).or_default().push(target);
|
|
|
|
graph.predecessors.entry(target).or_default().push(source);
|
2016-06-09 22:49:07 +00:00
|
|
|
}
|
|
|
|
for node in 0..graph.num_nodes {
|
2018-07-21 19:43:31 +00:00
|
|
|
graph.successors.entry(node).or_default();
|
|
|
|
graph.predecessors.entry(node).or_default();
|
2016-06-09 22:49:07 +00:00
|
|
|
}
|
|
|
|
graph
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-02 14:40:03 +00:00
|
|
|
impl DirectedGraph for TestGraph {
|
2016-06-09 22:49:07 +00:00
|
|
|
type Node = usize;
|
2024-04-14 15:15:03 +00:00
|
|
|
|
|
|
|
fn num_nodes(&self) -> usize {
|
|
|
|
self.num_nodes
|
|
|
|
}
|
2018-07-02 14:40:03 +00:00
|
|
|
}
|
2016-06-09 22:49:07 +00:00
|
|
|
|
2024-04-14 15:51:29 +00:00
|
|
|
impl StartNode for TestGraph {
|
2016-06-09 22:49:07 +00:00
|
|
|
fn start_node(&self) -> usize {
|
|
|
|
self.start_node
|
|
|
|
}
|
2018-07-02 14:40:03 +00:00
|
|
|
}
|
2016-06-09 22:49:07 +00:00
|
|
|
|
2024-04-14 15:40:26 +00:00
|
|
|
impl Predecessors for TestGraph {
|
2024-04-15 13:33:08 +00:00
|
|
|
fn predecessors(&self, node: usize) -> impl Iterator<Item = Self::Node> {
|
2016-10-19 18:55:19 +00:00
|
|
|
self.predecessors[&node].iter().cloned()
|
2016-06-09 22:49:07 +00:00
|
|
|
}
|
2018-07-02 14:40:03 +00:00
|
|
|
}
|
2016-06-09 22:49:07 +00:00
|
|
|
|
2024-04-14 15:40:26 +00:00
|
|
|
impl Successors for TestGraph {
|
2024-04-15 13:33:08 +00:00
|
|
|
fn successors(&self, node: usize) -> impl Iterator<Item = Self::Node> {
|
2016-06-09 22:49:07 +00:00
|
|
|
self.successors[&node].iter().cloned()
|
|
|
|
}
|
|
|
|
}
|