about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEduard Burtescu <edy.burt@gmail.com>2014-02-26 23:07:23 +0200
committerEduard Burtescu <edy.burt@gmail.com>2014-03-04 16:41:48 +0200
commit52532d13a6e72e4bf7f931a93f902de47d667baf (patch)
treeea0a5c30d91d54838a544b0263fc1f26a4b22ead /src
parent3b125ff3bbe77a8601ba2d424e8aa6f254abfd19 (diff)
downloadrust-52532d13a6e72e4bf7f931a93f902de47d667baf.tar.gz
rust-52532d13a6e72e4bf7f931a93f902de47d667baf.zip
Implement DerefImm for Rc and DerefImm/DerefMut for RefCell's Ref/RefMut.
Diffstat (limited to 'src')
-rw-r--r--src/libstd/cell.rs23
-rw-r--r--src/libstd/rc.rs10
2 files changed, 31 insertions, 2 deletions
diff --git a/src/libstd/cell.rs b/src/libstd/cell.rs
index 12524499a32..f4b530644a7 100644
--- a/src/libstd/cell.rs
+++ b/src/libstd/cell.rs
@@ -15,7 +15,7 @@ use clone::{Clone, DeepClone};
 use cmp::Eq;
 use fmt;
 use kinds::{marker, Pod};
-use ops::Drop;
+use ops::{Deref, DerefMut, Drop};
 use option::{None, Option, Some};
 
 /// A mutable memory location that admits only `Pod` data.
@@ -258,6 +258,13 @@ impl<'b, T> Ref<'b, T> {
     }
 }
 
+impl<'b, T> Deref<T> for Ref<'b, T> {
+    #[inline]
+    fn deref<'a>(&'a self) -> &'a T {
+        &self.parent.value
+    }
+}
+
 /// Wraps a mutable borrowed reference to a value in a `RefCell` box.
 pub struct RefMut<'b, T> {
     priv parent: &'b mut RefCell<T>
@@ -279,6 +286,20 @@ impl<'b, T> RefMut<'b, T> {
     }
 }
 
+impl<'b, T> Deref<T> for RefMut<'b, T> {
+    #[inline]
+    fn deref<'a>(&'a self) -> &'a T {
+        &self.parent.value
+    }
+}
+
+impl<'b, T> DerefMut<T> for RefMut<'b, T> {
+    #[inline]
+    fn deref_mut<'a>(&'a mut self) -> &'a mut T {
+        &mut self.parent.value
+    }
+}
+
 #[cfg(test)]
 mod test {
     use super::*;
diff --git a/src/libstd/rc.rs b/src/libstd/rc.rs
index ea3d5e0edac..5daf6e797be 100644
--- a/src/libstd/rc.rs
+++ b/src/libstd/rc.rs
@@ -27,7 +27,7 @@ use cast::transmute;
 use clone::{Clone, DeepClone};
 use cmp::{Eq, Ord};
 use kinds::marker;
-use ops::Drop;
+use ops::{Deref, Drop};
 use option::{Option, Some, None};
 use ptr;
 use rt::global_heap::exchange_free;
@@ -78,6 +78,14 @@ impl<T> Rc<T> {
     }
 }
 
+impl<T> Deref<T> for Rc<T> {
+    /// Borrow the value contained in the reference-counted box
+    #[inline(always)]
+    fn deref<'a>(&'a self) -> &'a T {
+        unsafe { &(*self.ptr).value }
+    }
+}
+
 #[unsafe_destructor]
 impl<T> Drop for Rc<T> {
     fn drop(&mut self) {