From 3ca4998ae9bbdc8d661dcc888beeef6b78f5d198 Mon Sep 17 00:00:00 2001 From: zeefaad Date: Thu, 11 Jun 2026 15:27:58 +0200 Subject: [PATCH] ring buffer --- src/utils/ring_buffer.rs | 78 ++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 19 deletions(-) diff --git a/src/utils/ring_buffer.rs b/src/utils/ring_buffer.rs index d28b714..67e29b8 100644 --- a/src/utils/ring_buffer.rs +++ b/src/utils/ring_buffer.rs @@ -1,38 +1,78 @@ -pub struct RingBuffer { +pub struct RingBuffer { pub data: Vec, + + // Index to next writing element pub head: usize, - pub tail: usize, - pub len: usize, + + // Actual size + pub size: usize, + + pub capacity: usize, } -impl RingBuffer { - fn new(capacity: usize) -> Self { - // TODO : add capacity to vec +impl RingBuffer { + pub fn new(capacity: usize) -> Self { + assert!(capacity != 0); Self { - data: Vec::new(), + data: vec![T::default(); capacity], head: 0, - tail: 0, - len: 0, + size: 0, + capacity, } } - fn push(&mut self, value: T) { - todo!(); + pub fn write(&mut self, value: T) { + self.data[self.head] = value; + self.head = (self.head + 1) % self.capacity; + self.size = (self.size + 1).min(self.capacity); } - fn pop(&mut self) -> bool { - todo!(); + pub fn read(&mut self) -> Option { + if self.size == 0 { + return None; + } + let tail = (self.head + self.capacity - self.size) % self.capacity; + self.size -= 1; + Some(self.data[tail]) } - fn is_empty(&self) -> bool { - todo!(); + pub fn peek(&self) -> Option<&T> { + if self.size == 0 { + return None; + } + let last = (self.head + self.capacity - 1) % self.capacity; + Some(&self.data[last]) } - fn is_full(&self) -> bool { - todo!(); + // Read N samples before + pub fn read_at(&self, delay: usize) -> Option<&T> { + if delay >= self.size { + return None; + } + let index = (self.head + self.capacity - 1 - delay) % self.capacity; + Some(&self.data[index]) } - fn len(&self) -> usize { - self.len + pub fn write_read(&mut self, value: T, delay: usize) -> Option { + let delayed = self.read_at(delay).copied(); + self.write(value); + delayed + } + + pub fn len(&self) -> usize { + self.size + } + + pub fn is_empty(&self) -> bool { + self.size == 0 + } + + pub fn is_full(&self) -> bool { + self.size == self.capacity + } + + pub fn clear(&mut self) { + self.head = 0; + self.size = 0; } }