save tree borrow lifetime in range/iter

This commit is contained in:
Janis 2023-04-05 00:55:20 +02:00
parent e0b1ddf3f6
commit a1a5b08970
2 changed files with 18 additions and 14 deletions

View file

@ -1,5 +1,6 @@
use core::cell::Cell; use core::cell::Cell;
use core::fmt::Display; use core::fmt::Display;
use core::marker::PhantomData;
use core::mem::size_of; use core::mem::size_of;
use core::ops::Deref; use core::ops::Deref;
@ -166,10 +167,11 @@ impl Display for NodeHandle {
} }
#[derive(Debug)] #[derive(Debug)]
pub struct Range<R: super::Read> { pub struct Range<'tree, R: super::Read> {
volume: Rc<Volume<R>>, volume: Rc<Volume<R>>,
pub(crate) start: RootOrEdge, pub(crate) start: RootOrEdge,
pub(crate) end: RootOrEdge, pub(crate) end: RootOrEdge,
phantom: PhantomData<&'tree ()>,
} }
#[derive(Derivative)] #[derive(Derivative)]
@ -282,7 +284,7 @@ impl<R: super::Read> Tree<R> {
)) ))
} }
pub fn iter(&self) -> Range<R> { pub fn iter(&self) -> Range<'_, R> {
Range::new(self.volume.clone(), self.root.clone(), self.root.clone()) Range::new(self.volume.clone(), self.root.clone(), self.root.clone())
} }
} }
@ -572,7 +574,7 @@ impl Node {
} }
} }
impl<R> Range<R> impl<'tree, R> Range<'tree, R>
where where
R: super::Read, R: super::Read,
{ {
@ -581,6 +583,7 @@ where
volume, volume,
start: RootOrEdge::Root(start), start: RootOrEdge::Root(start),
end: RootOrEdge::Root(end), end: RootOrEdge::Root(end),
phantom: PhantomData,
} }
} }
@ -593,7 +596,7 @@ where
} }
} }
impl<R> Iterator for Range<R> impl<'tree, R> Iterator for Range<'tree, R>
where where
R: super::Read, R: super::Read,
{ {
@ -620,7 +623,7 @@ where
} }
} }
impl<R> DoubleEndedIterator for Range<R> impl<'tree, R> DoubleEndedIterator for Range<'tree, R>
where where
R: super::Read, R: super::Read,
{ {

View file

@ -371,15 +371,13 @@ impl<R: super::Read> Fs<R> {
} }
} }
pub fn get_inode_children_inodes<'a>( pub fn get_inode_children_inodes(
&self, &self,
inode: &'a INode, inode: &INode,
) -> Result<impl Iterator<Item = INode> + 'a> ) -> Result<impl Iterator<Item = INode> + '_> {
where let inode = inode.clone();
R: 'a, self.get_inode_children(&inode).map(|children| {
{ children.map(move |child| {
self.get_inode_children(inode).map(|children| {
children.map(|child| {
let id: u64 = child.item().location.id().into(); let id: u64 = child.item().location.id().into();
inode.clone().into_child(id, child.into_name()) inode.clone().into_child(id, child.into_name())
@ -387,7 +385,10 @@ impl<R: super::Read> Fs<R> {
}) })
} }
pub fn get_inode_children(&self, inode: &INode) -> Result<impl Iterator<Item = DirItemEntry>> { pub fn get_inode_children(
&self,
inode: &INode,
) -> Result<impl Iterator<Item = DirItemEntry> + '_> {
let key = PartialKey::new(Some(inode.id()), Some(ObjectType::DirIndex), None); let key = PartialKey::new(Some(inode.id()), Some(ObjectType::DirIndex), None);
let children = self.fs_root.find_range(&key)?; let children = self.fs_root.find_range(&key)?;