weavatrix_graph/view/
reversed.rs1use crate::{EdgeEndpoints, GraphView, IndexGraphView};
2
3#[derive(Debug, Clone, Copy)]
4pub struct Reversed<'graph, G> {
5 graph: &'graph G,
6}
7
8impl<'graph, G> Reversed<'graph, G> {
9 #[must_use]
10 pub const fn new(graph: &'graph G) -> Self {
11 Self { graph }
12 }
13
14 #[must_use]
15 pub const fn inner(&self) -> &'graph G {
16 self.graph
17 }
18}
19
20impl<G: GraphView> GraphView for Reversed<'_, G> {
21 type Node = G::Node;
22 type Edge = G::Edge;
23
24 fn node_count(&self) -> usize {
25 self.graph.node_count()
26 }
27
28 fn edge_count(&self) -> usize {
29 self.graph.edge_count()
30 }
31
32 fn contains_node(&self, node: Self::Node) -> bool {
33 self.graph.contains_node(node)
34 }
35
36 fn contains_edge(&self, edge: Self::Edge) -> bool {
37 self.graph.contains_edge(edge)
38 }
39
40 fn node_indices(&self) -> impl Iterator<Item = Self::Node> + '_ {
41 self.graph.node_indices()
42 }
43
44 fn edge_indices(&self) -> impl Iterator<Item = Self::Edge> + '_ {
45 self.graph.edge_indices()
46 }
47
48 fn edge_endpoints(&self, edge: Self::Edge) -> Option<EdgeEndpoints<Self::Node>> {
49 let endpoints = self.graph.edge_endpoints(edge)?;
50 Some(EdgeEndpoints::new(endpoints.target(), endpoints.source()))
51 }
52
53 fn outgoing_edges(&self, node: Self::Node) -> impl Iterator<Item = Self::Edge> + '_ {
54 self.graph.incoming_edges(node)
55 }
56
57 fn incoming_edges(&self, node: Self::Node) -> impl Iterator<Item = Self::Edge> + '_ {
58 self.graph.outgoing_edges(node)
59 }
60}
61
62impl<G: IndexGraphView> IndexGraphView for Reversed<'_, G> {
63 fn node_bound(&self) -> usize {
64 self.graph.node_bound()
65 }
66
67 fn edge_bound(&self) -> usize {
68 self.graph.edge_bound()
69 }
70
71 fn node_slot(node: Self::Node) -> usize {
72 G::node_slot(node)
73 }
74
75 fn edge_slot(edge: Self::Edge) -> usize {
76 G::edge_slot(edge)
77 }
78}
79
80#[must_use]
81pub const fn reversed<G>(graph: &G) -> Reversed<'_, G> {
82 Reversed::new(graph)
83}