-
Notifications
You must be signed in to change notification settings - Fork 36
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf: change proof internal repr to
HashMap
- Loading branch information
Showing
5 changed files
with
148 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
use crate::{HashMap, Nibbles}; | ||
use alloy_primitives::Bytes; | ||
use core::ops::Deref; | ||
|
||
/// A wrapper struct for trie node key to RLP encoded trie node. | ||
#[derive(PartialEq, Eq, Clone, Default, Debug)] | ||
pub struct ProofNodes(HashMap<Nibbles, Bytes>); | ||
|
||
impl Deref for ProofNodes { | ||
type Target = HashMap<Nibbles, Bytes>; | ||
|
||
fn deref(&self) -> &Self::Target { | ||
&self.0 | ||
} | ||
} | ||
|
||
impl ProofNodes { | ||
/// Construct struct from iterator over keys and proof nodes. | ||
pub fn from_iter(nodes: impl IntoIterator<Item = (Nibbles, Bytes)>) -> Self { | ||
Self(HashMap::from_iter(nodes)) | ||
} | ||
|
||
/// Return iterator over proof nodes that match the target. | ||
pub fn matching_nodes_iter<'a>( | ||
&'a self, | ||
target: &'a Nibbles, | ||
) -> impl Iterator<Item = (&'a Nibbles, &'a Bytes)> { | ||
self.0.iter().filter(|(key, _)| target.starts_with(key)) | ||
} | ||
|
||
/// Return the vec of proof nodes that match the target. | ||
pub fn matching_nodes(&self, target: &Nibbles) -> Vec<(Nibbles, Bytes)> { | ||
self.matching_nodes_iter(target).map(|(key, node)| (key.clone(), node.clone())).collect() | ||
} | ||
|
||
/// Return the sorted vec of proof nodes that match the target. | ||
pub fn matching_nodes_sorted(&self, target: &Nibbles) -> Vec<(Nibbles, Bytes)> { | ||
let mut nodes = self.matching_nodes(target); | ||
nodes.sort_unstable_by(|a, b| a.0.cmp(&b.0)); | ||
nodes | ||
} | ||
|
||
/// Insert the RLP encoded trie node at key. | ||
pub fn insert(&mut self, key: Nibbles, node: Bytes) -> Option<Bytes> { | ||
self.0.insert(key, node) | ||
} | ||
|
||
/// Return the sorted vec of all proof nodes. | ||
pub fn nodes_sorted(&self) -> Vec<(Nibbles, Bytes)> { | ||
let mut nodes = Vec::from_iter(self.0.iter().map(|(k, v)| (k.clone(), v.clone()))); | ||
nodes.sort_unstable_by(|a, b| a.0.cmp(&b.0)); | ||
nodes | ||
} | ||
|
||
/// Convert into sorted vec of all proof nodes. | ||
pub fn into_nodes_sorted(self) -> Vec<(Nibbles, Bytes)> { | ||
let mut nodes = Vec::from_iter(self.0); | ||
nodes.sort_unstable_by(|a, b| a.0.cmp(&b.0)); | ||
nodes | ||
} | ||
|
||
/// Convert wrapper struct into inner map. | ||
pub fn into_inner(self) -> HashMap<Nibbles, Bytes> { | ||
self.0 | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters