hydro2_basic_operators/
double_to_tri_op.rs

1// ---------------- [ File: src/double_to_tri_op.rs ]
2crate::ix!();
3
4// --------------------------------------
5// DoubleToTriOp
6// --------------------------------------
7#[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        // sum=3.0, diff=2.0, product=1.25
73        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}