From 0bc9c729b3a3ef7e87f0828c79f32065fc63cab5 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 7 May 2018 10:40:00 -0700 Subject: [PATCH] Add impls for Weak --- serde/src/de/impls.rs | 38 ++++++++++++++++++++++++++++++++++++++ serde/src/lib.rs | 8 ++++---- serde/src/ser/impls.rs | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 5a53a418..aa4ede6c 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -1474,6 +1474,44 @@ where //////////////////////////////////////////////////////////////////////////////// +/// This impl requires the [`"rc"`] Cargo feature of Serde. The resulting +/// `Weak` has a reference count of 0 and cannot be upgraded. +/// +/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc +#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] +impl<'de, T: ?Sized> Deserialize<'de> for RcWeak +where + T: Deserialize<'de>, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + try!(Option::::deserialize(deserializer)); + Ok(RcWeak::new()) + } +} + +/// This impl requires the [`"rc"`] Cargo feature of Serde. The resulting +/// `Weak` has a reference count of 0 and cannot be upgraded. +/// +/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc +#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] +impl<'de, T: ?Sized> Deserialize<'de> for ArcWeak +where + T: Deserialize<'de>, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + try!(Option::::deserialize(deserializer)); + Ok(ArcWeak::new()) + } +} + +//////////////////////////////////////////////////////////////////////////////// + #[cfg(all(feature = "unstable", feature = "rc", any(feature = "std", feature = "alloc")))] macro_rules! box_forwarded_impl { ( diff --git a/serde/src/lib.rs b/serde/src/lib.rs index 923b7596..ce0c3326 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -179,14 +179,14 @@ mod lib { pub use std::boxed::Box; #[cfg(all(feature = "rc", feature = "alloc", not(feature = "std")))] - pub use alloc::rc::Rc; + pub use alloc::rc::{Rc, Weak as RcWeak}; #[cfg(all(feature = "rc", feature = "std"))] - pub use std::rc::Rc; + pub use std::rc::{Rc, Weak as RcWeak}; #[cfg(all(feature = "rc", feature = "alloc", not(feature = "std")))] - pub use alloc::arc::Arc; + pub use alloc::arc::{Arc, Weak as ArcWeak}; #[cfg(all(feature = "rc", feature = "std"))] - pub use std::sync::Arc; + pub use std::sync::{Arc, Weak as ArcWeak}; #[cfg(all(feature = "alloc", not(feature = "std")))] pub use alloc::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque}; diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index f2de2822..fbe057cd 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -374,6 +374,40 @@ deref_impl!(<'a, T: ?Sized> Serialize for Cow<'a, T> where T: Serialize + ToOwne //////////////////////////////////////////////////////////////////////////////// +/// This impl requires the [`"rc"`] Cargo feature of Serde. +/// +/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc +#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] +impl Serialize for RcWeak +where + T: Serialize, +{ + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.upgrade().serialize(serializer) + } +} + +/// This impl requires the [`"rc"`] Cargo feature of Serde. +/// +/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc +#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] +impl Serialize for ArcWeak +where + T: Serialize, +{ + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.upgrade().serialize(serializer) + } +} + +//////////////////////////////////////////////////////////////////////////////// + #[cfg(feature = "unstable")] #[allow(deprecated)] impl Serialize for NonZero