@@ -176,3 +176,57 @@ fn to_shape_error2() {
176
176
let v = aview1 ( & data) ;
177
177
let _u = v. to_shape ( ( 2 , usize:: MAX ) ) . unwrap ( ) ;
178
178
}
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