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(
any(target_has_atomic = "64", feature = "atomic-fallback"),
not(any(target_has_atomic = "128", feature = "atomic-fallback"))
))]
type Slot = slot::Tagged64<T>;
#[cfg(any(target_has_atomic = "128", feature = "atomic-fallback"))]
type Slot = slot::Tagged128<T>;
#[cfg(all(
not(any(target_has_atomic = "64", feature = "atomic-fallback")),
not(target_has_atomic = "128")
))]
compile_error!("target arch is currently not supported");
}
}