multiversx_sc_codec/impl_for_types/
impl_num_signed.rs1use crate::{
2 dep_encode_num_mimic, DecodeError, DecodeErrorHandler, EncodeErrorHandler, NestedDecode,
3 NestedDecodeInput, NestedEncode, NestedEncodeOutput, TopDecode, TopDecodeInput, TopEncode,
4 TopEncodeOutput,
5};
6
7macro_rules! top_encode_num_signed {
8 ($num_type:ty, $size_in_bits:expr) => {
9 impl TopEncode for $num_type {
10 #[inline]
11 fn top_encode_or_handle_err<O, H>(&self, output: O, _h: H) -> Result<(), H::HandledErr>
12 where
13 O: TopEncodeOutput,
14 H: EncodeErrorHandler,
15 {
16 output.set_i64(*self as i64);
17 Ok(())
18 }
19 }
20 };
21}
22
23top_encode_num_signed! {i64, 64}
24top_encode_num_signed! {i32, 32}
25top_encode_num_signed! {isize, 32}
26top_encode_num_signed! {i16, 16}
27top_encode_num_signed! {i8, 8}
28
29dep_encode_num_mimic! {i64, u64}
30dep_encode_num_mimic! {i32, u32}
31dep_encode_num_mimic! {isize, u32}
32dep_encode_num_mimic! {i16, u16}
33dep_encode_num_mimic! {i8, u8}
34
35macro_rules! dep_decode_num_signed {
36 ($ty:ty, $num_bytes:expr) => {
37 impl NestedDecode for $ty {
38 fn dep_decode_or_handle_err<I, H>(input: &mut I, h: H) -> Result<Self, H::HandledErr>
39 where
40 I: NestedDecodeInput,
41 H: DecodeErrorHandler,
42 {
43 let mut bytes = [0u8; $num_bytes];
44 input.read_into(&mut bytes[..], h)?;
45 let num = <$ty>::from_be_bytes(bytes);
46 Ok(num)
47 }
48 }
49 };
50}
51
52dep_decode_num_signed!(i8, 1);
53dep_decode_num_signed!(i16, 2);
54dep_decode_num_signed!(i32, 4);
55dep_decode_num_signed!(i64, 8);
56
57impl NestedDecode for isize {
58 fn dep_decode_or_handle_err<I, H>(input: &mut I, h: H) -> Result<Self, H::HandledErr>
59 where
60 I: NestedDecodeInput,
61 H: DecodeErrorHandler,
62 {
63 i32::dep_decode_or_handle_err(input, h).map(|num| num as isize)
64 }
65}
66
67macro_rules! top_decode_num_signed {
68 ($ty:ty, $bounds_ty:ty) => {
69 impl TopDecode for $ty {
70 fn top_decode_or_handle_err<I, H>(input: I, h: H) -> Result<Self, H::HandledErr>
71 where
72 I: TopDecodeInput,
73 H: DecodeErrorHandler,
74 {
75 let arg_i64 = input.into_i64(h)?;
76 let min = <$bounds_ty>::MIN as i64;
77 let max = <$bounds_ty>::MAX as i64;
78 if arg_i64 < min || arg_i64 > max {
79 Err(h.handle_error(DecodeError::INPUT_OUT_OF_RANGE))
80 } else {
81 Ok(arg_i64 as $ty)
82 }
83 }
84 }
85 };
86}
87
88top_decode_num_signed!(i8, i8);
89top_decode_num_signed!(i16, i16);
90top_decode_num_signed!(i32, i32);
91top_decode_num_signed!(isize, i32); top_decode_num_signed!(i64, i64);
93
94#[cfg(test)]
95pub mod tests {
96 use crate::test_util::{check_dep_encode_decode, check_top_encode_decode};
97
98 #[test]
99 fn test_top() {
100 check_top_encode_decode(0i8, &[]);
102 check_top_encode_decode(0i16, &[]);
103 check_top_encode_decode(0i32, &[]);
104 check_top_encode_decode(0i64, &[]);
105 check_top_encode_decode(0isize, &[]);
106 check_top_encode_decode(5i8, &[5]);
108 check_top_encode_decode(5i16, &[5]);
109 check_top_encode_decode(5i32, &[5]);
110 check_top_encode_decode(5i64, &[5]);
111 check_top_encode_decode(5isize, &[5]);
112 check_top_encode_decode(-5i8, &[251]);
114 check_top_encode_decode(-5i16, &[251]);
115 check_top_encode_decode(-5i32, &[251]);
116 check_top_encode_decode(-5i64, &[251]);
117 check_top_encode_decode(-5isize, &[251]);
118 }
119
120 #[test]
121 fn test_dep() {
122 check_dep_encode_decode(0i8, &[0]);
124 check_dep_encode_decode(0i16, &[0, 0]);
125 check_dep_encode_decode(0i32, &[0, 0, 0, 0]);
126 check_dep_encode_decode(0isize, &[0, 0, 0, 0]);
127 check_dep_encode_decode(0i64, &[0, 0, 0, 0, 0, 0, 0, 0]);
128 check_dep_encode_decode(5i8, &[5]);
130 check_dep_encode_decode(5i16, &[0, 5]);
131 check_dep_encode_decode(5i32, &[0, 0, 0, 5]);
132 check_dep_encode_decode(5isize, &[0, 0, 0, 5]);
133 check_dep_encode_decode(5i64, &[0, 0, 0, 0, 0, 0, 0, 5]);
134 check_dep_encode_decode(-5i8, &[251]);
136 check_dep_encode_decode(-5i16, &[255, 251]);
137 check_dep_encode_decode(-5i32, &[255, 255, 255, 251]);
138 check_dep_encode_decode(-5isize, &[255, 255, 255, 251]);
139 check_dep_encode_decode(-5i64, &[255, 255, 255, 255, 255, 255, 255, 251]);
140 }
141}