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
|
// run-pass
#![feature(macro_metavar_expr)]
#[derive(Debug)]
struct Example<'a> {
_indexes: &'a [(u32, u32)],
_counts: &'a [u32],
_nested: Vec<Example<'a>>,
}
macro_rules! example {
( $( [ $( ( $( $x:ident )* ) )* ] )* ) => {
Example {
_indexes: &[],
_counts: &[${count($x, 0)}, ${count($x, 1)}, ${count($x, 2)}],
_nested: vec![
$(
Example {
_indexes: &[(${index()}, ${length()})],
_counts: &[${count($x, 0)}, ${count($x, 1)}],
_nested: vec![
$(
Example {
_indexes: &[(${index(1)}, ${length(1)}), (${index()}, ${length()})],
_counts: &[${count($x)}],
_nested: vec![
$(
Example {
_indexes: &[
(${index(2)}, ${length(2)}),
(${index(1)}, ${length(1)}),
(${index()}, ${length()})
],
_counts: &[],
_nested: vec![],
${ignore($x)}
}
),*
]
}
),*
]
}
),*
]
}
};
}
static EXPECTED: &str = concat!(
"Example { _indexes: [], _counts: [13, 4, 2], _nested: [",
concat!(
"Example { _indexes: [(0, 2)], _counts: [10, 3], _nested: [",
concat!(
"Example { _indexes: [(0, 2), (0, 3)], _counts: [4], _nested: [",
concat!(
"Example { _indexes: [(0, 2), (0, 3), (0, 4)], _counts: [], _nested: [] }, ",
"Example { _indexes: [(0, 2), (0, 3), (1, 4)], _counts: [], _nested: [] }, ",
"Example { _indexes: [(0, 2), (0, 3), (2, 4)], _counts: [], _nested: [] }, ",
"Example { _indexes: [(0, 2), (0, 3), (3, 4)], _counts: [], _nested: [] }",
),
"] }, ",
"Example { _indexes: [(0, 2), (1, 3)], _counts: [4], _nested: [",
concat!(
"Example { _indexes: [(0, 2), (1, 3), (0, 4)], _counts: [], _nested: [] }, ",
"Example { _indexes: [(0, 2), (1, 3), (1, 4)], _counts: [], _nested: [] }, ",
"Example { _indexes: [(0, 2), (1, 3), (2, 4)], _counts: [], _nested: [] }, ",
"Example { _indexes: [(0, 2), (1, 3), (3, 4)], _counts: [], _nested: [] }",
),
"] }, ",
"Example { _indexes: [(0, 2), (2, 3)], _counts: [2], _nested: [",
concat!(
"Example { _indexes: [(0, 2), (2, 3), (0, 2)], _counts: [], _nested: [] }, ",
"Example { _indexes: [(0, 2), (2, 3), (1, 2)], _counts: [], _nested: [] }",
),
"] }",
),
"] }, ",
"Example { _indexes: [(1, 2)], _counts: [3, 1], _nested: [",
concat!(
"Example { _indexes: [(1, 2), (0, 1)], _counts: [3], _nested: [",
concat!(
"Example { _indexes: [(1, 2), (0, 1), (0, 3)], _counts: [], _nested: [] }, ",
"Example { _indexes: [(1, 2), (0, 1), (1, 3)], _counts: [], _nested: [] }, ",
"Example { _indexes: [(1, 2), (0, 1), (2, 3)], _counts: [], _nested: [] }",
),
"] }",
),
"] }",
),
"] }",
);
fn main() {
let e = example! {
[ ( A B C D ) ( E F G H ) ( I J ) ]
[ ( K L M ) ]
};
let debug = format!("{:?}", e);
assert_eq!(debug, EXPECTED);
}
|