1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
macro_rules! m_convert {
    ($($Tuple:ident { $($T:ident . $idx:tt),* } )*) => ($(
        impl<$($T),*> convert::From<($($T,)*)> for $Tuple<$($T),*> {
            fn from(t: ($($T,)*)) -> Self {
                $Tuple( $( t.$idx ),* )
            }
        }
        impl<$($T),*> convert::Into<($($T,)*)> for $Tuple<$($T),*> {
            fn into(self) -> ($($T,)*) {
                ( $( self.$idx, )* )
            }
        }
        impl<T> convert::From<[T; $(a!(1, $idx)+)* 0]> for $Tuple<$(A!(T, $T)),*> {
            fn from(t: [T; $(a!(1, $idx)+)* 0]) -> Self {
                let [$($T),*] = { t };
                $Tuple( $( $T, )* )
            }
        }
        impl<T> convert::Into<[T; 0 $(+ a!(1, $idx))*]> for $Tuple<$(A!(T, $T)),*> {
            fn into(self) -> [T; 0 $(+ a!(1, $idx))*] {
                let $Tuple($($T),*) = self;
                [ $($T),* ]
            }
        }
        impl<'a, T> convert::TryFrom<&'a [T]> for $Tuple<$(A!(T, $T)),*> where T: Clone {
            type Error = ConvertError;
            fn try_from(slice: &'a [T]) -> Result<Self, ConvertError> {
                const N: usize = $(a!(1, $idx)+)* 0;
                
                if slice.len() >= N {
                    Ok($Tuple( $( slice[$idx].clone() ),* ))
                } else {
                    Err(ConvertError::OutOfBounds)
                }
            }
        }
    )*)
}