use crate::{DataCollection, NotEnoughElements, NotEnoughSpace};
#[doc = crate::_tags!(data_structure)]
#[doc = crate::_doc_location!("data/layout/queue")]
pub trait DataQueue: DataCollection {
fn queue_pop(&mut self) -> Result<<Self as DataCollection>::Element, NotEnoughElements>;
fn queue_push(
&mut self,
element: <Self as DataCollection>::Element,
) -> Result<(), NotEnoughSpace>;
}
#[doc = crate::_tags!(data_structure)]
#[doc = crate::_doc_location!("data/layout/queue")]
pub trait DataDeque: DataQueue {
fn queue_pop_back(&mut self) -> Result<<Self as DataCollection>::Element, NotEnoughElements>;
fn queue_push_front(
&mut self,
element: <Self as DataCollection>::Element,
) -> Result<(), NotEnoughSpace>;
fn queue_pop_front(&mut self) -> Result<<Self as DataCollection>::Element, NotEnoughElements> {
self.queue_pop()
}
fn queue_push_back(
&mut self,
element: <Self as DataCollection>::Element,
) -> Result<(), NotEnoughSpace> {
self.queue_push(element)
}
}
#[cfg(feature = "alloc")]
impl<T> DataQueue for crate::VecDeque<T> {
fn queue_pop(&mut self) -> Result<<Self as DataCollection>::Element, NotEnoughElements> {
self.pop_front().ok_or(NotEnoughElements(Some(1)))
}
fn queue_push(
&mut self,
element: <Self as DataCollection>::Element,
) -> Result<(), NotEnoughSpace> {
self.push_back(element);
Ok(())
}
}
#[cfg(feature = "alloc")]
impl<T> DataDeque for crate::VecDeque<T> {
fn queue_pop_back(&mut self) -> Result<<Self as DataCollection>::Element, NotEnoughElements> {
self.pop_back().ok_or(NotEnoughElements(Some(1)))
}
fn queue_push_front(
&mut self,
element: <Self as DataCollection>::Element,
) -> Result<(), NotEnoughSpace> {
self.push_front(element);
Ok(())
}
}