@@ -34,6 +34,7 @@ use core::fmt;
34
34
use core:: hash:: { BuildHasher , Hash , Hasher } ;
35
35
use core:: iter:: FromIterator ;
36
36
use core:: ops:: { BitAnd , BitOr , Shl , Shr , Sub } ;
37
+ use hashbrown:: hash_map:: RawEntryMut ;
37
38
use iter:: { Iter , IterMut , OwningIter } ;
38
39
use mapref:: entry:: { Entry , OccupiedEntry , VacantEntry } ;
39
40
use mapref:: multiple:: RefMulti ;
@@ -295,11 +296,15 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
295
296
/// Hash a given item to produce a usize.
296
297
/// Uses the provided or default HashBuilder.
297
298
pub fn hash_usize < T : Hash > ( & self , item : & T ) -> usize {
299
+ self . hash_u64 ( item) as usize
300
+ }
301
+
302
+ fn hash_u64 < T : Hash > ( & self , item : & T ) -> u64 {
298
303
let mut hasher = self . hasher . build_hasher ( ) ;
299
304
300
305
item. hash ( & mut hasher) ;
301
306
302
- hasher. finish ( ) as usize
307
+ hasher. finish ( )
303
308
}
304
309
305
310
cfg_if ! {
@@ -916,9 +921,9 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
916
921
}
917
922
918
923
fn _insert ( & self , key : K , value : V ) -> Option < V > {
919
- let hash = self . hash_usize ( & key) ;
924
+ let hash = self . hash_u64 ( & key) ;
920
925
921
- let idx = self . determine_shard ( hash) ;
926
+ let idx = self . determine_shard ( hash as usize ) ;
922
927
923
928
let mut shard = unsafe { self . _yield_write_shard ( idx) } ;
924
929
@@ -932,9 +937,9 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
932
937
K : Borrow < Q > ,
933
938
Q : Hash + Eq + ?Sized ,
934
939
{
935
- let hash = self . hash_usize ( & key) ;
940
+ let hash = self . hash_u64 ( & key) ;
936
941
937
- let idx = self . determine_shard ( hash) ;
942
+ let idx = self . determine_shard ( hash as usize ) ;
938
943
939
944
let mut shard = unsafe { self . _yield_write_shard ( idx) } ;
940
945
@@ -946,22 +951,20 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
946
951
K : Borrow < Q > ,
947
952
Q : Hash + Eq + ?Sized ,
948
953
{
949
- let hash = self . hash_usize ( & key) ;
954
+ let hash = self . hash_u64 ( & key) ;
950
955
951
- let idx = self . determine_shard ( hash) ;
956
+ let idx = self . determine_shard ( hash as usize ) ;
952
957
953
958
let mut shard = unsafe { self . _yield_write_shard ( idx) } ;
954
959
955
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
956
- unsafe {
957
- let kptr: * const K = kptr;
958
- let vptr: * mut V = vptr. as_ptr ( ) ;
959
-
960
- if f ( & * kptr, & mut * vptr) {
961
- shard. remove_entry ( key) . map ( |( k, v) | ( k, v. into_inner ( ) ) )
962
- } else {
963
- None
964
- }
960
+ if let RawEntryMut :: Occupied ( entry) =
961
+ shard. raw_entry_mut ( ) . from_key_hashed_nocheck ( hash, key)
962
+ {
963
+ if f ( & entry. key ( ) , & entry. get ( ) . get ( ) ) {
964
+ let ( k, v) = entry. remove_entry ( ) ;
965
+ Some ( ( k, v. into_inner ( ) ) )
966
+ } else {
967
+ None
965
968
}
966
969
} else {
967
970
None
@@ -973,22 +976,21 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
973
976
K : Borrow < Q > ,
974
977
Q : Hash + Eq + ?Sized ,
975
978
{
976
- let hash = self . hash_usize ( & key) ;
979
+ let hash = self . hash_u64 ( & key) ;
977
980
978
- let idx = self . determine_shard ( hash) ;
981
+ let idx = self . determine_shard ( hash as usize ) ;
979
982
980
983
let mut shard = unsafe { self . _yield_write_shard ( idx) } ;
981
984
982
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
983
- unsafe {
984
- let kptr: * const K = kptr;
985
- let vptr: * mut V = vptr. as_ptr ( ) ;
986
-
987
- if f ( & * kptr, & mut * vptr) {
988
- shard. remove_entry ( key) . map ( |( k, v) | ( k, v. into_inner ( ) ) )
989
- } else {
990
- None
991
- }
985
+ if let RawEntryMut :: Occupied ( mut entry) =
986
+ shard. raw_entry_mut ( ) . from_key_hashed_nocheck ( hash, key)
987
+ {
988
+ let ( k, v) = entry. get_key_value_mut ( ) ;
989
+ if f ( k, v. get_mut ( ) ) {
990
+ let ( k, v) = entry. remove_entry ( ) ;
991
+ Some ( ( k, v. into_inner ( ) ) )
992
+ } else {
993
+ None
992
994
}
993
995
} else {
994
996
None
@@ -1008,13 +1010,13 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
1008
1010
K : Borrow < Q > ,
1009
1011
Q : Hash + Eq + ?Sized ,
1010
1012
{
1011
- let hash = self . hash_usize ( & key) ;
1013
+ let hash = self . hash_u64 ( & key) ;
1012
1014
1013
- let idx = self . determine_shard ( hash) ;
1015
+ let idx = self . determine_shard ( hash as usize ) ;
1014
1016
1015
1017
let shard = unsafe { self . _yield_read_shard ( idx) } ;
1016
1018
1017
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
1019
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , key) {
1018
1020
unsafe {
1019
1021
let kptr: * const K = kptr;
1020
1022
let vptr: * const V = vptr. get ( ) ;
@@ -1030,16 +1032,18 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
1030
1032
K : Borrow < Q > ,
1031
1033
Q : Hash + Eq + ?Sized ,
1032
1034
{
1033
- let hash = self . hash_usize ( & key) ;
1035
+ let hash = self . hash_u64 ( & key) ;
1034
1036
1035
- let idx = self . determine_shard ( hash) ;
1037
+ let idx = self . determine_shard ( hash as usize ) ;
1036
1038
1037
- let shard = unsafe { self . _yield_write_shard ( idx) } ;
1039
+ let mut shard = unsafe { self . _yield_write_shard ( idx) } ;
1038
1040
1039
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
1041
+ if let RawEntryMut :: Occupied ( mut entry) =
1042
+ shard. raw_entry_mut ( ) . from_key_hashed_nocheck ( hash, key)
1043
+ {
1040
1044
unsafe {
1041
- let kptr: * const K = kptr ;
1042
- let vptr: * mut V = vptr . as_ptr ( ) ;
1045
+ let kptr: * const K = entry . key ( ) ;
1046
+ let vptr: * mut V = entry . get_mut ( ) . as_ptr ( ) ;
1043
1047
Some ( RefMut :: new ( shard, kptr, vptr) )
1044
1048
}
1045
1049
} else {
@@ -1052,16 +1056,16 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
1052
1056
K : Borrow < Q > ,
1053
1057
Q : Hash + Eq + ?Sized ,
1054
1058
{
1055
- let hash = self . hash_usize ( & key) ;
1059
+ let hash = self . hash_u64 ( & key) ;
1056
1060
1057
- let idx = self . determine_shard ( hash) ;
1061
+ let idx = self . determine_shard ( hash as usize ) ;
1058
1062
1059
1063
let shard = match unsafe { self . _try_yield_read_shard ( idx) } {
1060
1064
Some ( shard) => shard,
1061
1065
None => return TryResult :: Locked ,
1062
1066
} ;
1063
1067
1064
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
1068
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , key) {
1065
1069
unsafe {
1066
1070
let kptr: * const K = kptr;
1067
1071
let vptr: * const V = vptr. get ( ) ;
@@ -1077,16 +1081,16 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
1077
1081
K : Borrow < Q > ,
1078
1082
Q : Hash + Eq + ?Sized ,
1079
1083
{
1080
- let hash = self . hash_usize ( & key) ;
1084
+ let hash = self . hash_u64 ( & key) ;
1081
1085
1082
- let idx = self . determine_shard ( hash) ;
1086
+ let idx = self . determine_shard ( hash as usize ) ;
1083
1087
1084
1088
let shard = match unsafe { self . _try_yield_write_shard ( idx) } {
1085
1089
Some ( shard) => shard,
1086
1090
None => return TryResult :: Locked ,
1087
1091
} ;
1088
1092
1089
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
1093
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , key) {
1090
1094
unsafe {
1091
1095
let kptr: * const K = kptr;
1092
1096
let vptr: * mut V = vptr. as_ptr ( ) ;
@@ -1145,13 +1149,13 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
1145
1149
}
1146
1150
1147
1151
fn _entry ( & ' a self , key : K ) -> Entry < ' a , K , V , S > {
1148
- let hash = self . hash_usize ( & key) ;
1152
+ let hash = self . hash_u64 ( & key) ;
1149
1153
1150
- let idx = self . determine_shard ( hash) ;
1154
+ let idx = self . determine_shard ( hash as usize ) ;
1151
1155
1152
1156
let shard = unsafe { self . _yield_write_shard ( idx) } ;
1153
1157
1154
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( & key) {
1158
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , & key) {
1155
1159
unsafe {
1156
1160
let kptr: * const K = kptr;
1157
1161
let vptr: * mut V = vptr. as_ptr ( ) ;
@@ -1163,16 +1167,16 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
1163
1167
}
1164
1168
1165
1169
fn _try_entry ( & ' a self , key : K ) -> Option < Entry < ' a , K , V , S > > {
1166
- let hash = self . hash_usize ( & key) ;
1170
+ let hash = self . hash_u64 ( & key) ;
1167
1171
1168
- let idx = self . determine_shard ( hash) ;
1172
+ let idx = self . determine_shard ( hash as usize ) ;
1169
1173
1170
1174
let shard = match unsafe { self . _try_yield_write_shard ( idx) } {
1171
1175
Some ( shard) => shard,
1172
1176
None => return None ,
1173
1177
} ;
1174
1178
1175
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( & key) {
1179
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , & key) {
1176
1180
unsafe {
1177
1181
let kptr: * const K = kptr;
1178
1182
let vptr: * mut V = vptr. as_ptr ( ) ;
0 commit comments