@@ -231,14 +231,14 @@ impl<N: Debug, E: Debug> Graph<N, E> {
231
231
232
232
// # Iterating over nodes, edges
233
233
234
- pub fn all_nodes_enumerated ( & self ) -> Nodes < N > {
235
- Nodes {
234
+ pub fn enumerated_nodes ( & self ) -> EnumeratedNodes < N > {
235
+ EnumeratedNodes {
236
236
iter : self . nodes . iter ( ) . enumerate ( )
237
237
}
238
238
}
239
239
240
- pub fn all_edges_enumerated ( & self ) -> Edges < E > {
241
- Edges {
240
+ pub fn enumerated_edges ( & self ) -> EnumeratedEdges < E > {
241
+ EnumeratedEdges {
242
242
iter : self . edges . iter ( ) . enumerate ( )
243
243
}
244
244
}
@@ -247,14 +247,14 @@ impl<N: Debug, E: Debug> Graph<N, E> {
247
247
where F : FnMut ( NodeIndex , & ' a Node < N > ) -> bool
248
248
{
249
249
//! Iterates over all edges defined in the graph.
250
- self . all_nodes_enumerated ( ) . all ( |( node_idx, node) | f ( node_idx, node) )
250
+ self . enumerated_nodes ( ) . all ( |( node_idx, node) | f ( node_idx, node) )
251
251
}
252
252
253
253
pub fn each_edge < ' a , F > ( & ' a self , mut f : F ) -> bool
254
254
where F : FnMut ( EdgeIndex , & ' a Edge < E > ) -> bool
255
255
{
256
256
//! Iterates over all edges defined in the graph
257
- self . all_edges_enumerated ( ) . all ( |( edge_idx, edge) | f ( edge_idx, edge) )
257
+ self . enumerated_edges ( ) . all ( |( edge_idx, edge) | f ( edge_idx, edge) )
258
258
}
259
259
260
260
pub fn outgoing_edges ( & self , source : NodeIndex ) -> AdjacentEdges < N , E > {
@@ -295,7 +295,7 @@ impl<N: Debug, E: Debug> Graph<N, E> {
295
295
while changed {
296
296
changed = false ;
297
297
iteration += 1 ;
298
- for ( edge_index, edge) in self . all_edges_enumerated ( ) {
298
+ for ( edge_index, edge) in self . enumerated_edges ( ) {
299
299
changed |= op ( iteration, edge_index, edge) ;
300
300
}
301
301
}
@@ -307,31 +307,60 @@ impl<N: Debug, E: Debug> Graph<N, E> {
307
307
-> DepthFirstTraversal < ' a , N , E > {
308
308
DepthFirstTraversal :: with_start_node ( self , start, direction)
309
309
}
310
+
311
+ /// Whether or not a node can be reached from itself.
312
+ pub fn is_node_cyclic ( & self , starting_node_index : NodeIndex ) -> bool {
313
+ // This is similar to depth traversal below, but we
314
+ // can't use that, because depth traversal doesn't show
315
+ // the starting node a second time.
316
+ let mut visited = BitVector :: new ( self . len_nodes ( ) ) ;
317
+ let mut stack = vec ! [ starting_node_index] ;
318
+
319
+ while let Some ( current_node_index) = stack. pop ( ) {
320
+ visited. insert ( current_node_index. 0 ) ;
321
+
322
+ // Directionality doesn't change the answer,
323
+ // so just use outgoing edges.
324
+ for ( _, edge) in self . outgoing_edges ( current_node_index) {
325
+ let target_node_index = edge. target ( ) ;
326
+
327
+ if target_node_index == starting_node_index {
328
+ return true ;
329
+ }
330
+
331
+ if !visited. contains ( target_node_index. 0 ) {
332
+ stack. push ( target_node_index) ;
333
+ }
334
+ }
335
+ }
336
+
337
+ false
338
+ }
310
339
}
311
340
312
341
// # Iterators
313
342
314
- pub struct Nodes < ' g , N >
343
+ pub struct EnumeratedNodes < ' g , N >
315
344
where N : ' g ,
316
345
{
317
346
iter : :: std:: iter:: Enumerate < :: std:: slice:: Iter < ' g , Node < N > > >
318
347
}
319
348
320
- impl < ' g , N : Debug > Iterator for Nodes < ' g , N > {
349
+ impl < ' g , N : Debug > Iterator for EnumeratedNodes < ' g , N > {
321
350
type Item = ( NodeIndex , & ' g Node < N > ) ;
322
351
323
352
fn next ( & mut self ) -> Option < ( NodeIndex , & ' g Node < N > ) > {
324
353
self . iter . next ( ) . map ( |( idx, n) | ( NodeIndex ( idx) , n) )
325
354
}
326
355
}
327
356
328
- pub struct Edges < ' g , E >
357
+ pub struct EnumeratedEdges < ' g , E >
329
358
where E : ' g ,
330
359
{
331
360
iter : :: std:: iter:: Enumerate < :: std:: slice:: Iter < ' g , Edge < E > > >
332
361
}
333
362
334
- impl < ' g , E : Debug > Iterator for Edges < ' g , E > {
363
+ impl < ' g , E : Debug > Iterator for EnumeratedEdges < ' g , E > {
335
364
type Item = ( EdgeIndex , & ' g Edge < E > ) ;
336
365
337
366
fn next ( & mut self ) -> Option < ( EdgeIndex , & ' g Edge < E > ) > {
0 commit comments