use crate::{ConstInit, Event, is, whilst};
#[doc = crate::_tags!(event data_structure)]
#[doc = crate::_doc_location!("ui/event")]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct EventQueue<const CAP: usize> {
slots: [Option<Event>; CAP],
}
impl<const CAP: usize> ConstInit for EventQueue<CAP> {
const INIT: Self = Self::new();
}
impl<const CAP: usize> Default for EventQueue<CAP> {
fn default() -> Self {
Self::new()
}
}
impl<const CAP: usize> EventQueue<CAP> {
pub const fn new() -> Self {
Self { slots: [const { None }; CAP] }
}
pub fn push(&mut self, ev: Event) -> bool {
whilst! { i in 0..CAP; {
if self.slots[i].is_none() { self.slots[i] = Some(ev); return true; }
}}
false
}
pub fn pop(&mut self) -> Option<Event> {
let first = self.slots[0].take()?;
whilst! { i in 1..CAP; { self.slots[i - 1] = self.slots[i].take(); }}
Some(first)
}
pub const fn len(&self) -> usize {
let mut len = 0;
whilst! { i in 0..CAP; {
is![self.slots[i].is_none(), return len, len += 1];
}}
len
}
pub const fn capacity(&self) -> usize {
CAP
}
pub const fn remaining_capacity(&self) -> usize {
CAP - self.len()
}
pub const fn is_empty(&self) -> bool {
self.slots[0].is_none() }
pub const fn is_full(&self) -> bool {
self.slots[CAP - 1].is_some() }
pub fn clear(&mut self) {
whilst! { i in 0..CAP; { self.slots[i] = None; } }
}
}