about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libcore/cell.rs7
-rw-r--r--src/libcore/option.rs10
-rw-r--r--src/libstd/rc.rs22
3 files changed, 24 insertions, 15 deletions
diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs
index cacde5535db..87e8d0525e5 100644
--- a/src/libcore/cell.rs
+++ b/src/libcore/cell.rs
@@ -21,10 +21,17 @@ Similar to a mutable option type, but friendlier.
 */
 
 #[mutable]
+#[deriving(Clone)]
 pub struct Cell<T> {
     priv value: Option<T>
 }
 
+impl<T: DeepClone> DeepClone for Cell<T> {
+    fn deep_clone(&self) -> Cell<T> {
+        Cell{value: self.value.deep_clone()}
+    }
+}
+
 impl<T:cmp::Eq> cmp::Eq for Cell<T> {
     fn eq(&self, other: &Cell<T>) -> bool {
         (self.value) == (other.value)
diff --git a/src/libcore/option.rs b/src/libcore/option.rs
index 9aaa2921fe7..5aee3077e48 100644
--- a/src/libcore/option.rs
+++ b/src/libcore/option.rs
@@ -49,6 +49,7 @@ use num::Zero;
 use old_iter::{BaseIter, MutableIter, ExtendedIter};
 use old_iter;
 use str::StrSlice;
+use clone::DeepClone;
 
 #[cfg(test)] use str;
 
@@ -59,6 +60,15 @@ pub enum Option<T> {
     Some(T),
 }
 
+impl<T: DeepClone> DeepClone for Option<T> {
+    fn deep_clone(&self) -> Option<T> {
+        match *self {
+            Some(ref x) => Some(x.deep_clone()),
+            None => None
+        }
+    }
+}
+
 impl<T:Ord> Ord for Option<T> {
     fn lt(&self, other: &Option<T>) -> bool {
         match (self, other) {
diff --git a/src/libstd/rc.rs b/src/libstd/rc.rs
index 41fcc1d402e..cb0798f2a39 100644
--- a/src/libstd/rc.rs
+++ b/src/libstd/rc.rs
@@ -103,28 +103,20 @@ mod test_rc {
     fn test_clone() {
         let x = Rc::new(Cell(5));
         let y = x.clone();
-        do x.with_borrow |cell| {
-            do value.with_mut_ref |inner| {
-                *inner = 20;
-            }
-        }
-        do y.with_borrow |value| {
-            assert_eq!(value.take(), 20);
+        do x.borrow().with_mut_ref |inner| {
+            *inner = 20;
         }
+        assert_eq!(y.borrow().take(), 20);
     }
 
     #[test]
     fn test_deep_clone() {
         let x = Rc::new(Cell(5));
         let y = x.deep_clone();
-        do x.with_borrow |cell| {
-            do value.with_mut_ref |inner| {
-                *inner = 20;
-            }
-        }
-        do y.with_borrow |value| {
-            assert_eq!(value.take(), 5);
+        do x.borrow().with_mut_ref |inner| {
+            *inner = 20;
         }
+        assert_eq!(y.borrow().take(), 5);
     }
 
     #[test]
@@ -134,7 +126,7 @@ mod test_rc {
     }
 
     #[test]
-    fn test_clone() {
+    fn test_simple_clone() {
         let x = Rc::new(5);
         let y = x.clone();
         assert_eq!(*x.borrow(), 5);