1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
pub struct Node<T> { nodes: *mut Tree<T>, parent: Option<*const Node<T>>, value: T, } impl<T> Node<T> { fn new(nodes: *mut Tree<T>, parent: Option<*const Node<T>>, value: T) -> Self { Node { nodes: nodes, parent: parent, value: value, } } pub fn push(&self, val: T) -> &Node<T> { let node = Node::new(self.nodes, Some(self), val); unsafe { let nodes = &mut *self.nodes; nodes.values.push(node); nodes.values.last().unwrap() } } pub fn value(&self) -> &T { &self.value } pub fn parent(&self) -> Option<&Node<T>> { unsafe { self.parent.map(|p| &*p) } } pub fn iter(&self) -> NodeIter<T> { NodeIter { node: Some(self) } } } pub struct NodeIter<'a, T: 'a> { node: Option<&'a Node<T>>, } impl<'a, T> Iterator for NodeIter<'a, T> { type Item = &'a T; fn next(&mut self) -> Option<&'a T> { self.node.map(|n| { self.node = n.parent(); &n.value }) } } struct Tree<T> { values: Vec<Node<T>>, } impl<T> Tree<T> { fn new() -> Self { Tree { values: Vec::new() } } } pub struct PPTree<T> { tree: Box<Tree<T>>, } impl<T> PPTree<T> { pub fn new(val: T) -> Self { let mut tree = Box::from(Tree::new()); let node = Node::new(&mut *tree, None, val); tree.values.push(node); PPTree { tree: tree } } pub fn root(&self) -> &Node<T> { &self.tree.values[0] } } #[test] fn test() { let tree = PPTree::new(0); let root = tree.root(); let x = root.push(1).push(2).push(3); let y = root.push(2).push(5); for v in x.iter() { println!("{:?}", v); } println!("{:?}", y.iter().collect::<Vec<_>>()); }