diff options
| author | bors <bors@rust-lang.org> | 2014-03-04 23:21:42 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-03-04 23:21:42 -0800 |
| commit | 87a31f6f0f15d70ed0d7243379e2c26cd1a4df37 (patch) | |
| tree | 12957b48b9a24cc1b30f22166563cf0b71729c2c /src/libstd | |
| parent | 712c630ab6bc67a934311c0e31ead3a46ae1a75f (diff) | |
| parent | bcc5486c17f01f8b98e81c6e478ed6057d34304b (diff) | |
| download | rust-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.rs | 23 | ||||
| -rw-r--r-- | src/libstd/ops.rs | 22 | ||||
| -rw-r--r-- | src/libstd/prelude.rs | 2 | ||||
| -rw-r--r-- | src/libstd/rc.rs | 10 |
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) { |
