adjacency_list/sparse_edges/
one_way.rs1use super::*;
2use crate::{
3 DiGraphAED, EdgeFirstAllBridges, EdgeFirstAllEdges, EdgeFirstAllNodes, EdgeFirstFindBridges, EdgeFirstFindNeighbors,
4};
5
6use graph_types::{errors::GraphError, EdgeID, IndeterminateEdge, NodeID, Query};
7
8impl<'a> GraphEngine<'a> for DiGraphAED {
9 type NeighborIterator = EdgeFirstFindNeighbors<'a>;
10 type BridgeIterator = EdgeFirstFindBridges<'a>;
11 type NodeTraverser = EdgeFirstAllNodes<'a>;
12 type EdgeTraverser = EdgeFirstAllEdges<'a>;
13 type BridgeTraverser = EdgeFirstAllBridges<'a>;
14
15 fn graph_kind(&self) -> GraphKind {
16 GraphKind::Directed
17 }
18
19 fn get_node(&self, node: NodeID) -> Result<NodeID, GraphError> {
20 if self.nodes.contains(&(node as u32)) { Ok(node) } else { Err(GraphError::not_found(Query::NodeID(node))) }
21 }
22
23 fn all_nodes(&'a self) -> Self::NodeTraverser {
24 EdgeFirstAllNodes { nodes: self.nodes.iter() }
25 }
26
27 fn all_neighbors(&'a self, node: NodeID) -> Self::NeighborIterator {
28 EdgeFirstFindNeighbors { edges: self.edges.iter(), target: node as u32 }
29 }
30
31 fn get_outgoing(&'a self, node: NodeID) -> Self::NeighborIterator {
32 todo!()
33 }
34 fn get_incoming(&'a self, node: NodeID) -> Self::NeighborIterator {
35 todo!()
36 }
37
38 fn get_edge(&self, edge: EdgeID) -> Result<EdgeID, GraphError> {
39 if self.edges.contains_key(&(edge as u32)) { Ok(edge) } else { Err(GraphError::not_found(Query::EdgeID(edge))) }
40 }
41
42 fn all_edges(&'a self) -> Self::EdgeTraverser {
43 EdgeFirstAllEdges { edges: self.edges.iter() }
44 }
45
46 fn get_bridge(&self, edge: EdgeID) -> Result<IndeterminateEdge, GraphError> {
47 match self.edges.get(&(edge as u32)) {
48 Some(s) => Ok(s.as_indeterminate()),
49 None => Err(GraphError::not_found(Query::EdgeID(edge))),
50 }
51 }
52
53 fn get_bridges(&'a self, from: NodeID, goto: NodeID) -> Self::BridgeIterator {
54 EdgeFirstFindBridges { edges: self.edges.iter(), target: ShortEdge::new(from, goto) }
55 }
56
57 fn all_bridges(&'a self) -> Self::BridgeTraverser {
58 EdgeFirstAllBridges { edges: self.edges.iter() }
59 }
60}
61
62impl MutableGraph for DiGraphAED {
63 fn insert_node(&mut self, node_id: usize) -> bool {
64 self.nodes.insert(node_id as u32)
65 }
66
67 fn create_node(&mut self) -> usize {
68 let id = self.nodes.iter().last().map(|x| x + 1).unwrap_or(0);
69 self.nodes.insert(id);
70 id as usize
71 }
72
73 fn remove_node_with_edges(&mut self, node_id: usize) {
74 let _id = node_id as u32;
75 todo!()
76 }
77 fn insert_edge_with_nodes<E: Edge>(&mut self, edge: E) -> EdgeInsertID {
78 let lhs = edge.lhs();
79 let rhs = edge.rhs();
80 match edge.direction() {
81 EdgeDirection::Disconnect => EdgeInsertID::Nothing,
82 EdgeDirection::TwoWay => {
83 let e1 = self.insert_one_way_edge(lhs, rhs);
84 let e2 = self.insert_one_way_edge(rhs, lhs);
85 EdgeInsertID::TwoEdges(e1, e2)
86 }
87 EdgeDirection::Forward => {
88 let e1 = self.insert_one_way_edge(lhs, rhs);
89 EdgeInsertID::OneEdge(e1)
90 }
91 EdgeDirection::Reverse => {
92 let e1 = self.insert_one_way_edge(rhs, lhs);
93 EdgeInsertID::OneEdge(e1)
94 }
95 EdgeDirection::Indeterminate => {
96 todo!()
97 }
98 }
99 }
100
101 fn remove_edge<E>(&mut self, edge: E)
102 where
103 E: Into<EdgeQuery>,
104 {
105 match edge.into() {
106 EdgeQuery::EdgeID(i) => {
107 self.edges.remove(&(i as u32));
108 }
109 EdgeQuery::Directed(_di) => {
110 todo!()
111 }
112 EdgeQuery::Undirected(_) => {
113 todo!()
114 }
115 EdgeQuery::Dynamic(_) => {
116 todo!()
117 }
118 }
119 }
120}
121
122impl DiGraphAED {
123 pub(crate) fn find_edge_id(&self, from: u32, goto: u32) -> Result<EdgeID, GraphError> {
124 todo!()
125 }
126
127 pub(crate) fn insert_one_way_edge(&mut self, start: usize, end: usize) -> usize {
128 let id = self.edges.len() as u32 + 1;
129 self.edges.insert(id, ShortEdge::new(start, end));
130 id as usize
131 }
132}