wolf_graph/
reversed_graph.rs

1use std::borrow::Cow;
2
3use anyhow::Result;
4
5use crate::{EdgeID, Edges, NodeID, Nodes, VisitableGraph};
6
7/// An adapter that reverses the direction of edges in a graph.
8#[derive(Debug, Clone)]
9pub struct ReversedGraph<Inner>
10where Inner: VisitableGraph
11{
12    graph: Inner
13}
14
15impl<Inner> ReversedGraph<Inner>
16where Inner: VisitableGraph
17{
18    pub fn new(graph: Inner) -> Self {
19        ReversedGraph { graph }
20    }
21
22    pub fn graph(&self) -> &Inner {
23        &self.graph
24    }
25}
26
27impl<Inner> VisitableGraph for ReversedGraph<Inner>
28where Inner: VisitableGraph
29{
30    type GData = Inner::GData;
31    type NData = Inner::NData;
32    type EData = Inner::EData;
33
34    fn data(&self) -> &Self::GData {
35        self.graph.data()
36    }
37
38    fn node_data(&self, id: impl AsRef<NodeID>) -> Result<Cow<'static, Self::NData>> {
39        self.graph.node_data(id)
40    }
41
42    fn edge_data(&self, id: impl AsRef<EdgeID>) -> Result<Cow<'static, Self::EData>> {
43        self.graph.edge_data(id)
44    }
45
46    fn is_empty(&self) -> bool {
47        self.graph.is_empty()
48    }
49
50    fn node_count(&self) -> usize {
51        self.graph.node_count()
52    }
53
54    fn edge_count(&self) -> usize {
55        self.graph.edge_count()
56    }
57
58    fn all_nodes(&self) -> Nodes {
59        self.graph.all_nodes()
60    }
61
62    fn all_edges(&self) -> Edges {
63        self.graph.all_edges()
64    }
65
66    fn has_node(&self, id: impl AsRef<NodeID>) -> bool {
67        self.graph.has_node(id)
68    }
69
70    fn has_edge(&self, id: impl AsRef<EdgeID>) -> bool {
71        self.graph.has_edge(id)
72    }
73
74    fn has_edge_from_to(&self, source: impl AsRef<NodeID>, target: impl AsRef<NodeID>) -> bool {
75        self.graph.has_edge_from_to(target, source)
76    }
77
78    fn has_edge_between(&self, a: impl AsRef<NodeID>, b: impl AsRef<NodeID>) -> bool {
79        self.graph.has_edge_between(a, b)
80    }
81
82    fn source(&self, id: impl AsRef<EdgeID>) -> Result<NodeID> {
83        self.graph.target(id)
84    }
85
86    fn target(&self, id: impl AsRef<EdgeID>) -> Result<NodeID> {
87        self.graph.source(id)
88    }
89
90    fn endpoints(&self, id: impl AsRef<EdgeID>) -> Result<(NodeID, NodeID)> {
91        let (a, b) = self.graph.endpoints(id)?;
92        Ok((b, a))
93    }
94
95    fn out_edges(&self, id: impl AsRef<NodeID>) -> Result<Edges> {
96        self.graph.in_edges(id)
97    }
98
99    fn in_edges(&self, id: impl AsRef<NodeID>) -> Result<Edges> {
100        self.graph.out_edges(id)
101    }
102
103    fn incident_edges(&self, id: impl AsRef<NodeID>) -> Result<Edges> {
104        self.graph.incident_edges(id)
105    }
106
107    fn out_degree(&self, id: impl AsRef<NodeID>) -> Result<usize> {
108        self.graph.in_degree(id)
109    }
110
111    fn in_degree(&self, id: impl AsRef<NodeID>) -> Result<usize> {
112        self.graph.out_degree(id)
113    }
114
115    fn degree(&self, id: impl AsRef<NodeID>) -> Result<usize> {
116        self.graph.degree(id)
117    }
118
119    fn successors(&self, id: impl AsRef<NodeID>) -> Result<Nodes> {
120        self.graph.predecessors(id)
121    }
122
123    fn predecessors(&self, id: impl AsRef<NodeID>) -> Result<Nodes> {
124        self.graph.successors(id)
125    }
126
127    fn neighbors(&self, id: impl AsRef<NodeID>) -> Result<Nodes> {
128        self.graph.neighbors(id)
129    }
130
131    fn has_successors(&self, id: impl AsRef<NodeID>) -> Result<bool> {
132        self.graph.has_predecessors(id)
133    }
134
135    fn has_predecessors(&self, id: impl AsRef<NodeID>) -> Result<bool> {
136        self.graph.has_successors(id)
137    }
138
139    fn has_neighbors(&self, id: impl AsRef<NodeID>) -> Result<bool> {
140        self.graph.has_neighbors(id)
141    }
142
143    fn all_roots(&self) -> Nodes {
144        self.graph.all_leaves()
145    }
146
147    fn all_leaves(&self) -> Nodes {
148        self.graph.all_roots()
149    }
150
151    fn non_roots(&self) -> Nodes {
152        self.graph.non_leaves()
153    }
154
155    fn non_leaves(&self) -> Nodes {
156        self.graph.non_roots()
157    }
158
159    fn all_internals(&self) -> Nodes {
160        self.graph.all_internals()
161    }
162
163    fn is_leaf(&self, id: impl AsRef<NodeID>) -> Result<bool> {
164        self.graph.is_root(id)
165    }
166
167    fn is_root(&self, id: impl AsRef<NodeID>) -> Result<bool> {
168        self.graph.is_leaf(id)
169    }
170
171    fn is_internal(&self, id: impl AsRef<NodeID>) -> Result<bool> {
172        self.graph.is_internal(id)
173    }
174}