reth_trie_common/
input.rs1use crate::{
2 prefix_set::TriePrefixSetsMut,
3 updates::{TrieUpdates, TrieUpdatesSorted},
4 HashedPostState, HashedPostStateSorted,
5};
6use alloc::sync::Arc;
7
8#[derive(Default, Debug, Clone)]
10pub struct TrieInput {
11 pub nodes: TrieUpdates,
14 pub state: HashedPostState,
16 pub prefix_sets: TriePrefixSetsMut,
20}
21
22impl TrieInput {
23 pub const fn new(
25 nodes: TrieUpdates,
26 state: HashedPostState,
27 prefix_sets: TriePrefixSetsMut,
28 ) -> Self {
29 Self { nodes, state, prefix_sets }
30 }
31
32 pub fn from_state(state: HashedPostState) -> Self {
35 let prefix_sets = state.construct_prefix_sets();
36 Self { nodes: TrieUpdates::default(), state, prefix_sets }
37 }
38
39 pub fn from_blocks<'a>(
42 blocks: impl IntoIterator<Item = (&'a HashedPostState, &'a TrieUpdates)>,
43 ) -> Self {
44 let mut input = Self::default();
45 input.extend_with_blocks(blocks);
46 input
47 }
48
49 pub fn from_blocks_sorted<'a>(
52 blocks: impl IntoIterator<Item = (&'a HashedPostStateSorted, &'a TrieUpdatesSorted)>,
53 ) -> Self {
54 let mut input = Self::default();
55 for (hashed_state, trie_updates) in blocks {
56 input.nodes.extend_from_sorted(trie_updates);
58 input.state.extend_from_sorted(hashed_state);
59 }
60 input
61 }
62
63 pub fn extend_with_blocks<'a>(
65 &mut self,
66 blocks: impl IntoIterator<Item = (&'a HashedPostState, &'a TrieUpdates)>,
67 ) {
68 for (hashed_state, trie_updates) in blocks {
69 self.append_cached_ref(trie_updates, hashed_state);
70 }
71 }
72
73 pub fn prepend_self(&mut self, mut other: Self) {
75 core::mem::swap(&mut self.nodes, &mut other.nodes);
76 self.nodes.extend(other.nodes);
77 core::mem::swap(&mut self.state, &mut other.state);
78 self.state.extend(other.state);
79 self.prefix_sets.extend(other.prefix_sets);
81 }
82
83 pub fn prepend(&mut self, mut state: HashedPostState) {
85 self.prefix_sets.extend(state.construct_prefix_sets());
86 core::mem::swap(&mut self.state, &mut state);
87 self.state.extend(state);
88 }
89
90 pub fn prepend_cached(&mut self, mut nodes: TrieUpdates, mut state: HashedPostState) {
93 core::mem::swap(&mut self.nodes, &mut nodes);
94 self.nodes.extend(nodes);
95 core::mem::swap(&mut self.state, &mut state);
96 self.state.extend(state);
97 }
98
99 pub fn append(&mut self, state: HashedPostState) {
101 self.prefix_sets.extend(state.construct_prefix_sets());
102 self.state.extend(state);
103 }
104
105 pub fn append_ref(&mut self, state: &HashedPostState) {
107 self.prefix_sets.extend(state.construct_prefix_sets());
108 self.state.extend_ref(state);
109 }
110
111 pub fn append_cached(&mut self, nodes: TrieUpdates, state: HashedPostState) {
114 self.nodes.extend(nodes);
115 self.state.extend(state);
116 }
117
118 pub fn append_cached_ref(&mut self, nodes: &TrieUpdates, state: &HashedPostState) {
121 self.nodes.extend_ref(nodes);
122 self.state.extend_ref(state);
123 }
124
125 pub fn clear(&mut self) {
127 self.nodes.clear();
128 self.state.clear();
129 self.prefix_sets.clear();
130 }
131
132 pub fn cleared(mut self) -> Self {
134 self.clear();
135 self
136 }
137}
138
139#[derive(Default, Debug, Clone)]
144pub struct TrieInputSorted {
145 pub nodes: Arc<TrieUpdatesSorted>,
147 pub state: Arc<HashedPostStateSorted>,
149 pub prefix_sets: TriePrefixSetsMut,
151}
152
153impl TrieInputSorted {
154 pub const fn new(
156 nodes: Arc<TrieUpdatesSorted>,
157 state: Arc<HashedPostStateSorted>,
158 prefix_sets: TriePrefixSetsMut,
159 ) -> Self {
160 Self { nodes, state, prefix_sets }
161 }
162
163 pub fn from_unsorted(input: TrieInput) -> Self {
165 Self {
166 nodes: Arc::new(input.nodes.into_sorted()),
167 state: Arc::new(input.state.into_sorted()),
168 prefix_sets: input.prefix_sets,
169 }
170 }
171}
172
173#[cfg(test)]
174mod tests {}