fingerprints.resize(current_dep_graph.nodes.len(), Fingerprint::ZERO);
}
- let nodes: IndexVec<_, (DepNode, Fingerprint)> =
- current_dep_graph.nodes.iter_enumerated().map(|(idx, &dep_node)| {
- (dep_node, fingerprints[idx])
- }).collect();
+ let fingerprints = fingerprints.clone().convert_index_type();
+ let nodes = current_dep_graph.nodes.clone().convert_index_type();
let total_edge_count: usize = current_dep_graph.edges.iter()
.map(|v| v.len())
SerializedDepGraph {
nodes,
+ fingerprints,
edge_list_indices,
edge_list_data,
}
pub fn new(data: SerializedDepGraph) -> PreviousDepGraph {
let index: FxHashMap<_, _> = data.nodes
.iter_enumerated()
- .map(|(idx, &(dep_node, _))| (dep_node, idx))
+ .map(|(idx, &dep_node)| (dep_node, idx))
.collect();
PreviousDepGraph { data, index }
}
#[inline]
pub fn index_to_node(&self, dep_node_index: SerializedDepNodeIndex) -> DepNode {
- self.data.nodes[dep_node_index].0
+ self.data.nodes[dep_node_index]
}
#[inline]
pub fn fingerprint_of(&self, dep_node: &DepNode) -> Option<Fingerprint> {
self.index
.get(dep_node)
- .map(|&node_index| self.data.nodes[node_index].1)
+ .map(|&node_index| self.data.fingerprints[node_index])
}
#[inline]
pub fn fingerprint_by_index(&self,
dep_node_index: SerializedDepNodeIndex)
-> Fingerprint {
- self.data.nodes[dep_node_index].1
+ self.data.fingerprints[dep_node_index]
}
pub fn node_count(&self) -> usize {
#[derive(Debug, RustcEncodable, RustcDecodable)]
pub struct SerializedDepGraph {
/// The set of all DepNodes in the graph
- pub nodes: IndexVec<SerializedDepNodeIndex, (DepNode, Fingerprint)>,
+ pub nodes: IndexVec<SerializedDepNodeIndex, DepNode>,
+ /// The set of all Fingerprints in the graph. Each Fingerprint corresponds to
+ /// the DepNode at the same index in the nodes vector.
+ pub fingerprints: IndexVec<SerializedDepNodeIndex, Fingerprint>,
/// For each DepNode, stores the list of edges originating from that
/// DepNode. Encoded as a [start, end) pair indexing into edge_list_data,
/// which holds the actual DepNodeIndices of the target nodes.
pub fn new() -> SerializedDepGraph {
SerializedDepGraph {
nodes: IndexVec::new(),
+ fingerprints: IndexVec::new(),
edge_list_indices: IndexVec::new(),
edge_list_data: Vec::new(),
}
(c1, c2)
}
}
+
+ pub fn convert_index_type<Ix: Idx>(self) -> IndexVec<Ix, T> {
+ IndexVec {
+ raw: self.raw,
+ _marker: PhantomData,
+ }
+ }
}
impl<I: Idx, T: Clone> IndexVec<I, T> {
let mut counts: FxHashMap<_, Stat> = FxHashMap();
- for (i, &(node, _)) in serialized_graph.nodes.iter_enumerated() {
+ for (i, &node) in serialized_graph.nodes.iter_enumerated() {
let stat = counts.entry(node.kind).or_insert(Stat {
kind: node.kind,
node_counter: 0,