use core::sync::atomic::Ordering;
pub(crate) mod sealed {
pub trait Sealed {}
}
pub trait AtomicOrder: sealed::Sealed + Copy {
const LOAD: Ordering;
const STORE: Ordering;
const RMW: Ordering;
const FAILURE: Ordering;
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct Relaxed;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct AcqRel;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct SeqCst;
impl AtomicOrder for Relaxed {
const LOAD: Ordering = Ordering::Relaxed;
const STORE: Ordering = Ordering::Relaxed;
const RMW: Ordering = Ordering::Relaxed;
const FAILURE: Ordering = Ordering::Relaxed;
}
impl AtomicOrder for AcqRel {
const LOAD: Ordering = Ordering::Acquire;
const STORE: Ordering = Ordering::Release;
const RMW: Ordering = Ordering::AcqRel;
const FAILURE: Ordering = Ordering::Acquire;
}
impl AtomicOrder for SeqCst {
const LOAD: Ordering = Ordering::SeqCst;
const STORE: Ordering = Ordering::SeqCst;
const RMW: Ordering = Ordering::SeqCst;
const FAILURE: Ordering = Ordering::SeqCst;
}
impl sealed::Sealed for Relaxed {}
impl sealed::Sealed for AcqRel {}
impl sealed::Sealed for SeqCst {}