jppe/decode/
impls_array.rs1use 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}