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 { T }
50 AtomicPtr<T>
51 => size_of::<AtomicPtr<T>>();
52}
53
54impl_memory_usage_size_of! {
55 Ordering
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61 use crate::{
62 MemoryUsage as _,
63 MemoryUsageConst as _,
64 MemoryUsageStatic as _
65 };
66
67 #[test]
68 fn atomic_ordering_usage() {
69 let ordering = Ordering::Relaxed;
70
71 assert_eq!(ordering.memory_usage(), 1);
72 assert_eq!(ordering.memory_usage_const(), 1);
73 assert_eq!(Ordering::MEMORY_USAGE, 1);
74 }
75
76 macro_rules! test_atomic {
77 {
78 $(
79 #[$cfg:meta]
80 $test_name:ident($ty_atomic:path, $ty:ty)
81 )*
82 } => {
83 $(
84 #[$cfg]
85 #[test]
86 fn $test_name() {
87 let num_atomic: $ty_atomic = <$ty_atomic>::new(Default::default());
88 let num: $ty = Default::default();
89
90 assert_eq!(num_atomic.memory_usage(), num.memory_usage());
91 assert_eq!(num_atomic.memory_usage_const(), num.memory_usage_const());
92 assert_eq!(<$ty_atomic>::MEMORY_USAGE, <$ty>::MEMORY_USAGE);
93 }
94 )*
95 }
96 }
97
98 test_atomic! {
99 #[cfg(target_has_atomic = "8")]
100 atomic_u8_usage(AtomicU8, u8)
101 #[cfg(target_has_atomic = "16")]
102 atomic_u16_usage(AtomicU16, u16)
103 #[cfg(target_has_atomic = "32")]
104 atomic_u32_usage(AtomicU32, u32)
105 #[cfg(target_has_atomic = "64")]
106 atomic_u64_usage(AtomicU64, u64)
107 #[cfg(all(
108 target_has_atomic = "128",
109 feature = "nightly"
110 ))]
111 atomic_u128_usage(AtomicU128, u128)
112 #[cfg(target_has_atomic = "ptr")]
113 atomic_usize_usage(AtomicUsize, usize)
114
115 #[cfg(target_has_atomic = "8")]
116 atomic_i8_usage(AtomicI8, i8)
117 #[cfg(target_has_atomic = "16")]
118 atomic_i16_usage(AtomicI16, i16)
119 #[cfg(target_has_atomic = "32")]
120 atomic_i32_usage(AtomicI32, i32)
121 #[cfg(target_has_atomic = "64")]
122 atomic_i64_usage(AtomicI64, i64)
123 #[cfg(all(
124 target_has_atomic = "128",
125 feature = "nightly"
126 ))]
127 atomic_i128_usage(AtomicI128, i128)
128 #[cfg(target_has_atomic = "ptr")]
129 atomic_isize_usage(AtomicIsize, isize)
130
131 #[cfg(target_has_atomic = "8")]
132 atomic_bool_usage(AtomicBool, bool)
133 #[cfg(target_has_atomic = "ptr")]
134 atomic_ptr_usage(AtomicPtr<()>, *const ())
135 }
136}