1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
#[derive(Debug, Clone, Eq, PartialEq, Hash)] pub struct RingBuffer<T> { elements: Vec<T>, pos: usize, } impl<T> RingBuffer<T> { pub fn new(size: usize) -> RingBuffer<T> { assert!(size > 0); RingBuffer { elements: Vec::with_capacity(size), pos: 0, } } #[inline] pub fn capacity(&self) -> usize { self.elements.capacity() } #[inline] pub fn len(&self) -> usize { self.elements.len() } #[inline] pub fn pos(&self) -> usize { self.pos } #[inline] pub fn next(&mut self) -> Option<&mut T> { let idx = self.advance(); let el = self.elements.get_mut(idx); el } #[inline] pub fn peek(&self) -> Option<&T> { self.elements.get(self.pos) } #[inline] pub fn peek_mut(&mut self) -> Option<&mut T> { self.elements.get_mut(self.pos) } #[inline] pub fn push(&mut self, mut v: T) -> Option<T> { if self.len() < self.capacity() { self.elements.push(v); self.advance(); None } else { std::mem::swap(&mut self.elements[self.pos], &mut v); self.advance(); Some(v) } } #[inline] fn advance(&mut self) -> usize { let old = self.pos; self.pos = (self.pos + 1) % self.len(); old } }