about summary refs log tree commit diff
path: root/src/libserialize
diff options
context:
space:
mode:
authormitchmindtree <mitchell.nordine@gmail.com>2014-07-04 22:24:50 +1000
committermitchmindtree <mitchell.nordine@gmail.com>2014-07-07 13:02:09 +1000
commit0e84d6fc1ae1267eaf38b9c518a6d8f68ff6305c (patch)
treedf1a8f1e2ab0682881923c430c991889f32a15dc /src/libserialize
parent36d7d746c8366d78b332cffdff85318e709b38ca (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.rs30
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
 //