mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Implemented Decodable/Encodable for Cell and RefCell. Fixes #15395
Updated PR with fixme and test Updated PR with fixme and test
This commit is contained in:
parent
36d7d746c8
commit
0e84d6fc1a
@ -17,6 +17,7 @@ Core encoding and decoding interfaces.
|
||||
use std::path;
|
||||
use std::rc::Rc;
|
||||
use std::gc::{Gc, GC};
|
||||
use std::cell::{Cell, RefCell};
|
||||
|
||||
pub trait Encoder<E> {
|
||||
// Primitive types:
|
||||
@ -536,6 +537,35 @@ impl<E, D: Decoder<E>> Decodable<D, E> for path::windows::Path {
|
||||
}
|
||||
}
|
||||
|
||||
impl<E, S: Encoder<E>, T: Encodable<S, E> + Copy> Encodable<S, E> for Cell<T> {
|
||||
fn encode(&self, s: &mut S) -> Result<(), E> {
|
||||
self.get().encode(s)
|
||||
}
|
||||
}
|
||||
|
||||
impl<E, D: Decoder<E>, T: Decodable<D, E> + Copy> Decodable<D, E> for Cell<T> {
|
||||
fn decode(d: &mut D) -> Result<Cell<T>, E> {
|
||||
Ok(Cell::new(try!(Decodable::decode(d))))
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: #15036
|
||||
// Should use `try_borrow`, returning a
|
||||
// `encoder.error("attempting to Encode borrowed RefCell")`
|
||||
// from `encode` when `try_borrow` returns `None`.
|
||||
|
||||
impl<E, S: Encoder<E>, T: Encodable<S, E>> Encodable<S, E> for RefCell<T> {
|
||||
fn encode(&self, s: &mut S) -> Result<(), E> {
|
||||
self.borrow().encode(s)
|
||||
}
|
||||
}
|
||||
|
||||
impl<E, D: Decoder<E>, T: Decodable<D, E>> Decodable<D, E> for RefCell<T> {
|
||||
fn decode(d: &mut D) -> Result<RefCell<T>, E> {
|
||||
Ok(RefCell::new(try!(Decodable::decode(d))))
|
||||
}
|
||||
}
|
||||
|
||||
// ___________________________________________________________________________
|
||||
// Helper routines
|
||||
//
|
||||
|
@ -0,0 +1,55 @@
|
||||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// This briefuly tests the capability of `Cell` and `RefCell` to implement the
|
||||
// `Encodable` and `Decodable` traits via `#[deriving(Encodable, Decodable)]`
|
||||
|
||||
extern crate serialize;
|
||||
|
||||
use std::cell::{Cell, RefCell};
|
||||
use std::io::MemWriter;
|
||||
use serialize::{Encodable, Decodable};
|
||||
use serialize::ebml;
|
||||
use serialize::ebml::writer::Encoder;
|
||||
use serialize::ebml::reader::Decoder;
|
||||
|
||||
#[deriving(Encodable, Decodable)]
|
||||
struct A {
|
||||
baz: int
|
||||
}
|
||||
|
||||
#[deriving(Encodable, Decodable)]
|
||||
struct B {
|
||||
foo: Cell<bool>,
|
||||
bar: RefCell<A>,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let obj = B {
|
||||
foo: Cell::new(true),
|
||||
bar: RefCell::new( A { baz: 2 } )
|
||||
};
|
||||
let mut w = MemWriter::new();
|
||||
{
|
||||
let mut e = Encoder::new(&mut w);
|
||||
match obj.encode(&mut e) {
|
||||
Ok(()) => (),
|
||||
Err(e) => fail!("Failed to encode: {}", e)
|
||||
};
|
||||
}
|
||||
let doc = ebml::Doc::new(w.get_ref());
|
||||
let mut dec = Decoder::new(doc);
|
||||
let obj2: B = match Decodable::decode(&mut dec) {
|
||||
Ok(v) => v,
|
||||
Err(e) => fail!("Failed to decode: {}", e)
|
||||
};
|
||||
assert!(obj.foo.get() == obj2.foo.get());
|
||||
assert!(obj.bar.borrow().baz == obj2.bar.borrow().baz);
|
||||
}
|
Loading…
Reference in New Issue
Block a user