mkaudiolibrary 0.1.3

Modular audio processing library including MKAU plugin format based on Rust.
Documentation
///The buffer that pushes the whole buffer when index meets the size of the buffer.
#[derive(Clone)]
pub struct PushBuffer<T>
{
    buffer : Box<[T]>,
    pub index : usize
}
impl<T : Copy + PartialEq> PushBuffer<T>
{
    ///New PushBuffer with length.
    pub fn new(len : usize) -> Self
    {
        return PushBuffer { buffer : unsafe { Box::<[T]>::new_zeroed_slice(len).assume_init() }, index : 0, }
    }
    ///Pushes data to buffer.
    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;
        }
    }
    ///Returns the length of the buffer.
    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]; }
}

///Circular buffer or ring buffer. When index returns to 0 when index meets the size of the buffer.
#[derive(Clone)]
pub struct CircularBuffer<T>
{
    buffer : Box<[T]>,
    read : usize,
    write : usize
}
impl<T : Copy + PartialEq> CircularBuffer<T>
{
    ///New CircularBuffer with length.
    pub fn new(len : usize) -> Self
    {
        return CircularBuffer { buffer : unsafe { Box::<[T]>::new_zeroed_slice(len).assume_init() }, read : 0, write : 0 }
    }
    ///Pushes data to buffer.
    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; }
    }
    ///Reads next data of the buffer.
    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;
    }
    ///Initializes write index.
    pub fn init_write(& mut self, index : usize) { self.write = index; }
    ///Initializes read index.
    pub fn init_read(& mut self, index : usize) { self.write = index; }
    ///Returns the length of the buffer.
    pub fn len(& self) -> usize { return self.buffer.len(); }
}