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\