msg_tool\ext/
atomic.rs

1//!Extensions for atomic operations.
2use std::sync::atomic::Ordering;
3
4/// A trait to help to load and store atomic value quickly.
5pub trait AtomicQuick<T> {
6    /// Loads a value from the atomic integer in [Ordering::SeqCst] mode.
7    fn qload(&self) -> T;
8    /// Stores a value into the atomic integer in [Ordering::SeqCst] mode.
9    fn qstore(&self, value: T);
10    #[inline]
11    /// Stores a value into the atomic integer in [Ordering::SeqCst] mode.
12    /// Alias for [Self::qstore]
13    fn qsave(&self, value: T) {
14        self.qstore(value)
15    }
16}
17
18macro_rules! impl_atomic_quick_with_atomic {
19    ($type1:ty, $type2:ty) => {
20        impl AtomicQuick<$type2> for $type1 {
21            #[inline]
22            fn qload(&self) -> $type2 {
23                self.load(Ordering::SeqCst)
24            }
25            #[inline]
26            fn qstore(&self, value: $type2) {
27                self.store(value, Ordering::SeqCst)
28            }
29        }
30    };
31}
32
33impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicBool, bool);
34impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicI8, i8);
35impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicU8, u8);
36impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicI16, i16);
37impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicU16, u16);
38impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicI32, i32);
39impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicU32, u32);
40impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicI64, i64);
41impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicU64, u64);
42impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicIsize, isize);
43impl_atomic_quick_with_atomic!(std::sync::atomic::AtomicUsize, usize);