rustc VecGraph
: require the index type to implement Ord
This commit is contained in:
parent
a4a8c241c7
commit
e6ff0bac1e
2 changed files with 9 additions and 6 deletions
|
@ -9,6 +9,7 @@ use crate::fx::FxHashSet;
|
|||
use crate::graph::vec_graph::VecGraph;
|
||||
use crate::graph::{DirectedGraph, GraphSuccessors, WithNumEdges, WithNumNodes, WithSuccessors};
|
||||
use rustc_index::vec::{Idx, IndexVec};
|
||||
use std::cmp::Ord;
|
||||
use std::ops::Range;
|
||||
|
||||
#[cfg(test)]
|
||||
|
@ -38,7 +39,7 @@ struct SccData<S: Idx> {
|
|||
all_successors: Vec<S>,
|
||||
}
|
||||
|
||||
impl<N: Idx, S: Idx> Sccs<N, S> {
|
||||
impl<N: Idx, S: Idx + Ord> Sccs<N, S> {
|
||||
pub fn new(graph: &(impl DirectedGraph<Node = N> + WithNumNodes + WithSuccessors)) -> Self {
|
||||
SccsConstruction::construct(graph)
|
||||
}
|
||||
|
@ -85,7 +86,7 @@ impl<N: Idx, S: Idx> DirectedGraph for Sccs<N, S> {
|
|||
type Node = S;
|
||||
}
|
||||
|
||||
impl<N: Idx, S: Idx> WithNumNodes for Sccs<N, S> {
|
||||
impl<N: Idx, S: Idx + Ord> WithNumNodes for Sccs<N, S> {
|
||||
fn num_nodes(&self) -> usize {
|
||||
self.num_sccs()
|
||||
}
|
||||
|
@ -103,7 +104,7 @@ impl<'graph, N: Idx, S: Idx> GraphSuccessors<'graph> for Sccs<N, S> {
|
|||
type Iter = std::iter::Cloned<std::slice::Iter<'graph, S>>;
|
||||
}
|
||||
|
||||
impl<N: Idx, S: Idx> WithSuccessors for Sccs<N, S> {
|
||||
impl<N: Idx, S: Idx + Ord> WithSuccessors for Sccs<N, S> {
|
||||
fn successors(&self, node: S) -> <Self as GraphSuccessors<'_>>::Iter {
|
||||
self.successors(node).iter().cloned()
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use std::cmp::Ord;
|
||||
|
||||
use crate::graph::{DirectedGraph, GraphSuccessors, WithNumEdges, WithNumNodes, WithSuccessors};
|
||||
use rustc_index::vec::{Idx, IndexVec};
|
||||
|
||||
|
@ -17,10 +19,10 @@ pub struct VecGraph<N: Idx> {
|
|||
edge_targets: Vec<N>,
|
||||
}
|
||||
|
||||
impl<N: Idx> VecGraph<N> {
|
||||
impl<N: Idx + Ord> VecGraph<N> {
|
||||
pub fn new(num_nodes: usize, mut edge_pairs: Vec<(N, N)>) -> Self {
|
||||
// Sort the edges by the source -- this is important.
|
||||
edge_pairs.sort_by_key(|&edge_pairs| (edge_pairs.0.index(), edge_pairs.1.index()));
|
||||
edge_pairs.sort();
|
||||
|
||||
let num_edges = edge_pairs.len();
|
||||
|
||||
|
@ -100,7 +102,7 @@ impl<'graph, N: Idx> GraphSuccessors<'graph> for VecGraph<N> {
|
|||
type Iter = std::iter::Cloned<std::slice::Iter<'graph, N>>;
|
||||
}
|
||||
|
||||
impl<N: Idx> WithSuccessors for VecGraph<N> {
|
||||
impl<N: Idx + Ord> WithSuccessors for VecGraph<N> {
|
||||
fn successors(&self, node: N) -> <Self as GraphSuccessors<'_>>::Iter {
|
||||
self.successors(node).iter().cloned()
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue