use crate::{list::Array, mem::Storage};
#[cfg(feature = "alloc")]
use crate::mem::Boxed;
mod data;
mod impls;
mod methods;
pub use data::DataDeque;
pub struct Deque<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 DirectDeque<T, const CAP: usize> = Deque<T, (), CAP>;
#[cfg(feature = "alloc")]
#[cfg_attr(feature = "nightly", doc(cfg(feature = "alloc")))]
pub type BoxedDeque<T, const CAP: usize> = Deque<T, Boxed, CAP>;
pub struct DequeIter<'s, T, S: Storage, const CAP: usize> {
deque: &'s Deque<T, S, CAP>,
idx: usize,
}
impl<'s, T, S: Storage, const CAP: usize> Iterator for DequeIter<'s, T, S, CAP> {
type Item = &'s T;
fn next(&mut self) -> Option<Self::Item> {
let item = if self.idx == self.deque.len() {
None
} else {
Some(&self.deque.array[self.deque.idx_front(self.idx)])
};
self.idx += 1;
item
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.deque.len(), Some(self.deque.len()))
}
}
impl<'s, T, S: Storage, const CAP: usize> ExactSizeIterator for DequeIter<'s, T, S, CAP> {}
impl<'s, T, S: Storage, const CAP: usize> DoubleEndedIterator for DequeIter<'s, T, S, CAP> {
fn next_back(&mut self) -> Option<Self::Item> {
let item = if self.idx == self.deque.len() {
None
} else {
Some(&self.deque.array[self.deque.idx_back(self.idx)])
};
self.idx += 1;
item
}
}