remove unsafe FromIterator<(NonZero<u8>, Option<RpoDigest>)>
This commit is contained in:
parent
4319e5aa3a
commit
0b3eb5c1bb
1 changed files with 13 additions and 30 deletions
|
@ -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<RpoDigest> = 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<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>;
|
||||
|
|
Loading…
Add table
Reference in a new issue