1use std::{
16 collections::{
17 vec_deque::{Drain, Iter, IterMut},
18 VecDeque,
19 },
20 num::NonZeroUsize,
21 ops::RangeBounds,
22};
23
24use serde::{Deserialize, Serialize};
25
26#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
31#[serde(transparent)]
32pub struct RingBuffer<T> {
33 inner: VecDeque<T>,
34}
35
36impl<T> RingBuffer<T> {
37 pub fn new(size: NonZeroUsize) -> Self {
40 Self { inner: VecDeque::with_capacity(size.into()) }
41 }
42
43 pub fn len(&self) -> usize {
48 self.inner.len()
49 }
50
51 pub fn is_empty(&self) -> bool {
53 self.inner.is_empty()
54 }
55
56 pub fn get(&self, index: usize) -> Option<&T> {
61 self.inner.get(index)
62 }
63
64 pub fn push(&mut self, value: T) {
66 if self.inner.len() == self.inner.capacity() {
67 self.inner.pop_front();
68 }
69
70 self.inner.push_back(value);
71 }
72
73 pub fn pop(&mut self) -> Option<T> {
76 self.inner.pop_front()
77 }
78
79 pub fn remove(&mut self, index: usize) -> Option<T> {
82 self.inner.remove(index)
83 }
84
85 pub fn iter(&self) -> Iter<'_, T> {
88 self.inner.iter()
89 }
90
91 pub fn iter_mut(&mut self) -> IterMut<'_, T> {
95 self.inner.iter_mut()
96 }
97
98 pub fn drain<R>(&mut self, range: R) -> Drain<'_, T>
100 where
101 R: RangeBounds<usize>,
102 {
103 self.inner.drain(range)
104 }
105
106 pub fn clear(&mut self) {
109 self.inner.clear();
110 }
111
112 pub fn capacity(&self) -> usize {
114 self.inner.capacity()
115 }
116
117 pub fn retain<F>(&mut self, predicate: F)
119 where
120 F: FnMut(&T) -> bool,
121 {
122 self.inner.retain(predicate)
123 }
124}
125
126impl<U> Extend<U> for RingBuffer<U> {
127 fn extend<T: IntoIterator<Item = U>>(&mut self, iter: T) {
128 for item in iter.into_iter() {
129 self.push(item);
130 }
131 }
132}
133
134#[cfg(test)]
135mod tests {
136 use std::{num::NonZeroUsize, ops::Not};
137
138 use super::RingBuffer;
139
140 #[test]
141 pub fn test_fixed_size() {
142 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(5).unwrap());
143
144 assert!(ring_buffer.is_empty());
145
146 ring_buffer.push(1);
147 ring_buffer.push(2);
148 ring_buffer.push(3);
149
150 assert!(ring_buffer.is_empty().not());
151
152 assert_eq!(ring_buffer.get(0), Some(&1));
153 assert_eq!(ring_buffer.get(1), Some(&2));
154 assert_eq!(ring_buffer.get(2), Some(&3));
155
156 ring_buffer.push(4);
157 ring_buffer.push(5);
158
159 assert_eq!(ring_buffer.get(0), Some(&1));
160 assert_eq!(ring_buffer.get(1), Some(&2));
161 assert_eq!(ring_buffer.get(2), Some(&3));
162 assert_eq!(ring_buffer.get(3), Some(&4));
163 assert_eq!(ring_buffer.get(4), Some(&5));
164
165 ring_buffer.push(6);
166
167 assert_eq!(ring_buffer.get(0), Some(&2));
168 assert_eq!(ring_buffer.get(1), Some(&3));
169 assert_eq!(ring_buffer.get(2), Some(&4));
170 assert_eq!(ring_buffer.get(3), Some(&5));
171 assert_eq!(ring_buffer.get(4), Some(&6));
172 }
173
174 #[test]
175 pub fn test_push_and_pop_and_remove_and_length() {
176 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(3).unwrap());
177
178 ring_buffer.push(1);
179 assert_eq!(ring_buffer.len(), 1);
180
181 ring_buffer.push(2);
182 assert_eq!(ring_buffer.len(), 2);
183
184 ring_buffer.push(3);
185 assert_eq!(ring_buffer.len(), 3);
186
187 assert_eq!(ring_buffer.pop(), Some(1));
188 assert_eq!(ring_buffer.len(), 2);
189 assert_eq!(ring_buffer.get(0), Some(&2));
190 assert_eq!(ring_buffer.get(1), Some(&3));
191 assert_eq!(ring_buffer.get(2), None);
192
193 assert_eq!(ring_buffer.pop(), Some(2));
194 assert_eq!(ring_buffer.len(), 1);
195 assert_eq!(ring_buffer.get(0), Some(&3));
196 assert_eq!(ring_buffer.get(1), None);
197 assert_eq!(ring_buffer.get(2), None);
198
199 assert_eq!(ring_buffer.pop(), Some(3));
200 assert_eq!(ring_buffer.len(), 0);
201 assert_eq!(ring_buffer.get(0), None);
202 assert_eq!(ring_buffer.get(1), None);
203 assert_eq!(ring_buffer.get(2), None);
204
205 assert_eq!(ring_buffer.pop(), None);
206
207 ring_buffer.push(1);
208 ring_buffer.push(2);
209 ring_buffer.push(3);
210 assert_eq!(ring_buffer.len(), 3);
211 assert_eq!(ring_buffer.get(0), Some(&1));
212 assert_eq!(ring_buffer.get(1), Some(&2));
213 assert_eq!(ring_buffer.get(2), Some(&3));
214
215 assert_eq!(ring_buffer.remove(1), Some(2));
216 assert_eq!(ring_buffer.len(), 2);
217 assert_eq!(ring_buffer.get(0), Some(&1));
218 assert_eq!(ring_buffer.get(1), Some(&3));
219 assert_eq!(ring_buffer.get(2), None);
220
221 assert_eq!(ring_buffer.remove(0), Some(1));
222 assert_eq!(ring_buffer.len(), 1);
223 assert_eq!(ring_buffer.get(0), Some(&3));
224 assert_eq!(ring_buffer.get(1), None);
225 assert_eq!(ring_buffer.get(2), None);
226
227 assert_eq!(ring_buffer.remove(1), None);
228 assert_eq!(ring_buffer.remove(10), None);
229 }
230
231 #[test]
232 fn test_iter() {
233 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(5).unwrap());
234
235 ring_buffer.push(1);
236 ring_buffer.push(2);
237 ring_buffer.push(3);
238
239 let as_vec = ring_buffer.iter().copied().collect::<Vec<_>>();
240 assert_eq!(as_vec, [1, 2, 3]);
241
242 let first_entry = ring_buffer.iter_mut().next().unwrap();
243 *first_entry = 42;
244
245 let as_vec = ring_buffer.iter().copied().collect::<Vec<_>>();
246 assert_eq!(as_vec, [42, 2, 3]);
247 }
248
249 #[test]
250 fn test_drain() {
251 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(5).unwrap());
252
253 ring_buffer.push(1);
254 ring_buffer.push(2);
255 ring_buffer.push(3);
256 ring_buffer.push(4);
257 ring_buffer.push(5);
258
259 let drained = ring_buffer.drain(0..=2).collect::<Vec<_>>();
260 let left = ring_buffer.iter().map(ToOwned::to_owned).collect::<Vec<_>>();
261
262 assert_eq!(drained, &[1, 2, 3]);
263 assert_eq!(left, &[4, 5]);
264
265 ring_buffer.drain(..);
266
267 assert!(ring_buffer.is_empty());
268 }
269
270 #[test]
271 fn test_clear_on_empty_buffer_is_a_noop() {
272 let mut ring_buffer: RingBuffer<u8> = RingBuffer::new(NonZeroUsize::new(3).unwrap());
273 ring_buffer.clear();
274 assert_eq!(ring_buffer.len(), 0);
275 }
276
277 #[test]
278 fn test_clear_removes_all_items() {
279 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(3).unwrap());
281 ring_buffer.push(4);
282 ring_buffer.push(5);
283 ring_buffer.push(6);
284 ring_buffer.pop();
285 assert_eq!(ring_buffer.len(), 2);
287
288 ring_buffer.clear();
290
291 assert_eq!(ring_buffer.len(), 0);
293 assert_eq!(ring_buffer.get(0), None);
294 assert_eq!(ring_buffer.pop(), None);
295 }
296
297 #[test]
298 fn test_clear_does_not_affect_capacity() {
299 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(3).unwrap());
301 ring_buffer.push(4);
302 ring_buffer.push(5);
303 ring_buffer.push(6);
304 ring_buffer.pop();
305 assert_eq!(ring_buffer.capacity(), 3);
307
308 ring_buffer.clear();
310
311 assert_eq!(ring_buffer.capacity(), 3);
313 }
314
315 #[test]
316 fn test_capacity_is_what_we_passed_to_new() {
317 let ring_buffer = RingBuffer::<i32>::new(NonZeroUsize::new(13).unwrap());
319 assert_eq!(ring_buffer.capacity(), 13);
321 }
322
323 #[test]
324 fn test_capacity_is_not_affected_by_overflowing() {
325 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(3).unwrap());
327 ring_buffer.push(4);
328 ring_buffer.push(5);
329 ring_buffer.push(6);
330 ring_buffer.push(7);
331 ring_buffer.pop();
332 ring_buffer.push(8);
333 ring_buffer.push(9);
334
335 assert_eq!(ring_buffer.capacity(), 3);
337
338 ring_buffer.extend(vec![10, 11, 12, 13, 14, 15]);
340
341 assert_eq!(ring_buffer.capacity(), 3);
343 }
344
345 #[test]
346 fn test_roundtrip_serialization() {
347 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(3).unwrap());
349 ring_buffer.push("1".to_owned());
350 ring_buffer.push("2".to_owned());
351
352 let json = serde_json::to_string(&ring_buffer).expect("serialisation failed");
354 assert_eq!(json, r#"["1","2"]"#);
356
357 let new_ring_buffer: RingBuffer<String> =
359 serde_json::from_str(&json).expect("deserialisation failed");
360
361 assert_eq!(ring_buffer, new_ring_buffer);
363 }
364
365 #[test]
366 fn test_extending_an_empty_ringbuffer_adds_the_items() {
367 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(5).unwrap());
369
370 ring_buffer.extend(vec!["a".to_owned(), "b".to_owned()]);
372
373 assert_eq!(ring_buffer.iter().map(String::as_str).collect::<Vec<_>>(), vec!["a", "b"]);
375 }
376
377 #[test]
378 fn test_extend_adds_items_to_the_end() {
379 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(5).unwrap());
381 ring_buffer.push("1".to_owned());
382 ring_buffer.push("2".to_owned());
383
384 ring_buffer.extend(vec!["3".to_owned(), "4".to_owned()]);
386
387 assert_eq!(
389 ring_buffer.iter().map(String::as_str).collect::<Vec<_>>(),
390 vec!["1", "2", "3", "4"]
391 );
392 }
393
394 #[test]
395 fn test_extend_does_not_overflow_max_length() {
396 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(5).unwrap());
398 ring_buffer.push("1".to_owned());
399 ring_buffer.push("2".to_owned());
400
401 ring_buffer.extend(vec![
403 "3".to_owned(),
404 "4".to_owned(),
405 "5".to_owned(),
406 "6".to_owned(),
407 "7".to_owned(),
408 ]);
409
410 assert_eq!(
412 ring_buffer.iter().map(String::as_str).collect::<Vec<_>>(),
413 vec!["3", "4", "5", "6", "7"]
414 );
415 }
416
417 #[test]
418 fn test_extending_a_full_ringbuffer_preserves_max_length() {
419 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(2).unwrap());
421 ring_buffer.push("1".to_owned());
422 ring_buffer.push("2".to_owned());
423
424 ring_buffer.extend(vec![
426 "3".to_owned(),
427 "4".to_owned(),
428 "5".to_owned(),
429 "6".to_owned(),
430 "7".to_owned(),
431 ]);
432
433 assert_eq!(ring_buffer.iter().map(String::as_str).collect::<Vec<_>>(), vec!["6", "7"]);
435 }
436
437 #[test]
438 fn test_retain() {
439 let mut ring_buffer = RingBuffer::new(NonZeroUsize::new(2).unwrap());
440 ring_buffer.push(1);
441 ring_buffer.push(2);
442
443 ring_buffer.retain(|v| v % 2 == 0);
444
445 assert_eq!(ring_buffer.len(), 1);
446 assert_eq!(ring_buffer.get(0).copied().unwrap(), 2);
447 }
448}