rseip_core/codec/decode/
impls.rs1#![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);