1use crate::value_kind::*;
2use crate::*;
3
4macro_rules! categorize_tuple {
5 ($n:tt$( $idx:tt $name:ident)*) => {
6 impl<X: CustomValueKind$(, $name)*> Categorize<X> for ($($name,)*) {
7 #[inline]
8 fn value_kind() -> ValueKind<X> {
9 ValueKind::Tuple
10 }
11 }
12
13 impl<X: CustomValueKind$(, $name)*> SborTuple<X> for ($($name,)*) {
14 fn get_length(&self) -> usize {
15 $n
16 }
17 }
18 };
19}
20
21categorize_tuple! { 0 } categorize_tuple! { 1 0 A }
23categorize_tuple! { 2 0 A 1 B }
24categorize_tuple! { 3 0 A 1 B 2 C }
25categorize_tuple! { 4 0 A 1 B 2 C 3 D }
26categorize_tuple! { 5 0 A 1 B 2 C 3 D 4 E }
27categorize_tuple! { 6 0 A 1 B 2 C 3 D 4 E 5 F }
28categorize_tuple! { 7 0 A 1 B 2 C 3 D 4 E 5 F 6 G }
29categorize_tuple! { 8 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H }
30categorize_tuple! { 9 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I }
31categorize_tuple! { 10 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J }
32categorize_tuple! { 11 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K }
33categorize_tuple! { 12 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L }
34categorize_tuple! { 13 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M }
35categorize_tuple! { 14 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N }
36categorize_tuple! { 15 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O }
37categorize_tuple! { 16 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P }
38categorize_tuple! { 17 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q }
39categorize_tuple! { 18 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q 17 R }
40categorize_tuple! { 19 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q 17 R 18 S }
41categorize_tuple! { 20 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q 17 R 18 S 19 T }
42
43macro_rules! encode_tuple {
44 ($n:tt$( $idx:tt $name:ident)*) => {
45 impl<X: CustomValueKind, E: Encoder<X>$(, $name: Encode<X, E>)*> Encode<X, E> for ($($name,)*) {
46 #[inline]
47 fn encode_value_kind(&self, encoder: &mut E) -> Result<(), EncodeError> {
48 encoder.write_value_kind(Self::value_kind())
49 }
50
51 #[inline]
52 fn encode_body(&self, encoder: &mut E) -> Result<(), EncodeError> {
53 encoder.write_size($n)?;
54 $(encoder.encode(&self.$idx)?;)*
55 Ok(())
56 }
57 }
58 };
59}
60
61encode_tuple! { 0 } encode_tuple! { 1 0 T0 }
63encode_tuple! { 2 0 T0 1 T1 }
64encode_tuple! { 3 0 T0 1 T1 2 T2 }
65encode_tuple! { 4 0 T0 1 T1 2 T2 3 T3 }
66encode_tuple! { 5 0 T0 1 T1 2 T2 3 T3 4 T4 }
67encode_tuple! { 6 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 }
68encode_tuple! { 7 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 }
69encode_tuple! { 8 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 }
70encode_tuple! { 9 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 }
71encode_tuple! { 10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 }
72encode_tuple! { 11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 }
73encode_tuple! { 12 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 }
74encode_tuple! { 13 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 }
75encode_tuple! { 14 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 }
76encode_tuple! { 15 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 }
77encode_tuple! { 16 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 }
78encode_tuple! { 17 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 }
79encode_tuple! { 18 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 }
80encode_tuple! { 19 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 }
81encode_tuple! { 20 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 19 T19 }
82
83macro_rules! decode_tuple {
84 ($n:tt$( $idx:tt $name:ident)*) => {
85 impl<X: CustomValueKind, D: Decoder<X>$(, $name: Decode<X, D>)*> Decode<X, D> for ($($name,)*) {
86 #[inline]
87 fn decode_body_with_value_kind(decoder: &mut D, value_kind: ValueKind<X>) -> Result<Self, DecodeError> {
88 decoder.check_preloaded_value_kind(value_kind, Self::value_kind())?;
89 decoder.read_and_check_size($n)?;
90
91 Ok(($(decoder.decode::<$name>()?,)*))
92 }
93 }
94 };
95}
96
97decode_tuple! { 0 } decode_tuple! { 1 0 T0 }
99decode_tuple! { 2 0 T0 1 T1 }
100decode_tuple! { 3 0 T0 1 T1 2 T2 }
101decode_tuple! { 4 0 T0 1 T1 2 T2 3 T3 }
102decode_tuple! { 5 0 T0 1 T1 2 T2 3 T3 4 T4 }
103decode_tuple! { 6 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 }
104decode_tuple! { 7 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 }
105decode_tuple! { 8 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 }
106decode_tuple! { 9 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 }
107decode_tuple! { 10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 }
108decode_tuple! { 11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 }
109decode_tuple! { 12 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 }
110decode_tuple! { 13 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 }
111decode_tuple! { 14 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 }
112decode_tuple! { 15 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 }
113decode_tuple! { 16 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 }
114decode_tuple! { 17 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 }
115decode_tuple! { 18 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 }
116decode_tuple! { 19 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 }
117decode_tuple! { 20 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 19 T19 }
118
119mod schema {
120 use super::*;
121 macro_rules! describe_tuple {
122 ($n:tt$( $idx:tt $name:ident)*) => {
123 impl<C: CustomTypeKind<RustTypeId>$(, $name: Describe<C>)*> Describe<C> for ($($name,)*) {
124 const TYPE_ID: RustTypeId = RustTypeId::novel("Tuple", &[$($name::TYPE_ID),*]);
125
126 fn type_data() -> TypeData<C, RustTypeId> {
127 TypeData::unnamed(
128 TypeKind::Tuple {
129 field_types: crate::rust::vec![
130 $($name::TYPE_ID,)*
131 ]
132 }
133 )
134 }
135
136 #[allow(unused_variables)] fn add_all_dependencies(aggregator: &mut TypeAggregator<C>) {
138 $(aggregator.add_child_type_and_descendents::<$name>();)*
139 }
140 }
141 };
142 }
143
144 describe_basic_well_known_type!((), UNIT_TYPE, unit_type_data);
145 describe_tuple! { 1 0 T0 }
146 describe_tuple! { 2 0 T0 1 T1 }
147 describe_tuple! { 3 0 T0 1 T1 2 T2 }
148 describe_tuple! { 4 0 T0 1 T1 2 T2 3 T3 }
149 describe_tuple! { 5 0 T0 1 T1 2 T2 3 T3 4 T4 }
150 describe_tuple! { 6 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 }
151 describe_tuple! { 7 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 }
152 describe_tuple! { 8 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 }
153 describe_tuple! { 9 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 }
154 describe_tuple! { 10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 }
155 describe_tuple! { 11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 }
156 describe_tuple! { 12 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 }
157 describe_tuple! { 13 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 }
158 describe_tuple! { 14 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 }
159 describe_tuple! { 15 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 }
160 describe_tuple! { 16 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 }
161 describe_tuple! { 17 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 }
162 describe_tuple! { 18 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 }
163 describe_tuple! { 19 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 }
164 describe_tuple! { 20 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 19 T19 }
165}