mirror of
https://github.com/serde-rs/serde.git
synced 2025-10-02 15:25:38 +00:00
Deserialize unsized Arc and Rc
This commit is contained in:
parent
a42008f695
commit
972da59ebc
@ -1112,10 +1112,10 @@ forwarded_impl!((T), Box<[T]>, Vec::into_boxed_slice);
|
|||||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||||
forwarded_impl!((), Box<str>, String::into_boxed_str);
|
forwarded_impl!((), Box<str>, String::into_boxed_str);
|
||||||
|
|
||||||
#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
|
#[cfg(all(not(feature = "unstable"), feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||||
forwarded_impl!((T), Arc<T>, Arc::new);
|
forwarded_impl!((T), Arc<T>, Arc::new);
|
||||||
|
|
||||||
#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
|
#[cfg(all(not(feature = "unstable"), feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||||
forwarded_impl!((T), Rc<T>, Rc::new);
|
forwarded_impl!((T), Rc<T>, Rc::new);
|
||||||
|
|
||||||
#[cfg(any(feature = "std", feature = "alloc"))]
|
#[cfg(any(feature = "std", feature = "alloc"))]
|
||||||
@ -1135,6 +1135,31 @@ where
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#[cfg(all(feature = "unstable", feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||||
|
macro_rules! box_forwarded_impl {
|
||||||
|
($t:ident) => {
|
||||||
|
impl<'de, T: ?Sized> Deserialize<'de> for $t<T>
|
||||||
|
where
|
||||||
|
Box<T>: Deserialize<'de>,
|
||||||
|
{
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
Box::deserialize(deserializer).map(Into::into)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(all(feature = "unstable", feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||||
|
box_forwarded_impl!(Rc);
|
||||||
|
|
||||||
|
#[cfg(all(feature = "unstable", feature = "rc", any(feature = "std", feature = "alloc")))]
|
||||||
|
box_forwarded_impl!(Arc);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
impl<'de, T> Deserialize<'de> for Cell<T>
|
impl<'de, T> Deserialize<'de> for Cell<T>
|
||||||
where
|
where
|
||||||
T: Deserialize<'de> + Copy,
|
T: Deserialize<'de> + Copy,
|
||||||
|
@ -15,6 +15,8 @@ use std::path::{Path, PathBuf};
|
|||||||
use std::time::{Duration, UNIX_EPOCH};
|
use std::time::{Duration, UNIX_EPOCH};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use std::ffi::{CString, OsString};
|
use std::ffi::{CString, OsString};
|
||||||
|
use std::rc::Rc;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
#[cfg(feature = "unstable")]
|
#[cfg(feature = "unstable")]
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
@ -740,6 +742,40 @@ declare_tests! {
|
|||||||
Token::Bytes(b"abc"),
|
Token::Bytes(b"abc"),
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
test_rc {
|
||||||
|
Rc::new(true) => &[
|
||||||
|
Token::Bool(true),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
test_arc {
|
||||||
|
Arc::new(true) => &[
|
||||||
|
Token::Bool(true),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "unstable")]
|
||||||
|
declare_tests! {
|
||||||
|
test_rc_dst {
|
||||||
|
Rc::<str>::from("s") => &[
|
||||||
|
Token::Str("s"),
|
||||||
|
],
|
||||||
|
Rc::<[bool]>::from(&[true][..]) => &[
|
||||||
|
Token::Seq { len: Some(1) },
|
||||||
|
Token::Bool(true),
|
||||||
|
Token::SeqEnd,
|
||||||
|
],
|
||||||
|
}
|
||||||
|
test_arc_dst {
|
||||||
|
Arc::<str>::from("s") => &[
|
||||||
|
Token::Str("s"),
|
||||||
|
],
|
||||||
|
Arc::<[bool]>::from(&[true][..]) => &[
|
||||||
|
Token::Seq { len: Some(1) },
|
||||||
|
Token::Bool(true),
|
||||||
|
Token::SeqEnd,
|
||||||
|
],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user