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