@@ -29,12 +29,12 @@ use crate::lock::RwLock;
29
29
pub use crate :: lock:: { RawRwLock , RwLock } ;
30
30
31
31
use cfg_if:: cfg_if;
32
- use core:: borrow:: Borrow ;
33
32
use core:: fmt;
34
33
use core:: hash:: { BuildHasher , Hash , Hasher } ;
35
34
use core:: iter:: FromIterator ;
36
35
use core:: ops:: { BitAnd , BitOr , Shl , Shr , Sub } ;
37
36
use crossbeam_utils:: CachePadded ;
37
+ pub use equivalent:: Equivalent ;
38
38
use hashbrown:: hash_table;
39
39
use iter:: { Iter , IterMut , OwningIter } ;
40
40
use lock:: { RwLockReadGuardDetached , RwLockWriteGuardDetached } ;
@@ -389,8 +389,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
389
389
/// ```
390
390
pub fn determine_map<Q >( & self , key: & Q ) -> usize
391
391
where
392
- K : Borrow <Q >,
393
- Q : Hash + Eq + ?Sized ,
392
+ Q : Hash + Equivalent <K > + ?Sized ,
394
393
{
395
394
let hash = self . hash_usize( & key) ;
396
395
self . determine_shard( hash)
@@ -508,8 +507,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
508
507
/// ```
509
508
pub fn remove < Q > ( & self , key : & Q ) -> Option < ( K , V ) >
510
509
where
511
- K : Borrow < Q > ,
512
- Q : Hash + Eq + ?Sized ,
510
+ Q : Hash + Equivalent < K > + ?Sized ,
513
511
{
514
512
self . _remove ( key)
515
513
}
@@ -537,16 +535,14 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
537
535
/// ```
538
536
pub fn remove_if < Q > ( & self , key : & Q , f : impl FnOnce ( & K , & V ) -> bool ) -> Option < ( K , V ) >
539
537
where
540
- K : Borrow < Q > ,
541
- Q : Hash + Eq + ?Sized ,
538
+ Q : Hash + Equivalent < K > + ?Sized ,
542
539
{
543
540
self . _remove_if ( key, f)
544
541
}
545
542
546
543
pub fn remove_if_mut < Q > ( & self , key : & Q , f : impl FnOnce ( & K , & mut V ) -> bool ) -> Option < ( K , V ) >
547
544
where
548
- K : Borrow < Q > ,
549
- Q : Hash + Eq + ?Sized ,
545
+ Q : Hash + Equivalent < K > + ?Sized ,
550
546
{
551
547
self . _remove_if_mut ( key, f)
552
548
}
@@ -601,8 +597,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
601
597
/// ```
602
598
pub fn get < Q > ( & ' a self , key : & Q ) -> Option < Ref < ' a , K , V > >
603
599
where
604
- K : Borrow < Q > ,
605
- Q : Hash + Eq + ?Sized ,
600
+ Q : Hash + Equivalent < K > + ?Sized ,
606
601
{
607
602
self . _get ( key)
608
603
}
@@ -623,8 +618,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
623
618
/// ```
624
619
pub fn get_mut < Q > ( & ' a self , key : & Q ) -> Option < RefMut < ' a , K , V > >
625
620
where
626
- K : Borrow < Q > ,
627
- Q : Hash + Eq + ?Sized ,
621
+ Q : Hash + Equivalent < K > + ?Sized ,
628
622
{
629
623
self . _get_mut ( key)
630
624
}
@@ -650,8 +644,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
650
644
/// ```
651
645
pub fn try_get < Q > ( & ' a self , key : & Q ) -> TryResult < Ref < ' a , K , V > >
652
646
where
653
- K : Borrow < Q > ,
654
- Q : Hash + Eq + ?Sized ,
647
+ Q : Hash + Equivalent < K > + ?Sized ,
655
648
{
656
649
self . _try_get ( key)
657
650
}
@@ -678,8 +671,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
678
671
/// ```
679
672
pub fn try_get_mut < Q > ( & ' a self , key : & Q ) -> TryResult < RefMut < ' a , K , V > >
680
673
where
681
- K : Borrow < Q > ,
682
- Q : Hash + Eq + ?Sized ,
674
+ Q : Hash + Equivalent < K > + ?Sized ,
683
675
{
684
676
self . _try_get_mut ( key)
685
677
}
@@ -806,8 +798,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
806
798
/// If the given closure panics, then `alter` will abort the process
807
799
pub fn alter < Q > ( & self , key : & Q , f : impl FnOnce ( & K , V ) -> V )
808
800
where
809
- K : Borrow < Q > ,
810
- Q : Hash + Eq + ?Sized ,
801
+ Q : Hash + Equivalent < K > + ?Sized ,
811
802
{
812
803
self . _alter ( key, f) ;
813
804
}
@@ -857,8 +848,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
857
848
/// If the given closure panics, then `view` will abort the process
858
849
pub fn view < Q , R > ( & self , key : & Q , f : impl FnOnce ( & K , & V ) -> R ) -> Option < R >
859
850
where
860
- K : Borrow < Q > ,
861
- Q : Hash + Eq + ?Sized ,
851
+ Q : Hash + Equivalent < K > + ?Sized ,
862
852
{
863
853
self . _view ( key, f)
864
854
}
@@ -878,8 +868,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
878
868
/// ```
879
869
pub fn contains_key < Q > ( & self , key : & Q ) -> bool
880
870
where
881
- K : Borrow < Q > ,
882
- Q : Hash + Eq + ?Sized ,
871
+ Q : Hash + Equivalent < K > + ?Sized ,
883
872
{
884
873
self . _contains_key ( key)
885
874
}
@@ -936,16 +925,15 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
936
925
937
926
fn _remove < Q > ( & self , key : & Q ) -> Option < ( K , V ) >
938
927
where
939
- K : Borrow < Q > ,
940
- Q : Hash + Eq + ?Sized ,
928
+ Q : Hash + Equivalent < K > + ?Sized ,
941
929
{
942
930
let hash = self . hash_u64 ( & key) ;
943
931
944
932
let idx = self . determine_shard ( hash as usize ) ;
945
933
946
934
let mut shard = self . shards [ idx] . write ( ) ;
947
935
948
- if let Ok ( entry) = shard. find_entry ( hash, |( k, _v) | key == k . borrow ( ) ) {
936
+ if let Ok ( entry) = shard. find_entry ( hash, |( k, _v) | key. equivalent ( k ) ) {
949
937
let ( ( k, v) , _) = entry. remove ( ) ;
950
938
Some ( ( k, v) )
951
939
} else {
@@ -955,16 +943,15 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
955
943
956
944
fn _remove_if < Q > ( & self , key : & Q , f : impl FnOnce ( & K , & V ) -> bool ) -> Option < ( K , V ) >
957
945
where
958
- K : Borrow < Q > ,
959
- Q : Hash + Eq + ?Sized ,
946
+ Q : Hash + Equivalent < K > + ?Sized ,
960
947
{
961
948
let hash = self . hash_u64 ( & key) ;
962
949
963
950
let idx = self . determine_shard ( hash as usize ) ;
964
951
965
952
let mut shard = self . shards [ idx] . write ( ) ;
966
953
967
- if let Ok ( entry) = shard. find_entry ( hash, |( k, _v) | key == k . borrow ( ) ) {
954
+ if let Ok ( entry) = shard. find_entry ( hash, |( k, _v) | key. equivalent ( k ) ) {
968
955
let ( k, v) = entry. get ( ) ;
969
956
if f ( k, v) {
970
957
let ( ( k, v) , _) = entry. remove ( ) ;
@@ -979,16 +966,15 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
979
966
980
967
fn _remove_if_mut < Q > ( & self , key : & Q , f : impl FnOnce ( & K , & mut V ) -> bool ) -> Option < ( K , V ) >
981
968
where
982
- K : Borrow < Q > ,
983
- Q : Hash + Eq + ?Sized ,
969
+ Q : Hash + Equivalent < K > + ?Sized ,
984
970
{
985
971
let hash = self . hash_u64 ( & key) ;
986
972
987
973
let idx = self . determine_shard ( hash as usize ) ;
988
974
989
975
let mut shard = self . shards [ idx] . write ( ) ;
990
976
991
- if let Ok ( mut entry) = shard. find_entry ( hash, |( k, _v) | key == k . borrow ( ) ) {
977
+ if let Ok ( mut entry) = shard. find_entry ( hash, |( k, _v) | key. equivalent ( k ) ) {
992
978
let ( k, v) = entry. get_mut ( ) ;
993
979
if f ( k, v) {
994
980
let ( ( k, v) , _) = entry. remove ( ) ;
@@ -1011,8 +997,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1011
997
1012
998
fn _get < Q > ( & ' a self , key : & Q ) -> Option < Ref < ' a , K , V > >
1013
999
where
1014
- K : Borrow < Q > ,
1015
- Q : Hash + Eq + ?Sized ,
1000
+ Q : Hash + Equivalent < K > + ?Sized ,
1016
1001
{
1017
1002
let hash = self . hash_u64 ( & key) ;
1018
1003
@@ -1022,7 +1007,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1022
1007
// SAFETY: The data will not outlive the guard, since we pass the guard to `Ref`.
1023
1008
let ( guard, shard) = unsafe { RwLockReadGuardDetached :: detach_from ( shard) } ;
1024
1009
1025
- if let Some ( ( k, v) ) = shard. find ( hash, |( k, _v) | key == k . borrow ( ) ) {
1010
+ if let Some ( ( k, v) ) = shard. find ( hash, |( k, _v) | key. equivalent ( k ) ) {
1026
1011
Some ( Ref :: new ( guard, k, v) )
1027
1012
} else {
1028
1013
None
@@ -1031,8 +1016,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1031
1016
1032
1017
fn _get_mut < Q > ( & ' a self , key : & Q ) -> Option < RefMut < ' a , K , V > >
1033
1018
where
1034
- K : Borrow < Q > ,
1035
- Q : Hash + Eq + ?Sized ,
1019
+ Q : Hash + Equivalent < K > + ?Sized ,
1036
1020
{
1037
1021
let hash = self . hash_u64 ( & key) ;
1038
1022
@@ -1042,7 +1026,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1042
1026
// SAFETY: The data will not outlive the guard, since we pass the guard to `RefMut`.
1043
1027
let ( guard, shard) = unsafe { RwLockWriteGuardDetached :: detach_from ( shard) } ;
1044
1028
1045
- if let Some ( ( k, v) ) = shard. find_mut ( hash, |( k, _v) | key == k . borrow ( ) ) {
1029
+ if let Some ( ( k, v) ) = shard. find_mut ( hash, |( k, _v) | key. equivalent ( k ) ) {
1046
1030
Some ( RefMut :: new ( guard, k, v) )
1047
1031
} else {
1048
1032
None
@@ -1051,8 +1035,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1051
1035
1052
1036
fn _try_get < Q > ( & ' a self , key : & Q ) -> TryResult < Ref < ' a , K , V > >
1053
1037
where
1054
- K : Borrow < Q > ,
1055
- Q : Hash + Eq + ?Sized ,
1038
+ Q : Hash + Equivalent < K > + ?Sized ,
1056
1039
{
1057
1040
let hash = self . hash_u64 ( & key) ;
1058
1041
@@ -1065,7 +1048,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1065
1048
// SAFETY: The data will not outlive the guard, since we pass the guard to `Ref`.
1066
1049
let ( guard, shard) = unsafe { RwLockReadGuardDetached :: detach_from ( shard) } ;
1067
1050
1068
- if let Some ( ( k, v) ) = shard. find ( hash, |( k, _v) | key == k . borrow ( ) ) {
1051
+ if let Some ( ( k, v) ) = shard. find ( hash, |( k, _v) | key. equivalent ( k ) ) {
1069
1052
TryResult :: Present ( Ref :: new ( guard, k, v) )
1070
1053
} else {
1071
1054
TryResult :: Absent
@@ -1074,8 +1057,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1074
1057
1075
1058
fn _try_get_mut < Q > ( & ' a self , key : & Q ) -> TryResult < RefMut < ' a , K , V > >
1076
1059
where
1077
- K : Borrow < Q > ,
1078
- Q : Hash + Eq + ?Sized ,
1060
+ Q : Hash + Equivalent < K > + ?Sized ,
1079
1061
{
1080
1062
let hash = self . hash_u64 ( & key) ;
1081
1063
@@ -1088,7 +1070,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1088
1070
// SAFETY: The data will not outlive the guard, since we pass the guard to `RefMut`.
1089
1071
let ( guard, shard) = unsafe { RwLockWriteGuardDetached :: detach_from ( shard) } ;
1090
1072
1091
- if let Some ( ( k, v) ) = shard. find_mut ( hash, |( k, _v) | key == k . borrow ( ) ) {
1073
+ if let Some ( ( k, v) ) = shard. find_mut ( hash, |( k, _v) | key. equivalent ( k ) ) {
1092
1074
TryResult :: Present ( RefMut :: new ( guard, k, v) )
1093
1075
} else {
1094
1076
TryResult :: Absent
@@ -1123,8 +1105,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1123
1105
1124
1106
fn _alter < Q > ( & self , key : & Q , f : impl FnOnce ( & K , V ) -> V )
1125
1107
where
1126
- K : Borrow < Q > ,
1127
- Q : Hash + Eq + ?Sized ,
1108
+ Q : Hash + Equivalent < K > + ?Sized ,
1128
1109
{
1129
1110
if let Some ( mut r) = self . get_mut ( key) {
1130
1111
util:: map_in_place_2 ( r. pair_mut ( ) , f) ;
@@ -1138,8 +1119,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1138
1119
1139
1120
fn _view < Q , R > ( & self , key : & Q , f : impl FnOnce ( & K , & V ) -> R ) -> Option < R >
1140
1121
where
1141
- K : Borrow < Q > ,
1142
- Q : Hash + Eq + ?Sized ,
1122
+ Q : Hash + Equivalent < K > + ?Sized ,
1143
1123
{
1144
1124
self . get ( key) . map ( |r| {
1145
1125
let ( k, v) = r. pair ( ) ;
@@ -1208,8 +1188,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> DashMap<K, V, S>
1208
1188
1209
1189
fn _contains_key < Q > ( & ' a self , key : & Q ) -> bool
1210
1190
where
1211
- K : Borrow < Q > ,
1212
- Q : Hash + Eq + ?Sized ,
1191
+ Q : Hash + Equivalent < K > + ?Sized ,
1213
1192
{
1214
1193
self . _get ( key) . is_some ( )
1215
1194
}
@@ -1245,8 +1224,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> Shl<(K, V)> for &'a D
1245
1224
1246
1225
impl < ' a , K : ' a + Eq + Hash , V : ' a , S : BuildHasher + Clone , Q > Shr < & Q > for & ' a DashMap < K , V , S >
1247
1226
where
1248
- K : Borrow < Q > ,
1249
- Q : Hash + Eq + ?Sized ,
1227
+ Q : Hash + Equivalent < K > + ?Sized ,
1250
1228
{
1251
1229
type Output = Ref < ' a , K , V > ;
1252
1230
@@ -1257,8 +1235,7 @@ where
1257
1235
1258
1236
impl < ' a , K : ' a + Eq + Hash , V : ' a , S : BuildHasher + Clone , Q > BitOr < & Q > for & ' a DashMap < K , V , S >
1259
1237
where
1260
- K : Borrow < Q > ,
1261
- Q : Hash + Eq + ?Sized ,
1238
+ Q : Hash + Equivalent < K > + ?Sized ,
1262
1239
{
1263
1240
type Output = RefMut < ' a , K , V > ;
1264
1241
@@ -1269,8 +1246,7 @@ where
1269
1246
1270
1247
impl < ' a , K : ' a + Eq + Hash , V : ' a , S : BuildHasher + Clone , Q > Sub < & Q > for & ' a DashMap < K , V , S >
1271
1248
where
1272
- K : Borrow < Q > ,
1273
- Q : Hash + Eq + ?Sized ,
1249
+ Q : Hash + Equivalent < K > + ?Sized ,
1274
1250
{
1275
1251
type Output = Option < ( K , V ) > ;
1276
1252
@@ -1281,8 +1257,7 @@ where
1281
1257
1282
1258
impl < ' a , K : ' a + Eq + Hash , V : ' a , S : BuildHasher + Clone , Q > BitAnd < & Q > for & ' a DashMap < K , V , S >
1283
1259
where
1284
- K : Borrow < Q > ,
1285
- Q : Hash + Eq + ?Sized ,
1260
+ Q : Hash + Equivalent < K > + ?Sized ,
1286
1261
{
1287
1262
type Output = bool ;
1288
1263
0 commit comments