Skip to main content

rkyv/impls/core/with/atomic/
mod.rs

1#[macro_use]
2mod _macros;
3#[cfg(any(
4    target_has_atomic = "16",
5    target_has_atomic = "32",
6    target_has_atomic = "64",
7))]
8mod multibyte;
9
10use core::sync::atomic::Ordering;
11#[cfg(target_has_atomic = "8")]
12use core::sync::atomic::{AtomicBool, AtomicI8, AtomicU8};
13
14use rancor::Fallible;
15
16use crate::{
17    with::{
18        Acquire, ArchiveWith, AtomicLoad, DeserializeWith, Relaxed, SeqCst,
19    },
20    Place,
21};
22
23trait LoadOrdering {
24    const ORDERING: Ordering;
25}
26
27impl LoadOrdering for Relaxed {
28    const ORDERING: Ordering = Ordering::Relaxed;
29}
30
31impl LoadOrdering for Acquire {
32    const ORDERING: Ordering = Ordering::Acquire;
33}
34
35impl LoadOrdering for SeqCst {
36    const ORDERING: Ordering = Ordering::SeqCst;
37}
38
39macro_rules! impl_single_byte_atomic {
40    ($atomic:ty, $non_atomic:ty) => {
41        impl<SO: LoadOrdering> ArchiveWith<$atomic> for AtomicLoad<SO> {
42            type Archived = $non_atomic;
43            type Resolver = ();
44
45            fn resolve_with(
46                field: &$atomic,
47                _: Self::Resolver,
48                out: Place<Self::Archived>,
49            ) {
50                out.write(field.load(SO::ORDERING));
51            }
52        }
53
54        impl_serialize_with_atomic_load!($atomic);
55
56        impl<D, SO> DeserializeWith<$non_atomic, $atomic, D> for AtomicLoad<SO>
57        where
58            D: Fallible + ?Sized,
59        {
60            fn deserialize_with(
61                field: &$non_atomic,
62                _: &mut D,
63            ) -> Result<$atomic, D::Error> {
64                Ok(<$atomic>::new(*field))
65            }
66        }
67    };
68}
69
70macro_rules! impl_single_byte_atomics {
71    ($($atomic:ty, $non_atomic:ty);* $(;)?) => {
72        $(
73            impl_single_byte_atomic!($atomic, $non_atomic);
74        )*
75    }
76}
77
78#[cfg(target_has_atomic = "8")]
79impl_single_byte_atomics!(
80    AtomicBool, bool;
81    AtomicI8, i8;
82    AtomicU8, u8;
83);