orx_tree/iter/
ancestors.rs1use crate::TreeVariant;
2use orx_selfref_col::NodePtr;
3
4pub struct AncestorsIterPtr<V>
7where
8 V: TreeVariant,
9{
10 root_ptr: NodePtr<V>,
11 current: Option<NodePtr<V>>,
12}
13
14impl<V: TreeVariant> AncestorsIterPtr<V> {
15 pub(crate) fn new(root_ptr: NodePtr<V>, descendant_ptr: NodePtr<V>) -> Self {
16 Self {
17 root_ptr,
18 current: Some(descendant_ptr),
19 }
20 }
21}
22
23impl<V: TreeVariant> Iterator for AncestorsIterPtr<V> {
24 type Item = NodePtr<V>;
25
26 fn next(&mut self) -> Option<Self::Item> {
27 self.current.clone().map(|ptr| {
28 let node = unsafe { &*ptr.ptr() };
29
30 self.current = match ptr == self.root_ptr {
31 false => node.prev().get().cloned(),
32 true => None,
33 };
34
35 ptr
36 })
37 }
38}