rkyv/impls/core/with/atomic/
mod.rs1#[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);