remove unsafe FromIterator<(NonZero<u8>, Option<RpoDigest>)>

This commit is contained in:
Grzegorz Świrski 2025-04-16 11:27:12 +02:00
parent c6edb4d42d
commit 6c59d059eb

View file

@ -147,17 +147,21 @@ impl SparseMerklePath {
return Err(MerkleError::DepthTooBig(tree_depth as u64));
}
let path: Self = iter::zip(path_depth_iter(tree_depth), iter)
.map(|(depth, node)| {
let mut empty_nodes_mask: u64 = 0;
let mut nodes: Vec<RpoDigest> = Default::default();
for (depth, node) in iter::zip(path_depth_iter(tree_depth), iter) {
let &equivalent_empty_node = EmptySubtreeRoots::entry(tree_depth, depth.get());
let is_empty = node == equivalent_empty_node;
let node = if is_empty { None } else { Some(node) };
(depth, node)
})
.collect();
match node {
Some(node) => nodes.push(node),
None => empty_nodes_mask |= Self::bitmask_for_depth(depth),
}
}
Ok(path)
Ok(SparseMerklePath { nodes, empty_nodes_mask })
}
const fn bitmask_for_depth(node_depth: NonZero<u8>) -> u64 {
@ -246,27 +250,6 @@ impl From<SparseMerklePath> for Vec<RpoDigest> {
// ITERATORS
// ================================================================================================
/// Contructs a [SparseMerklePath] out of an iterator of optional nodes, where `None` indicates an
/// empty node.
impl FromIterator<(NonZero<u8>, Option<RpoDigest>)> for SparseMerklePath {
fn from_iter<I>(iter: I) -> SparseMerklePath
where
I: IntoIterator<Item = (NonZero<u8>, Option<RpoDigest>)>,
{
let mut empty_nodes_mask: u64 = 0;
let mut nodes: Vec<RpoDigest> = Default::default();
for (depth, node) in iter {
match node {
Some(node) => nodes.push(node),
None => empty_nodes_mask |= Self::bitmask_for_depth(depth),
}
}
SparseMerklePath { nodes, empty_nodes_mask }
}
}
impl<'p> IntoIterator for &'p SparseMerklePath {
type Item = <SparseMerklePathIter<'p> as Iterator>::Item;
type IntoIter = SparseMerklePathIter<'p>;