Merge WithNumNodes into DirectedGraph

This commit is contained in:
Maybe Waffle 2024-04-14 15:15:03 +00:00
parent 029cb1b13b
commit 398da593a5
13 changed files with 33 additions and 52 deletions

View File

@ -216,9 +216,7 @@ fn next(&mut self) -> Option<Self::Item> {
impl<'s, 'tcx, D: ConstraintGraphDirection> graph::DirectedGraph for RegionGraph<'s, 'tcx, D> { impl<'s, 'tcx, D: ConstraintGraphDirection> graph::DirectedGraph for RegionGraph<'s, 'tcx, D> {
type Node = RegionVid; type Node = RegionVid;
}
impl<'s, 'tcx, D: ConstraintGraphDirection> graph::WithNumNodes for RegionGraph<'s, 'tcx, D> {
fn num_nodes(&self) -> usize { fn num_nodes(&self) -> usize {
self.constraint_graph.first_constraints.len() self.constraint_graph.first_constraints.len()
} }

View File

@ -1,4 +1,4 @@
use super::{DirectedGraph, WithNumNodes, WithStartNode, WithSuccessors}; use super::{DirectedGraph, WithStartNode, WithSuccessors};
use rustc_index::bit_set::BitSet; use rustc_index::bit_set::BitSet;
use rustc_index::{IndexSlice, IndexVec}; use rustc_index::{IndexSlice, IndexVec};
use std::ops::ControlFlow; use std::ops::ControlFlow;
@ -6,14 +6,14 @@
#[cfg(test)] #[cfg(test)]
mod tests; mod tests;
pub fn post_order_from<G: DirectedGraph + WithSuccessors + WithNumNodes>( pub fn post_order_from<G: DirectedGraph + WithSuccessors>(
graph: &G, graph: &G,
start_node: G::Node, start_node: G::Node,
) -> Vec<G::Node> { ) -> Vec<G::Node> {
post_order_from_to(graph, start_node, None) post_order_from_to(graph, start_node, None)
} }
pub fn post_order_from_to<G: DirectedGraph + WithSuccessors + WithNumNodes>( pub fn post_order_from_to<G: DirectedGraph + WithSuccessors>(
graph: &G, graph: &G,
start_node: G::Node, start_node: G::Node,
end_node: Option<G::Node>, end_node: Option<G::Node>,
@ -27,7 +27,7 @@ pub fn post_order_from_to<G: DirectedGraph + WithSuccessors + WithNumNodes>(
result result
} }
fn post_order_walk<G: DirectedGraph + WithSuccessors + WithNumNodes>( fn post_order_walk<G: DirectedGraph + WithSuccessors>(
graph: &G, graph: &G,
node: G::Node, node: G::Node,
result: &mut Vec<G::Node>, result: &mut Vec<G::Node>,
@ -60,7 +60,7 @@ struct PostOrderFrame<Node, Iter> {
} }
} }
pub fn reverse_post_order<G: DirectedGraph + WithSuccessors + WithNumNodes>( pub fn reverse_post_order<G: DirectedGraph + WithSuccessors>(
graph: &G, graph: &G,
start_node: G::Node, start_node: G::Node,
) -> Vec<G::Node> { ) -> Vec<G::Node> {
@ -72,7 +72,7 @@ pub fn reverse_post_order<G: DirectedGraph + WithSuccessors + WithNumNodes>(
/// A "depth-first search" iterator for a directed graph. /// A "depth-first search" iterator for a directed graph.
pub struct DepthFirstSearch<'graph, G> pub struct DepthFirstSearch<'graph, G>
where where
G: ?Sized + DirectedGraph + WithNumNodes + WithSuccessors, G: ?Sized + DirectedGraph + WithSuccessors,
{ {
graph: &'graph G, graph: &'graph G,
stack: Vec<G::Node>, stack: Vec<G::Node>,
@ -81,7 +81,7 @@ pub struct DepthFirstSearch<'graph, G>
impl<'graph, G> DepthFirstSearch<'graph, G> impl<'graph, G> DepthFirstSearch<'graph, G>
where where
G: ?Sized + DirectedGraph + WithNumNodes + WithSuccessors, G: ?Sized + DirectedGraph + WithSuccessors,
{ {
pub fn new(graph: &'graph G) -> Self { pub fn new(graph: &'graph G) -> Self {
Self { graph, stack: vec![], visited: BitSet::new_empty(graph.num_nodes()) } Self { graph, stack: vec![], visited: BitSet::new_empty(graph.num_nodes()) }
@ -127,7 +127,7 @@ pub fn visited(&self, node: G::Node) -> bool {
impl<G> std::fmt::Debug for DepthFirstSearch<'_, G> impl<G> std::fmt::Debug for DepthFirstSearch<'_, G>
where where
G: ?Sized + DirectedGraph + WithNumNodes + WithSuccessors, G: ?Sized + DirectedGraph + WithSuccessors,
{ {
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut f = fmt.debug_set(); let mut f = fmt.debug_set();
@ -140,7 +140,7 @@ fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
impl<G> Iterator for DepthFirstSearch<'_, G> impl<G> Iterator for DepthFirstSearch<'_, G>
where where
G: ?Sized + DirectedGraph + WithNumNodes + WithSuccessors, G: ?Sized + DirectedGraph + WithSuccessors,
{ {
type Item = G::Node; type Item = G::Node;
@ -201,7 +201,7 @@ struct Event<N> {
/// [CLR]: https://en.wikipedia.org/wiki/Introduction_to_Algorithms /// [CLR]: https://en.wikipedia.org/wiki/Introduction_to_Algorithms
pub struct TriColorDepthFirstSearch<'graph, G> pub struct TriColorDepthFirstSearch<'graph, G>
where where
G: ?Sized + DirectedGraph + WithNumNodes + WithSuccessors, G: ?Sized + DirectedGraph + WithSuccessors,
{ {
graph: &'graph G, graph: &'graph G,
stack: Vec<Event<G::Node>>, stack: Vec<Event<G::Node>>,
@ -211,7 +211,7 @@ pub struct TriColorDepthFirstSearch<'graph, G>
impl<'graph, G> TriColorDepthFirstSearch<'graph, G> impl<'graph, G> TriColorDepthFirstSearch<'graph, G>
where where
G: ?Sized + DirectedGraph + WithNumNodes + WithSuccessors, G: ?Sized + DirectedGraph + WithSuccessors,
{ {
pub fn new(graph: &'graph G) -> Self { pub fn new(graph: &'graph G) -> Self {
TriColorDepthFirstSearch { TriColorDepthFirstSearch {
@ -278,7 +278,7 @@ pub fn run_from<V>(mut self, root: G::Node, visitor: &mut V) -> Option<V::BreakV
impl<G> TriColorDepthFirstSearch<'_, G> impl<G> TriColorDepthFirstSearch<'_, G>
where where
G: ?Sized + DirectedGraph + WithNumNodes + WithSuccessors + WithStartNode, G: ?Sized + DirectedGraph + WithSuccessors + WithStartNode,
{ {
/// Performs a depth-first search, starting from `G::start_node()`. /// Performs a depth-first search, starting from `G::start_node()`.
/// ///

View File

@ -12,9 +12,7 @@
pub trait DirectedGraph { pub trait DirectedGraph {
type Node: Idx; type Node: Idx;
}
pub trait WithNumNodes: DirectedGraph {
fn num_nodes(&self) -> usize; fn num_nodes(&self) -> usize;
} }
@ -28,10 +26,7 @@ pub trait WithSuccessors: DirectedGraph
{ {
fn successors(&self, node: Self::Node) -> <Self as GraphSuccessors<'_>>::Iter; fn successors(&self, node: Self::Node) -> <Self as GraphSuccessors<'_>>::Iter;
fn depth_first_search(&self, from: Self::Node) -> iterate::DepthFirstSearch<'_, Self> fn depth_first_search(&self, from: Self::Node) -> iterate::DepthFirstSearch<'_, Self> {
where
Self: WithNumNodes,
{
iterate::DepthFirstSearch::new(self).with_start_node(from) iterate::DepthFirstSearch::new(self).with_start_node(from)
} }
} }
@ -60,20 +55,20 @@ pub trait WithStartNode: DirectedGraph {
} }
pub trait ControlFlowGraph: pub trait ControlFlowGraph:
DirectedGraph + WithStartNode + WithPredecessors + WithSuccessors + WithNumNodes DirectedGraph + WithStartNode + WithPredecessors + WithSuccessors
{ {
// convenient trait // convenient trait
} }
impl<T> ControlFlowGraph for T where impl<T> ControlFlowGraph for T where
T: DirectedGraph + WithStartNode + WithPredecessors + WithSuccessors + WithNumNodes T: DirectedGraph + WithStartNode + WithPredecessors + WithSuccessors
{ {
} }
/// Returns `true` if the graph has a cycle that is reachable from the start node. /// Returns `true` if the graph has a cycle that is reachable from the start node.
pub fn is_cyclic<G>(graph: &G) -> bool pub fn is_cyclic<G>(graph: &G) -> bool
where where
G: ?Sized + DirectedGraph + WithStartNode + WithSuccessors + WithNumNodes, G: ?Sized + DirectedGraph + WithStartNode + WithSuccessors,
{ {
iterate::TriColorDepthFirstSearch::new(graph) iterate::TriColorDepthFirstSearch::new(graph)
.run_from_start(&mut iterate::CycleDetector) .run_from_start(&mut iterate::CycleDetector)

View File

@ -2,9 +2,7 @@
impl<'graph, G: DirectedGraph> DirectedGraph for &'graph G { impl<'graph, G: DirectedGraph> DirectedGraph for &'graph G {
type Node = G::Node; type Node = G::Node;
}
impl<'graph, G: WithNumNodes> WithNumNodes for &'graph G {
fn num_nodes(&self) -> usize { fn num_nodes(&self) -> usize {
(**self).num_nodes() (**self).num_nodes()
} }

View File

@ -7,7 +7,7 @@
use crate::fx::FxHashSet; use crate::fx::FxHashSet;
use crate::graph::vec_graph::VecGraph; use crate::graph::vec_graph::VecGraph;
use crate::graph::{DirectedGraph, GraphSuccessors, WithNumEdges, WithNumNodes, WithSuccessors}; use crate::graph::{DirectedGraph, GraphSuccessors, WithNumEdges, WithSuccessors};
use rustc_index::{Idx, IndexSlice, IndexVec}; use rustc_index::{Idx, IndexSlice, IndexVec};
use std::ops::Range; use std::ops::Range;
@ -39,7 +39,7 @@ pub struct SccData<S: Idx> {
} }
impl<N: Idx, S: Idx + Ord> Sccs<N, S> { impl<N: Idx, S: Idx + Ord> Sccs<N, S> {
pub fn new(graph: &(impl DirectedGraph<Node = N> + WithNumNodes + WithSuccessors)) -> Self { pub fn new(graph: &(impl DirectedGraph<Node = N> + WithSuccessors)) -> Self {
SccsConstruction::construct(graph) SccsConstruction::construct(graph)
} }
@ -89,17 +89,15 @@ pub fn reverse(&self) -> VecGraph<S> {
} }
} }
impl<N: Idx, S: Idx> DirectedGraph for Sccs<N, S> { impl<N: Idx, S: Idx + Ord> DirectedGraph for Sccs<N, S> {
type Node = S; type Node = S;
}
impl<N: Idx, S: Idx + Ord> WithNumNodes for Sccs<N, S> {
fn num_nodes(&self) -> usize { fn num_nodes(&self) -> usize {
self.num_sccs() self.num_sccs()
} }
} }
impl<N: Idx, S: Idx> WithNumEdges for Sccs<N, S> { impl<N: Idx, S: Idx + Ord> WithNumEdges for Sccs<N, S> {
fn num_edges(&self) -> usize { fn num_edges(&self) -> usize {
self.scc_data.all_successors.len() self.scc_data.all_successors.len()
} }
@ -158,7 +156,7 @@ fn create_scc(&mut self, successors: impl IntoIterator<Item = S>) -> S {
} }
} }
struct SccsConstruction<'c, G: DirectedGraph + WithNumNodes + WithSuccessors, S: Idx> { struct SccsConstruction<'c, G: DirectedGraph + WithSuccessors, S: Idx> {
graph: &'c G, graph: &'c G,
/// The state of each node; used during walk to record the stack /// The state of each node; used during walk to record the stack
@ -218,7 +216,7 @@ enum WalkReturn<S> {
impl<'c, G, S> SccsConstruction<'c, G, S> impl<'c, G, S> SccsConstruction<'c, G, S>
where where
G: DirectedGraph + WithNumNodes + WithSuccessors, G: DirectedGraph + WithSuccessors,
S: Idx, S: Idx,
{ {
/// Identifies SCCs in the graph `G` and computes the resulting /// Identifies SCCs in the graph `G` and computes the resulting

View File

@ -36,6 +36,10 @@ pub fn new(start_node: usize, edges: &[(usize, usize)]) -> Self {
impl DirectedGraph for TestGraph { impl DirectedGraph for TestGraph {
type Node = usize; type Node = usize;
fn num_nodes(&self) -> usize {
self.num_nodes
}
} }
impl WithStartNode for TestGraph { impl WithStartNode for TestGraph {
@ -44,12 +48,6 @@ fn start_node(&self) -> usize {
} }
} }
impl WithNumNodes for TestGraph {
fn num_nodes(&self) -> usize {
self.num_nodes
}
}
impl WithPredecessors for TestGraph { impl WithPredecessors for TestGraph {
fn predecessors(&self, node: usize) -> <Self as GraphPredecessors<'_>>::Iter { fn predecessors(&self, node: usize) -> <Self as GraphPredecessors<'_>>::Iter {
self.predecessors[&node].iter().cloned() self.predecessors[&node].iter().cloned()

View File

@ -1,4 +1,4 @@
use crate::graph::{DirectedGraph, GraphSuccessors, WithNumEdges, WithNumNodes, WithSuccessors}; use crate::graph::{DirectedGraph, GraphSuccessors, WithNumEdges, WithSuccessors};
use rustc_index::{Idx, IndexVec}; use rustc_index::{Idx, IndexVec};
#[cfg(test)] #[cfg(test)]
@ -80,9 +80,7 @@ pub fn successors(&self, source: N) -> &[N] {
impl<N: Idx> DirectedGraph for VecGraph<N> { impl<N: Idx> DirectedGraph for VecGraph<N> {
type Node = N; type Node = N;
}
impl<N: Idx> WithNumNodes for VecGraph<N> {
fn num_nodes(&self) -> usize { fn num_nodes(&self) -> usize {
self.node_starts.len() - 1 self.node_starts.len() - 1
} }

View File

@ -141,9 +141,7 @@ fn deref(&self) -> &IndexSlice<BasicBlock, BasicBlockData<'tcx>> {
impl<'tcx> graph::DirectedGraph for BasicBlocks<'tcx> { impl<'tcx> graph::DirectedGraph for BasicBlocks<'tcx> {
type Node = BasicBlock; type Node = BasicBlock;
}
impl<'tcx> graph::WithNumNodes for BasicBlocks<'tcx> {
#[inline] #[inline]
fn num_nodes(&self) -> usize { fn num_nodes(&self) -> usize {
self.basic_blocks.len() self.basic_blocks.len()

View File

@ -5,7 +5,7 @@
pub struct GraphvizWriter< pub struct GraphvizWriter<
'a, 'a,
G: graph::DirectedGraph + graph::WithSuccessors + graph::WithStartNode + graph::WithNumNodes, G: graph::DirectedGraph + graph::WithSuccessors + graph::WithStartNode,
NodeContentFn: Fn(<G as graph::DirectedGraph>::Node) -> Vec<String>, NodeContentFn: Fn(<G as graph::DirectedGraph>::Node) -> Vec<String>,
EdgeLabelsFn: Fn(<G as graph::DirectedGraph>::Node) -> Vec<String>, EdgeLabelsFn: Fn(<G as graph::DirectedGraph>::Node) -> Vec<String>,
> { > {
@ -19,7 +19,7 @@ pub struct GraphvizWriter<
impl< impl<
'a, 'a,
G: graph::DirectedGraph + graph::WithSuccessors + graph::WithStartNode + graph::WithNumNodes, G: graph::DirectedGraph + graph::WithSuccessors + graph::WithStartNode,
NodeContentFn: Fn(<G as graph::DirectedGraph>::Node) -> Vec<String>, NodeContentFn: Fn(<G as graph::DirectedGraph>::Node) -> Vec<String>,
EdgeLabelsFn: Fn(<G as graph::DirectedGraph>::Node) -> Vec<String>, EdgeLabelsFn: Fn(<G as graph::DirectedGraph>::Node) -> Vec<String>,
> GraphvizWriter<'a, G, NodeContentFn, EdgeLabelsFn> > GraphvizWriter<'a, G, NodeContentFn, EdgeLabelsFn>

View File

@ -2,7 +2,7 @@
use rustc_data_structures::captures::Captures; use rustc_data_structures::captures::Captures;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::graph::WithNumNodes; use rustc_data_structures::graph::DirectedGraph;
use rustc_index::IndexVec; use rustc_index::IndexVec;
use rustc_middle::mir::coverage::{CounterId, CovTerm, Expression, ExpressionId, Op}; use rustc_middle::mir::coverage::{CounterId, CovTerm, Expression, ExpressionId, Op};

View File

@ -1,7 +1,7 @@
use rustc_data_structures::captures::Captures; use rustc_data_structures::captures::Captures;
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::graph::dominators::{self, Dominators}; use rustc_data_structures::graph::dominators::{self, Dominators};
use rustc_data_structures::graph::{self, GraphSuccessors, WithNumNodes, WithStartNode}; use rustc_data_structures::graph::{self, DirectedGraph, GraphSuccessors, WithStartNode};
use rustc_index::bit_set::BitSet; use rustc_index::bit_set::BitSet;
use rustc_index::IndexVec; use rustc_index::IndexVec;
use rustc_middle::mir::{self, BasicBlock, Terminator, TerminatorKind}; use rustc_middle::mir::{self, BasicBlock, Terminator, TerminatorKind};
@ -193,9 +193,7 @@ fn index_mut(&mut self, index: BasicCoverageBlock) -> &mut BasicCoverageBlockDat
impl graph::DirectedGraph for CoverageGraph { impl graph::DirectedGraph for CoverageGraph {
type Node = BasicCoverageBlock; type Node = BasicCoverageBlock;
}
impl graph::WithNumNodes for CoverageGraph {
#[inline] #[inline]
fn num_nodes(&self) -> usize { fn num_nodes(&self) -> usize {
self.bcbs.len() self.bcbs.len()

View File

@ -1,4 +1,4 @@
use rustc_data_structures::graph::WithNumNodes; use rustc_data_structures::graph::DirectedGraph;
use rustc_index::bit_set::BitSet; use rustc_index::bit_set::BitSet;
use rustc_middle::mir; use rustc_middle::mir;
use rustc_span::{BytePos, Span}; use rustc_span::{BytePos, Span};

View File

@ -28,8 +28,8 @@
use super::graph::{self, BasicCoverageBlock}; use super::graph::{self, BasicCoverageBlock};
use itertools::Itertools; use itertools::Itertools;
use rustc_data_structures::graph::WithNumNodes;
use rustc_data_structures::graph::WithSuccessors; use rustc_data_structures::graph::WithSuccessors;
use rustc_data_structures::graph::DirectedGraph;
use rustc_index::{Idx, IndexVec}; use rustc_index::{Idx, IndexVec};
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::ty; use rustc_middle::ty;