From 0f1d753d0bd2ed719ce593ae2aa05df1e919e763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Bethune?= Date: Mon, 4 Mar 2024 18:56:15 +0100 Subject: [PATCH] Implement Ser+De for Saturating This implementation is heavily inspired by the existing trait implentation for `std::num::Wrapping`. fix #2708 --- serde/build.rs | 6 ++++++ serde/src/de/impls.rs | 13 +++++++++++++ serde/src/lib.rs | 3 +++ serde/src/ser/impls.rs | 14 ++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/serde/build.rs b/serde/build.rs index fe5486a7a..0074df63f 100644 --- a/serde/build.rs +++ b/serde/build.rs @@ -64,6 +64,12 @@ fn main() { if minor < 64 { println!("cargo:rustc-cfg=no_core_cstr"); } + + // Support for core::num::Saturating and std::num::Saturating stabilized in Rust 1.74 + // https://blog.rust-lang.org/2023/11/16/Rust-1.74.0.html#stabilized-apis + if minor < 74 { + println!("cargo:rustc-cfg=no_core_num_saturating"); + } } fn rustc_minor_version() -> Option { diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index d89f1872b..3aef12607 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -3004,6 +3004,19 @@ where } } +#[cfg(not(no_core_num_saturating))] +impl<'de, T> Deserialize<'de> for Saturating +where + T: Deserialize<'de>, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + Deserialize::deserialize(deserializer).map(Saturating) + } +} + #[cfg(all(feature = "std", not(no_std_atomic)))] macro_rules! atomic_impl { ($($ty:ident $size:expr)*) => { diff --git a/serde/src/lib.rs b/serde/src/lib.rs index 5cf44c1c1..dc6d392bd 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -274,6 +274,9 @@ mod lib { pub use std::sync::atomic::{AtomicI64, AtomicU64}; #[cfg(all(feature = "std", not(no_target_has_atomic), target_has_atomic = "ptr"))] pub use std::sync::atomic::{AtomicIsize, AtomicUsize}; + + #[cfg(not(no_core_num_saturating))] + pub use self::core::num::Saturating; } // None of this crate's error handling needs the `From::from` error conversion diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index 7aa11621c..ffc4c70f9 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -1026,6 +1026,20 @@ where } } +#[cfg(not(no_core_num_saturating))] +impl Serialize for Saturating +where + T: Serialize, +{ + #[inline] + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.0.serialize(serializer) + } +} + impl Serialize for Reverse where T: Serialize,