socarel/
forest.rs

1use std::collections::HashMap as Map;
2use std::collections::hash_map::Iter;
3use crate::node::*;
4use crate::tree::*;
5
6//---- Structs ----//
7
8/// A forest is a set of trees.
9#[derive(Debug)]
10pub struct Forest<T: NodeContent = RawNode> {
11    /// Map with all the trees contained in the Forest.
12    trees: Map<String, Tree<T>>
13}
14
15//---- Implementations ----//
16
17impl<T: NodeContent> Forest<T> {
18    /// Create an empty forest.
19    pub fn new() -> Self {
20        Self {
21            trees: Map::new()
22        }
23    }
24
25    /// Create new empty tree.
26    /// 
27    /// # Arguments
28    /// 
29    /// * `name` - Tree name.
30    /// 
31    /// # Return
32    /// 
33    /// * Nothing.
34    /// 
35    pub fn new_tree(&mut self, name: &str) {
36        self.add_tree(name, Tree::new());
37    }
38
39    /// Add a tree to forest.
40    /// 
41    /// # Arguments
42    /// 
43    /// * `name` - Tree name.
44    /// * `forest` - Tree struct.
45    /// 
46    /// # Return
47    /// 
48    /// * Nothing.
49    /// 
50    pub fn add_tree(&mut self, name: &str, tree: Tree<T>) {
51        self.trees.insert(String::from(name), tree);
52    }
53
54    /// Remove tree from the forest.
55    /// 
56    /// # Arguments
57    /// 
58    /// * `name` - Tree name.
59    /// 
60    /// # Return
61    /// 
62    /// * An [`Option`] with the removed tree.
63    /// 
64    pub fn remove_tree(&mut self, name: &str) -> Option<Tree<T>> {
65        return self.trees.remove(name);
66    }
67
68    /// Get tree reference.
69    /// 
70    /// # Arguments
71    /// 
72    /// * `name` - Tree name.
73    /// 
74    /// # Return
75    /// 
76    /// * An [`Option`] with the tree reference.
77    /// 
78    pub fn get_tree(&self, name: &str) -> Option<&Tree<T>> {
79        if let Some(t) = self.trees.get(name) {
80            Some(t)
81        }
82        else {
83            None
84        }
85    }
86
87    /// Get mutable tree reference.
88    /// 
89    /// # Arguments
90    /// 
91    /// * `name` - Tree name.
92    /// 
93    /// # Return
94    /// 
95    /// * An [`Option`] with the mut tree reference.
96    /// 
97    pub fn get_mut_tree(&mut self, name: &str) -> Option<&mut Tree<T>> {
98        if let Some(t) = self.trees.get_mut(name) {
99            Some(t)
100        }
101        else {
102            None
103        }
104    }
105
106    /// Get forest iterator.
107    /// 
108    /// # Return
109    /// 
110    /// * Iterator, provides a tuple with tree_name<[`String`]>, tree_struct<[`Tree`]>.
111    /// 
112    pub fn iter(&self) -> Iter<String, Tree<T>> {
113        self.trees.iter()
114    }
115}