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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#[cfg(all(const_generics, doctest))]
#[macro_use]
extern crate doc_comment;
#[cfg(all(const_generics, doctest))]
doctest!("../README.md");
#[doc(hidden)]
#[macro_export(local_inner_macros)]
macro_rules! __generate_assoc_const {
(
$callback:ident @parsed
< $($generic_ty:ident $( : $lft_bound:lifetime )? ),* > < $(const $generic_const:ident : $generic_const_ty:ty),* >
[ $t:ty ] $e:expr ;
$($cont:tt)*
) => {{
struct Const<$($generic_ty $(: $lft_bound)?,)* $(const $generic_const: $generic_const_ty,)*>($(*mut $generic_ty),*);
impl<$($generic_ty $(: $lft_bound)?,)* $(const $generic_const: $generic_const_ty,)*> Const<$($generic_ty,)* $($generic_const,)*> {
const C: $t = $e;
}
$callback!(Const::<$($generic_ty,)* $($generic_const,)*>::C, $($cont)*)
}};
(
$callback:ident @parse
< $($generic_ty:ident $( : $lft_bound:lifetime )? ),+ ; $(const $generic_const:ident : $generic_const_ty:ty),+ $(,)? >
$($cont:tt)*
) => {
__generate_assoc_const!($callback @parsed <$($generic_ty $(: $lft_bound)? ),*> <$(const $generic_const: $generic_const_ty),*> $($cont)*)
};
(
$callback:ident @parse < $(const $generic_const:ident : $generic_const_ty:ty),+ $(,)? >
$($cont:tt)*
) => {
__generate_assoc_const!($callback @parsed <> <$(const $generic_const: $generic_const_ty),*> $($cont)*)
};
(
$callback:ident @parse < $($generic_ty:ident $( : $lft_bound:lifetime )? ),* $(,)? >
$($cont:tt)*
) => {
__generate_assoc_const!($callback @parsed <$($generic_ty $(: $lft_bound)? ),*> <> $($cont)*)
};
(
$callback:ident @parse [ $t:ty ] $($cont:tt)*
) => {
__generate_assoc_const!($callback @parsed <> <> [$t] $($cont)*)
};
}
#[macro_export(local_inner_macros)]
macro_rules! inline_const {
( $($params:tt)* ) => {
__generate_assoc_const!(__inline_const_callback @parse $($params)* ; @emp)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __inline_const_callback {
($const:path, @emp) => {
$const
}
}
#[macro_export(local_inner_macros)]
macro_rules! const_array {
( $($params:tt)* ) => {
__generate_assoc_const!(__const_array_callback @parse $($params)*)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __const_array_callback {
($const:path, $N:expr) => {
[$const; $N]
}
}