@@ -22,6 +22,8 @@ trait SendMap<K:Eq Hash, V: Copy> {
22
22
fn each_value_ref ( & self , blk : fn ( v : & V ) -> bool ) ;
23
23
fn find ( & const self , k : & K ) -> Option < V > ;
24
24
fn get ( & const self , k : & K ) -> V ;
25
+ fn with_find_ref < T > ( & const self , k : & K , blk : fn ( Option < & V > ) -> T ) -> T ;
26
+ fn with_get_ref < T > ( & const self , k : & K , blk : fn ( v : & V ) -> T ) -> T ;
25
27
}
26
28
27
29
/// Open addressing with linear probing.
@@ -290,6 +292,27 @@ mod linear {
290
292
}
291
293
*/
292
294
295
+ fn with_find_ref < T > ( & self , k : & K , blk : fn ( Option < & V > ) -> T ) -> T {
296
+ match self . bucket_for_key ( self . buckets , k) {
297
+ FoundEntry ( idx) => {
298
+ match self . buckets [ idx] {
299
+ Some ( bkt) => blk ( Some ( & bkt. value ) ) ,
300
+ None => fail ~"LinearMap :: find: internal logic error"
301
+ }
302
+ }
303
+ TableFull | FoundHole ( _) => blk ( None ) ,
304
+ }
305
+ }
306
+
307
+ fn with_get_ref < T > ( & self , k : & K , blk : fn ( v : & V ) -> T ) -> T {
308
+ do self . with_find_ref ( k) |v| {
309
+ match v {
310
+ Some ( v) => blk ( v) ,
311
+ None => fail fmt ! ( "No entry found for key: %?" , k) ,
312
+ }
313
+ }
314
+ }
315
+
293
316
fn each_ref ( & self , blk : fn ( k : & K , v : & V ) -> bool ) {
294
317
for vec:: each( self . buckets) |slot| {
295
318
let mut broke = false ;
@@ -426,4 +449,12 @@ mod test {
426
449
}
427
450
assert observed == 0xFFFF_FFFF ;
428
451
}
452
+
453
+ #[ test]
454
+ fn with_find_ref ( ) {
455
+ let mut m = ~LinearMap ( ) ;
456
+ m. with_find_ref ( & 1 , |v| assert v. is_none ( ) ) ;
457
+ m. insert ( 1 , 2 ) ;
458
+ m. with_find_ref ( & 1 , |v| assert * v. get ( ) == 2 ) ;
459
+ }
429
460
}
0 commit comments