@@ -17,10 +17,11 @@ use fmt;
17
17
use kinds:: { marker, Pod } ;
18
18
use ops:: { Deref , DerefMut , Drop } ;
19
19
use option:: { None , Option , Some } ;
20
+ use ty:: Unsafe ;
20
21
21
22
/// A mutable memory location that admits only `Pod` data.
22
23
pub struct Cell < T > {
23
- priv value : T ,
24
+ priv value : Unsafe < T > ,
24
25
priv marker1 : marker:: InvariantType < T > ,
25
26
priv marker2 : marker:: NoFreeze ,
26
27
priv marker3 : marker:: NoShare ,
@@ -30,7 +31,7 @@ impl<T:Pod> Cell<T> {
30
31
/// Creates a new `Cell` containing the given value.
31
32
pub fn new ( value : T ) -> Cell < T > {
32
33
Cell {
33
- value : value,
34
+ value : Unsafe { value : value , marker1 : marker :: InvariantType :: < T > } ,
34
35
marker1 : marker:: InvariantType :: < T > ,
35
36
marker2 : marker:: NoFreeze ,
36
37
marker3 : marker:: NoShare ,
@@ -40,14 +41,14 @@ impl<T:Pod> Cell<T> {
40
41
/// Returns a copy of the contained value.
41
42
#[ inline]
42
43
pub fn get ( & self ) -> T {
43
- self . value
44
+ unsafe { * self . value . get ( ) }
44
45
}
45
46
46
47
/// Sets the contained value.
47
48
#[ inline]
48
49
pub fn set ( & self , value : T ) {
49
50
unsafe {
50
- * cast :: transmute_mut ( & self . value ) = value
51
+ * self . value . get ( ) = value;
51
52
}
52
53
}
53
54
}
@@ -66,13 +67,13 @@ impl<T:Eq + Pod> Eq for Cell<T> {
66
67
67
68
impl < T : fmt:: Show > fmt:: Show for Cell < T > {
68
69
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
69
- write ! ( f. buf, r"Cell \{ value: {} \}" , self . value)
70
+ write ! ( f. buf, r"Cell \{ value: {} \}" , unsafe { * & self . value. get ( ) } )
70
71
}
71
72
}
72
73
73
74
/// A mutable memory location with dynamically checked borrow rules
74
75
pub struct RefCell < T > {
75
- priv value : T ,
76
+ priv value : Unsafe < T > ,
76
77
priv borrow : BorrowFlag ,
77
78
priv marker1 : marker:: InvariantType < T > ,
78
79
priv marker2 : marker:: NoFreeze ,
@@ -94,15 +95,15 @@ impl<T> RefCell<T> {
94
95
marker2 : marker:: NoFreeze ,
95
96
marker3 : marker:: NoPod ,
96
97
marker4 : marker:: NoShare ,
97
- value : value,
98
+ value : Unsafe { value : value , marker1 : marker :: InvariantType :: < T > } ,
98
99
borrow : UNUSED ,
99
100
}
100
101
}
101
102
102
103
/// Consumes the `RefCell`, returning the wrapped value.
103
104
pub fn unwrap ( self ) -> T {
104
105
assert ! ( self . borrow == UNUSED ) ;
105
- self . value
106
+ unsafe { self . value . unwrap ( ) }
106
107
}
107
108
108
109
unsafe fn as_mut < ' a > ( & ' a self ) -> & ' a mut RefCell < T > {
@@ -202,7 +203,7 @@ impl<T> RefCell<T> {
202
203
#[ inline]
203
204
pub fn set ( & self , value : T ) {
204
205
let mut reference = self . borrow_mut ( ) ;
205
- * reference. get ( ) = value
206
+ * reference. get ( ) = value;
206
207
}
207
208
}
208
209
@@ -251,14 +252,14 @@ impl<'b, T> Ref<'b, T> {
251
252
/// Retrieve an immutable reference to the stored value.
252
253
#[ inline]
253
254
pub fn get < ' a > ( & ' a self ) -> & ' a T {
254
- & self . parent . value
255
+ unsafe { & * self . parent . value . get ( ) }
255
256
}
256
257
}
257
258
258
259
impl < ' b , T > Deref < T > for Ref < ' b , T > {
259
260
#[ inline]
260
261
fn deref < ' a > ( & ' a self ) -> & ' a T {
261
- & self . parent . value
262
+ unsafe { & * self . parent . value . get ( ) }
262
263
}
263
264
}
264
265
@@ -279,21 +280,21 @@ impl<'b, T> RefMut<'b, T> {
279
280
/// Retrieve a mutable reference to the stored value.
280
281
#[ inline]
281
282
pub fn get < ' a > ( & ' a mut self ) -> & ' a mut T {
282
- & mut self . parent . value
283
+ unsafe { & mut * self . parent . value . get ( ) }
283
284
}
284
285
}
285
286
286
287
impl < ' b , T > Deref < T > for RefMut < ' b , T > {
287
288
#[ inline]
288
289
fn deref < ' a > ( & ' a self ) -> & ' a T {
289
- & self . parent . value
290
+ unsafe { & * self . parent . value . get ( ) }
290
291
}
291
292
}
292
293
293
294
impl < ' b , T > DerefMut < T > for RefMut < ' b , T > {
294
295
#[ inline]
295
296
fn deref_mut < ' a > ( & ' a mut self ) -> & ' a mut T {
296
- & mut self . parent . value
297
+ unsafe { & mut * self . parent . value . get ( ) }
297
298
}
298
299
}
299
300
0 commit comments