11
11
use ty;
12
12
13
13
use rustc_data_structures:: indexed_vec:: Idx ;
14
- use serialize:: { self , Encoder , Decoder } ;
14
+ use serialize:: { self , Encoder , Decoder , Decodable , Encodable } ;
15
15
16
16
use std:: fmt;
17
17
use std:: u32;
@@ -146,6 +146,20 @@ impl DefIndex {
146
146
}
147
147
}
148
148
149
+ impl serialize:: UseSpecializedEncodable for DefIndex {
150
+ #[ inline]
151
+ fn default_encode < S : Encoder > ( & self , s : & mut S ) -> Result < ( ) , S :: Error > {
152
+ s. emit_u32 ( self . 0 )
153
+ }
154
+ }
155
+
156
+ impl serialize:: UseSpecializedDecodable for DefIndex {
157
+ #[ inline]
158
+ fn default_decode < D : Decoder > ( d : & mut D ) -> Result < DefIndex , D :: Error > {
159
+ d. read_u32 ( ) . map ( DefIndex )
160
+ }
161
+ }
162
+
149
163
#[ derive( Copy , Clone , Eq , PartialEq , Hash ) ]
150
164
pub enum DefIndexAddressSpace {
151
165
Low = 0 ,
@@ -188,7 +202,6 @@ impl fmt::Debug for DefId {
188
202
}
189
203
}
190
204
191
-
192
205
impl DefId {
193
206
/// Make a local `DefId` with the given index.
194
207
pub fn local ( index : DefIndex ) -> DefId {
@@ -199,3 +212,29 @@ impl DefId {
199
212
self . krate == LOCAL_CRATE
200
213
}
201
214
}
215
+
216
+ impl serialize:: UseSpecializedEncodable for DefId {
217
+ #[ inline]
218
+ fn default_encode < S : Encoder > ( & self , s : & mut S ) -> Result < ( ) , S :: Error > {
219
+ let DefId {
220
+ krate,
221
+ index,
222
+ } = * self ;
223
+
224
+ krate. encode ( s) ?;
225
+ index. encode ( s)
226
+ }
227
+ }
228
+
229
+ impl serialize:: UseSpecializedDecodable for DefId {
230
+ #[ inline]
231
+ fn default_decode < D : Decoder > ( d : & mut D ) -> Result < DefId , D :: Error > {
232
+ let krate = CrateNum :: decode ( d) ?;
233
+ let index = DefIndex :: decode ( d) ?;
234
+
235
+ Ok ( DefId {
236
+ krate,
237
+ index
238
+ } )
239
+ }
240
+ }
0 commit comments