Improve `Node::{parent,dependents}` interplay.
This patch: - Reorders things a bit so that `parent` is always handled before `dependents`. - Uses iterator chaining to avoid some code duplication.
This commit is contained in:
parent
6151bab8e1
commit
70d22fa051
|
@ -91,13 +91,14 @@ struct Node<O> {
|
|||
obligation: O,
|
||||
state: Cell<NodeState>,
|
||||
|
||||
/// The parent of a node - the original obligation of
|
||||
/// which it is a subobligation. Except for error reporting,
|
||||
/// it is just like any member of `dependents`.
|
||||
parent: Option<NodeIndex>,
|
||||
|
||||
/// Obligations that depend on this obligation for their
|
||||
/// completion. They must all be in a non-pending state.
|
||||
dependents: Vec<NodeIndex>,
|
||||
/// The parent of a node - the original obligation of
|
||||
/// which it is a subobligation. Except for error reporting,
|
||||
/// this is just another member of `dependents`.
|
||||
parent: Option<NodeIndex>,
|
||||
}
|
||||
|
||||
/// The state of one node in some tree within the forest. This
|
||||
|
@ -383,10 +384,7 @@ impl<O: ForestObligation> ObligationForest<O> {
|
|||
NodeState::Success => {
|
||||
node.state.set(NodeState::OnDfsStack);
|
||||
stack.push(index);
|
||||
if let Some(parent) = node.parent {
|
||||
self.find_cycles_from_node(stack, processor, parent.get());
|
||||
}
|
||||
for dependent in &node.dependents {
|
||||
for dependent in node.parent.iter().chain(node.dependents.iter()) {
|
||||
self.find_cycles_from_node(stack, processor, dependent.get());
|
||||
}
|
||||
stack.pop();
|
||||
|
@ -430,7 +428,7 @@ impl<O: ForestObligation> ObligationForest<O> {
|
|||
}
|
||||
|
||||
error_stack.extend(
|
||||
node.dependents.iter().cloned().chain(node.parent).map(|x| x.get())
|
||||
node.parent.iter().chain(node.dependents.iter()).map(|x| x.get())
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -440,11 +438,7 @@ impl<O: ForestObligation> ObligationForest<O> {
|
|||
|
||||
#[inline]
|
||||
fn mark_neighbors_as_waiting_from(&self, node: &Node<O>) {
|
||||
if let Some(parent) = node.parent {
|
||||
self.mark_as_waiting_from(&self.nodes[parent.get()]);
|
||||
}
|
||||
|
||||
for dependent in &node.dependents {
|
||||
for dependent in node.parent.iter().chain(node.dependents.iter()) {
|
||||
self.mark_as_waiting_from(&self.nodes[dependent.get()]);
|
||||
}
|
||||
}
|
||||
|
@ -591,8 +585,8 @@ impl<O> Node<O> {
|
|||
fn new(parent: Option<NodeIndex>, obligation: O) -> Node<O> {
|
||||
Node {
|
||||
obligation,
|
||||
parent,
|
||||
state: Cell::new(NodeState::Pending),
|
||||
parent,
|
||||
dependents: vec![],
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue