Rollup merge of #24217 - aturon:iterator-fixes, r=alexcrichton

This commit is contained in:
Manish Goregaokar
2015-04-09 21:30:06 +05:30

View File

@@ -171,10 +171,10 @@ pub trait Iterator {
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
fn chain<U>(self, other: U) -> Chain<Self, U> where fn chain<U>(self, other: U) -> Chain<Self, U::IntoIter> where
Self: Sized, U: Iterator<Item=Self::Item>, Self: Sized, U: IntoIterator<Item=Self::Item>,
{ {
Chain{a: self, b: other, flag: false} Chain{a: self, b: other.into_iter(), flag: false}
} }
/// Creates an iterator that iterates over both this and the specified /// Creates an iterator that iterates over both this and the specified
@@ -207,8 +207,10 @@ pub trait Iterator {
/// both produce the same output. /// both produce the same output.
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
fn zip<U: Iterator>(self, other: U) -> Zip<Self, U> where Self: Sized { fn zip<U>(self, other: U) -> Zip<Self, U::IntoIter> where
Zip{a: self, b: other} Self: Sized, U: IntoIterator
{
Zip{a: self, b: other.into_iter()}
} }
/// Creates a new iterator that will apply the specified function to each /// Creates a new iterator that will apply the specified function to each
@@ -443,7 +445,7 @@ pub trait Iterator {
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F> fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where Self: Sized, U: Iterator, F: FnMut(Self::Item) -> U, where Self: Sized, U: IntoIterator, F: FnMut(Self::Item) -> U,
{ {
FlatMap{iter: self, f: f, frontiter: None, backiter: None } FlatMap{iter: self, f: f, frontiter: None, backiter: None }
} }
@@ -933,7 +935,7 @@ pub trait Iterator {
/// `std::usize::MAX` elements of the original iterator. /// `std::usize::MAX` elements of the original iterator.
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
fn rev(self) -> Rev<Self> where Self: Sized { fn rev(self) -> Rev<Self> where Self: Sized + DoubleEndedIterator {
Rev{iter: self} Rev{iter: self}
} }
@@ -2093,15 +2095,15 @@ impl<B, I, St, F> Iterator for Scan<I, St, F> where
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[derive(Clone)] #[derive(Clone)]
pub struct FlatMap<I, U, F> { pub struct FlatMap<I, U: IntoIterator, F> {
iter: I, iter: I,
f: F, f: F,
frontiter: Option<U>, frontiter: Option<U::IntoIter>,
backiter: Option<U>, backiter: Option<U::IntoIter>,
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<I: Iterator, U: Iterator, F> Iterator for FlatMap<I, U, F> impl<I: Iterator, U: IntoIterator, F> Iterator for FlatMap<I, U, F>
where F: FnMut(I::Item) -> U, where F: FnMut(I::Item) -> U,
{ {
type Item = U::Item; type Item = U::Item;
@@ -2110,13 +2112,13 @@ impl<I: Iterator, U: Iterator, F> Iterator for FlatMap<I, U, F>
fn next(&mut self) -> Option<U::Item> { fn next(&mut self) -> Option<U::Item> {
loop { loop {
if let Some(ref mut inner) = self.frontiter { if let Some(ref mut inner) = self.frontiter {
for x in inner.by_ref() { if let Some(x) = inner.by_ref().next() {
return Some(x) return Some(x)
} }
} }
match self.iter.next().map(|x| (self.f)(x)) { match self.iter.next().map(|x| (self.f)(x)) {
None => return self.backiter.as_mut().and_then(|it| it.next()), None => return self.backiter.as_mut().and_then(|it| it.next()),
next => self.frontiter = next, next => self.frontiter = next.map(IntoIterator::into_iter),
} }
} }
} }
@@ -2134,22 +2136,22 @@ impl<I: Iterator, U: Iterator, F> Iterator for FlatMap<I, U, F>
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<I: DoubleEndedIterator, U: DoubleEndedIterator, F> DoubleEndedIterator impl<I: DoubleEndedIterator, U, F> DoubleEndedIterator for FlatMap<I, U, F> where
for FlatMap<I, U, F> F: FnMut(I::Item) -> U,
where F: FnMut(I::Item) -> U U: IntoIterator,
U::IntoIter: DoubleEndedIterator
{ {
#[inline] #[inline]
fn next_back(&mut self) -> Option<U::Item> { fn next_back(&mut self) -> Option<U::Item> {
loop { loop {
if let Some(ref mut inner) = self.backiter { if let Some(ref mut inner) = self.backiter {
match inner.next_back() { if let Some(y) = inner.next_back() {
None => (), return Some(y)
y => return y
} }
} }
match self.iter.next_back().map(|x| (self.f)(x)) { match self.iter.next_back().map(|x| (self.f)(x)) {
None => return self.frontiter.as_mut().and_then(|it| it.next_back()), None => return self.frontiter.as_mut().and_then(|it| it.next_back()),
next => self.backiter = next, next => self.backiter = next.map(IntoIterator::into_iter),
} }
} }
} }