3131//! variable only once, and it does so as soon as it can, so it is reasonable to ask what the type
3232//! inferencer knows "so far".
3333use super :: InferCtxt ;
34+ use rustc_data_structures:: fx:: FxHashMap ;
3435use rustc_middle:: infer:: unify_key:: ToType ;
3536use rustc_middle:: ty:: fold:: TypeFolder ;
3637use rustc_middle:: ty:: { self , Ty , TyCtxt , TypeFoldable , TypeSuperFoldable , TypeVisitableExt } ;
38+ use std:: collections:: hash_map:: Entry ;
3739
3840pub struct TypeFreshener < ' a , ' tcx > {
3941 infcx : & ' a InferCtxt < ' tcx > ,
4042 ty_freshen_count : u32 ,
4143 const_freshen_count : u32 ,
42- ty_freshen_key_vec : Vec < ty:: InferTy > ,
43- ty_freshen_value_vec : Vec < Ty < ' tcx > > ,
44- const_freshen_key_vec : Vec < ty:: InferConst > ,
45- const_freshen_value_vec : Vec < ty:: Const < ' tcx > > ,
44+ ty_freshen_map : FxHashMap < ty:: InferTy , Ty < ' tcx > > ,
45+ const_freshen_map : FxHashMap < ty:: InferConst , ty:: Const < ' tcx > > ,
4646}
4747
4848impl < ' a , ' tcx > TypeFreshener < ' a , ' tcx > {
@@ -51,10 +51,8 @@ impl<'a, 'tcx> TypeFreshener<'a, 'tcx> {
5151 infcx,
5252 ty_freshen_count : 0 ,
5353 const_freshen_count : 0 ,
54- ty_freshen_key_vec : Vec :: new ( ) ,
55- ty_freshen_value_vec : Vec :: new ( ) ,
56- const_freshen_key_vec : Vec :: new ( ) ,
57- const_freshen_value_vec : Vec :: new ( ) ,
54+ ty_freshen_map : Default :: default ( ) ,
55+ const_freshen_map : Default :: default ( ) ,
5856 }
5957 }
6058
@@ -66,15 +64,15 @@ impl<'a, 'tcx> TypeFreshener<'a, 'tcx> {
6664 return ty. fold_with ( self ) ;
6765 }
6866
69- if let Some ( idx ) = self . ty_freshen_key_vec . iter ( ) . position ( |infty| * infty == key) {
70- unsafe { * self . ty_freshen_value_vec . get_unchecked ( idx ) }
71- } else {
72- let index = self . ty_freshen_count ;
73- self . ty_freshen_count += 1 ;
74- let t = mk_fresh ( index) ;
75- self . ty_freshen_key_vec . push ( key ) ;
76- self . ty_freshen_value_vec . push ( t ) ;
77- t
67+ match self . ty_freshen_map . entry ( key) {
68+ Entry :: Occupied ( entry ) => * entry . get ( ) ,
69+ Entry :: Vacant ( entry ) => {
70+ let index = self . ty_freshen_count ;
71+ self . ty_freshen_count += 1 ;
72+ let t = mk_fresh ( index) ;
73+ entry . insert ( t ) ;
74+ t
75+ }
7876 }
7977 }
8078
@@ -92,15 +90,15 @@ impl<'a, 'tcx> TypeFreshener<'a, 'tcx> {
9290 return ct. fold_with ( self ) ;
9391 }
9492
95- if let Some ( idx ) = self . const_freshen_key_vec . iter ( ) . position ( |infty| * infty == key) {
96- unsafe { * self . const_freshen_value_vec . get_unchecked ( idx ) }
97- } else {
98- let index: u32 = self . const_freshen_count ;
99- self . const_freshen_count += 1 ;
100- let ct = ty:: Const :: new_infer ( self . infcx . tcx , freshener ( index) , ty) ;
101- self . const_freshen_key_vec . push ( key ) ;
102- self . const_freshen_value_vec . push ( ct ) ;
103- ct
93+ match self . const_freshen_map . entry ( key) {
94+ Entry :: Occupied ( entry ) => * entry . get ( ) ,
95+ Entry :: Vacant ( entry ) => {
96+ let index = self . const_freshen_count ;
97+ self . const_freshen_count += 1 ;
98+ let ct = ty:: Const :: new_infer ( self . infcx . tcx , freshener ( index) , ty) ;
99+ entry . insert ( ct ) ;
100+ ct
101+ }
104102 }
105103 }
106104}
0 commit comments