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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use crate::{bit_reader::BitReader, bit_writer::BitWrite, error::SerdeErr, serde::Serde};
macro_rules! impl_reflect_tuple {
{$($index:tt : $name:tt),*} => {
impl<$($name : Serde,)*> Serde for ($($name,)*) {
fn ser(&self, writer: &mut dyn BitWrite) {
$(self.$index.ser(writer);)*
}
fn de(reader: &mut BitReader) -> Result<($($name,)*), SerdeErr> {
Ok(($($name::de(reader)?, )*))
}
fn bit_length(&self) -> u32 {
let mut output = 0;
$(output += self.$index.bit_length();)*
output
}
}
}
}
impl_reflect_tuple! {0: A}
impl_reflect_tuple! {0: A, 1: B}
impl_reflect_tuple! {0: A, 1: B, 2: C}
impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D}
impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E}
impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F}
impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G}
impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G, 7: H}
impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G, 7: H, 8: I}
impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G, 7: H, 8: I, 9: J}
impl_reflect_tuple! {0: A, 1: B, 2: C, 3: D, 4: E, 5: F, 6: G, 7: H, 8: I, 9: J, 10: K}
impl_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}
#[cfg(test)]
mod tests {
use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
#[test]
fn read_write() {
let mut writer = BitWriter::new();
let in_1 = (true, -7532, "Hello tuple!".to_string(), Some(5));
#[allow(unused_parens)]
let in_2 = (5);
let in_3 = (true, false, true, None, 4815, "Tuples tuples..".to_string());
let in_4 = (332, "Goodbye tuple...".to_string());
in_1.ser(&mut writer);
in_2.ser(&mut writer);
in_3.ser(&mut writer);
in_4.ser(&mut writer);
let buffer = writer.to_bytes();
let mut reader = BitReader::new(&buffer);
let out_1 = Serde::de(&mut reader).unwrap();
let out_2 = Serde::de(&mut reader).unwrap();
let out_3: (bool, bool, bool, Option<String>, u16, String) =
Serde::de(&mut reader).unwrap();
let out_4 = Serde::de(&mut reader).unwrap();
assert_eq!(in_1, out_1);
assert_eq!(in_2, out_2);
assert_eq!(in_3, out_3);
assert_eq!(in_4, out_4);
}
}