pub(crate) mod lockfree;
pub mod spmc;
pub mod mpsc;
#[derive(Debug, Eq, thiserror::Error, PartialOrd, PartialEq)]
pub enum QueueError<T> {
#[error("The queue is empty")]
Empty,
#[error("The queue is full, it contain {1} items")]
Full(T, usize),
#[error("Can't retrieve the element {0}")]
Retrieve(usize),
}
pub trait QueueChecker<P> {
fn is_empty(&self) -> bool;
fn is_full(&self) -> bool;
fn len(&self) -> P;
fn max_capacity(&self) -> P;
}
macro_rules! impl_queue_checker {
( $p:ty ) => {
fn is_empty(&self) -> bool {
self.get_head() == self.get_tail()
}
fn is_full(&self) -> bool {
(self.get_tail() + 1) % (N as $p) == self.get_head()
}
fn len(&self) -> $p {
let head = self.get_head();
let tail = self.get_tail();
if tail >= head {
tail - head
} else {
(self.max_capacity() - head) + tail
}
}
fn max_capacity(&self) -> $p {
N as $p
}
};
}
pub(crate) use impl_queue_checker;
#[macro_export]
macro_rules! id_in_queue {
( $id:ident, $head:ident, $tail:ident ) => {
($head > $tail && ($id >= $head || $id < $tail)) || ($id >= $head && $id < $tail)
};
}
pub use id_in_queue;