@@ -336,76 +336,76 @@ fn test_slice_collapse_with_indices() {
336
336
}
337
337
338
338
#[ test]
339
- #[ allow( clippy:: cognitive_complexity) ]
340
339
fn test_multislice ( ) {
341
- defmac ! ( test_multislice mut arr, s1, s2 => {
342
- {
343
- let copy = arr. clone( ) ;
344
- assert_eq!(
345
- multislice!( arr, mut s1, mut s2, ) ,
346
- ( copy. clone( ) . slice_mut( s1) , copy. clone( ) . slice_mut( s2) )
347
- ) ;
348
- }
349
- {
350
- let copy = arr. clone( ) ;
351
- assert_eq!(
352
- multislice!( arr, mut s1, s2, ) ,
353
- ( copy. clone( ) . slice_mut( s1) , copy. clone( ) . slice( s2) )
354
- ) ;
355
- }
356
- {
357
- let copy = arr. clone( ) ;
358
- assert_eq!(
359
- multislice!( arr, s1, mut s2) ,
360
- ( copy. clone( ) . slice( s1) , copy. clone( ) . slice_mut( s2) )
361
- ) ;
362
- }
363
- {
364
- let copy = arr. clone( ) ;
365
- assert_eq!(
366
- multislice!( arr, s1, s2) ,
367
- ( copy. clone( ) . slice( s1) , copy. clone( ) . slice( s2) )
368
- ) ;
369
- }
370
- } ) ;
340
+ macro_rules! check_multislice {
341
+ ( $arr: expr, $s1: expr, $s2: expr) => {
342
+ {
343
+ let copy = $arr. clone( ) ;
344
+ assert_eq!(
345
+ multislice!( & mut $arr, mut $s1, mut $s2, ) ,
346
+ ( copy. clone( ) . slice_mut( $s1) , copy. clone( ) . slice_mut( $s2) )
347
+ ) ;
348
+ }
349
+ {
350
+ let copy = $arr. clone( ) ;
351
+ assert_eq!(
352
+ multislice!( & mut $arr, mut $s1, $s2, ) ,
353
+ ( copy. clone( ) . slice_mut( $s1) , copy. clone( ) . slice( $s2) )
354
+ ) ;
355
+ }
356
+ {
357
+ let copy = $arr. clone( ) ;
358
+ assert_eq!(
359
+ multislice!( & mut $arr, $s1, mut $s2) ,
360
+ ( copy. clone( ) . slice( $s1) , copy. clone( ) . slice_mut( $s2) )
361
+ ) ;
362
+ }
363
+ {
364
+ let copy = $arr. clone( ) ;
365
+ assert_eq!(
366
+ multislice!( & mut $arr, $s1, $s2) ,
367
+ ( copy. clone( ) . slice( $s1) , copy. clone( ) . slice( $s2) )
368
+ ) ;
369
+ }
370
+ } ;
371
+ } ;
371
372
let mut arr = Array1 :: from_iter ( 0 ..48 ) . into_shape ( ( 8 , 6 ) ) . unwrap ( ) ;
372
-
373
- assert_eq ! ( ( arr. clone( ) . view( ) , ) , multislice!( arr, [ .., ..] ) ) ;
374
- test_multislice ! ( & mut arr, s![ 0 , ..] , s![ 1 , ..] ) ;
375
- test_multislice ! ( & mut arr, s![ 0 , ..] , s![ -1 , ..] ) ;
376
- test_multislice ! ( & mut arr, s![ 0 , ..] , s![ 1 .., ..] ) ;
377
- test_multislice ! ( & mut arr, s![ 1 , ..] , s![ ..; 2 , ..] ) ;
378
- test_multislice ! ( & mut arr, s![ ..2 , ..] , s![ 2 .., ..] ) ;
379
- test_multislice ! ( & mut arr, s![ 1 ..; 2 , ..] , s![ ..; 2 , ..] ) ;
380
- test_multislice ! ( & mut arr, s![ ..; -2 , ..] , s![ ..; 2 , ..] ) ;
381
- test_multislice ! ( & mut arr, s![ ..; 12 , ..] , s![ 3 ..; 3 , ..] ) ;
373
+ assert_eq ! ( ( arr. clone( ) . view( ) , ) , multislice!( & mut arr, [ .., ..] ) ) ;
374
+ check_multislice ! ( arr, s![ 0 , ..] , s![ 1 , ..] ) ;
375
+ check_multislice ! ( arr, s![ 0 , ..] , s![ -1 , ..] ) ;
376
+ check_multislice ! ( arr, s![ 0 , ..] , s![ 1 .., ..] ) ;
377
+ check_multislice ! ( arr, s![ 1 , ..] , s![ ..; 2 , ..] ) ;
378
+ check_multislice ! ( arr, s![ ..2 , ..] , s![ 2 .., ..] ) ;
379
+ check_multislice ! ( arr, s![ 1 ..; 2 , ..] , s![ ..; 2 , ..] ) ;
380
+ check_multislice ! ( arr, s![ ..; -2 , ..] , s![ ..; 2 , ..] ) ;
381
+ check_multislice ! ( arr, s![ ..; 12 , ..] , s![ 3 ..; 3 , ..] ) ;
382
382
}
383
383
384
384
#[ test]
385
385
fn test_multislice_intersecting ( ) {
386
386
assert_panics ! ( {
387
387
let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
388
- multislice!( arr, mut [ 3 , ..] , [ 3 , ..] ) ;
388
+ multislice!( & mut arr, mut [ 3 , ..] , [ 3 , ..] ) ;
389
389
} ) ;
390
390
assert_panics ! ( {
391
391
let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
392
- multislice!( arr, mut [ 3 , ..] , [ 3 .., ..] ) ;
392
+ multislice!( & mut arr, mut [ 3 , ..] , [ 3 .., ..] ) ;
393
393
} ) ;
394
394
assert_panics ! ( {
395
395
let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
396
- multislice!( arr, mut [ 3 , ..] , [ ..; 3 , ..] ) ;
396
+ multislice!( & mut arr, mut [ 3 , ..] , [ ..; 3 , ..] ) ;
397
397
} ) ;
398
398
assert_panics ! ( {
399
399
let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
400
- multislice!( arr, mut [ ..; 6 , ..] , [ 3 ..; 3 , ..] ) ;
400
+ multislice!( & mut arr, mut [ ..; 6 , ..] , [ 3 ..; 3 , ..] ) ;
401
401
} ) ;
402
402
assert_panics ! ( {
403
403
let mut arr = Array2 :: <u8 >:: zeros( ( 8 , 6 ) ) ;
404
- multislice!( arr, mut [ 2 , ..] , mut [ ..-1 ; -2 , ..] ) ;
404
+ multislice!( & mut arr, mut [ 2 , ..] , mut [ ..-1 ; -2 , ..] ) ;
405
405
} ) ;
406
406
{
407
407
let mut arr = Array2 :: < u8 > :: zeros ( ( 8 , 6 ) ) ;
408
- multislice ! ( arr, [ 3 , ..] , [ -1 ..; -2 , ..] ) ;
408
+ multislice ! ( & mut arr, [ 3 , ..] , [ -1 ..; -2 , ..] ) ;
409
409
}
410
410
}
411
411
@@ -418,7 +418,7 @@ fn test_multislice_eval_args_only_once() {
418
418
eval_count += 1 ;
419
419
* s ! [ 1 ..2 ]
420
420
} ;
421
- multislice ! ( arr, mut & slice( ) , [ 3 ..4 ] , [ 5 ..6 ] ) ;
421
+ multislice ! ( & mut arr, mut & slice( ) , [ 3 ..4 ] , [ 5 ..6 ] ) ;
422
422
}
423
423
assert_eq ! ( eval_count, 1 ) ;
424
424
let mut eval_count = 0 ;
@@ -427,7 +427,7 @@ fn test_multislice_eval_args_only_once() {
427
427
eval_count += 1 ;
428
428
* s ! [ 1 ..2 ]
429
429
} ;
430
- multislice ! ( arr, [ 3 ..4 ] , mut & slice( ) , [ 5 ..6 ] ) ;
430
+ multislice ! ( & mut arr, [ 3 ..4 ] , mut & slice( ) , [ 5 ..6 ] ) ;
431
431
}
432
432
assert_eq ! ( eval_count, 1 ) ;
433
433
let mut eval_count = 0 ;
@@ -436,7 +436,7 @@ fn test_multislice_eval_args_only_once() {
436
436
eval_count += 1 ;
437
437
* s ! [ 1 ..2 ]
438
438
} ;
439
- multislice ! ( arr, [ 3 ..4 ] , [ 5 ..6 ] , mut & slice( ) ) ;
439
+ multislice ! ( & mut arr, [ 3 ..4 ] , [ 5 ..6 ] , mut & slice( ) ) ;
440
440
}
441
441
assert_eq ! ( eval_count, 1 ) ;
442
442
let mut eval_count = 0 ;
@@ -445,7 +445,7 @@ fn test_multislice_eval_args_only_once() {
445
445
eval_count += 1 ;
446
446
* s ! [ 1 ..2 ]
447
447
} ;
448
- multislice ! ( arr, & slice( ) , mut [ 3 ..4 ] , [ 5 ..6 ] ) ;
448
+ multislice ! ( & mut arr, & slice( ) , mut [ 3 ..4 ] , [ 5 ..6 ] ) ;
449
449
}
450
450
assert_eq ! ( eval_count, 1 ) ;
451
451
let mut eval_count = 0 ;
@@ -454,7 +454,7 @@ fn test_multislice_eval_args_only_once() {
454
454
eval_count += 1 ;
455
455
* s ! [ 1 ..2 ]
456
456
} ;
457
- multislice ! ( arr, mut [ 3 ..4 ] , & slice( ) , [ 5 ..6 ] ) ;
457
+ multislice ! ( & mut arr, mut [ 3 ..4 ] , & slice( ) , [ 5 ..6 ] ) ;
458
458
}
459
459
assert_eq ! ( eval_count, 1 ) ;
460
460
let mut eval_count = 0 ;
@@ -463,11 +463,33 @@ fn test_multislice_eval_args_only_once() {
463
463
eval_count += 1 ;
464
464
* s ! [ 1 ..2 ]
465
465
} ;
466
- multislice ! ( arr, mut [ 3 ..4 ] , [ 5 ..6 ] , & slice( ) ) ;
466
+ multislice ! ( & mut arr, mut [ 3 ..4 ] , [ 5 ..6 ] , & slice( ) ) ;
467
467
}
468
468
assert_eq ! ( eval_count, 1 ) ;
469
469
}
470
470
471
+ #[ test]
472
+ fn test_multislice_arrayviewmut_same_life ( ) {
473
+ // This test makes sure that it's possible for the borrowed elements
474
+ // returned from `get_mut2` to have the same life as the `arr` view.
475
+ fn get_mut2 < ' a , A > (
476
+ arr : ArrayViewMut < ' a , A , Ix2 > ,
477
+ [ i1, j1] : [ usize ; 2 ] ,
478
+ [ i2, j2] : [ usize ; 2 ] ,
479
+ ) -> ( & ' a mut A , & ' a mut A ) {
480
+ use ndarray:: IndexLonger ;
481
+ let ( x1, x2) = multislice ! ( arr, mut [ i1, j1] , mut [ i2, j2] ) ;
482
+ ( x1. index ( [ ] ) , x2. index ( [ ] ) )
483
+ }
484
+ let mut arr = array ! [ [ 1 , 2 ] , [ 3 , 4 ] ] ;
485
+ {
486
+ let ( x1, x2) = get_mut2 ( arr. view_mut ( ) , [ 0 , 0 ] , [ 1 , 0 ] ) ;
487
+ * x1 += 1 ;
488
+ * x2 += 2 ;
489
+ }
490
+ assert_eq ! ( arr, array![ [ 2 , 2 ] , [ 5 , 4 ] ] ) ;
491
+ }
492
+
471
493
#[ should_panic]
472
494
#[ test]
473
495
fn index_out_of_bounds ( ) {
0 commit comments