From 1c9478bfa6ed71b7d9b3bcc444537a373e6d0696 Mon Sep 17 00:00:00 2001 From: Jethro Beekman Date: Sun, 16 Apr 2017 22:59:17 -0700 Subject: [PATCH 1/2] Add Serialize/Deserialize for std types that provide interior mutability Fixes #179 --- serde/src/de/impls.rs | 43 +++++++++++++++++++++++++++++++ serde/src/de/mod.rs | 4 +++ serde/src/ser/impls.rs | 57 ++++++++++++++++++++++++++++++++++++++++++ serde/src/ser/mod.rs | 4 +++ 4 files changed, 108 insertions(+) diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 81c7c082..c67a1572 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -43,6 +43,11 @@ use alloc::arc::Arc; #[cfg(all(feature = "alloc", not(feature = "std")))] use alloc::boxed::Box; +use core::cell::{Cell, RefCell}; + +#[cfg(feature = "std")] +use std::sync::{Mutex, RwLock}; + #[cfg(feature = "std")] use std::time::Duration; @@ -1106,6 +1111,44 @@ impl<'a, T: ?Sized> Deserialize for Cow<'a, T> } } +impl Deserialize for Cell { + fn deserialize(deserializer: D) -> Result, D::Error> + where D: Deserializer + { + let val = try!(Deserialize::deserialize(deserializer)); + Ok(Cell::new(val)) + } +} + +impl Deserialize for RefCell { + fn deserialize(deserializer: D) -> Result, D::Error> + where D: Deserializer + { + let val = try!(Deserialize::deserialize(deserializer)); + Ok(RefCell::new(val)) + } +} + +#[cfg(feature = "std")] +impl Deserialize for Mutex { + fn deserialize(deserializer: D) -> Result, D::Error> + where D: Deserializer + { + let val = try!(Deserialize::deserialize(deserializer)); + Ok(Mutex::new(val)) + } +} + +#[cfg(feature = "std")] +impl Deserialize for RwLock { + fn deserialize(deserializer: D) -> Result, D::Error> + where D: Deserializer + { + let val = try!(Deserialize::deserialize(deserializer)); + Ok(RwLock::new(val)) + } +} + /////////////////////////////////////////////////////////////////////////////// // This is a cleaned-up version of the impl generated by: diff --git a/serde/src/de/mod.rs b/serde/src/de/mod.rs index 334ef2ab..72c1bce4 100644 --- a/serde/src/de/mod.rs +++ b/serde/src/de/mod.rs @@ -64,6 +64,10 @@ //! - Rc\ //! - Arc\ //! - Cow\<'a, T\> +//! - Cell\ +//! - RefCell\ +//! - Mutex\ +//! - RwLock\ //! - **Collection types**: //! - BTreeMap\ //! - BTreeSet\ diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index 4f817760..0afaf97f 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -36,6 +36,11 @@ use alloc::arc::Arc; #[cfg(all(feature = "alloc", not(feature = "std")))] use alloc::boxed::Box; +use core::cell::{Cell, RefCell}; + +#[cfg(feature = "std")] +use std::sync::{Mutex, RwLock}; + use core::marker::PhantomData; #[cfg(feature = "unstable")] @@ -586,6 +591,58 @@ impl<'a, T: ?Sized> Serialize for Cow<'a, T> } } +impl Serialize for Cell + where T: Serialize + Copy +{ + #[inline] + fn serialize(&self, serializer: S) -> Result + where S: Serializer + { + self.get().serialize(serializer) + } +} + +impl Serialize for RefCell + where T: Serialize +{ + #[inline] + fn serialize(&self, serializer: S) -> Result + where S: Serializer + { + self.borrow().serialize(serializer) + } +} + +#[cfg(feature = "std")] +impl Serialize for Mutex + where T: Serialize +{ + #[inline] + fn serialize(&self, serializer: S) -> Result + where S: Serializer + { + match self.lock() { + Ok(locked) => locked.serialize(serializer), + Err(_) => Err(S::Error::custom("lock poison error while serializing")), + } + } +} + +#[cfg(feature = "std")] +impl Serialize for RwLock + where T: Serialize +{ + #[inline] + fn serialize(&self, serializer: S) -> Result + where S: Serializer + { + match self.read() { + Ok(locked) => locked.serialize(serializer), + Err(_) => Err(S::Error::custom("lock poison error while serializing")), + } + } +} + /////////////////////////////////////////////////////////////////////////////// impl Serialize for Result diff --git a/serde/src/ser/mod.rs b/serde/src/ser/mod.rs index ad03b61f..460b6877 100644 --- a/serde/src/ser/mod.rs +++ b/serde/src/ser/mod.rs @@ -61,6 +61,10 @@ //! - Rc\ //! - Arc\ //! - Cow\<'a, T\> +//! - Cell\ +//! - RefCell\ +//! - Mutex\ +//! - RwLock\ //! - **Collection types**: //! - BTreeMap\ //! - BTreeSet\ From d4d2061a2e6fa5658b5dd9834bc63b0f76402c58 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 17 Apr 2017 07:33:45 -0700 Subject: [PATCH 2/2] Release 0.9.14 --- serde/Cargo.toml | 2 +- serde_derive/Cargo.toml | 2 +- serde_test/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/serde/Cargo.toml b/serde/Cargo.toml index 86fbe3c3..1c7e1c41 100644 --- a/serde/Cargo.toml +++ b/serde/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "serde" -version = "0.9.13" +version = "0.9.14" authors = ["Erick Tryzelaar "] license = "MIT/Apache-2.0" description = "A generic serialization/deserialization framework" diff --git a/serde_derive/Cargo.toml b/serde_derive/Cargo.toml index 6a49f513..9117ece9 100644 --- a/serde_derive/Cargo.toml +++ b/serde_derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "serde_derive" -version = "0.9.13" +version = "0.9.14" authors = ["Erick Tryzelaar "] license = "MIT/Apache-2.0" description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" diff --git a/serde_test/Cargo.toml b/serde_test/Cargo.toml index 63c442f5..3ca5f772 100644 --- a/serde_test/Cargo.toml +++ b/serde_test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "serde_test" -version = "0.9.13" +version = "0.9.14" authors = ["Erick Tryzelaar "] license = "MIT/Apache-2.0" description = "Token De/Serializer for testing De/Serialize implementations"