]> git.lizzy.rs Git - rust.git/blob - src/librustc_query_system/dep_graph/prev.rs
pin docs: add some forward references
[rust.git] / src / librustc_query_system / dep_graph / prev.rs
1 use super::serialized::{SerializedDepGraph, SerializedDepNodeIndex};
2 use super::{DepKind, DepNode};
3 use rustc_data_structures::fingerprint::Fingerprint;
4 use rustc_data_structures::fx::FxHashMap;
5
6 #[derive(Debug, RustcEncodable, RustcDecodable)]
7 pub struct PreviousDepGraph<K: DepKind> {
8     data: SerializedDepGraph<K>,
9     index: FxHashMap<DepNode<K>, SerializedDepNodeIndex>,
10 }
11
12 impl<K: DepKind> Default for PreviousDepGraph<K> {
13     fn default() -> Self {
14         PreviousDepGraph { data: Default::default(), index: Default::default() }
15     }
16 }
17
18 impl<K: DepKind> PreviousDepGraph<K> {
19     pub fn new(data: SerializedDepGraph<K>) -> PreviousDepGraph<K> {
20         let index: FxHashMap<_, _> =
21             data.nodes.iter_enumerated().map(|(idx, &dep_node)| (dep_node, idx)).collect();
22         PreviousDepGraph { data, index }
23     }
24
25     #[inline]
26     pub fn edge_targets_from(
27         &self,
28         dep_node_index: SerializedDepNodeIndex,
29     ) -> &[SerializedDepNodeIndex] {
30         self.data.edge_targets_from(dep_node_index)
31     }
32
33     #[inline]
34     pub fn index_to_node(&self, dep_node_index: SerializedDepNodeIndex) -> DepNode<K> {
35         self.data.nodes[dep_node_index]
36     }
37
38     #[inline]
39     pub fn node_to_index(&self, dep_node: &DepNode<K>) -> SerializedDepNodeIndex {
40         self.index[dep_node]
41     }
42
43     #[inline]
44     pub fn node_to_index_opt(&self, dep_node: &DepNode<K>) -> Option<SerializedDepNodeIndex> {
45         self.index.get(dep_node).cloned()
46     }
47
48     #[inline]
49     pub fn fingerprint_of(&self, dep_node: &DepNode<K>) -> Option<Fingerprint> {
50         self.index.get(dep_node).map(|&node_index| self.data.fingerprints[node_index])
51     }
52
53     #[inline]
54     pub fn fingerprint_by_index(&self, dep_node_index: SerializedDepNodeIndex) -> Fingerprint {
55         self.data.fingerprints[dep_node_index]
56     }
57
58     pub fn node_count(&self) -> usize {
59         self.index.len()
60     }
61 }