hooks_core/
hook_tuple.rs

1use super::*;
2
3#[derive(Default)]
4pub struct HookTuple<T>(pub T);
5
6crate::impl_hook![
7    impl<__> HookTuple<()> {
8        fn unmount() {}
9        fn poll_next_update(self) {
10            std::task::Poll::Ready(false)
11        }
12    }
13];
14
15macro_rules! impl_tuple {
16        // ignore zero length
17        () => {};
18        ($($v:ident ,)+) => {
19            impl_tuple! {
20                - $($v ,)+
21            }
22
23            impl<$($v : HookUnmount ,)+> HookUnmount for HookTuple<($($v,)+)> {
24                fn unmount(self: std::pin::Pin<&mut Self>) {
25                    #[allow(non_snake_case)]
26                    // SAFETY: pin projection
27                    let ($($v,)+) = unsafe {
28                        #[allow(non_snake_case)]
29                        let HookTuple(($($v,)+)) = self.get_unchecked_mut();
30                        ($(
31                            ::core::pin::Pin::new_unchecked($v)
32                        ,)+)
33                    };
34                    $(
35                        <$v as HookUnmount>::unmount($v);
36                    )+
37                }
38            }
39
40            impl<$($v : HookPollNextUpdate ,)+> HookPollNextUpdate for HookTuple<($($v,)+)> {
41                fn poll_next_update(
42                    self: std::pin::Pin<&mut Self>,
43                    cx: &mut std::task::Context<'_>,
44                ) -> std::task::Poll<bool> {
45                    #[allow(non_snake_case)]
46                    // SAFETY: pin projection
47                    let ($($v,)+) = unsafe {
48                        #[allow(non_snake_case)]
49                        let HookTuple(($($v,)+)) = self.get_unchecked_mut();
50                        ($(
51                            ::core::pin::Pin::new_unchecked($v)
52                        ,)+)
53                    };
54
55                    #[allow(non_snake_case)]
56                    #[allow(unused_variables)]
57                    match ($(
58                        $v.poll_next_update(cx)
59                    ,)+) {
60                        ($($v @ std::task::Poll::Ready(false),)+) => std::task::Poll::Ready(false),
61                        #[allow(unreachable_patterns)]
62                        ($($v @ (std::task::Poll::Ready(false) | std::task::Poll::Pending),)+) => std::task::Poll::Pending,
63                        _ => std::task::Poll::Ready(true),
64                    }
65                }
66            }
67        };
68        (
69            - $v0:ident,
70            $($v:ident ,)*
71        ) => {
72            impl_tuple! {
73                $($v ,)*
74            }
75        };
76    }
77
78impl_tuple!(T9, T8, T7, T6, T5, T4, T3, T2, T1, T0,);