diff --git a/eth2/utils/ssz/examples/struct_definition.rs b/eth2/utils/ssz/examples/struct_definition.rs index 04741db647..835a87e360 100644 --- a/eth2/utils/ssz/examples/struct_definition.rs +++ b/eth2/utils/ssz/examples/struct_definition.rs @@ -17,13 +17,13 @@ impl Encodable for Foo { + as Encodable>::ssz_fixed_len() + ::ssz_fixed_len(); - let mut encoder = SszEncoder::container(offset); + let mut encoder = SszEncoder::container(buf, offset); encoder.append(&self.a); encoder.append(&self.b); encoder.append(&self.c); - encoder.drain_onto(buf); + encoder.finalize(); } } diff --git a/eth2/utils/ssz/src/encode.rs b/eth2/utils/ssz/src/encode.rs index 81b4a10279..9e3af65c4d 100644 --- a/eth2/utils/ssz/src/encode.rs +++ b/eth2/utils/ssz/src/encode.rs @@ -25,48 +25,51 @@ pub trait Encodable { } } -pub struct SszEncoder { +pub struct SszEncoder<'a> { offset: usize, - fixed_bytes: Vec, + buf: &'a mut Vec, variable_bytes: Vec, } -impl SszEncoder { - pub fn list(num_fixed_bytes: usize) -> Self { - Self::container(num_fixed_bytes) +impl<'a> SszEncoder<'a> { + pub fn list(buf: &'a mut Vec, num_fixed_bytes: usize) -> Self { + Self::container(buf, num_fixed_bytes) } - pub fn container(num_fixed_bytes: usize) -> Self { + pub fn container(buf: &'a mut Vec, num_fixed_bytes: usize) -> Self { + buf.reserve(num_fixed_bytes); + Self { offset: num_fixed_bytes, - fixed_bytes: Vec::with_capacity(num_fixed_bytes), + buf, variable_bytes: vec![], } } pub fn append(&mut self, item: &T) { if T::is_ssz_fixed_len() { - item.ssz_append(&mut self.fixed_bytes); + item.ssz_append(&mut self.buf); } else { - self.fixed_bytes + self.buf .append(&mut encode_length(self.offset + self.variable_bytes.len())); item.ssz_append(&mut self.variable_bytes); } } - pub fn drain_onto(mut self, buf: &mut Vec) { - buf.append(&mut self.fixed_bytes); - buf.append(&mut self.variable_bytes); + pub fn finalize(&mut self) -> &mut Vec { + self.buf.append(&mut self.variable_bytes); + + &mut self.buf } } +/* pub struct VariableLengths { pub fixed_bytes_position: usize, pub variable_bytes_length: usize, } -/* /// Provides a buffer for appending SSZ values. #[derive(Default)] pub struct SszStream { diff --git a/eth2/utils/ssz/src/encode/impls.rs b/eth2/utils/ssz/src/encode/impls.rs index 1403e2c2ee..3dab9eff69 100644 --- a/eth2/utils/ssz/src/encode/impls.rs +++ b/eth2/utils/ssz/src/encode/impls.rs @@ -38,13 +38,13 @@ impl Encodable for Vec { item.ssz_append(buf); } } else { - let mut encoder = SszEncoder::list(self.len() * BYTES_PER_LENGTH_OFFSET); + let mut encoder = SszEncoder::list(buf, self.len() * BYTES_PER_LENGTH_OFFSET); for item in self { encoder.append(item); } - encoder.drain_onto(buf); + encoder.finalize(); } } } diff --git a/eth2/utils/ssz_derive/src/lib.rs b/eth2/utils/ssz_derive/src/lib.rs index 185ede2d9f..9548ea380e 100644 --- a/eth2/utils/ssz_derive/src/lib.rs +++ b/eth2/utils/ssz_derive/src/lib.rs @@ -109,13 +109,13 @@ pub fn ssz_encode_derive(input: TokenStream) -> TokenStream { )* 0; - let mut encoder = ssz::SszEncoder::container(offset); + let mut encoder = ssz::SszEncoder::container(buf, offset); #( encoder.append(&self.#field_idents); )* - encoder.drain_onto(buf); + encoder.finalize(); } } };