naia_serde/impls/
array.rs1use 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#[cfg(test)]
64mod tests {
65 use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
66
67 #[test]
68 fn read_write() {
69 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 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}