@@ -278,6 +278,47 @@ pub fn test_binary_scalar_lhs_elementwise<
278
278
} ) ;
279
279
}
280
280
281
+ /// Test a ternary vector function against a ternary scalar function, applied elementwise.
282
+ #[ inline( never) ]
283
+ pub fn test_ternary_elementwise <
284
+ Scalar1 ,
285
+ Scalar2 ,
286
+ Scalar3 ,
287
+ ScalarResult ,
288
+ Vector1 ,
289
+ Vector2 ,
290
+ Vector3 ,
291
+ VectorResult ,
292
+ const LANES : usize ,
293
+ > (
294
+ fv : & dyn Fn ( Vector1 , Vector2 , Vector3 ) -> VectorResult ,
295
+ fs : & dyn Fn ( Scalar1 , Scalar2 , Scalar3 ) -> ScalarResult ,
296
+ check : & dyn Fn ( [ Scalar1 ; LANES ] , [ Scalar2 ; LANES ] , [ Scalar3 ; LANES ] ) -> bool ,
297
+ ) where
298
+ Scalar1 : Copy + Default + core:: fmt:: Debug + DefaultStrategy ,
299
+ Scalar2 : Copy + Default + core:: fmt:: Debug + DefaultStrategy ,
300
+ Scalar3 : Copy + Default + core:: fmt:: Debug + DefaultStrategy ,
301
+ ScalarResult : Copy + Default + biteq:: BitEq + core:: fmt:: Debug + DefaultStrategy ,
302
+ Vector1 : Into < [ Scalar1 ; LANES ] > + From < [ Scalar1 ; LANES ] > + Copy ,
303
+ Vector2 : Into < [ Scalar2 ; LANES ] > + From < [ Scalar2 ; LANES ] > + Copy ,
304
+ Vector3 : Into < [ Scalar3 ; LANES ] > + From < [ Scalar3 ; LANES ] > + Copy ,
305
+ VectorResult : Into < [ ScalarResult ; LANES ] > + From < [ ScalarResult ; LANES ] > + Copy ,
306
+ {
307
+ test_3 ( & |x : [ Scalar1 ; LANES ] , y : [ Scalar2 ; LANES ] , z : [ Scalar3 ; LANES ] | {
308
+ proptest:: prop_assume!( check( x, y, z) ) ;
309
+ let result_1: [ ScalarResult ; LANES ] = fv ( x. into ( ) , y. into ( ) , z. into ( ) ) . into ( ) ;
310
+ let result_2: [ ScalarResult ; LANES ] = {
311
+ let mut result = [ ScalarResult :: default ( ) ; LANES ] ;
312
+ for ( ( i1, ( i2, i3) ) , o) in x. iter ( ) . zip ( y. iter ( ) . zip ( z. iter ( ) ) ) . zip ( result. iter_mut ( ) ) {
313
+ * o = fs ( * i1, * i2, * i3) ;
314
+ }
315
+ result
316
+ } ;
317
+ crate :: prop_assert_biteq!( result_1, result_2) ;
318
+ Ok ( ( ) )
319
+ } ) ;
320
+ }
321
+
281
322
/// Expand a const-generic test into separate tests for each possible lane count.
282
323
#[ macro_export]
283
324
macro_rules! test_lanes {
0 commit comments