mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-12 15:04:03 +00:00
Auto merge of #56630 - sinkuu:core_iter, r=kennytm
Resolve FIXME in libcore/iter/mod.rs and makes a few improvements.
This commit is contained in:
commit
b7da2c6e12
@ -282,6 +282,12 @@ bench_sums! {
|
|||||||
(0i64..1000000).chain(1000000..).take_while(|&x| x < 1111111)
|
(0i64..1000000).chain(1000000..).take_while(|&x| x < 1111111)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bench_sums! {
|
||||||
|
bench_cycle_take_sum,
|
||||||
|
bench_cycle_take_ref_sum,
|
||||||
|
(0i64..10000).cycle().take(1000000)
|
||||||
|
}
|
||||||
|
|
||||||
// Checks whether Skip<Zip<A,B>> is as fast as Zip<Skip<A>, Skip<B>>, from
|
// Checks whether Skip<Zip<A,B>> is as fast as Zip<Skip<A>, Skip<B>>, from
|
||||||
// https://users.rust-lang.org/t/performance-difference-between-iterator-zip-and-skip-order/15743
|
// https://users.rust-lang.org/t/performance-difference-between-iterator-zip-and-skip-order/15743
|
||||||
#[bench]
|
#[bench]
|
||||||
|
@ -649,6 +649,19 @@ impl<I> Iterator for Cycle<I> where I: Clone + Iterator {
|
|||||||
_ => (usize::MAX, None)
|
_ => (usize::MAX, None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn try_fold<Acc, F, R>(&mut self, init: Acc, mut f: F) -> R where
|
||||||
|
Self: Sized, F: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
|
||||||
|
{
|
||||||
|
let mut accum = init;
|
||||||
|
while let Some(x) = self.iter.next() {
|
||||||
|
accum = f(accum, x)?;
|
||||||
|
accum = self.iter.try_fold(accum, &mut f)?;
|
||||||
|
self.iter = self.orig.clone();
|
||||||
|
}
|
||||||
|
Try::from_ok(accum)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "fused", since = "1.26.0")]
|
#[stable(feature = "fused", since = "1.26.0")]
|
||||||
@ -1855,18 +1868,11 @@ impl<I: Iterator> Iterator for Peekable<I> {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn nth(&mut self, n: usize) -> Option<I::Item> {
|
fn nth(&mut self, n: usize) -> Option<I::Item> {
|
||||||
// FIXME(#43234): merge these when borrow-checking gets better.
|
match self.peeked.take() {
|
||||||
if n == 0 {
|
Some(None) => None,
|
||||||
match self.peeked.take() {
|
Some(v @ Some(_)) if n == 0 => v,
|
||||||
Some(v) => v,
|
Some(Some(_)) => self.iter.nth(n - 1),
|
||||||
None => self.iter.nth(n),
|
None => self.iter.nth(n),
|
||||||
}
|
|
||||||
} else {
|
|
||||||
match self.peeked.take() {
|
|
||||||
Some(None) => None,
|
|
||||||
Some(Some(_)) => self.iter.nth(n - 1),
|
|
||||||
None => self.iter.nth(n),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1965,14 +1971,8 @@ impl<I: Iterator> Peekable<I> {
|
|||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub fn peek(&mut self) -> Option<&I::Item> {
|
pub fn peek(&mut self) -> Option<&I::Item> {
|
||||||
if self.peeked.is_none() {
|
let iter = &mut self.iter;
|
||||||
self.peeked = Some(self.iter.next());
|
self.peeked.get_or_insert_with(|| iter.next()).as_ref()
|
||||||
}
|
|
||||||
match self.peeked {
|
|
||||||
Some(Some(ref value)) => Some(value),
|
|
||||||
Some(None) => None,
|
|
||||||
_ => unreachable!(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2109,8 +2109,12 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
let (_, upper) = self.iter.size_hint();
|
if self.flag {
|
||||||
(0, upper) // can't know a lower bound, due to the predicate
|
(0, Some(0))
|
||||||
|
} else {
|
||||||
|
let (_, upper) = self.iter.size_hint();
|
||||||
|
(0, upper) // can't know a lower bound, due to the predicate
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -2321,6 +2325,10 @@ impl<I> Iterator for Take<I> where I: Iterator{
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
|
if self.n == 0 {
|
||||||
|
return (0, Some(0));
|
||||||
|
}
|
||||||
|
|
||||||
let (lower, upper) = self.iter.size_hint();
|
let (lower, upper) = self.iter.size_hint();
|
||||||
|
|
||||||
let lower = cmp::min(lower, self.n);
|
let lower = cmp::min(lower, self.n);
|
||||||
|
@ -92,6 +92,7 @@
|
|||||||
#![feature(link_llvm_intrinsics)]
|
#![feature(link_llvm_intrinsics)]
|
||||||
#![feature(never_type)]
|
#![feature(never_type)]
|
||||||
#![feature(nll)]
|
#![feature(nll)]
|
||||||
|
#![feature(bind_by_move_pattern_guards)]
|
||||||
#![feature(exhaustive_patterns)]
|
#![feature(exhaustive_patterns)]
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
#![feature(on_unimplemented)]
|
#![feature(on_unimplemented)]
|
||||||
|
@ -1001,6 +1001,8 @@ fn test_cycle() {
|
|||||||
let mut it = (0..).step_by(1).take(0).cycle();
|
let mut it = (0..).step_by(1).take(0).cycle();
|
||||||
assert_eq!(it.size_hint(), (0, Some(0)));
|
assert_eq!(it.size_hint(), (0, Some(0)));
|
||||||
assert_eq!(it.next(), None);
|
assert_eq!(it.next(), None);
|
||||||
|
|
||||||
|
assert_eq!(empty::<i32>().cycle().fold(0, |acc, x| acc + x), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
Reference in New Issue
Block a user