@@ -231,18 +231,30 @@ 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 {
236
+ iter : self . nodes . iter ( ) . enumerate ( )
237
+ }
238
+ }
239
+
240
+ pub fn all_edges_enumerated ( & self ) -> Edges < E > {
241
+ Edges {
242
+ iter : self . edges . iter ( ) . enumerate ( )
243
+ }
244
+ }
245
+
234
246
pub fn each_node < ' a , F > ( & ' a self , mut f : F ) -> bool
235
247
where F : FnMut ( NodeIndex , & ' a Node < N > ) -> bool
236
248
{
237
249
//! Iterates over all edges defined in the graph.
238
- self . nodes . iter ( ) . enumerate ( ) . all ( |( i , node) | f ( NodeIndex ( i ) , node) )
250
+ self . all_nodes_enumerated ( ) . all ( |( node_idx , node) | f ( node_idx , node) )
239
251
}
240
252
241
253
pub fn each_edge < ' a , F > ( & ' a self , mut f : F ) -> bool
242
254
where F : FnMut ( EdgeIndex , & ' a Edge < E > ) -> bool
243
255
{
244
256
//! Iterates over all edges defined in the graph
245
- self . edges . iter ( ) . enumerate ( ) . all ( |( i , edge) | f ( EdgeIndex ( i ) , edge) )
257
+ self . all_edges_enumerated ( ) . all ( |( edge_idx , edge) | f ( edge_idx , edge) )
246
258
}
247
259
248
260
pub fn outgoing_edges ( & self , source : NodeIndex ) -> AdjacentEdges < N , E > {
@@ -286,8 +298,8 @@ impl<N: Debug, E: Debug> Graph<N, E> {
286
298
while changed {
287
299
changed = false ;
288
300
iteration += 1 ;
289
- for ( i , edge) in self . edges . iter ( ) . enumerate ( ) {
290
- changed |= op ( iteration, EdgeIndex ( i ) , edge) ;
301
+ for ( edge_index , edge) in self . all_edges_enumerated ( ) {
302
+ changed |= op ( iteration, edge_index , edge) ;
291
303
}
292
304
}
293
305
}
@@ -302,6 +314,34 @@ impl<N: Debug, E: Debug> Graph<N, E> {
302
314
303
315
// # Iterators
304
316
317
+ pub struct Nodes < ' g , N >
318
+ where N : ' g ,
319
+ {
320
+ iter : :: std:: iter:: Enumerate < :: std:: slice:: Iter < ' g , Node < N > > >
321
+ }
322
+
323
+ impl < ' g , N : Debug > Iterator for Nodes < ' g , N > {
324
+ type Item = ( NodeIndex , & ' g Node < N > ) ;
325
+
326
+ fn next ( & mut self ) -> Option < ( NodeIndex , & ' g Node < N > ) > {
327
+ self . iter . next ( ) . map ( |( idx, n) | ( NodeIndex ( idx) , n) )
328
+ }
329
+ }
330
+
331
+ pub struct Edges < ' g , E >
332
+ where E : ' g ,
333
+ {
334
+ iter : :: std:: iter:: Enumerate < :: std:: slice:: Iter < ' g , Edge < E > > >
335
+ }
336
+
337
+ impl < ' g , E : Debug > Iterator for Edges < ' g , E > {
338
+ type Item = ( EdgeIndex , & ' g Edge < E > ) ;
339
+
340
+ fn next ( & mut self ) -> Option < ( EdgeIndex , & ' g Edge < E > ) > {
341
+ self . iter . next ( ) . map ( |( idx, e) | ( EdgeIndex ( idx) , e) )
342
+ }
343
+ }
344
+
305
345
pub struct AdjacentEdges < ' g , N , E >
306
346
where N : ' g ,
307
347
E : ' g
0 commit comments