tl_proto/
tuple.rs

1use crate::traits::*;
2
3/// Implements `TlRead` and `TlWrite` for tuples
4macro_rules! impl_traits_for_tuple {
5    ($($num:tt $ty:ident),*) => {
6        impl<'a, $($ty),*> TlRead<'a> for ($($ty),*,)
7        where
8            $($ty: TlRead<'a>),*
9        {
10            type Repr = Bare;
11
12            #[inline(always)]
13            fn read_from(packet: &mut &'a [u8]) -> TlResult<Self> {
14                Ok(($(ok!($ty::read_from(packet))),*,))
15            }
16        }
17
18        impl<$($ty),*> TlWrite for ($($ty),*,)
19        where
20            $($ty: TlWrite),*
21        {
22            type Repr = Bare;
23
24            #[inline(always)]
25            fn max_size_hint(&self) -> usize {
26                let mut result = 0;
27                $(result += self.$num.max_size_hint());*;
28                result
29            }
30
31            #[inline(always)]
32            fn write_to<P>(&self, packet: &mut P)
33            where
34                P: TlPacket,
35            {
36                $(self.$num.write_to(packet));*;
37            }
38        }
39    };
40}
41
42impl_traits_for_tuple!(0 T0);
43impl_traits_for_tuple!(0 T0, 1 T1);
44impl_traits_for_tuple!(0 T0, 1 T1, 2 T2);
45impl_traits_for_tuple!(0 T0, 1 T1, 2 T2, 3 T3);
46impl_traits_for_tuple!(0 T0, 1 T1, 2 T2, 3 T3, 4 T4);
47impl_traits_for_tuple!(0 T0, 1 T1, 2 T2, 3 T3, 4 T4, 5 T5);