Coverage Report

Created: 2026-02-26 06:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}