rkyv_test/impls/core/
result.rs1use crate::{result::ArchivedResult, Archive, Deserialize, Fallible, Serialize};
2use core::{hint::unreachable_unchecked, ptr};
3
4#[allow(dead_code)]
5#[repr(u8)]
6enum ArchivedResultTag {
7 Ok,
8 Err,
9}
10
11#[repr(C)]
12struct ArchivedResultVariantOk<T>(ArchivedResultTag, T);
13
14#[repr(C)]
15struct ArchivedResultVariantErr<E>(ArchivedResultTag, E);
16
17impl<T: Archive, E: Archive> Archive for Result<T, E> {
18 type Archived = ArchivedResult<T::Archived, E::Archived>;
19 type Resolver = Result<T::Resolver, E::Resolver>;
20
21 #[inline]
22 unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) {
23 match resolver {
24 Ok(resolver) => {
25 let out = out.cast::<ArchivedResultVariantOk<T::Archived>>();
26 ptr::addr_of_mut!((*out).0).write(ArchivedResultTag::Ok);
27
28 let (fp, fo) = out_field!(out.1);
29 match self.as_ref() {
30 Ok(value) => value.resolve(pos + fp, resolver, fo),
31 Err(_) => unreachable_unchecked(),
32 }
33 }
34 Err(resolver) => {
35 let out = out.cast::<ArchivedResultVariantErr<E::Archived>>();
36 ptr::addr_of_mut!((*out).0).write(ArchivedResultTag::Err);
37
38 let (fp, fo) = out_field!(out.1);
39 match self.as_ref() {
40 Ok(_) => unreachable_unchecked(),
41 Err(err) => err.resolve(pos + fp, resolver, fo),
42 }
43 }
44 }
45 }
46}
47
48impl<T: Serialize<S>, E: Serialize<S>, S: Fallible + ?Sized> Serialize<S> for Result<T, E> {
49 #[inline]
50 fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
51 Ok(match self.as_ref() {
52 Ok(value) => Ok(value.serialize(serializer)?),
53 Err(value) => Err(value.serialize(serializer)?),
54 })
55 }
56}
57
58impl<T, E, D> Deserialize<Result<T, E>, D> for ArchivedResult<T::Archived, E::Archived>
59where
60 T: Archive,
61 E: Archive,
62 D: Fallible + ?Sized,
63 T::Archived: Deserialize<T, D>,
64 E::Archived: Deserialize<E, D>,
65{
66 #[inline]
67 fn deserialize(&self, deserializer: &mut D) -> Result<Result<T, E>, D::Error> {
68 match self {
69 ArchivedResult::Ok(value) => Ok(Ok(value.deserialize(deserializer)?)),
70 ArchivedResult::Err(err) => Ok(Err(err.deserialize(deserializer)?)),
71 }
72 }
73}