revset_graph: remove unneeded Vec<IndexGraphEdge> cloning

This commit is contained in:
Yuya Nishihara 2023-07-28 17:07:56 +09:00
parent 8dc59a3d69
commit dd5cc843da

View File

@ -24,7 +24,7 @@ use crate::revset_graph::{RevsetGraphEdge, RevsetGraphEdgeType};
/// Like `RevsetGraphEdge`, but stores `IndexPosition` instead. /// Like `RevsetGraphEdge`, but stores `IndexPosition` instead.
/// ///
/// This can be cheaply allocated and hashed compared to `CommitId`-based type. /// This can be cheaply allocated and hashed compared to `CommitId`-based type.
#[derive(Clone, Debug, Eq, Hash, PartialEq)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
struct IndexGraphEdge { struct IndexGraphEdge {
target: IndexPosition, target: IndexPosition,
edge_type: RevsetGraphEdgeType, edge_type: RevsetGraphEdgeType,
@ -46,7 +46,7 @@ impl IndexGraphEdge {
IndexGraphEdge { target, edge_type } IndexGraphEdge { target, edge_type }
} }
fn to_revset_edge(&self, index: CompositeIndex<'_>) -> RevsetGraphEdge { fn to_revset_edge(self, index: CompositeIndex<'_>) -> RevsetGraphEdge {
RevsetGraphEdge { RevsetGraphEdge {
target: index.entry_by_pos(self.target).commit_id(), target: index.entry_by_pos(self.target).commit_id(),
edge_type: self.edge_type, edge_type: self.edge_type,
@ -165,13 +165,14 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
fn edges_from_internal_commit( fn edges_from_internal_commit(
&mut self, &mut self,
index_entry: &IndexEntry<'index>, index_entry: &IndexEntry<'index>,
) -> Vec<IndexGraphEdge> { ) -> &[IndexGraphEdge] {
if let Some(edges) = self.edges.get(&index_entry.position()) { let position = index_entry.position();
return edges.clone(); // `if let Some(edges) = ...` doesn't pass lifetime check as of Rust 1.71.0
if self.edges.contains_key(&position) {
return self.edges.get(&position).unwrap();
} }
let edges = self.new_edges_from_internal_commit(index_entry); let edges = self.new_edges_from_internal_commit(index_entry);
self.edges.insert(index_entry.position(), edges.clone()); self.edges.entry(position).or_insert(edges)
edges
} }
fn pop_edges_from_internal_commit( fn pop_edges_from_internal_commit(
@ -210,7 +211,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
} else { } else {
edges.extend( edges.extend(
parent_edges parent_edges
.into_iter() .iter()
.filter(|edge| known_ancestors.insert(edge.target)), .filter(|edge| known_ancestors.insert(edge.target)),
) )
} }
@ -219,10 +220,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
edges edges
} }
fn edges_from_external_commit( fn edges_from_external_commit(&mut self, index_entry: IndexEntry<'index>) -> &[IndexGraphEdge] {
&mut self,
index_entry: IndexEntry<'index>,
) -> Vec<IndexGraphEdge> {
let position = index_entry.position(); let position = index_entry.position();
let mut stack = vec![index_entry]; let mut stack = vec![index_entry];
while let Some(entry) = stack.last() { while let Some(entry) = stack.last() {
@ -250,8 +248,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
edges.extend( edges.extend(
parent_edges parent_edges
.iter() .iter()
.filter(|edge| known_ancestors.insert(edge.target)) .filter(|edge| known_ancestors.insert(edge.target)),
.cloned(),
); );
} }
} else if parent_position < self.min_position { } else if parent_position < self.min_position {
@ -269,7 +266,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
self.edges.insert(position, edges); self.edges.insert(position, edges);
} }
} }
self.edges.get(&position).unwrap().clone() self.edges.get(&position).unwrap()
} }
fn remove_transitive_edges(&mut self, edges: Vec<IndexGraphEdge>) -> Vec<IndexGraphEdge> { fn remove_transitive_edges(&mut self, edges: Vec<IndexGraphEdge>) -> Vec<IndexGraphEdge> {
@ -288,7 +285,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
if edge.edge_type != RevsetGraphEdgeType::Missing { if edge.edge_type != RevsetGraphEdgeType::Missing {
let entry = self.look_ahead.get(&edge.target).unwrap().clone(); let entry = self.look_ahead.get(&edge.target).unwrap().clone();
min_generation = min(min_generation, entry.generation_number()); min_generation = min(min_generation, entry.generation_number());
work.extend(self.edges_from_internal_commit(&entry)); work.extend_from_slice(self.edges_from_internal_commit(&entry));
} }
} }
// Find commits reachable transitively and add them to the `unwanted` set. // Find commits reachable transitively and add them to the `unwanted` set.
@ -309,7 +306,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
if entry.generation_number() < min_generation { if entry.generation_number() < min_generation {
continue; continue;
} }
work.extend(self.edges_from_internal_commit(&entry)); work.extend_from_slice(self.edges_from_internal_commit(&entry));
} }
edges edges