wiwi_memory_usage/impls/
atomic.rs1use crate::macros::{ impl_memory_usage_static, impl_memory_usage_size_of };
2use core::sync::atomic::*;
3
4#[cfg(target_has_atomic = "8")]
7impl_memory_usage_size_of! {
8 AtomicU8
9 AtomicI8
10 AtomicBool
11}
12
13#[cfg(target_has_atomic = "16")]
14impl_memory_usage_size_of! {
15 AtomicU16
16 AtomicI16
17}
18
19#[cfg(target_has_atomic = "32")]
20impl_memory_usage_size_of! {
21 AtomicU32
22 AtomicI32
23}
24
25#[cfg(target_has_atomic = "64")]
26impl_memory_usage_size_of! {
27 AtomicU64
28 AtomicI64
29}
30
31#[cfg(all(
32 target_has_atomic = "128",
33 feature = "nightly"
34))]
35impl_memory_usage_size_of! {
36 AtomicU128
37 AtomicI128
38}
39
40#[cfg(target_has_atomic = "ptr")]
41impl_memory_usage_size_of! {
42 AtomicUsize
43 AtomicIsize
44}
45
46#[cfg(target_has_atomic = "ptr")]
47impl_memory_usage_static! {
48 { T }
49 AtomicPtr<T>
50 => size_of::<AtomicPtr<T>>();
51}
52
53impl_memory_usage_size_of! {
54 Ordering
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60 use crate::{
61 MemoryUsage as _,
62 MemoryUsageStatic as _
63 };
64
65 #[test]
66 fn atomic_ordering_usage() {
67 let ordering = Ordering::Relaxed;
68
69 assert_eq!(ordering.memory_usage(), 1);
70 assert_eq!(Ordering::MEMORY_USAGE, 1);
71 }
72
73 macro_rules! test_atomic {
74 {
75 $(
76 #[$cfg:meta]
77 $test_name:ident($ty_atomic:path, $ty:ty)
78 )*
79 } => {
80 $(
81 #[$cfg]
82 #[test]
83 fn $test_name() {
84 let num_atomic: $ty_atomic = <$ty_atomic>::new(Default::default());
85 let num: $ty = Default::default();
86
87 assert_eq!(num_atomic.memory_usage(), num.memory_usage());
88 assert_eq!(<$ty_atomic>::MEMORY_USAGE, <$ty>::MEMORY_USAGE);
89 }
90 )*
91 }
92 }
93
94 test_atomic! {
95 #[cfg(target_has_atomic = "8")]
96 atomic_u8_usage(AtomicU8, u8)
97 #[cfg(target_has_atomic = "16")]
98 atomic_u16_usage(AtomicU16, u16)
99 #[cfg(target_has_atomic = "32")]
100 atomic_u32_usage(AtomicU32, u32)
101 #[cfg(target_has_atomic = "64")]
102 atomic_u64_usage(AtomicU64, u64)
103 #[cfg(all(
104 target_has_atomic = "128",
105 feature = "nightly"
106 ))]
107 atomic_u128_usage(AtomicU128, u128)
108 #[cfg(target_has_atomic = "ptr")]
109 atomic_usize_usage(AtomicUsize, usize)
110
111 #[cfg(target_has_atomic = "8")]
112 atomic_i8_usage(AtomicI8, i8)
113 #[cfg(target_has_atomic = "16")]
114 atomic_i16_usage(AtomicI16, i16)
115 #[cfg(target_has_atomic = "32")]
116 atomic_i32_usage(AtomicI32, i32)
117 #[cfg(target_has_atomic = "64")]
118 atomic_i64_usage(AtomicI64, i64)
119 #[cfg(all(
120 target_has_atomic = "128",
121 feature = "nightly"
122 ))]
123 atomic_i128_usage(AtomicI128, i128)
124 #[cfg(target_has_atomic = "ptr")]
125 atomic_isize_usage(AtomicIsize, isize)
126
127 #[cfg(target_has_atomic = "8")]
128 atomic_bool_usage(AtomicBool, bool)
129 #[cfg(target_has_atomic = "ptr")]
130 atomic_ptr_usage(AtomicPtr<()>, *const ())
131 }
132}