elrond_codec/impl_for_types/
impl_vec.rs1use crate::{
2 boxed_slice_into_vec, DecodeError, DecodeErrorHandler, EncodeErrorHandler, NestedDecode,
3 NestedDecodeInput, NestedEncode, NestedEncodeOutput, TopDecode, TopDecodeInput, TopEncode,
4 TopEncodeOutput,
5};
6use alloc::vec::Vec;
7
8impl<T: NestedEncode> TopEncode for Vec<T> {
9 #[inline]
10 fn top_encode_or_handle_err<O, H>(&self, output: O, h: H) -> Result<(), H::HandledErr>
11 where
12 O: TopEncodeOutput,
13 H: EncodeErrorHandler,
14 {
15 self.as_slice().top_encode_or_handle_err(output, h)
16 }
17}
18
19impl<T: NestedDecode> TopDecode for Vec<T> {
20 fn top_decode_or_handle_err<I, H>(input: I, h: H) -> Result<Self, H::HandledErr>
21 where
22 I: TopDecodeInput,
23 H: DecodeErrorHandler,
24 {
25 T::if_u8(
26 input,
27 |input| {
28 let bytes = input.into_boxed_slice_u8();
29 let bytes_vec = boxed_slice_into_vec(bytes);
30 let cast_vec: Vec<T> = unsafe { core::mem::transmute(bytes_vec) };
31 Ok(cast_vec)
32 },
33 |input| {
34 let mut result: Vec<T> = Vec::new();
35 let mut nested_buffer = input.into_nested_buffer();
36 while !nested_buffer.is_depleted() {
37 result.push(T::dep_decode_or_handle_err(&mut nested_buffer, h)?);
38 }
39 if !nested_buffer.is_depleted() {
40 return Err(h.handle_error(DecodeError::INPUT_TOO_LONG));
41 }
42 Ok(result)
43 },
44 )
45 }
46}
47
48impl<T: NestedEncode> NestedEncode for Vec<T> {
49 #[inline]
50 fn dep_encode_or_handle_err<O, H>(&self, dest: &mut O, h: H) -> Result<(), H::HandledErr>
51 where
52 O: NestedEncodeOutput,
53 H: EncodeErrorHandler,
54 {
55 self.as_slice().dep_encode_or_handle_err(dest, h)
56 }
57}
58
59impl<T: NestedDecode> NestedDecode for Vec<T> {
60 fn dep_decode_or_handle_err<I, H>(input: &mut I, h: H) -> Result<Self, H::HandledErr>
61 where
62 I: NestedDecodeInput,
63 H: DecodeErrorHandler,
64 {
65 let size = usize::dep_decode_or_handle_err(input, h)?;
66 T::if_u8(
67 input,
68 |input| {
69 let mut vec_u8: Vec<u8> = alloc::vec![0; size];
70 input.read_into(vec_u8.as_mut_slice(), h)?;
71 let cast_vec: Vec<T> = unsafe { core::mem::transmute(vec_u8) };
72 Ok(cast_vec)
73 },
74 |input| {
75 let mut result: Vec<T> = Vec::with_capacity(size);
76 for _ in 0..size {
77 result.push(T::dep_decode_or_handle_err(input, h)?);
78 }
79 Ok(result)
80 },
81 )
82 }
83}
84
85#[cfg(test)]
86pub mod tests {
87 use crate::test_util::check_top_encode_decode;
88
89 #[test]
90 fn test_top_vec_i32_compacted() {
91 let v = [1i32, 2i32, 3i32].to_vec();
92 let expected: &[u8] = &[0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3];
93 check_top_encode_decode(v, expected);
94 }
95
96 #[test]
97 fn test_top_vec_u8_compacted() {
98 check_top_encode_decode([1u8, 2u8, 3u8].to_vec(), &[1u8, 2u8, 3u8]);
99 }
100}