diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 781d1aa9..350d99bc 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -400,16 +400,22 @@ impl<'de> Deserialize<'de> for CString { } } -#[cfg(all(feature = "std", feature = "unstable"))] -impl<'de> Deserialize<'de> for Box { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - CString::deserialize(deserializer).map(CString::into_boxed_c_str) +macro_rules! forwarded_impl { + (( $($id: ident),* ), $ty: ty, $func: expr) => { + impl<'de $(, $id : Deserialize<'de>,)*> Deserialize<'de> for $ty { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + Deserialize::deserialize(deserializer).map($func) + } + } } } +#[cfg(all(feature = "std", feature = "unstable"))] +forwarded_impl!((), Box, CString::into_boxed_c_str); + //////////////////////////////////////////////////////////////////////////////// struct OptionVisitor { @@ -1098,66 +1104,19 @@ impl<'de> Deserialize<'de> for OsString { //////////////////////////////////////////////////////////////////////////////// #[cfg(any(feature = "std", feature = "alloc"))] -impl<'de, T> Deserialize<'de> for Box -where - T: Deserialize<'de>, -{ - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - T::deserialize(deserializer).map(Box::new) - } -} +forwarded_impl!((T), Box, Box::new); #[cfg(any(feature = "std", feature = "alloc"))] -impl<'de, T> Deserialize<'de> for Box<[T]> -where - T: Deserialize<'de>, -{ - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - Vec::::deserialize(deserializer).map(Vec::into_boxed_slice) - } -} +forwarded_impl!((T), Box<[T]>, Vec::into_boxed_slice); #[cfg(any(feature = "std", feature = "alloc"))] -impl<'de> Deserialize<'de> for Box { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - String::deserialize(deserializer).map(String::into_boxed_str) - } -} +forwarded_impl!((), Box, String::into_boxed_str); #[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] -impl<'de, T> Deserialize<'de> for Arc -where - T: Deserialize<'de>, -{ - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - T::deserialize(deserializer).map(Arc::new) - } -} +forwarded_impl!((T), Arc, Arc::new); #[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] -impl<'de, T> Deserialize<'de> for Rc -where - T: Deserialize<'de>, -{ - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - T::deserialize(deserializer).map(Rc::new) - } -} +forwarded_impl!((T), Rc, Rc::new); #[cfg(any(feature = "std", feature = "alloc"))] impl<'de, 'a, T: ?Sized> Deserialize<'de> for Cow<'a, T> @@ -1188,43 +1147,13 @@ where } } -impl<'de, T> Deserialize<'de> for RefCell -where - T: Deserialize<'de>, -{ - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - T::deserialize(deserializer).map(RefCell::new) - } -} +forwarded_impl!((T), RefCell, RefCell::new); #[cfg(feature = "std")] -impl<'de, T> Deserialize<'de> for Mutex -where - T: Deserialize<'de>, -{ - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - T::deserialize(deserializer).map(Mutex::new) - } -} +forwarded_impl!((T), Mutex, Mutex::new); #[cfg(feature = "std")] -impl<'de, T> Deserialize<'de> for RwLock -where - T: Deserialize<'de>, -{ - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - T::deserialize(deserializer).map(RwLock::new) - } -} +forwarded_impl!((T), RwLock, RwLock::new); ////////////////////////////////////////////////////////////////////////////////