atomic_primitive/
integer.rs1use core::sync::atomic::Ordering;
2
3use crate::PrimitiveAtomic;
4
5pub trait PrimitiveAtomicInteger: PrimitiveAtomic {
19 const BITS: u32;
21
22 fn fetch_add(&self, val: Self::Value, order: Ordering) -> Self::Value;
24
25 fn fetch_sub(&self, val: Self::Value, order: Ordering) -> Self::Value;
27
28 fn fetch_max(&self, val: Self::Value, order: Ordering) -> Self::Value;
30
31 fn fetch_min(&self, val: Self::Value, order: Ordering) -> Self::Value;
33}
34
35macro_rules! impl_primitive_atomic_integer {
36 ($Atomic:ty, $bits:expr) => {
37 impl PrimitiveAtomicInteger for $Atomic {
38 const BITS: u32 = $bits;
39
40 forward! {
41 fn fetch_add(&self, val: Self::Value, order: Ordering) -> Self::Value;
42 fn fetch_sub(&self, val: Self::Value, order: Ordering) -> Self::Value;
43 fn fetch_max(&self, val: Self::Value, order: Ordering) -> Self::Value;
44 fn fetch_min(&self, val: Self::Value, order: Ordering) -> Self::Value;
45 }
46 }
47 };
48}
49
50use core::sync::atomic::{
51 AtomicI8, AtomicI16, AtomicI32, AtomicIsize, AtomicU8, AtomicU16, AtomicU32, AtomicUsize,
52};
53#[cfg(target_has_atomic = "64")]
54use core::sync::atomic::{AtomicI64, AtomicU64};
55
56impl_primitive_atomic_integer!(AtomicU8, 8);
57impl_primitive_atomic_integer!(AtomicU16, 16);
58impl_primitive_atomic_integer!(AtomicU32, 32);
59impl_primitive_atomic_integer!(AtomicUsize, usize::BITS);
60impl_primitive_atomic_integer!(AtomicI8, 8);
61impl_primitive_atomic_integer!(AtomicI16, 16);
62impl_primitive_atomic_integer!(AtomicI32, 32);
63impl_primitive_atomic_integer!(AtomicIsize, isize::BITS);
64#[cfg(target_has_atomic = "64")]
65impl_primitive_atomic_integer!(AtomicU64, 64);
66#[cfg(target_has_atomic = "64")]
67impl_primitive_atomic_integer!(AtomicI64, 64);