3
3
Module for wrapping freezable data structures in managed boxes.
4
4
Normally freezable data structures require an unaliased reference,
5
5
such as `T` or `~T`, so that the compiler can track when they are
6
- being mutated. The `rw <T>` type converts these static checks into
6
+ being mutated. The `managed <T>` type converts these static checks into
7
7
dynamic checks: your program will fail if you attempt to perform
8
8
mutation when the data structure should be immutable.
9
9
@@ -21,8 +21,8 @@ export Managed;
21
21
enum Mode { ReadOnly , Mutable , Immutable }
22
22
23
23
struct Data < T > {
24
- mut value : T ;
25
- mut mode: Mode ;
24
+ priv mut value : T ;
25
+ priv mut mode: Mode ;
26
26
}
27
27
28
28
type Managed < T > = @Data < T > ;
@@ -60,3 +60,82 @@ impl<T> Data<T> {
60
60
}
61
61
}
62
62
}
63
+
64
+ #[ test]
65
+ #[ should_fail]
66
+ fn test_mut_in_imm ( ) {
67
+ let m = Managed ( 1 ) ;
68
+ do m. borrow_imm |_p| {
69
+ do m. borrow_mut |_q| {
70
+ // should not be permitted
71
+ }
72
+ }
73
+ }
74
+
75
+ #[ test]
76
+ #[ should_fail]
77
+ fn test_imm_in_mut ( ) {
78
+ let m = Managed ( 1 ) ;
79
+ do m. borrow_mut |_p| {
80
+ do m. borrow_imm |_q| {
81
+ // should not be permitted
82
+ }
83
+ }
84
+ }
85
+
86
+ #[ test]
87
+ fn test_const_in_mut ( ) {
88
+ let m = Managed ( 1 ) ;
89
+ do m. borrow_mut |p| {
90
+ do m. borrow_const |q| {
91
+ assert * p == * q;
92
+ * p += 1 ;
93
+ assert * p == * q;
94
+ }
95
+ }
96
+ }
97
+
98
+ #[ test]
99
+ fn test_mut_in_const ( ) {
100
+ let m = Managed ( 1 ) ;
101
+ do m. borrow_const |p| {
102
+ do m. borrow_mut |q| {
103
+ assert * p == * q;
104
+ * q += 1 ;
105
+ assert * p == * q;
106
+ }
107
+ }
108
+ }
109
+
110
+ #[ test]
111
+ fn test_imm_in_const ( ) {
112
+ let m = Managed ( 1 ) ;
113
+ do m. borrow_const |p| {
114
+ do m. borrow_imm |q| {
115
+ assert * p == * q;
116
+ }
117
+ }
118
+ }
119
+
120
+ #[ test]
121
+ fn test_const_in_imm ( ) {
122
+ let m = Managed ( 1 ) ;
123
+ do m. borrow_imm |p| {
124
+ do m. borrow_const |q| {
125
+ assert * p == * q;
126
+ }
127
+ }
128
+ }
129
+
130
+
131
+ #[ test]
132
+ #[ should_fail]
133
+ fn test_mut_in_imm_in_const ( ) {
134
+ let m = Managed ( 1 ) ;
135
+ do m. borrow_const |_p| {
136
+ do m. borrow_imm |_q| {
137
+ do m. borrow_mut |_r| {
138
+ }
139
+ }
140
+ }
141
+ }
0 commit comments