1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#[cfg(feature = "petgraph")] mod petgraph; pub trait GraphBase { type NodeID: Copy; type EdgeID: Copy; } pub trait GraphNodeAddable<N>: GraphBase { fn add_node(&mut self, data: N) -> Self::NodeID; } pub trait GraphEdgeAddable<E>: GraphBase { fn add_edge(&mut self, a: Self::NodeID, b: Self::NodeID, data: E) -> Self::EdgeID; } pub trait GraphNodeRemovable<N>: GraphBase { fn remove_node(&mut self, id: Self::NodeID) -> N; } pub trait GraphEdgeRemovable<E>: GraphBase { fn remove_edge(&mut self, id: Self::EdgeID) -> E; } pub trait GraphNodeIndexable<N>: GraphBase { fn node(&self, id: Self::NodeID) -> &N; } pub trait GraphNodeMutIndexable<N>: GraphBase + GraphNodeIndexable<N> { fn node_mut(&mut self, id: Self::NodeID) -> &mut N; } pub trait GraphEdgeIndexable<E>: GraphBase { fn edge(&self, id: Self::EdgeID) -> &E; } pub trait GraphEdgeMutIndexable<E>: GraphBase + GraphEdgeIndexable<E> { fn edge_mut(&mut self, id: Self::EdgeID) -> &mut E; } pub trait GraphEdgeTo: GraphBase { fn edge_to(&self, id: Self::EdgeID) -> Self::NodeID; } pub trait GraphEdgeFrom: GraphBase + GraphEdgeTo { fn edge_from(&self, id: Self::EdgeID) -> Self::NodeID; } pub trait GraphEdgeEndpoints: GraphBase + GraphEdgeFrom + GraphEdgeTo { fn edge_endpoints(&self, id: Self::EdgeID) -> (Self::NodeID, Self::NodeID) { (self.edge_from(id), self.edge_to(id)) } } pub trait GraphEdgesFrom: GraphBase { type EdgesFromOutput; fn edges_from(&self, id: Self::NodeID) -> Self::EdgesFromOutput; }