select_macro/
lib.rs

1pub mod support;
2
3pub fn thread_rng_n(branches: u32) -> u32{
4    fastrand::u32(0..branches)
5}
6
7#[macro_export]
8macro_rules! select {
9    (@ {
10        start=$start:expr;
11        ( $($count:tt)* )
12        $( ( $($skip:tt)* ) $bind:pat = $fut:expr, if $c:expr => $handle:expr, )+
13
14        ; $else:expr
15
16    }) => {{
17
18        #[doc(hidden)]
19        mod __select_util {
20            $crate::support::select_priv_declare_output_enum!( ( $($count)* ) );
21        }
22
23
24        const BRANCHES: u32 = count!( $($count)* );
25
26        let mut disabled: __select_util::Mask = Default::default();
27
28        $(
29            if !$c {
30                let mask: __select_util::Mask = 1 << count!( $($skip)* );
31                disabled |= mask;
32            }
33        )*
34
35        let output = {
36            let mut futures = ( $( $fut , )+ );
37
38            let futures = &mut futures;
39
40            $crate::support::poll_fn(|cx| {
41                let mut is_pending = false;
42                let start = $start;
43
44                for i in 0..BRANCHES {
45                    let branch;
46                    #[allow(clippy::modulo_one)]
47                    {
48                        branch = (start + i) % BRANCHES;
49                    }
50                    match branch {
51                        $(
52                            #[allow(unreachable_code)]
53                            count!( $($skip)* ) => {
54                                let mask = 1 << branch;
55
56                                if disabled & mask == mask {
57                                    continue;
58                                }
59
60
61                                let ( $($skip,)* fut, .. ) = &mut *futures;
62
63                                let fut = unsafe { $crate::support::Pin::new_unchecked(fut) };
64
65                                let out = match $crate::support::Future::poll(fut, cx) {
66                                    $crate::support::Poll::Ready(out) => out,
67                                    $crate::support::Poll::Pending => {
68                                        is_pending = true;
69                                        continue;
70                                    }
71                                };
72
73                                disabled |= mask;
74
75                                #[allow(unused_variables)]
76                                #[allow(unused_mut)]
77                                match &out {
78                                    $crate::support::select_priv_clean_pattern!($bind) => {},
79                                    _ => continue,
80                                }
81
82                                return $crate::support::Poll::Ready(select_variant!(__select_util::Out, ($($skip)*))(out));
83                            }
84                        )*
85                        _ => unreachable!("reaching this means there probably is an off by one bug"),
86                    }
87                }
88
89                if is_pending {
90                    $crate::support::Poll::Pending
91                } else {
92                    $crate::support::Poll::Ready(__select_util::Out::Disabled)
93                }
94            }).await
95        };
96
97        match output {
98            $(
99                select_variant!(__select_util::Out, ($($skip)*) ($bind)) => $handle,
100            )*
101            __select_util::Out::Disabled => $else,
102            _ => unreachable!("failed to match bind"),
103        }
104    }};
105
106    // ==== Normalize =====
107
108    // These rules match a single `select!` branch and normalize it for
109    // processing by the first rule.
110
111    (@ { start=$start:expr; $($t:tt)* } ) => {
112        // No `else` branch
113        $crate::select!(@{ start=$start; $($t)*; panic!("all branches are disabled and there is no else branch") })
114    };
115    (@ { start=$start:expr; $($t:tt)* } else => $else:expr $(,)?) => {
116        $crate::select!(@{ start=$start; $($t)*; $else })
117    };
118    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:block, $($r:tt)* ) => {
119        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, } $($r)*)
120    };
121    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:block, $($r:tt)* ) => {
122        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, } $($r)*)
123    };
124    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:block $($r:tt)* ) => {
125        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, } $($r)*)
126    };
127    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:block $($r:tt)* ) => {
128        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, } $($r)*)
129    };
130    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:expr ) => {
131        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, })
132    };
133    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:expr ) => {
134        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, })
135    };
136    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:expr, $($r:tt)* ) => {
137        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, } $($r)*)
138    };
139    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:expr, $($r:tt)* ) => {
140        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, } $($r)*)
141    };
142
143    // ===== Entry point =====
144
145    (biased; $p:pat = $($t:tt)* ) => {
146        $crate::select!(@{ start=0; () } $p = $($t)*)
147    };
148
149    ( $p:pat = $($t:tt)* ) => {
150        // Randomly generate a starting point. This makes `select!` a bit more
151        // fair and avoids always polling the first future.
152        $crate::select!(@{ start={ $crate::thread_rng_n(BRANCHES) }; () } $p = $($t)*)
153    };
154    () => {
155        compile_error!("select! requires at least one branch.")
156    };
157}
158
159#[macro_export]
160macro_rules! count {
161    () => {
162        0
163    };
164    (_) => {
165        1
166    };
167    (_ _) => {
168        2
169    };
170    (_ _ _) => {
171        3
172    };
173    (_ _ _ _) => {
174        4
175    };
176    (_ _ _ _ _) => {
177        5
178    };
179    (_ _ _ _ _ _) => {
180        6
181    };
182    (_ _ _ _ _ _ _) => {
183        7
184    };
185    (_ _ _ _ _ _ _ _) => {
186        8
187    };
188    (_ _ _ _ _ _ _ _ _) => {
189        9
190    };
191    (_ _ _ _ _ _ _ _ _ _) => {
192        10
193    };
194    (_ _ _ _ _ _ _ _ _ _ _) => {
195        11
196    };
197    (_ _ _ _ _ _ _ _ _ _ _ _) => {
198        12
199    };
200    (_ _ _ _ _ _ _ _ _ _ _ _ _) => {
201        13
202    };
203    (_ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
204        14
205    };
206    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
207        15
208    };
209    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
210        16
211    };
212    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
213        17
214    };
215    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
216        18
217    };
218    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
219        19
220    };
221    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
222        20
223    };
224    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
225        21
226    };
227    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
228        22
229    };
230    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
231        23
232    };
233    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
234        24
235    };
236    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
237        25
238    };
239    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
240        26
241    };
242    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
243        27
244    };
245    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
246        28
247    };
248    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
249        29
250    };
251    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
252        30
253    };
254    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
255        31
256    };
257    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
258        32
259    };
260    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
261        33
262    };
263    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
264        34
265    };
266    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
267        35
268    };
269    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
270        36
271    };
272    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
273        37
274    };
275    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
276        38
277    };
278    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
279        39
280    };
281    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
282        40
283    };
284    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
285        41
286    };
287    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
288        42
289    };
290    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
291        43
292    };
293    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
294        44
295    };
296    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
297        45
298    };
299    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
300        46
301    };
302    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
303        47
304    };
305    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
306        48
307    };
308    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
309        49
310    };
311    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
312        50
313    };
314    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
315        51
316    };
317    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
318        52
319    };
320    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
321        53
322    };
323    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
324        54
325    };
326    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
327        55
328    };
329    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
330        56
331    };
332    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
333        57
334    };
335    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
336        58
337    };
338    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
339        59
340    };
341    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
342        60
343    };
344    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
345        61
346    };
347    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
348        62
349    };
350    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
351        63
352    };
353    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
354        64
355    };
356}
357
358#[macro_export]
359macro_rules! select_variant {
360    ($($p:ident)::*, () $($t:tt)*) => {
361        $($p)::*::_0 $($t)*
362    };
363    ($($p:ident)::*, (_) $($t:tt)*) => {
364        $($p)::*::_1 $($t)*
365    };
366    ($($p:ident)::*, (_ _) $($t:tt)*) => {
367        $($p)::*::_2 $($t)*
368    };
369    ($($p:ident)::*, (_ _ _) $($t:tt)*) => {
370        $($p)::*::_3 $($t)*
371    };
372    ($($p:ident)::*, (_ _ _ _) $($t:tt)*) => {
373        $($p)::*::_4 $($t)*
374    };
375    ($($p:ident)::*, (_ _ _ _ _) $($t:tt)*) => {
376        $($p)::*::_5 $($t)*
377    };
378    ($($p:ident)::*, (_ _ _ _ _ _) $($t:tt)*) => {
379        $($p)::*::_6 $($t)*
380    };
381    ($($p:ident)::*, (_ _ _ _ _ _ _) $($t:tt)*) => {
382        $($p)::*::_7 $($t)*
383    };
384    ($($p:ident)::*, (_ _ _ _ _ _ _ _) $($t:tt)*) => {
385        $($p)::*::_8 $($t)*
386    };
387    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _) $($t:tt)*) => {
388        $($p)::*::_9 $($t)*
389    };
390    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
391        $($p)::*::_10 $($t)*
392    };
393    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
394        $($p)::*::_11 $($t)*
395    };
396    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
397        $($p)::*::_12 $($t)*
398    };
399    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
400        $($p)::*::_13 $($t)*
401    };
402    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
403        $($p)::*::_14 $($t)*
404    };
405    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
406        $($p)::*::_15 $($t)*
407    };
408    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
409        $($p)::*::_16 $($t)*
410    };
411    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
412        $($p)::*::_17 $($t)*
413    };
414    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
415        $($p)::*::_18 $($t)*
416    };
417    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
418        $($p)::*::_19 $($t)*
419    };
420    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
421        $($p)::*::_20 $($t)*
422    };
423    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
424        $($p)::*::_21 $($t)*
425    };
426    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
427        $($p)::*::_22 $($t)*
428    };
429    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
430        $($p)::*::_23 $($t)*
431    };
432    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
433        $($p)::*::_24 $($t)*
434    };
435    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
436        $($p)::*::_25 $($t)*
437    };
438    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
439        $($p)::*::_26 $($t)*
440    };
441    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
442        $($p)::*::_27 $($t)*
443    };
444    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
445        $($p)::*::_28 $($t)*
446    };
447    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
448        $($p)::*::_29 $($t)*
449    };
450    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
451        $($p)::*::_30 $($t)*
452    };
453    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
454        $($p)::*::_31 $($t)*
455    };
456    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
457        $($p)::*::_32 $($t)*
458    };
459    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
460        $($p)::*::_33 $($t)*
461    };
462    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
463        $($p)::*::_34 $($t)*
464    };
465    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
466        $($p)::*::_35 $($t)*
467    };
468    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
469        $($p)::*::_36 $($t)*
470    };
471    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
472        $($p)::*::_37 $($t)*
473    };
474    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
475        $($p)::*::_38 $($t)*
476    };
477    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
478        $($p)::*::_39 $($t)*
479    };
480    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
481        $($p)::*::_40 $($t)*
482    };
483    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
484        $($p)::*::_41 $($t)*
485    };
486    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
487        $($p)::*::_42 $($t)*
488    };
489    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
490        $($p)::*::_43 $($t)*
491    };
492    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
493        $($p)::*::_44 $($t)*
494    };
495    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
496        $($p)::*::_45 $($t)*
497    };
498    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
499        $($p)::*::_46 $($t)*
500    };
501    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
502        $($p)::*::_47 $($t)*
503    };
504    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
505        $($p)::*::_48 $($t)*
506    };
507    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
508        $($p)::*::_49 $($t)*
509    };
510    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
511        $($p)::*::_50 $($t)*
512    };
513    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
514        $($p)::*::_51 $($t)*
515    };
516    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
517        $($p)::*::_52 $($t)*
518    };
519    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
520        $($p)::*::_53 $($t)*
521    };
522    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
523        $($p)::*::_54 $($t)*
524    };
525    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
526        $($p)::*::_55 $($t)*
527    };
528    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
529        $($p)::*::_56 $($t)*
530    };
531    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
532        $($p)::*::_57 $($t)*
533    };
534    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
535        $($p)::*::_58 $($t)*
536    };
537    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
538        $($p)::*::_59 $($t)*
539    };
540    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
541        $($p)::*::_60 $($t)*
542    };
543    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
544        $($p)::*::_61 $($t)*
545    };
546    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
547        $($p)::*::_62 $($t)*
548    };
549    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
550        $($p)::*::_63 $($t)*
551    };
552}