Skip to content

Commit 0fd5de0

Browse files
committed
refactor(tree): Abstract Edges
1 parent 712f984 commit 0fd5de0

File tree

1 file changed

+31
-27
lines changed

1 file changed

+31
-27
lines changed

src/cargo/ops/tree/graph.rs

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,18 @@ impl Edges {
7272
indexes.push(edge)
7373
}
7474
}
75+
76+
fn all(&self) -> impl Iterator<Item = &Edge> + '_ {
77+
self.0.values().flatten()
78+
}
79+
80+
fn of_kind(&self, kind: &EdgeKind) -> &[Edge] {
81+
self.0.get(kind).map(Vec::as_slice).unwrap_or_default()
82+
}
83+
84+
fn is_empty(&self) -> bool {
85+
self.0.is_empty()
86+
}
7587
}
7688

7789
/// A graph of dependencies.
@@ -121,20 +133,16 @@ impl<'a> Graph<'a> {
121133

122134
/// Returns a list of nodes the given node index points to for the given kind.
123135
pub fn edges(&self, from: usize, kind: &EdgeKind) -> Vec<Edge> {
124-
match self.edges[from].0.get(kind) {
125-
Some(edges) => {
126-
// Created a sorted list for consistent output.
127-
let mut edges = edges.clone();
128-
edges.sort_unstable_by(|a, b| self.nodes[a.node].cmp(&self.nodes[b.node]));
129-
edges
130-
}
131-
None => Vec::new(),
132-
}
136+
let edges = self.edges[from].of_kind(kind);
137+
// Created a sorted list for consistent output.
138+
let mut edges = edges.to_owned();
139+
edges.sort_unstable_by(|a, b| self.nodes[a.node()].cmp(&self.nodes[b.node()]));
140+
edges
133141
}
134142

135143
/// Returns `true` if the given node has any outgoing edges.
136144
pub fn has_outgoing_edges(&self, index: usize) -> bool {
137-
!self.edges[index].0.is_empty()
145+
!self.edges[index].is_empty()
138146
}
139147

140148
/// Gets a node by index.
@@ -200,15 +208,13 @@ impl<'a> Graph<'a> {
200208
let new_from = new_graph.add_node(node);
201209
remap[index] = Some(new_from);
202210
// Visit dependencies.
203-
for (_, edges) in &graph.edges[index].0 {
204-
for edge in edges {
205-
let new_to_index = visit(graph, new_graph, remap, edge.node());
206-
let new_edge = Edge {
207-
kind: edge.kind(),
208-
node: new_to_index,
209-
};
210-
new_graph.edges[new_from].add_edge(new_edge);
211-
}
211+
for edge in graph.edges[index].all() {
212+
let new_to_index = visit(graph, new_graph, remap, edge.node());
213+
let new_edge = Edge {
214+
kind: edge.kind(),
215+
node: new_to_index,
216+
};
217+
new_graph.edges[new_from].add_edge(new_edge);
212218
}
213219
new_from
214220
}
@@ -225,14 +231,12 @@ impl<'a> Graph<'a> {
225231
pub fn invert(&mut self) {
226232
let mut new_edges = vec![Edges::new(); self.edges.len()];
227233
for (from_idx, node_edges) in self.edges.iter().enumerate() {
228-
for (_, edges) in &node_edges.0 {
229-
for edge in edges {
230-
let new_edge = Edge {
231-
kind: edge.kind(),
232-
node: from_idx,
233-
};
234-
new_edges[edge.node()].add_edge(new_edge);
235-
}
234+
for edge in node_edges.all() {
235+
let new_edge = Edge {
236+
kind: edge.kind(),
237+
node: from_idx,
238+
};
239+
new_edges[edge.node()].add_edge(new_edge);
236240
}
237241
}
238242
self.edges = new_edges;

0 commit comments

Comments
 (0)