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