diff --git a/src/lib.rs b/src/lib.rs index 5c7a1fe..7b3fa4f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -196,11 +196,14 @@ mod tests { b.push(1); b.push(2); b.push(3); + b.push(4); let mut iter = b.iter(); assert_eq!(&1, iter.next().unwrap()); + assert_eq!(&4, iter.next_back().unwrap()); assert_eq!(&2, iter.next().unwrap()); assert_eq!(&3, iter.next().unwrap()); + assert_eq!(None, iter.next()); } test_iter(AllocRingBuffer::with_capacity(8)); diff --git a/src/ringbuffer_trait.rs b/src/ringbuffer_trait.rs index 168aabe..877ea81 100644 --- a/src/ringbuffer_trait.rs +++ b/src/ringbuffer_trait.rs @@ -197,11 +197,13 @@ pub trait RingBufferExt: mod iter { use crate::{RingBufferExt, RingBufferRead}; use core::marker::PhantomData; + use core::iter::FusedIterator; /// RingBufferIterator holds a reference to a `RingBufferExt` and iterates over it. `index` is the /// current iterator position. pub struct RingBufferIterator<'rb, T, RB: RingBufferExt> { obj: &'rb RB, + len: usize, index: usize, phantom: PhantomData, } @@ -211,6 +213,7 @@ mod iter { pub fn new(obj: &'rb RB) -> Self { Self { obj, + len: obj.len(), index: 0, phantom: PhantomData::default(), } @@ -222,7 +225,7 @@ mod iter { #[inline] fn next(&mut self) -> Option { - if self.index < self.obj.len() { + if self.index < self.len { let res = self.obj.get(self.index as isize); self.index += 1; res @@ -230,6 +233,27 @@ mod iter { None } } + + fn size_hint(&self) -> (usize, Option) { + (self.len, Some(self.len)) + } + } + + impl<'rb, T: 'rb, RB: RingBufferExt> FusedIterator for RingBufferIterator<'rb, T, RB> { } + + impl<'rb, T: 'rb, RB: RingBufferExt> ExactSizeIterator for RingBufferIterator<'rb, T, RB> { } + + impl<'rb, T: 'rb, RB: RingBufferExt> DoubleEndedIterator for RingBufferIterator<'rb, T, RB> { + #[inline] + fn next_back(&mut self) -> Option { + if self.len > 0 && self.index < self.len { + let res = self.obj.get((self.len - 1) as isize); + self.len -= 1; + res + } else { + None + } + } } /// `RingBufferMutIterator` holds a reference to a `RingBufferExt` and iterates over it. `index` is the