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	{ 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}