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}