Macro match_literal_vector

Source
macro_rules! match_literal_vector {
    (match $lit_vec:expr => $out:ident {
        $(
            $ty:ident => |$($var:ident),+| $(-> $ret:ident)? { $body:expr }
        ),+
        $(,)?
    }) => { ... };
    (@inner_start
        $lit_vec:expr;
        $out:ident;
        [$($ty:ident),+];
        [$({ $($var:ident),+ ; $($ret:ident)? ; $body:expr }),+]
    ) => { ... };
    (@inner
        $lit_vec:expr;
        $out:ident;
        [$ty:ident $(, $ty1:ident)*];
        [$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <>
        [$({ $($var:ident),+ ; $($ret:ident)? ; $body:expr }),+]
    ) => { ... };
    (@inner
        Integer;
        $lit_vec:expr;
        $out:ident;
        [$($ty:ident),*];
        [$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <>
        [
            { $($var:ident),+ ; $($ret:ident)? ; $body:expr }
            $(,{ $($var1:ident),+ ; $($ret1:ident)? ; $body1:expr })*
        ]
    ) => { ... };
    (@inner
        Float;
        $lit_vec:expr;
        $out:ident;
        [$($ty:ident),*];
        [$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <>
        [
            { $($var:ident),+ ; $($ret:ident)? ; $body:expr }
            $(,{ $($var1:ident),+ ; $($ret1:ident)? ; $body1:expr })*
        ]
    ) => { ... };
    (@inner
        $ty:ident;
        $lit_vec:expr;
        $out:ident;
        [$ty1:ident $(,$ty2:ident)*];
        [$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <> [
            { $($var:ident),+ ; $($ret:ident)? ; $body:expr }
            $(, { $($var1:ident),+ ; $($ret1:ident)? ; $body1:expr })*
        ]
    ) => { ... };
    (@inner
        $ty:ident;
        $lit_vec:expr;
        $out:ident;
        [];
        [$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <>
        [{ $($var:ident),+ ; $($ret:ident)? ; $body:expr }]
    ) => { ... };
    (@inner_finish
        $lit_vec:expr;
        $out:ident;
        [$({$ty:ident ; $($var:ident),+ ; $($ret:ident)? ; $body:expr}),+]
    ) => { ... };
    (@expand_ret $out:ident; $ty:ident; $body:expr) => { ... };
    (@expand_ret $out:ident; $_ty:ident; $ret:ident; $body:expr) => { ... };
}
Expand description

A macro for matching on LiteralVector variants.

Float variant expands to F16, F32, F64 and AbstractFloat. Integer variant expands to I32, I64, U32, U64 and AbstractInt.

For output both Literal (fold) and LiteralVector (map) are supported.

Example usage:

match_literal_vector!(match v => Literal {
    F16 => |v| {v.sum()},
    Integer => |v| {v.sum()},
    U32 => |v| -> I32 {v.sum()}, // optionally override return type
})
match_literal_vector!(match (e1, e2) => LiteralVector {
    F16 => |e1, e2| {e1+e2},
    Integer => |e1, e2| {e1+e2},
    U32 => |e1, e2| -> I32 {e1+e2}, // optionally override return type
})