From a2748bbf292095135a588965629e8b602c95c118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20=C5=9Awirski?= Date: Wed, 16 Apr 2025 11:27:12 +0200 Subject: [PATCH] remove unsafe FromIterator<(NonZero, Option)> --- miden-crypto/src/merkle/sparse_path.rs | 43 ++++++++------------------ 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/miden-crypto/src/merkle/sparse_path.rs b/miden-crypto/src/merkle/sparse_path.rs index 305221c..8095452 100644 --- a/miden-crypto/src/merkle/sparse_path.rs +++ b/miden-crypto/src/merkle/sparse_path.rs @@ -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 &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) }; + let mut empty_nodes_mask: u64 = 0; + let mut nodes: Vec = Default::default(); - (depth, node) - }) - .collect(); + 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) }; - Ok(path) + match node { + Some(node) => nodes.push(node), + None => empty_nodes_mask |= Self::bitmask_for_depth(depth), + } + } + + Ok(SparseMerklePath { nodes, empty_nodes_mask }) } const fn bitmask_for_depth(node_depth: NonZero) -> u64 { @@ -246,27 +250,6 @@ impl From for Vec { // ITERATORS // ================================================================================================ -/// Contructs a [SparseMerklePath] out of an iterator of optional nodes, where `None` indicates an -/// empty node. -impl FromIterator<(NonZero, Option)> for SparseMerklePath { - fn from_iter(iter: I) -> SparseMerklePath - where - I: IntoIterator, Option)>, - { - let mut empty_nodes_mask: u64 = 0; - let mut nodes: Vec = 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 = as Iterator>::Item; type IntoIter = SparseMerklePathIter<'p>;