rseip_core/codec/decode/
impls.rs

1// rseip
2//
3// rseip - Ethernet/IP (CIP) in pure Rust.
4// Copyright: 2021, Joylei <leingliu@gmail.com>
5// License: MIT
6
7#![allow(non_snake_case)]
8
9use smallvec::SmallVec;
10
11use super::*;
12use core::marker::PhantomData;
13use std::mem;
14
15impl<'de, T: Decoder<'de>> Decoder<'de> for &mut T {
16    type Error = T::Error;
17    type Buf = T::Buf;
18
19    #[inline]
20    fn buf(&self) -> &Self::Buf {
21        (**self).buf()
22    }
23
24    #[inline]
25    fn buf_mut(&mut self) -> &mut Self::Buf {
26        (**self).buf_mut()
27    }
28
29    #[inline]
30    fn decode_sized<V: Visitor<'de>>(
31        &mut self,
32        size: usize,
33        visitor: V,
34    ) -> Result<V::Value, Self::Error>
35    where
36        Self: Sized,
37    {
38        (**self).decode_sized(size, visitor)
39    }
40}
41
42macro_rules! impl_primitive {
43    ($ty:ty, $m:tt, $s:tt) => {
44        impl<'de> Decode<'de> for $ty {
45            #[inline]
46            fn decode<D>(mut decoder: D) -> Result<Self, D::Error>
47            where
48                D: Decoder<'de>,
49            {
50                decoder.ensure_size($s)?;
51                Ok(decoder.$m())
52            }
53        }
54    };
55}
56
57impl_primitive!(bool, decode_bool, 1);
58impl_primitive!(i8, decode_i8, 1);
59impl_primitive!(u8, decode_u8, 1);
60impl_primitive!(i16, decode_i16, 2);
61impl_primitive!(u16, decode_u16, 2);
62impl_primitive!(i32, decode_i32, 4);
63impl_primitive!(u32, decode_u32, 4);
64impl_primitive!(i64, decode_i64, 8);
65impl_primitive!(u64, decode_u64, 8);
66impl_primitive!(f32, decode_f32, 4);
67impl_primitive!(f64, decode_f64, 8);
68impl_primitive!(i128, decode_i128, 16);
69impl_primitive!(u128, decode_u128, 16);
70
71impl<'de> Decode<'de> for () {
72    #[inline]
73    fn decode<D>(_decoder: D) -> Result<Self, D::Error>
74    where
75        D: Decoder<'de>,
76    {
77        Ok(())
78    }
79}
80
81impl<'de, T> Decode<'de> for PhantomData<T>
82where
83    T: 'de,
84{
85    #[inline]
86    fn decode<D>(_decoder: D) -> Result<Self, D::Error>
87    where
88        D: Decoder<'de>,
89    {
90        Ok(Default::default())
91    }
92}
93
94impl<'de, T> Decode<'de> for Option<T>
95where
96    T: Decode<'de>,
97{
98    #[inline]
99    fn decode<D>(decoder: D) -> Result<Self, D::Error>
100    where
101        D: Decoder<'de>,
102    {
103        let v = T::decode(decoder)?;
104        Ok(Some(v))
105    }
106}
107
108impl<'de, T, const N: usize> Decode<'de> for [T; N]
109where
110    T: Decode<'de> + Default,
111{
112    #[inline]
113    fn decode<D>(mut decoder: D) -> Result<Self, D::Error>
114    where
115        D: Decoder<'de>,
116    {
117        let mut buffer = mem::MaybeUninit::<[T; N]>::uninit();
118        {
119            let buffer = unsafe { &mut *buffer.as_mut_ptr() };
120            for item in buffer.iter_mut() {
121                if decoder.has_remaining() {
122                    T::decode_in_place(&mut decoder, item)?;
123                } else {
124                    *item = Default::default();
125                }
126            }
127        }
128        Ok(unsafe { buffer.assume_init() })
129    }
130}
131
132impl<'de, T> Decode<'de> for Vec<T>
133where
134    T: Decode<'de>,
135{
136    #[inline]
137    fn decode<D>(mut decoder: D) -> Result<Self, D::Error>
138    where
139        D: Decoder<'de>,
140    {
141        let mut res = Vec::new();
142        while decoder.has_remaining() {
143            let v = T::decode(&mut decoder)?;
144            res.push(v);
145        }
146        Ok(res)
147    }
148}
149
150impl<'de, A> Decode<'de> for SmallVec<A>
151where
152    A: smallvec::Array,
153    A::Item: Decode<'de>,
154{
155    #[inline]
156    fn decode<D>(mut decoder: D) -> Result<Self, D::Error>
157    where
158        D: Decoder<'de>,
159    {
160        let mut res = Self::new();
161        while decoder.has_remaining() {
162            let v = A::Item::decode(&mut decoder)?;
163            res.push(v);
164        }
165        Ok(res)
166    }
167}
168
169macro_rules! impl_tuple {
170    ($($n:tt $name:ident)+) => {
171        impl<'de, $($name,)+> Decode<'de> for ($($name,)+)
172        where
173            $($name: Decode<'de>,)+
174        {
175            #[inline]
176            fn decode<D>(mut decoder: D) -> Result<Self, D::Error>
177            where
178                D: Decoder<'de>,
179            {
180                $(
181                    let $name = decoder.decode_any()?;
182                )+
183                Ok(($($name,)+))
184            }
185        }
186    }
187}
188
189impl_tuple!(0 T0);
190impl_tuple!(0 T0 1 T1);
191impl_tuple!(0 T0 1 T1 2 T2);
192impl_tuple!(0 T0 1 T1 2 T2 3 T3);
193impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4);
194impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5);
195impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6);
196impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7);
197impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8);
198impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9);
199impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10);
200impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11);
201impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12);
202impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13);
203impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14);
204impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15);