naia_serde/impls/
array.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 &[T] {
9    fn ser(&self, writer: &mut dyn BitWrite) {
10        for item in *self {
11            item.ser(writer);
12        }
13    }
14
15    fn de(_: &mut BitReader) -> Result<Self, SerdeErr> {
16        Err(SerdeErr {})
17    }
18
19    fn bit_length(&self) -> u32 {
20        let mut output = 0;
21        for item in *self {
22            output += item.bit_length();
23        }
24        output
25    }
26}
27
28impl<T: Serde, const N: usize> Serde for [T; N] {
29    fn ser(&self, writer: &mut dyn BitWrite) {
30        for item in self {
31            item.ser(writer);
32        }
33    }
34
35    fn de(reader: &mut BitReader) -> Result<Self, SerdeErr> {
36        unsafe {
37            let mut to = std::mem::MaybeUninit::<[T; N]>::uninit();
38            let top: *mut T = &mut to as *mut std::mem::MaybeUninit<[T; N]> as *mut T;
39            for c in 0..N {
40                top.add(c).write(Serde::de(reader)?);
41            }
42            Ok(to.assume_init())
43        }
44    }
45
46    fn bit_length(&self) -> u32 {
47        let mut output = 0;
48        for item in self {
49            output += item.bit_length();
50        }
51        output
52    }
53}
54
55impl<T: ConstBitLength, const N: usize> ConstBitLength for [T; N] {
56    fn const_bit_length() -> u32 {
57        return T::const_bit_length() * (N as u32);
58    }
59}
60
61// Tests
62
63#[cfg(test)]
64mod tests {
65    use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
66
67    #[test]
68    fn read_write() {
69        // Write
70        let mut writer = BitWriter::new();
71
72        let in_1: [i32; 4] = [5, 11, 52, 8];
73        let in_2: [bool; 3] = [true, false, true];
74
75        in_1.ser(&mut writer);
76        in_2.ser(&mut writer);
77
78        let buffer = writer.to_bytes();
79
80        //Read
81        let mut reader = BitReader::new(&buffer);
82
83        let out_1: [i32; 4] = Serde::de(&mut reader).unwrap();
84        let out_2: [bool; 3] = Serde::de(&mut reader).unwrap();
85
86        assert_eq!(in_1, out_1);
87        assert_eq!(in_2, out_2);
88    }
89}