| //! Internal macros |
| |
| macro_rules! opaque_future { |
| ($(#[$m:meta])* pub type $name:ident = $actual:ty;) => { |
| opaque_future! { |
| $(#[$m])* |
| pub type $name<> = $actual; |
| } |
| }; |
| |
| ($(#[$m:meta])* pub type $name:ident<$($param:ident),*> = $actual:ty;) => { |
| pin_project_lite::pin_project! { |
| $(#[$m])* |
| pub struct $name<$($param),*> { |
| #[pin] future: $actual, |
| } |
| } |
| |
| impl<$($param),*> $name<$($param),*> { |
| pub(crate) fn new(future: $actual) -> Self { |
| Self { future } |
| } |
| } |
| |
| impl<$($param),*> std::fmt::Debug for $name<$($param),*> { |
| fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| f.debug_struct(stringify!($name)).finish_non_exhaustive() |
| } |
| } |
| |
| impl<$($param),*> std::future::Future for $name<$($param),*> |
| where |
| $actual: std::future::Future, |
| { |
| type Output = <$actual as std::future::Future>::Output; |
| |
| #[inline] |
| fn poll( |
| self: std::pin::Pin<&mut Self>, |
| cx: &mut std::task::Context<'_>, |
| ) -> std::task::Poll<Self::Output> { |
| self.project().future.poll(cx) |
| } |
| } |
| }; |
| } |
| |
| #[rustfmt::skip] |
| macro_rules! all_the_tuples { |
| ($name:ident) => { |
| $name!([], T1); |
| $name!([T1], T2); |
| $name!([T1, T2], T3); |
| $name!([T1, T2, T3], T4); |
| $name!([T1, T2, T3, T4], T5); |
| $name!([T1, T2, T3, T4, T5], T6); |
| $name!([T1, T2, T3, T4, T5, T6], T7); |
| $name!([T1, T2, T3, T4, T5, T6, T7], T8); |
| $name!([T1, T2, T3, T4, T5, T6, T7, T8], T9); |
| $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9], T10); |
| $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10], T11); |
| $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11], T12); |
| $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12], T13); |
| $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13], T14); |
| $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14], T15); |
| $name!([T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15], T16); |
| }; |
| } |