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}