@@ -274,28 +274,37 @@ fn test_slice_inplace_with_subview_inplace() {
274
274
* elt = i;
275
275
}
276
276
277
- let mut vi = arr. view ( ) ;
278
- vi. slice_inplace ( s ! [ 1 .., 2 , ..; 2 ] ) ;
279
- assert_eq ! ( vi. shape( ) , & [ 2 , 1 , 2 ] ) ;
280
- assert ! (
281
- vi. iter( )
282
- . zip( arr. slice( s![ 1 .., 2 ..3 , ..; 2 ] ) . iter( ) )
283
- . all( |( a, b) | a == b)
284
- ) ;
285
-
286
- let mut vi = arr. view ( ) ;
287
- vi. slice_inplace ( s ! [ 1 , 2 , ..; 2 ] ) ;
288
- assert_eq ! ( vi. shape( ) , & [ 1 , 1 , 2 ] ) ;
289
- assert ! (
290
- vi. iter( )
291
- . zip( arr. slice( s![ 1 ..2 , 2 ..3 , ..; 2 ] ) . iter( ) )
292
- . all( |( a, b) | a == b)
293
- ) ;
277
+ {
278
+ let mut vi = arr. view ( ) ;
279
+ vi. slice_inplace ( s ! [ 1 .., 2 , ..; 2 ] ) ;
280
+ assert_eq ! ( vi. shape( ) , & [ 2 , 1 , 2 ] ) ;
281
+ assert ! (
282
+ vi. iter( )
283
+ . zip( arr. slice( s![ 1 .., 2 ..3 , ..; 2 ] ) . iter( ) )
284
+ . all( |( a, b) | a == b)
285
+ ) ;
286
+
287
+ let mut vi = arr. view ( ) ;
288
+ vi. slice_inplace ( s ! [ 1 , 2 , ..; 2 ] ) ;
289
+ assert_eq ! ( vi. shape( ) , & [ 1 , 1 , 2 ] ) ;
290
+ assert ! (
291
+ vi. iter( )
292
+ . zip( arr. slice( s![ 1 ..2 , 2 ..3 , ..; 2 ] ) . iter( ) )
293
+ . all( |( a, b) | a == b)
294
+ ) ;
295
+
296
+ let mut vi = arr. view ( ) ;
297
+ vi. slice_inplace ( s ! [ 1 , 2 , 3 ] ) ;
298
+ assert_eq ! ( vi. shape( ) , & [ 1 , 1 , 1 ] ) ;
299
+ assert_eq ! ( vi, Array3 :: from_elem( ( 1 , 1 , 1 ) , arr[ ( 1 , 2 , 3 ) ] ) ) ;
300
+ }
294
301
295
- let mut vi = arr. view ( ) ;
302
+ // Do it to the RcArray itself
303
+ let elem = arr[ ( 1 , 2 , 3 ) ] ;
304
+ let mut vi = arr;
296
305
vi. slice_inplace ( s ! [ 1 , 2 , 3 ] ) ;
297
306
assert_eq ! ( vi. shape( ) , & [ 1 , 1 , 1 ] ) ;
298
- assert_eq ! ( vi, Array3 :: from_elem( ( 1 , 1 , 1 ) , arr [ ( 1 , 2 , 3 ) ] ) ) ;
307
+ assert_eq ! ( vi, Array3 :: from_elem( ( 1 , 1 , 1 ) , elem ) ) ;
299
308
}
300
309
301
310
#[ should_panic]
@@ -807,6 +816,44 @@ fn owned_array_with_stride() {
807
816
assert_eq ! ( a. strides( ) , & [ 1 , 4 , 2 ] ) ;
808
817
}
809
818
819
+ #[ test]
820
+ fn owned_array_discontiguous ( ) {
821
+ use :: std:: iter:: repeat;
822
+ let v: Vec < _ > = ( 0 ..12 ) . flat_map ( |x| repeat ( x) . take ( 2 ) ) . collect ( ) ;
823
+ let dim = ( 3 , 2 , 2 ) ;
824
+ let strides = ( 8 , 4 , 2 ) ;
825
+
826
+ let a = Array :: from_shape_vec ( dim. strides ( strides) , v) . unwrap ( ) ;
827
+ assert_eq ! ( a. strides( ) , & [ 8 , 4 , 2 ] ) ;
828
+ println ! ( "{:?}" , a. iter( ) . cloned( ) . collect:: <Vec <_>>( ) ) ;
829
+ itertools:: assert_equal ( a. iter ( ) . cloned ( ) , 0 ..12 ) ;
830
+ }
831
+
832
+ #[ test]
833
+ fn owned_array_discontiguous_drop ( ) {
834
+ use :: std:: rc:: Rc ;
835
+ use :: std:: cell:: RefCell ;
836
+ use :: std:: collections:: BTreeSet ;
837
+
838
+ struct InsertOnDrop < T : Ord > ( Rc < RefCell < BTreeSet < T > > > , Option < T > ) ;
839
+ impl < T : Ord > Drop for InsertOnDrop < T > {
840
+ fn drop ( & mut self ) {
841
+ let InsertOnDrop ( ref set, ref mut value) = * self ;
842
+ set. borrow_mut ( ) . insert ( value. take ( ) . expect ( "double drop!" ) ) ;
843
+ }
844
+ }
845
+
846
+ let set = Rc :: new ( RefCell :: new ( BTreeSet :: new ( ) ) ) ;
847
+ {
848
+ let v: Vec < _ > = ( 0 ..12 ) . map ( |x| InsertOnDrop ( set. clone ( ) , Some ( x) ) ) . collect ( ) ;
849
+ let mut a = Array :: from_shape_vec ( ( 2 , 6 ) , v) . unwrap ( ) ;
850
+ // discontiguous and non-zero offset
851
+ a. slice_inplace ( s ! [ .., 1 ..] ) ;
852
+ }
853
+ // each item was dropped exactly once
854
+ itertools:: assert_equal ( set. borrow ( ) . iter ( ) . cloned ( ) , 0 ..12 ) ;
855
+ }
856
+
810
857
macro_rules! assert_matches {
811
858
( $value: expr, $pat: pat) => {
812
859
match $value {
@@ -1372,6 +1419,18 @@ fn to_owned_neg_stride() {
1372
1419
assert_eq ! ( c, co) ;
1373
1420
}
1374
1421
1422
+ #[ test]
1423
+ fn discontiguous_owned_to_owned ( ) {
1424
+ let mut c = arr2 ( & [ [ 1 , 2 , 3 ] ,
1425
+ [ 4 , 5 , 6 ] ] ) ;
1426
+ c. slice_inplace ( s ! [ .., ..; 2 ] ) ;
1427
+
1428
+ let co = c. to_owned ( ) ;
1429
+ assert_eq ! ( c. strides( ) , & [ 3 , 2 ] ) ;
1430
+ assert_eq ! ( co. strides( ) , & [ 2 , 1 ] ) ;
1431
+ assert_eq ! ( c, co) ;
1432
+ }
1433
+
1375
1434
#[ test]
1376
1435
fn map_memory_order ( ) {
1377
1436
let a = arr3 ( & [ [ [ 1 , 2 , 3 ] ,
0 commit comments