diff options
Diffstat (limited to 'src/ntree.rs')
| -rw-r--r-- | src/ntree.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/ntree.rs b/src/ntree.rs new file mode 100644 index 0000000..26c241c --- /dev/null +++ b/src/ntree.rs @@ -0,0 +1,81 @@ + +#[derive(Clone)] +pub struct NTreeNode<T> +{ + value: T, + children: Vec<NTreeNode<T>> + +} + +#[derive(Default, Clone)] +pub struct NTree<T> +{ + root: Option<NTreeNode<T>> +} + +impl<T> NTree<T> +{ + pub fn set_root_val( + &mut self, + val: T) + { + self.root = Some(NTreeNode { value: val, children: vec![] }); + } + + pub fn set_root( + &mut self, + node: NTreeNode<T>) + { + self.root = Some(node); + } + + pub fn root(&self) -> &Option<NTreeNode<T>> { &self.root } + pub fn root_mut(&mut self) -> &mut Option<NTreeNode<T>> { &mut self.root } +} + +impl<T> NTreeNode<T> +{ + pub fn new(val: T) + -> Self + { + Self { + value: val, + children: vec![] + } + } + + pub fn value(&self) -> &T { &self.value } + pub fn value_mut(&mut self) -> &mut T { &mut self.value } + + pub fn children(&self) -> &[NTreeNode<T>] { &self.children.as_slice() } + + pub fn as_tree(self) + -> NTree<T> + { + NTree { root: Some(self) } + } + + pub fn insert_value( + &mut self, + val: T) + { + self.children.push(NTreeNode { value: val, children: vec![] }); + } + + pub fn insert_node( + &mut self, + subtree: NTreeNode<T>) + { + self.children.push(subtree); + } + + pub fn insert_tree( + &mut self, + subtree: NTree<T>) + { + match subtree.root { + Some(subtree_root) => self.insert_node(subtree_root), + None => { panic!("Tried to put null subtree") } + } + } +} |
