From 5d828d234efefb2dd42787148476ff6f04d2eb9c Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Mon, 28 Oct 2024 16:09:41 +0100 Subject: [PATCH] feat(ring buffer): implement `RingBuffer::iter_mut()` --- crates/matrix-sdk-common/src/ring_buffer.rs | 27 ++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/crates/matrix-sdk-common/src/ring_buffer.rs b/crates/matrix-sdk-common/src/ring_buffer.rs index 8b3bbcff1..e92e7f5bc 100644 --- a/crates/matrix-sdk-common/src/ring_buffer.rs +++ b/crates/matrix-sdk-common/src/ring_buffer.rs @@ -14,7 +14,7 @@ use std::{ collections::{ - vec_deque::{Drain, Iter}, + vec_deque::{Drain, Iter, IterMut}, VecDeque, }, num::NonZeroUsize, @@ -88,6 +88,13 @@ impl RingBuffer { self.inner.iter() } + /// Returns a mutable iterator that provides elements in front-to-back + /// order, i.e. the same order you would get if you repeatedly called + /// pop(). + pub fn iter_mut(&mut self) -> IterMut<'_, T> { + self.inner.iter_mut() + } + /// Returns an iterator that drains its items. pub fn drain(&mut self, range: R) -> Drain<'_, T> where @@ -221,6 +228,24 @@ mod tests { assert_eq!(ring_buffer.remove(10), None); } + #[test] + fn test_iter() { + let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(5).unwrap()); + + ring_buffer.push(1); + ring_buffer.push(2); + ring_buffer.push(3); + + let as_vec = ring_buffer.iter().copied().collect::>(); + assert_eq!(as_vec, [1, 2, 3]); + + let first_entry = ring_buffer.iter_mut().next().unwrap(); + *first_entry = 42; + + let as_vec = ring_buffer.iter().copied().collect::>(); + assert_eq!(as_vec, [42, 2, 3]); + } + #[test] fn test_drain() { let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(5).unwrap());