Merge pull request #1572 from Roguelazer/issue-1496

Implement serialization and deserialization for std::sync::atomic types
This commit is contained in:
David Tolnay
2019-07-16 07:28:18 -07:00
committed by GitHub
5 changed files with 200 additions and 0 deletions
+4
View File
@@ -68,6 +68,10 @@ fn main() {
if minor >= 28 {
println!("cargo:rustc-cfg=num_nonzero");
}
if minor >= 34 {
println!("cargo:rustc-cfg=std_integer_atomics");
}
}
fn rustc_minor_version() -> Option<u32> {
+53
View File
@@ -2543,3 +2543,56 @@ where
Deserialize::deserialize(deserializer).map(Wrapping)
}
}
#[cfg(all(feature="std", std_integer_atomics))]
use std::sync::atomic;
#[cfg(all(feature="std", std_integer_atomics))]
macro_rules! atomic_impl {
($ty:path, $primitive:ident) => {
impl<'de> Deserialize<'de> for $ty
{
#[inline]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer<'de>
{
let val = $primitive::deserialize(deserializer)?;
Ok(Self::new(val))
}
}
}
}
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicBool, bool);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicI8, i8);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicI16, i16);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicI32, i32);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicI64, i64);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicIsize, isize);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicU8, u8);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicU16, u16);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicU32, u32);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicU64, u64);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicUsize, usize);
+52
View File
@@ -839,3 +839,55 @@ where
self.0.serialize(serializer)
}
}
////////////////////////////////////////////////////////////////////////////////
#[cfg(all(feature="std", std_integer_atomics))]
use std::sync::atomic;
#[cfg(all(feature="std", std_integer_atomics))]
macro_rules! atomic_impl {
($ty:path, $method:ident $($cast:tt)*) => {
impl Serialize for $ty {
#[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.$method(self.load(atomic::Ordering::SeqCst) $($cast)*)
}
}
}
}
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicBool, serialize_bool);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicI8, serialize_i8);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicI16, serialize_i16);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicI32, serialize_i32);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicI64, serialize_i64);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicIsize, serialize_i64 as i64);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicU8, serialize_u8);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicU16, serialize_u16);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicU32, serialize_u32);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicU64, serialize_u64);
#[cfg(all(feature="std", std_integer_atomics))]
atomic_impl!(atomic::AtomicUsize, serialize_u64 as u64);