hydro2_basic_operators/
double_to_tri_op.rs1crate::ix!();
3
4#[derive(NamedItem,Operator,Debug)]
8#[operator(
9 execute="double_to_tri",
10 opcode="BasicOpCode::DoubleToTriOp",
11 input0="T",
12 input1="T",
13 output0="T",
14 output1="T",
15 output2="T"
16)]
17pub struct DoubleToTriOp<T>
18where T: Copy + Display + Mul<T,Output=T> + Add<T,Output=T> + Sub<T,Output=T> + Debug + Send + Sync
19{
20 name: String,
21 _0: PhantomData<T>,
22}
23
24impl<T> DoubleToTriOp<T>
25where T: Copy + Display + Mul<T,Output=T> + Add<T,Output=T> + Sub<T,Output=T> + Debug + Send + Sync
26{
27 async fn double_to_tri(&self, input0: &T, input1: &T) -> NetResult<(T,T,T)> {
28 let left = *input0;
29 let right= *input1;
30 let sum = left + right;
31 let diff= left - right;
32 let prod= left * right;
33 info!("DoubleToTriOp => left={}, right={} => sum={}, diff={}, prod={}", left, right, sum, diff, prod);
34 Ok((sum,diff,prod))
35 }
36}
37
38#[cfg(test)]
39mod double_to_tri_op_tests {
40 use super::*;
41
42 #[tokio::test]
43 async fn test_double_to_tri_i32() -> Result<(), NetworkError> {
44 let op = DoubleToTriOp::<i32> {
45 name: "d2t".into(),
46 _0: Default::default(),
47 };
48 let input = [
49 Some(&DoubleToTriOpIO::Input0(10)),
50 Some(&DoubleToTriOpIO::Input1(3)),
51 None, None,
52 ];
53 let mut out = [None,None,None,None];
54 op.execute(input, &mut out).await?;
55 assert_eq!(out[0], Some(DoubleToTriOpIO::Output0(13)));
56 assert_eq!(out[1], Some(DoubleToTriOpIO::Output1(7)));
57 assert_eq!(out[2], Some(DoubleToTriOpIO::Output2(30)));
58 Ok(())
59 }
60
61 #[tokio::test]
62 async fn test_double_to_tri_floats() -> Result<(), NetworkError> {
63 let op = DoubleToTriOp::<f64> {
64 name: "d2tf64".into(),
65 _0: Default::default(),
66 };
67 let i0 = DoubleToTriOpIO::Input0(2.5);
68 let i1 = DoubleToTriOpIO::Input1(0.5);
69 let input = [Some(&i0), Some(&i1), None, None];
70 let mut out = [None,None,None,None];
71 op.execute(input, &mut out).await?;
72 assert_eq!(out[0], Some(DoubleToTriOpIO::Output0(3.0)));
74 assert_eq!(out[1], Some(DoubleToTriOpIO::Output1(2.0)));
75 assert_eq!(out[2], Some(DoubleToTriOpIO::Output2(1.25)));
76 Ok(())
77 }
78}