reth_trie/trie_cursor/
mod.rs1use crate::{BranchNodeCompact, Nibbles};
2use alloy_primitives::B256;
3use reth_storage_errors::db::DatabaseError;
4
5mod in_memory;
7
8pub mod subnode;
10
11pub mod noop;
13
14pub mod masked;
16
17pub mod depth_first;
19
20#[cfg(any(test, feature = "test-utils"))]
22pub mod mock;
23
24pub mod metrics;
26#[cfg(feature = "metrics")]
27pub use metrics::TrieCursorMetrics;
28pub use metrics::{InstrumentedTrieCursor, TrieCursorMetricsCache};
29
30pub use self::{depth_first::DepthFirstTrieIterator, in_memory::*, subnode::CursorSubNode};
31
32#[auto_impl::auto_impl(&)]
34pub trait TrieCursorFactory {
35 type AccountTrieCursor<'a>: TrieCursor
37 where
38 Self: 'a;
39
40 type StorageTrieCursor<'a>: TrieStorageCursor
42 where
43 Self: 'a;
44
45 fn account_trie_cursor(&self) -> Result<Self::AccountTrieCursor<'_>, DatabaseError>;
47
48 fn storage_trie_cursor(
50 &self,
51 hashed_address: B256,
52 ) -> Result<Self::StorageTrieCursor<'_>, DatabaseError>;
53}
54
55#[auto_impl::auto_impl(&mut, Box)]
58pub trait TrieCursor {
59 fn seek_exact(
61 &mut self,
62 key: Nibbles,
63 ) -> Result<Option<(Nibbles, BranchNodeCompact)>, DatabaseError>;
64
65 fn seek(&mut self, key: Nibbles)
67 -> Result<Option<(Nibbles, BranchNodeCompact)>, DatabaseError>;
68
69 fn next(&mut self) -> Result<Option<(Nibbles, BranchNodeCompact)>, DatabaseError>;
71
72 fn current(&mut self) -> Result<Option<Nibbles>, DatabaseError>;
74
75 fn reset(&mut self);
82}
83
84#[auto_impl::auto_impl(&mut, Box)]
86pub trait TrieStorageCursor: TrieCursor {
87 fn set_hashed_address(&mut self, hashed_address: B256);
94}
95
96#[derive(Debug)]
98pub struct TrieCursorIter<'a, C> {
99 cursor: &'a mut C,
100 initial: Option<Result<(Nibbles, BranchNodeCompact), DatabaseError>>,
102}
103
104impl<'a, C> TrieCursorIter<'a, C> {
105 pub fn new(cursor: &'a mut C) -> Self
108 where
109 C: TrieCursor,
110 {
111 let initial = cursor.seek(Nibbles::default()).transpose();
112 Self { cursor, initial }
113 }
114}
115
116impl<'a, C> From<&'a mut C> for TrieCursorIter<'a, C>
117where
118 C: TrieCursor,
119{
120 fn from(cursor: &'a mut C) -> Self {
121 Self::new(cursor)
122 }
123}
124
125impl<'a, C> Iterator for TrieCursorIter<'a, C>
126where
127 C: TrieCursor,
128{
129 type Item = Result<(Nibbles, BranchNodeCompact), DatabaseError>;
130
131 fn next(&mut self) -> Option<Self::Item> {
132 if let Some(initial) = self.initial.take() {
134 return Some(initial);
135 }
136
137 self.cursor.next().transpose()
138 }
139}