Skip to content

Commit b4180e5

Browse files
committed
feat: make TrieNode sized
This change to the API makes it easier for me to implement `TrieNode` on the existing storage tries (`SharedNode`).
1 parent b8f30ee commit b4180e5

File tree

3 files changed

+87
-96
lines changed

3 files changed

+87
-96
lines changed

storage/src/tries/iter.rs

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,35 +20,35 @@ pub struct IterDescending;
2020
/// respectively.
2121
#[derive(Debug)]
2222
#[must_use = "iterators are lazy and do nothing unless consumed"]
23-
pub struct TrieEdgeIter<'a, N: ?Sized, V: ?Sized, D> {
23+
pub struct TrieEdgeIter<'root, N, V: ?Sized, D> {
2424
leading_path: PathBuf,
25-
stack: Vec<Frame<'a, N, V>>,
25+
stack: Vec<Frame<'root, N, V>>,
2626
marker: std::marker::PhantomData<D>,
2727
}
2828

2929
/// An iterator over the key-value pairs in a key-value trie.
3030
#[derive(Debug)]
3131
#[must_use = "iterators are lazy and do nothing unless consumed"]
32-
pub struct TrieValueIter<'a, N: ?Sized, V: ?Sized, D> {
33-
edges: TrieEdgeIter<'a, N, V, D>,
32+
pub struct TrieValueIter<'root, N, V: ?Sized, D> {
33+
edges: TrieEdgeIter<'root, N, V, D>,
3434
}
3535

3636
#[derive(Debug)]
37-
struct Frame<'a, N: ?Sized, V: ?Sized> {
38-
node: &'a N,
39-
hash: Option<&'a HashType>,
37+
struct Frame<'root, N, V: ?Sized> {
38+
node: N,
39+
hash: Option<&'root HashType>,
4040
leading_path_len: usize,
4141
children: Option<std::array::IntoIter<PathComponent, { PathComponent::LEN }>>,
4242
marker: std::marker::PhantomData<V>,
4343
}
4444

45-
impl<'a, N, V, D> TrieEdgeIter<'a, N, V, D>
45+
impl<'root, N, V, D> TrieEdgeIter<'root, N, V, D>
4646
where
47-
N: TrieNode<V> + ?Sized,
48-
V: AsRef<[u8]> + ?Sized,
47+
N: TrieNode<'root, V>,
48+
V: AsRef<[u8]> + ?Sized + 'root,
4949
{
5050
/// Creates a new iterator over the given key-value trie.
51-
pub fn new(root: &'a N, root_hash: Option<&'a HashType>) -> Self {
51+
pub fn new(root: N, root_hash: Option<&'root HashType>) -> Self {
5252
let mut this = Self {
5353
leading_path: PathBuf::new_const(),
5454
stack: Vec::new(),
@@ -60,15 +60,15 @@ where
6060

6161
/// Transforms this iterator into an iterator over the key-value pairs in
6262
/// the trie.
63-
pub const fn node_values(self) -> TrieValueIter<'a, N, V, D> {
63+
pub const fn node_values(self) -> TrieValueIter<'root, N, V, D> {
6464
TrieValueIter { edges: self }
6565
}
6666

6767
fn push_frame(
6868
&mut self,
6969
leading_component: Option<PathComponent>,
70-
node: &'a N,
71-
hash: Option<&'a HashType>,
70+
node: N,
71+
hash: Option<&'root HashType>,
7272
) {
7373
let frame = Frame {
7474
node,
@@ -115,12 +115,12 @@ macro_rules! descend {
115115
};
116116
}
117117

118-
impl<'a, N, V> Iterator for TrieEdgeIter<'a, N, V, IterAscending>
118+
impl<'root, N, V> Iterator for TrieEdgeIter<'root, N, V, IterAscending>
119119
where
120-
N: TrieNode<V> + ?Sized,
121-
V: AsRef<[u8]> + ?Sized,
120+
N: TrieNode<'root, V>,
121+
V: AsRef<[u8]> + ?Sized + 'root,
122122
{
123-
type Item = (PathBuf, TrieEdgeState<'a, N>);
123+
type Item = (PathBuf, TrieEdgeState<'root, N>);
124124

125125
fn next(&mut self) -> Option<Self::Item> {
126126
while let Some(&mut Frame {
@@ -157,12 +157,12 @@ where
157157
}
158158
}
159159

160-
impl<'a, N, V> Iterator for TrieEdgeIter<'a, N, V, IterDescending>
160+
impl<'root, N, V> Iterator for TrieEdgeIter<'root, N, V, IterDescending>
161161
where
162-
N: TrieNode<V> + ?Sized,
163-
V: AsRef<[u8]> + ?Sized,
162+
N: TrieNode<'root, V>,
163+
V: AsRef<[u8]> + ?Sized + 'root,
164164
{
165-
type Item = (PathBuf, TrieEdgeState<'a, N>);
165+
type Item = (PathBuf, TrieEdgeState<'root, N>);
166166

167167
fn next(&mut self) -> Option<Self::Item> {
168168
while let Some(&mut Frame {
@@ -192,25 +192,25 @@ where
192192
}
193193
}
194194

195-
impl<'a, N, V> Iterator for TrieValueIter<'a, N, V, IterAscending>
195+
impl<'root, N, V> Iterator for TrieValueIter<'root, N, V, IterAscending>
196196
where
197-
N: TrieNode<V> + ?Sized,
198-
V: AsRef<[u8]> + ?Sized + 'a,
197+
N: TrieNode<'root, V>,
198+
V: AsRef<[u8]> + ?Sized + 'root,
199199
{
200-
type Item = (PathBuf, &'a V);
200+
type Item = (PathBuf, &'root V);
201201

202202
fn next(&mut self) -> Option<Self::Item> {
203203
self.edges
204204
.find_map(|(path, node)| node.value().map(|v| (path, v)))
205205
}
206206
}
207207

208-
impl<'a, N, V> Iterator for TrieValueIter<'a, N, V, IterDescending>
208+
impl<'root, N, V> Iterator for TrieValueIter<'root, N, V, IterDescending>
209209
where
210-
N: TrieNode<V> + ?Sized,
211-
V: AsRef<[u8]> + ?Sized + 'a,
210+
N: TrieNode<'root, V>,
211+
V: AsRef<[u8]> + ?Sized + 'root,
212212
{
213-
type Item = (PathBuf, &'a V);
213+
type Item = (PathBuf, &'root V);
214214

215215
fn next(&mut self) -> Option<Self::Item> {
216216
self.edges
@@ -220,7 +220,7 @@ where
220220

221221
// auto-derived implementations would require N: Clone, V: Clone which is too much
222222

223-
impl<N: ?Sized, V: ?Sized, D> Clone for TrieEdgeIter<'_, N, V, D> {
223+
impl<N: Copy, V: ?Sized, D> Clone for TrieEdgeIter<'_, N, V, D> {
224224
fn clone(&self) -> Self {
225225
Self {
226226
leading_path: self.leading_path.clone(),
@@ -235,7 +235,7 @@ impl<N: ?Sized, V: ?Sized, D> Clone for TrieEdgeIter<'_, N, V, D> {
235235
}
236236
}
237237

238-
impl<N: ?Sized, V: ?Sized, D> Clone for TrieValueIter<'_, N, V, D> {
238+
impl<N: Copy, V: ?Sized, D> Clone for TrieValueIter<'_, N, V, D> {
239239
fn clone(&self) -> Self {
240240
Self {
241241
edges: self.edges.clone(),
@@ -247,7 +247,7 @@ impl<N: ?Sized, V: ?Sized, D> Clone for TrieValueIter<'_, N, V, D> {
247247
}
248248
}
249249

250-
impl<N: ?Sized, V: ?Sized> Clone for Frame<'_, N, V> {
250+
impl<N: Copy, V: ?Sized> Clone for Frame<'_, N, V> {
251251
fn clone(&self) -> Self {
252252
Self {
253253
node: self.node,

storage/src/tries/kvp.rs

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -279,67 +279,70 @@ impl<'a, T: AsRef<[u8]> + ?Sized> HashedKeyValueTrieRoot<'a, T> {
279279
}
280280
}
281281

282-
impl<T: AsRef<[u8]> + ?Sized> TrieNode<T> for KeyValueTrieRoot<'_, T> {
283-
type PartialPath<'a>
284-
= PackedPathRef<'a>
285-
where
286-
Self: 'a;
282+
impl<'root, T> TrieNode<'root, T> for &'root KeyValueTrieRoot<'root, T>
283+
where
284+
T: AsRef<[u8]> + ?Sized + 'root,
285+
{
286+
type PartialPath = PackedPathRef<'root>;
287287

288-
fn partial_path(&self) -> Self::PartialPath<'_> {
288+
fn partial_path(self) -> Self::PartialPath {
289289
self.partial_path
290290
}
291291

292-
fn value(&self) -> Option<&T> {
292+
fn value(self) -> Option<&'root T> {
293293
self.value
294294
}
295295

296-
fn child_hash(&self, pc: PathComponent) -> Option<&HashType> {
296+
fn child_hash(self, pc: PathComponent) -> Option<&'root HashType> {
297297
let _ = pc;
298298
None
299299
}
300300

301-
fn child_node(&self, pc: PathComponent) -> Option<&Self> {
301+
fn child_node(self, pc: PathComponent) -> Option<Self> {
302302
self.children[pc].as_deref()
303303
}
304304

305-
fn child_state(&self, pc: PathComponent) -> Option<super::TrieEdgeState<'_, Self>> {
305+
fn child_state(self, pc: PathComponent) -> Option<super::TrieEdgeState<'root, Self>> {
306306
self.children[pc]
307307
.as_deref()
308308
.map(|node| super::TrieEdgeState::UnhashedChild { node })
309309
}
310310
}
311311

312-
impl<T: AsRef<[u8]> + ?Sized> TrieNode<T> for HashedKeyValueTrieRoot<'_, T> {
313-
type PartialPath<'a>
314-
= PackedPathRef<'a>
315-
where
316-
Self: 'a;
312+
impl<'root, T> TrieNode<'root, T> for &'root HashedKeyValueTrieRoot<'root, T>
313+
where
314+
T: AsRef<[u8]> + ?Sized + 'root,
315+
{
316+
type PartialPath = PackedPathRef<'root>;
317317

318-
fn partial_path(&self) -> Self::PartialPath<'_> {
318+
fn partial_path(self) -> Self::PartialPath {
319319
self.partial_path
320320
}
321321

322-
fn value(&self) -> Option<&T> {
322+
fn value(self) -> Option<&'root T> {
323323
self.value
324324
}
325325

326-
fn child_hash(&self, pc: PathComponent) -> Option<&HashType> {
326+
fn child_hash(self, pc: PathComponent) -> Option<&'root HashType> {
327327
self.children[pc].as_deref().map(|c| &c.computed)
328328
}
329329

330-
fn child_node(&self, pc: PathComponent) -> Option<&Self> {
330+
fn child_node(self, pc: PathComponent) -> Option<Self> {
331331
self.children[pc].as_deref()
332332
}
333333

334-
fn child_state(&self, pc: PathComponent) -> Option<super::TrieEdgeState<'_, Self>> {
334+
fn child_state(self, pc: PathComponent) -> Option<super::TrieEdgeState<'root, Self>> {
335335
self.children[pc]
336336
.as_deref()
337337
.map(|node| super::TrieEdgeState::from_node(node, Some(&node.computed)))
338338
}
339339
}
340340

341-
impl<T: AsRef<[u8]> + ?Sized> HashedTrieNode<T> for HashedKeyValueTrieRoot<'_, T> {
342-
fn computed(&self) -> &HashType {
341+
impl<'root, T> HashedTrieNode<'root, T> for &'root HashedKeyValueTrieRoot<'root, T>
342+
where
343+
T: AsRef<[u8]> + ?Sized + 'root,
344+
{
345+
fn computed(self) -> &'root HashType {
343346
&self.computed
344347
}
345348
}

0 commit comments

Comments
 (0)