hydro2_basic_operators/
double_to_tri_two_generics_op.rs

1// ---------------- [ File: src/double_to_tri_two_generics_op.rs ]
2crate::ix!();
3
4// --------------------------------------
5// DoubleToTriTwoGenericsOp
6// --------------------------------------
7#[derive(NamedItem,Operator,Debug)]
8#[operator(
9    execute="double_to_tri",
10    opcode="BasicOpCode::DoubleToTriTwoGenericsOp",
11    input0="T", 
12    input1="U", 
13    input2="i32", 
14    output0="T",
15    output1="U",
16    output2="U"
17)]
18pub struct DoubleToTriTwoGenericsOp<T,U> 
19where T: Copy + Display + Mul<T,Output=T> + Add<T,Output=T> + Sub<T,Output=T> + Debug + Send + Sync,
20      U: Copy + Display + Mul<U,Output=U> + Add<U,Output=U> + Sub<U,Output=U> + Debug + Send + Sync,
21{
22    name: String,
23    _0: PhantomData<T>,
24    _1: PhantomData<U>,
25}
26
27impl<T,U> DoubleToTriTwoGenericsOp<T,U> 
28where T: Copy + Display + Mul<T,Output=T> + Add<T,Output=T> + Sub<T,Output=T> + Debug + Send + Sync,
29      U: Copy + Display + Mul<U,Output=U> + Add<U,Output=U> + Sub<U,Output=U> + Debug + Send + Sync,
30{
31    async fn double_to_tri(&self, input0: &T, input1: &U, input2: &i32) -> NetResult<(T,U,U)> {
32        let t = *input0;
33        let u = *input1;
34        let t2 = t * t;
35        let u2 = u * u;
36        let u3 = u * u * u;
37        info!("DoubleToTriTwoGenericsOp => input2={}, t={}, u={} => t2={}, u2={}, u3={}", input2, t, u, t2, u2, u3);
38        Ok((t2,u2,u3))
39    }
40}
41
42#[cfg(test)]
43mod double_to_tri_two_generics_op_tests {
44    use super::*;
45
46    #[tokio::test]
47    async fn test_double_to_tri_two_generics_i32() -> Result<(), NetworkError> {
48        let op = DoubleToTriTwoGenericsOp::<i32,f32> {
49            name: "d2t".into(),
50            _0:   Default::default(),
51            _1:   Default::default(),
52        };
53        let input = [
54            Some(&DoubleToTriTwoGenericsOpIO::Input0(10)),
55            Some(&DoubleToTriTwoGenericsOpIO::Input1(3.0)),
56            Some(&DoubleToTriTwoGenericsOpIO::Input2(3)),
57            None,
58        ];
59        let mut out = [None,None,None,None];
60        op.execute(input, &mut out).await?;
61        assert_eq!(out[0], Some(DoubleToTriTwoGenericsOpIO::Output0(100)));
62        assert_eq!(out[1], Some(DoubleToTriTwoGenericsOpIO::Output1(9.0)));
63        assert_eq!(out[2], Some(DoubleToTriTwoGenericsOpIO::Output2(27.0)));
64        Ok(())
65    }
66
67    #[tokio::test]
68    async fn test_double_to_tri_two_generics_floats() -> Result<(), NetworkError> {
69        let op = DoubleToTriTwoGenericsOp::<f64,i32> {
70            name: "d2tf64".into(),
71            _0:   Default::default(),
72            _1:   Default::default(),
73        };
74        let i0 = DoubleToTriTwoGenericsOpIO::Input0(2.0);
75        let i1 = DoubleToTriTwoGenericsOpIO::Input1(5);
76        let i2 = DoubleToTriTwoGenericsOpIO::Input2(50);
77        let input = [
78            Some(&i0), 
79            Some(&i1), 
80            Some(&i2), 
81            None
82        ];
83        let mut out = [None,None,None,None];
84        op.execute(input, &mut out).await?;
85        // sum=3.0, diff=2.0, product=1.25
86        assert_eq!(out[0], Some(DoubleToTriTwoGenericsOpIO::Output0(4.0)));
87        assert_eq!(out[1], Some(DoubleToTriTwoGenericsOpIO::Output1(25)));
88        assert_eq!(out[2], Some(DoubleToTriTwoGenericsOpIO::Output2(125)));
89        Ok(())
90    }
91}