@@ -396,3 +396,119 @@ impl<K, V> IndexMut<(Bound<usize>, Bound<usize>)> for Slice<K, V> {
396
396
Slice :: from_mut_slice ( & mut entries[ range] )
397
397
}
398
398
}
399
+
400
+ #[ cfg( test) ]
401
+ mod tests {
402
+ use super :: * ;
403
+ use alloc:: vec:: Vec ;
404
+
405
+ #[ test]
406
+ fn slice_index ( ) {
407
+ fn check (
408
+ vec_slice : & [ ( i32 , i32 ) ] ,
409
+ map_slice : & Slice < i32 , i32 > ,
410
+ sub_slice : & Slice < i32 , i32 > ,
411
+ ) {
412
+ assert_eq ! ( map_slice as * const _, sub_slice as * const _) ;
413
+ itertools:: assert_equal (
414
+ vec_slice. iter ( ) . copied ( ) ,
415
+ map_slice. iter ( ) . map ( |( & k, & v) | ( k, v) ) ,
416
+ ) ;
417
+ itertools:: assert_equal ( vec_slice. iter ( ) . map ( |( k, _) | k) , map_slice. keys ( ) ) ;
418
+ itertools:: assert_equal ( vec_slice. iter ( ) . map ( |( _, v) | v) , map_slice. values ( ) ) ;
419
+ }
420
+
421
+ let vec: Vec < ( i32 , i32 ) > = ( 0 ..10 ) . map ( |i| ( i, i * i) ) . collect ( ) ;
422
+ let map: IndexMap < i32 , i32 > = vec. iter ( ) . cloned ( ) . collect ( ) ;
423
+ let slice = map. as_slice ( ) ;
424
+
425
+ // RangeFull
426
+ check ( & vec[ ..] , & map[ ..] , & slice[ ..] ) ;
427
+
428
+ for i in 0usize ..10 {
429
+ // Index
430
+ assert_eq ! ( vec[ i] . 1 , map[ i] ) ;
431
+ assert_eq ! ( vec[ i] . 1 , slice[ i] ) ;
432
+ assert_eq ! ( map[ & ( i as i32 ) ] , map[ i] ) ;
433
+ assert_eq ! ( map[ & ( i as i32 ) ] , slice[ i] ) ;
434
+
435
+ // RangeFrom
436
+ check ( & vec[ i..] , & map[ i..] , & slice[ i..] ) ;
437
+
438
+ // RangeTo
439
+ check ( & vec[ ..i] , & map[ ..i] , & slice[ ..i] ) ;
440
+
441
+ // RangeToInclusive
442
+ check ( & vec[ ..=i] , & map[ ..=i] , & slice[ ..=i] ) ;
443
+
444
+ // (Bound<usize>, Bound<usize>)
445
+ let bounds = ( Bound :: Excluded ( i) , Bound :: Unbounded ) ;
446
+ check ( & vec[ i + 1 ..] , & map[ bounds] , & slice[ bounds] ) ;
447
+
448
+ for j in i..=10 {
449
+ // Range
450
+ check ( & vec[ i..j] , & map[ i..j] , & slice[ i..j] ) ;
451
+ }
452
+
453
+ for j in i..10 {
454
+ // RangeInclusive
455
+ check ( & vec[ i..=j] , & map[ i..=j] , & slice[ i..=j] ) ;
456
+ }
457
+ }
458
+ }
459
+
460
+ #[ test]
461
+ fn slice_index_mut ( ) {
462
+ fn check_mut (
463
+ vec_slice : & [ ( i32 , i32 ) ] ,
464
+ map_slice : & mut Slice < i32 , i32 > ,
465
+ sub_slice : & mut Slice < i32 , i32 > ,
466
+ ) {
467
+ assert_eq ! ( map_slice, sub_slice) ;
468
+ itertools:: assert_equal (
469
+ vec_slice. iter ( ) . copied ( ) ,
470
+ map_slice. iter_mut ( ) . map ( |( & k, & mut v) | ( k, v) ) ,
471
+ ) ;
472
+ itertools:: assert_equal (
473
+ vec_slice. iter ( ) . map ( |& ( _, v) | v) ,
474
+ map_slice. values_mut ( ) . map ( |& mut v| v) ,
475
+ ) ;
476
+ }
477
+
478
+ let vec: Vec < ( i32 , i32 ) > = ( 0 ..10 ) . map ( |i| ( i, i * i) ) . collect ( ) ;
479
+ let mut map: IndexMap < i32 , i32 > = vec. iter ( ) . cloned ( ) . collect ( ) ;
480
+ let mut map2 = map. clone ( ) ;
481
+ let slice = map2. as_mut_slice ( ) ;
482
+
483
+ // RangeFull
484
+ check_mut ( & vec[ ..] , & mut map[ ..] , & mut slice[ ..] ) ;
485
+
486
+ for i in 0usize ..10 {
487
+ // IndexMut
488
+ assert_eq ! ( & mut map[ i] , & mut slice[ i] ) ;
489
+
490
+ // RangeFrom
491
+ check_mut ( & vec[ i..] , & mut map[ i..] , & mut slice[ i..] ) ;
492
+
493
+ // RangeTo
494
+ check_mut ( & vec[ ..i] , & mut map[ ..i] , & mut slice[ ..i] ) ;
495
+
496
+ // RangeToInclusive
497
+ check_mut ( & vec[ ..=i] , & mut map[ ..=i] , & mut slice[ ..=i] ) ;
498
+
499
+ // (Bound<usize>, Bound<usize>)
500
+ let bounds = ( Bound :: Excluded ( i) , Bound :: Unbounded ) ;
501
+ check_mut ( & vec[ i + 1 ..] , & mut map[ bounds] , & mut slice[ bounds] ) ;
502
+
503
+ for j in i..=10 {
504
+ // Range
505
+ check_mut ( & vec[ i..j] , & mut map[ i..j] , & mut slice[ i..j] ) ;
506
+ }
507
+
508
+ for j in i..10 {
509
+ // RangeInclusive
510
+ check_mut ( & vec[ i..=j] , & mut map[ i..=j] , & mut slice[ i..=j] ) ;
511
+ }
512
+ }
513
+ }
514
+ }
0 commit comments