@@ -196,30 +196,30 @@ impl<N: Debug, E: Debug> Graph<N, E> {
196
196
197
197
// # Iterating over nodes, edges
198
198
199
- pub fn enumerated_nodes ( & self ) -> EnumeratedNodes < N > {
200
- EnumeratedNodes {
201
- iter : self . nodes . iter ( ) . enumerate ( )
202
- }
199
+ pub fn enumerated_nodes ( & self ) -> impl Iterator < Item = ( NodeIndex , & Node < N > ) > {
200
+ self . nodes
201
+ . iter ( )
202
+ . enumerate ( )
203
+ . map ( |( idx, n) | ( NodeIndex ( idx) , n) )
203
204
}
204
205
205
- pub fn enumerated_edges ( & self ) -> EnumeratedEdges < E > {
206
- EnumeratedEdges {
207
- iter : self . edges . iter ( ) . enumerate ( )
208
- }
206
+ pub fn enumerated_edges ( & self ) -> impl Iterator < Item = ( EdgeIndex , & Edge < E > ) > {
207
+ self . edges
208
+ . iter ( )
209
+ . enumerate ( )
210
+ . map ( |( idx, e) | ( EdgeIndex ( idx) , e) )
209
211
}
210
212
211
- pub fn each_node < ' a , F > ( & ' a self , mut f : F ) -> bool
212
- where F : FnMut ( NodeIndex , & ' a Node < N > ) -> bool
213
- {
213
+ pub fn each_node < ' a > ( & ' a self , mut f : impl FnMut ( NodeIndex , & ' a Node < N > ) -> bool ) -> bool {
214
214
//! Iterates over all edges defined in the graph.
215
- self . enumerated_nodes ( ) . all ( |( node_idx, node) | f ( node_idx, node) )
215
+ self . enumerated_nodes ( )
216
+ . all ( |( node_idx, node) | f ( node_idx, node) )
216
217
}
217
218
218
- pub fn each_edge < ' a , F > ( & ' a self , mut f : F ) -> bool
219
- where F : FnMut ( EdgeIndex , & ' a Edge < E > ) -> bool
220
- {
219
+ pub fn each_edge < ' a > ( & ' a self , mut f : impl FnMut ( EdgeIndex , & ' a Edge < E > ) -> bool ) -> bool {
221
220
//! Iterates over all edges defined in the graph
222
- self . enumerated_edges ( ) . all ( |( edge_idx, edge) | f ( edge_idx, edge) )
221
+ self . enumerated_edges ( )
222
+ . all ( |( edge_idx, edge) | f ( edge_idx, edge) )
223
223
}
224
224
225
225
pub fn outgoing_edges ( & self , source : NodeIndex ) -> AdjacentEdges < N , E > {
@@ -239,26 +239,33 @@ impl<N: Debug, E: Debug> Graph<N, E> {
239
239
}
240
240
}
241
241
242
- pub fn successor_nodes ( & self , source : NodeIndex ) -> AdjacentTargets < N , E > {
242
+ pub fn successor_nodes < ' a > (
243
+ & ' a self ,
244
+ source : NodeIndex ,
245
+ ) -> impl Iterator < Item = NodeIndex > + ' a {
243
246
self . outgoing_edges ( source) . targets ( )
244
247
}
245
248
246
- pub fn predecessor_nodes ( & self , target : NodeIndex ) -> AdjacentSources < N , E > {
249
+ pub fn predecessor_nodes < ' a > (
250
+ & ' a self ,
251
+ target : NodeIndex ,
252
+ ) -> impl Iterator < Item = NodeIndex > + ' a {
247
253
self . incoming_edges ( target) . sources ( )
248
254
}
249
255
250
- pub fn depth_traverse < ' a > ( & ' a self ,
251
- start : NodeIndex ,
252
- direction : Direction )
253
- -> DepthFirstTraversal < ' a , N , E > {
256
+ pub fn depth_traverse < ' a > (
257
+ & ' a self ,
258
+ start : NodeIndex ,
259
+ direction : Direction ,
260
+ ) -> DepthFirstTraversal < ' a , N , E > {
254
261
DepthFirstTraversal :: with_start_node ( self , start, direction)
255
262
}
256
263
257
- pub fn nodes_in_postorder < ' a > ( & ' a self ,
258
- direction : Direction ,
259
- entry_node : NodeIndex )
260
- -> Vec < NodeIndex >
261
- {
264
+ pub fn nodes_in_postorder < ' a > (
265
+ & ' a self ,
266
+ direction : Direction ,
267
+ entry_node : NodeIndex ,
268
+ ) -> Vec < NodeIndex > {
262
269
let mut visited = BitVector :: new ( self . len_nodes ( ) ) ;
263
270
let mut stack = vec ! [ ] ;
264
271
let mut result = Vec :: with_capacity ( self . len_nodes ( ) ) ;
@@ -268,7 +275,8 @@ impl<N: Debug, E: Debug> Graph<N, E> {
268
275
}
269
276
} ;
270
277
271
- for node in Some ( entry_node) . into_iter ( )
278
+ for node in Some ( entry_node)
279
+ . into_iter ( )
272
280
. chain ( self . enumerated_nodes ( ) . map ( |( node, _) | node) )
273
281
{
274
282
push_node ( & mut stack, node) ;
@@ -293,50 +301,23 @@ impl<N: Debug, E: Debug> Graph<N, E> {
293
301
294
302
// # Iterators
295
303
296
- pub struct EnumeratedNodes < ' g , N >
297
- where N : ' g ,
298
- {
299
- iter : :: std:: iter:: Enumerate < :: std:: slice:: Iter < ' g , Node < N > > >
300
- }
301
-
302
- impl < ' g , N : Debug > Iterator for EnumeratedNodes < ' g , N > {
303
- type Item = ( NodeIndex , & ' g Node < N > ) ;
304
-
305
- fn next ( & mut self ) -> Option < ( NodeIndex , & ' g Node < N > ) > {
306
- self . iter . next ( ) . map ( |( idx, n) | ( NodeIndex ( idx) , n) )
307
- }
308
- }
309
-
310
- pub struct EnumeratedEdges < ' g , E >
311
- where E : ' g ,
312
- {
313
- iter : :: std:: iter:: Enumerate < :: std:: slice:: Iter < ' g , Edge < E > > >
314
- }
315
-
316
- impl < ' g , E : Debug > Iterator for EnumeratedEdges < ' g , E > {
317
- type Item = ( EdgeIndex , & ' g Edge < E > ) ;
318
-
319
- fn next ( & mut self ) -> Option < ( EdgeIndex , & ' g Edge < E > ) > {
320
- self . iter . next ( ) . map ( |( idx, e) | ( EdgeIndex ( idx) , e) )
321
- }
322
- }
323
-
324
304
pub struct AdjacentEdges < ' g , N , E >
325
- where N : ' g ,
326
- E : ' g
305
+ where
306
+ N : ' g ,
307
+ E : ' g ,
327
308
{
328
309
graph : & ' g Graph < N , E > ,
329
310
direction : Direction ,
330
311
next : EdgeIndex ,
331
312
}
332
313
333
- impl < ' g , N , E > AdjacentEdges < ' g , N , E > {
334
- fn targets ( self ) -> AdjacentTargets < ' g , N , E > {
335
- AdjacentTargets { edges : self }
314
+ impl < ' g , N : Debug , E : Debug > AdjacentEdges < ' g , N , E > {
315
+ fn targets ( self ) -> impl Iterator < Item = NodeIndex > + ' g {
316
+ self . into_iter ( ) . map ( | ( _ , edge ) | edge . target )
336
317
}
337
318
338
- fn sources ( self ) -> AdjacentSources < ' g , N , E > {
339
- AdjacentSources { edges : self }
319
+ fn sources ( self ) -> impl Iterator < Item = NodeIndex > + ' g {
320
+ self . into_iter ( ) . map ( | ( _ , edge ) | edge . source )
340
321
}
341
322
}
342
323
@@ -355,39 +336,10 @@ impl<'g, N: Debug, E: Debug> Iterator for AdjacentEdges<'g, N, E> {
355
336
}
356
337
}
357
338
358
- pub struct AdjacentTargets < ' g , N , E >
359
- where N : ' g ,
360
- E : ' g
361
- {
362
- edges : AdjacentEdges < ' g , N , E > ,
363
- }
364
-
365
- impl < ' g , N : Debug , E : Debug > Iterator for AdjacentTargets < ' g , N , E > {
366
- type Item = NodeIndex ;
367
-
368
- fn next ( & mut self ) -> Option < NodeIndex > {
369
- self . edges . next ( ) . map ( |( _, edge) | edge. target )
370
- }
371
- }
372
-
373
- pub struct AdjacentSources < ' g , N , E >
374
- where N : ' g ,
375
- E : ' g
376
- {
377
- edges : AdjacentEdges < ' g , N , E > ,
378
- }
379
-
380
- impl < ' g , N : Debug , E : Debug > Iterator for AdjacentSources < ' g , N , E > {
381
- type Item = NodeIndex ;
382
-
383
- fn next ( & mut self ) -> Option < NodeIndex > {
384
- self . edges . next ( ) . map ( |( _, edge) | edge. source )
385
- }
386
- }
387
-
388
339
pub struct DepthFirstTraversal < ' g , N , E >
389
- where N : ' g ,
390
- E : ' g
340
+ where
341
+ N : ' g ,
342
+ E : ' g ,
391
343
{
392
344
graph : & ' g Graph < N , E > ,
393
345
stack : Vec < NodeIndex > ,
@@ -396,10 +348,11 @@ pub struct DepthFirstTraversal<'g, N, E>
396
348
}
397
349
398
350
impl < ' g , N : Debug , E : Debug > DepthFirstTraversal < ' g , N , E > {
399
- pub fn with_start_node ( graph : & ' g Graph < N , E > ,
400
- start_node : NodeIndex ,
401
- direction : Direction )
402
- -> Self {
351
+ pub fn with_start_node (
352
+ graph : & ' g Graph < N , E > ,
353
+ start_node : NodeIndex ,
354
+ direction : Direction ,
355
+ ) -> Self {
403
356
let mut visited = BitVector :: new ( graph. len_nodes ( ) ) ;
404
357
visited. insert ( start_node. node_id ( ) ) ;
405
358
DepthFirstTraversal {
0 commit comments