Skip to main content

weavatrix_graph/undirected/
view.rs

1use crate::EdgeEndpoints;
2use core::hash::Hash;
3
4pub trait UndirectedGraphView {
5    type Node: Copy + Eq + Hash;
6    type Edge: Copy + Eq + Hash;
7
8    fn node_count(&self) -> usize;
9
10    fn edge_count(&self) -> usize;
11
12    fn contains_node(&self, node: Self::Node) -> bool;
13
14    fn contains_edge(&self, edge: Self::Edge) -> bool;
15
16    fn node_indices(&self) -> impl Iterator<Item = Self::Node> + '_;
17
18    fn edge_indices(&self) -> impl Iterator<Item = Self::Edge> + '_;
19
20    fn edge_endpoints(&self, edge: Self::Edge) -> Option<EdgeEndpoints<Self::Node>>;
21
22    fn incident_edges(
23        &self,
24        node: Self::Node,
25    ) -> impl DoubleEndedIterator<Item = Self::Edge> + ExactSizeIterator + '_;
26
27    fn opposite(&self, edge: Self::Edge, node: Self::Node) -> Option<Self::Node> {
28        let endpoints = self.edge_endpoints(edge)?;
29        if endpoints.source() == node {
30            Some(endpoints.target())
31        } else if endpoints.target() == node {
32            Some(endpoints.source())
33        } else {
34            None
35        }
36    }
37}
38
39pub trait IndexUndirectedGraphView: UndirectedGraphView {
40    fn node_bound(&self) -> usize;
41
42    fn edge_bound(&self) -> usize;
43
44    fn node_slot(node: Self::Node) -> usize;
45
46    fn edge_slot(edge: Self::Edge) -> usize;
47
48    fn incident_edge_at(&self, node: Self::Node, offset: usize) -> Option<Self::Edge> {
49        self.incident_edges(node).nth(offset)
50    }
51}