Skip to content

Commit fbe5aa5

Browse files
committedDec 8, 2018
Override Cycle::try_fold
name old ns/iter new ns/iter diff ns/iter diff % speedup iter::bench_cycle_take_ref_sum 927,152 927,194 42 0.00% x 1.00 iter::bench_cycle_take_sum 938,129 603,492 -334,637 -35.67% x 1.55

File tree

3 files changed

+21
-0
lines changed

3 files changed

+21
-0
lines changed
 

‎src/libcore/benches/iter.rs

+6
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,12 @@ bench_sums! {
282282
(0i64..1000000).chain(1000000..).take_while(|&x| x < 1111111)
283283
}
284284

285+
bench_sums! {
286+
bench_cycle_take_sum,
287+
bench_cycle_take_ref_sum,
288+
(0i64..10000).cycle().take(1000000)
289+
}
290+
285291
// Checks whether Skip<Zip<A,B>> is as fast as Zip<Skip<A>, Skip<B>>, from
286292
// https://users.rust-lang.org/t/performance-difference-between-iterator-zip-and-skip-order/15743
287293
#[bench]

‎src/libcore/iter/mod.rs

+13
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,19 @@ impl<I> Iterator for Cycle<I> where I: Clone + Iterator {
649649
_ => (usize::MAX, None)
650650
}
651651
}
652+
653+
#[inline]
654+
fn try_fold<Acc, F, R>(&mut self, init: Acc, mut f: F) -> R where
655+
Self: Sized, F: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
656+
{
657+
let mut accum = init;
658+
while let Some(x) = self.iter.next() {
659+
accum = f(accum, x)?;
660+
accum = self.iter.try_fold(accum, &mut f)?;
661+
self.iter = self.orig.clone();
662+
}
663+
Try::from_ok(accum)
664+
}
652665
}
653666

654667
#[stable(feature = "fused", since = "1.26.0")]

‎src/libcore/tests/iter.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,8 @@ fn test_cycle() {
10011001
let mut it = (0..).step_by(1).take(0).cycle();
10021002
assert_eq!(it.size_hint(), (0, Some(0)));
10031003
assert_eq!(it.next(), None);
1004+
1005+
assert_eq!(empty::<i32>().cycle().fold(0, |acc, x| acc + x), 0);
10041006
}
10051007

10061008
#[test]

0 commit comments

Comments
 (0)
Please sign in to comment.