grapes/map_graph/
node_ref.rs

1use crate::graph;
2use crate::map_graph::{EdgeEntry, EdgesFrom, EdgesTo, NodeEntry};
3use std::hash::Hash;
4
5/// Reference to a node in a [MapGraph](super::MapGraph)
6///
7/// The library guarantees that this references a valid node
8#[derive(Clone, Copy, Debug)]
9pub struct NodeRef<
10    'a,
11    NodeKey: Hash + Eq + Clone,
12    NodeData: Clone,
13    EdgeKey: Hash + Eq + Clone,
14    EdgeData: Clone,
15> {
16    inner: graph::NodeRef<'a, NodeEntry<NodeKey, NodeData>, EdgeEntry<EdgeKey, EdgeData>>,
17}
18
19impl<
20        'a,
21        NodeKey: Hash + Eq + Clone,
22        NodeData: Clone,
23        EdgeKey: Hash + Eq + Clone,
24        EdgeData: Clone,
25    > NodeRef<'a, NodeKey, NodeData, EdgeKey, EdgeData>
26{
27    pub(crate) fn new(
28        inner: graph::NodeRef<'a, NodeEntry<NodeKey, NodeData>, EdgeEntry<EdgeKey, EdgeData>>,
29    ) -> Self {
30        Self { inner }
31    }
32
33    /// The data associated with the node
34    ///
35    /// (a.k.a. the node weight)
36    #[must_use]
37    pub fn data(&self) -> &'a NodeData {
38        &self.inner.data().data
39    }
40
41    /// The node's identifier
42    ///
43    /// You can use this to later reference the node in the graph (if it still exists)
44    #[must_use]
45    pub fn key(&self) -> &'a NodeKey {
46        &self.inner.data().key
47    }
48
49    /// Iterate over edges leaving this node
50    ///
51    /// Order is unspecified.
52    pub fn iter_edges_from(&self) -> EdgesFrom<NodeKey, NodeData, EdgeKey, EdgeData> {
53        EdgesFrom::new(self.inner.iter_edges_from())
54    }
55
56    /// Iterate over edges entering this node
57    ///
58    /// Order is unspecified.
59    pub fn iter_edges_to(&self) -> EdgesTo<NodeKey, NodeData, EdgeKey, EdgeData> {
60        EdgesTo::new(self.inner.iter_edges_to())
61    }
62}