|
319 | 319 | use cmp; |
320 | 320 | use fmt; |
321 | 321 | use iter_private::TrustedRandomAccess; |
322 | | -use ops::{self, Try}; |
| 322 | +use ops::Try; |
323 | 323 | use usize; |
324 | 324 | use intrinsics; |
325 | | -use mem; |
326 | 325 |
|
327 | 326 | #[stable(feature = "rust1", since = "1.0.0")] |
328 | 327 | pub use self::iterator::Iterator; |
@@ -673,7 +672,12 @@ impl<I> Iterator for StepBy<I> where I: Iterator { |
673 | 672 |
|
674 | 673 | #[inline] |
675 | 674 | fn next(&mut self) -> Option<Self::Item> { |
676 | | - <Self as StepBySpecIterator>::spec_next(self) |
| 675 | + if self.first_take { |
| 676 | + self.first_take = false; |
| 677 | + self.iter.next() |
| 678 | + } else { |
| 679 | + self.iter.nth(self.step) |
| 680 | + } |
677 | 681 | } |
678 | 682 |
|
679 | 683 | #[inline] |
@@ -733,78 +737,6 @@ impl<I> Iterator for StepBy<I> where I: Iterator { |
733 | 737 | } |
734 | 738 | } |
735 | 739 |
|
736 | | -// hidden trait for specializing iterator methods |
737 | | -// could be generalized but is currently only used for StepBy |
738 | | -trait StepBySpecIterator { |
739 | | - type Item; |
740 | | - fn spec_next(&mut self) -> Option<Self::Item>; |
741 | | -} |
742 | | - |
743 | | -impl<I> StepBySpecIterator for StepBy<I> |
744 | | -where |
745 | | - I: Iterator, |
746 | | -{ |
747 | | - type Item = I::Item; |
748 | | - |
749 | | - #[inline] |
750 | | - default fn spec_next(&mut self) -> Option<I::Item> { |
751 | | - if self.first_take { |
752 | | - self.first_take = false; |
753 | | - self.iter.next() |
754 | | - } else { |
755 | | - self.iter.nth(self.step) |
756 | | - } |
757 | | - } |
758 | | -} |
759 | | - |
760 | | -impl<T> StepBySpecIterator for StepBy<ops::Range<T>> |
761 | | -where |
762 | | - T: Step, |
763 | | -{ |
764 | | - #[inline] |
765 | | - fn spec_next(&mut self) -> Option<Self::Item> { |
766 | | - self.first_take = false; |
767 | | - if !(self.iter.start < self.iter.end) { |
768 | | - return None; |
769 | | - } |
770 | | - // add 1 to self.step to get original step size back |
771 | | - // it was decremented for the general case on construction |
772 | | - if let Some(n) = self.iter.start.add_usize(self.step+1) { |
773 | | - let next = mem::replace(&mut self.iter.start, n); |
774 | | - Some(next) |
775 | | - } else { |
776 | | - let last = self.iter.start.clone(); |
777 | | - self.iter.start = self.iter.end.clone(); |
778 | | - Some(last) |
779 | | - } |
780 | | - } |
781 | | -} |
782 | | - |
783 | | -impl<T> StepBySpecIterator for StepBy<ops::RangeInclusive<T>> |
784 | | -where |
785 | | - T: Step, |
786 | | -{ |
787 | | - #[inline] |
788 | | - fn spec_next(&mut self) -> Option<Self::Item> { |
789 | | - self.first_take = false; |
790 | | - self.iter.compute_is_empty(); |
791 | | - if self.iter.is_empty.unwrap_or_default() { |
792 | | - return None; |
793 | | - } |
794 | | - // add 1 to self.step to get original step size back |
795 | | - // it was decremented for the general case on construction |
796 | | - if let Some(n) = self.iter.start.add_usize(self.step+1) { |
797 | | - self.iter.is_empty = Some(!(n <= self.iter.end)); |
798 | | - let next = mem::replace(&mut self.iter.start, n); |
799 | | - Some(next) |
800 | | - } else { |
801 | | - let last = self.iter.start.clone(); |
802 | | - self.iter.is_empty = Some(true); |
803 | | - Some(last) |
804 | | - } |
805 | | - } |
806 | | -} |
807 | | - |
808 | 740 | // StepBy can only make the iterator shorter, so the len will still fit. |
809 | 741 | #[stable(feature = "iterator_step_by", since = "1.28.0")] |
810 | 742 | impl<I> ExactSizeIterator for StepBy<I> where I: ExactSizeIterator {} |
|
0 commit comments