@@ -289,7 +289,7 @@ mod linear {
289
289
}
290
290
*/
291
291
292
- fn each ( blk : fn ( k : & K , v : & V ) -> bool ) {
292
+ fn each_ref ( blk : fn ( k : & K , v : & V ) -> bool ) {
293
293
for vec:: each( self . buckets) |slot| {
294
294
let mut broke = false ;
295
295
do slot. iter |bucket| {
@@ -300,11 +300,27 @@ mod linear {
300
300
if broke { break ; }
301
301
}
302
302
}
303
- fn each_key ( blk : fn ( k : & K ) -> bool ) {
304
- self . each ( |k, _v| blk ( k) )
303
+ fn each_key_ref ( blk : fn ( k : & K ) -> bool ) {
304
+ self . each_ref ( |k, _v| blk ( k) )
305
305
}
306
- fn each_value ( blk : fn ( v : & V ) -> bool ) {
307
- self . each ( |_k, v| blk ( v) )
306
+ fn each_value_ref ( blk : fn ( v : & V ) -> bool ) {
307
+ self . each_ref ( |_k, v| blk ( v) )
308
+ }
309
+ }
310
+
311
+ impl public_methods < K : copy , V : copy > for & linear_map < K , V > {
312
+ fn each ( blk : fn ( +K , +V ) -> bool ) {
313
+ self . each_ref ( |k, v| blk ( copy * k, copy * v) ) ;
314
+ }
315
+ }
316
+ impl public_methods < K : copy , V > for & linear_map < K , V > {
317
+ fn each_key ( blk : fn ( +K ) -> bool ) {
318
+ self . each_key_ref ( |k| blk ( copy * k) ) ;
319
+ }
320
+ }
321
+ impl public_methods < K , V : copy > for & linear_map < K , V > {
322
+ fn each_value ( blk : fn ( +V ) -> bool ) {
323
+ self . each_value_ref ( |v| blk ( copy * v) ) ;
308
324
}
309
325
}
310
326
}
@@ -360,4 +376,18 @@ mod test {
360
376
assert m. get ( & 9 ) == 4 ;
361
377
assert m. get ( & 5 ) == 3 ;
362
378
}
379
+
380
+ #[ test]
381
+ fn iterate ( ) {
382
+ let mut m = linear:: linear_map_with_capacity ( uint_hash, uint_eq, 4 ) ;
383
+ for uint:: range( 0 , 32 ) |i| {
384
+ assert ( & mut m) . insert( i, i* 2 ) ;
385
+ }
386
+ let mut observed = 0 ;
387
+ for ( & m) . each |k, v| {
388
+ assert v == k* 2 ;
389
+ observed |= ( 1 << k) ;
390
+ }
391
+ assert observed == 0xFFFF_FFFF ;
392
+ }
363
393
}
0 commit comments