weavatrix_graph/topology/
view.rs1use super::NodeIndex;
2use serde::{Deserialize, Serialize};
3use std::hash::Hash;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub struct EdgeEndpoints<Node = NodeIndex> {
7 source: Node,
8 target: Node,
9}
10
11impl<Node: Copy> EdgeEndpoints<Node> {
12 #[must_use]
13 pub const fn new(source: Node, target: Node) -> Self {
14 Self { source, target }
15 }
16
17 #[must_use]
18 pub const fn source(self) -> Node {
19 self.source
20 }
21
22 #[must_use]
23 pub const fn target(self) -> Node {
24 self.target
25 }
26}
27
28pub trait GraphView {
29 type Node: Copy + Eq + Hash;
30 type Edge: Copy + Eq + Hash;
31
32 fn node_count(&self) -> usize;
33
34 fn edge_count(&self) -> usize;
35
36 fn contains_node(&self, node: Self::Node) -> bool {
37 self.node_indices().any(|candidate| candidate == node)
38 }
39
40 fn contains_edge(&self, edge: Self::Edge) -> bool {
41 self.edge_indices().any(|candidate| candidate == edge)
42 }
43
44 fn node_indices(&self) -> impl Iterator<Item = Self::Node> + '_;
45
46 fn edge_indices(&self) -> impl Iterator<Item = Self::Edge> + '_;
47
48 fn edge_endpoints(&self, edge: Self::Edge) -> Option<EdgeEndpoints<Self::Node>>;
49
50 fn outgoing_edges(
51 &self,
52 node: Self::Node,
53 ) -> impl DoubleEndedIterator<Item = Self::Edge> + ExactSizeIterator + '_;
54
55 fn incoming_edges(
56 &self,
57 node: Self::Node,
58 ) -> impl DoubleEndedIterator<Item = Self::Edge> + ExactSizeIterator + '_;
59}
60
61pub trait IndexGraphView: GraphView {
62 fn node_bound(&self) -> usize;
63
64 fn edge_bound(&self) -> usize;
65
66 fn node_slot(node: Self::Node) -> usize;
67
68 fn edge_slot(edge: Self::Edge) -> usize;
69}