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 () => {};
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 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 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,);