Skip to content

Commit c343bcc

Browse files
authored
Merge pull request #153 from multiformats/chore/avoid-copy
fix: avoid copying digests where possible
2 parents af6d069 + 603e00d commit c343bcc

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/multihash.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -194,16 +194,14 @@ impl<const S: usize> From<Multihash<S>> for Vec<u8> {
194194
#[cfg(feature = "scale-codec")]
195195
impl<const S: usize> parity_scale_codec::Encode for Multihash<S> {
196196
fn encode_to<EncOut: parity_scale_codec::Output + ?Sized>(&self, dest: &mut EncOut) {
197-
let mut digest = [0; S];
198-
digest.copy_from_slice(&self.digest);
199197
self.code.encode_to(dest);
200198
self.size.encode_to(dest);
201199
// **NOTE** We write the digest directly to dest, since we have known the size of digest.
202200
//
203201
// We do not choose to encode &[u8] directly, because it will add extra bytes (the compact length of digest).
204202
// For a valid multihash, the length of digest must equal to `size`.
205203
// Therefore, we can only read raw bytes whose length is equal to `size` when decoding.
206-
dest.write(&digest[..self.size as usize]);
204+
dest.write(self.digest());
207205
}
208206
}
209207

@@ -215,15 +213,17 @@ impl<const S: usize> parity_scale_codec::Decode for Multihash<S> {
215213
fn decode<DecIn: parity_scale_codec::Input>(
216214
input: &mut DecIn,
217215
) -> Result<Self, parity_scale_codec::Error> {
218-
let code = parity_scale_codec::Decode::decode(input)?;
219-
let size = parity_scale_codec::Decode::decode(input)?;
220-
if size as usize > S {
216+
let mut mh = Multihash {
217+
code: parity_scale_codec::Decode::decode(input)?,
218+
size: parity_scale_codec::Decode::decode(input)?,
219+
digest: [0; S],
220+
};
221+
if mh.size as usize > S {
221222
return Err(parity_scale_codec::Error::from("invalid size"));
222223
}
223224
// For a valid multihash, the length of digest must equal to the size.
224-
let mut digest = [0; S];
225-
input.read(&mut digest[..size as usize])?;
226-
Ok(Multihash { code, size, digest })
225+
input.read(&mut mh.digest[..mh.size as usize])?;
226+
Ok(mh)
227227
}
228228
}
229229

0 commit comments

Comments
 (0)