1#[allow(unused_macros)]
2macro_rules! sub_tree {
3 ($arena:expr, $parent:expr) => ();
4 ($arena:expr, $parent:expr,) => ();
5
6 ($arena:expr, $parent:expr, , $($token:tt)*) => (
7 sub_tree!($arena, $parent, $($token)*)
8 );
9
10 ($arena:expr, $parent:expr, $key:expr) => ({
11 let node = $crate::Node::new($key, $arena);
12 $parent.append(&node, $arena);
13 });
14
15 ($arena:expr, $parent:expr, $key:expr, $($token:tt)*) => ({
16 let node = $crate::Node::new($key, $arena);
17 $parent.append(&node, $arena);
18
19 sub_tree!($arena, $parent, $($token)*);
20 });
21
22 ($arena:expr, $parent:expr, $key:expr => [$($value:tt)*] $($token:tt)*) => ({
23 let node = $crate::Node::new($key, $arena);
24 $parent.append(&node.clone(), $arena);
25
26 sub_tree!($arena, node, $($value)*);
27
28 sub_tree!($arena, $parent, $($token)*);
29 });
30}
31
32#[macro_export]
54macro_rules! tree {
55 ($arena:expr, $root_node:expr) => ({
56 $crate::Node::new($root_node, $arena)
57 });
58
59 ($arena:expr, $root_node:expr => []) => ({
60 tree!($arena, $root_node)
61 });
62
63 ($arena:expr, $key:expr => [$($value:tt)+]) => ({
64 let parent = $crate::Node::new($key, $arena);
65
66 sub_tree!($arena, parent, $($value)+);
67
68 parent
69 })
70}
71
72#[cfg(test)]
73mod tests {
74 use ::node_arena::NodeArena;
75
76 #[test]
77 fn tree_macro() {
78 let ref arena = NodeArena::new();
79
80 let root = tree!(
81 arena,
82 1 => [
83 2,
84 3 => [4, 5],
85 6 => [
86 7 => [8 => []],
87 9 => [10 => [11]]],
88 12
89 ]
90 );
91
92 let elements = root
93 .depth_first_traverse(arena)
94 .map(|v| *v.read())
95 .collect::<Vec<_>>();
96 let expected = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
97 assert_eq!(elements, expected);
98
99 let root = tree!(arena, 1 => [,]);
100 let elements = root
101 .depth_first_traverse(arena)
102 .map(|v| *v.read())
103 .collect::<Vec<_>>();
104 let expected = vec![1];
105 assert_eq!(elements, expected);
106 }
107}