Mercurial > lbo > hg > localmr
changeset 41:2ec1d193c8f0
rustfmt
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Mon, 01 Feb 2016 20:41:45 +0000 |
parents | 1b71d1dcad70 |
children | 85e3fb6bf1b8 |
files | src/shard_merge.rs |
diffstat | 1 files changed, 75 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/src/shard_merge.rs Mon Feb 01 20:41:25 2016 +0000 +++ b/src/shard_merge.rs Mon Feb 01 20:41:45 2016 +0000 @@ -9,8 +9,8 @@ /// This type uses dynamic instead of static dispatch because it realizes an arbitrary structure /// and can therefore not work with a single type signature. pub struct ShardMergeIterator<'a, T: PartialOrd> { - left: Box<Iterator<Item=T> + 'a>, - right: Box<Iterator<Item=T> + 'a>, + left: Box<Iterator<Item = T> + 'a>, + right: Box<Iterator<Item = T> + 'a>, left_peeked: Option<T>, right_peeked: Option<T>, @@ -21,24 +21,33 @@ fn next(&mut self) -> Option<Self::Item> { // fill up match (self.left_peeked.clone(), self.right_peeked.clone()) { - (None, None) => { self.left_peeked = self.left.next(); self.right_peeked = self.right.next() }, + (None, None) => { + self.left_peeked = self.left.next(); + self.right_peeked = self.right.next() + } (Some(_), None) => self.right_peeked = self.right.next(), (None, Some(_)) => self.left_peeked = self.left.next(), - (Some(_), Some(_)) => () + (Some(_), Some(_)) => (), } // Consume peeked values match (self.left_peeked.clone(), self.right_peeked.clone()) { - (None, None) => { return None }, - (l @ Some(_), None) => { self.left_peeked = None; return l }, - (None, r @ Some(_)) => { self.right_peeked = None; return r }, + (None, None) => return None, + (l @ Some(_), None) => { + self.left_peeked = None; + return l; + } + (None, r @ Some(_)) => { + self.right_peeked = None; + return r; + } (l @ Some(_), r @ Some(_)) => { if l <= r { self.left_peeked = None; - return l + return l; } else { self.right_peeked = None; - return r + return r; } } } @@ -46,7 +55,9 @@ } impl<'a, T: PartialOrd + Clone> ShardMergeIterator<'a, T> { - fn default() -> ShardMergeIterator<'a, T> where T: 'a { + fn default() -> ShardMergeIterator<'a, T> + where T: 'a + { ShardMergeIterator { left: Box::new(iter::empty()), right: Box::new(iter::empty()), @@ -56,43 +67,68 @@ } /// Takes multiple iterators of type It and generates one ShardedMergeIterator.. /// (yes, iterator over a collection of iterators). - pub fn build<It: Iterator<Item=T>, ItIt: Iterator<Item=It>>(sources: &mut ItIt) -> ShardMergeIterator<'a, T> - where T: 'a, It: 'a { - let mut merged: Vec<ShardMergeIterator<T>> = Vec::new(); + pub fn build<It: Iterator<Item = T>, ItIt: Iterator<Item = It>>(sources: &mut ItIt) + -> ShardMergeIterator<'a, T> + where T: 'a, + It: 'a + { + let mut merged: Vec<ShardMergeIterator<T>> = Vec::new(); - // Initial merging: Merge pairs of input iterators together. - loop { - let src1: It; - match sources.next() { - None => break, - Some(src) => src1 = src, + // Initial merging: Merge pairs of input iterators together. + loop { + let src1: It; + match sources.next() { + None => break, + Some(src) => src1 = src, + } + match sources.next() { + None => { + merged.push(ShardMergeIterator { + left: Box::new(src1), + right: Box::new(iter::empty()), + ..ShardMergeIterator::default() + }) } - match sources.next() { - None => merged.push(ShardMergeIterator { left: Box::new(src1), right: Box::new(iter::empty()), .. ShardMergeIterator::default() }), - Some(src) => merged.push(ShardMergeIterator { left: Box::new(src1), right: Box::new(src), .. ShardMergeIterator::default() }), + Some(src) => { + merged.push(ShardMergeIterator { + left: Box::new(src1), + right: Box::new(src), + ..ShardMergeIterator::default() + }) } } + } - // Recursively build the merge tree from the leaves. - ShardMergeIterator::merge(merged) + // Recursively build the merge tree from the leaves. + ShardMergeIterator::merge(merged) } /// Merge multiple ShardMergeIterators, recursively (meaning it will result in a more or less /// balanced merge sort tree). - fn merge(mut its: Vec<ShardMergeIterator<'a, T>>) -> ShardMergeIterator<'a, T> where T: 'a { + fn merge(mut its: Vec<ShardMergeIterator<'a, T>>) -> ShardMergeIterator<'a, T> + where T: 'a + { if its.len() == 0 { ShardMergeIterator::default() } else if its.len() == 1 { - ShardMergeIterator { left: Box::new(its.remove(0)), .. ShardMergeIterator::default() } + ShardMergeIterator { left: Box::new(its.remove(0)), ..ShardMergeIterator::default() } } else if its.len() == 2 { let it1 = its.remove(0); let it2 = its.remove(0); - ShardMergeIterator { left: Box::new(it1), right: Box::new(it2), ..ShardMergeIterator::default() } + ShardMergeIterator { + left: Box::new(it1), + right: Box::new(it2), + ..ShardMergeIterator::default() + } } else { // its is left part, right is right part let split_at = its.len() / 2; let right = its.split_off(split_at); - ShardMergeIterator { left: Box::new(ShardMergeIterator::merge(its)), right: Box::new(ShardMergeIterator::merge(right)), .. ShardMergeIterator::default() } + ShardMergeIterator { + left: Box::new(ShardMergeIterator::merge(its)), + right: Box::new(ShardMergeIterator::merge(right)), + ..ShardMergeIterator::default() + } } } } @@ -123,8 +159,13 @@ #[test] fn test_merge_iterator() { - let it = ShardMergeIterator::build(&mut vec![get_collection_1(), get_collection_2(), get_collection_3(), - get_collection_4(), get_collection_5(), get_collection_6()].into_iter()); + let it = ShardMergeIterator::build(&mut vec![get_collection_1(), + get_collection_2(), + get_collection_3(), + get_collection_4(), + get_collection_5(), + get_collection_6()] + .into_iter()); let mut cmp = 0; let mut cnt = 0; @@ -134,7 +175,9 @@ cnt += 1; } - assert_eq!(cnt, get_collection_1().len()+get_collection_2().len()+get_collection_3().len()+ - get_collection_4().len()+get_collection_5().len()+get_collection_6().len()); + assert_eq!(cnt, + get_collection_1().len() + get_collection_2().len() + + get_collection_3().len() + get_collection_4().len() + + get_collection_5().len() + get_collection_6().len()); } }