#![doc = include_str!("../README.md")]
#![cfg_attr(not(any(feature = "std", test)), no_std)]
#![deny(missing_docs)]
#![deny(clippy::missing_safety_doc, clippy::undocumented_unsafe_blocks)]
#![warn(unsafe_op_in_unsafe_fn)]
#[cfg(any(feature = "alloc", test))]
extern crate alloc;
#[cfg(any(feature = "std", test))]
extern crate std;
#[macro_use]
pub(crate) mod utils;
mod array;
pub mod core;
#[cfg(any(feature = "alloc", test))]
mod owned;
#[cfg(feature = "pool")]
mod pool;
mod sync;
#[cfg(test)]
mod tests;
#[cfg(feature = "pool")]
pub use array::PooledStaticQueue;
pub use array::StaticQueue;
#[cfg(all(any(feature = "alloc", test), feature = "pool"))]
pub use owned::PooledQueue;
#[cfg(any(feature = "alloc", test))]
pub use owned::Queue;
pub trait MPMCQueue {
type Item;
fn push(&self, item: Self::Item) -> Result<(), Self::Item>;
fn pop(&self) -> Option<Self::Item>;
fn len(&self) -> usize;
fn capacity(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn is_full(&self) -> bool {
self.len() == self.capacity()
}
fn force_push(&self, item: Self::Item) -> Option<Self::Item> {
let mut item_container = None;
self.force_push_and_do(item, |item| {
item_container.replace(item);
});
item_container
}
fn force_push_and_do<F>(&self, mut item: Self::Item, mut f: F)
where
F: FnMut(Self::Item),
{
let mut backoff = crate::utils::Backoff::new();
while let Err(item_) = self.push(item) {
item = item_;
backoff.backoff();
if let Some(next_popped_item) = self.pop() {
f(next_popped_item);
}
}
}
}