1use crate::array::{
2 self, Array, ArraySize,
3 typenum::{Diff, Prod, Sum, U1, U2, U4, U8, U16, Unsigned},
4};
5use core::{convert::TryInto, default::Default, fmt};
6
7pub type SerializedState<T> = Array<u8, <T as SerializableState>::SerializedStateSize>;
9
10pub type AddSerializedStateSize<T, S> = Sum<T, <S as SerializableState>::SerializedStateSize>;
12
13pub type SubSerializedStateSize<T, S> = Diff<T, <S as SerializableState>::SerializedStateSize>;
15
16#[derive(Copy, Clone, Eq, PartialEq, Debug)]
18pub struct DeserializeStateError;
19
20impl fmt::Display for DeserializeStateError {
21 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
22 f.write_str("Deserialization error")
23 }
24}
25
26impl core::error::Error for DeserializeStateError {}
27
28pub trait SerializableState
44where
45 Self: Sized,
46{
47 type SerializedStateSize: ArraySize;
49
50 fn serialize(&self) -> SerializedState<Self>;
52 fn deserialize(serialized_state: &SerializedState<Self>)
54 -> Result<Self, DeserializeStateError>;
55}
56
57macro_rules! impl_seializable_state_unsigned {
58 ($type: ty, $type_size: ty) => {
59 impl SerializableState for $type {
60 type SerializedStateSize = $type_size;
61
62 fn serialize(&self) -> SerializedState<Self> {
63 self.to_le_bytes().into()
64 }
65
66 fn deserialize(
67 serialized_state: &SerializedState<Self>,
68 ) -> Result<Self, DeserializeStateError> {
69 Ok(<$type>::from_le_bytes((*serialized_state).into()))
70 }
71 }
72 };
73}
74
75impl_seializable_state_unsigned!(u8, U1);
76impl_seializable_state_unsigned!(u16, U2);
77impl_seializable_state_unsigned!(u32, U4);
78impl_seializable_state_unsigned!(u64, U8);
79impl_seializable_state_unsigned!(u128, U16);
80
81macro_rules! impl_serializable_state_u8_array {
82 ($($n: ty),*) => {
83 $(
84 impl SerializableState for [u8; <$n>::USIZE] {
85 type SerializedStateSize = $n;
86
87 fn serialize(&self) -> SerializedState<Self> {
88 (*self).into()
89 }
90
91 fn deserialize(
92 serialized_state: &SerializedState<Self>,
93 ) -> Result<Self, DeserializeStateError> {
94 Ok((*serialized_state).into())
95 }
96 }
97 )*
98 };
99}
100
101macro_rules! impl_serializable_state_type_array {
102 ($type: ty, $type_size: ty, $n: ty) => {
103 impl SerializableState for [$type; <$n>::USIZE] {
104 type SerializedStateSize = Prod<$n, $type_size>;
105
106 fn serialize(&self) -> SerializedState<Self> {
107 let mut serialized_state = SerializedState::<Self>::default();
108 for (val, chunk) in self
109 .iter()
110 .zip(serialized_state.chunks_exact_mut(<$type_size>::USIZE))
111 {
112 chunk.copy_from_slice(&val.to_le_bytes());
113 }
114
115 serialized_state
116 }
117
118 fn deserialize(
119 serialized_state: &SerializedState<Self>,
120 ) -> Result<Self, DeserializeStateError> {
121 let mut array = [0; <$n>::USIZE];
122 for (val, chunk) in array
123 .iter_mut()
124 .zip(serialized_state.chunks_exact(<$type_size>::USIZE))
125 {
126 *val = <$type>::from_le_bytes(chunk.try_into().unwrap());
127 }
128 Ok(array)
129 }
130 }
131 };
132}
133
134macro_rules! impl_serializable_state_u16_array {
135 ($($n: ty),*) => {
136 $(
137 impl_serializable_state_type_array!(u16, U2, $n);
138 )*
139 };
140}
141
142macro_rules! impl_serializable_state_u32_array {
143 ($($n: ty),*) => {
144 $(
145 impl_serializable_state_type_array!(u32, U4, $n);
146 )*
147 };
148}
149
150macro_rules! impl_serializable_state_u64_array {
151 ($($n: ty),*) => {
152 $(
153 impl_serializable_state_type_array!(u64, U8, $n);
154 )*
155 };
156}
157
158macro_rules! impl_serializable_state_u128_array {
159 ($($n: ty),*) => {
160 $(
161 impl_serializable_state_type_array!(u128, U8, $n);
162 )*
163 };
164}
165
166impl_serializable_state_u8_array! {
167 array::typenum::U1,
168 array::typenum::U2,
169 array::typenum::U3,
170 array::typenum::U4,
171 array::typenum::U5,
172 array::typenum::U6,
173 array::typenum::U7,
174 array::typenum::U8,
175 array::typenum::U9,
176 array::typenum::U10,
177 array::typenum::U11,
178 array::typenum::U12,
179 array::typenum::U13,
180 array::typenum::U14,
181 array::typenum::U15,
182 array::typenum::U16,
183 array::typenum::U17,
184 array::typenum::U18,
185 array::typenum::U19,
186 array::typenum::U20,
187 array::typenum::U21,
188 array::typenum::U22,
189 array::typenum::U23,
190 array::typenum::U24,
191 array::typenum::U25,
192 array::typenum::U26,
193 array::typenum::U27,
194 array::typenum::U28,
195 array::typenum::U29,
196 array::typenum::U30,
197 array::typenum::U31,
198 array::typenum::U32,
199 array::typenum::U33,
200 array::typenum::U34,
201 array::typenum::U35,
202 array::typenum::U36,
203 array::typenum::U37,
204 array::typenum::U38,
205 array::typenum::U39,
206 array::typenum::U40,
207 array::typenum::U41,
208 array::typenum::U42,
209 array::typenum::U43,
210 array::typenum::U44,
211 array::typenum::U45,
212 array::typenum::U46,
213 array::typenum::U47,
214 array::typenum::U48,
215 array::typenum::U49,
216 array::typenum::U50,
217 array::typenum::U51,
218 array::typenum::U52,
219 array::typenum::U53,
220 array::typenum::U54,
221 array::typenum::U55,
222 array::typenum::U56,
223 array::typenum::U57,
224 array::typenum::U58,
225 array::typenum::U59,
226 array::typenum::U60,
227 array::typenum::U61,
228 array::typenum::U62,
229 array::typenum::U63,
230 array::typenum::U64,
231 array::typenum::U96,
232 array::typenum::U128,
233 array::typenum::U192,
234 array::typenum::U256,
235 array::typenum::U384,
236 array::typenum::U448,
237 array::typenum::U512,
238 array::typenum::U768,
239 array::typenum::U896,
240 array::typenum::U1024,
241 array::typenum::U2048,
242 array::typenum::U4096,
243 array::typenum::U8192
244}
245
246impl_serializable_state_u16_array! {
247 array::typenum::U1,
248 array::typenum::U2,
249 array::typenum::U3,
250 array::typenum::U4,
251 array::typenum::U5,
252 array::typenum::U6,
253 array::typenum::U7,
254 array::typenum::U8,
255 array::typenum::U9,
256 array::typenum::U10,
257 array::typenum::U11,
258 array::typenum::U12,
259 array::typenum::U13,
260 array::typenum::U14,
261 array::typenum::U15,
262 array::typenum::U16,
263 array::typenum::U17,
264 array::typenum::U18,
265 array::typenum::U19,
266 array::typenum::U20,
267 array::typenum::U21,
268 array::typenum::U22,
269 array::typenum::U23,
270 array::typenum::U24,
271 array::typenum::U25,
272 array::typenum::U26,
273 array::typenum::U27,
274 array::typenum::U28,
275 array::typenum::U29,
276 array::typenum::U30,
277 array::typenum::U31,
278 array::typenum::U32,
279 array::typenum::U48,
280 array::typenum::U96,
281 array::typenum::U128,
282 array::typenum::U192,
283 array::typenum::U256,
284 array::typenum::U384,
285 array::typenum::U448,
286 array::typenum::U512,
287 array::typenum::U2048,
288 array::typenum::U4096
289}
290
291impl_serializable_state_u32_array! {
292 array::typenum::U1,
293 array::typenum::U2,
294 array::typenum::U3,
295 array::typenum::U4,
296 array::typenum::U5,
297 array::typenum::U6,
298 array::typenum::U7,
299 array::typenum::U8,
300 array::typenum::U9,
301 array::typenum::U10,
302 array::typenum::U11,
303 array::typenum::U12,
304 array::typenum::U13,
305 array::typenum::U14,
306 array::typenum::U15,
307 array::typenum::U16,
308 array::typenum::U24,
309 array::typenum::U32,
310 array::typenum::U48,
311 array::typenum::U64,
312 array::typenum::U96,
313 array::typenum::U128,
314 array::typenum::U192,
315 array::typenum::U256,
316 array::typenum::U512,
317 array::typenum::U1024,
318 array::typenum::U2048
319}
320
321impl_serializable_state_u64_array! {
322 array::typenum::U1,
323 array::typenum::U2,
324 array::typenum::U3,
325 array::typenum::U4,
326 array::typenum::U5,
327 array::typenum::U6,
328 array::typenum::U7,
329 array::typenum::U8,
330 array::typenum::U12,
331 array::typenum::U16,
332 array::typenum::U24,
333 array::typenum::U32,
334 array::typenum::U48,
335 array::typenum::U64,
336 array::typenum::U96,
337 array::typenum::U128,
338 array::typenum::U256,
339 array::typenum::U512,
340 array::typenum::U1024
341}
342
343impl_serializable_state_u128_array! {
344 array::typenum::U1,
345 array::typenum::U2,
346 array::typenum::U3,
347 array::typenum::U4,
348 array::typenum::U6,
349 array::typenum::U8,
350 array::typenum::U12,
351 array::typenum::U16,
352 array::typenum::U24,
353 array::typenum::U32,
354 array::typenum::U48,
355 array::typenum::U64,
356 array::typenum::U128,
357 array::typenum::U256,
358 array::typenum::U512
359}