Skip to content

Commit 0078c23

Browse files
committed
Override Iterator methods for vec::IntoIter
1 parent b858b7f commit 0078c23

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

src/libcollections/vec.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,6 +1777,41 @@ impl<T> Iterator for IntoIter<T> {
17771777
let exact = diff / (if size == 0 {1} else {size});
17781778
(exact, Some(exact))
17791779
}
1780+
1781+
#[inline]
1782+
fn count(self) -> usize {
1783+
self.size_hint().0
1784+
}
1785+
1786+
#[inline]
1787+
fn last(self) -> Option<T> {
1788+
if self.ptr == self.end {
1789+
None
1790+
} else {
1791+
unsafe {
1792+
if mem::size_of::<T>() == 0 {
1793+
Some(ptr::read(EMPTY as *mut T))
1794+
} else {
1795+
Some(ptr::read(self.end.offset(-1)))
1796+
}
1797+
}
1798+
}
1799+
}
1800+
1801+
#[inline]
1802+
fn nth(&mut self, n: usize) -> Option<T> {
1803+
let size = mem::size_of::<T>();
1804+
let p = unsafe {
1805+
mem::transmute(self.ptr as usize + if size == 0 { 1 } else { size } * n)
1806+
};
1807+
if p >= self.end {
1808+
self.ptr = self.end;
1809+
None
1810+
} else {
1811+
self.ptr = p;
1812+
self.next()
1813+
}
1814+
}
17801815
}
17811816

17821817
#[stable(feature = "rust1", since = "1.0.0")]

src/libcollectionstest/vec.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,18 @@ fn test_split_off() {
542542
assert_eq!(vec2, [5, 6]);
543543
}
544544

545+
#[test]
546+
fn test_into_iter() {
547+
let mut it = vec![1, 2, 3, 4, 5, 6].into_iter();
548+
assert_eq!(it.nth(2), Some(3));
549+
assert_eq!(it.next(), Some(4));
550+
assert_eq!(it.nth(2), None);
551+
assert_eq!(it.next(), None);
552+
553+
assert_eq!(vec![1, 2, 3].into_iter().last(), Some(3));
554+
assert_eq!(vec![1, 2, 3].into_iter().count(), 3);
555+
}
556+
545557
#[bench]
546558
fn bench_new(b: &mut Bencher) {
547559
b.iter(|| {

0 commit comments

Comments
 (0)