diff --git a/eth2/utils/ssz/src/cached_tree_hash.rs b/eth2/utils/ssz/src/cached_tree_hash.rs index d6ff884ef..0588ab772 100644 --- a/eth2/utils/ssz/src/cached_tree_hash.rs +++ b/eth2/utils/ssz/src/cached_tree_hash.rs @@ -6,6 +6,7 @@ use std::ops::Range; use std::vec::Splice; mod impls; +mod resize; mod tests; const BYTES_PER_CHUNK: usize = 32; diff --git a/eth2/utils/ssz/src/cached_tree_hash/impls.rs b/eth2/utils/ssz/src/cached_tree_hash/impls.rs index 14eab3180..2d0ab5059 100644 --- a/eth2/utils/ssz/src/cached_tree_hash/impls.rs +++ b/eth2/utils/ssz/src/cached_tree_hash/impls.rs @@ -170,23 +170,6 @@ where } } -/// New vec is bigger than old vec. -fn grow_merkle_cache(cache: Vec, to: usize) -> Vec { - let new = Vec::with_capacity(to * HASHSIZE); - - let i = cache.len() / HASHSIZE; - let j = to; - - assert_eq!(i.next_power_of_two(), i); - assert_eq!(j.next_power_of_two(), j); - - while i > 0 { - - } - - new -} - fn get_packed_leaves(vec: &Vec) -> Vec where T: CachedTreeHash, diff --git a/eth2/utils/ssz/src/cached_tree_hash/resize.rs b/eth2/utils/ssz/src/cached_tree_hash/resize.rs new file mode 100644 index 000000000..d41453e9a --- /dev/null +++ b/eth2/utils/ssz/src/cached_tree_hash/resize.rs @@ -0,0 +1,33 @@ +use super::*; + +/// New vec is bigger than old vec. +fn grow_merkle_cache(old_bytes: &[u8], old_flags: &[bool], to: usize) -> Option> { + let mut bytes = Vec::with_capacity(to * HASHSIZE); + let mut flags = Vec::with_capacity(to); + + let from = old_bytes.len() / HASHSIZE; + let to = to; + + let distance = (from.leading_zeros() - to.leading_zeros()) as usize; + + let leading_zero_chunks = 1 >> distance; + + bytes.resize(leading_zero_chunks * HASHSIZE, 0); + flags.resize(leading_zero_chunks, true); // all new chunks are modified by default. + + for i in 0..to.leading_zeros() as usize { + let new_slice = bytes.get_mut(1 >> i + distance..1 >> i + distance + 1)?; + let old_slice = old_bytes.get(1 >> i..1 >> i + 1)?; + new_slice.copy_from_slice(old_slice); + } + + Some(bytes) +} + +#[cfg(test)] +mod test { + #[test] + fn can_grow() { + // TODO + } +}