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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
macro_rules! e { ($e:expr) => {$e} } macro_rules! match_index { ($n:expr, $this:expr, $($i:tt),*) => ( match $n { $( e!($i) => Some(&e!($this . $i)), )* _ => None } ) } macro_rules! impl_indexing { ($typ:ty, $($i:tt),*) => ( impl <T> TupleIndexingExt<T> for $typ { fn get(&self, n: usize) -> Option<&T> { match_index!(n, self, $($i),*) } } ) } pub trait TupleIndexingExt<T> { fn get(&self, n: usize) -> Option<&T>; } impl <T> TupleIndexingExt<T> for () { fn get(&self, _: usize) -> Option<&T> { None } } impl_indexing!( (T,), 0 ); impl_indexing!( (T, T), 0, 1 ); impl_indexing!( (T, T, T), 0, 1, 2 ); impl_indexing!( (T, T, T, T), 0, 1, 2, 3 ); impl_indexing!( (T, T, T, T, T), 0, 1, 2, 3, 4 ); impl_indexing!( (T, T, T, T, T, T), 0, 1, 2, 3, 4, 5 ); impl_indexing!( (T, T, T, T, T, T, T), 0, 1, 2, 3, 4, 5, 6 ); impl_indexing!( (T, T, T, T, T, T, T, T), 0, 1, 2, 3, 4, 5, 6, 7 ); impl_indexing!( (T, T, T, T, T, T, T, T, T), 0, 1, 2, 3, 4, 5, 6, 7, 8 ); impl_indexing!( (T, T, T, T, T, T, T, T, T, T), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );