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_init { ($($Tuple:ident { $($T:ident . $idx:tt),* } )*) => ($( pub struct $Tuple<$($T),*>($(pub $T),*); impl<$($T),*> Clone for $Tuple<$($T),*> where $( $T: Clone ),* { fn clone(&self) -> Self { $Tuple( $( self.$idx.clone() ),* ) } } impl<$($T),*> Copy for $Tuple<$($T),*> where $( $T: Copy ),* {} impl<$($T),*> PartialEq for $Tuple<$($T),*> where $( $T: PartialEq ),* { fn eq(&self, other: &Self) -> bool { $( self.$idx == other.$idx)&&* } } impl<$($T),*> Eq for $Tuple<$($T),*> where $( $T: Eq ),* {} impl<$($T),*> fmt::Debug for $Tuple<$($T),*> where $( $T: fmt::Debug ),* { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { ( $(&self.$idx ),* ).fmt(f) } } impl<$($T),*> From<u16> for $Tuple<$($T),*> where $( $T: From<u16> ),* { fn from(value: u16) -> Self { $Tuple( $( $T::from(value) ),* ) } } impl<$($T),*> Iterator for $Tuple<$($T),*> where $( $T: Iterator ),* { type Item = $Tuple<$($T::Item),*>; #[allow(non_snake_case)] fn next(&mut self) -> Option<Self::Item> { match ( $(self.$idx.next(), )* ) { ( $( Some($T) ,)* ) => Some($Tuple( $($T),* )), _ => None } } } )*) }