dharitri_sc_codec/multi_types/
multi_value_vec.rs1use crate::{
2 DecodeErrorHandler, EncodeErrorHandler, TopDecodeMulti, TopDecodeMultiInput, TopEncodeMulti,
3 TopEncodeMultiOutput,
4};
5use alloc::vec::Vec;
6use core::iter::FromIterator;
7
8#[derive(Clone, Default, Debug, PartialEq, Eq)]
11pub struct MultiValueVec<T>(pub Vec<T>);
12
13impl<T> From<Vec<T>> for MultiValueVec<T> {
14 fn from(v: Vec<T>) -> Self {
15 MultiValueVec(v)
16 }
17}
18
19impl<T, const N: usize> From<[T; N]> for MultiValueVec<T>
20where
21 T: Clone,
22{
23 fn from(arr: [T; N]) -> Self {
24 MultiValueVec(arr[..].to_vec())
25 }
26}
27
28impl<T> MultiValueVec<T> {
29 #[inline]
30 pub fn new() -> Self {
31 MultiValueVec(Vec::new())
32 }
33}
34
35impl<T> MultiValueVec<T> {
36 #[inline]
37 pub fn into_vec(self) -> Vec<T> {
38 self.0
39 }
40
41 #[inline]
42 pub fn as_slice(&self) -> &[T] {
43 self.0.as_slice()
44 }
45
46 #[inline]
47 pub fn push(&mut self, value: T) {
48 self.0.push(value);
49 }
50
51 #[inline]
52 pub fn len(&self) -> usize {
53 self.0.len()
54 }
55
56 #[inline]
57 pub fn is_empty(&self) -> bool {
58 self.0.is_empty()
59 }
60
61 #[inline]
62 pub fn iter(&self) -> core::slice::Iter<'_, T> {
63 self.0.iter()
64 }
65}
66
67impl<T> FromIterator<T> for MultiValueVec<T> {
68 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
69 let v = Vec::<T>::from_iter(iter);
70 MultiValueVec(v)
71 }
72}
73
74impl<T> TopEncodeMulti for MultiValueVec<T>
75where
76 T: TopEncodeMulti,
77{
78 fn multi_encode_or_handle_err<O, H>(&self, output: &mut O, h: H) -> Result<(), H::HandledErr>
79 where
80 O: TopEncodeMultiOutput,
81 H: EncodeErrorHandler,
82 {
83 for elem in self.0.iter() {
84 elem.multi_encode_or_handle_err(output, h)?;
85 }
86 Ok(())
87 }
88}
89
90impl<T> TopDecodeMulti for MultiValueVec<T>
91where
92 T: TopDecodeMulti,
93{
94 fn multi_decode_or_handle_err<I, H>(input: &mut I, h: H) -> Result<Self, H::HandledErr>
95 where
96 I: TopDecodeMultiInput,
97 H: DecodeErrorHandler,
98 {
99 let mut result_vec: Vec<T> = Vec::new();
100 while input.has_next() {
101 result_vec.push(T::multi_decode_or_handle_err(input, h)?);
102 }
103 Ok(Self(result_vec))
104 }
105}