hydro2_basic_operators/
constant_op.rs

1// ---------------- [ File: src/constant_op.rs ]
2crate::ix!();
3
4// --------------------------------------
5// ConstantOp<T>
6// --------------------------------------
7#[derive(NamedItem,Operator,Debug)]
8#[operator(execute="emit",opcode="BasicOpCode::ConstantOp",output0="T")]
9pub struct ConstantOp<T> 
10where T: Display + Copy + Debug + Send + Sync + PartialEq,
11{
12    name:  String,
13    value: T,
14}
15
16unsafe impl<T> Send for ConstantOp<T> where T: Display + Copy + Debug + Send + Sync + PartialEq {}
17unsafe impl<T> Sync for ConstantOp<T> where T: Display + Copy + Debug + Send + Sync + PartialEq {}
18
19impl<T> ConstantOp<T> 
20where T: Display + Copy + Debug + Send + Sync + PartialEq
21{
22    pub fn new(v: T) -> Self {
23        Self { 
24            name:  format!("ConstantOp({})", v),
25            value: v,
26        }
27    }
28
29    async fn emit(&self) -> NetResult<T> {
30        info!("OPERATOR running ConstantOp with value: {}", self.value);
31        Ok(self.value)
32    }
33}
34
35#[cfg(test)]
36mod constant_op_tests {
37    use super::*;
38
39    #[tokio::test]
40    async fn test_constant_op_basic() -> Result<(), NetworkError> {
41        let cst = ConstantOp::<i32>::new(42);
42        let input: [Option<&ConstantOpIO<i32>>;4] = [None,None,None,None];
43        let mut out: [Option<ConstantOpIO<i32>>;4] = [None,None,None,None];
44        cst.execute(input, &mut out).await?;
45        assert_eq!(out[0], Some(ConstantOpIO::Output0(42)));
46        Ok(())
47    }
48
49    #[tokio::test]
50    async fn test_constant_op_floats() -> Result<(), NetworkError> {
51        let cst = ConstantOp::<f64>::new(3.14);
52        let input = [None,None,None,None];
53        let mut out = [None,None,None,None];
54        cst.execute(input, &mut out).await?;
55        assert_eq!(out[0], Some(ConstantOpIO::Output0(3.14)));
56        Ok(())
57    }
58}