rotext_core 0.2.0

The core (no_std) part of the official and de facto Rotext parser.
Documentation
pub struct ArrayQueue<const N: usize, T> {
    queue: [Option<T>; N],
    end: usize,
    length: usize,
}
impl<const N: usize, T> ArrayQueue<N, T> {
    pub fn new() -> Self {
        Self {
            queue: core::array::from_fn(|_| None),
            end: 0,
            length: 0,
        }
    }

    pub fn len(&self) -> usize {
        self.length
    }

    fn index(&self, index: usize) -> usize {
        (self.end + N - self.length + index) % N
    }

    pub fn get(&self, index: usize) -> Option<&T> {
        debug_assert!(index < self.length);
        self.queue[self.index(index)].as_ref()
    }

    pub fn push_back(&mut self, item: T) {
        self.length += 1;
        debug_assert!(self.length <= N);
        self.queue[self.end] = Some(item);
        self.end = (self.end + 1) % N;
    }

    pub fn pop_front(&mut self) -> Option<T> {
        if self.length == 0 {
            return None;
        }
        let item = self.queue[self.index(0)].take();
        self.length -= 1;
        Some(item.unwrap())
    }
}