use crate::{list::Array, mem::Storage};
#[cfg(feature = "alloc")]
use crate::mem::Boxed;
mod data;
mod impls;
mod methods;
pub use data::DataQueue;
pub struct Queue<T, S: Storage, const CAP: usize> {
pub(crate) array: Array<T, S, CAP>,
pub(crate) len: usize,
pub(crate) front: usize,
pub(crate) back: usize,
}
pub type DirectQueue<T, const CAP: usize> = Queue<T, (), CAP>;
#[cfg(feature = "alloc")]
#[cfg_attr(feature = "nightly", doc(cfg(feature = "alloc")))]
pub type BoxedQueue<T, const CAP: usize> = Queue<T, Boxed, CAP>;
pub struct QueueIter<'s, T, S: Storage, const CAP: usize> {
queue: &'s Queue<T, S, CAP>,
idx: usize,
}
impl<'s, T, S: Storage, const CAP: usize> Iterator for QueueIter<'s, T, S, CAP> {
type Item = &'s T;
fn next(&mut self) -> Option<Self::Item> {
let item = if self.idx == self.queue.len() {
None
} else {
Some(&self.queue.array[self.queue.idx_front(self.idx)])
};
self.idx += 1;
item
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.queue.len(), Some(self.queue.len()))
}
}
impl<'s, T, S: Storage, const CAP: usize> ExactSizeIterator for QueueIter<'s, T, S, CAP> {}