flange_flat_tree/tree/flange/
flanged_tree.rs

1use crate::navigator::Navigator;
2use crate::tree::subtree::subtree_impl::SubtreeImpl;
3use crate::tree::tree_data::TreeData;
4use crate::{Subtree, Tree};
5
6pub struct FlangedTree<TD, A>
7where
8    TD: TreeData,
9{
10    base: TD,
11    data: Vec<A>,
12}
13
14impl<TD, A> FlangedTree<TD, A>
15where
16    TD: TreeData,
17{
18    pub fn new(base: TD, data: Vec<A>) -> Self {
19        FlangedTree { base, data }
20    }
21
22    pub fn replace_map_flange<'a, B, F>(&'a self, mapf: F) -> FlangedTree<TD, B>
23    where
24        F: Fn(<FlangedTree<TD, A> as Tree<'a>>::Node) -> B,
25    {
26        // Uninitialized vector
27        let mut res = Vec::with_capacity(self.node_count());
28
29        self.for_each(|s| {
30            res.push(mapf(s.value()));
31        });
32        FlangedTree::new(self.base, res)
33    }
34
35    pub fn get_flange(&self, index: usize) -> &A {
36        &self.data[index]
37    }
38
39    pub fn get_flange_mut(&mut self, index: usize) -> &mut A {
40        &mut self.data[index]
41    }
42}
43
44impl<'a, TD, Node, A> TreeData for &'a FlangedTree<TD, A>
45where
46    TD: TreeData<Node = Node>,
47{
48    type Node = (Node, &'a A);
49
50    fn get(self, index: usize) -> Self::Node {
51        (self.base.get(index), &self.data[index])
52    }
53
54    fn count(self) -> usize {
55        self.base.count()
56    }
57
58    fn get_nav(&self) -> &Navigator {
59        self.base.get_nav()
60    }
61}
62
63impl<'a, TD, A> Tree<'a> for FlangedTree<TD, A>
64where
65    A: 'a,
66    TD: TreeData + 'a,
67{
68    type Node = (TD::Node, &'a A);
69    type SubtreeType = SubtreeImpl<&'a FlangedTree<TD, A>>;
70
71    fn at_pos(&'a self, index: usize) -> Self::SubtreeType {
72        SubtreeImpl::new(self, index)
73    }
74    fn get_nav(&self) -> &Navigator {
75        self.base.get_nav()
76    }
77}