| use petgraph_core::deprecated::visit::{Dfs, GraphBase, GraphRef, VisitMap, Visitable}; |
| |
| type DfsSpaceType<G> = DfsSpace<<G as GraphBase>::NodeId, <G as Visitable>::Map>; |
| |
| /// Workspace for a graph traversal. |
| #[derive(Clone, Debug)] |
| pub struct DfsSpace<N, VM> { |
| dfs: Dfs<N, VM>, |
| } |
| |
| impl<N, VM> DfsSpace<N, VM> |
| where |
| N: Copy + PartialEq, |
| VM: VisitMap<N>, |
| { |
| pub fn new<G>(g: G) -> Self |
| where |
| G: GraphRef + Visitable<NodeId = N, Map = VM>, |
| { |
| DfsSpace { dfs: Dfs::empty(g) } |
| } |
| } |
| |
| impl<N, VM> Default for DfsSpace<N, VM> |
| where |
| VM: VisitMap<N> + Default, |
| { |
| fn default() -> Self { |
| DfsSpace { |
| dfs: Dfs { |
| stack: Default::default(), |
| discovered: Default::default(), |
| }, |
| } |
| } |
| } |
| |
| /// Create a Dfs if it's needed |
| pub(crate) fn with_dfs<G, F, R>(g: G, space: Option<&mut DfsSpaceType<G>>, f: F) -> R |
| where |
| G: GraphRef + Visitable, |
| F: FnOnce(&mut Dfs<G::NodeId, G::Map>) -> R, |
| { |
| let mut local_visitor; |
| let dfs = if let Some(v) = space { |
| &mut v.dfs |
| } else { |
| local_visitor = Dfs::empty(g); |
| &mut local_visitor |
| }; |
| f(dfs) |
| } |