use core::sync::atomic; use std::sync::Arc; use crate::syncx::AtomicT; #[derive(Debug)] pub struct AtomicRelaxed(pub T); impl AtomicRelaxed> { pub fn new(t: T) -> Self { Self(atomic_g::Atomic::new(t)) } pub fn get(&self) -> T { self.0.load(atomic::Ordering::Relaxed) } pub fn set(&self, t: T) { self.0.store(t, atomic::Ordering::Relaxed); } pub fn get_ordering(&self, ordering: atomic::Ordering) -> T { self.0.load(ordering) } pub fn set_ordering(&self, t: T, ordering: atomic::Ordering) { self.0.store(t, ordering); } } impl AtomicRelaxed { pub fn new(t: bool) -> Self { Self(atomic::AtomicBool::new(t)) } pub fn get(&self) -> bool { self.0.load(atomic::Ordering::Relaxed) } pub fn set(&self, t: bool) { self.0.store(t, atomic::Ordering::Relaxed); } pub fn get_ordering(&self, ordering: atomic::Ordering) -> bool { self.0.load(ordering) } pub fn set_ordering(&self, t: bool, ordering: atomic::Ordering) { self.0.store(t, ordering); } } macro_rules! std_atomic { ($t:ty,$v:ident) => { impl AtomicRelaxed<$t> { pub fn new(t: $v) -> Self { Self(<$t>::new(t)) } pub fn get(&self) -> $v { self.0.load(atomic::Ordering::Relaxed) } pub fn set(&self, t: $v) { self.0.store(t, atomic::Ordering::Relaxed); } pub fn get_ordering(&self, ordering: atomic::Ordering) -> $v { self.0.load(ordering) } pub fn set_ordering(&self, t: $v, ordering: atomic::Ordering) { self.0.store(t, ordering); } } }; } std_atomic!(atomic::AtomicI8, i8); std_atomic!(atomic::AtomicI16, i16); std_atomic!(atomic::AtomicI32, i32); std_atomic!(atomic::AtomicI64, i64); std_atomic!(atomic::AtomicIsize, isize); std_atomic!(atomic::AtomicU8, u8); std_atomic!(atomic::AtomicU16, u16); std_atomic!(atomic::AtomicU32, u32); std_atomic!(atomic::AtomicU64, u64); std_atomic!(atomic::AtomicUsize, usize); impl AtomicRelaxed> { pub fn new(t: *mut T) -> Self { Self(atomic::AtomicPtr::new(t)) } pub fn get(&self) -> *mut T { self.0.load(atomic::Ordering::Relaxed) } pub fn set(&self, t: *mut T) { self.0.store(t, atomic::Ordering::Relaxed); } pub fn get_ordering(&self, ordering: atomic::Ordering) -> *mut T { self.0.load(ordering) } pub fn set_ordering(&self, t: *mut T, ordering: atomic::Ordering) { self.0.store(t, ordering); } } impl AtomicRelaxed> { pub fn new(t: T) -> Self { Self(AtomicT::new(t)) } pub fn get(&self) -> Option> { self.0.load(atomic::Ordering::Relaxed) } pub fn set(&self, t: Arc) { self.0.replace(t, atomic::Ordering::Relaxed); } pub fn get_ordering(&self, ordering: atomic::Ordering) -> Option> { self.0.load(ordering) } pub fn set_ordering(&self, t: Arc, ordering: atomic::Ordering) { self.0.replace(t, ordering); } } #[cfg(test)] mod test { use crate::syncx::AtomicRelaxed; #[derive(Clone, Copy)] enum Status { None = 0, Ok = 1, } unsafe impl bytemuck::NoUninit for Status {} #[test] fn test() { let _ = AtomicRelaxed::>::new(Status::None); let _ = AtomicRelaxed::>::new(Status::Ok); } }