@@ -30,7 +30,7 @@ impl<'a, K: Eq + Hash, V> Ref<'a, K, V> {
30
30
( self . k , self . v )
31
31
}
32
32
33
- pub fn map < F , T > ( self , f : F ) -> MappedRef < ' a , K , T >
33
+ pub fn map < F , T : ? Sized > ( self , f : F ) -> MappedRef < ' a , K , T >
34
34
where
35
35
F : FnOnce ( & V ) -> & T ,
36
36
{
@@ -41,7 +41,7 @@ impl<'a, K: Eq + Hash, V> Ref<'a, K, V> {
41
41
}
42
42
}
43
43
44
- pub fn try_map < F , T > ( self , f : F ) -> Result < MappedRef < ' a , K , T > , Self >
44
+ pub fn try_map < F , T : ? Sized > ( self , f : F ) -> Result < MappedRef < ' a , K , T > , Self >
45
45
where
46
46
F : FnOnce ( & V ) -> Option < & T > ,
47
47
{
@@ -113,7 +113,7 @@ impl<'a, K: Eq + Hash, V> RefMut<'a, K, V> {
113
113
)
114
114
}
115
115
116
- pub fn map < F , T > ( self , f : F ) -> MappedRefMut < ' a , K , T >
116
+ pub fn map < F , T : ? Sized > ( self , f : F ) -> MappedRefMut < ' a , K , T >
117
117
where
118
118
F : FnOnce ( & mut V ) -> & mut T ,
119
119
{
@@ -124,7 +124,7 @@ impl<'a, K: Eq + Hash, V> RefMut<'a, K, V> {
124
124
}
125
125
}
126
126
127
- pub fn try_map < F , T > ( self , f : F ) -> Result < MappedRefMut < ' a , K , T > , Self >
127
+ pub fn try_map < F , T : ? Sized > ( self , f : F ) -> Result < MappedRefMut < ' a , K , T > , Self >
128
128
where
129
129
F : FnOnce ( & mut V ) -> Option < & mut T > ,
130
130
{
@@ -165,13 +165,13 @@ impl<'a, K: Eq + Hash, V> DerefMut for RefMut<'a, K, V> {
165
165
}
166
166
}
167
167
168
- pub struct MappedRef < ' a , K , T > {
168
+ pub struct MappedRef < ' a , K , T : ? Sized > {
169
169
_guard : RwLockReadGuardDetached < ' a > ,
170
170
k : & ' a K ,
171
171
v : & ' a T ,
172
172
}
173
173
174
- impl < ' a , K : Eq + Hash , T > MappedRef < ' a , K , T > {
174
+ impl < ' a , K : Eq + Hash , T : ? Sized > MappedRef < ' a , K , T > {
175
175
pub fn key ( & self ) -> & K {
176
176
self . pair ( ) . 0
177
177
}
@@ -195,7 +195,7 @@ impl<'a, K: Eq + Hash, T> MappedRef<'a, K, T> {
195
195
}
196
196
}
197
197
198
- pub fn try_map < F , T2 > ( self , f : F ) -> Result < MappedRef < ' a , K , T2 > , Self >
198
+ pub fn try_map < F , T2 : ? Sized > ( self , f : F ) -> Result < MappedRef < ' a , K , T2 > , Self >
199
199
where
200
200
F : FnOnce ( & T ) -> Option < & T2 > ,
201
201
{
@@ -212,7 +212,7 @@ impl<'a, K: Eq + Hash, T> MappedRef<'a, K, T> {
212
212
}
213
213
}
214
214
215
- impl < ' a , K : Eq + Hash + Debug , T : Debug > Debug for MappedRef < ' a , K , T > {
215
+ impl < ' a , K : Eq + Hash + Debug , T : Debug + ? Sized > Debug for MappedRef < ' a , K , T > {
216
216
fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
217
217
f. debug_struct ( "MappedRef" )
218
218
. field ( "k" , & self . k )
@@ -221,33 +221,35 @@ impl<'a, K: Eq + Hash + Debug, T: Debug> Debug for MappedRef<'a, K, T> {
221
221
}
222
222
}
223
223
224
- impl < ' a , K : Eq + Hash , T > Deref for MappedRef < ' a , K , T > {
224
+ impl < ' a , K : Eq + Hash , T : ? Sized > Deref for MappedRef < ' a , K , T > {
225
225
type Target = T ;
226
226
227
227
fn deref ( & self ) -> & T {
228
228
self . value ( )
229
229
}
230
230
}
231
231
232
- impl < ' a , K : Eq + Hash , T : std:: fmt:: Display > std:: fmt:: Display for MappedRef < ' a , K , T > {
232
+ impl < ' a , K : Eq + Hash , T : std:: fmt:: Display + ? Sized > std:: fmt:: Display for MappedRef < ' a , K , T > {
233
233
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
234
234
std:: fmt:: Display :: fmt ( self . value ( ) , f)
235
235
}
236
236
}
237
237
238
- impl < ' a , K : Eq + Hash , T : AsRef < TDeref > , TDeref : ?Sized > AsRef < TDeref > for MappedRef < ' a , K , T > {
238
+ impl < ' a , K : Eq + Hash , T : ?Sized + AsRef < TDeref > , TDeref : ?Sized > AsRef < TDeref >
239
+ for MappedRef < ' a , K , T >
240
+ {
239
241
fn as_ref ( & self ) -> & TDeref {
240
242
self . value ( ) . as_ref ( )
241
243
}
242
244
}
243
245
244
- pub struct MappedRefMut < ' a , K , T > {
246
+ pub struct MappedRefMut < ' a , K , T : ? Sized > {
245
247
_guard : RwLockWriteGuardDetached < ' a > ,
246
248
k : & ' a K ,
247
249
v : & ' a mut T ,
248
250
}
249
251
250
- impl < ' a , K : Eq + Hash , T > MappedRefMut < ' a , K , T > {
252
+ impl < ' a , K : Eq + Hash , T : ? Sized > MappedRefMut < ' a , K , T > {
251
253
pub fn key ( & self ) -> & K {
252
254
self . pair ( ) . 0
253
255
}
@@ -268,7 +270,7 @@ impl<'a, K: Eq + Hash, T> MappedRefMut<'a, K, T> {
268
270
( self . k , self . v )
269
271
}
270
272
271
- pub fn map < F , T2 > ( self , f : F ) -> MappedRefMut < ' a , K , T2 >
273
+ pub fn map < F , T2 : ? Sized > ( self , f : F ) -> MappedRefMut < ' a , K , T2 >
272
274
where
273
275
F : FnOnce ( & mut T ) -> & mut T2 ,
274
276
{
@@ -279,7 +281,7 @@ impl<'a, K: Eq + Hash, T> MappedRefMut<'a, K, T> {
279
281
}
280
282
}
281
283
282
- pub fn try_map < F , T2 > ( self , f : F ) -> Result < MappedRefMut < ' a , K , T2 > , Self >
284
+ pub fn try_map < F , T2 : ? Sized > ( self , f : F ) -> Result < MappedRefMut < ' a , K , T2 > , Self >
283
285
where
284
286
F : FnOnce ( & mut T ) -> Option < & mut T2 > ,
285
287
{
@@ -297,7 +299,7 @@ impl<'a, K: Eq + Hash, T> MappedRefMut<'a, K, T> {
297
299
}
298
300
}
299
301
300
- impl < ' a , K : Eq + Hash + Debug , T : Debug > Debug for MappedRefMut < ' a , K , T > {
302
+ impl < ' a , K : Eq + Hash + Debug , T : Debug + ? Sized > Debug for MappedRefMut < ' a , K , T > {
301
303
fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
302
304
f. debug_struct ( "MappedRefMut" )
303
305
. field ( "k" , & self . k )
@@ -306,16 +308,80 @@ impl<'a, K: Eq + Hash + Debug, T: Debug> Debug for MappedRefMut<'a, K, T> {
306
308
}
307
309
}
308
310
309
- impl < ' a , K : Eq + Hash , T > Deref for MappedRefMut < ' a , K , T > {
311
+ impl < ' a , K : Eq + Hash , T : ? Sized > Deref for MappedRefMut < ' a , K , T > {
310
312
type Target = T ;
311
313
312
314
fn deref ( & self ) -> & T {
313
315
self . value ( )
314
316
}
315
317
}
316
318
317
- impl < ' a , K : Eq + Hash , T > DerefMut for MappedRefMut < ' a , K , T > {
319
+ impl < ' a , K : Eq + Hash , T : ? Sized > DerefMut for MappedRefMut < ' a , K , T > {
318
320
fn deref_mut ( & mut self ) -> & mut T {
319
321
self . value_mut ( )
320
322
}
321
323
}
324
+
325
+ #[ cfg( test) ]
326
+ mod tests {
327
+ use crate :: DashMap ;
328
+
329
+ #[ test]
330
+ fn downgrade ( ) {
331
+ let data = DashMap :: new ( ) ;
332
+ data. insert ( "test" , "test" ) ;
333
+ if let Some ( mut w_ref) = data. get_mut ( "test" ) {
334
+ * w_ref. value_mut ( ) = "test2" ;
335
+ let r_ref = w_ref. downgrade ( ) ;
336
+ assert_eq ! ( * r_ref. value( ) , "test2" ) ;
337
+ } ;
338
+ }
339
+
340
+ #[ test]
341
+ fn mapped_mut ( ) {
342
+ let data = DashMap :: new ( ) ;
343
+ data. insert ( "test" , * b"test" ) ;
344
+ if let Some ( b_ref) = data. get_mut ( "test" ) {
345
+ let mut s_ref = b_ref. try_map ( |b| std:: str:: from_utf8_mut ( b) . ok ( ) ) . unwrap ( ) ;
346
+ s_ref. value_mut ( ) . make_ascii_uppercase ( ) ;
347
+ }
348
+
349
+ assert_eq ! ( data. get( "test" ) . unwrap( ) . value( ) , b"TEST" ) ;
350
+ }
351
+
352
+ #[ test]
353
+ fn mapped_mut_again ( ) {
354
+ let data = DashMap :: new ( ) ;
355
+ data. insert ( "test" , * b"hello world" ) ;
356
+ if let Some ( b_ref) = data. get_mut ( "test" ) {
357
+ let s_ref = b_ref. try_map ( |b| std:: str:: from_utf8_mut ( b) . ok ( ) ) . unwrap ( ) ;
358
+ let mut hello_ref = s_ref. try_map ( |s| s. get_mut ( ..5 ) ) . unwrap ( ) ;
359
+ hello_ref. value_mut ( ) . make_ascii_uppercase ( ) ;
360
+ }
361
+
362
+ assert_eq ! ( data. get( "test" ) . unwrap( ) . value( ) , b"HELLO world" ) ;
363
+ }
364
+
365
+ #[ test]
366
+ fn mapped_ref ( ) {
367
+ let data = DashMap :: new ( ) ;
368
+ data. insert ( "test" , * b"test" ) ;
369
+ if let Some ( b_ref) = data. get ( "test" ) {
370
+ let s_ref = b_ref. try_map ( |b| std:: str:: from_utf8 ( b) . ok ( ) ) . unwrap ( ) ;
371
+
372
+ assert_eq ! ( s_ref. value( ) , "test" ) ;
373
+ } ;
374
+ }
375
+
376
+ #[ test]
377
+ fn mapped_ref_again ( ) {
378
+ let data = DashMap :: new ( ) ;
379
+ data. insert ( "test" , * b"hello world" ) ;
380
+ if let Some ( b_ref) = data. get ( "test" ) {
381
+ let s_ref = b_ref. try_map ( |b| std:: str:: from_utf8 ( b) . ok ( ) ) . unwrap ( ) ;
382
+ let hello_ref = s_ref. try_map ( |s| s. get ( ..5 ) ) . unwrap ( ) ;
383
+
384
+ assert_eq ! ( hello_ref. value( ) , "hello" ) ;
385
+ } ;
386
+ }
387
+ }
0 commit comments