1111use ty;
1212
1313use rustc_data_structures:: indexed_vec:: Idx ;
14- use serialize:: { self , Encoder , Decoder } ;
14+ use serialize:: { self , Encoder , Decoder , Decodable , Encodable } ;
1515
1616use std:: fmt;
1717use std:: u32;
@@ -146,6 +146,20 @@ impl DefIndex {
146146 }
147147}
148148
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+
149163#[ derive( Copy , Clone , Eq , PartialEq , Hash ) ]
150164pub enum DefIndexAddressSpace {
151165 Low = 0 ,
@@ -188,7 +202,6 @@ impl fmt::Debug for DefId {
188202 }
189203}
190204
191-
192205impl DefId {
193206 /// Make a local `DefId` with the given index.
194207 pub fn local ( index : DefIndex ) -> DefId {
@@ -199,3 +212,29 @@ impl DefId {
199212 self . krate == LOCAL_CRATE
200213 }
201214}
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