macro_rules! matchvar {
($ex:expr, $pat:pat) => {{
if let $pat = $ex {
true
} else {
false
}
}};
}
#[macro_export]
macro_rules! register_task_make_call {
($f: expr, $ins: expr, $outs: expr, (), ($($args: tt)*)) => {{
if $ins.len() != 0 {
Err("too many inputs")?;
}
if $outs.len() != 0 {
Err("too many outputs")?;
}
$f($($args)*)
}};
($f: expr, $ins: expr, $outs: expr, (I $($params: tt)*), ($($args: tt)*)) => {{
let (first, more) = $ins.split_first().ok_or("not enough inputs")?;
register_task_make_call!($f, more, $outs, ($($params)*), ($($args)*, first))
}};
($f: expr, $ins: expr, $outs: expr, (Is $($params: tt)*), ($($args: tt)*)) => {{
let no_more: &[DataInstance] = &[];
register_task_make_call!($f, no_more, $outs, ($($params)*), ($($args)*, $ins))
}};
($f: expr, $ins: expr, $outs: expr, (O $($params: tt)*), ($($args: tt)*)) => {{
let (first, more) = $outs.split_first_mut().ok_or("not enough outputs")?;
register_task_make_call!($f, $ins, more, ($($params)*), ($($args)*, first))
}};
($f: expr, $ins: expr, $outs: expr, (Os $($params: tt)*), ($($args: tt)*)) => {{
let no_more: &[Output] = &[];
register_task_make_call!($f, $ins, no_more, ($($params)*), ($($args)*, $outs))
}};
}
#[macro_export]
macro_rules! register_task {
($executor: expr, $name: expr, [$($params: tt)*], $taskfn: expr) => ({
$executor.register_task($name, |ctx: &mut Context, ins: &[DataInstance], outs: &mut [Output]| -> TaskResult<()> {
register_task_make_call!($taskfn, ins, outs, ($($params)*), (ctx))
})
});
}