toolbox_rs/
graph.rs

1use core::ops::Range;
2
3pub type NodeID = usize;
4pub type EdgeID = usize;
5pub const INVALID_NODE_ID: NodeID = NodeID::MAX;
6pub const INVALID_EDGE_ID: EdgeID = EdgeID::MAX;
7pub const UNREACHABLE: usize = usize::MAX;
8
9pub trait Graph<T> {
10    fn node_range(&self) -> Range<NodeID>;
11    fn edge_range(&self, n: NodeID) -> Range<EdgeID>;
12    fn number_of_nodes(&self) -> usize;
13    fn number_of_edges(&self) -> usize;
14    fn begin_edges(&self, n: NodeID) -> EdgeID;
15    fn end_edges(&self, n: NodeID) -> EdgeID;
16    fn out_degree(&self, n: NodeID) -> usize;
17    fn target(&self, e: EdgeID) -> NodeID;
18    fn data(&self, e: EdgeID) -> &T;
19    fn data_mut(&mut self, e: EdgeID) -> &mut T;
20    fn find_edge(&self, s: NodeID, t: NodeID) -> Option<EdgeID>;
21    fn find_edge_unchecked(&self, s: NodeID, t: NodeID) -> EdgeID;
22}
23#[derive(Clone, Copy)]
24pub struct EdgeArrayEntry<EdgeDataT: Clone> {
25    pub target: NodeID,
26    pub data: EdgeDataT,
27}