@@ -274,28 +274,37 @@ fn test_slice_inplace_with_subview_inplace() {
274274 * elt = i;
275275 }
276276
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+ }
294301
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;
296305 vi. slice_inplace ( s ! [ 1 , 2 , 3 ] ) ;
297306 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 ) ) ;
299308}
300309
301310#[ should_panic]
@@ -807,6 +816,44 @@ fn owned_array_with_stride() {
807816 assert_eq ! ( a. strides( ) , & [ 1 , 4 , 2 ] ) ;
808817}
809818
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+
810857macro_rules! assert_matches {
811858 ( $value: expr, $pat: pat) => {
812859 match $value {
@@ -1372,6 +1419,18 @@ fn to_owned_neg_stride() {
13721419 assert_eq ! ( c, co) ;
13731420}
13741421
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+
13751434#[ test]
13761435fn map_memory_order ( ) {
13771436 let a = arr3 ( & [ [ [ 1 , 2 , 3 ] ,
0 commit comments