1- use hashbrown:: raw :: * ;
1+ use hashbrown:: HashTable ;
22use once_cell:: sync:: Lazy ;
33use std:: hash:: { Hash , Hasher } ;
44use std:: sync:: RwLock ;
5+ use std:: fmt:: { self , Debug , Formatter } ;
56#[ inline]
67fn hash ( val : & impl Hash ) -> u64 {
78 let mut state = std:: collections:: hash_map:: DefaultHasher :: default ( ) ;
@@ -10,27 +11,32 @@ fn hash(val: &impl Hash) -> u64 {
1011}
1112pub struct Interner < ' a , T : PartialEq + Eq + Hash > {
1213 vec : Lazy < aovec:: Aovec < T > > ,
13- map : RwLock < RawTable < ( & ' a T , usize ) > > ,
14+ map : RwLock < HashTable < ( & ' a T , usize ) > > ,
15+ }
16+ impl < T : Debug + PartialEq + Eq + Hash > Debug for Interner < ' _ , T > {
17+ fn fmt ( & self , f : & mut Formatter < ' _ > ) -> fmt:: Result {
18+ f. debug_struct ( "Interner" ) . field ( "map" , & self . map . read ( ) . unwrap ( ) ) . finish_non_exhaustive ( )
19+ }
1420}
1521impl < ' a , K : PartialEq + Eq + Hash > Interner < ' a , K > {
1622 pub const fn new ( ) -> Self {
1723 Self {
1824 vec : Lazy :: new ( || aovec:: Aovec :: new ( 16 ) ) ,
19- map : RwLock :: new ( RawTable :: new ( ) ) ,
25+ map : RwLock :: new ( HashTable :: new ( ) ) ,
2026 }
2127 }
2228 pub fn intern ( & ' a self , key : K ) -> & K {
2329 let hashed = hash ( & key) ;
2430 let lock = self . map . read ( ) . unwrap ( ) ;
25- if let Some ( k) = lock. get ( hashed, |v| v. 0 == & key) . map ( |x| x. 1 ) {
31+ if let Some ( k) = lock. find ( hashed, |v| v. 0 == & key) . map ( |x| x. 1 ) {
2632 & self . vec [ k]
2733 } else {
2834 eprintln ! ( "creating new element!" ) ;
2935 std:: mem:: drop ( lock) ;
3036 let mut lock = self . map . write ( ) . unwrap ( ) ;
3137 let idx = self . vec . push ( key) ;
3238 let val = & self . vec [ idx] ;
33- lock. insert ( hashed, ( val, idx) , |v| hash ( & v. 0 ) ) ;
39+ lock. insert_unique ( hashed, ( val, idx) , |v| hash ( & v. 0 ) ) ;
3440 val
3541 }
3642 }
@@ -45,7 +51,7 @@ impl<'a, K: PartialEq + Eq + Hash> Interner<'a, K> {
4551 let hashed = hash ( & key) ;
4652 let lock = self . map . read ( ) . unwrap ( ) ;
4753 if let Some ( k) = lock
48- . get ( hashed, |v| key. as_ref ( ) == v. 0 . as_ref ( ) )
54+ . find ( hashed, |v| key. as_ref ( ) == v. 0 . as_ref ( ) )
4955 . map ( |x| x. 1 )
5056 {
5157 & self . vec [ k]
@@ -54,7 +60,7 @@ impl<'a, K: PartialEq + Eq + Hash> Interner<'a, K> {
5460 let mut lock = self . map . write ( ) . unwrap ( ) ;
5561 let idx = self . vec . push ( key. into ( ) ) ;
5662 let val = & self . vec [ idx] ;
57- lock. insert ( hashed, ( val, idx) , |v| hash ( & v. 0 ) ) ;
63+ lock. insert_unique ( hashed, ( val, idx) , |v| hash ( & v. 0 ) ) ;
5864 val
5965 }
6066 }
0 commit comments