weavatrix_graph/undirected/
view.rs1use 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}