@@ -31,13 +31,15 @@ pub struct Handlers {
31
31
32
32
pub unsafe trait Condemned {
33
33
fn feilds ( s : & Self , grey_feilds : u8 , region : Range < usize > ) -> u8 ;
34
- fn evacuate < ' e , const OFFSET : u8 > (
34
+ fn evacuate < ' e > (
35
35
s : & Self ,
36
+ offset : u8 ,
36
37
grey_feilds : u8 ,
37
38
region : Range < usize > ,
38
39
handlers : & mut Handlers ,
39
40
) ;
40
41
42
+ const GC_COUNT : u8 ;
41
43
const PRE_CONDTION : bool ;
42
44
}
43
45
@@ -52,8 +54,9 @@ unsafe impl<T> Condemned for T {
52
54
}
53
55
}
54
56
55
- default fn evacuate < ' e , const OFFSET : u8 > ( _: & Self , _: u8 , _: Range < usize > , _: & mut Handlers ) { }
57
+ default fn evacuate < ' e > ( _: & Self , _ : u8 , _: u8 , _: Range < usize > , _: & mut Handlers ) { }
56
58
59
+ default const GC_COUNT : u8 = 0 ;
57
60
default const PRE_CONDTION : bool = if T :: HAS_GC {
58
61
// TODO When fmt is allowed in const s/your type/type_name::<T>()
59
62
panic ! ( "You need to derive Condemned for your type. Required due to a direct Gc<T>" ) ;
@@ -66,17 +69,18 @@ unsafe impl<'r, T> Condemned for Gc<'r, T> {
66
69
fn feilds ( _: & Self , _: u8 , _: std:: ops:: Range < usize > ) -> u8 {
67
70
0b0000_0000
68
71
}
69
- const PRE_CONDTION : bool = true ;
70
- fn evacuate < ' e , const OFFSET : u8 > (
72
+
73
+ fn evacuate < ' e > (
71
74
s : & Self ,
75
+ offset : u8 ,
72
76
_: u8 ,
73
77
region : std:: ops:: Range < usize > ,
74
78
handlers : & mut Handlers ,
75
79
) {
76
80
let ptr = s. ptr as * const T ;
77
81
let addr = ptr as usize ;
78
82
if region. contains ( & addr) {
79
- let i = handlers. translation [ OFFSET as usize ] ;
83
+ let i = handlers. translation [ offset as usize ] ;
80
84
if let Some ( next) = handlers. nexts . get_mut ( i as usize ) {
81
85
let next_addr = * next as usize ;
82
86
let header_addr = next_addr - next_addr % ARENA_SIZE ;
@@ -105,6 +109,9 @@ unsafe impl<'r, T> Condemned for Gc<'r, T> {
105
109
}
106
110
}
107
111
}
112
+
113
+ const GC_COUNT : u8 = 1 ;
114
+ const PRE_CONDTION : bool = T :: PRE_CONDTION ;
108
115
}
109
116
110
117
// std impls
@@ -117,14 +124,15 @@ unsafe impl<T> Condemned for Option<T> {
117
124
}
118
125
}
119
126
120
- fn evacuate < ' e , const OFFSET : u8 > (
127
+ fn evacuate < ' e > (
121
128
s : & Self ,
129
+ offset : u8 ,
122
130
grey_feilds : u8 ,
123
131
region : Range < usize > ,
124
132
handlers : & mut Handlers ,
125
133
) {
126
134
match s {
127
- Some ( t) => Condemned :: evacuate :: < OFFSET > ( t , grey_feilds, region, handlers) ,
135
+ Some ( t) => Condemned :: evacuate ( t , offset , grey_feilds, region, handlers) ,
128
136
None => ( ) ,
129
137
}
130
138
}
@@ -135,3 +143,43 @@ unsafe impl<T> Condemned for Option<T> {
135
143
panic!( "You need to derive Condemned for T. Required due to a direct Gc<A> in Option<T>" ) ;
136
144
} ;
137
145
}
146
+
147
+ unsafe impl < A , B > Condemned for ( A , B ) {
148
+ fn feilds ( ( a, b) : & Self , grey_feilds : u8 , region : Range < usize > ) -> u8 {
149
+ let mut r = 0b0000_0000 ;
150
+ if ( grey_feilds & 0b1000_0000 ) == 0b1000_0000 {
151
+ r |= Condemned :: feilds ( a, grey_feilds, region. clone ( ) ) ;
152
+ } ;
153
+
154
+ if ( grey_feilds & 0b0100_0000 ) == 0b0100_0000 {
155
+ r |= Condemned :: feilds ( b, grey_feilds, region) ;
156
+ } ;
157
+
158
+ r
159
+ }
160
+
161
+ fn evacuate < ' e > (
162
+ ( a, b) : & Self ,
163
+ offset : u8 ,
164
+ grey_feilds : u8 ,
165
+ region : Range < usize > ,
166
+ handlers : & mut Handlers ,
167
+ ) {
168
+ Condemned :: evacuate ( a, offset, grey_feilds, region. clone ( ) , handlers) ;
169
+
170
+ Condemned :: evacuate (
171
+ b,
172
+ offset + A :: GC_COUNT ,
173
+ grey_feilds,
174
+ region. clone ( ) ,
175
+ handlers,
176
+ ) ;
177
+ }
178
+
179
+ const GC_COUNT : u8 = A :: GC_COUNT + B :: GC_COUNT ;
180
+ const PRE_CONDTION : bool = if A :: PRE_CONDTION && B :: PRE_CONDTION {
181
+ true
182
+ } else {
183
+ panic ! ( "You need to derive Condemned for A & B. Required due to a direct Gc<T> in (A, B)" ) ;
184
+ } ;
185
+ }
0 commit comments