adar 0.2.0

Collection of architectural tools including flags, state machine, enum and tuple operations.
Documentation
pub trait TupleLength {
    fn len(&self) -> usize;
}

impl TupleLength for () {
    fn len(&self) -> usize {
        0
    }
}

macro_rules! impl_tuple_length {
    ($N:tt, $($T:ident),+) => {
        impl<$($T),+> TupleLength for ($($T,)+) {
            fn len(&self) -> usize {
                $N
            }
        }
    };
}

impl_tuple_length!(1, A);
impl_tuple_length!(2, A, B);
impl_tuple_length!(3, A, B, C);
impl_tuple_length!(4, A, B, C, D);
impl_tuple_length!(5, A, B, C, D, E);
impl_tuple_length!(6, A, B, C, D, E, F);
impl_tuple_length!(7, A, B, C, D, E, F, G);
impl_tuple_length!(8, A, B, C, D, E, F, G, H);
impl_tuple_length!(9, A, B, C, D, E, F, G, H, I);
impl_tuple_length!(10, A, B, C, D, E, F, G, H, I, J);
impl_tuple_length!(11, A, B, C, D, E, F, G, H, I, J, K);
impl_tuple_length!(12, A, B, C, D, E, F, G, H, I, J, K, L);
impl_tuple_length!(13, A, B, C, D, E, F, G, H, I, J, K, L, M);
impl_tuple_length!(14, A, B, C, D, E, F, G, H, I, J, K, L, M, N);
impl_tuple_length!(15, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
impl_tuple_length!(16, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_tuple_length() {
        assert_eq!(().len(), 0);
        assert_eq!((0,).len(), 1);
        assert_eq!((0, 1).len(), 2);
        assert_eq!(
            (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15).len(),
            16
        );
    }
}