Skip to main content

rkyv/
tuple.rs

1//! Archived versions of tuple types.
2
3use crate::Portable;
4
5macro_rules! impl_tuple {
6    ($name:ident $n:tt, $($t:ident $u:ident $index:tt),* $(,)?) => {
7        #[doc = concat!("An archived tuple with ", stringify!($n), " elements")]
8        #[derive(
9            Debug,
10            Default,
11            Eq,
12            Hash,
13            Ord,
14            PartialEq,
15            PartialOrd,
16            Portable,
17        )]
18        #[cfg_attr(feature = "bytecheck", derive(bytecheck::CheckBytes))]
19        #[rkyv(crate)]
20        #[repr(C)]
21        pub struct $name<$($t),*>($(pub $t),*);
22
23        impl<$($t,)* $($u),*> PartialEq<($($u,)*)> for $name<$($t),*>
24        where
25            $($t: PartialEq<$u>,)*
26        {
27            fn eq(&self, other: &($($u,)*)) -> bool {
28                $(self.$index == other.$index)&&*
29            }
30        }
31    };
32}
33
34impl_tuple!(ArchivedTuple1 1, T0 U0 0);
35impl_tuple!(ArchivedTuple2 2, T0 U0 0, T1 U1 1);
36impl_tuple!(ArchivedTuple3 3, T0 U0 0, T1 U1 1, T2 U2 2);
37impl_tuple!(ArchivedTuple4 4, T0 U0 0, T1 U1 1, T2 U2 2, T3 U3 3);
38impl_tuple!(ArchivedTuple5 5, T0 U0 0, T1 U1 1, T2 U2 2, T3 U3 3, T4 U4 4);
39impl_tuple!(
40    ArchivedTuple6 6, T0 U0 0, T1 U1 1, T2 U2 2, T3 U3 3, T4 U4 4, T5 U5 5
41);
42impl_tuple!(
43    ArchivedTuple7 7,
44    T0 U0 0,
45    T1 U1 1,
46    T2 U2 2,
47    T3 U3 3,
48    T4 U4 4,
49    T5 U5 5,
50    T6 U6 6,
51);
52impl_tuple!(
53    ArchivedTuple8 8,
54    T0 U0 0,
55    T1 U1 1,
56    T2 U2 2,
57    T3 U3 3,
58    T4 U4 4,
59    T5 U5 5,
60    T6 U6 6,
61    T7 U7 7,
62);
63impl_tuple!(
64    ArchivedTuple9 9,
65    T0 U0 0,
66    T1 U1 1,
67    T2 U2 2,
68    T3 U3 3,
69    T4 U4 4,
70    T5 U5 5,
71    T6 U6 6,
72    T7 U7 7,
73    T8 U8 8,
74);
75impl_tuple!(
76    ArchivedTuple10 10,
77    T0 U0 0,
78    T1 U1 1,
79    T2 U2 2,
80    T3 U3 3,
81    T4 U4 4,
82    T5 U5 5,
83    T6 U6 6,
84    T7 U7 7,
85    T8 U8 8,
86    T9 U9 9
87);
88impl_tuple!(
89    ArchivedTuple11 11,
90    T0 U0 0,
91    T1 U1 1,
92    T2 U2 2,
93    T3 U3 3,
94    T4 U4 4,
95    T5 U5 5,
96    T6 U6 6,
97    T7 U7 7,
98    T8 U8 8,
99    T9 U9 9,
100    T10 U10 10,
101);
102impl_tuple!(
103    ArchivedTuple12 12,
104    T0 U0 0,
105    T1 U1 1,
106    T2 U2 2,
107    T3 U3 3,
108    T4 U4 4,
109    T5 U5 5,
110    T6 U6 6,
111    T7 U7 7,
112    T8 U8 8,
113    T9 U9 9,
114    T10 U10 10,
115    T11 U11 11,
116);
117impl_tuple!(
118    ArchivedTuple13 13,
119    T0 U0 0,
120    T1 U1 1,
121    T2 U2 2,
122    T3 U3 3,
123    T4 U4 4,
124    T5 U5 5,
125    T6 U6 6,
126    T7 U7 7,
127    T8 U8 8,
128    T9 U9 9,
129    T10 U10 10,
130    T11 U11 11,
131    T12 U12 12,
132);
133
134#[cfg(test)]
135mod tests {
136    use crate::tuple::ArchivedTuple3;
137
138    #[test]
139    fn partial_eq() {
140        assert_eq!(ArchivedTuple3(1, 2, 3), (1, 2, 3));
141    }
142}