adjacency_list/sparse_edges/
one_way.rs

1use 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}