orx_tree/subtrees/
cloned_subtree.rs1use 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}