generic_atomics/
atomic_integer.rs1use 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}