1use crate::sealed::Internal;
2
3pub trait OutputSize<A> {
4 type Output;
5
6 #[doc(hidden)]
7 fn __internal(_: Internal) {}
8}
9
10macro_rules! impl_output_size {
11 (($($ty:tt,)*)) => {
12 impl<$($ty,)* F, O> OutputSize<($($ty,)*)> for F
13 where
14 F: FnOnce($($ty,)*) -> O ,
15 {
16 type Output = O;
17 }
18 };
19}
20
21impl_output_size!(());
22impl_output_size!((A0,));
23impl_output_size!((A0, A1,));
24impl_output_size!((A0, A1, A2,));
25impl_output_size!((A0, A1, A2, A3,));
26impl_output_size!((A0, A1, A2, A3, A4,));
27impl_output_size!((A0, A1, A2, A3, A4, A5,));
28impl_output_size!((A0, A1, A2, A3, A4, A5, A6,));
29impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7,));
30impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8,));
31impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8, A9,));
32impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10,));
33impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11,));
34
35#[inline]
36#[must_use]
37pub const fn output_size<F, A>(_: &F) -> usize
38where
39 F: OutputSize<A>,
40{
41 core::mem::size_of::<F::Output>()
42}