Implement DoubleEndedIterator for ArrayVec
This commit is contained in:
+35
@@ -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,7 +335,30 @@ 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) {
|
||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user