Skip to main content

wiwi_memory_usage/impls/
atomic.rs

1use crate::macros::{ impl_memory_usage_static, impl_memory_usage_size_of };
2use core::sync::atomic::*;
3
4// todo generic atomic when its stable
5
6#[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}