@@ -330,18 +330,18 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
330330
331331 #[ inline]
332332 fn next ( & mut self ) -> Option < A > {
333- if self . is_empty ( ) {
334- self . is_iterating = Some ( false ) ;
333+ self . compute_is_empty ( ) ;
334+ if self . is_empty . unwrap_or_default ( ) {
335335 return None ;
336336 }
337- if self . start < self . end {
337+ let is_iterating = self . start < self . end ;
338+ self . is_empty = Some ( !is_iterating) ;
339+ Some ( if is_iterating {
338340 let n = self . start . add_one ( ) ;
339- self . is_iterating = Some ( true ) ;
340- Some ( mem:: replace ( & mut self . start , n) )
341+ mem:: replace ( & mut self . start , n)
341342 } else {
342- self . is_iterating = Some ( false ) ;
343- Some ( self . start . clone ( ) )
344- }
343+ self . start . clone ( )
344+ } )
345345 }
346346
347347 #[ inline]
@@ -358,8 +358,8 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
358358
359359 #[ inline]
360360 fn nth ( & mut self , n : usize ) -> Option < A > {
361- if self . is_empty ( ) {
362- self . is_iterating = Some ( false ) ;
361+ self . compute_is_empty ( ) ;
362+ if self . is_empty . unwrap_or_default ( ) {
363363 return None ;
364364 }
365365
@@ -368,19 +368,19 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
368368
369369 match plus_n. partial_cmp ( & self . end ) {
370370 Some ( Less ) => {
371- self . is_iterating = Some ( true ) ;
371+ self . is_empty = Some ( false ) ;
372372 self . start = plus_n. add_one ( ) ;
373373 return Some ( plus_n)
374374 }
375375 Some ( Equal ) => {
376- self . is_iterating = Some ( false ) ;
376+ self . is_empty = Some ( true ) ;
377377 return Some ( plus_n)
378378 }
379379 _ => { }
380380 }
381381 }
382382
383- self . is_iterating = Some ( false ) ;
383+ self . is_empty = Some ( true ) ;
384384 None
385385 }
386386
@@ -404,18 +404,18 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
404404impl < A : Step > DoubleEndedIterator for ops:: RangeInclusive < A > {
405405 #[ inline]
406406 fn next_back ( & mut self ) -> Option < A > {
407- if self . is_empty ( ) {
408- self . is_iterating = Some ( false ) ;
407+ self . compute_is_empty ( ) ;
408+ if self . is_empty . unwrap_or_default ( ) {
409409 return None ;
410410 }
411- if self . start < self . end {
411+ let is_iterating = self . start < self . end ;
412+ self . is_empty = Some ( !is_iterating) ;
413+ Some ( if is_iterating {
412414 let n = self . end . sub_one ( ) ;
413- self . is_iterating = Some ( true ) ;
414- Some ( mem:: replace ( & mut self . end , n) )
415+ mem:: replace ( & mut self . end , n)
415416 } else {
416- self . is_iterating = Some ( false ) ;
417- Some ( self . end . clone ( ) )
418- }
417+ self . end . clone ( )
418+ } )
419419 }
420420}
421421
0 commit comments