Skip to content

Commit 52532d1

Browse files
committed
Implement DerefImm for Rc and DerefImm/DerefMut for RefCell's Ref/RefMut.
1 parent 3b125ff commit 52532d1

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/libstd/cell.rs

+22-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use clone::{Clone, DeepClone};
1515
use cmp::Eq;
1616
use fmt;
1717
use kinds::{marker, Pod};
18-
use ops::Drop;
18+
use ops::{Deref, DerefMut, Drop};
1919
use option::{None, Option, Some};
2020

2121
/// A mutable memory location that admits only `Pod` data.
@@ -258,6 +258,13 @@ impl<'b, T> Ref<'b, T> {
258258
}
259259
}
260260

261+
impl<'b, T> Deref<T> for Ref<'b, T> {
262+
#[inline]
263+
fn deref<'a>(&'a self) -> &'a T {
264+
&self.parent.value
265+
}
266+
}
267+
261268
/// Wraps a mutable borrowed reference to a value in a `RefCell` box.
262269
pub struct RefMut<'b, T> {
263270
priv parent: &'b mut RefCell<T>
@@ -279,6 +286,20 @@ impl<'b, T> RefMut<'b, T> {
279286
}
280287
}
281288

289+
impl<'b, T> Deref<T> for RefMut<'b, T> {
290+
#[inline]
291+
fn deref<'a>(&'a self) -> &'a T {
292+
&self.parent.value
293+
}
294+
}
295+
296+
impl<'b, T> DerefMut<T> for RefMut<'b, T> {
297+
#[inline]
298+
fn deref_mut<'a>(&'a mut self) -> &'a mut T {
299+
&mut self.parent.value
300+
}
301+
}
302+
282303
#[cfg(test)]
283304
mod test {
284305
use super::*;

src/libstd/rc.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use cast::transmute;
2727
use clone::{Clone, DeepClone};
2828
use cmp::{Eq, Ord};
2929
use kinds::marker;
30-
use ops::Drop;
30+
use ops::{Deref, Drop};
3131
use option::{Option, Some, None};
3232
use ptr;
3333
use rt::global_heap::exchange_free;
@@ -78,6 +78,14 @@ impl<T> Rc<T> {
7878
}
7979
}
8080

81+
impl<T> Deref<T> for Rc<T> {
82+
/// Borrow the value contained in the reference-counted box
83+
#[inline(always)]
84+
fn deref<'a>(&'a self) -> &'a T {
85+
unsafe { &(*self.ptr).value }
86+
}
87+
}
88+
8189
#[unsafe_destructor]
8290
impl<T> Drop for Rc<T> {
8391
fn drop(&mut self) {

0 commit comments

Comments
 (0)