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

This commit is contained in:
Grzegorz Świrski 2025-04-16 11:27:12 +02:00 committed by Qyriad
parent 4319e5aa3a
commit 0b3eb5c1bb

View file

@ -147,17 +147,21 @@ impl SparseMerklePath {
return Err(MerkleError::DepthTooBig(tree_depth as u64)); return Err(MerkleError::DepthTooBig(tree_depth as u64));
} }
let path: Self = iter::zip(path_depth_iter(tree_depth), iter) let mut empty_nodes_mask: u64 = 0;
.map(|(depth, node)| { let mut nodes: Vec<RpoDigest> = Default::default();
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) for (depth, node) in iter::zip(path_depth_iter(tree_depth), iter) {
}) let &equivalent_empty_node = EmptySubtreeRoots::entry(tree_depth, depth.get());
.collect(); 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<u8>) -> u64 { const fn bitmask_for_depth(node_depth: NonZero<u8>) -> u64 {
@ -246,27 +250,6 @@ impl From<SparseMerklePath> for Vec<RpoDigest> {
// ITERATORS // 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 { impl<'p> IntoIterator for &'p SparseMerklePath {
type Item = <SparseMerklePathIter<'p> as Iterator>::Item; type Item = <SparseMerklePathIter<'p> as Iterator>::Item;
type IntoIter = SparseMerklePathIter<'p>; type IntoIter = SparseMerklePathIter<'p>;