Skip to content

Commit 3e8fbd8

Browse files
committed
Optimize Vec's IntoIter's methods
1 parent fe6a54d commit 3e8fbd8

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

src/liballoc/tests/vec.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,11 +697,40 @@ fn test_into_iter_debug() {
697697
assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
698698
}
699699

700+
#[test]
701+
fn test_into_iter_len() {
702+
let mut into_iter = vec![1, 2, 3].into_iter();
703+
assert_eq!(into_iter.len(), 3);
704+
into_iter.next();
705+
assert_eq!(into_iter.len(), 2);
706+
}
707+
700708
#[test]
701709
fn test_into_iter_count() {
702710
assert_eq!(vec![1, 2, 3].into_iter().count(), 3);
703711
}
704712

713+
#[test]
714+
fn test_into_iter_nth() {
715+
let mut into_iter = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10].into_iter();
716+
assert_eq!(into_iter.nth(0), Some(1));
717+
assert_eq!(into_iter.nth(2), Some(4));
718+
assert_eq!(into_iter.nth(1), Some(6));
719+
assert_eq!(into_iter.nth(3), Some(10));
720+
assert_eq!(into_iter.nth(3), None);
721+
assert_eq!(into_iter.nth(3), None);
722+
}
723+
724+
#[test]
725+
fn test_into_iter_next_back() {
726+
let mut into_iter = vec![1, 2, 3].into_iter();
727+
assert_eq!(into_iter.next_back(), Some(3));
728+
assert_eq!(into_iter.next_back(), Some(2));
729+
assert_eq!(into_iter.next_back(), Some(1));
730+
assert_eq!(into_iter.next_back(), None);
731+
assert_eq!(into_iter.next_back(), None);
732+
}
733+
705734
#[test]
706735
fn test_into_iter_clone() {
707736
fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {

src/liballoc/vec.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2340,18 +2340,19 @@ impl<T> Iterator for IntoIter<T> {
23402340

23412341
#[inline]
23422342
fn size_hint(&self) -> (usize, Option<usize>) {
2343-
let exact = if mem::size_of::<T>() == 0 {
2344-
(self.end as usize).wrapping_sub(self.ptr as usize)
2345-
} else {
2346-
unsafe { self.end.offset_from(self.ptr) as usize }
2347-
};
2343+
let exact = self.len();
23482344
(exact, Some(exact))
23492345
}
23502346

23512347
#[inline]
23522348
fn count(self) -> usize {
23532349
self.len()
23542350
}
2351+
2352+
#[inline]
2353+
fn last(mut self) -> Option<T> {
2354+
self.next_back()
2355+
}
23552356
}
23562357

23572358
#[stable(feature = "rust1", since = "1.0.0")]
@@ -2380,6 +2381,14 @@ impl<T> DoubleEndedIterator for IntoIter<T> {
23802381

23812382
#[stable(feature = "rust1", since = "1.0.0")]
23822383
impl<T> ExactSizeIterator for IntoIter<T> {
2384+
fn len(&self) -> usize {
2385+
if mem::size_of::<T>() == 0 {
2386+
(self.end as usize).wrapping_sub(self.ptr as usize)
2387+
} else {
2388+
unsafe { self.end.offset_from(self.ptr) as usize }
2389+
}
2390+
}
2391+
23832392
fn is_empty(&self) -> bool {
23842393
self.ptr == self.end
23852394
}

0 commit comments

Comments
 (0)