multiversx_sc_codec/multi_types/
multi_value_tuple.rs

1#![allow(deprecated)]
2
3use crate::{
4    DecodeErrorHandler, EncodeErrorHandler, MultiValueConstLength, MultiValueLength,
5    TopDecodeMulti, TopDecodeMultiInput, TopEncodeMulti, TopEncodeMultiOutput,
6};
7
8macro_rules! multi_value_impls_debug {
9        ($(($mv_struct:ident $len:tt $($n:tt $name:ident)+) )+) => {
10        $(
11            #[derive(Clone, Debug, PartialEq)]
12            pub struct $mv_struct<$($name,)+>(
13                #[deprecated(since = "0.57.0", note = "use .into_tuple() or .as_tuple() instead")]
14                pub ($($name,)+)
15            );
16        )+
17    }
18}
19macro_rules! multi_value_impls_no_debug {
20        ($(($mv_struct:ident $len:tt $($n:tt $name:ident)+) )+) => {
21        $(
22            #[derive(Clone)]
23            pub struct $mv_struct<$($name,)+>(
24                #[deprecated(since = "0.57.0", note = "use .into_tuple() or .as_tuple() instead")]
25                pub ($($name,)+)
26            );
27        )+
28    }
29}
30
31macro_rules! multi_value_impls {
32    ($(($mv_struct:ident $len:tt $($n:tt $name:ident)+) )+) => {
33        $(
34            impl<$($name),+> From<($($name,)+)> for $mv_struct<$($name,)+> {
35                #[inline]
36                fn from(tuple: ($($name,)+)) -> Self {
37                    $mv_struct(tuple)
38                }
39            }
40
41            impl<$($name,)+> $mv_struct<$($name,)+> {
42                #[inline]
43                pub fn into_tuple(self) -> ($($name,)+) {
44                    self.0
45                }
46
47                #[inline]
48                pub fn as_tuple(&self) -> &($($name,)+) {
49                    &self.0
50                }
51            }
52
53            impl<$($name),+ > TopEncodeMulti for $mv_struct<$($name,)+>
54            where
55                $($name: TopEncodeMulti,)+
56            {
57                fn multi_encode_or_handle_err<O, H>(&self, output: &mut O, h: H) -> Result<(), H::HandledErr>
58                where
59                    O: TopEncodeMultiOutput,
60                    H: EncodeErrorHandler,
61                {
62                    $(
63                        (self.0).$n.multi_encode_or_handle_err(output, h)?;
64                    )+
65                    Ok(())
66                }
67            }
68
69            impl<$($name),+ > MultiValueLength for $mv_struct<$($name,)+>
70            where
71                $($name: TopDecodeMulti + MultiValueLength,)+
72            {
73                fn multi_value_len(&self) -> usize {
74                    0
75                    $(
76                        + <$name as MultiValueLength>::multi_value_len(&self.0.$n)
77                    )+
78                }
79            }
80
81            impl<$($name),+ > MultiValueConstLength for $mv_struct<$($name,)+>
82            where
83                $($name: TopDecodeMulti + MultiValueConstLength,)+
84            {
85                const MULTI_VALUE_CONST_LEN: usize = 0
86                $(
87                    + <$name as MultiValueConstLength>::MULTI_VALUE_CONST_LEN
88                )+
89                ;
90            }
91
92            impl<$($name),+ > TopDecodeMulti for $mv_struct<$($name,)+>
93            where
94                $($name: TopDecodeMulti,)+
95            {
96                fn multi_decode_or_handle_err<I, H>(input: &mut I, h: H) -> Result<Self, H::HandledErr>
97                where
98                    I: TopDecodeMultiInput,
99                    H: DecodeErrorHandler,
100                {
101                    Ok($mv_struct((
102                        $(
103                            $name::multi_decode_or_handle_err(input, h)?
104                        ),+
105                    )))
106                }
107            }
108        )+
109    }
110}
111
112multi_value_impls_debug! {
113    (MultiValue2   2 0 T0 1 T1)
114    (MultiValue3   3 0 T0 1 T1 2 T2)
115    (MultiValue4   4 0 T0 1 T1 2 T2 3 T3)
116    (MultiValue5   5 0 T0 1 T1 2 T2 3 T3 4 T4)
117    (MultiValue6   6 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
118    (MultiValue7   7 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
119    (MultiValue8   8 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
120    (MultiValue9   9 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
121    (MultiValue10 10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
122    (MultiValue11 11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
123}
124// tuples with size 12+ don't implement Debug + PartialEq traits
125// https://doc.rust-lang.org/std/primitive.tuple.html#trait-implementations-1
126multi_value_impls_no_debug! {
127    (MultiValue12 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)
128    (MultiValue13 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)
129    (MultiValue14 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)
130    (MultiValue15 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)
131    (MultiValue16 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)
132}
133
134multi_value_impls! {
135    (MultiValue2   2 0 T0 1 T1)
136    (MultiValue3   3 0 T0 1 T1 2 T2)
137    (MultiValue4   4 0 T0 1 T1 2 T2 3 T3)
138    (MultiValue5   5 0 T0 1 T1 2 T2 3 T3 4 T4)
139    (MultiValue6   6 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
140    (MultiValue7   7 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
141    (MultiValue8   8 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
142    (MultiValue9   9 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
143    (MultiValue10 10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
144    (MultiValue11 11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
145    (MultiValue12 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)
146    (MultiValue13 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)
147    (MultiValue14 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)
148    (MultiValue15 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)
149    (MultiValue16 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)
150}