hydro2_basic_operators/
tri_to_quad_op.rs

1// ---------------- [ File: src/tri_to_quad_op.rs ]
2crate::ix!();
3
4// --------------------------------------
5// TriToQuadOp
6// --------------------------------------
7#[derive(NamedItem, Operator, Debug)]
8#[operator(
9    execute="tri_to_quad",
10    opcode="BasicOpCode::TriToQuadOp",
11    input0="i32",
12    input1="i32",
13    input2="i32",
14    output0="i32",
15    output1="i32",
16    output2="i32",
17    output3="i32"
18)]
19pub struct TriToQuadOp {
20    name: String,
21}
22
23impl TriToQuadOp {
24    pub fn new() -> Self {
25        Self { name: "TriToQuadOp".into() }
26    }
27
28    async fn tri_to_quad(&self, a: &i32, b: &i32, c: &i32) -> NetResult<(i32,i32,i32,i32)> {
29        let sum = *a + *b + *c;
30        let product = *a * *b * *c;
31        let mi = a.min(b).min(c);
32        let ma = a.max(b).max(c);
33        info!("TriToQuadOp => a={},b={},c={} => sum={}, product={}, min={}, max={}", a, b, c, sum, product, mi, ma);
34        Ok((sum, product, *mi, *ma))
35    }
36}
37
38#[cfg(test)]
39mod tri_to_quad_op_tests {
40    use super::*;
41
42    #[tokio::test]
43    async fn test_tri_to_quad_op_basic() -> Result<(), NetworkError> {
44        let op = TriToQuadOp::new();
45        let i0 = TriToQuadOpIO::Input0(1);
46        let i1 = TriToQuadOpIO::Input1(5);
47        let i2 = TriToQuadOpIO::Input2(2);
48
49        let input = [Some(&i0), Some(&i1), Some(&i2), None];
50        let mut out = [None,None,None,None];
51        op.execute(input, &mut out).await?;
52        // sum=8, product=10, min=1, max=5
53        assert_eq!(out[0], Some(TriToQuadOpIO::Output0(8)));
54        assert_eq!(out[1], Some(TriToQuadOpIO::Output1(10)));
55        assert_eq!(out[2], Some(TriToQuadOpIO::Output2(1)));
56        assert_eq!(out[3], Some(TriToQuadOpIO::Output3(5)));
57        Ok(())
58    }
59}