1
1
use super :: Cached ;
2
2
use crate :: lru_list:: LRUList ;
3
- use hashbrown:: raw :: RawTable ;
3
+ use hashbrown:: HashTable ;
4
4
use std:: cmp:: Eq ;
5
5
use std:: fmt;
6
6
use std:: hash:: { BuildHasher , Hash , Hasher } ;
@@ -23,7 +23,7 @@ use {super::CachedAsync, async_trait::async_trait, futures::Future};
23
23
#[ derive( Clone ) ]
24
24
pub struct SizedCache < K , V > {
25
25
// `store` contains a hash of K -> index of (K, V) tuple in `order`
26
- pub ( super ) store : RawTable < usize > ,
26
+ pub ( super ) store : HashTable < usize > ,
27
27
pub ( super ) hash_builder : RandomState ,
28
28
pub ( super ) order : LRUList < ( K , V ) > ,
29
29
pub ( super ) capacity : usize ,
@@ -88,7 +88,7 @@ impl<K: Hash + Eq + Clone, V> SizedCache<K, V> {
88
88
panic ! ( "`size` of `SizedCache` must be greater than zero." ) ;
89
89
}
90
90
SizedCache {
91
- store : RawTable :: with_capacity ( size) ,
91
+ store : HashTable :: with_capacity ( size) ,
92
92
hash_builder : RandomState :: new ( ) ,
93
93
order : LRUList :: < ( K , V ) > :: with_capacity ( size) ,
94
94
capacity : size,
@@ -108,18 +108,20 @@ impl<K: Hash + Eq + Clone, V> SizedCache<K, V> {
108
108
return Err ( std:: io:: Error :: from_raw_os_error ( 22 ) ) ;
109
109
}
110
110
111
- let store = match RawTable :: try_with_capacity ( size) {
112
- Ok ( store) => store,
113
- Err ( e) => {
114
- let errcode = match e {
115
- // ENOMEM
116
- hashbrown:: TryReserveError :: AllocError { .. } => 12 ,
117
- // EINVAL
118
- hashbrown:: TryReserveError :: CapacityOverflow => 22 ,
119
- } ;
120
- return Err ( std:: io:: Error :: from_raw_os_error ( errcode) ) ;
121
- }
122
- } ;
111
+ let mut store = HashTable :: new ( ) ;
112
+ if let Err ( e) = store. try_reserve ( size, |& index: & usize | {
113
+ let hasher = & mut RandomState :: new ( ) . build_hasher ( ) ;
114
+ index. hash ( hasher) ;
115
+ hasher. finish ( )
116
+ } ) {
117
+ let errcode = match e {
118
+ // ENOMEM
119
+ hashbrown:: TryReserveError :: AllocError { .. } => 12 ,
120
+ // EINVAL
121
+ hashbrown:: TryReserveError :: CapacityOverflow => 22 ,
122
+ } ;
123
+ return Err ( std:: io:: Error :: from_raw_os_error ( errcode) ) ;
124
+ }
123
125
124
126
Ok ( SizedCache {
125
127
store,
@@ -166,7 +168,7 @@ impl<K: Hash + Eq + Clone, V> SizedCache<K, V> {
166
168
} = * self ;
167
169
// insert the value `index` at `hash`, the closure provided
168
170
// is used to rehash values if a resize is necessary.
169
- store. insert ( hash, index, move |& i| {
171
+ store. insert_unique ( hash, index, move |& i| {
170
172
// rehash the "key" value stored at index `i` - requires looking
171
173
// up the original "key" value in the `order` list.
172
174
let hasher = & mut hash_builder. build_hasher ( ) ;
@@ -186,7 +188,7 @@ impl<K: Hash + Eq + Clone, V> SizedCache<K, V> {
186
188
// `key` value from the `order` list.
187
189
// This pattern is repeated in other lookup situations.
188
190
store
189
- . get ( hash, |& i| key == order. get ( i) . 0 . borrow ( ) )
191
+ . find ( hash, |& i| key == order. get ( i) . 0 . borrow ( ) )
190
192
. copied ( )
191
193
}
192
194
@@ -196,7 +198,10 @@ impl<K: Hash + Eq + Clone, V> SizedCache<K, V> {
196
198
Q : std:: hash:: Hash + Eq + ?Sized ,
197
199
{
198
200
let Self { store, order, .. } = self ;
199
- store. remove_entry ( hash, |& i| key == order. get ( i) . 0 . borrow ( ) )
201
+ match store. find_entry ( hash, |& i| key == order. get ( i) . 0 . borrow ( ) ) {
202
+ Ok ( entry) => Some ( entry. remove ( ) . 0 ) ,
203
+ Err ( _) => None ,
204
+ }
200
205
}
201
206
202
207
fn check_capacity ( & mut self ) {
@@ -218,9 +223,14 @@ impl<K: Hash + Eq + Clone, V> SizedCache<K, V> {
218
223
let hash = hasher. finish ( ) ;
219
224
220
225
let order_ = & order;
221
- let erased = store. erase_entry ( hash, |& i| * key == order_. get ( i) . 0 ) ;
222
- assert ! ( erased, "SizedCache::cache_set failed evicting cache key" ) ;
223
- store. remove_entry ( hash, |& i| * key == order_. get ( i) . 0 ) ;
226
+ match store. find_entry ( hash, |& i| * key == order_. get ( i) . 0 ) {
227
+ Ok ( entry) => {
228
+ entry. remove ( ) ;
229
+ }
230
+ Err ( _) => {
231
+ panic ! ( "SizedCache::cache_set failed evicting cache key" ) ;
232
+ }
233
+ }
224
234
order. remove ( index) ;
225
235
}
226
236
}
0 commit comments