orx_tree/subtrees/
cloned_subtree.rs

1use super::subtree::sealed::SubTreeCore;
2use crate::{
3    Dfs, MemoryPolicy, NodeRef, TreeVariant,
4    pinned_storage::PinnedStorage,
5    traversal::{over::OverDepthPtr, traverser_core::TraverserCore},
6};
7use core::marker::PhantomData;
8use orx_selfref_col::NodePtr;
9
10pub struct ClonedSubTree<'a, V, M, P, N>
11where
12    V: TreeVariant + 'a,
13    M: MemoryPolicy,
14    P: PinnedStorage,
15    N: NodeRef<'a, V, M, P>,
16    V::Item: Clone,
17{
18    node: N,
19    phantom: PhantomData<&'a (V, M, P)>,
20}
21
22impl<'a, V, M, P, N> ClonedSubTree<'a, V, M, P, N>
23where
24    V: TreeVariant + 'a,
25    M: MemoryPolicy,
26    P: PinnedStorage,
27    N: NodeRef<'a, V, M, P>,
28    V::Item: Clone,
29{
30    pub(crate) fn new(node: N) -> Self {
31        Self {
32            node,
33            phantom: PhantomData,
34        }
35    }
36}
37
38impl<'a, V, M, P, N> SubTreeCore<V> for ClonedSubTree<'a, V, M, P, N>
39where
40    V: TreeVariant + 'a,
41    M: MemoryPolicy,
42    P: PinnedStorage,
43    N: NodeRef<'a, V, M, P>,
44    V::Item: Clone,
45{
46    fn root_ptr(&self) -> NodePtr<V> {
47        self.node.node_ptr().clone()
48    }
49
50    fn root_parent_ptr(&self) -> Option<NodePtr<V>> {
51        let root = unsafe { &*self.node.node_ptr().ptr() };
52        root.prev().get().cloned()
53    }
54
55    fn root_sibling_idx(&self) -> usize {
56        self.node.sibling_idx()
57    }
58
59    fn create_subtree(&mut self) -> impl IntoIterator<Item = (usize, <V>::Item)> {
60        let ptr = self.node.node_ptr().clone();
61        let iter_ptr = Dfs::<OverDepthPtr>::iter_ptr_with_owned_storage(ptr);
62        iter_ptr.map(|(depth, ptr)| {
63            (
64                depth,
65                unsafe { &*ptr.ptr() }
66                    .data()
67                    .expect("node is active")
68                    .clone(),
69            )
70        })
71    }
72}