orx_tree/traversal/depth_first/
dfs_enumeration.rs1use crate::traversal::enumeration::Enumeration;
2use crate::traversal::enumerations::{DepthSiblingIdxVal, DepthVal, SiblingIdxVal, Val};
3
4pub trait DepthFirstEnumeration: Enumeration {
5 fn from_root<D>(root: D) -> Self::Item<D>;
6
7 fn node_value<D>(element: &Self::Item<D>) -> &D;
8
9 fn children<D>(
10 parent: &Self::Item<D>,
11 children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
12 ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator;
13}
14
15impl DepthFirstEnumeration for Val {
18 fn from_root<D>(root: D) -> Self::Item<D> {
19 root
20 }
21
22 #[inline(always)]
23 fn node_value<D>(element: &Self::Item<D>) -> &D {
24 element
25 }
26
27 #[inline(always)]
28 fn children<D>(
29 _: &Self::Item<D>,
30 children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
31 ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator {
32 children_data
33 }
34}
35
36impl DepthFirstEnumeration for DepthVal {
37 fn from_root<D>(root: D) -> Self::Item<D> {
38 (0, root)
39 }
40
41 #[inline(always)]
42 fn node_value<D>(element: &Self::Item<D>) -> &D {
43 &element.1
44 }
45
46 #[inline(always)]
47 fn children<D>(
48 parent: &Self::Item<D>,
49 children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
50 ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator {
51 let depth = parent.0 + 1;
52 children_data.map(move |data| (depth, data))
53 }
54}
55
56impl DepthFirstEnumeration for SiblingIdxVal {
57 fn from_root<D>(root: D) -> Self::Item<D> {
58 (0, root)
59 }
60
61 #[inline(always)]
62 fn node_value<D>(element: &Self::Item<D>) -> &D {
63 &element.1
64 }
65
66 #[inline(always)]
67 fn children<D>(
68 _: &Self::Item<D>,
69 children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
70 ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator {
71 children_data.enumerate()
72 }
73}
74
75impl DepthFirstEnumeration for DepthSiblingIdxVal {
76 fn from_root<D>(root: D) -> Self::Item<D> {
77 (0, 0, root)
78 }
79
80 #[inline(always)]
81 fn node_value<D>(element: &Self::Item<D>) -> &D {
82 &element.2
83 }
84
85 #[inline(always)]
86 fn children<D>(
87 parent: &Self::Item<D>,
88 children_data: impl DoubleEndedIterator<Item = D> + ExactSizeIterator,
89 ) -> impl DoubleEndedIterator<Item = Self::Item<D>> + ExactSizeIterator {
90 let depth = parent.0 + 1;
91 children_data
92 .enumerate()
93 .map(move |(sibling_idx, data)| (depth, sibling_idx, data))
94 }
95}