@@ -176,3 +176,57 @@ fn to_shape_error2() {
176176 let v = aview1 ( & data) ;
177177 let _u = v. to_shape ( ( 2 , usize:: MAX ) ) . unwrap ( ) ;
178178}
179+
180+ #[ test]
181+ fn to_shape_discontig ( ) {
182+ for & create_order in & [ Order :: C , Order :: F ] {
183+ let a = Array :: from_iter ( 0 ..64 ) ;
184+ let mut a1 = a. to_shape ( ( ( 4 , 4 , 4 ) , create_order) ) . unwrap ( ) ;
185+ a1. slice_collapse ( s ! [ .., ..; 2 , ..] ) ; // now shape (4, 2, 4)
186+ assert ! ( a1. as_slice_memory_order( ) . is_none( ) ) ;
187+
188+ for & order in & [ Order :: C , Order :: F ] {
189+ let v1 = a1. to_shape ( ( ( 2 , 2 , 2 , 2 , 2 ) , order) ) . unwrap ( ) ;
190+ assert ! ( v1. is_view( ) ) ;
191+ let v1 = a1. to_shape ( ( ( 4 , 1 , 2 , 1 , 2 , 2 ) , order) ) . unwrap ( ) ;
192+ assert ! ( v1. is_view( ) ) ;
193+ let v1 = a1. to_shape ( ( ( 4 , 2 , 4 ) , order) ) . unwrap ( ) ;
194+ assert ! ( v1. is_view( ) ) ;
195+ let v1 = a1. to_shape ( ( ( 8 , 4 ) , order) ) . unwrap ( ) ;
196+ assert_eq ! ( v1. is_view( ) , order == create_order && create_order == Order :: C ,
197+ "failed for {:?}, {:?}" , create_order, order) ;
198+ let v1 = a1. to_shape ( ( ( 4 , 8 ) , order) ) . unwrap ( ) ;
199+ assert_eq ! ( v1. is_view( ) , order == create_order && create_order == Order :: F ,
200+ "failed for {:?}, {:?}" , create_order, order) ;
201+ let v1 = a1. to_shape ( ( 32 , order) ) . unwrap ( ) ;
202+ assert ! ( !v1. is_view( ) ) ;
203+ }
204+ }
205+ }
206+
207+ #[ test]
208+ fn to_shape_broadcast ( ) {
209+ for & create_order in & [ Order :: C , Order :: F ] {
210+ let a = Array :: from_iter ( 0 ..64 ) ;
211+ let mut a1 = a. to_shape ( ( ( 4 , 4 , 4 ) , create_order) ) . unwrap ( ) ;
212+ a1. slice_collapse ( s ! [ .., ..1 , ..] ) ; // now shape (4, 1, 4)
213+ let v1 = a1. broadcast ( ( 4 , 4 , 4 ) ) . unwrap ( ) ; // Now shape (4, 4, 4)
214+ assert ! ( v1. as_slice_memory_order( ) . is_none( ) ) ;
215+
216+ for & order in & [ Order :: C , Order :: F ] {
217+ let v2 = v1. to_shape ( ( ( 2 , 2 , 2 , 2 , 2 , 2 ) , order) ) . unwrap ( ) ;
218+ assert_eq ! ( v2. strides( ) , match ( create_order, order) {
219+ ( Order :: C , Order :: C ) => { & [ 32 , 16 , 0 , 0 , 2 , 1 ] }
220+ ( Order :: C , Order :: F ) => { & [ 16 , 32 , 0 , 0 , 1 , 2 ] }
221+ ( Order :: F , Order :: C ) => { & [ 2 , 1 , 0 , 0 , 32 , 16 ] }
222+ ( Order :: F , Order :: F ) => { & [ 1 , 2 , 0 , 0 , 16 , 32 ] }
223+ _other => unreachable!( )
224+ } ) ;
225+
226+ let v2 = v1. to_shape ( ( ( 4 , 4 , 4 ) , order) ) . unwrap ( ) ;
227+ assert ! ( v2. is_view( ) ) ;
228+ let v2 = v1. to_shape ( ( ( 8 , 8 ) , order) ) . unwrap ( ) ;
229+ assert ! ( v2. is_owned( ) ) ;
230+ }
231+ }
232+ }
0 commit comments