Skip to content

Commit 53a609b

Browse files
committed
Rollup merge of #24217 - aturon:iterator-fixes, r=alexcrichton
2 parents ede25fe + e3f324c commit 53a609b

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

src/libcore/iter.rs

+22-20
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,10 @@ pub trait Iterator {
171171
/// ```
172172
#[inline]
173173
#[stable(feature = "rust1", since = "1.0.0")]
174-
fn chain<U>(self, other: U) -> Chain<Self, U> where
175-
Self: Sized, U: Iterator<Item=Self::Item>,
174+
fn chain<U>(self, other: U) -> Chain<Self, U::IntoIter> where
175+
Self: Sized, U: IntoIterator<Item=Self::Item>,
176176
{
177-
Chain{a: self, b: other, flag: false}
177+
Chain{a: self, b: other.into_iter(), flag: false}
178178
}
179179

180180
/// Creates an iterator that iterates over both this and the specified
@@ -207,8 +207,10 @@ pub trait Iterator {
207207
/// both produce the same output.
208208
#[inline]
209209
#[stable(feature = "rust1", since = "1.0.0")]
210-
fn zip<U: Iterator>(self, other: U) -> Zip<Self, U> where Self: Sized {
211-
Zip{a: self, b: other}
210+
fn zip<U>(self, other: U) -> Zip<Self, U::IntoIter> where
211+
Self: Sized, U: IntoIterator
212+
{
213+
Zip{a: self, b: other.into_iter()}
212214
}
213215

214216
/// Creates a new iterator that will apply the specified function to each
@@ -443,7 +445,7 @@ pub trait Iterator {
443445
#[inline]
444446
#[stable(feature = "rust1", since = "1.0.0")]
445447
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
446-
where Self: Sized, U: Iterator, F: FnMut(Self::Item) -> U,
448+
where Self: Sized, U: IntoIterator, F: FnMut(Self::Item) -> U,
447449
{
448450
FlatMap{iter: self, f: f, frontiter: None, backiter: None }
449451
}
@@ -933,7 +935,7 @@ pub trait Iterator {
933935
/// `std::usize::MAX` elements of the original iterator.
934936
#[inline]
935937
#[stable(feature = "rust1", since = "1.0.0")]
936-
fn rev(self) -> Rev<Self> where Self: Sized {
938+
fn rev(self) -> Rev<Self> where Self: Sized + DoubleEndedIterator {
937939
Rev{iter: self}
938940
}
939941

@@ -2093,15 +2095,15 @@ impl<B, I, St, F> Iterator for Scan<I, St, F> where
20932095
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
20942096
#[stable(feature = "rust1", since = "1.0.0")]
20952097
#[derive(Clone)]
2096-
pub struct FlatMap<I, U, F> {
2098+
pub struct FlatMap<I, U: IntoIterator, F> {
20972099
iter: I,
20982100
f: F,
2099-
frontiter: Option<U>,
2100-
backiter: Option<U>,
2101+
frontiter: Option<U::IntoIter>,
2102+
backiter: Option<U::IntoIter>,
21012103
}
21022104

21032105
#[stable(feature = "rust1", since = "1.0.0")]
2104-
impl<I: Iterator, U: Iterator, F> Iterator for FlatMap<I, U, F>
2106+
impl<I: Iterator, U: IntoIterator, F> Iterator for FlatMap<I, U, F>
21052107
where F: FnMut(I::Item) -> U,
21062108
{
21072109
type Item = U::Item;
@@ -2110,13 +2112,13 @@ impl<I: Iterator, U: Iterator, F> Iterator for FlatMap<I, U, F>
21102112
fn next(&mut self) -> Option<U::Item> {
21112113
loop {
21122114
if let Some(ref mut inner) = self.frontiter {
2113-
for x in inner.by_ref() {
2115+
if let Some(x) = inner.by_ref().next() {
21142116
return Some(x)
21152117
}
21162118
}
21172119
match self.iter.next().map(|x| (self.f)(x)) {
21182120
None => return self.backiter.as_mut().and_then(|it| it.next()),
2119-
next => self.frontiter = next,
2121+
next => self.frontiter = next.map(IntoIterator::into_iter),
21202122
}
21212123
}
21222124
}
@@ -2134,22 +2136,22 @@ impl<I: Iterator, U: Iterator, F> Iterator for FlatMap<I, U, F>
21342136
}
21352137

21362138
#[stable(feature = "rust1", since = "1.0.0")]
2137-
impl<I: DoubleEndedIterator, U: DoubleEndedIterator, F> DoubleEndedIterator
2138-
for FlatMap<I, U, F>
2139-
where F: FnMut(I::Item) -> U
2139+
impl<I: DoubleEndedIterator, U, F> DoubleEndedIterator for FlatMap<I, U, F> where
2140+
F: FnMut(I::Item) -> U,
2141+
U: IntoIterator,
2142+
U::IntoIter: DoubleEndedIterator
21402143
{
21412144
#[inline]
21422145
fn next_back(&mut self) -> Option<U::Item> {
21432146
loop {
21442147
if let Some(ref mut inner) = self.backiter {
2145-
match inner.next_back() {
2146-
None => (),
2147-
y => return y
2148+
if let Some(y) = inner.next_back() {
2149+
return Some(y)
21482150
}
21492151
}
21502152
match self.iter.next_back().map(|x| (self.f)(x)) {
21512153
None => return self.frontiter.as_mut().and_then(|it| it.next_back()),
2152-
next => self.backiter = next,
2154+
next => self.backiter = next.map(IntoIterator::into_iter),
21532155
}
21542156
}
21552157
}

0 commit comments

Comments
 (0)