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:
Nicholas Nethercote 2018-06-07 16:19:52 +10:00
parent 6151bab8e1
commit 70d22fa051
1 changed files with 9 additions and 15 deletions

View File

@ -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![],
}
}