pub(crate) mod buffer;
pub(crate) mod packed;
pub(crate) mod queue;
pub(crate) mod slot;
pub use packed::{AsPackedValue, TruncatedU64};
pub mod slots {
use super::*;
use crate::utils::Sealed;
cfg_atomic_tagged64! {
pub use tagged64::*;
mod tagged64 {
use super::*;
pub struct Tagged64;
impl Sealed for Tagged64 {}
impl<T: AsPackedValue> SlotType<T> for Tagged64 {
type Slot = slot::Tagged64<T>;
}
}
}
cfg_atomic_tagged128! {
pub use tagged128::*;
mod tagged128 {
use super::*;
pub struct Tagged128;
impl Sealed for Tagged128 {}
impl<T: AsPackedValue> SlotType<T> for Tagged128 {
type Slot = slot::Tagged128<T>;
}
}
}
pub struct Auto;
impl Sealed for Auto {}
#[doc(hidden)]
pub trait SlotType<T: AsPackedValue>: Sealed {
#[allow(private_bounds)]
type Slot: slot::Slot<Item = T>;
}
impl<T: AsPackedValue> SlotType<T> for Auto {
#[cfg(all(not(target_has_atomic = "128"), target_has_atomic = "64"))]
type Slot = slot::Tagged64<T>;
#[cfg(any(
target_has_atomic = "128",
all(not(target_has_atomic = "64"), feature = "atomic-fallback")
))]
type Slot = slot::Tagged128<T>;
#[cfg(all(
not(target_has_atomic = "128"),
not(target_has_atomic = "64"),
not(feature = "atomic-fallback")
))]
compile_error!("target arch is currently not supported");
}
}