pptree/
lib.rs

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}