diff options
| author | mitchmindtree <mitchell.nordine@gmail.com> | 2014-07-04 22:24:50 +1000 |
|---|---|---|
| committer | mitchmindtree <mitchell.nordine@gmail.com> | 2014-07-07 13:02:09 +1000 |
| commit | 0e84d6fc1ae1267eaf38b9c518a6d8f68ff6305c (patch) | |
| tree | df1a8f1e2ab0682881923c430c991889f32a15dc /src/libserialize | |
| parent | 36d7d746c8366d78b332cffdff85318e709b38ca (diff) | |
Implemented Decodable/Encodable for Cell and RefCell. Fixes #15395
Updated PR with fixme and test Updated PR with fixme and test
Diffstat (limited to 'src/libserialize')
| -rw-r--r-- | src/libserialize/serialize.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/libserialize/serialize.rs b/src/libserialize/serialize.rs index 0ed555e392f..03d9445b9b9 100644 --- a/src/libserialize/serialize.rs +++ b/src/libserialize/serialize.rs @@ -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 // |
