@@ -231,18 +231,30 @@ impl<N: Debug, E: Debug> Graph<N, E> {
231231
232232 // # Iterating over nodes, edges
233233
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+
234246 pub fn each_node < ' a , F > ( & ' a self , mut f : F ) -> bool
235247 where F : FnMut ( NodeIndex , & ' a Node < N > ) -> bool
236248 {
237249 //! 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) )
239251 }
240252
241253 pub fn each_edge < ' a , F > ( & ' a self , mut f : F ) -> bool
242254 where F : FnMut ( EdgeIndex , & ' a Edge < E > ) -> bool
243255 {
244256 //! 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) )
246258 }
247259
248260 pub fn outgoing_edges ( & self , source : NodeIndex ) -> AdjacentEdges < N , E > {
@@ -286,8 +298,8 @@ impl<N: Debug, E: Debug> Graph<N, E> {
286298 while changed {
287299 changed = false ;
288300 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) ;
291303 }
292304 }
293305 }
@@ -302,6 +314,34 @@ impl<N: Debug, E: Debug> Graph<N, E> {
302314
303315// # Iterators
304316
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+
305345pub struct AdjacentEdges < ' g , N , E >
306346 where N : ' g ,
307347 E : ' g
0 commit comments