#![no_std]
#[derive(Debug, Clone, Copy)]
pub struct RotatingBuffer<T: Default + Copy, const S: usize> {
inner_length: usize,
pub inner: [T; S],
}
impl<T: Default + Copy, const S: usize> RotatingBuffer<T, S> {
pub fn new() -> RotatingBuffer<T, S> {
RotatingBuffer {
inner: [T::default(); S],
inner_length: 0,
}
}
pub fn as_slice(&self) -> &[T] {
&self.inner[..self.inner_length]
}
pub fn get_append_only(&mut self) -> &mut [T] {
&mut self.inner[self.inner_length..]
}
pub fn is_empty(&self) -> bool {
self.inner_length == 0
}
pub fn len(&self) -> usize {
self.inner_length
}
pub fn capacity(&self) -> usize {
S
}
pub fn resize(&mut self, new_len: usize) {
assert!(new_len <= S);
self.inner_length = new_len;
}
pub fn add_len(&mut self, new_len: usize) -> usize {
self.resize(self.inner_length + new_len);
self.inner_length
}
pub fn rotate_right_and_resize(&mut self, k: usize) {
self.inner[..self.inner_length].rotate_right(k);
self.inner_length = k;
}
pub fn rotate_right_and_resize_at(&mut self, index: usize) {
self.rotate_right_and_resize(self.inner_length - index);
}
}
impl<T: Default + Copy, const S: usize> Default for RotatingBuffer<T, S> {
fn default() -> Self {
Self::new()
}
}