From e65019bf8ac6cc9166b0a11cdfc3b7e364a6c9d0 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Sun, 11 Apr 2021 11:31:25 -0400 Subject: [PATCH 1/4] Iterator: Implement DoubleEndedIterator --- src/lib.rs | 3 +++ src/ringbuffer_trait.rs | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) 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..c68ade1 100644 --- a/src/ringbuffer_trait.rs +++ b/src/ringbuffer_trait.rs @@ -202,6 +202,7 @@ mod iter { /// current iterator position. pub struct RingBufferIterator<'rb, T, RB: RingBufferExt> { obj: &'rb RB, + len: usize, index: usize, phantom: PhantomData, } @@ -211,6 +212,7 @@ mod iter { pub fn new(obj: &'rb RB) -> Self { Self { obj, + len: obj.len(), index: 0, phantom: PhantomData::default(), } @@ -222,7 +224,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 @@ -232,6 +234,19 @@ mod iter { } } + 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 /// current iterator position. /// From 33620e1915fb09fb8f9cfa38c2c089b57fcbd660 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Sun, 11 Apr 2021 11:34:40 -0400 Subject: [PATCH 2/4] Iterator: implement size_hint --- src/ringbuffer_trait.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ringbuffer_trait.rs b/src/ringbuffer_trait.rs index c68ade1..4f4a812 100644 --- a/src/ringbuffer_trait.rs +++ b/src/ringbuffer_trait.rs @@ -232,6 +232,10 @@ mod iter { None } } + + fn size_hint(&self) -> (usize, Option) { + (self.len, Some(self.len)) + } } impl<'rb, T: 'rb, RB: RingBufferExt> DoubleEndedIterator for RingBufferIterator<'rb, T, RB> { From 7de59fcfb7f22ed88d1e79fc8185bbb56e20fa8b Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Sun, 11 Apr 2021 11:35:36 -0400 Subject: [PATCH 3/4] Iterator: Implement FusedIterator --- src/ringbuffer_trait.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ringbuffer_trait.rs b/src/ringbuffer_trait.rs index 4f4a812..595d086 100644 --- a/src/ringbuffer_trait.rs +++ b/src/ringbuffer_trait.rs @@ -238,6 +238,8 @@ mod iter { } } + impl<'rb, T: 'rb, RB: RingBufferExt> core::iter::FusedIterator for RingBufferIterator<'rb, T, RB> { } + impl<'rb, T: 'rb, RB: RingBufferExt> DoubleEndedIterator for RingBufferIterator<'rb, T, RB> { #[inline] fn next_back(&mut self) -> Option { From eb8ace3f8e0d54965169316c607807508a94c245 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Sun, 11 Apr 2021 11:38:18 -0400 Subject: [PATCH 4/4] Iterator: Implement FusedIterator and ExactSizeIterator --- src/ringbuffer_trait.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ringbuffer_trait.rs b/src/ringbuffer_trait.rs index 595d086..877ea81 100644 --- a/src/ringbuffer_trait.rs +++ b/src/ringbuffer_trait.rs @@ -197,6 +197,7 @@ 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. @@ -238,7 +239,9 @@ mod iter { } } - impl<'rb, T: 'rb, RB: RingBufferExt> core::iter::FusedIterator for RingBufferIterator<'rb, T, RB> { } + 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]