jppe/decode/
impls_array.rs

1use crate::std::MaybeUninit;
2
3
4impl<T, const N: usize> crate::ByteDecode for [T; N]
5where
6    T: crate::ByteDecode,
7{
8    fn decode<'da, 'db>(input: &'da [u8], cattr: Option<&'db crate::ContainerAttrModifiers>, fattr: Option<&'db crate::FieldAttrModifiers>) -> crate::JResult<&'da [u8], Self>
9    where 
10        Self: Sized
11    {
12        let mut array = MaybeUninit::<[T; N]>::uninit();
13        let mut input = input;
14        let mut value;
15
16        let ptr = unsafe { &mut *array.as_mut_ptr() };
17
18        for i in 0..N {
19            (input, value) = T::decode(input, cattr, fattr)?;
20            ptr[i] = value;
21        }
22
23        Ok((input, unsafe { array.assume_init() }))
24    }
25}
26
27
28impl<'de, T, const N: usize> crate::BorrowByteDecode<'de> for [T; N]
29where
30    T: crate::BorrowByteDecode<'de>,
31{
32    fn decode<'da: 'de, 'db>(input: &'da [u8], cattr: Option<&'db crate::ContainerAttrModifiers>, fattr: Option<&'db crate::FieldAttrModifiers>) -> crate::JResult<&'da [u8], Self>
33    where 
34        Self: Sized
35    {
36        let mut array = MaybeUninit::<[T; N]>::uninit();
37        let mut input = input;
38        let mut value;
39
40        let ptr = unsafe { &mut *array.as_mut_ptr() };
41
42        for i in 0..N {
43            (input, value) = T::decode(input, cattr, fattr)?;
44            ptr[i] = value;
45        }
46
47        Ok((input, unsafe { array.assume_init() }))
48    }
49}
50
51
52#[cfg(test)]
53mod tests {
54    use crate::decode::ByteDecode;
55
56    #[test]
57    fn test_decode_array() {
58        let (input, value) = <[u8;2]>::decode(&[0x01, 0x02, 0x03], None, None).unwrap();
59        assert_eq!(value, [0x01, 0x02]);
60        assert_eq!(input, [0x03]);
61
62        let (input, value) = <[u16;2]>::decode(&[0x00, 0x01, 0x00, 0x02, 0x03], None, None).unwrap();
63        assert_eq!(value, [0x01, 0x02]);
64        assert_eq!(input, [0x03]);
65    }
66}