@@ -7,12 +7,12 @@ use std::ops::Deref;
77use scale:: { Decode , Input } ;
88
99#[ derive( Clone , Debug , PartialEq , Eq ) ]
10- pub struct VecOf < I , T > {
10+ pub struct VecOf < I , T , const MAX_LEN : usize = 65536 > {
1111 len : I ,
1212 inner : Vec < T > ,
1313}
1414
15- impl < I : Default , T > Default for VecOf < I , T > {
15+ impl < I : Default , T , const MAX_LEN : usize > Default for VecOf < I , T , MAX_LEN > {
1616 fn default ( ) -> Self {
1717 Self {
1818 len : I :: default ( ) ,
@@ -21,11 +21,16 @@ impl<I: Default, T> Default for VecOf<I, T> {
2121 }
2222}
2323
24- impl < I : Decode + Into < u32 > + Copy , T : Decode > Decode for VecOf < I , T > {
24+ impl < I : Decode + Into < u32 > + Copy , T : Decode , const MAX_LEN : usize > Decode
25+ for VecOf < I , T , MAX_LEN >
26+ {
2527 fn decode < In : Input > ( input : & mut In ) -> Result < Self , scale:: Error > {
2628 let decoded_len = I :: decode ( input) ?;
2729 let len = decoded_len. into ( ) as usize ;
28- let mut inner = Vec :: with_capacity ( len) ;
30+ if len > MAX_LEN {
31+ return Err ( "VecOf length exceeds upper bound" . into ( ) ) ;
32+ }
33+ let mut inner = Vec :: with_capacity ( len. min ( 1024 ) ) ;
2934 for _ in 0 ..len {
3035 inner. push ( T :: decode ( input) ?) ;
3136 }
@@ -36,7 +41,7 @@ impl<I: Decode + Into<u32> + Copy, T: Decode> Decode for VecOf<I, T> {
3641 }
3742}
3843
39- impl < I , T > VecOf < I , T > {
44+ impl < I , T , const MAX_LEN : usize > VecOf < I , T , MAX_LEN > {
4045 pub fn into_inner ( self ) -> Vec < T > {
4146 self . inner
4247 }
@@ -49,28 +54,28 @@ impl<I, T> VecOf<I, T> {
4954 }
5055}
5156
52- impl < I , T > Deref for VecOf < I , T > {
57+ impl < I , T , const MAX_LEN : usize > Deref for VecOf < I , T , MAX_LEN > {
5358 type Target = Vec < T > ;
5459
5560 fn deref ( & self ) -> & Self :: Target {
5661 & self . inner
5762 }
5863}
5964
60- impl < I , T > From < ( I , Vec < T > ) > for VecOf < I , T > {
65+ impl < I , T , const MAX_LEN : usize > From < ( I , Vec < T > ) > for VecOf < I , T , MAX_LEN > {
6166 fn from ( ( len, vec) : ( I , Vec < T > ) ) -> Self {
6267 Self { len, inner : vec }
6368 }
6469}
6570
66- impl < I , T > AsRef < [ T ] > for VecOf < I , T > {
71+ impl < I , T , const MAX_LEN : usize > AsRef < [ T ] > for VecOf < I , T , MAX_LEN > {
6772 fn as_ref ( & self ) -> & [ T ] {
6873 & self . inner
6974 }
7075}
7176
72- impl < I , T > From < VecOf < I , T > > for Vec < T > {
73- fn from ( value : VecOf < I , T > ) -> Self {
77+ impl < I , T , const MAX_LEN : usize > From < VecOf < I , T , MAX_LEN > > for Vec < T > {
78+ fn from ( value : VecOf < I , T , MAX_LEN > ) -> Self {
7479 value. inner
7580 }
7681}
0 commit comments