wolf_graph/
reversed_graph.rs1use std::borrow::Cow;
2
3use anyhow::Result;
4
5use crate::{EdgeID, Edges, NodeID, Nodes, VisitableGraph};
6
7#[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}