ring buffer
This commit is contained in:
@ -1,38 +1,78 @@
|
|||||||
pub struct RingBuffer<T> {
|
pub struct RingBuffer<T: Copy + Default> {
|
||||||
pub data: Vec<T>,
|
pub data: Vec<T>,
|
||||||
|
|
||||||
|
// Index to next writing element
|
||||||
pub head: usize,
|
pub head: usize,
|
||||||
pub tail: usize,
|
|
||||||
pub len: usize,
|
// Actual size
|
||||||
|
pub size: usize,
|
||||||
|
|
||||||
|
pub capacity: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> RingBuffer<T> {
|
impl<T: Copy + Default> RingBuffer<T> {
|
||||||
fn new(capacity: usize) -> Self {
|
pub fn new(capacity: usize) -> Self {
|
||||||
// TODO : add capacity to vec
|
assert!(capacity != 0);
|
||||||
Self {
|
Self {
|
||||||
data: Vec::new(),
|
data: vec![T::default(); capacity],
|
||||||
head: 0,
|
head: 0,
|
||||||
tail: 0,
|
size: 0,
|
||||||
len: 0,
|
capacity,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push(&mut self, value: T) {
|
pub fn write(&mut self, value: T) {
|
||||||
todo!();
|
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 {
|
pub fn read(&mut self) -> Option<T> {
|
||||||
todo!();
|
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 {
|
pub fn peek(&self) -> Option<&T> {
|
||||||
todo!();
|
if self.size == 0 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let last = (self.head + self.capacity - 1) % self.capacity;
|
||||||
|
Some(&self.data[last])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_full(&self) -> bool {
|
// Read N samples before
|
||||||
todo!();
|
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 {
|
pub fn write_read(&mut self, value: T, delay: usize) -> Option<T> {
|
||||||
self.len
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user