geng_ecs/
util.rs

1macro_rules! impl_tuples {
2    ($macro:ident) => {
3        $macro!();
4        $macro!(a0);
5        $macro!(a0, a1);
6        $macro!(a0, a1, a2);
7        $macro!(a0, a1, a2, a3);
8        $macro!(a0, a1, a2, a3, a4);
9        $macro!(a0, a1, a2, a3, a4, a5);
10        $macro!(a0, a1, a2, a3, a4, a5, a6);
11        $macro!(a0, a1, a2, a3, a4, a5, a6, a7);
12        $macro!(a0, a1, a2, a3, a4, a5, a6, a7, a8);
13        $macro!(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
14    };
15}
16
17pub trait ZipExt<T> {
18    type Output;
19    fn zip(self, rhs: T) -> Self::Output;
20}
21
22pub trait AsRefExt {
23    type Output;
24    #[allow(clippy::wrong_self_convention)]
25    fn as_ref(self) -> Self::Output;
26}
27
28macro_rules! impl_zip_for_tuple {
29    (($($a:ident),*), ($($b:ident),*)) => {
30        #[allow(non_camel_case_types)]
31        #[allow(unused_variables)]
32        #[allow(clippy::unused_unit)]
33        impl<$($a,)* $($b),*> ZipExt<($($b,)*)> for ($($a,)*) {
34            type Output = ($(($a, $b),)*);
35            fn zip(self, ($($b,)*): ($($b,)*)) -> Self::Output {
36                let ($($a,)*) = self;
37                ($(($a, $b),)*)
38            }
39        }
40    };
41}
42
43impl_zip_for_tuple!((), ());
44impl_zip_for_tuple!((a0), (b0));
45impl_zip_for_tuple!((a0, a1), (b0, b1));
46impl_zip_for_tuple!((a0, a1, a2), (b0, b1, b2));
47impl_zip_for_tuple!((a0, a1, a2, a3), (b0, b1, b2, b3));
48impl_zip_for_tuple!((a0, a1, a2, a3, a4), (b0, b1, b2, b3, b4));
49impl_zip_for_tuple!((a0, a1, a2, a3, a4, a5), (b0, b1, b2, b3, b4, b5));
50impl_zip_for_tuple!((a0, a1, a2, a3, a4, a5, a6), (b0, b1, b2, b3, b4, b5, b6));
51impl_zip_for_tuple!(
52    (a0, a1, a2, a3, a4, a5, a6, a7),
53    (b0, b1, b2, b3, b4, b5, b6, b7)
54);
55impl_zip_for_tuple!(
56    (a0, a1, a2, a3, a4, a5, a6, a7, a8),
57    (b0, b1, b2, b3, b4, b5, b6, b7, b8)
58);
59impl_zip_for_tuple!(
60    (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9),
61    (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9)
62);
63
64macro_rules! impl_asref_for_tuple {
65    ($($a:ident),*) => {
66        #[allow(non_camel_case_types)]
67        #[allow(unused_variables)]
68        #[allow(clippy::unused_unit)]
69        impl<'a, $($a),*> AsRefExt for &'a ($($a,)*) {
70            type Output = ($(&'a $a,)*);
71            fn as_ref(self) -> Self::Output {
72                let ($($a,)*) = self;
73                ($($a,)*)
74            }
75        }
76    };
77}
78
79impl_tuples!(impl_asref_for_tuple);
80
81pub(crate) use impl_tuples;