From 5b916cab16e361cb29bea9efc14ecff28d8c0fa3 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 20 May 2015 17:17:17 +0200 Subject: [PATCH] Implement DoubleEndedIterator for ArrayVec --- src/lib.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 2d59cbb..94f97b7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -322,6 +322,7 @@ pub struct IntoIter { impl Iterator for IntoIter { type Item = A::Item; + #[inline] fn next(&mut self) -> Option { if self.index == self.v.len { None @@ -334,8 +335,31 @@ impl Iterator for IntoIter { } } } + + fn size_hint(&self) -> (usize, Option) { + let len = self.v.len() - self.index as usize; + (len, Some(len)) + } } +impl DoubleEndedIterator for IntoIter { + #[inline] + fn next_back(&mut self) -> Option { + 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 ExactSizeIterator for IntoIter { } + impl Drop for IntoIter { fn drop(&mut self) { // exhaust iterator and clear the vector @@ -437,6 +461,17 @@ fn test_simple() { 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] fn test_drop() { use std::rc::Rc;