about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-03-04 23:21:42 -0800
committerbors <bors@rust-lang.org>2014-03-04 23:21:42 -0800
commit87a31f6f0f15d70ed0d7243379e2c26cd1a4df37 (patch)
tree12957b48b9a24cc1b30f22166563cf0b71729c2c /src/libstd
parent712c630ab6bc67a934311c0e31ead3a46ae1a75f (diff)
parentbcc5486c17f01f8b98e81c6e478ed6057d34304b (diff)
downloadrust-87a31f6f0f15d70ed0d7243379e2c26cd1a4df37.tar.gz
rust-87a31f6f0f15d70ed0d7243379e2c26cd1a4df37.zip
auto merge of #12491 : eddyb/rust/deref, r=nikomatsakis
Add the `Deref` and `DerefMut` traits and implement overloading explicit dereferences.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/cell.rs23
-rw-r--r--src/libstd/ops.rs22
-rw-r--r--src/libstd/prelude.rs2
-rw-r--r--src/libstd/rc.rs10
4 files changed, 54 insertions, 3 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/ops.rs b/src/libstd/ops.rs
index ac329e6fe83..2d5d37e1abc 100644
--- a/src/libstd/ops.rs
+++ b/src/libstd/ops.rs
@@ -464,6 +464,28 @@ pub trait Index<Index,Result> {
     fn index(&self, index: &Index) -> Result;
 }
 
+#[cfg(stage0)]
+pub trait Deref<Result> {
+    fn deref<'a>(&'a self) -> &'a Result;
+}
+
+#[cfg(not(stage0))]
+#[lang="deref"]
+pub trait Deref<Result> {
+    fn deref<'a>(&'a self) -> &'a Result;
+}
+
+#[cfg(stage0)]
+pub trait DerefMut<Result>: Deref<Result> {
+    fn deref_mut<'a>(&'a mut self) -> &'a mut Result;
+}
+
+#[cfg(not(stage0))]
+#[lang="deref_mut"]
+pub trait DerefMut<Result>: Deref<Result> {
+    fn deref_mut<'a>(&'a mut self) -> &'a mut Result;
+}
+
 #[cfg(test)]
 mod bench {
     extern crate test;
diff --git a/src/libstd/prelude.rs b/src/libstd/prelude.rs
index 19848f65097..c1cd3a6d79f 100644
--- a/src/libstd/prelude.rs
+++ b/src/libstd/prelude.rs
@@ -23,7 +23,7 @@ generally useful to many Rust programs.
 pub use kinds::{Freeze, Pod, Send, Sized};
 pub use ops::{Add, Sub, Mul, Div, Rem, Neg, Not};
 pub use ops::{BitAnd, BitOr, BitXor};
-pub use ops::{Drop};
+pub use ops::{Drop, Deref, DerefMut};
 pub use ops::{Shl, Shr, Index};
 pub use option::{Option, Some, None};
 pub use result::{Result, Ok, Err};
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) {