From 3e8fbd87af44990b5a44ad6b21ba5580738445c0 Mon Sep 17 00:00:00 2001 From: Czipperz Date: Tue, 1 Jan 2019 00:54:06 -0500 Subject: [PATCH] Optimize `Vec`'s `IntoIter`'s methods --- src/liballoc/tests/vec.rs | 29 +++++++++++++++++++++++++++++ src/liballoc/vec.rs | 19 ++++++++++++++----- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/liballoc/tests/vec.rs b/src/liballoc/tests/vec.rs index 0fdcf34c783a8..8a72b6ef00863 100644 --- a/src/liballoc/tests/vec.rs +++ b/src/liballoc/tests/vec.rs @@ -697,11 +697,40 @@ fn test_into_iter_debug() { assert_eq!(debug, "IntoIter(['a', 'b', 'c'])"); } +#[test] +fn test_into_iter_len() { + let mut into_iter = vec![1, 2, 3].into_iter(); + assert_eq!(into_iter.len(), 3); + into_iter.next(); + assert_eq!(into_iter.len(), 2); +} + #[test] fn test_into_iter_count() { assert_eq!(vec![1, 2, 3].into_iter().count(), 3); } +#[test] +fn test_into_iter_nth() { + let mut into_iter = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter(); + assert_eq!(into_iter.nth(0), Some(1)); + assert_eq!(into_iter.nth(2), Some(4)); + assert_eq!(into_iter.nth(1), Some(6)); + assert_eq!(into_iter.nth(3), Some(10)); + assert_eq!(into_iter.nth(3), None); + assert_eq!(into_iter.nth(3), None); +} + +#[test] +fn test_into_iter_next_back() { + let mut into_iter = vec![1, 2, 3].into_iter(); + assert_eq!(into_iter.next_back(), Some(3)); + assert_eq!(into_iter.next_back(), Some(2)); + assert_eq!(into_iter.next_back(), Some(1)); + assert_eq!(into_iter.next_back(), None); + assert_eq!(into_iter.next_back(), None); +} + #[test] fn test_into_iter_clone() { fn iter_equal>(it: I, slice: &[i32]) { diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index b69c114ed4594..e1588b1c4895d 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -2340,11 +2340,7 @@ impl Iterator for IntoIter { #[inline] fn size_hint(&self) -> (usize, Option) { - let exact = if mem::size_of::() == 0 { - (self.end as usize).wrapping_sub(self.ptr as usize) - } else { - unsafe { self.end.offset_from(self.ptr) as usize } - }; + let exact = self.len(); (exact, Some(exact)) } @@ -2352,6 +2348,11 @@ impl Iterator for IntoIter { fn count(self) -> usize { self.len() } + + #[inline] + fn last(mut self) -> Option { + self.next_back() + } } #[stable(feature = "rust1", since = "1.0.0")] @@ -2380,6 +2381,14 @@ impl DoubleEndedIterator for IntoIter { #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for IntoIter { + fn len(&self) -> usize { + if mem::size_of::() == 0 { + (self.end as usize).wrapping_sub(self.ptr as usize) + } else { + unsafe { self.end.offset_from(self.ptr) as usize } + } + } + fn is_empty(&self) -> bool { self.ptr == self.end }