stdx/
mem.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use crate::sealed::Internal;

#[doc(hidden)]
pub trait OutputSize<A> {
    type Output;

    fn __internal(_: Internal);
}

macro_rules! impl_output_size {
    (($($ty:tt,)*)) => {
        impl<$($ty,)* F, O> OutputSize<($($ty,)*)> for F
        where
            F: FnOnce($($ty,)*) -> O ,
        {
            type Output = O;

            fn __internal(_: Internal) {}
        }
    };
}

impl_output_size!(());
impl_output_size!((A0,));
impl_output_size!((A0, A1,));
impl_output_size!((A0, A1, A2,));
impl_output_size!((A0, A1, A2, A3,));
impl_output_size!((A0, A1, A2, A3, A4,));
impl_output_size!((A0, A1, A2, A3, A4, A5,));
impl_output_size!((A0, A1, A2, A3, A4, A5, A6,));
impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7,));
impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8,));
impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8, A9,));
impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10,));
impl_output_size!((A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11,));

#[inline]
#[must_use]
pub const fn output_size<F, A>(_: &F) -> usize
where
    F: OutputSize<A>,
{
    core::mem::size_of::<F::Output>()
}