fn_ptr/
arity.rs

1/// Type-level marker trait for function arity, from [`A0`] to [`A12`].
2pub trait Arity {
3    /// Number of parameters for this arity.
4    const N: usize;
5}
6macro_rules! define_arity_marker {
7    ($(($name:ident, $n:expr)),+ $(,)?) => {
8        $(
9            #[doc = "Type-level marker for functions with exactly "]
10            #[doc = stringify!($n)]
11            #[doc = " parameters."]
12            #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13            pub struct $name;
14
15            impl Arity for $name {
16                const N: usize = $n;
17            }
18        )+
19    };
20}
21define_arity_marker!(
22    (A0, 0),
23    (A1, 1),
24    (A2, 2),
25    (A3, 3),
26    (A4, 4),
27    (A5, 5),
28    (A6, 6),
29    (A7, 7),
30    (A8, 8),
31    (A9, 9),
32    (A10, 10),
33    (A11, 11),
34    (A12, 12),
35);
36
37/// Macro to convert an integral number to the corresponding [`Arity`] marker type.
38#[macro_export]
39macro_rules! arity {
40    (0) => {
41        $crate::marker::A0
42    };
43    (1) => {
44        $crate::marker::A1
45    };
46    (2) => {
47        $crate::marker::A2
48    };
49    (3) => {
50        $crate::marker::A3
51    };
52    (4) => {
53        $crate::marker::A4
54    };
55    (5) => {
56        $crate::marker::A5
57    };
58    (6) => {
59        $crate::marker::A6
60    };
61    (7) => {
62        $crate::marker::A7
63    };
64    (8) => {
65        $crate::marker::A8
66    };
67    (9) => {
68        $crate::marker::A9
69    };
70    (10) => {
71        $crate::marker::A10
72    };
73    (11) => {
74        $crate::marker::A11
75    };
76    (12) => {
77        $crate::marker::A12
78    };
79}