@@ -619,25 +619,26 @@ impl<T: TrustedStep> RangeIteratorImpl for ops::Range<T> {
619
619
#[ inline]
620
620
fn spec_next ( & mut self ) -> Option < T > {
621
621
if self . start < self . end {
622
+ let old = self . start ;
622
623
// SAFETY: just checked precondition
623
- let n = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , 1 ) } ;
624
- Some ( mem :: replace ( & mut self . start , n ) )
624
+ self . start = unsafe { Step :: forward_unchecked ( old , 1 ) } ;
625
+ Some ( old )
625
626
} else {
626
627
None
627
628
}
628
629
}
629
630
630
631
#[ inline]
631
632
fn spec_nth ( & mut self , n : usize ) -> Option < T > {
632
- if let Some ( plus_n) = Step :: forward_checked ( self . start . clone ( ) , n) {
633
+ if let Some ( plus_n) = Step :: forward_checked ( self . start , n) {
633
634
if plus_n < self . end {
634
635
// SAFETY: just checked precondition
635
- self . start = unsafe { Step :: forward_unchecked ( plus_n. clone ( ) , 1 ) } ;
636
+ self . start = unsafe { Step :: forward_unchecked ( plus_n, 1 ) } ;
636
637
return Some ( plus_n) ;
637
638
}
638
639
}
639
640
640
- self . start = self . end . clone ( ) ;
641
+ self . start = self . end ;
641
642
None
642
643
}
643
644
@@ -655,7 +656,7 @@ impl<T: TrustedStep> RangeIteratorImpl for ops::Range<T> {
655
656
// then steps_between either returns a bound to which we clamp or returns None which
656
657
// together with the initial inequality implies more than usize::MAX steps.
657
658
// Otherwise 0 is returned which always safe to use.
658
- self . start = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , taken) } ;
659
+ self . start = unsafe { Step :: forward_unchecked ( self . start , taken) } ;
659
660
660
661
NonZeroUsize :: new ( n - taken) . map_or ( Ok ( ( ) ) , Err )
661
662
}
@@ -664,24 +665,24 @@ impl<T: TrustedStep> RangeIteratorImpl for ops::Range<T> {
664
665
fn spec_next_back ( & mut self ) -> Option < T > {
665
666
if self . start < self . end {
666
667
// SAFETY: just checked precondition
667
- self . end = unsafe { Step :: backward_unchecked ( self . end . clone ( ) , 1 ) } ;
668
- Some ( self . end . clone ( ) )
668
+ self . end = unsafe { Step :: backward_unchecked ( self . end , 1 ) } ;
669
+ Some ( self . end )
669
670
} else {
670
671
None
671
672
}
672
673
}
673
674
674
675
#[ inline]
675
676
fn spec_nth_back ( & mut self , n : usize ) -> Option < T > {
676
- if let Some ( minus_n) = Step :: backward_checked ( self . end . clone ( ) , n) {
677
+ if let Some ( minus_n) = Step :: backward_checked ( self . end , n) {
677
678
if minus_n > self . start {
678
679
// SAFETY: just checked precondition
679
680
self . end = unsafe { Step :: backward_unchecked ( minus_n, 1 ) } ;
680
- return Some ( self . end . clone ( ) ) ;
681
+ return Some ( self . end ) ;
681
682
}
682
683
}
683
684
684
- self . end = self . start . clone ( ) ;
685
+ self . end = self . start ;
685
686
None
686
687
}
687
688
@@ -696,7 +697,7 @@ impl<T: TrustedStep> RangeIteratorImpl for ops::Range<T> {
696
697
let taken = available. min ( n) ;
697
698
698
699
// SAFETY: same as the spec_advance_by() implementation
699
- self . end = unsafe { Step :: backward_unchecked ( self . end . clone ( ) , taken) } ;
700
+ self . end = unsafe { Step :: backward_unchecked ( self . end , taken) } ;
700
701
701
702
NonZeroUsize :: new ( n - taken) . map_or ( Ok ( ( ) ) , Err )
702
703
}
0 commit comments