synctree/
macros.rs

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/// Creates a tree.
33///
34/// # Examples
35///
36/// ```ignore
37/// let root = tree!(
38///     arena,
39///     1 => [
40///         2,
41///         3 => [4, 5],
42///         6 => [
43///             7 => [8 => []],
44///             9 => [10 => [11]]],
45///         12
46///     ]
47/// );
48/// ```
49///
50/// ```ignore
51/// let root = tree!(arena, 1);
52/// ```
53#[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}