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