renet 0.0.10

Server/Client network library for multiplayer games with authentication and connection management
Documentation
#[derive(Debug)]
pub struct CircularBuffer<const N: usize, T> {
    pub(crate) queue: [T; N],
    cursor: usize,
}

impl<const N: usize, T: Default + Copy> Default for CircularBuffer<N, T> {
    fn default() -> Self {
        Self {
            queue: [T::default(); N],
            cursor: 0,
        }
    }
}

impl<const N: usize, T: Default + Copy> CircularBuffer<N, T> {
    pub fn push(&mut self, value: T) {
        self.queue[self.cursor] = value;
        self.cursor = (self.cursor + 1) % N;
    }

    pub fn as_vec(&self) -> Vec<T> {
        let (end, start) = self.queue.split_at(self.cursor);
        let mut vec = Vec::with_capacity(N);
        vec.extend_from_slice(start);
        vec.extend_from_slice(end);

        vec
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn usage() {
        let mut buffer: CircularBuffer<3, usize> = CircularBuffer::default();
        assert_eq!(buffer.as_vec(), vec![0, 0, 0]);

        buffer.push(1);
        buffer.push(2);
        buffer.push(3);
        assert_eq!(buffer.as_vec(), vec![1, 2, 3]);

        buffer.push(4);
        buffer.push(5);
        assert_eq!(buffer.as_vec(), vec![3, 4, 5]);
    }
}