@@ -396,3 +396,119 @@ impl<K, V> IndexMut<(Bound<usize>, Bound<usize>)> for Slice<K, V> {
396396 Slice :: from_mut_slice ( & mut entries[ range] )
397397 }
398398}
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