const _: () = assert!(
usize::BITS >= 64,
"o3 requires a 64-bit target: capacities are u32 and index/layout math assumes usize >= u32"
);
pub mod buffer;
pub mod cell;
pub mod collections;
pub mod mem;
pub mod num;
use std::marker::PhantomData;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct ThreadBound(PhantomData<*mut ()>);
impl ThreadBound {
pub const NEW: Self = Self(PhantomData);
}
pub trait ReturnTo {
type Item;
fn return_item(&self, item: Self::Item);
}
#[must_use]
pub struct ReturnPermit<R: ReturnTo> {
item: Option<R::Item>,
sink: R,
}
impl<R: ReturnTo> ReturnPermit<R> {
pub fn new(sink: R, item: R::Item) -> Self {
Self {
item: Some(item),
sink,
}
}
}
impl<R: ReturnTo> Drop for ReturnPermit<R> {
fn drop(&mut self) {
if let Some(item) = self.item.take() {
self.sink.return_item(item);
}
}
}