diff --git a/src/libstd/cell.rs b/src/libstd/cell.rs index 3276bbbcbb6..5733504c0d1 100644 --- a/src/libstd/cell.rs +++ b/src/libstd/cell.rs @@ -17,10 +17,11 @@ use fmt; use kinds::{marker, Pod}; use ops::{Deref, DerefMut, Drop}; use option::{None, Option, Some}; +use ty::Unsafe; /// A mutable memory location that admits only `Pod` data. pub struct Cell { - priv value: T, + priv value: Unsafe, priv marker1: marker::InvariantType, priv marker2: marker::NoFreeze, priv marker3: marker::NoShare, @@ -30,7 +31,7 @@ impl Cell { /// Creates a new `Cell` containing the given value. pub fn new(value: T) -> Cell { Cell { - value: value, + value: Unsafe{value: value, marker1: marker::InvariantType::}, marker1: marker::InvariantType::, marker2: marker::NoFreeze, marker3: marker::NoShare, @@ -40,14 +41,14 @@ impl Cell { /// Returns a copy of the contained value. #[inline] pub fn get(&self) -> T { - self.value + unsafe{ *self.value.get() } } /// Sets the contained value. #[inline] pub fn set(&self, value: T) { unsafe { - *cast::transmute_mut(&self.value) = value + *self.value.get() = value; } } } @@ -66,13 +67,13 @@ impl Eq for Cell { impl fmt::Show for Cell { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f.buf, r"Cell \{ value: {} \}", self.value) + write!(f.buf, r"Cell \{ value: {} \}", unsafe{*&self.value.get()}) } } /// A mutable memory location with dynamically checked borrow rules pub struct RefCell { - priv value: T, + priv value: Unsafe, priv borrow: BorrowFlag, priv marker1: marker::InvariantType, priv marker2: marker::NoFreeze, @@ -94,7 +95,7 @@ impl RefCell { marker2: marker::NoFreeze, marker3: marker::NoPod, marker4: marker::NoShare, - value: value, + value: Unsafe{value: value, marker1: marker::InvariantType::}, borrow: UNUSED, } } @@ -102,7 +103,7 @@ impl RefCell { /// Consumes the `RefCell`, returning the wrapped value. pub fn unwrap(self) -> T { assert!(self.borrow == UNUSED); - self.value + unsafe{self.value.unwrap()} } unsafe fn as_mut<'a>(&'a self) -> &'a mut RefCell { @@ -202,7 +203,7 @@ impl RefCell { #[inline] pub fn set(&self, value: T) { let mut reference = self.borrow_mut(); - *reference.get() = value + *reference.get() = value; } } @@ -251,14 +252,14 @@ impl<'b, T> Ref<'b, T> { /// Retrieve an immutable reference to the stored value. #[inline] pub fn get<'a>(&'a self) -> &'a T { - &self.parent.value + unsafe{ &*self.parent.value.get() } } } impl<'b, T> Deref for Ref<'b, T> { #[inline] fn deref<'a>(&'a self) -> &'a T { - &self.parent.value + unsafe{ &*self.parent.value.get() } } } @@ -279,21 +280,21 @@ impl<'b, T> RefMut<'b, T> { /// Retrieve a mutable reference to the stored value. #[inline] pub fn get<'a>(&'a mut self) -> &'a mut T { - &mut self.parent.value + unsafe{ &mut *self.parent.value.get() } } } impl<'b, T> Deref for RefMut<'b, T> { #[inline] fn deref<'a>(&'a self) -> &'a T { - &self.parent.value + unsafe{ &*self.parent.value.get() } } } impl<'b, T> DerefMut for RefMut<'b, T> { #[inline] fn deref_mut<'a>(&'a mut self) -> &'a mut T { - &mut self.parent.value + unsafe{ &mut *self.parent.value.get() } } } diff --git a/src/libstd/ty.rs b/src/libstd/ty.rs index e17e28a84fd..f06ccad7a28 100644 --- a/src/libstd/ty.rs +++ b/src/libstd/ty.rs @@ -76,4 +76,8 @@ impl Unsafe { /// Gets a mutable pointer to the wrapped value #[inline] pub unsafe fn get(&self) -> *mut T { cast::transmute(&self.value) } + + /// Unwraps the value + #[inline] + pub unsafe fn unwrap(self) -> T { self.value } }