From 3e60d996a00c6151b635994820edeb43ffd12e6c Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 3 Mar 2018 10:22:07 -0500 Subject: [PATCH 1/2] Replace iterator structures with `impl Trait`. --- src/librustc_data_structures/graph/mod.rs | 102 ++++++---------------- src/librustc_data_structures/lib.rs | 1 + 2 files changed, 26 insertions(+), 77 deletions(-) diff --git a/src/librustc_data_structures/graph/mod.rs b/src/librustc_data_structures/graph/mod.rs index 56d5f5ffa3f..9ce9c738b16 100644 --- a/src/librustc_data_structures/graph/mod.rs +++ b/src/librustc_data_structures/graph/mod.rs @@ -196,27 +196,27 @@ impl Graph { // # Iterating over nodes, edges - pub fn enumerated_nodes(&self) -> EnumeratedNodes { - EnumeratedNodes { - iter: self.nodes.iter().enumerate() - } + pub fn enumerated_nodes(&self) -> impl Iterator)> { + self.nodes + .iter() + .enumerate() + .map(|(idx, n)| (NodeIndex(idx), n)) } - pub fn enumerated_edges(&self) -> EnumeratedEdges { - EnumeratedEdges { - iter: self.edges.iter().enumerate() - } + pub fn enumerated_edges(&self) -> impl Iterator)> { + self.edges + .iter() + .enumerate() + .map(|(idx, e)| (EdgeIndex(idx), e)) } - pub fn each_node<'a, F>(&'a self, mut f: F) -> bool - where F: FnMut(NodeIndex, &'a Node) -> bool + pub fn each_node<'a>(&'a self, mut f: impl FnMut(NodeIndex, &'a Node) -> bool) -> bool { //! Iterates over all edges defined in the graph. self.enumerated_nodes().all(|(node_idx, node)| f(node_idx, node)) } - pub fn each_edge<'a, F>(&'a self, mut f: F) -> bool - where F: FnMut(EdgeIndex, &'a Edge) -> bool + pub fn each_edge<'a>(&'a self, mut f: impl FnMut(EdgeIndex, &'a Edge) -> bool) -> bool { //! Iterates over all edges defined in the graph self.enumerated_edges().all(|(edge_idx, edge)| f(edge_idx, edge)) @@ -239,11 +239,17 @@ impl Graph { } } - pub fn successor_nodes(&self, source: NodeIndex) -> AdjacentTargets { + pub fn successor_nodes<'a>( + &'a self, + source: NodeIndex, + ) -> impl Iterator + 'a { self.outgoing_edges(source).targets() } - pub fn predecessor_nodes(&self, target: NodeIndex) -> AdjacentSources { + pub fn predecessor_nodes<'a>( + &'a self, + target: NodeIndex, + ) -> impl Iterator + 'a { self.incoming_edges(target).sources() } @@ -293,34 +299,6 @@ impl Graph { // # Iterators -pub struct EnumeratedNodes<'g, N> - where N: 'g, -{ - iter: ::std::iter::Enumerate<::std::slice::Iter<'g, Node>> -} - -impl<'g, N: Debug> Iterator for EnumeratedNodes<'g, N> { - type Item = (NodeIndex, &'g Node); - - fn next(&mut self) -> Option<(NodeIndex, &'g Node)> { - self.iter.next().map(|(idx, n)| (NodeIndex(idx), n)) - } -} - -pub struct EnumeratedEdges<'g, E> - where E: 'g, -{ - iter: ::std::iter::Enumerate<::std::slice::Iter<'g, Edge>> -} - -impl<'g, E: Debug> Iterator for EnumeratedEdges<'g, E> { - type Item = (EdgeIndex, &'g Edge); - - fn next(&mut self) -> Option<(EdgeIndex, &'g Edge)> { - self.iter.next().map(|(idx, e)| (EdgeIndex(idx), e)) - } -} - pub struct AdjacentEdges<'g, N, E> where N: 'g, E: 'g @@ -330,13 +308,13 @@ pub struct AdjacentEdges<'g, N, E> next: EdgeIndex, } -impl<'g, N, E> AdjacentEdges<'g, N, E> { - fn targets(self) -> AdjacentTargets<'g, N, E> { - AdjacentTargets { edges: self } +impl<'g, N: Debug, E: Debug> AdjacentEdges<'g, N, E> { + fn targets(self) -> impl Iterator + 'g { + self.into_iter().map(|(_, edge)| edge.target) } - fn sources(self) -> AdjacentSources<'g, N, E> { - AdjacentSources { edges: self } + fn sources(self) -> impl Iterator + 'g { + self.into_iter().map(|(_, edge)| edge.source) } } @@ -355,36 +333,6 @@ impl<'g, N: Debug, E: Debug> Iterator for AdjacentEdges<'g, N, E> { } } -pub struct AdjacentTargets<'g, N, E> - where N: 'g, - E: 'g -{ - edges: AdjacentEdges<'g, N, E>, -} - -impl<'g, N: Debug, E: Debug> Iterator for AdjacentTargets<'g, N, E> { - type Item = NodeIndex; - - fn next(&mut self) -> Option { - self.edges.next().map(|(_, edge)| edge.target) - } -} - -pub struct AdjacentSources<'g, N, E> - where N: 'g, - E: 'g -{ - edges: AdjacentEdges<'g, N, E>, -} - -impl<'g, N: Debug, E: Debug> Iterator for AdjacentSources<'g, N, E> { - type Item = NodeIndex; - - fn next(&mut self) -> Option { - self.edges.next().map(|(_, edge)| edge.source) - } -} - pub struct DepthFirstTraversal<'g, N, E> where N: 'g, E: 'g diff --git a/src/librustc_data_structures/lib.rs b/src/librustc_data_structures/lib.rs index 265c6485830..81246aea1b5 100644 --- a/src/librustc_data_structures/lib.rs +++ b/src/librustc_data_structures/lib.rs @@ -34,6 +34,7 @@ #![feature(underscore_lifetimes)] #![feature(macro_vis_matcher)] #![feature(allow_internal_unstable)] +#![feature(universal_impl_trait)] #![cfg_attr(unix, feature(libc))] #![cfg_attr(test, feature(test))] From 08a01825364c429675d28b326e047ce4bc56ff7f Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 3 Mar 2018 10:24:29 -0500 Subject: [PATCH 2/2] Run rustfmt on `src/librustc_data_structures/graph/mod.rs`. --- src/librustc_data_structures/graph/mod.rs | 53 +++++++++++++---------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/src/librustc_data_structures/graph/mod.rs b/src/librustc_data_structures/graph/mod.rs index 9ce9c738b16..1945b82c031 100644 --- a/src/librustc_data_structures/graph/mod.rs +++ b/src/librustc_data_structures/graph/mod.rs @@ -210,16 +210,16 @@ impl Graph { .map(|(idx, e)| (EdgeIndex(idx), e)) } - pub fn each_node<'a>(&'a self, mut f: impl FnMut(NodeIndex, &'a Node) -> bool) -> bool - { + pub fn each_node<'a>(&'a self, mut f: impl FnMut(NodeIndex, &'a Node) -> bool) -> bool { //! Iterates over all edges defined in the graph. - self.enumerated_nodes().all(|(node_idx, node)| f(node_idx, node)) + self.enumerated_nodes() + .all(|(node_idx, node)| f(node_idx, node)) } - pub fn each_edge<'a>(&'a self, mut f: impl FnMut(EdgeIndex, &'a Edge) -> bool) -> bool - { + pub fn each_edge<'a>(&'a self, mut f: impl FnMut(EdgeIndex, &'a Edge) -> bool) -> bool { //! Iterates over all edges defined in the graph - self.enumerated_edges().all(|(edge_idx, edge)| f(edge_idx, edge)) + self.enumerated_edges() + .all(|(edge_idx, edge)| f(edge_idx, edge)) } pub fn outgoing_edges(&self, source: NodeIndex) -> AdjacentEdges { @@ -253,18 +253,19 @@ impl Graph { self.incoming_edges(target).sources() } - pub fn depth_traverse<'a>(&'a self, - start: NodeIndex, - direction: Direction) - -> DepthFirstTraversal<'a, N, E> { + pub fn depth_traverse<'a>( + &'a self, + start: NodeIndex, + direction: Direction, + ) -> DepthFirstTraversal<'a, N, E> { DepthFirstTraversal::with_start_node(self, start, direction) } - pub fn nodes_in_postorder<'a>(&'a self, - direction: Direction, - entry_node: NodeIndex) - -> Vec - { + pub fn nodes_in_postorder<'a>( + &'a self, + direction: Direction, + entry_node: NodeIndex, + ) -> Vec { let mut visited = BitVector::new(self.len_nodes()); let mut stack = vec![]; let mut result = Vec::with_capacity(self.len_nodes()); @@ -274,7 +275,8 @@ impl Graph { } }; - for node in Some(entry_node).into_iter() + for node in Some(entry_node) + .into_iter() .chain(self.enumerated_nodes().map(|(node, _)| node)) { push_node(&mut stack, node); @@ -300,8 +302,9 @@ impl Graph { // # Iterators pub struct AdjacentEdges<'g, N, E> - where N: 'g, - E: 'g +where + N: 'g, + E: 'g, { graph: &'g Graph, direction: Direction, @@ -334,8 +337,9 @@ impl<'g, N: Debug, E: Debug> Iterator for AdjacentEdges<'g, N, E> { } pub struct DepthFirstTraversal<'g, N, E> - where N: 'g, - E: 'g +where + N: 'g, + E: 'g, { graph: &'g Graph, stack: Vec, @@ -344,10 +348,11 @@ pub struct DepthFirstTraversal<'g, N, E> } impl<'g, N: Debug, E: Debug> DepthFirstTraversal<'g, N, E> { - pub fn with_start_node(graph: &'g Graph, - start_node: NodeIndex, - direction: Direction) - -> Self { + pub fn with_start_node( + graph: &'g Graph, + start_node: NodeIndex, + direction: Direction, + ) -> Self { let mut visited = BitVector::new(graph.len_nodes()); visited.insert(start_node.node_id()); DepthFirstTraversal {