1- use crate :: fx:: FxHashMap ;
1+ use crate :: fx:: FxIndexSet ;
22use crate :: stable_hasher:: { HashStable , StableHasher } ;
33use crate :: sync:: Lock ;
44use rustc_index:: bit_set:: BitMatrix ;
@@ -13,10 +13,7 @@ mod tests;
1313#[ derive( Clone , Debug ) ]
1414pub struct TransitiveRelation < T : Eq + Hash > {
1515 // List of elements. This is used to map from a T to a usize.
16- elements : Vec < T > ,
17-
18- // Maps each element to an index.
19- map : FxHashMap < T , Index > ,
16+ elements : FxIndexSet < T > ,
2017
2118 // List of base edges in the graph. Require to compute transitive
2219 // closure.
@@ -39,7 +36,6 @@ impl<T: Eq + Hash> Default for TransitiveRelation<T> {
3936 fn default ( ) -> Self {
4037 TransitiveRelation {
4138 elements : Default :: default ( ) ,
42- map : Default :: default ( ) ,
4339 edges : Default :: default ( ) ,
4440 closure : Default :: default ( ) ,
4541 }
@@ -65,20 +61,16 @@ impl<T: Clone + Debug + Eq + Hash> TransitiveRelation<T> {
6561 }
6662
6763 fn index ( & self , a : & T ) -> Option < Index > {
68- self . map . get ( a) . cloned ( )
64+ self . elements . get_index_of ( a) . map ( Index )
6965 }
7066
7167 fn add_index ( & mut self , a : T ) -> Index {
72- let & mut TransitiveRelation { ref mut elements, ref mut closure, ref mut map, .. } = self ;
73-
74- * map. entry ( a. clone ( ) ) . or_insert_with ( || {
75- elements. push ( a) ;
76-
68+ let ( index, added) = self . elements . insert_full ( a) ;
69+ if added {
7770 // if we changed the dimensions, clear the cache
78- * closure. get_mut ( ) = None ;
79-
80- Index ( elements. len ( ) - 1 )
81- } )
71+ * self . closure . get_mut ( ) = None ;
72+ }
73+ Index ( index)
8274 }
8375
8476 /// Applies the (partial) function to each edge and returns a new
@@ -430,14 +422,11 @@ where
430422{
431423 fn decode < D : Decoder > ( d : & mut D ) -> Result < Self , D :: Error > {
432424 d. read_struct ( "TransitiveRelation" , 2 , |d| {
433- let elements: Vec < T > = d. read_struct_field ( "elements" , 0 , |d| Decodable :: decode ( d) ) ?;
434- let edges = d. read_struct_field ( "edges" , 1 , |d| Decodable :: decode ( d) ) ?;
435- let map = elements
436- . iter ( )
437- . enumerate ( )
438- . map ( |( index, elem) | ( elem. clone ( ) , Index ( index) ) )
439- . collect ( ) ;
440- Ok ( TransitiveRelation { elements, edges, map, closure : Lock :: new ( None ) } )
425+ Ok ( TransitiveRelation {
426+ elements : d. read_struct_field ( "elements" , 0 , |d| Decodable :: decode ( d) ) ?,
427+ edges : d. read_struct_field ( "edges" , 1 , |d| Decodable :: decode ( d) ) ?,
428+ closure : Lock :: new ( None ) ,
429+ } )
441430 } )
442431 }
443432}
@@ -452,8 +441,6 @@ where
452441 let TransitiveRelation {
453442 ref elements,
454443 ref edges,
455- // "map" is just a copy of elements vec
456- map : _,
457444 // "closure" is just a copy of the data above
458445 closure : _,
459446 } = * self ;
0 commit comments