tuple_arity/
lib.rs

1/// Trait for getting the arity of a value. You shouldn't need to impl this yourself.
2pub trait Arity {
3    /// Gets the arity of the type.
4    ///
5    /// Example
6    /// ```rust
7    /// use tuple_arity::Arity;
8    /// 
9    /// assert_eq!(0, <()>::arity());
10    /// assert_eq!(1, <(u8,)>::arity());
11    /// assert_eq!(2, <(u8, u8)>::arity());
12    /// assert_eq!(3, <(u8, u8, u8)>::arity());
13    /// assert_eq!(4, <(u8, u8, u8, u8)>::arity());
14    /// ```
15    fn arity() -> usize;
16}
17
18macro_rules! impl_tuple_arity {
19    ($len:expr, $($tuple_arg:ident),*) => {
20        impl<$($tuple_arg,)*> Arity for ($($tuple_arg,)*) {
21            #[inline(always)]
22            fn arity() -> usize {
23                $len
24            }
25        }
26    }
27}
28
29/// Gets the arity of the specified value.
30///
31/// # Example
32/// ```rust
33/// use tuple_arity::*;
34/// assert_eq!(0, tuple_arity(&()));
35/// assert_eq!(1, tuple_arity(&("foo",)));
36/// assert_eq!(2, tuple_arity(&("foo", "bar")));
37/// assert_eq!(3, tuple_arity(&("foo", "bar", "baz")));
38/// ```
39#[inline(always)]
40pub fn tuple_arity<T: Arity>(_: &T) -> usize {
41    T::arity()
42}
43
44
45impl_tuple_arity!(0,);
46impl_tuple_arity!(1, T1);
47impl_tuple_arity!(2, T1, T2);
48impl_tuple_arity!(3, T1, T2, T3);
49impl_tuple_arity!(4, T1, T2, T3, T4);
50impl_tuple_arity!(5, T1, T2, T3, T4, T5);
51impl_tuple_arity!(6, T1, T2, T3, T4, T5, T6);
52impl_tuple_arity!(7, T1, T2, T3, T4, T5, T6, T7);
53impl_tuple_arity!(8, T1, T2, T3, T4, T5, T6, T7, T8);
54impl_tuple_arity!(9, T1, T2, T3, T4, T5, T6, T7, T8, T9);
55impl_tuple_arity!(10, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
56impl_tuple_arity!(11, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11);
57impl_tuple_arity!(12, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12);