1 use std::collections::VecDeque;
2 use std::ops::{Index, IndexMut};
3 
4 pub struct RingBuffer<T> {
5     data: VecDeque<T>,
6     // Abstract index of data[0] in infinitely sized queue
7     offset: usize,
8 }
9 
10 impl<T> RingBuffer<T> {
new() -> Self11     pub fn new() -> Self {
12         RingBuffer {
13             data: VecDeque::new(),
14             offset: 0,
15         }
16     }
17 
is_empty(&self) -> bool18     pub fn is_empty(&self) -> bool {
19         self.data.is_empty()
20     }
21 
len(&self) -> usize22     pub fn len(&self) -> usize {
23         self.data.len()
24     }
25 
push(&mut self, value: T) -> usize26     pub fn push(&mut self, value: T) -> usize {
27         let index = self.offset + self.data.len();
28         self.data.push_back(value);
29         index
30     }
31 
clear(&mut self)32     pub fn clear(&mut self) {
33         self.data.clear();
34     }
35 
index_of_first(&self) -> usize36     pub fn index_of_first(&self) -> usize {
37         self.offset
38     }
39 
first(&self) -> &T40     pub fn first(&self) -> &T {
41         &self.data[0]
42     }
43 
first_mut(&mut self) -> &mut T44     pub fn first_mut(&mut self) -> &mut T {
45         &mut self.data[0]
46     }
47 
pop_first(&mut self) -> T48     pub fn pop_first(&mut self) -> T {
49         self.offset += 1;
50         self.data.pop_front().unwrap()
51     }
52 
last(&self) -> &T53     pub fn last(&self) -> &T {
54         self.data.back().unwrap()
55     }
56 
last_mut(&mut self) -> &mut T57     pub fn last_mut(&mut self) -> &mut T {
58         self.data.back_mut().unwrap()
59     }
60 
second_last(&self) -> &T61     pub fn second_last(&self) -> &T {
62         &self.data[self.data.len() - 2]
63     }
64 
pop_last(&mut self)65     pub fn pop_last(&mut self) {
66         self.data.pop_back().unwrap();
67     }
68 }
69 
70 impl<T> Index<usize> for RingBuffer<T> {
71     type Output = T;
index(&self, index: usize) -> &Self::Output72     fn index(&self, index: usize) -> &Self::Output {
73         &self.data[index.checked_sub(self.offset).unwrap()]
74     }
75 }
76 
77 impl<T> IndexMut<usize> for RingBuffer<T> {
index_mut(&mut self, index: usize) -> &mut Self::Output78     fn index_mut(&mut self, index: usize) -> &mut Self::Output {
79         &mut self.data[index.checked_sub(self.offset).unwrap()]
80     }
81 }
82