orx_tree/traversal/
enumeration.rs

1use super::{node_item::NodeItem, node_item_mut::NodeItemMut};
2use crate::{TreeVariant, aliases::Col, memory::MemoryPolicy, pinned_storage::PinnedStorage};
3use orx_selfref_col::NodePtr;
4
5pub trait Enumeration: Clone {
6    type Item<D>;
7
8    fn map_node_data<D, M, E>(element: Self::Item<D>, map: M) -> Self::Item<E>
9    where
10        M: FnOnce(D) -> E;
11
12    fn node_data<D>(element: &Self::Item<D>) -> &D;
13
14    fn from_element_ptr<'a, V, M, P, D>(
15        col: &'a Col<V, M, P>,
16        element_ptr: Self::Item<NodePtr<V>>,
17    ) -> Self::Item<D>
18    where
19        V: TreeVariant,
20        M: MemoryPolicy,
21        P: PinnedStorage,
22        D: NodeItem<'a, V, M, P>,
23    {
24        let map = |ptr| D::from_ptr(col, ptr);
25        Self::map_node_data(element_ptr, map)
26    }
27
28    fn from_element_ptr_mut<'a, V, M, P, E>(
29        col: &'a Col<V, M, P>,
30        element_ptr: Self::Item<NodePtr<V>>,
31    ) -> Self::Item<E>
32    where
33        V: TreeVariant,
34        M: MemoryPolicy,
35        P: PinnedStorage,
36        E: NodeItemMut<'a, V, M, P>,
37    {
38        let map = |ptr: NodePtr<V>| E::from_ptr(col, ptr);
39        Self::map_node_data(element_ptr, map)
40    }
41}