1use crate::{bit_reader::BitReader, bit_writer::BitWrite, error::SerdeErr, serde::Serde};
2macro_rules! impl_reflect_tuple {
3 {$($index:tt : $name:tt),*} => {
4 impl<$($name : Serde,)*> Serde for ($($name,)*) {
5 fn ser(&self, writer: &mut dyn BitWrite) {
6 $(self.$index.ser(writer);)*
7 }
8 fn de(reader: &mut BitReader) -> Result<($($name,)*), SerdeErr> {
9 Ok(($($name::de(reader)?, )*))
10 }
11 fn bit_length(&self) -> u32 {
12 let mut output = 0;
13 $(output += self.$index.bit_length();)*
14 output
15 }
16 }
17 }
18}
19
20impl_reflect_tuple! {0: A}
21impl_reflect_tuple! {0: A, 1: B}
22impl_reflect_tuple! {0: A, 1: B, 2: C}
23impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D}
24impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E}
25impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F}
26impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G}
27impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G, 7: H}
28impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G, 7: H, 8: I}
29impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G, 7: H, 8: I, 9: J}
30impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G, 7: H, 8: I, 9: J, 10: K}
31impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G, 7: H, 8: I, 9: J, 10: K, 11: L}
32
33#[cfg(test)]
36mod tests {
37 use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
38
39 #[test]
40 fn read_write() {
41 let mut writer = BitWriter::new();
43
44 let in_1 = (true, -7532, "Hello tuple!".to_string(), Some(5));
45 #[allow(unused_parens)]
46 let in_2 = (5);
47 let in_3 = (true, false, true, None, 4815, "Tuples tuples..".to_string());
48 let in_4 = (332, "Goodbye tuple...".to_string());
49
50 in_1.ser(&mut writer);
51 in_2.ser(&mut writer);
52 in_3.ser(&mut writer);
53 in_4.ser(&mut writer);
54
55 let buffer = writer.to_bytes();
56
57 let mut reader = BitReader::new(&buffer);
59
60 let out_1 = Serde::de(&mut reader).unwrap();
61 let out_2 = Serde::de(&mut reader).unwrap();
62 let out_3: (bool, bool, bool, Option<String>, u16, String) =
63 Serde::de(&mut reader).unwrap();
64 let out_4 = Serde::de(&mut reader).unwrap();
65
66 assert_eq!(in_1, out_1);
67 assert_eq!(in_2, out_2);
68 assert_eq!(in_3, out_3);
69 assert_eq!(in_4, out_4);
70 }
71}