hydro2_basic_operators/
double_to_tri_two_generics_op.rs1crate::ix!();
3
4#[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 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}