1use crate::{Archive, Archived, Deserialize, Fallible, FixedIsize, FixedUsize, Serialize};
2#[cfg(has_atomics)]
3use core::sync::atomic::{
4 AtomicBool, AtomicI16, AtomicI32, AtomicI8, AtomicIsize, AtomicU16, AtomicU32, AtomicU8,
5 AtomicUsize, Ordering,
6};
7#[cfg(has_atomics_64)]
8use core::sync::atomic::{AtomicI64, AtomicU64};
9use core::{
10 marker::{PhantomData, PhantomPinned},
11 num::{
12 NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,
13 NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize,
14 },
15};
16
17macro_rules! impl_primitive {
18 (@serialize $type:ty) => {
19 impl<S: Fallible + ?Sized> Serialize<S> for $type {
20 #[inline]
21 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
22 Ok(())
23 }
24 }
25 };
26 ($type:ty) => {
27 impl Archive for $type {
28 type Archived = Self;
29 type Resolver = ();
30
31 #[inline]
32 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
33 out.write(*self);
34 }
35 }
36
37 impl_primitive!(@serialize $type);
38
39 impl<D: Fallible + ?Sized> Deserialize<$type, D> for Archived<$type> {
40 #[inline]
41 fn deserialize(&self, _: &mut D) -> Result<$type, D::Error> {
42 Ok(*self)
43 }
44 }
45 };
46 (@multibyte $type:ty) => {
47 const _: () = {
48 #[cfg(not(any(feature = "archive_le", feature = "archive_be")))]
49 type Archived = $type;
50 #[cfg(feature = "archive_le")]
51 type Archived = crate::rend::LittleEndian<$type>;
52 #[cfg(feature = "archive_be")]
53 type Archived = crate::rend::BigEndian<$type>;
54
55 impl Archive for $type {
56 type Archived = Archived;
57 type Resolver = ();
58
59 #[inline]
60 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
61 out.write(to_archived!(*self as Self));
62 }
63 }
64
65 impl_primitive!(@serialize $type);
66
67 impl<D: Fallible + ?Sized> Deserialize<$type, D> for Archived {
68 #[inline]
69 fn deserialize(&self, _: &mut D) -> Result<$type, D::Error> {
70 Ok(from_archived!(*self))
71 }
72 }
73 };
74 };
75}
76
77#[cfg(has_atomics)]
78macro_rules! impl_atomic {
79 (@serialize_deserialize $type:ty) => {
80 impl<S: Fallible + ?Sized> Serialize<S> for $type {
81 #[inline]
82 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
83 Ok(())
84 }
85 }
86 };
87 ($type:ty, $prim:ty) => {
88 impl Archive for $type {
89 type Archived = $prim;
90 type Resolver = ();
91
92 #[inline]
93 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
94 out.write(self.load(Ordering::Relaxed));
95 }
96 }
97
98 impl_atomic!(@serialize_deserialize $type);
99
100 impl<D: Fallible + ?Sized> Deserialize<$type, D> for Archived<$type> {
101 #[inline]
102 fn deserialize(&self, _: &mut D) -> Result<$type, D::Error> {
103 Ok((*self).into())
104 }
105 }
106 };
107 (@multibyte $type:ty, $prim:ty) => {
108 impl Archive for $type {
109 #[cfg(not(any(feature = "archive_le", feature = "archive_be")))]
110 type Archived = $prim;
111 #[cfg(feature = "archive_le")]
112 type Archived = crate::rend::LittleEndian<$prim>;
113 #[cfg(feature = "archive_be")]
114 type Archived = crate::rend::BigEndian<$prim>;
115
116 type Resolver = ();
117
118 #[inline]
119 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
120 out.write(to_archived!(self.load(Ordering::Relaxed)));
121 }
122 }
123
124 impl_atomic!(@serialize_deserialize $type);
125
126 impl<D: Fallible + ?Sized> Deserialize<$type, D> for Archived<$type> {
127 #[inline]
128 fn deserialize(&self, _: &mut D) -> Result<$type, D::Error> {
129 Ok(from_archived!(*self).into())
130 }
131 }
132 };
133}
134
135impl_primitive!(());
136impl_primitive!(bool);
137impl_primitive!(i8);
138impl_primitive!(u8);
139impl_primitive!(NonZeroI8);
140impl_primitive!(NonZeroU8);
141#[cfg(has_atomics)]
142impl_atomic!(AtomicBool, bool);
143#[cfg(has_atomics)]
144impl_atomic!(AtomicI8, i8);
145#[cfg(has_atomics)]
146impl_atomic!(AtomicU8, u8);
147
148impl_primitive!(@multibyte i16);
149impl_primitive!(@multibyte i32);
150impl_primitive!(@multibyte i64);
151impl_primitive!(@multibyte i128);
152impl_primitive!(@multibyte u16);
153impl_primitive!(@multibyte u32);
154impl_primitive!(@multibyte u64);
155impl_primitive!(@multibyte u128);
156
157impl_primitive!(@multibyte f32);
158impl_primitive!(@multibyte f64);
159
160impl_primitive!(@multibyte char);
161
162impl_primitive!(@multibyte NonZeroI16);
163impl_primitive!(@multibyte NonZeroI32);
164impl_primitive!(@multibyte NonZeroI64);
165impl_primitive!(@multibyte NonZeroI128);
166impl_primitive!(@multibyte NonZeroU16);
167impl_primitive!(@multibyte NonZeroU32);
168impl_primitive!(@multibyte NonZeroU64);
169impl_primitive!(@multibyte NonZeroU128);
170
171#[cfg(has_atomics)]
172impl_atomic!(@multibyte AtomicI16, i16);
173#[cfg(has_atomics)]
174impl_atomic!(@multibyte AtomicI32, i32);
175#[cfg(has_atomics_64)]
176impl_atomic!(@multibyte AtomicI64, i64);
177#[cfg(has_atomics)]
178impl_atomic!(@multibyte AtomicU16, u16);
179#[cfg(has_atomics)]
180impl_atomic!(@multibyte AtomicU32, u32);
181#[cfg(has_atomics_64)]
182impl_atomic!(@multibyte AtomicU64, u64);
183
184impl<T: ?Sized> Archive for PhantomData<T> {
187 type Archived = PhantomData<T>;
188 type Resolver = ();
189
190 #[inline]
191 unsafe fn resolve(&self, _: usize, _: Self::Resolver, _: *mut Self::Archived) {}
192}
193
194impl<T: ?Sized, S: Fallible + ?Sized> Serialize<S> for PhantomData<T> {
195 #[inline]
196 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
197 Ok(())
198 }
199}
200
201impl<T: ?Sized, D: Fallible + ?Sized> Deserialize<PhantomData<T>, D> for PhantomData<T> {
202 #[inline]
203 fn deserialize(&self, _: &mut D) -> Result<PhantomData<T>, D::Error> {
204 Ok(PhantomData)
205 }
206}
207
208impl Archive for PhantomPinned {
210 type Archived = PhantomPinned;
211 type Resolver = ();
212
213 #[inline]
214 unsafe fn resolve(&self, _: usize, _: Self::Resolver, _: *mut Self::Archived) {}
215}
216
217impl<S: Fallible + ?Sized> Serialize<S> for PhantomPinned {
218 #[inline]
219 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
220 Ok(())
221 }
222}
223
224impl<D: Fallible + ?Sized> Deserialize<PhantomPinned, D> for PhantomPinned {
225 #[inline]
226 fn deserialize(&self, _: &mut D) -> Result<PhantomPinned, D::Error> {
227 Ok(PhantomPinned)
228 }
229}
230
231impl Archive for usize {
234 type Archived = Archived<FixedUsize>;
235 type Resolver = ();
236
237 #[inline]
238 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
239 out.write(to_archived!(*self as FixedUsize));
240 }
241}
242
243impl<S: Fallible + ?Sized> Serialize<S> for usize {
244 #[inline]
245 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
246 Ok(())
247 }
248}
249
250impl<D: Fallible + ?Sized> Deserialize<usize, D> for Archived<usize> {
251 #[inline]
252 fn deserialize(&self, _: &mut D) -> Result<usize, D::Error> {
253 Ok(from_archived!(*self) as usize)
254 }
255}
256
257impl Archive for isize {
260 type Archived = Archived<FixedIsize>;
261 type Resolver = ();
262
263 #[inline]
264 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
265 out.write(to_archived!(*self as FixedIsize));
266 }
267}
268
269impl<S: Fallible + ?Sized> Serialize<S> for isize {
270 #[inline]
271 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
272 Ok(())
273 }
274}
275
276impl<D: Fallible + ?Sized> Deserialize<isize, D> for Archived<isize> {
277 #[inline]
278 fn deserialize(&self, _: &mut D) -> Result<isize, D::Error> {
279 Ok(from_archived!(*self) as isize)
280 }
281}
282
283type FixedNonZeroUsize = pick_size_type!(NonZeroU16, NonZeroU32, NonZeroU64);
286
287impl Archive for NonZeroUsize {
288 type Archived = Archived<FixedNonZeroUsize>;
289 type Resolver = ();
290
291 #[inline]
292 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
293 out.write(to_archived!(FixedNonZeroUsize::new_unchecked(
294 self.get() as FixedUsize
295 )));
296 }
297}
298
299impl<S: Fallible + ?Sized> Serialize<S> for NonZeroUsize {
300 #[inline]
301 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
302 Ok(())
303 }
304}
305
306impl<D: Fallible + ?Sized> Deserialize<NonZeroUsize, D> for Archived<NonZeroUsize> {
307 #[inline]
308 fn deserialize(&self, _: &mut D) -> Result<NonZeroUsize, D::Error> {
309 Ok(unsafe { NonZeroUsize::new_unchecked(from_archived!(*self).get() as usize) })
310 }
311}
312
313type FixedNonZeroIsize = pick_size_type!(NonZeroI16, NonZeroI32, NonZeroI64);
316
317impl Archive for NonZeroIsize {
318 type Archived = Archived<FixedNonZeroIsize>;
319 type Resolver = ();
320
321 #[inline]
322 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
323 out.write(to_archived!(FixedNonZeroIsize::new_unchecked(
324 self.get() as FixedIsize
325 )));
326 }
327}
328
329impl<S: Fallible + ?Sized> Serialize<S> for NonZeroIsize {
330 #[inline]
331 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
332 Ok(())
333 }
334}
335
336impl<D: Fallible + ?Sized> Deserialize<NonZeroIsize, D> for Archived<NonZeroIsize> {
337 #[inline]
338 fn deserialize(&self, _: &mut D) -> Result<NonZeroIsize, D::Error> {
339 Ok(unsafe { NonZeroIsize::new_unchecked(from_archived!(*self).get() as isize) })
340 }
341}
342
343#[cfg(has_atomics)]
346impl Archive for AtomicUsize {
347 type Archived = Archived<FixedUsize>;
348 type Resolver = ();
349
350 #[inline]
351 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
352 out.write(to_archived!(self.load(Ordering::Relaxed) as FixedUsize));
353 }
354}
355
356#[cfg(has_atomics)]
357impl<S: Fallible + ?Sized> Serialize<S> for AtomicUsize {
358 #[inline]
359 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
360 Ok(())
361 }
362}
363
364#[cfg(has_atomics)]
365impl<D: Fallible + ?Sized> Deserialize<AtomicUsize, D> for Archived<AtomicUsize> {
366 #[inline]
367 fn deserialize(&self, _: &mut D) -> Result<AtomicUsize, D::Error> {
368 Ok((from_archived!(*self) as usize).into())
369 }
370}
371
372#[cfg(has_atomics)]
375impl Archive for AtomicIsize {
376 type Archived = Archived<FixedIsize>;
377 type Resolver = ();
378
379 #[inline]
380 unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
381 out.write(to_archived!(self.load(Ordering::Relaxed) as FixedIsize));
382 }
383}
384
385#[cfg(has_atomics)]
386impl<S: Fallible + ?Sized> Serialize<S> for AtomicIsize {
387 #[inline]
388 fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
389 Ok(())
390 }
391}
392
393#[cfg(has_atomics)]
394impl<D: Fallible + ?Sized> Deserialize<AtomicIsize, D> for Archived<AtomicIsize> {
395 #[inline]
396 fn deserialize(&self, _: &mut D) -> Result<AtomicIsize, D::Error> {
397 Ok((from_archived!(*self) as isize).into())
398 }
399}