@@ -1432,14 +1432,16 @@ impl<'a, T> Iterator for Windows<'a, T> {
14321432
14331433 #[ inline]
14341434 fn nth ( & mut self , n : usize ) -> Option < Self :: Item > {
1435- let ( end, overflow) = self . size . get ( ) . overflowing_add ( n) ;
1436- if end > self . v . len ( ) || overflow {
1437- self . v = & [ ] ;
1438- None
1439- } else {
1440- let nth = & self . v [ n..end] ;
1441- self . v = & self . v [ n + 1 ..] ;
1435+ let size = self . size . get ( ) ;
1436+ if let Some ( rest) = self . v . get ( n..)
1437+ && let Some ( nth) = rest. get ( ..size)
1438+ {
1439+ self . v = & rest[ 1 ..] ;
14421440 Some ( nth)
1441+ } else {
1442+ // setting length to 0 is cheaper than overwriting the pointer when assigning &[]
1443+ self . v = & self . v [ ..0 ] ; // cheaper than &[]
1444+ None
14431445 }
14441446 }
14451447
@@ -1479,7 +1481,7 @@ impl<'a, T> DoubleEndedIterator for Windows<'a, T> {
14791481 fn nth_back ( & mut self , n : usize ) -> Option < Self :: Item > {
14801482 let ( end, overflow) = self . v . len ( ) . overflowing_sub ( n) ;
14811483 if end < self . size . get ( ) || overflow {
1482- self . v = & [ ] ;
1484+ self . v = & self . v [ .. 0 ] ; // cheaper than &[]
14831485 None
14841486 } else {
14851487 let ret = & self . v [ end - self . size . get ( ) ..end] ;
@@ -1588,17 +1590,15 @@ impl<'a, T> Iterator for Chunks<'a, T> {
15881590 #[ inline]
15891591 fn nth ( & mut self , n : usize ) -> Option < Self :: Item > {
15901592 let ( start, overflow) = n. overflowing_mul ( self . chunk_size ) ;
1591- if start >= self . v . len ( ) || overflow {
1592- self . v = & [ ] ;
1593- None
1594- } else {
1595- let end = match start. checked_add ( self . chunk_size ) {
1596- Some ( sum) => cmp:: min ( self . v . len ( ) , sum) ,
1597- None => self . v . len ( ) ,
1598- } ;
1599- let nth = & self . v [ start..end] ;
1600- self . v = & self . v [ end..] ;
1593+ // min(len) makes a wrong start harmless, but enables optimizing this to brachless code
1594+ let chunk_start = & self . v [ start. min ( self . v . len ( ) ) ..] ;
1595+ let ( nth, remainder) = chunk_start. split_at ( self . chunk_size . min ( chunk_start. len ( ) ) ) ;
1596+ if !overflow && start < self . v . len ( ) {
1597+ self . v = remainder;
16011598 Some ( nth)
1599+ } else {
1600+ self . v = & self . v [ ..0 ] ; // cheaper than &[]
1601+ None
16021602 }
16031603 }
16041604
@@ -1661,7 +1661,7 @@ impl<'a, T> DoubleEndedIterator for Chunks<'a, T> {
16611661 fn nth_back ( & mut self , n : usize ) -> Option < Self :: Item > {
16621662 let len = self . len ( ) ;
16631663 if n >= len {
1664- self . v = & [ ] ;
1664+ self . v = & self . v [ .. 0 ] ; // cheaper than &[]
16651665 None
16661666 } else {
16671667 let start = ( len - 1 - n) * self . chunk_size ;
@@ -1985,7 +1985,7 @@ impl<'a, T> Iterator for ChunksExact<'a, T> {
19851985 fn nth ( & mut self , n : usize ) -> Option < Self :: Item > {
19861986 let ( start, overflow) = n. overflowing_mul ( self . chunk_size ) ;
19871987 if start >= self . v . len ( ) || overflow {
1988- self . v = & [ ] ;
1988+ self . v = & self . v [ .. 0 ] ; // cheaper than &[]
19891989 None
19901990 } else {
19911991 let ( _, snd) = self . v . split_at ( start) ;
@@ -2023,7 +2023,7 @@ impl<'a, T> DoubleEndedIterator for ChunksExact<'a, T> {
20232023 fn nth_back ( & mut self , n : usize ) -> Option < Self :: Item > {
20242024 let len = self . len ( ) ;
20252025 if n >= len {
2026- self . v = & [ ] ;
2026+ self . v = & self . v [ .. 0 ] ; // cheaper than &[]
20272027 None
20282028 } else {
20292029 let start = ( len - 1 - n) * self . chunk_size ;
@@ -2690,7 +2690,7 @@ impl<'a, T> Iterator for RChunks<'a, T> {
26902690 fn nth ( & mut self , n : usize ) -> Option < Self :: Item > {
26912691 let ( end, overflow) = n. overflowing_mul ( self . chunk_size ) ;
26922692 if end >= self . v . len ( ) || overflow {
2693- self . v = & [ ] ;
2693+ self . v = & self . v [ .. 0 ] ; // cheaper than &[]
26942694 None
26952695 } else {
26962696 // Can't underflow because of the check above
@@ -2747,7 +2747,7 @@ impl<'a, T> DoubleEndedIterator for RChunks<'a, T> {
27472747 fn nth_back ( & mut self , n : usize ) -> Option < Self :: Item > {
27482748 let len = self . len ( ) ;
27492749 if n >= len {
2750- self . v = & [ ] ;
2750+ self . v = & self . v [ .. 0 ] ; // cheaper than &[]
27512751 None
27522752 } else {
27532753 // can't underflow because `n < len`
@@ -3075,7 +3075,7 @@ impl<'a, T> Iterator for RChunksExact<'a, T> {
30753075 fn nth ( & mut self , n : usize ) -> Option < Self :: Item > {
30763076 let ( end, overflow) = n. overflowing_mul ( self . chunk_size ) ;
30773077 if end >= self . v . len ( ) || overflow {
3078- self . v = & [ ] ;
3078+ self . v = & self . v [ .. 0 ] ; // cheaper than &[]
30793079 None
30803080 } else {
30813081 let ( fst, _) = self . v . split_at ( self . v . len ( ) - end) ;
@@ -3114,7 +3114,7 @@ impl<'a, T> DoubleEndedIterator for RChunksExact<'a, T> {
31143114 fn nth_back ( & mut self , n : usize ) -> Option < Self :: Item > {
31153115 let len = self . len ( ) ;
31163116 if n >= len {
3117- self . v = & [ ] ;
3117+ self . v = & self . v [ .. 0 ] ; // cheaper than &[]
31183118 None
31193119 } else {
31203120 // now that we know that `n` corresponds to a chunk,
0 commit comments