/rust/registry/src/index.crates.io-1949cf8c6b5b557f/radium-0.7.0/src/lib.rs
Line | Count | Source |
1 | | //! `radium` provides a series of helpers for a uniform API over both atomic |
2 | | //! types like [`AtomicUsize`], and non-atomic types like [`Cell<T>`]. |
3 | | //! |
4 | | //! This crate is `#![no_std]`-compatible, and uses no non-core types. |
5 | | //! |
6 | | //! For details, see the documentation for [`Radium`]. |
7 | | //! |
8 | | //! The `types` module provides type names that are atomic where the target |
9 | | //! supports it, and fall back to `Cell` when the target does not. |
10 | | //! |
11 | | //! The `if_atomic!` macro provides a means of conditional compilation based on |
12 | | //! the presence of atomic instructions. It is a substitute for the |
13 | | //! `cfg(target_has_atomic)` or `cfg(accessible)` attribute tests, which are not |
14 | | //! yet stabilized. |
15 | | //! |
16 | | //! --- |
17 | | //! |
18 | | //! **@kneecaw** - <https://twitter.com/kneecaw/status/1132695060812849154> |
19 | | //! > Feelin' lazy: Has someone already written a helper trait abstracting |
20 | | //! > operations over `AtomicUsize` and `Cell<usize>` for generic code which may |
21 | | //! > not care about atomicity? |
22 | | //! |
23 | | //! **@ManishEarth** - <https://twitter.com/ManishEarth/status/1132706585300496384> |
24 | | //! > no but call the crate radium |
25 | | //! > |
26 | | //! > (since people didn't care that it was radioactive and used it in everything) |
27 | | //! |
28 | | //! [`AtomicUsize`]: core::sync::atomic::AtomicUsize |
29 | | //! [`Cell<T>`]: core::cell::Cell |
30 | | |
31 | | #![no_std] |
32 | | #![deny(unconditional_recursion)] |
33 | | |
34 | | #[macro_use] |
35 | | mod macros; |
36 | | |
37 | | pub mod types; |
38 | | |
39 | | use core::cell::Cell; |
40 | | use core::sync::atomic::Ordering; |
41 | | |
42 | | if_atomic! { |
43 | | if atomic(8) { |
44 | | use core::sync::atomic::{AtomicBool, AtomicI8, AtomicU8}; |
45 | | } |
46 | | if atomic(16) { |
47 | | use core::sync::atomic::{AtomicI16, AtomicU16}; |
48 | | } |
49 | | if atomic(32) { |
50 | | use core::sync::atomic::{AtomicI32, AtomicU32}; |
51 | | } |
52 | | if atomic(64) { |
53 | | use core::sync::atomic::{AtomicI64, AtomicU64}; |
54 | | } |
55 | | if atomic(ptr) { |
56 | | use core::sync::atomic::{AtomicIsize, AtomicPtr, AtomicUsize}; |
57 | | } |
58 | | } |
59 | | |
60 | | /// A maybe-atomic shared mutable fundamental type `T`. |
61 | | /// |
62 | | /// This trait is implemented by both the [atomic wrapper] type for `T`, and by |
63 | | /// [`Cell<T>`], providing a consistent interface for interacting with the two |
64 | | /// types. |
65 | | /// |
66 | | /// This trait provides methods predicated on marker traits for the underlying |
67 | | /// fundamental. Only types which can be viewed as sequences of bits may use the |
68 | | /// functions for bit-wise arithmetic, and only types which can be used as |
69 | | /// integers may use the functions for numeric arithmetic. Use of these methods |
70 | | /// on insufficient underlying types (for example, `Radium::fetch_and` on an |
71 | | /// atomic or cell-wrapped pointer) will cause a compiler error. |
72 | | /// |
73 | | /// [atomic wrapper]: core::sync::atomic |
74 | | /// [`Cell<T>`]: core::cell::Cell |
75 | | pub trait Radium { |
76 | | type Item; |
77 | | /// Creates a new value of this type. |
78 | | fn new(value: Self::Item) -> Self; |
79 | | |
80 | | /// If the underlying value is atomic, calls [`fence`] with the given |
81 | | /// [`Ordering`]. Otherwise, does nothing. |
82 | | /// |
83 | | /// [`Ordering`]: core::sync::atomic::Ordering |
84 | | /// [`fence`]: core::sync::atomic::fence |
85 | | fn fence(order: Ordering); |
86 | | |
87 | | /// Returns a mutable reference to the underlying value. |
88 | | /// |
89 | | /// This is safe because the mutable reference to `self` guarantees that no |
90 | | /// other references exist to this value. |
91 | | fn get_mut(&mut self) -> &mut Self::Item; |
92 | | |
93 | | /// Consumes the wrapper and returns the contained value. |
94 | | /// |
95 | | /// This is safe as passing by value ensures no other references exist. |
96 | | fn into_inner(self) -> Self::Item; |
97 | | |
98 | | /// Load a value from this object. |
99 | | /// |
100 | | /// Ordering values are ignored by non-atomic types. |
101 | | /// |
102 | | /// See also: [`AtomicUsize::load`]. |
103 | | /// |
104 | | /// [`AtomicUsize::load`]: core::sync::atomic::AtomicUsize::load |
105 | | fn load(&self, order: Ordering) -> Self::Item; |
106 | | |
107 | | /// Store a value in this object. |
108 | | /// |
109 | | /// Ordering arguments are ignored by non-atomic types. |
110 | | /// |
111 | | /// See also: [`AtomicUsize::store`]. |
112 | | /// |
113 | | /// [`AtomicUsize::store`]: core::sync::atomic::AtomicUsize::store |
114 | | fn store(&self, value: Self::Item, order: Ordering); |
115 | | |
116 | | /// Swap with the value stored in this object. |
117 | | /// |
118 | | /// Ordering arguments are ignored by non-atomic types. |
119 | | /// |
120 | | /// See also: [`AtomicUsize::swap`]. |
121 | | /// |
122 | | /// [`AtomicUsize::swap`]: core::sync::atomic::AtomicUsize::swap |
123 | | fn swap(&self, value: Self::Item, order: Ordering) -> Self::Item; |
124 | | |
125 | | /// Stores a value into this object if the currently-stored value is the |
126 | | /// same as the `current` value. |
127 | | /// |
128 | | /// The return value is always the previously-stored value. If it is equal to |
129 | | /// `current`, then the value was updated with `new`. |
130 | | /// |
131 | | /// Ordering arguments are ignored by non-atomic types. |
132 | | /// |
133 | | /// See also: [`AtomicUsize::compare_and_swap`]. |
134 | | /// |
135 | | /// [`AtomicUsize::compare_and_swap`]: core::sync::atomic::AtomicUsize::compare_and_swap |
136 | | #[deprecated = "Use `compare_exchange` or `compare_exchange_weak` instead"] |
137 | | fn compare_and_swap(&self, current: Self::Item, new: Self::Item, order: Ordering) |
138 | | -> Self::Item; |
139 | | |
140 | | /// Stores a value into this object if the currently-stored value is the |
141 | | /// same as the `current` value. |
142 | | /// |
143 | | /// The return value is a `Result` indicating whether the new value was |
144 | | /// written, and containing the previously-stored value. On success, this |
145 | | /// value is guaranteed to be equal to `current`. |
146 | | /// |
147 | | /// Ordering arguments are ignored by non-atomic types. |
148 | | /// |
149 | | /// See also: [`AtomicUsize::compare_exchange`]. |
150 | | /// |
151 | | /// [`AtomicUsize::compare_exchange`]: core::sync::atomic::AtomicUsize::compare_exchange |
152 | | fn compare_exchange( |
153 | | &self, |
154 | | current: Self::Item, |
155 | | new: Self::Item, |
156 | | success: Ordering, |
157 | | failure: Ordering, |
158 | | ) -> Result<Self::Item, Self::Item>; |
159 | | |
160 | | /// Stores a value into this object if the currently-stored value is the |
161 | | /// same as the `current` value. |
162 | | /// |
163 | | /// Unlike `compare_exchange`, this function is allowed to spuriously fail |
164 | | /// even when the comparison succeeds, which can result in more efficient |
165 | | /// code on some platforms. The return value is a `Result` indicating |
166 | | /// whether the new value was written, and containing the previously-stored |
167 | | /// value. |
168 | | /// |
169 | | /// Ordering arguments are ignored by non-atomic types. |
170 | | /// |
171 | | /// See also: [`AtomicUsize::compare_exchange_weak`]. |
172 | | /// |
173 | | /// [`AtomicUsize::compare_exchange_weak`]: core::sync::atomic::AtomicUsize::compare_exchange_weak |
174 | | fn compare_exchange_weak( |
175 | | &self, |
176 | | current: Self::Item, |
177 | | new: Self::Item, |
178 | | success: Ordering, |
179 | | failure: Ordering, |
180 | | ) -> Result<Self::Item, Self::Item>; |
181 | | |
182 | | /// Performs a bitwise "and" on the currently-stored value and the argument |
183 | | /// `value`, and stores the result in `self`. |
184 | | /// |
185 | | /// Returns the previously-stored value. |
186 | | /// |
187 | | /// Ordering arguments are ignored by non-atomic types. |
188 | | /// |
189 | | /// See also: [`AtomicUsize::fetch_and`]. |
190 | | /// |
191 | | /// [`AtomicUsize::fetch_and`]: core::sync::atomic::AtomicUsize::fetch_and |
192 | | fn fetch_and(&self, value: Self::Item, order: Ordering) -> Self::Item |
193 | | where |
194 | | Self::Item: marker::BitOps; |
195 | | |
196 | | /// Performs a bitwise "nand" on the currently-stored value and the argument |
197 | | /// `value`, and stores the result in `self`. |
198 | | /// |
199 | | /// Returns the previously-stored value. |
200 | | /// |
201 | | /// Ordering arguments are ignored by non-atomic types. |
202 | | /// |
203 | | /// See also: [`AtomicUsize::fetch_nand`]. |
204 | | /// |
205 | | /// [`AtomicUsize::fetch_nand`]: core::sync::atomic::AtomicUsize::fetch_nand |
206 | | fn fetch_nand(&self, value: Self::Item, order: Ordering) -> Self::Item |
207 | | where |
208 | | Self::Item: marker::BitOps; |
209 | | |
210 | | /// Performs a bitwise "or" on the currently-stored value and the argument |
211 | | /// `value`, and stores the result in `self`. |
212 | | /// |
213 | | /// Returns the previously-stored value. |
214 | | /// |
215 | | /// Ordering arguments are ignored by non-atomic types. |
216 | | /// |
217 | | /// See also: [`AtomicUsize::fetch_or`]. |
218 | | /// |
219 | | /// [`AtomicUsize::fetch_or`]: core::sync::atomic::AtomicUsize::fetch_or |
220 | | fn fetch_or(&self, value: Self::Item, order: Ordering) -> Self::Item |
221 | | where |
222 | | Self::Item: marker::BitOps; |
223 | | |
224 | | /// Performs a bitwise "xor" on the currently-stored value and the argument |
225 | | /// `value`, and stores the result in `self`. |
226 | | /// |
227 | | /// Returns the previously-stored value. |
228 | | /// |
229 | | /// Ordering arguments are ignored by non-atomic types. |
230 | | /// |
231 | | /// See also: [`AtomicUsize::fetch_xor`]. |
232 | | /// |
233 | | /// [`AtomicUsize::fetch_xor`]: core::sync::atomic::AtomicUsize::fetch_xor |
234 | | fn fetch_xor(&self, value: Self::Item, order: Ordering) -> Self::Item |
235 | | where |
236 | | Self::Item: marker::BitOps; |
237 | | |
238 | | /// Adds `value` to the currently-stored value, wrapping on overflow, and |
239 | | /// stores the result in `self`. |
240 | | /// |
241 | | /// Returns the previously-stored value. |
242 | | /// |
243 | | /// Ordering arguments are ignored by non-atomic types. |
244 | | /// |
245 | | /// See also: [`AtomicUsize::fetch_add`]. |
246 | | /// |
247 | | /// [`AtomicUsize::fetch_add`]: core::sync::atomic::AtomicUsize::fetch_add |
248 | | fn fetch_add(&self, value: Self::Item, order: Ordering) -> Self::Item |
249 | | where |
250 | | Self::Item: marker::NumericOps; |
251 | | |
252 | | /// Subtracts `value` from the currently-stored value, wrapping on |
253 | | /// underflow, and stores the result in `self`. |
254 | | /// |
255 | | /// Returns the previously-stored value. |
256 | | /// |
257 | | /// Ordering arguments are ignored by non-atomic types. |
258 | | /// |
259 | | /// See also: [`AtomicUsize::fetch_sub`]. |
260 | | /// |
261 | | /// [`AtomicUsize::fetch_sub`]: core::sync::atomic::AtomicUsize::fetch_sub |
262 | | fn fetch_sub(&self, value: Self::Item, order: Ordering) -> Self::Item |
263 | | where |
264 | | Self::Item: marker::NumericOps; |
265 | | |
266 | | /// Fetches the value, and applies a function to it that returns an |
267 | | /// optional new value. |
268 | | /// |
269 | | /// Note: This may call the function multiple times if the value has been |
270 | | /// changed from other threads in the meantime, as long as the function |
271 | | /// returns `Some(_)`, but the function will have been applied only once to |
272 | | /// the stored value. |
273 | | /// |
274 | | /// Returns a `Result` of `Ok(previous_value)` if the function returned |
275 | | /// `Some(_)`, else `Err(previous_value)`. |
276 | | /// |
277 | | /// Ordering arguments are ignored by non-atomic types. |
278 | | /// |
279 | | /// See also: [`AtomicUsize::fetch_update`]. |
280 | | /// |
281 | | /// [`AtomicUsize::fetch_update`]: core::sync::atomic::AtomicUsize::fetch_update |
282 | | fn fetch_update<F>( |
283 | | &self, |
284 | | set_order: Ordering, |
285 | | fetch_order: Ordering, |
286 | | f: F, |
287 | | ) -> Result<Self::Item, Self::Item> |
288 | | where |
289 | | F: FnMut(Self::Item) -> Option<Self::Item>; |
290 | | } |
291 | | |
292 | | /// Marker traits used by [`Radium`]. |
293 | | pub mod marker { |
294 | | /// Types supporting maybe-atomic bitwise operations. |
295 | | /// |
296 | | /// Types implementing this trait support the [`fetch_and`], [`fetch_nand`], |
297 | | /// [`fetch_or`], and [`fetch_xor`] maybe-atomic operations. |
298 | | /// |
299 | | /// [`fetch_and`]: crate::Radium::fetch_and |
300 | | /// [`fetch_nand`]: crate::Radium::fetch_nand |
301 | | /// [`fetch_or`]: crate::Radium::fetch_or |
302 | | /// [`fetch_xor`]: crate::Radium::fetch_xor |
303 | | /// |
304 | | /// `bool` and all integer fundamental types implement this. |
305 | | /// |
306 | | /// ```rust |
307 | | /// # use core::sync::atomic::*; |
308 | | /// # use radium::Radium; |
309 | | /// let num: AtomicUsize = AtomicUsize::new(0); |
310 | | /// Radium::fetch_or(&num, 2, Ordering::Relaxed); |
311 | | /// ``` |
312 | | /// |
313 | | /// Pointers do not. This will cause a compiler error. |
314 | | /// |
315 | | /// ```rust,compile_fail |
316 | | /// # use core::sync::atomic::*; |
317 | | /// # use radium::Radium; |
318 | | /// # use core::ptr; |
319 | | /// let ptr: AtomicPtr<usize> = Default::default(); |
320 | | /// Radium::fetch_or(&ptr, ptr::null_mut(), Ordering::Relaxed); |
321 | | /// ``` |
322 | | pub trait BitOps {} |
323 | | |
324 | | /// Types supporting maybe-atomic arithmetic operations. |
325 | | /// |
326 | | /// Types implementing this trait support the [`fetch_add`] and |
327 | | /// [`fetch_sub`] maybe-atomic operations. |
328 | | /// |
329 | | /// [`fetch_add`]: crate::Radium::fetch_add |
330 | | /// [`fetch_sub`]: crate::Radium::fetch_sub |
331 | | /// |
332 | | /// The integer types, such as `usize` and `i32`, implement this trait. |
333 | | /// |
334 | | /// ```rust |
335 | | /// # use core::sync::atomic::*; |
336 | | /// # use radium::Radium; |
337 | | /// let num: AtomicUsize = AtomicUsize::new(2); |
338 | | /// Radium::fetch_add(&num, 2, Ordering::Relaxed); |
339 | | /// ``` |
340 | | /// |
341 | | /// `bool` and pointers do not. This will cause a compiler error. |
342 | | /// |
343 | | /// ```rust,compile_fail |
344 | | /// # use core::sync::atomic::*; |
345 | | /// # use radium::Radium; |
346 | | /// let bit: AtomicBool = AtomicBool::new(false); |
347 | | /// Radium::fetch_add(&bit, true, Ordering::Relaxed); |
348 | | /// ``` |
349 | | pub trait NumericOps: BitOps {} |
350 | | } |
351 | | |
352 | | macro_rules! radium { |
353 | | // Emit the universal `Radium` trait function bodies for atomic types. |
354 | | ( atom $base:ty ) => { |
355 | | #[inline] |
356 | 0 | fn new(value: $base) -> Self { |
357 | 0 | Self::new(value) |
358 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::new Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::new |
359 | | |
360 | | #[inline] |
361 | 0 | fn fence(order: Ordering) { |
362 | 0 | core::sync::atomic::fence(order); |
363 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::fence Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::fence |
364 | | |
365 | | #[inline] |
366 | 0 | fn get_mut(&mut self) -> &mut $base { |
367 | 0 | self.get_mut() |
368 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::get_mut Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::get_mut |
369 | | |
370 | | #[inline] |
371 | 0 | fn into_inner(self) -> $base { |
372 | 0 | self.into_inner() |
373 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::into_inner Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::into_inner |
374 | | |
375 | | #[inline] |
376 | 0 | fn load(&self, order: Ordering) -> $base { |
377 | 0 | self.load(order) |
378 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::load Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::load |
379 | | |
380 | | #[inline] |
381 | 0 | fn store(&self, value: $base, order: Ordering) { |
382 | 0 | self.store(value, order); |
383 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::store Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::store |
384 | | |
385 | | #[inline] |
386 | 0 | fn swap(&self, value: $base, order: Ordering) -> $base { |
387 | 0 | self.swap(value, order) |
388 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::swap Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::swap |
389 | | |
390 | | #[inline] |
391 | | #[allow(deprecated)] |
392 | 0 | fn compare_and_swap(&self, current: $base, new: $base, order: Ordering) -> $base { |
393 | 0 | self.compare_and_swap(current, new, order) |
394 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::compare_and_swap |
395 | | |
396 | | #[inline] |
397 | 0 | fn compare_exchange( |
398 | 0 | &self, |
399 | 0 | current: $base, |
400 | 0 | new: $base, |
401 | 0 | success: Ordering, |
402 | 0 | failure: Ordering, |
403 | 0 | ) -> Result<$base, $base> { |
404 | 0 | self.compare_exchange(current, new, success, failure) |
405 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::compare_exchange Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::compare_exchange |
406 | | |
407 | | #[inline] |
408 | 0 | fn compare_exchange_weak( |
409 | 0 | &self, |
410 | 0 | current: $base, |
411 | 0 | new: $base, |
412 | 0 | success: Ordering, |
413 | 0 | failure: Ordering, |
414 | 0 | ) -> Result<$base, $base> { |
415 | 0 | self.compare_exchange_weak(current, new, success, failure) |
416 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::compare_exchange_weak |
417 | | |
418 | | #[inline] |
419 | 0 | fn fetch_update<F>( |
420 | 0 | &self, |
421 | 0 | set_order: Ordering, |
422 | 0 | fetch_order: Ordering, |
423 | 0 | f: F, |
424 | 0 | ) -> Result<$base, $base> |
425 | 0 | where |
426 | 0 | F: FnMut($base) -> Option<$base>, |
427 | | { |
428 | 0 | self.fetch_update(set_order, fetch_order, f) |
429 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicPtr<_> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::fetch_update::<_> |
430 | | }; |
431 | | |
432 | | // Emit the `Radium` trait function bodies for bit-wise types. |
433 | | ( atom_bit $base:ty ) => { |
434 | | #[inline] |
435 | 0 | fn fetch_and(&self, value: $base, order: Ordering) -> $base { |
436 | 0 | self.fetch_and(value, order) |
437 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::fetch_and Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::fetch_and |
438 | | |
439 | | #[inline] |
440 | 0 | fn fetch_nand(&self, value: $base, order: Ordering) -> $base { |
441 | 0 | self.fetch_nand(value, order) |
442 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::fetch_nand Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::fetch_nand |
443 | | |
444 | | #[inline] |
445 | 0 | fn fetch_or(&self, value: $base, order: Ordering) -> $base { |
446 | 0 | self.fetch_or(value, order) |
447 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::fetch_or Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::fetch_or |
448 | | |
449 | | #[inline] |
450 | 0 | fn fetch_xor(&self, value: $base, order: Ordering) -> $base { |
451 | 0 | self.fetch_xor(value, order) |
452 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicBool as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::fetch_xor Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::fetch_xor |
453 | | }; |
454 | | |
455 | | // Emit the `Radium` trait function bodies for integral types. |
456 | | ( atom_int $base:ty ) => { |
457 | | #[inline] |
458 | 0 | fn fetch_add(&self, value: $base, order: Ordering) -> $base { |
459 | 0 | self.fetch_add(value, order) |
460 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::fetch_add Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::fetch_add Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::fetch_add Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::fetch_add Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::fetch_add Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::fetch_add Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::fetch_add Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::fetch_add Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::fetch_add Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::fetch_add |
461 | | |
462 | | #[inline] |
463 | 0 | fn fetch_sub(&self, value: $base, order: Ordering) -> $base { |
464 | 0 | self.fetch_sub(value, order) |
465 | 0 | } Unexecuted instantiation: <core::sync::atomic::AtomicU32 as radium::Radium>::fetch_sub Unexecuted instantiation: <core::sync::atomic::AtomicI64 as radium::Radium>::fetch_sub Unexecuted instantiation: <core::sync::atomic::AtomicU64 as radium::Radium>::fetch_sub Unexecuted instantiation: <core::sync::atomic::AtomicIsize as radium::Radium>::fetch_sub Unexecuted instantiation: <core::sync::atomic::AtomicUsize as radium::Radium>::fetch_sub Unexecuted instantiation: <core::sync::atomic::AtomicI8 as radium::Radium>::fetch_sub Unexecuted instantiation: <core::sync::atomic::AtomicU8 as radium::Radium>::fetch_sub Unexecuted instantiation: <core::sync::atomic::AtomicI16 as radium::Radium>::fetch_sub Unexecuted instantiation: <core::sync::atomic::AtomicU16 as radium::Radium>::fetch_sub Unexecuted instantiation: <core::sync::atomic::AtomicI32 as radium::Radium>::fetch_sub |
466 | | }; |
467 | | |
468 | | // Emit the universal `Radium` trait function bodies for `Cell<_>`. |
469 | | ( cell $base:ty ) => { |
470 | | #[inline] |
471 | 0 | fn new(value: $base) -> Self { |
472 | 0 | Cell::new(value) |
473 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::new Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::new |
474 | | |
475 | | #[inline] |
476 | 0 | fn fence(_: Ordering) {}Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::fence Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::fence |
477 | | |
478 | | #[inline] |
479 | 0 | fn get_mut(&mut self) -> &mut $base { |
480 | 0 | self.get_mut() |
481 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::get_mut Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::get_mut |
482 | | |
483 | | #[inline] |
484 | 0 | fn into_inner(self) -> $base { |
485 | 0 | self.into_inner() |
486 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::into_inner Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::into_inner |
487 | | |
488 | | #[inline] |
489 | 0 | fn load(&self, _: Ordering) -> $base { |
490 | 0 | self.get() |
491 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::load Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::load |
492 | | |
493 | | #[inline] |
494 | 0 | fn store(&self, value: $base, _: Ordering) { |
495 | 0 | self.set(value); |
496 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::store Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::store |
497 | | |
498 | | #[inline] |
499 | 0 | fn swap(&self, value: $base, _: Ordering) -> $base { |
500 | 0 | self.replace(value) |
501 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::swap Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::swap |
502 | | |
503 | | #[inline] |
504 | 0 | fn compare_and_swap(&self, current: $base, new: $base, _: Ordering) -> $base { |
505 | 0 | if self.get() == current { |
506 | 0 | self.replace(new) |
507 | | } else { |
508 | 0 | self.get() |
509 | | } |
510 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::compare_and_swap Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::compare_and_swap |
511 | | |
512 | | #[inline] |
513 | 0 | fn compare_exchange( |
514 | 0 | &self, |
515 | 0 | current: $base, |
516 | 0 | new: $base, |
517 | 0 | _: Ordering, |
518 | 0 | _: Ordering, |
519 | 0 | ) -> Result<$base, $base> { |
520 | 0 | if self.get() == current { |
521 | 0 | Ok(self.replace(new)) |
522 | | } else { |
523 | 0 | Err(self.get()) |
524 | | } |
525 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::compare_exchange Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::compare_exchange |
526 | | |
527 | | #[inline] |
528 | 0 | fn compare_exchange_weak( |
529 | 0 | &self, |
530 | 0 | current: $base, |
531 | 0 | new: $base, |
532 | 0 | success: Ordering, |
533 | 0 | failure: Ordering, |
534 | 0 | ) -> Result<$base, $base> { |
535 | 0 | Radium::compare_exchange(self, current, new, success, failure) |
536 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::compare_exchange_weak Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::compare_exchange_weak |
537 | | |
538 | | #[inline] |
539 | 0 | fn fetch_update<F>(&self, _: Ordering, _: Ordering, mut f: F) -> Result<$base, $base> |
540 | 0 | where |
541 | 0 | F: FnMut($base) -> Option<$base>, |
542 | | { |
543 | 0 | match f(self.get()) { |
544 | 0 | Some(x) => Ok(self.replace(x)), |
545 | 0 | None => Err(self.get()), |
546 | | } |
547 | 0 | } Unexecuted instantiation: <core::cell::Cell<*mut _> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::fetch_update::<_> Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::fetch_update::<_> |
548 | | }; |
549 | | |
550 | | // Emit the `Radium` trait function bodies for bit-wise types. |
551 | | ( cell_bit $base:ty ) => { |
552 | | #[inline] |
553 | 283k | fn fetch_and(&self, value: $base, _: Ordering) -> $base { |
554 | 283k | self.replace(self.get() & value) |
555 | 283k | } <core::cell::Cell<u8> as radium::Radium>::fetch_and Line | Count | Source | 553 | 283k | fn fetch_and(&self, value: $base, _: Ordering) -> $base { | 554 | 283k | self.replace(self.get() & value) | 555 | 283k | } |
Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::fetch_and Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::fetch_and |
556 | | |
557 | | #[inline] |
558 | 0 | fn fetch_nand(&self, value: $base, _: Ordering) -> $base { |
559 | 0 | self.replace(!(self.get() & value)) |
560 | 0 | } Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::fetch_nand Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::fetch_nand |
561 | | |
562 | | #[inline] |
563 | 250k | fn fetch_or(&self, value: $base, _: Ordering) -> $base { |
564 | 250k | self.replace(self.get() | value) |
565 | 250k | } <core::cell::Cell<u8> as radium::Radium>::fetch_or Line | Count | Source | 563 | 250k | fn fetch_or(&self, value: $base, _: Ordering) -> $base { | 564 | 250k | self.replace(self.get() | value) | 565 | 250k | } |
Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::fetch_or Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::fetch_or |
566 | | |
567 | | #[inline] |
568 | 0 | fn fetch_xor(&self, value: $base, _: Ordering) -> $base { |
569 | 0 | self.replace(self.get() ^ value) |
570 | 0 | } Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<bool> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::fetch_xor Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::fetch_xor |
571 | | }; |
572 | | |
573 | | // Emit the `Radium` trait function bodies for integral types. |
574 | | ( cell_int $base:ty ) => { |
575 | | #[inline] |
576 | 0 | fn fetch_add(&self, value: $base, _: Ordering) -> $base { |
577 | 0 | self.replace(self.get().wrapping_add(value)) |
578 | 0 | } Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::fetch_add Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::fetch_add Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::fetch_add Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::fetch_add Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::fetch_add Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::fetch_add Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::fetch_add Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::fetch_add Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::fetch_add Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::fetch_add |
579 | | |
580 | | #[inline] |
581 | 0 | fn fetch_sub(&self, value: $base, _: Ordering) -> $base { |
582 | 0 | self.replace(self.get().wrapping_sub(value)) |
583 | 0 | } Unexecuted instantiation: <core::cell::Cell<i8> as radium::Radium>::fetch_sub Unexecuted instantiation: <core::cell::Cell<u8> as radium::Radium>::fetch_sub Unexecuted instantiation: <core::cell::Cell<i16> as radium::Radium>::fetch_sub Unexecuted instantiation: <core::cell::Cell<u16> as radium::Radium>::fetch_sub Unexecuted instantiation: <core::cell::Cell<i32> as radium::Radium>::fetch_sub Unexecuted instantiation: <core::cell::Cell<u32> as radium::Radium>::fetch_sub Unexecuted instantiation: <core::cell::Cell<i64> as radium::Radium>::fetch_sub Unexecuted instantiation: <core::cell::Cell<u64> as radium::Radium>::fetch_sub Unexecuted instantiation: <core::cell::Cell<isize> as radium::Radium>::fetch_sub Unexecuted instantiation: <core::cell::Cell<usize> as radium::Radium>::fetch_sub |
584 | | }; |
585 | | } |
586 | | |
587 | | macro_rules! radium_int { |
588 | | ( $( $width:tt: $base:ty , $atom:ty ; )* ) => { $( |
589 | | impl marker::BitOps for $base {} |
590 | | impl marker::NumericOps for $base {} |
591 | | |
592 | | if_atomic!(if atomic($width) { |
593 | | impl Radium for $atom { |
594 | | type Item = $base; |
595 | | |
596 | | radium!(atom $base); |
597 | | radium!(atom_bit $base); |
598 | | radium!(atom_int $base); |
599 | | } |
600 | | }); |
601 | | |
602 | | impl Radium for Cell<$base> { |
603 | | type Item = $base; |
604 | | |
605 | | radium!(cell $base); |
606 | | radium!(cell_bit $base); |
607 | | radium!(cell_int $base); |
608 | | } |
609 | | )* }; |
610 | | } |
611 | | |
612 | | radium_int! { |
613 | | 8: i8, AtomicI8; |
614 | | 8: u8, AtomicU8; |
615 | | 16: i16, AtomicI16; |
616 | | 16: u16, AtomicU16; |
617 | | 32: i32, AtomicI32; |
618 | | 32: u32, AtomicU32; |
619 | | 64: i64, AtomicI64; |
620 | | 64: u64, AtomicU64; |
621 | | size: isize, AtomicIsize; |
622 | | size: usize, AtomicUsize; |
623 | | } |
624 | | |
625 | | impl marker::BitOps for bool {} |
626 | | |
627 | | if_atomic!(if atomic(bool) { |
628 | | impl Radium for AtomicBool { |
629 | | type Item = bool; |
630 | | |
631 | | radium!(atom bool); |
632 | | radium!(atom_bit bool); |
633 | | |
634 | | /// ```compile_fail |
635 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
636 | | /// # use radium::*; |
637 | | /// let atom = AtomicBool::new(false); |
638 | | /// Radium::fetch_add(&atom, true, Ordering::Relaxed); |
639 | | /// ``` |
640 | | #[doc(hidden)] |
641 | 0 | fn fetch_add(&self, _value: bool, _order: Ordering) -> bool { |
642 | 0 | unreachable!("This method statically cannot be called") |
643 | | } |
644 | | |
645 | | /// ```compile_fail |
646 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
647 | | /// # use radium::*; |
648 | | /// let atom = AtomicBool::new(false); |
649 | | /// Radium::fetch_sub(&atom, true, Ordering::Relaxed); |
650 | | /// ``` |
651 | | #[doc(hidden)] |
652 | 0 | fn fetch_sub(&self, _value: bool, _order: Ordering) -> bool { |
653 | 0 | unreachable!("This method statically cannot be called") |
654 | | } |
655 | | } |
656 | | }); |
657 | | |
658 | | impl Radium for Cell<bool> { |
659 | | type Item = bool; |
660 | | |
661 | | radium!(cell bool); |
662 | | radium!(cell_bit bool); |
663 | | |
664 | | /// ```compile_fail |
665 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
666 | | /// # use radium::*; |
667 | | /// let cell = Cell::<bool>::new(false); |
668 | | /// Radium::fetch_add(&cell, true, Ordering::Relaxed); |
669 | | /// ``` |
670 | | #[doc(hidden)] |
671 | 0 | fn fetch_add(&self, _value: bool, _order: Ordering) -> bool { |
672 | 0 | unreachable!("This method statically cannot be called") |
673 | | } |
674 | | |
675 | | /// ```compile_fail |
676 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
677 | | /// # use radium::*; |
678 | | /// let cell = Cell::<bool>::new(false); |
679 | | /// Radium::fetch_sub(&cell, true, Ordering::Relaxed); |
680 | | /// ``` |
681 | | #[doc(hidden)] |
682 | 0 | fn fetch_sub(&self, _value: bool, _order: Ordering) -> bool { |
683 | 0 | unreachable!("This method statically cannot be called") |
684 | | } |
685 | | } |
686 | | |
687 | | if_atomic!(if atomic(ptr) { |
688 | | impl<T> Radium for AtomicPtr<T> { |
689 | | type Item = *mut T; |
690 | | |
691 | | radium!(atom *mut T); |
692 | | |
693 | | /// ```compile_fail |
694 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
695 | | /// # use radium::*; |
696 | | /// let atom = AtomicPtr::<u8>::new(ptr::null_mut()); |
697 | | /// Radium::fetch_and(&atom, ptr::null_mut(), Ordering::Relaxed); |
698 | | /// ``` |
699 | | #[doc(hidden)] |
700 | 0 | fn fetch_and(&self, _value: *mut T, _order: Ordering) -> *mut T { |
701 | 0 | unreachable!("This method statically cannot be called") |
702 | | } |
703 | | |
704 | | /// ```compile_fail |
705 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
706 | | /// # use radium::*; |
707 | | /// let atom = AtomicPtr::<u8>::new(ptr::null_mut()); |
708 | | /// Radium::fetch_nand(&atom, ptr::null_mut(), Ordering::Relaxed); |
709 | | /// ``` |
710 | | #[doc(hidden)] |
711 | 0 | fn fetch_nand(&self, _value: *mut T, _order: Ordering) -> *mut T { |
712 | 0 | unreachable!("This method statically cannot be called") |
713 | | } |
714 | | |
715 | | /// ```compile_fail |
716 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
717 | | /// # use radium::*; |
718 | | /// let atom = AtomicPtr::<u8>::new(ptr::null_mut()); |
719 | | /// Radium::fetch_or(&atom, ptr::null_mut(), Ordering::Relaxed); |
720 | | /// ``` |
721 | | #[doc(hidden)] |
722 | 0 | fn fetch_or(&self, _value: *mut T, _order: Ordering) -> *mut T { |
723 | 0 | unreachable!("This method statically cannot be called") |
724 | | } |
725 | | |
726 | | /// ```compile_fail |
727 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
728 | | /// # use radium::*; |
729 | | /// let atom = AtomicPtr::<u8>::new(ptr::null_mut()); |
730 | | /// Radium::fetch_xor(&atom, ptr::null_mut(), Ordering::Relaxed); |
731 | | /// ``` |
732 | | #[doc(hidden)] |
733 | 0 | fn fetch_xor(&self, _value: *mut T, _order: Ordering) -> *mut T { |
734 | 0 | unreachable!("This method statically cannot be called") |
735 | | } |
736 | | |
737 | | /// ```compile_fail |
738 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
739 | | /// # use radium::*; |
740 | | /// let atom = AtomicPtr::<u8>::new(ptr::null_mut()); |
741 | | /// Radium::fetch_add(&atom, ptr::null_mut(), Ordering::Relaxed); |
742 | | /// ``` |
743 | | #[doc(hidden)] |
744 | 0 | fn fetch_add(&self, _value: *mut T, _order: Ordering) -> *mut T { |
745 | 0 | unreachable!("This method statically cannot be called") |
746 | | } |
747 | | |
748 | | /// ```compile_fail |
749 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
750 | | /// # use radium::*; |
751 | | /// let atom = AtomicPtr::<u8>::new(ptr::null_mut()); |
752 | | /// Radium::fetch_sub(&atom, ptr::null_mut(), Ordering::Relaxed); |
753 | | /// ``` |
754 | | #[doc(hidden)] |
755 | 0 | fn fetch_sub(&self, _value: *mut T, _order: Ordering) -> *mut T { |
756 | 0 | unreachable!("This method statically cannot be called") |
757 | | } |
758 | | } |
759 | | }); |
760 | | |
761 | | impl<T> Radium for Cell<*mut T> { |
762 | | type Item = *mut T; |
763 | | |
764 | | radium!(cell *mut T); |
765 | | |
766 | | /// ```compile_fail |
767 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
768 | | /// # use radium::*; |
769 | | /// let cell = Cell::<*mut u8>::new(ptr::null_mut()); |
770 | | /// Radium::fetch_and(&cell, ptr::null_mut(), Ordering::Relaxed); |
771 | | /// ``` |
772 | | #[doc(hidden)] |
773 | 0 | fn fetch_and(&self, _value: *mut T, _order: Ordering) -> *mut T { |
774 | 0 | unreachable!("This method statically cannot be called") |
775 | | } |
776 | | |
777 | | /// ```compile_fail |
778 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
779 | | /// # use radium::*; |
780 | | /// let cell = Cell::<*mut u8>::new(ptr::null_mut()); |
781 | | /// Radium::fetch_nand(&cell, ptr::null_mut(), Ordering::Relaxed); |
782 | | /// ``` |
783 | | #[doc(hidden)] |
784 | 0 | fn fetch_nand(&self, _value: *mut T, _order: Ordering) -> *mut T { |
785 | 0 | unreachable!("This method statically cannot be called") |
786 | | } |
787 | | |
788 | | /// ```compile_fail |
789 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
790 | | /// # use radium::*; |
791 | | /// let cell = Cell::<*mut u8>::new(ptr::null_mut()); |
792 | | /// Radium::fetch_or(&cell, ptr::null_mut(), Ordering::Relaxed); |
793 | | /// ``` |
794 | | #[doc(hidden)] |
795 | 0 | fn fetch_or(&self, _value: *mut T, _order: Ordering) -> *mut T { |
796 | 0 | unreachable!("This method statically cannot be called") |
797 | | } |
798 | | |
799 | | /// ```compile_fail |
800 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
801 | | /// # use radium::*; |
802 | | /// let cell = Cell::<*mut u8>::new(ptr::null_mut()); |
803 | | /// Radium::fetch_xor(&cell, ptr::null_mut(), Ordering::Relaxed); |
804 | | /// ``` |
805 | | #[doc(hidden)] |
806 | 0 | fn fetch_xor(&self, _value: *mut T, _order: Ordering) -> *mut T { |
807 | 0 | unreachable!("This method statically cannot be called") |
808 | | } |
809 | | |
810 | | /// ```compile_fail |
811 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
812 | | /// # use radium::*; |
813 | | /// let cell = Cell::<*mut u8>::new(ptr::null_mut()); |
814 | | /// Radium::fetch_add(&cell, ptr::null_mut(), Ordering::Relaxed); |
815 | | /// ``` |
816 | | #[doc(hidden)] |
817 | 0 | fn fetch_add(&self, _value: *mut T, _order: Ordering) -> *mut T { |
818 | 0 | unreachable!("This method statically cannot be called") |
819 | | } |
820 | | |
821 | | /// ```compile_fail |
822 | | /// # use std::{ptr, sync::atomic::*, cell::*}; |
823 | | /// # use radium::*; |
824 | | /// let cell = Cell::<*mut u8>::new(ptr::null_mut()); |
825 | | /// Radium::fetch_sub(&cell, ptr::null_mut(), Ordering::Relaxed); |
826 | | /// ``` |
827 | | #[doc(hidden)] |
828 | 0 | fn fetch_sub(&self, _value: *mut T, _order: Ordering) -> *mut T { |
829 | 0 | unreachable!("This method statically cannot be called") |
830 | | } |
831 | | } |
832 | | |
833 | | #[cfg(test)] |
834 | | mod tests { |
835 | | use super::*; |
836 | | use core::cell::Cell; |
837 | | |
838 | | #[test] |
839 | | fn absent_traits() { |
840 | | static_assertions::assert_not_impl_any!(bool: marker::NumericOps); |
841 | | static_assertions::assert_not_impl_any!(*mut u8: marker::BitOps, marker::NumericOps); |
842 | | } |
843 | | |
844 | | #[test] |
845 | | fn present_traits() { |
846 | | static_assertions::assert_impl_all!(bool: marker::BitOps); |
847 | | static_assertions::assert_impl_all!(usize: marker::BitOps, marker::NumericOps); |
848 | | } |
849 | | |
850 | | #[test] |
851 | | fn always_cell() { |
852 | | static_assertions::assert_impl_all!(Cell<bool>: Radium<Item = bool>); |
853 | | static_assertions::assert_impl_all!(Cell<i8>: Radium<Item = i8>); |
854 | | static_assertions::assert_impl_all!(Cell<u8>: Radium<Item = u8>); |
855 | | static_assertions::assert_impl_all!(Cell<i16>: Radium<Item = i16>); |
856 | | static_assertions::assert_impl_all!(Cell<u16>: Radium<Item = u16>); |
857 | | static_assertions::assert_impl_all!(Cell<i32>: Radium<Item = i32>); |
858 | | static_assertions::assert_impl_all!(Cell<u32>: Radium<Item = u32>); |
859 | | static_assertions::assert_impl_all!(Cell<i64>: Radium<Item = i64>); |
860 | | static_assertions::assert_impl_all!(Cell<u64>: Radium<Item = u64>); |
861 | | static_assertions::assert_impl_all!(Cell<isize>: Radium<Item = isize>); |
862 | | static_assertions::assert_impl_all!(Cell<usize>: Radium<Item = usize>); |
863 | | static_assertions::assert_impl_all!(Cell<*mut ()>: Radium<Item = *mut ()>); |
864 | | } |
865 | | |
866 | | #[test] |
867 | | fn always_alias() { |
868 | | static_assertions::assert_impl_all!(types::RadiumBool: Radium<Item = bool>); |
869 | | static_assertions::assert_impl_all!(types::RadiumI8: Radium<Item = i8>); |
870 | | static_assertions::assert_impl_all!(types::RadiumU8: Radium<Item = u8>); |
871 | | static_assertions::assert_impl_all!(types::RadiumI16: Radium<Item = i16>); |
872 | | static_assertions::assert_impl_all!(types::RadiumU16: Radium<Item = u16>); |
873 | | static_assertions::assert_impl_all!(types::RadiumI32: Radium<Item = i32>); |
874 | | static_assertions::assert_impl_all!(types::RadiumU32: Radium<Item = u32>); |
875 | | static_assertions::assert_impl_all!(types::RadiumI64: Radium<Item = i64>); |
876 | | static_assertions::assert_impl_all!(types::RadiumU64: Radium<Item = u64>); |
877 | | static_assertions::assert_impl_all!(types::RadiumIsize: Radium<Item = isize>); |
878 | | static_assertions::assert_impl_all!(types::RadiumUsize: Radium<Item = usize>); |
879 | | static_assertions::assert_impl_all!(types::RadiumPtr<()>: Radium<Item = *mut ()>); |
880 | | } |
881 | | |
882 | | #[test] |
883 | | fn maybe_atom() { |
884 | | if_atomic! { |
885 | | if atomic(bool) { |
886 | | use core::sync::atomic::*; |
887 | | static_assertions::assert_impl_all!(AtomicBool: Radium<Item = bool>); |
888 | | } |
889 | | if atomic(8) { |
890 | | static_assertions::assert_impl_all!(AtomicI8: Radium<Item = i8>); |
891 | | static_assertions::assert_impl_all!(AtomicU8: Radium<Item = u8>); |
892 | | } |
893 | | if atomic(16) { |
894 | | static_assertions::assert_impl_all!(AtomicI16: Radium<Item = i16>); |
895 | | static_assertions::assert_impl_all!(AtomicU16: Radium<Item = u16>); |
896 | | } |
897 | | if atomic(32) { |
898 | | static_assertions::assert_impl_all!(AtomicI32: Radium<Item = i32>); |
899 | | static_assertions::assert_impl_all!(AtomicU32: Radium<Item = u32>); |
900 | | } |
901 | | if atomic(64) { |
902 | | static_assertions::assert_impl_all!(AtomicI64: Radium<Item = i64>); |
903 | | static_assertions::assert_impl_all!(AtomicU64: Radium<Item = u64>); |
904 | | } |
905 | | if atomic(size) { |
906 | | static_assertions::assert_impl_all!(AtomicIsize: Radium<Item = isize>); |
907 | | static_assertions::assert_impl_all!(AtomicUsize: Radium<Item = usize>); |
908 | | } |
909 | | if atomic(ptr) { |
910 | | static_assertions::assert_impl_all!(AtomicPtr<()>: Radium<Item = *mut ()>); |
911 | | } |
912 | | } |
913 | | } |
914 | | } |