weavatrix_graph/payload/stable_undirected/
view.rs1use super::core::StableUndirectedPayloadGraph;
2use crate::{
3 EdgeEndpoints, IndexUndirectedGraphView, StableEdgeKey, StableNodeKey, UndirectedGraphView,
4};
5
6impl<NodePayload, EdgePayload> UndirectedGraphView
7 for StableUndirectedPayloadGraph<NodePayload, EdgePayload>
8{
9 type Node = StableNodeKey;
10 type Edge = StableEdgeKey;
11
12 fn node_count(&self) -> usize {
13 self.node_count()
14 }
15
16 fn edge_count(&self) -> usize {
17 self.edge_count()
18 }
19
20 fn contains_node(&self, node: Self::Node) -> bool {
21 self.node(node).is_some()
22 }
23
24 fn contains_edge(&self, edge: Self::Edge) -> bool {
25 self.edge(edge).is_some()
26 }
27
28 fn node_indices(&self) -> impl Iterator<Item = Self::Node> + '_ {
29 self.nodes().map(|pair| pair.0)
30 }
31
32 fn edge_indices(&self) -> impl Iterator<Item = Self::Edge> + '_ {
33 self.edges().map(|pair| pair.0)
34 }
35
36 fn edge_endpoints(&self, edge: Self::Edge) -> Option<EdgeEndpoints<Self::Node>> {
37 self.edge_endpoints(edge)
38 }
39
40 fn incident_edges(
41 &self,
42 node: Self::Node,
43 ) -> impl DoubleEndedIterator<Item = Self::Edge> + ExactSizeIterator + '_ {
44 self.incident_edges(node)
45 }
46}
47
48impl<NodePayload, EdgePayload> IndexUndirectedGraphView
49 for StableUndirectedPayloadGraph<NodePayload, EdgePayload>
50{
51 fn node_bound(&self) -> usize {
52 self.nodes.len()
53 }
54
55 fn edge_bound(&self) -> usize {
56 self.edges.len()
57 }
58
59 fn node_slot(node: Self::Node) -> usize {
60 node.index()
61 }
62
63 fn edge_slot(edge: Self::Edge) -> usize {
64 edge.index()
65 }
66
67 fn incident_edge_at(&self, node: Self::Node, offset: usize) -> Option<Self::Edge> {
68 let degree = self.node_slot(node)?.degree;
69 if offset >= degree {
70 return None;
71 }
72 if offset <= degree / 2 {
73 self.incident_edges(node).nth(offset)
74 } else {
75 self.incident_edges(node).nth_back(degree - offset - 1)
76 }
77 }
78}