From c6e027207c64bd6da431982a12217c29556d32bd Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Thu, 6 Apr 2017 13:58:48 -0700 Subject: [PATCH] Add an iterators module with extra Iterator methods. Start with an adjacent_pairs() iterator adapter. --- lib/cretonne/src/iterators.rs | 90 +++++++++++++++++++++++++++++++++++ lib/cretonne/src/lib.rs | 3 +- 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 lib/cretonne/src/iterators.rs diff --git a/lib/cretonne/src/iterators.rs b/lib/cretonne/src/iterators.rs new file mode 100644 index 0000000000..3bdc3cc1cb --- /dev/null +++ b/lib/cretonne/src/iterators.rs @@ -0,0 +1,90 @@ +//! Iterator utilities. + +/// Extra methods for iterators. +pub trait IteratorExtras: Iterator { + /// Create an iterator that produces adjacent pairs of elements from the iterator. + fn adjacent_pairs(mut self) -> AdjacentPairs + where Self: Sized, + Self::Item: Clone + { + let elem = self.next(); + AdjacentPairs { + iter: self, + elem: elem, + } + } +} + +impl IteratorExtras for T where T: Iterator {} + +/// Adjacent pairs iterator returned by `adjacent_pairs()`. +/// +/// This wraps another iterator and produces a sequence of adjacent pairs of elements. +pub struct AdjacentPairs + where I: Iterator, + I::Item: Clone +{ + iter: I, + elem: Option, +} + +impl Iterator for AdjacentPairs + where I: Iterator, + I::Item: Clone +{ + type Item = (I::Item, I::Item); + + fn next(&mut self) -> Option { + self.elem + .take() + .and_then(|e| { + self.elem = self.iter.next(); + self.elem.clone().map(|n| (e, n)) + }) + } +} + +#[cfg(test)] +mod tests { + #[test] + fn adjpairs() { + use super::IteratorExtras; + + assert_eq!([1, 2, 3, 4] + .iter() + .cloned() + .adjacent_pairs() + .collect::>(), + vec![(1, 2), (2, 3), (3, 4)]); + assert_eq!([2, 3, 4] + .iter() + .cloned() + .adjacent_pairs() + .collect::>(), + vec![(2, 3), (3, 4)]); + assert_eq!([2, 3, 4] + .iter() + .cloned() + .adjacent_pairs() + .collect::>(), + vec![(2, 3), (3, 4)]); + assert_eq!([3, 4] + .iter() + .cloned() + .adjacent_pairs() + .collect::>(), + vec![(3, 4)]); + assert_eq!([4] + .iter() + .cloned() + .adjacent_pairs() + .collect::>(), + vec![]); + assert_eq!([] + .iter() + .cloned() + .adjacent_pairs() + .collect::>(), + vec![]); + } +} diff --git a/lib/cretonne/src/lib.rs b/lib/cretonne/src/lib.rs index 1c983c74e6..e44899f8c2 100644 --- a/lib/cretonne/src/lib.rs +++ b/lib/cretonne/src/lib.rs @@ -14,10 +14,10 @@ pub const VERSION: &'static str = env!("CARGO_PKG_VERSION"); pub mod dbg; pub mod binemit; -pub mod flowgraph; pub mod dominator_tree; pub mod entity_list; pub mod entity_map; +pub mod flowgraph; pub mod ir; pub mod isa; pub mod regalloc; @@ -28,6 +28,7 @@ pub mod verifier; mod abi; mod constant_hash; mod context; +mod iterators; mod legalizer; mod packed_option; mod partition_slice;