#[derive(Clone)]
pub struct PushBuffer<T>
{
buffer : Box<[T]>,
pub index : usize
}
impl<T : Copy + PartialEq> PushBuffer<T>
{
pub fn new(len : usize) -> Self
{
return PushBuffer { buffer : unsafe { Box::<[T]>::new_zeroed_slice(len).assume_init() }, index : 0, }
}
pub fn push(& mut self, value : T)
{
if self.index <= self.buffer.len()
{
self.buffer[self.index] = value;
self.index += 1;
}
else
{
(1..self.buffer.len()).for_each(|x| self.buffer[x - 1] = self.buffer[x]);
self.buffer[self.buffer.len()] = value;
}
}
pub fn len(& self) -> usize { return self.buffer.len(); }
}
impl<T> std::ops::Index<usize> for PushBuffer<T>
{
type Output = T;
fn index(&self, index: usize) -> & Self::Output { return & self.buffer[index]; }
}
impl<T> std::ops::IndexMut<usize> for PushBuffer<T>
{
fn index_mut(&mut self, index: usize) -> & mut Self::Output { return & mut self.buffer[index]; }
}
#[derive(Clone)]
pub struct CircularBuffer<T>
{
buffer : Box<[T]>,
read : usize,
write : usize
}
impl<T : Copy + PartialEq> CircularBuffer<T>
{
pub fn new(len : usize) -> Self
{
return CircularBuffer { buffer : unsafe { Box::<[T]>::new_zeroed_slice(len).assume_init() }, read : 0, write : 0 }
}
pub fn push(& mut self, value : T)
{
self.buffer[self.write] = value;
if self.write < self.buffer.len() { self.write += 1; } else { self.write = 0; }
}
pub fn next(& mut self) -> T
{
let value = self.buffer[self.read];
if self.write < self.buffer.len() { self.read += 1; } else { self.read = 0; }
return value;
}
pub fn init_write(& mut self, index : usize) { self.write = index; }
pub fn init_read(& mut self, index : usize) { self.write = index; }
pub fn len(& self) -> usize { return self.buffer.len(); }
}