@@ -171,10 +171,10 @@ pub trait Iterator {
171
171
/// ```
172
172
#[ inline]
173
173
#[ 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 > ,
176
176
{
177
- Chain { a : self , b : other, flag : false }
177
+ Chain { a : self , b : other. into_iter ( ) , flag : false }
178
178
}
179
179
180
180
/// Creates an iterator that iterates over both this and the specified
@@ -207,8 +207,10 @@ pub trait Iterator {
207
207
/// both produce the same output.
208
208
#[ inline]
209
209
#[ 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 ( ) }
212
214
}
213
215
214
216
/// Creates a new iterator that will apply the specified function to each
@@ -443,7 +445,7 @@ pub trait Iterator {
443
445
#[ inline]
444
446
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
445
447
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 ,
447
449
{
448
450
FlatMap { iter : self , f : f, frontiter : None , backiter : None }
449
451
}
@@ -933,7 +935,7 @@ pub trait Iterator {
933
935
/// `std::usize::MAX` elements of the original iterator.
934
936
#[ inline]
935
937
#[ 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 {
937
939
Rev { iter : self }
938
940
}
939
941
@@ -2093,15 +2095,15 @@ impl<B, I, St, F> Iterator for Scan<I, St, F> where
2093
2095
#[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
2094
2096
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2095
2097
#[ derive( Clone ) ]
2096
- pub struct FlatMap < I , U , F > {
2098
+ pub struct FlatMap < I , U : IntoIterator , F > {
2097
2099
iter : I ,
2098
2100
f : F ,
2099
- frontiter : Option < U > ,
2100
- backiter : Option < U > ,
2101
+ frontiter : Option < U :: IntoIter > ,
2102
+ backiter : Option < U :: IntoIter > ,
2101
2103
}
2102
2104
2103
2105
#[ 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 >
2105
2107
where F : FnMut ( I :: Item ) -> U ,
2106
2108
{
2107
2109
type Item = U :: Item ;
@@ -2110,13 +2112,13 @@ impl<I: Iterator, U: Iterator, F> Iterator for FlatMap<I, U, F>
2110
2112
fn next ( & mut self ) -> Option < U :: Item > {
2111
2113
loop {
2112
2114
if let Some ( ref mut inner) = self . frontiter {
2113
- for x in inner. by_ref ( ) {
2115
+ if let Some ( x ) = inner. by_ref ( ) . next ( ) {
2114
2116
return Some ( x)
2115
2117
}
2116
2118
}
2117
2119
match self . iter . next ( ) . map ( |x| ( self . f ) ( x) ) {
2118
2120
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 ) ,
2120
2122
}
2121
2123
}
2122
2124
}
@@ -2134,22 +2136,22 @@ impl<I: Iterator, U: Iterator, F> Iterator for FlatMap<I, U, F>
2134
2136
}
2135
2137
2136
2138
#[ 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
2140
2143
{
2141
2144
#[ inline]
2142
2145
fn next_back ( & mut self ) -> Option < U :: Item > {
2143
2146
loop {
2144
2147
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)
2148
2150
}
2149
2151
}
2150
2152
match self . iter . next_back ( ) . map ( |x| ( self . f ) ( x) ) {
2151
2153
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 ) ,
2153
2155
}
2154
2156
}
2155
2157
}
0 commit comments