1
1
use super :: mapref:: multiple:: { RefMulti , RefMutMulti } ;
2
- use super :: util;
3
2
use crate :: lock:: { RwLockReadGuard , RwLockWriteGuard } ;
4
3
use crate :: t:: Map ;
5
4
use crate :: util:: SharedValue ;
6
5
use crate :: { DashMap , HashMap } ;
7
6
use core:: hash:: { BuildHasher , Hash } ;
8
7
use core:: mem;
9
- use hashbrown:: hash_map;
10
8
use std:: collections:: hash_map:: RandomState ;
9
+ use std:: marker:: PhantomData ;
11
10
use std:: sync:: Arc ;
12
11
13
12
/// Iterator over a DashMap yielding key value pairs.
@@ -39,7 +38,7 @@ impl<K: Eq + Hash, V, S: BuildHasher + Clone> OwningIter<K, V, S> {
39
38
}
40
39
}
41
40
42
- type GuardOwningIter < K , V > = hash_map :: IntoIter < K , SharedValue < V > > ;
41
+ type GuardOwningIter < K , V > = hashbrown :: raw :: RawIntoIter < ( K , SharedValue < V > ) > ;
43
42
44
43
impl < K : Eq + Hash , V , S : BuildHasher + Clone > Iterator for OwningIter < K , V , S > {
45
44
type Item = ( K , V ) ;
@@ -59,9 +58,7 @@ impl<K: Eq + Hash, V, S: BuildHasher + Clone> Iterator for OwningIter<K, V, S> {
59
58
//let guard = unsafe { self.map._yield_read_shard(self.shard_i) };
60
59
let mut shard_wl = unsafe { self . map . _yield_write_shard ( self . shard_i ) } ;
61
60
62
- let hasher = self . map . _hasher ( ) ;
63
-
64
- let map = mem:: replace ( & mut * shard_wl, HashMap :: with_hasher ( hasher) ) ;
61
+ let map = mem:: take ( & mut * shard_wl) ;
65
62
66
63
drop ( shard_wl) ;
67
64
@@ -91,14 +88,14 @@ where
91
88
{
92
89
}
93
90
94
- type GuardIter < ' a , K , V , S > = (
95
- Arc < RwLockReadGuard < ' a , HashMap < K , V , S > > > ,
96
- hash_map :: Iter < ' a , K , SharedValue < V > > ,
91
+ type GuardIter < ' a , K , V > = (
92
+ Arc < RwLockReadGuard < ' a , HashMap < K , V > > > ,
93
+ hashbrown :: raw :: RawIter < ( K , SharedValue < V > ) > ,
97
94
) ;
98
95
99
- type GuardIterMut < ' a , K , V , S > = (
100
- Arc < RwLockWriteGuard < ' a , HashMap < K , V , S > > > ,
101
- hash_map :: IterMut < ' a , K , SharedValue < V > > ,
96
+ type GuardIterMut < ' a , K , V > = (
97
+ Arc < RwLockWriteGuard < ' a , HashMap < K , V > > > ,
98
+ hashbrown :: raw :: RawIter < ( K , SharedValue < V > ) > ,
102
99
) ;
103
100
104
101
/// Iterator over a DashMap yielding immutable references.
@@ -115,7 +112,8 @@ type GuardIterMut<'a, K, V, S> = (
115
112
pub struct Iter < ' a , K , V , S = RandomState , M = DashMap < K , V , S > > {
116
113
map : & ' a M ,
117
114
shard_i : usize ,
118
- current : Option < GuardIter < ' a , K , V , S > > ,
115
+ current : Option < GuardIter < ' a , K , V > > ,
116
+ marker : PhantomData < S > ,
119
117
}
120
118
121
119
impl < ' i , K : Clone + Hash + Eq , V : Clone , S : Clone + BuildHasher > Clone for Iter < ' i , K , V , S > {
@@ -148,22 +146,25 @@ impl<'a, K: Eq + Hash, V, S: 'a + BuildHasher + Clone, M: Map<'a, K, V, S>> Iter
148
146
map,
149
147
shard_i : 0 ,
150
148
current : None ,
149
+ marker : PhantomData ,
151
150
}
152
151
}
153
152
}
154
153
155
154
impl < ' a , K : Eq + Hash , V , S : ' a + BuildHasher + Clone , M : Map < ' a , K , V , S > > Iterator
156
155
for Iter < ' a , K , V , S , M >
157
156
{
158
- type Item = RefMulti < ' a , K , V , S > ;
157
+ type Item = RefMulti < ' a , K , V > ;
159
158
160
159
fn next ( & mut self ) -> Option < Self :: Item > {
161
160
loop {
162
161
if let Some ( current) = self . current . as_mut ( ) {
163
- if let Some ( ( k, v) ) = current. 1 . next ( ) {
164
- let guard = current. 0 . clone ( ) ;
165
-
166
- return unsafe { Some ( RefMulti :: new ( guard, k, v. get ( ) ) ) } ;
162
+ if let Some ( b) = current. 1 . next ( ) {
163
+ return unsafe {
164
+ let ( k, v) = b. as_ref ( ) ;
165
+ let guard = current. 0 . clone ( ) ;
166
+ Some ( RefMulti :: new ( guard, k, v. get ( ) ) )
167
+ } ;
167
168
}
168
169
}
169
170
@@ -173,9 +174,7 @@ impl<'a, K: Eq + Hash, V, S: 'a + BuildHasher + Clone, M: Map<'a, K, V, S>> Iter
173
174
174
175
let guard = unsafe { self . map . _yield_read_shard ( self . shard_i ) } ;
175
176
176
- let sref: & HashMap < K , V , S > = unsafe { util:: change_lifetime_const ( & * guard) } ;
177
-
178
- let iter = sref. iter ( ) ;
177
+ let iter = unsafe { guard. iter ( ) } ;
179
178
180
179
self . current = Some ( ( Arc :: new ( guard) , iter) ) ;
181
180
@@ -199,7 +198,8 @@ impl<'a, K: Eq + Hash, V, S: 'a + BuildHasher + Clone, M: Map<'a, K, V, S>> Iter
199
198
pub struct IterMut < ' a , K , V , S = RandomState , M = DashMap < K , V , S > > {
200
199
map : & ' a M ,
201
200
shard_i : usize ,
202
- current : Option < GuardIterMut < ' a , K , V , S > > ,
201
+ current : Option < GuardIterMut < ' a , K , V > > ,
202
+ marker : PhantomData < S > ,
203
203
}
204
204
205
205
unsafe impl < ' a , ' i , K , V , S , M > Send for IterMut < ' i , K , V , S , M >
@@ -228,40 +228,35 @@ impl<'a, K: Eq + Hash, V, S: 'a + BuildHasher + Clone, M: Map<'a, K, V, S>>
228
228
map,
229
229
shard_i : 0 ,
230
230
current : None ,
231
+ marker : PhantomData ,
231
232
}
232
233
}
233
234
}
234
235
235
236
impl < ' a , K : Eq + Hash , V , S : ' a + BuildHasher + Clone , M : Map < ' a , K , V , S > > Iterator
236
237
for IterMut < ' a , K , V , S , M >
237
238
{
238
- type Item = RefMutMulti < ' a , K , V , S > ;
239
+ type Item = RefMutMulti < ' a , K , V > ;
239
240
240
241
fn next ( & mut self ) -> Option < Self :: Item > {
241
242
loop {
242
243
if let Some ( current) = self . current . as_mut ( ) {
243
- if let Some ( ( k, v) ) = current. 1 . next ( ) {
244
- let guard = current. 0 . clone ( ) ;
245
-
246
- unsafe {
247
- let k = util:: change_lifetime_const ( k) ;
248
-
249
- let v = & mut * v. as_ptr ( ) ;
250
-
251
- return Some ( RefMutMulti :: new ( guard, k, v) ) ;
252
- }
244
+ if let Some ( b) = current. 1 . next ( ) {
245
+ return unsafe {
246
+ let ( k, v) = b. as_mut ( ) ;
247
+ let guard = current. 0 . clone ( ) ;
248
+ Some ( RefMutMulti :: new ( guard, k, v. get_mut ( ) ) )
249
+ } ;
253
250
}
254
251
}
255
252
256
253
if self . shard_i == self . map . _shard_count ( ) {
257
254
return None ;
258
255
}
259
256
260
- let mut guard = unsafe { self . map . _yield_write_shard ( self . shard_i ) } ;
261
-
262
- let sref: & mut HashMap < K , V , S > = unsafe { util:: change_lifetime_mut ( & mut * guard) } ;
257
+ let guard = unsafe { self . map . _yield_write_shard ( self . shard_i ) } ;
263
258
264
- let iter = sref . iter_mut ( ) ;
259
+ let iter = unsafe { guard . iter ( ) } ;
265
260
266
261
self . current = Some ( ( Arc :: new ( guard) , iter) ) ;
267
262
@@ -285,7 +280,7 @@ mod tests {
285
280
let mut c = 0 ;
286
281
287
282
for shard in map. shards ( ) {
288
- c += shard. write ( ) . iter_mut ( ) . count ( ) ;
283
+ c += unsafe { shard. write ( ) . iter ( ) . count ( ) } ;
289
284
}
290
285
291
286
assert_eq ! ( c, 1 ) ;
0 commit comments