zerofrom/
macro_impls.rs

1// This file is part of ICU4X. For terms of use, please see the file
2// called LICENSE at the top level of the ICU4X source tree
3// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5// In this case consistency between impls is more important
6// than using pointer casts
7#![allow(clippy::transmute_ptr_to_ptr)]
8
9use crate::ZeroFrom;
10
11macro_rules! impl_copy_type {
12    ($ty:ident) => {
13        impl<'a> ZeroFrom<'a, $ty> for $ty {
14            #[inline]
15            fn zero_from(this: &'a Self) -> Self {
16                // Essentially only works when the struct is fully Copy
17                *this
18            }
19        }
20    };
21}
22
23impl<'a> ZeroFrom<'a, u8> for u8 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(u8);
24impl<'a> ZeroFrom<'a, u16> for u16 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(u16);
25impl<'a> ZeroFrom<'a, u32> for u32 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(u32);
26impl<'a> ZeroFrom<'a, u64> for u64 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(u64);
27impl<'a> ZeroFrom<'a, u128> for u128 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(u128);
28impl<'a> ZeroFrom<'a, usize> for usize {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(usize);
29impl<'a> ZeroFrom<'a, i8> for i8 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(i8);
30impl<'a> ZeroFrom<'a, i16> for i16 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(i16);
31impl<'a> ZeroFrom<'a, i32> for i32 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(i32);
32impl<'a> ZeroFrom<'a, i64> for i64 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(i64);
33impl<'a> ZeroFrom<'a, i128> for i128 {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(i128);
34impl<'a> ZeroFrom<'a, isize> for isize {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(isize);
35impl<'a> ZeroFrom<'a, char> for char {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(char);
36impl<'a> ZeroFrom<'a, bool> for bool {
    #[inline]
    fn zero_from(this: &'a Self) -> Self { *this }
}impl_copy_type!(bool);
37
38// This can be cleaned up once `[T; N]`::each_ref() is stabilized
39// https://github.com/rust-lang/rust/issues/76118
40macro_rules! array_zf_impl {
41    ($n:expr; $($i:expr),+) => {
42        impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; $n]> for [T; $n] {
43            fn zero_from(this: &'a [C; $n]) -> Self {
44                [
45                    $(
46                        <T as ZeroFrom<C>>::zero_from(&this[$i])
47                    ),+
48
49                ]
50            }
51        }
52    }
53}
54
55impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 1]> for [T; 1] {
    fn zero_from(this: &'a [C; 1]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0])]
    }
}array_zf_impl!(1; 0);
56impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 2]> for [T; 2] {
    fn zero_from(this: &'a [C; 2]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1])]
    }
}array_zf_impl!(2; 0, 1);
57impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 3]> for [T; 3] {
    fn zero_from(this: &'a [C; 3]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2])]
    }
}array_zf_impl!(3; 0, 1, 2);
58impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 4]> for [T; 4] {
    fn zero_from(this: &'a [C; 4]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3])]
    }
}array_zf_impl!(4; 0, 1, 2, 3);
59impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 5]> for [T; 5] {
    fn zero_from(this: &'a [C; 5]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4])]
    }
}array_zf_impl!(5; 0, 1, 2, 3, 4);
60impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 6]> for [T; 6] {
    fn zero_from(this: &'a [C; 6]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5])]
    }
}array_zf_impl!(6; 0, 1, 2, 3, 4, 5);
61impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 7]> for [T; 7] {
    fn zero_from(this: &'a [C; 7]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6])]
    }
}array_zf_impl!(7; 0, 1, 2, 3, 4, 5, 6);
62impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 8]> for [T; 8] {
    fn zero_from(this: &'a [C; 8]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6]),
                <T as ZeroFrom<C>>::zero_from(&this[7])]
    }
}array_zf_impl!(8; 0, 1, 2, 3, 4, 5, 6, 7);
63impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 9]> for [T; 9] {
    fn zero_from(this: &'a [C; 9]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6]),
                <T as ZeroFrom<C>>::zero_from(&this[7]),
                <T as ZeroFrom<C>>::zero_from(&this[8])]
    }
}array_zf_impl!(9; 0, 1, 2, 3, 4, 5, 6, 7, 8);
64impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 10]> for [T; 10] {
    fn zero_from(this: &'a [C; 10]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6]),
                <T as ZeroFrom<C>>::zero_from(&this[7]),
                <T as ZeroFrom<C>>::zero_from(&this[8]),
                <T as ZeroFrom<C>>::zero_from(&this[9])]
    }
}array_zf_impl!(10; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
65impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 11]> for [T; 11] {
    fn zero_from(this: &'a [C; 11]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6]),
                <T as ZeroFrom<C>>::zero_from(&this[7]),
                <T as ZeroFrom<C>>::zero_from(&this[8]),
                <T as ZeroFrom<C>>::zero_from(&this[9]),
                <T as ZeroFrom<C>>::zero_from(&this[10])]
    }
}array_zf_impl!(11; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
66impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 12]> for [T; 12] {
    fn zero_from(this: &'a [C; 12]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6]),
                <T as ZeroFrom<C>>::zero_from(&this[7]),
                <T as ZeroFrom<C>>::zero_from(&this[8]),
                <T as ZeroFrom<C>>::zero_from(&this[9]),
                <T as ZeroFrom<C>>::zero_from(&this[10]),
                <T as ZeroFrom<C>>::zero_from(&this[11])]
    }
}array_zf_impl!(12; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
67impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 13]> for [T; 13] {
    fn zero_from(this: &'a [C; 13]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6]),
                <T as ZeroFrom<C>>::zero_from(&this[7]),
                <T as ZeroFrom<C>>::zero_from(&this[8]),
                <T as ZeroFrom<C>>::zero_from(&this[9]),
                <T as ZeroFrom<C>>::zero_from(&this[10]),
                <T as ZeroFrom<C>>::zero_from(&this[11]),
                <T as ZeroFrom<C>>::zero_from(&this[12])]
    }
}array_zf_impl!(13; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
68impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 14]> for [T; 14] {
    fn zero_from(this: &'a [C; 14]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6]),
                <T as ZeroFrom<C>>::zero_from(&this[7]),
                <T as ZeroFrom<C>>::zero_from(&this[8]),
                <T as ZeroFrom<C>>::zero_from(&this[9]),
                <T as ZeroFrom<C>>::zero_from(&this[10]),
                <T as ZeroFrom<C>>::zero_from(&this[11]),
                <T as ZeroFrom<C>>::zero_from(&this[12]),
                <T as ZeroFrom<C>>::zero_from(&this[13])]
    }
}array_zf_impl!(14; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
69impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 15]> for [T; 15] {
    fn zero_from(this: &'a [C; 15]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6]),
                <T as ZeroFrom<C>>::zero_from(&this[7]),
                <T as ZeroFrom<C>>::zero_from(&this[8]),
                <T as ZeroFrom<C>>::zero_from(&this[9]),
                <T as ZeroFrom<C>>::zero_from(&this[10]),
                <T as ZeroFrom<C>>::zero_from(&this[11]),
                <T as ZeroFrom<C>>::zero_from(&this[12]),
                <T as ZeroFrom<C>>::zero_from(&this[13]),
                <T as ZeroFrom<C>>::zero_from(&this[14])]
    }
}array_zf_impl!(15; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
70impl<'a, C, T: ZeroFrom<'a, C>> ZeroFrom<'a, [C; 16]> for [T; 16] {
    fn zero_from(this: &'a [C; 16]) -> Self {
        [<T as ZeroFrom<C>>::zero_from(&this[0]),
                <T as ZeroFrom<C>>::zero_from(&this[1]),
                <T as ZeroFrom<C>>::zero_from(&this[2]),
                <T as ZeroFrom<C>>::zero_from(&this[3]),
                <T as ZeroFrom<C>>::zero_from(&this[4]),
                <T as ZeroFrom<C>>::zero_from(&this[5]),
                <T as ZeroFrom<C>>::zero_from(&this[6]),
                <T as ZeroFrom<C>>::zero_from(&this[7]),
                <T as ZeroFrom<C>>::zero_from(&this[8]),
                <T as ZeroFrom<C>>::zero_from(&this[9]),
                <T as ZeroFrom<C>>::zero_from(&this[10]),
                <T as ZeroFrom<C>>::zero_from(&this[11]),
                <T as ZeroFrom<C>>::zero_from(&this[12]),
                <T as ZeroFrom<C>>::zero_from(&this[13]),
                <T as ZeroFrom<C>>::zero_from(&this[14]),
                <T as ZeroFrom<C>>::zero_from(&this[15])]
    }
}array_zf_impl!(16; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
71
72macro_rules! tuple_zf_impl {
73    ($(($c:ident, $t:ident, $i:tt)),+) => {
74        impl<'zf, $($c, $t: ZeroFrom<'zf, $c>),+> ZeroFrom<'zf, ($($c),+)>
75            for ($($t),+)
76            {
77            fn zero_from(other: &'zf ($($c),+)) -> Self {
78                (
79                    $(<$t as ZeroFrom<$c>>::zero_from(&other.$i)),+
80                )
81            }
82        }
83    };
84}
85
86impl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>>
    ZeroFrom<'zf, (C1, C2)> for (T1, T2) {
    fn zero_from(other: &'zf (C1, C2)) -> Self {
        (<T1 as ZeroFrom<C1>>::zero_from(&other.0),
            <T2 as ZeroFrom<C2>>::zero_from(&other.1))
    }
}tuple_zf_impl!((C1, T1, 0), (C2, T2, 1));
87impl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3,
    T3: ZeroFrom<'zf, C3>> ZeroFrom<'zf, (C1, C2, C3)> for (T1, T2, T3) {
    fn zero_from(other: &'zf (C1, C2, C3)) -> Self {
        (<T1 as ZeroFrom<C1>>::zero_from(&other.0),
            <T2 as ZeroFrom<C2>>::zero_from(&other.1),
            <T3 as ZeroFrom<C3>>::zero_from(&other.2))
    }
}tuple_zf_impl!((C1, T1, 0), (C2, T2, 1), (C3, T3, 2));
88impl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3,
    T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>>
    ZeroFrom<'zf, (C1, C2, C3, C4)> for (T1, T2, T3, T4) {
    fn zero_from(other: &'zf (C1, C2, C3, C4)) -> Self {
        (<T1 as ZeroFrom<C1>>::zero_from(&other.0),
            <T2 as ZeroFrom<C2>>::zero_from(&other.1),
            <T3 as ZeroFrom<C3>>::zero_from(&other.2),
            <T4 as ZeroFrom<C4>>::zero_from(&other.3))
    }
}tuple_zf_impl!((C1, T1, 0), (C2, T2, 1), (C3, T3, 2), (C4, T4, 3));
89impl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3,
    T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5,
    T5: ZeroFrom<'zf, C5>> ZeroFrom<'zf, (C1, C2, C3, C4, C5)> for
    (T1, T2, T3, T4, T5) {
    fn zero_from(other: &'zf (C1, C2, C3, C4, C5)) -> Self {
        (<T1 as ZeroFrom<C1>>::zero_from(&other.0),
            <T2 as ZeroFrom<C2>>::zero_from(&other.1),
            <T3 as ZeroFrom<C3>>::zero_from(&other.2),
            <T4 as ZeroFrom<C4>>::zero_from(&other.3),
            <T5 as ZeroFrom<C5>>::zero_from(&other.4))
    }
}tuple_zf_impl!(
90    (C1, T1, 0),
91    (C2, T2, 1),
92    (C3, T3, 2),
93    (C4, T4, 3),
94    (C5, T5, 4)
95);
96impl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3,
    T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5,
    T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>>
    ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6)> for (T1, T2, T3, T4, T5, T6) {
    fn zero_from(other: &'zf (C1, C2, C3, C4, C5, C6)) -> Self {
        (<T1 as ZeroFrom<C1>>::zero_from(&other.0),
            <T2 as ZeroFrom<C2>>::zero_from(&other.1),
            <T3 as ZeroFrom<C3>>::zero_from(&other.2),
            <T4 as ZeroFrom<C4>>::zero_from(&other.3),
            <T5 as ZeroFrom<C5>>::zero_from(&other.4),
            <T6 as ZeroFrom<C6>>::zero_from(&other.5))
    }
}tuple_zf_impl!(
97    (C1, T1, 0),
98    (C2, T2, 1),
99    (C3, T3, 2),
100    (C4, T4, 3),
101    (C5, T5, 4),
102    (C6, T6, 5)
103);
104impl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3,
    T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5,
    T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>, C7,
    T7: ZeroFrom<'zf, C7>> ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6, C7)> for
    (T1, T2, T3, T4, T5, T6, T7) {
    fn zero_from(other: &'zf (C1, C2, C3, C4, C5, C6, C7)) -> Self {
        (<T1 as ZeroFrom<C1>>::zero_from(&other.0),
            <T2 as ZeroFrom<C2>>::zero_from(&other.1),
            <T3 as ZeroFrom<C3>>::zero_from(&other.2),
            <T4 as ZeroFrom<C4>>::zero_from(&other.3),
            <T5 as ZeroFrom<C5>>::zero_from(&other.4),
            <T6 as ZeroFrom<C6>>::zero_from(&other.5),
            <T7 as ZeroFrom<C7>>::zero_from(&other.6))
    }
}tuple_zf_impl!(
105    (C1, T1, 0),
106    (C2, T2, 1),
107    (C3, T3, 2),
108    (C4, T4, 3),
109    (C5, T5, 4),
110    (C6, T6, 5),
111    (C7, T7, 6)
112);
113impl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3,
    T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5,
    T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>, C7,
    T7: ZeroFrom<'zf, C7>, C8, T8: ZeroFrom<'zf, C8>>
    ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6, C7, C8)> for
    (T1, T2, T3, T4, T5, T6, T7, T8) {
    fn zero_from(other: &'zf (C1, C2, C3, C4, C5, C6, C7, C8)) -> Self {
        (<T1 as ZeroFrom<C1>>::zero_from(&other.0),
            <T2 as ZeroFrom<C2>>::zero_from(&other.1),
            <T3 as ZeroFrom<C3>>::zero_from(&other.2),
            <T4 as ZeroFrom<C4>>::zero_from(&other.3),
            <T5 as ZeroFrom<C5>>::zero_from(&other.4),
            <T6 as ZeroFrom<C6>>::zero_from(&other.5),
            <T7 as ZeroFrom<C7>>::zero_from(&other.6),
            <T8 as ZeroFrom<C8>>::zero_from(&other.7))
    }
}tuple_zf_impl!(
114    (C1, T1, 0),
115    (C2, T2, 1),
116    (C3, T3, 2),
117    (C4, T4, 3),
118    (C5, T5, 4),
119    (C6, T6, 5),
120    (C7, T7, 6),
121    (C8, T8, 7)
122);
123impl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3,
    T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5,
    T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>, C7,
    T7: ZeroFrom<'zf, C7>, C8, T8: ZeroFrom<'zf, C8>, C9,
    T9: ZeroFrom<'zf, C9>> ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6, C7, C8, C9)>
    for (T1, T2, T3, T4, T5, T6, T7, T8, T9) {
    fn zero_from(other: &'zf (C1, C2, C3, C4, C5, C6, C7, C8, C9)) -> Self {
        (<T1 as ZeroFrom<C1>>::zero_from(&other.0),
            <T2 as ZeroFrom<C2>>::zero_from(&other.1),
            <T3 as ZeroFrom<C3>>::zero_from(&other.2),
            <T4 as ZeroFrom<C4>>::zero_from(&other.3),
            <T5 as ZeroFrom<C5>>::zero_from(&other.4),
            <T6 as ZeroFrom<C6>>::zero_from(&other.5),
            <T7 as ZeroFrom<C7>>::zero_from(&other.6),
            <T8 as ZeroFrom<C8>>::zero_from(&other.7),
            <T9 as ZeroFrom<C9>>::zero_from(&other.8))
    }
}tuple_zf_impl!(
124    (C1, T1, 0),
125    (C2, T2, 1),
126    (C3, T3, 2),
127    (C4, T4, 3),
128    (C5, T5, 4),
129    (C6, T6, 5),
130    (C7, T7, 6),
131    (C8, T8, 7),
132    (C9, T9, 8)
133);
134impl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3,
    T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5,
    T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>, C7,
    T7: ZeroFrom<'zf, C7>, C8, T8: ZeroFrom<'zf, C8>, C9,
    T9: ZeroFrom<'zf, C9>, C10, T10: ZeroFrom<'zf, C10>>
    ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)> for
    (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) {
    fn zero_from(other: &'zf (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10))
        -> Self {
        (<T1 as ZeroFrom<C1>>::zero_from(&other.0),
            <T2 as ZeroFrom<C2>>::zero_from(&other.1),
            <T3 as ZeroFrom<C3>>::zero_from(&other.2),
            <T4 as ZeroFrom<C4>>::zero_from(&other.3),
            <T5 as ZeroFrom<C5>>::zero_from(&other.4),
            <T6 as ZeroFrom<C6>>::zero_from(&other.5),
            <T7 as ZeroFrom<C7>>::zero_from(&other.6),
            <T8 as ZeroFrom<C8>>::zero_from(&other.7),
            <T9 as ZeroFrom<C9>>::zero_from(&other.8),
            <T10 as ZeroFrom<C10>>::zero_from(&other.9))
    }
}tuple_zf_impl!(
135    (C1, T1, 0),
136    (C2, T2, 1),
137    (C3, T3, 2),
138    (C4, T4, 3),
139    (C5, T5, 4),
140    (C6, T6, 5),
141    (C7, T7, 6),
142    (C8, T8, 7),
143    (C9, T9, 8),
144    (C10, T10, 9)
145);