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