1use crate::sealed::Internal;
2
3#[doc(hidden)]
4pub trait OutputSize<A> {
5 type Output;
6
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 fn __internal(_: Internal) {}
19 }
20 };
21}
22
23impl_output_size!(());
24impl_output_size!((A0,));
25impl_output_size!((A0, A1,));
26impl_output_size!((A0, A1, A2,));
27impl_output_size!((A0, A1, A2, A3,));
28impl_output_size!((A0, A1, A2, A3, A4,));
29impl_output_size!((A0, A1, A2, A3, A4, A5,));
30impl_output_size!((A0, A1, A2, A3, A4, A5, A6,));
31impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7,));
32impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8,));
33impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8, A9,));
34impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10,));
35impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11,));
36
37#[inline]
38#[must_use]
39pub const fn output_size<F, A>(_: &F) -> usize
40where
41 F: OutputSize<A>,
42{
43 core::mem::size_of::<F::Output>()
44}