Skip to main content

generic_atomics/
atomic_integer.rs

1use crate::{AtomicNumber, IntoAtomicNumber};
2use atomic_traits::{
3    fetch::{Add, Max, Min, Sub},
4    AsPtr, Atomic, Bitwise, NumOps,
5};
6use core::sync::atomic::Ordering::{self};
7use num_primitive::PrimitiveInteger;
8use num_traits::FromPrimitive;
9
10pub trait AtomicInteger<N>: Atomic<Type = N> + Bitwise + AsPtr + NumOps
11where
12    N: PrimitiveInteger,
13{
14}
15impl<AI, I> AtomicInteger<I> for AI
16where
17    AI: Atomic<Type = I> + Bitwise + AsPtr + NumOps,
18    I: PrimitiveInteger,
19{
20}
21
22pub trait IntoAtomicInteger:
23    IntoAtomicNumber<AN = Self::AI> + PrimitiveInteger + FromPrimitive
24{
25    type AI: AtomicInteger<Self>;
26    fn into_atomic_integer(self) -> impl AtomicInteger<Self> {
27        Self::AI::new(self)
28    }
29}
30
31impl<T, A> IntoAtomicInteger for T
32where
33    T: IntoAtomicNumber<AN = A> + PrimitiveInteger + FromPrimitive,
34    A: AtomicInteger<Self>,
35{
36    type AI = T::AN;
37}
38
39pub trait PrimitiveAtomicInteger: PrimitiveInteger + IntoAtomicInteger {}
40impl<T> PrimitiveAtomicInteger for T where T: PrimitiveInteger + IntoAtomicInteger {}
41
42impl<T> NumOps for AtomicNumber<T> where T: PrimitiveAtomicInteger + FromPrimitive {}
43impl<T> Add for AtomicNumber<T>
44where
45    T: PrimitiveAtomicInteger + FromPrimitive,
46{
47    type Type = T;
48
49    #[inline(always)]
50    fn fetch_add(&self, val: Self::Type, order: Ordering) -> Self::Type {
51        self.atomic.fetch_add(val, order)
52    }
53}
54
55impl<T> Sub for AtomicNumber<T>
56where
57    T: PrimitiveAtomicInteger + FromPrimitive,
58{
59    type Type = T;
60
61    #[inline(always)]
62    fn fetch_sub(&self, val: Self::Type, order: Ordering) -> Self::Type {
63        self.atomic.fetch_sub(val, order)
64    }
65}
66
67impl<T> Min for AtomicNumber<T>
68where
69    T: PrimitiveAtomicInteger + FromPrimitive,
70{
71    type Type = T;
72
73    #[inline(always)]
74    fn fetch_min(&self, val: Self::Type, order: Ordering) -> Self::Type {
75        self.atomic.fetch_min(val, order)
76    }
77}
78
79impl<T> Max for AtomicNumber<T>
80where
81    T: PrimitiveAtomicInteger + FromPrimitive,
82{
83    type Type = T;
84
85    #[inline]
86    fn fetch_max(&self, val: Self::Type, order: Ordering) -> T {
87        self.atomic.fetch_max(val, order)
88    }
89}