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