naia_serde/impls/
option.rs

1use crate::{
2    bit_reader::BitReader,
3    bit_writer::BitWrite,
4    error::SerdeErr,
5    serde::{ConstBitLength, Serde},
6};
7
8impl<T: Serde> Serde for Option<T> {
9    fn ser(&self, writer: &mut dyn BitWrite) {
10        if let Some(value) = self {
11            writer.write_bit(true);
12            value.ser(writer);
13        } else {
14            writer.write_bit(false);
15        }
16    }
17
18    fn de(reader: &mut BitReader) -> Result<Option<T>, SerdeErr> {
19        if reader.read_bit()? {
20            Ok(Some(T::de(reader)?))
21        } else {
22            Ok(None)
23        }
24    }
25
26    fn bit_length(&self) -> u32 {
27        let mut output = 1;
28        if let Some(value) = self {
29            output += value.bit_length();
30        }
31        output
32    }
33}
34
35impl<T: ConstBitLength> ConstBitLength for Option<T> {
36    fn const_bit_length() -> u32 {
37        return 1 + T::const_bit_length();
38    }
39}
40
41// Tests
42
43#[cfg(test)]
44mod tests {
45    use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
46
47    #[test]
48    fn read_write() {
49        // Write
50        let mut writer = BitWriter::new();
51
52        let in_1 = Some(123);
53        let in_2: Option<f32> = None;
54
55        in_1.ser(&mut writer);
56        in_2.ser(&mut writer);
57
58        let buffer = writer.to_bytes();
59
60        //Read
61        let mut reader = BitReader::new(&buffer);
62
63        let out_1 = Option::<u8>::de(&mut reader).unwrap();
64        let out_2 = Option::<f32>::de(&mut reader).unwrap();
65
66        assert_eq!(in_1, out_1);
67        assert_eq!(in_2, out_2);
68    }
69}