@@ -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,49 @@ 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 > InsertOnDrop < T > {
840
+ fn new ( set : Rc < RefCell < BTreeSet < T > > > , value : T ) -> Self {
841
+ InsertOnDrop ( set, Some ( value) )
842
+ }
843
+ }
844
+ impl < T : Ord > Drop for InsertOnDrop < T > {
845
+ fn drop ( & mut self ) {
846
+ let InsertOnDrop ( ref set, ref mut value) = * self ;
847
+ set. borrow_mut ( ) . insert ( value. take ( ) . expect ( "double drop!" ) ) ;
848
+ }
849
+ }
850
+
851
+ let set = Rc :: new ( RefCell :: new ( BTreeSet :: new ( ) ) ) ;
852
+ {
853
+ let v: Vec < _ > = ( 0 ..12 ) . map ( |x| InsertOnDrop :: new ( set. clone ( ) , x) ) . collect ( ) ;
854
+ let mut a = Array :: from_shape_vec ( ( 2 , 6 ) , v) . unwrap ( ) ;
855
+ // discontiguous and non-zero offset
856
+ a. slice_inplace ( s ! [ .., 1 ..] ) ;
857
+ }
858
+ // each item was dropped
859
+ itertools:: assert_equal ( set. borrow ( ) . iter ( ) . cloned ( ) , 0 ..12 ) ;
860
+ }
861
+
810
862
macro_rules! assert_matches {
811
863
( $value: expr, $pat: pat) => {
812
864
match $value {
@@ -1372,6 +1424,19 @@ fn to_owned_neg_stride() {
1372
1424
assert_eq ! ( c, co) ;
1373
1425
}
1374
1426
1427
+ #[ test]
1428
+ fn discontiguous_owned_to_owned ( ) {
1429
+ let mut c = arr2 ( & [ [ 1 , 2 , 3 ] ,
1430
+ [ 4 , 5 , 6 ] ] ) ;
1431
+ c. slice_inplace ( s ! [ .., ..; 2 ] ) ;
1432
+
1433
+ let co = c. to_owned ( ) ;
1434
+ assert_eq ! ( c. strides( ) , & [ 3 , 2 ] ) ;
1435
+ assert_eq ! ( co. strides( ) , & [ 2 , 1 ] ) ;
1436
+ assert_eq ! ( c. shape( ) , co. shape( ) ) ;
1437
+ itertools:: assert_equal ( c. iter ( ) , co. iter ( ) ) ;
1438
+ }
1439
+
1375
1440
#[ test]
1376
1441
fn map_memory_order ( ) {
1377
1442
let a = arr3 ( & [ [ [ 1 , 2 , 3 ] ,
0 commit comments