use crate::{
graph::{GraphBase, GraphSucc},
index::{Idx, vec::IndexVec},
};
pub struct IndexGraph<Node: Idx> {
nodes: IndexVec<Node, Vec<Node>>,
}
impl<Node: Idx> IndexGraph<Node> {
pub fn new() -> IndexGraph<Node> {
IndexGraph {
nodes: IndexVec::new(),
}
}
pub fn resize(&mut self, num_nodes: usize) {
self.nodes.resize(num_nodes, |_| vec![]);
}
pub fn edge(&mut self, src: Node, dst: Node) {
self.nodes[src].push(dst);
}
}
impl<Node: Idx> From<IndexVec<Node, Vec<Node>>> for IndexGraph<Node> {
fn from(nodes: IndexVec<Node, Vec<Node>>) -> IndexGraph<Node> {
IndexGraph { nodes }
}
}
impl<'a, Node: Idx> GraphBase for &'a IndexGraph<Node> {
type Node = Node;
type NodeMapImpl<Value> = IndexVec<Node, Value>;
fn clear_nodemap<Value>(
self,
map: &mut IndexVec<Node, Value>,
mut init: impl FnMut(Self::Node) -> Value,
) {
map.clear();
for node in self.nodes() {
map.push(init(node));
}
}
fn nodes(self) -> impl Iterator<Item = Self::Node> {
self.nodes.index_iter()
}
}
impl<'a, Node: Idx> GraphSucc for &'a IndexGraph<Node> {
fn succ_of(self, node: Self::Node) -> impl Iterator<Item = Self::Node> {
self.nodes[node].iter().copied()
}
}