Skip to main content

weavatrix_graph/view/
reversed.rs

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