Skip to content

Commit fcf0262

Browse files
committed
Added general iterators for graph nodes and edges
Also used those general iterators in other methods.
1 parent 3d1ecc5 commit fcf0262

File tree

1 file changed

+44
-4
lines changed
  • src/librustc_data_structures/graph

1 file changed

+44
-4
lines changed

src/librustc_data_structures/graph/mod.rs

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
305345
pub struct AdjacentEdges<'g, N, E>
306346
where N: 'g,
307347
E: 'g

0 commit comments

Comments
 (0)