diff options
| -rw-r--r-- | src/libcore/cell.rs | 7 | ||||
| -rw-r--r-- | src/libcore/option.rs | 10 | ||||
| -rw-r--r-- | src/libstd/rc.rs | 22 |
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); |
