1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#[macro_export]
macro_rules! pulsed_op_to_typed_op {
    () => {
        fn to_typed(&self) -> Box<dyn TypedOp> {
            tract_core::dyn_clone::clone_box(self)
        }
    };
}

#[macro_export]
macro_rules! register_all_mod {
    ($($m: ident),*) => {
        pub fn register_all(inventory: &mut HashMap<TypeId, OpPulsifier>) {
            $( $m::register_all(inventory); )*
        }
    }
}

#[macro_export]
macro_rules! register_all {
    ($($op: ty: $func: expr),*) => {
        pub fn register_all(inventory: &mut HashMap<TypeId, OpPulsifier>) {
            $(
            inventory.insert(
                std::any::TypeId::of::<$op>(),
                OpPulsifier {
                    type_id: std::any::TypeId::of::<$op>(),
                    func: |source: &TypedModel,
                           node: &TypedNode,
                           target: &mut PulsedModel,
                           mapping: &HashMap<OutletId, OutletId>,
                           pulse: usize|
                     -> TractResult<TVec<OutletId>> {
                        let op = node.op_as::<$op>().unwrap();
                        ($func)(op, source, node, target, mapping, pulse)
                    },
                    name: stringify!($op)
                }
            );)*
        }
    };
}