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
100
101
102
103
104
105
106
107
#[allow(unused_macros)]
macro_rules! sub_tree {
($arena:expr, $parent:expr) => ();
($arena:expr, $parent:expr,) => ();
($arena:expr, $parent:expr, , $($token:tt)*) => (
sub_tree!($arena, $parent, $($token)*)
);
($arena:expr, $parent:expr, $key:expr) => ({
let node = $crate::Node::new($key, $arena);
$parent.append(&node, $arena);
});
($arena:expr, $parent:expr, $key:expr, $($token:tt)*) => ({
let node = $crate::Node::new($key, $arena);
$parent.append(&node, $arena);
sub_tree!($arena, $parent, $($token)*);
});
($arena:expr, $parent:expr, $key:expr => [$($value:tt)*] $($token:tt)*) => ({
let node = $crate::Node::new($key, $arena);
$parent.append(&node.clone(), $arena);
sub_tree!($arena, node, $($value)*);
sub_tree!($arena, $parent, $($token)*);
});
}
#[macro_export]
macro_rules! tree {
($arena:expr, $root_node:expr) => ({
$crate::Node::new($root_node, $arena)
});
($arena:expr, $root_node:expr => []) => ({
tree!($arena, $root_node)
});
($arena:expr, $key:expr => [$($value:tt)+]) => ({
let parent = $crate::Node::new($key, $arena);
sub_tree!($arena, parent, $($value)+);
parent
})
}
#[cfg(test)]
mod tests {
use ::node_arena::NodeArena;
#[test]
fn tree_macro() {
let ref arena = NodeArena::new();
let root = tree!(
arena,
1 => [
2,
3 => [4, 5],
6 => [
7 => [8 => []],
9 => [10 => [11]]],
12
]
);
let elements = root
.depth_first_traverse(arena)
.map(|v| *v.read())
.collect::<Vec<_>>();
let expected = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
assert_eq!(elements, expected);
let root = tree!(arena, 1 => [,]);
let elements = root
.depth_first_traverse(arena)
.map(|v| *v.read())
.collect::<Vec<_>>();
let expected = vec![1];
assert_eq!(elements, expected);
}
}