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(test)]
19pub mod mock;
20
21pub mod metrics;
23#[cfg(feature = "metrics")]
24pub use metrics::TrieCursorMetrics;
25pub use metrics::{InstrumentedTrieCursor, TrieCursorMetricsCache};
26
27pub use self::{depth_first::DepthFirstTrieIterator, in_memory::*, subnode::CursorSubNode};
28
29#[auto_impl::auto_impl(&)]
31pub trait TrieCursorFactory {
32 type AccountTrieCursor<'a>: TrieCursor
34 where
35 Self: 'a;
36
37 type StorageTrieCursor<'a>: TrieStorageCursor
39 where
40 Self: 'a;
41
42 fn account_trie_cursor(&self) -> Result<Self::AccountTrieCursor<'_>, DatabaseError>;
44
45 fn storage_trie_cursor(
47 &self,
48 hashed_address: B256,
49 ) -> Result<Self::StorageTrieCursor<'_>, DatabaseError>;
50}
51
52#[auto_impl::auto_impl(&mut)]
55pub trait TrieCursor {
56 fn seek_exact(
58 &mut self,
59 key: Nibbles,
60 ) -> Result<Option<(Nibbles, BranchNodeCompact)>, DatabaseError>;
61
62 fn seek(&mut self, key: Nibbles)
64 -> Result<Option<(Nibbles, BranchNodeCompact)>, DatabaseError>;
65
66 fn next(&mut self) -> Result<Option<(Nibbles, BranchNodeCompact)>, DatabaseError>;
68
69 fn current(&mut self) -> Result<Option<Nibbles>, DatabaseError>;
71
72 fn reset(&mut self);
79}
80
81#[auto_impl::auto_impl(&mut)]
83pub trait TrieStorageCursor: TrieCursor {
84 fn set_hashed_address(&mut self, hashed_address: B256);
91}
92
93#[derive(Debug)]
95pub struct TrieCursorIter<'a, C> {
96 cursor: &'a mut C,
97 initial: Option<Result<(Nibbles, BranchNodeCompact), DatabaseError>>,
99}
100
101impl<'a, C> TrieCursorIter<'a, C> {
102 pub fn new(cursor: &'a mut C) -> Self
105 where
106 C: TrieCursor,
107 {
108 let initial = cursor.seek(Nibbles::default()).transpose();
109 Self { cursor, initial }
110 }
111}
112
113impl<'a, C> From<&'a mut C> for TrieCursorIter<'a, C>
114where
115 C: TrieCursor,
116{
117 fn from(cursor: &'a mut C) -> Self {
118 Self::new(cursor)
119 }
120}
121
122impl<'a, C> Iterator for TrieCursorIter<'a, C>
123where
124 C: TrieCursor,
125{
126 type Item = Result<(Nibbles, BranchNodeCompact), DatabaseError>;
127
128 fn next(&mut self) -> Option<Self::Item> {
129 if let Some(initial) = self.initial.take() {
131 return Some(initial);
132 }
133
134 self.cursor.next().transpose()
135 }
136}