implement Serializable/Deserializable for box types
This commit is contained in:
parent
d689bc8b85
commit
6357c56674
45
src/de.rs
45
src/de.rs
@ -9,8 +9,11 @@
|
|||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use std::collections::{HashMap, TreeMap};
|
use std::collections::{HashMap, TreeMap};
|
||||||
|
use std::gc::{GC, Gc};
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
use std::num;
|
use std::num;
|
||||||
|
use std::rc::Rc;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
#[deriving(Clone, PartialEq, Show)]
|
#[deriving(Clone, PartialEq, Show)]
|
||||||
pub enum Token {
|
pub enum Token {
|
||||||
@ -471,6 +474,48 @@ impl_deserializable!(String, expect_string)
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
impl<T: Deserializable> Deserializable for Box<T> {
|
||||||
|
#[inline]
|
||||||
|
fn deserialize_token<
|
||||||
|
D: Deserializer<E>,
|
||||||
|
E
|
||||||
|
>(d: &mut D, token: Token) -> Result<Box<T>, E> {
|
||||||
|
Ok(box try!(Deserializable::deserialize_token(d, token)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Deserializable + 'static> Deserializable for Gc<T> {
|
||||||
|
#[inline]
|
||||||
|
fn deserialize_token<
|
||||||
|
D: Deserializer<E>,
|
||||||
|
E
|
||||||
|
>(d: &mut D, token: Token) -> Result<Gc<T>, E> {
|
||||||
|
Ok(box (GC) try!(Deserializable::deserialize_token(d, token)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Deserializable> Deserializable for Rc<T> {
|
||||||
|
#[inline]
|
||||||
|
fn deserialize_token<
|
||||||
|
D: Deserializer<E>,
|
||||||
|
E
|
||||||
|
>(d: &mut D, token: Token) -> Result<Rc<T>, E> {
|
||||||
|
Ok(Rc::new(try!(Deserializable::deserialize_token(d, token))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Deserializable + Send + Share> Deserializable for Arc<T> {
|
||||||
|
#[inline]
|
||||||
|
fn deserialize_token<
|
||||||
|
D: Deserializer<E>,
|
||||||
|
E
|
||||||
|
>(d: &mut D, token: Token) -> Result<Arc<T>, E> {
|
||||||
|
Ok(Arc::new(try!(Deserializable::deserialize_token(d, token))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
impl<T: Deserializable> Deserializable for Option<T> {
|
impl<T: Deserializable> Deserializable for Option<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn deserialize_token<
|
fn deserialize_token<
|
||||||
|
27
src/ser.rs
27
src/ser.rs
@ -9,7 +9,10 @@
|
|||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use std::collections::{HashMap, TreeMap};
|
use std::collections::{HashMap, TreeMap};
|
||||||
|
use std::gc::Gc;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
|
use std::rc::Rc;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -162,19 +165,23 @@ impl Serializable for String {
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
impl<
|
macro_rules! impl_serializable_box {
|
||||||
'a,
|
($ty:ty) => {
|
||||||
T: Serializable
|
impl<'a, T: Serializable> Serializable for $ty {
|
||||||
> Serializable for &'a T {
|
#[inline]
|
||||||
#[inline]
|
fn serialize<S: Serializer<E>, E>(&self, s: &mut S) -> Result<(), E> {
|
||||||
fn serialize<
|
(*self).serialize(s)
|
||||||
S: Serializer<E>,
|
}
|
||||||
E
|
}
|
||||||
>(&self, s: &mut S) -> Result<(), E> {
|
|
||||||
(*self).serialize(s)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl_serializable_box!(&'a T)
|
||||||
|
impl_serializable_box!(Box<T>)
|
||||||
|
impl_serializable_box!(Gc<T>)
|
||||||
|
impl_serializable_box!(Rc<T>)
|
||||||
|
impl_serializable_box!(Arc<T>)
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
|
Loading…
x
Reference in New Issue
Block a user