1use rkyv::{
2 rancor::Fallible,
3 tuple::ArchivedTuple3,
4 with::{ArchiveWith, DeserializeWith, SerializeWith},
5 Place,
6};
7
8use crate::with::AsCacheable;
9
10pub struct AsTuple3<A = AsCacheable, B = AsCacheable, C = AsCacheable> {
11 _target: (A, B, C),
12}
13
14impl<A, B, C, K, V, H> ArchiveWith<(K, V, H)> for AsTuple3<A, B, C>
15where
16 A: ArchiveWith<K>,
17 B: ArchiveWith<V>,
18 C: ArchiveWith<H>,
19{
20 type Archived = ArchivedTuple3<A::Archived, B::Archived, C::Archived>;
21 type Resolver = ArchivedTuple3<A::Resolver, B::Resolver, C::Resolver>;
22
23 #[inline]
24 fn resolve_with(field: &(K, V, H), resolver: Self::Resolver, out: Place<Self::Archived>) {
25 let field_ptr = unsafe { &raw mut (*out.ptr()).0 };
26 let field_out = unsafe { Place::from_field_unchecked(out, field_ptr) };
27 A::resolve_with(&field.0, resolver.0, field_out);
28 let field_ptr = unsafe { &raw mut (*out.ptr()).1 };
29 let field_out = unsafe { Place::from_field_unchecked(out, field_ptr) };
30 B::resolve_with(&field.1, resolver.1, field_out);
31 let field_ptr = unsafe { &raw mut (*out.ptr()).2 };
32 let field_out = unsafe { Place::from_field_unchecked(out, field_ptr) };
33 C::resolve_with(&field.2, resolver.2, field_out);
34 }
35}
36
37impl<A, B, C, K, V, H, S> SerializeWith<(K, V, H), S> for AsTuple3<A, B, C>
38where
39 A: SerializeWith<K, S>,
40 B: SerializeWith<V, S>,
41 C: SerializeWith<H, S>,
42 S: Fallible + ?Sized,
43{
44 #[inline]
45 fn serialize_with(field: &(K, V, H), serializer: &mut S) -> Result<Self::Resolver, S::Error> {
46 Ok(ArchivedTuple3(
47 A::serialize_with(&field.0, serializer)?,
48 B::serialize_with(&field.1, serializer)?,
49 C::serialize_with(&field.2, serializer)?,
50 ))
51 }
52}
53
54impl<A, B, C, K, V, H, D>
55 DeserializeWith<ArchivedTuple3<A::Archived, B::Archived, C::Archived>, (K, V, H), D>
56 for AsTuple3<A, B, C>
57where
58 A: ArchiveWith<K> + DeserializeWith<A::Archived, K, D>,
59 B: ArchiveWith<V> + DeserializeWith<B::Archived, V, D>,
60 C: ArchiveWith<H> + DeserializeWith<C::Archived, H, D>,
61 D: Fallible + ?Sized,
62{
63 fn deserialize_with(
64 field: &ArchivedTuple3<A::Archived, B::Archived, C::Archived>,
65 deserializer: &mut D,
66 ) -> Result<(K, V, H), D::Error> {
67 Ok((
68 A::deserialize_with(&field.0, deserializer)?,
69 B::deserialize_with(&field.1, deserializer)?,
70 C::deserialize_with(&field.2, deserializer)?,
71 ))
72 }
73}