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