naia_serde/impls/
tuple.rs

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// Tests
34
35#[cfg(test)]
36mod tests {
37    use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
38
39    #[test]
40    fn read_write() {
41        // Write
42        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        // Read
58        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}