From 6c940893e58ad141ec8e3eaf2c65741d15d9eb93 Mon Sep 17 00:00:00 2001 From: Andre Bogus Date: Mon, 16 Jan 2017 22:28:58 +0100 Subject: [PATCH] branchless .filter(_).count() --- src/libcore/iter/mod.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index 3999db0d63c9..5dce60b79c99 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -1099,6 +1099,16 @@ impl Iterator for Filter where P: FnMut(&I::Item) -> bool let (_, upper) = self.iter.size_hint(); (0, upper) // can't know a lower bound, due to the predicate } + + #[inline] + fn count(self) -> usize { + let (mut c, mut predicate, mut iter) = (0, self.predicate, self.iter); + for x in iter.by_ref() { + // branchless count + c += (&mut predicate)(&x) as usize; + } + c + } } #[stable(feature = "rust1", since = "1.0.0")]