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 depth_first;
16
17#[cfg(any(test, feature = "test-utils"))]
19pub mod mock;
20
21#[cfg(feature = "metrics")]
23pub mod metrics;
24#[cfg(feature = "metrics")]
25pub use metrics::{InstrumentedTrieCursor, InstrumentedTrieCursorFactory, TrieCursorMetrics};
26
27#[cfg(not(feature = "metrics"))]
29pub type InstrumentedTrieCursorFactory<F> = F;
30
31pub use self::{depth_first::DepthFirstTrieIterator, in_memory::*, subnode::CursorSubNode};
32
33#[auto_impl::auto_impl(&)]
35pub trait TrieCursorFactory {
36 type AccountTrieCursor<'a>: TrieCursor
38 where
39 Self: 'a;
40
41 type StorageTrieCursor<'a>: TrieStorageCursor
43 where
44 Self: 'a;
45
46 fn account_trie_cursor(&self) -> Result<Self::AccountTrieCursor<'_>, DatabaseError>;
48
49 fn storage_trie_cursor(
51 &self,
52 hashed_address: B256,
53 ) -> Result<Self::StorageTrieCursor<'_>, DatabaseError>;
54}
55
56#[auto_impl::auto_impl(&mut, Box)]
59pub trait TrieCursor {
60 fn seek_exact(
62 &mut self,
63 key: Nibbles,
64 ) -> Result<Option<(Nibbles, BranchNodeCompact)>, DatabaseError>;
65
66 fn seek(&mut self, key: Nibbles)
68 -> Result<Option<(Nibbles, BranchNodeCompact)>, DatabaseError>;
69
70 fn next(&mut self) -> Result<Option<(Nibbles, BranchNodeCompact)>, DatabaseError>;
72
73 fn current(&mut self) -> Result<Option<Nibbles>, DatabaseError>;
75
76 fn reset(&mut self);
83}
84
85#[auto_impl::auto_impl(&mut, Box)]
87pub trait TrieStorageCursor: TrieCursor {
88 fn set_hashed_address(&mut self, hashed_address: B256);
95}
96
97#[derive(Debug)]
99pub struct TrieCursorIter<'a, C> {
100 cursor: &'a mut C,
101 initial: Option<Result<(Nibbles, BranchNodeCompact), DatabaseError>>,
103}
104
105impl<'a, C> TrieCursorIter<'a, C> {
106 pub fn new(cursor: &'a mut C) -> Self
109 where
110 C: TrieCursor,
111 {
112 let initial = cursor.seek(Nibbles::default()).transpose();
113 Self { cursor, initial }
114 }
115}
116
117impl<'a, C> From<&'a mut C> for TrieCursorIter<'a, C>
118where
119 C: TrieCursor,
120{
121 fn from(cursor: &'a mut C) -> Self {
122 Self::new(cursor)
123 }
124}
125
126impl<'a, C> Iterator for TrieCursorIter<'a, C>
127where
128 C: TrieCursor,
129{
130 type Item = Result<(Nibbles, BranchNodeCompact), DatabaseError>;
131
132 fn next(&mut self) -> Option<Self::Item> {
133 if let Some(initial) = self.initial.take() {
135 return Some(initial);
136 }
137
138 self.cursor.next().transpose()
139 }
140}