@@ -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