implement the graph traits for SCC

This commit is contained in:
Niko Matsakis 2019-06-11 08:48:40 -04:00
parent 07ee532031
commit 4e85665e08

View file

@ -4,7 +4,7 @@
//! O(n) time.
use crate::fx::FxHashSet;
use crate::graph::{DirectedGraph, WithNumNodes, WithSuccessors};
use crate::graph::{DirectedGraph, WithNumNodes, WithSuccessors, GraphSuccessors};
use crate::indexed_vec::{Idx, IndexVec};
use std::ops::Range;
@ -60,6 +60,31 @@ impl<N: Idx, S: Idx> Sccs<N, S> {
}
}
impl<N: Idx, S: Idx> DirectedGraph for Sccs<N, S> {
type Node = S;
}
impl<N: Idx, S: Idx> WithNumNodes for Sccs<N, S> {
fn num_nodes(&self) -> usize {
self.num_sccs()
}
}
impl<N: Idx, S: Idx> GraphSuccessors<'graph> for Sccs<N, S> {
type Item = S;
type Iter = std::iter::Cloned<std::slice::Iter<'graph, S>>;
}
impl<N: Idx, S: Idx> WithSuccessors for Sccs<N, S> {
fn successors<'graph>(
&'graph self,
node: S
) -> <Self as GraphSuccessors<'graph>>::Iter {
self.successors(node).iter().cloned()
}
}
impl<S: Idx> SccData<S> {
/// Number of SCCs,
fn len(&self) -> usize {