Implement DoubleEndedIterator for ArrayVec

This commit is contained in:
root
2015-05-20 17:17:17 +02:00
parent ad4780704a
commit 5b916cab16
+35
View File
@@ -322,6 +322,7 @@ pub struct IntoIter<A: Array> {
impl<A: Array> Iterator for IntoIter<A> { impl<A: Array> Iterator for IntoIter<A> {
type Item = A::Item; type Item = A::Item;
#[inline]
fn next(&mut self) -> Option<A::Item> { fn next(&mut self) -> Option<A::Item> {
if self.index == self.v.len { if self.index == self.v.len {
None None
@@ -334,8 +335,31 @@ impl<A: Array> Iterator for IntoIter<A> {
} }
} }
} }
fn size_hint(&self) -> (usize, Option<usize>) {
let len = self.v.len() - self.index as usize;
(len, Some(len))
}
} }
impl<A: Array> DoubleEndedIterator for IntoIter<A> {
#[inline]
fn next_back(&mut self) -> Option<A::Item> {
if self.index == self.v.len {
None
} else {
unsafe {
self.v.len -= 1;
let len = self.v.len();
let elt = ptr::read(self.v.get_unchecked_mut(len));
Some(elt)
}
}
}
}
impl<A: Array> ExactSizeIterator for IntoIter<A> { }
impl<A: Array> Drop for IntoIter<A> { impl<A: Array> Drop for IntoIter<A> {
fn drop(&mut self) { fn drop(&mut self) {
// exhaust iterator and clear the vector // exhaust iterator and clear the vector
@@ -437,6 +461,17 @@ fn test_simple() {
assert_eq!(sum_len, 8); assert_eq!(sum_len, 8);
} }
#[test]
fn test_iter() {
let mut iter = ArrayVec::from([1, 2, 3]).into_iter();
assert_eq!(iter.size_hint(), (3, Some(3)));
assert_eq!(iter.next_back(), Some(3));
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next_back(), Some(2));
assert_eq!(iter.size_hint(), (0, Some(0)));
assert_eq!(iter.next_back(), None);
}
#[test] #[test]
fn test_drop() { fn test_drop() {
use std::rc::Rc; use std::rc::Rc;