madsim_real_tokio/macros/
select.rs

1/// Waits on multiple concurrent branches, returning when the **first** branch
2/// completes, cancelling the remaining branches.
3///
4/// The `select!` macro must be used inside of async functions, closures, and
5/// blocks.
6///
7/// The `select!` macro accepts one or more branches with the following pattern:
8///
9/// ```text
10/// <pattern> = <async expression> (, if <precondition>)? => <handler>,
11/// ```
12///
13/// Additionally, the `select!` macro may include a single, optional `else`
14/// branch, which evaluates if none of the other branches match their patterns:
15///
16/// ```text
17/// else => <expression>
18/// ```
19///
20/// The macro aggregates all `<async expression>` expressions and runs them
21/// concurrently on the **current** task. Once the **first** expression
22/// completes with a value that matches its `<pattern>`, the `select!` macro
23/// returns the result of evaluating the completed branch's `<handler>`
24/// expression.
25///
26/// Additionally, each branch may include an optional `if` precondition. If the
27/// precondition returns `false`, then the branch is disabled. The provided
28/// `<async expression>` is still evaluated but the resulting future is never
29/// polled. This capability is useful when using `select!` within a loop.
30///
31/// The complete lifecycle of a `select!` expression is as follows:
32///
33/// 1. Evaluate all provided `<precondition>` expressions. If the precondition
34///    returns `false`, disable the branch for the remainder of the current call
35///    to `select!`. Re-entering `select!` due to a loop clears the "disabled"
36///    state.
37/// 2. Aggregate the `<async expression>`s from each branch, including the
38///    disabled ones. If the branch is disabled, `<async expression>` is still
39///    evaluated, but the resulting future is not polled.
40/// 3. Concurrently await on the results for all remaining `<async expression>`s.
41/// 4. Once an `<async expression>` returns a value, attempt to apply the value
42///    to the provided `<pattern>`, if the pattern matches, evaluate `<handler>`
43///    and return. If the pattern **does not** match, disable the current branch
44///    and for the remainder of the current call to `select!`. Continue from step 3.
45/// 5. If **all** branches are disabled, evaluate the `else` expression. If no
46///    else branch is provided, panic.
47///
48/// # Runtime characteristics
49///
50/// By running all async expressions on the current task, the expressions are
51/// able to run **concurrently** but not in **parallel**. This means all
52/// expressions are run on the same thread and if one branch blocks the thread,
53/// all other expressions will be unable to continue. If parallelism is
54/// required, spawn each async expression using [`tokio::spawn`] and pass the
55/// join handle to `select!`.
56///
57/// [`tokio::spawn`]: crate::spawn
58///
59/// # Fairness
60///
61/// By default, `select!` randomly picks a branch to check first. This provides
62/// some level of fairness when calling `select!` in a loop with branches that
63/// are always ready.
64///
65/// This behavior can be overridden by adding `biased;` to the beginning of the
66/// macro usage. See the examples for details. This will cause `select` to poll
67/// the futures in the order they appear from top to bottom. There are a few
68/// reasons you may want this:
69///
70/// - The random number generation of `tokio::select!` has a non-zero CPU cost
71/// - Your futures may interact in a way where known polling order is significant
72///
73/// But there is an important caveat to this mode. It becomes your responsibility
74/// to ensure that the polling order of your futures is fair. If for example you
75/// are selecting between a stream and a shutdown future, and the stream has a
76/// huge volume of messages and zero or nearly zero time between them, you should
77/// place the shutdown future earlier in the `select!` list to ensure that it is
78/// always polled, and will not be ignored due to the stream being constantly
79/// ready.
80///
81/// # Panics
82///
83/// The `select!` macro panics if all branches are disabled **and** there is no
84/// provided `else` branch. A branch is disabled when the provided `if`
85/// precondition returns `false` **or** when the pattern does not match the
86/// result of `<async expression>`.
87///
88/// # Cancellation safety
89///
90/// When using `select!` in a loop to receive messages from multiple sources,
91/// you should make sure that the receive call is cancellation safe to avoid
92/// losing messages. This section goes through various common methods and
93/// describes whether they are cancel safe.  The lists in this section are not
94/// exhaustive.
95///
96/// The following methods are cancellation safe:
97///
98///  * [`tokio::sync::mpsc::Receiver::recv`](crate::sync::mpsc::Receiver::recv)
99///  * [`tokio::sync::mpsc::UnboundedReceiver::recv`](crate::sync::mpsc::UnboundedReceiver::recv)
100///  * [`tokio::sync::broadcast::Receiver::recv`](crate::sync::broadcast::Receiver::recv)
101///  * [`tokio::sync::watch::Receiver::changed`](crate::sync::watch::Receiver::changed)
102///  * [`tokio::net::TcpListener::accept`](crate::net::TcpListener::accept)
103///  * [`tokio::net::UnixListener::accept`](crate::net::UnixListener::accept)
104///  * [`tokio::signal::unix::Signal::recv`](crate::signal::unix::Signal::recv)
105///  * [`tokio::io::AsyncReadExt::read`](crate::io::AsyncReadExt::read) on any `AsyncRead`
106///  * [`tokio::io::AsyncReadExt::read_buf`](crate::io::AsyncReadExt::read_buf) on any `AsyncRead`
107///  * [`tokio::io::AsyncWriteExt::write`](crate::io::AsyncWriteExt::write) on any `AsyncWrite`
108///  * [`tokio::io::AsyncWriteExt::write_buf`](crate::io::AsyncWriteExt::write_buf) on any `AsyncWrite`
109///  * [`tokio_stream::StreamExt::next`](https://docs.rs/tokio-stream/0.1/tokio_stream/trait.StreamExt.html#method.next) on any `Stream`
110///  * [`futures::stream::StreamExt::next`](https://docs.rs/futures/0.3/futures/stream/trait.StreamExt.html#method.next) on any `Stream`
111///
112/// The following methods are not cancellation safe and can lead to loss of data:
113///
114///  * [`tokio::io::AsyncReadExt::read_exact`](crate::io::AsyncReadExt::read_exact)
115///  * [`tokio::io::AsyncReadExt::read_to_end`](crate::io::AsyncReadExt::read_to_end)
116///  * [`tokio::io::AsyncReadExt::read_to_string`](crate::io::AsyncReadExt::read_to_string)
117///  * [`tokio::io::AsyncWriteExt::write_all`](crate::io::AsyncWriteExt::write_all)
118///
119/// The following methods are not cancellation safe because they use a queue for
120/// fairness and cancellation makes you lose your place in the queue:
121///
122///  * [`tokio::sync::Mutex::lock`](crate::sync::Mutex::lock)
123///  * [`tokio::sync::RwLock::read`](crate::sync::RwLock::read)
124///  * [`tokio::sync::RwLock::write`](crate::sync::RwLock::write)
125///  * [`tokio::sync::Semaphore::acquire`](crate::sync::Semaphore::acquire)
126///  * [`tokio::sync::Notify::notified`](crate::sync::Notify::notified)
127///
128/// To determine whether your own methods are cancellation safe, look for the
129/// location of uses of `.await`. This is because when an asynchronous method is
130/// cancelled, that always happens at an `.await`. If your function behaves
131/// correctly even if it is restarted while waiting at an `.await`, then it is
132/// cancellation safe.
133///
134/// Cancellation safety can be defined in the following way: If you have a
135/// future that has not yet completed, then it must be a no-op to drop that
136/// future and recreate it. This definition is motivated by the situation where
137/// a `select!` is used in a loop. Without this guarantee, you would lose your
138/// progress when another branch completes and you restart the `select!` by
139/// going around the loop.
140///
141/// Be aware that cancelling something that is not cancellation safe is not
142/// necessarily wrong. For example, if you are cancelling a task because the
143/// application is shutting down, then you probably don't care that partially
144/// read data is lost.
145///
146/// # Examples
147///
148/// Basic select with two branches.
149///
150/// ```
151/// async fn do_stuff_async() {
152///     // async work
153/// }
154///
155/// async fn more_async_work() {
156///     // more here
157/// }
158///
159/// #[tokio::main]
160/// async fn main() {
161///     tokio::select! {
162///         _ = do_stuff_async() => {
163///             println!("do_stuff_async() completed first")
164///         }
165///         _ = more_async_work() => {
166///             println!("more_async_work() completed first")
167///         }
168///     };
169/// }
170/// ```
171///
172/// Basic stream selecting.
173///
174/// ```
175/// use tokio_stream::{self as stream, StreamExt};
176///
177/// #[tokio::main]
178/// async fn main() {
179///     let mut stream1 = stream::iter(vec![1, 2, 3]);
180///     let mut stream2 = stream::iter(vec![4, 5, 6]);
181///
182///     let next = tokio::select! {
183///         v = stream1.next() => v.unwrap(),
184///         v = stream2.next() => v.unwrap(),
185///     };
186///
187///     assert!(next == 1 || next == 4);
188/// }
189/// ```
190///
191/// Collect the contents of two streams. In this example, we rely on pattern
192/// matching and the fact that `stream::iter` is "fused", i.e. once the stream
193/// is complete, all calls to `next()` return `None`.
194///
195/// ```
196/// use tokio_stream::{self as stream, StreamExt};
197///
198/// #[tokio::main]
199/// async fn main() {
200///     let mut stream1 = stream::iter(vec![1, 2, 3]);
201///     let mut stream2 = stream::iter(vec![4, 5, 6]);
202///
203///     let mut values = vec![];
204///
205///     loop {
206///         tokio::select! {
207///             Some(v) = stream1.next() => values.push(v),
208///             Some(v) = stream2.next() => values.push(v),
209///             else => break,
210///         }
211///     }
212///
213///     values.sort();
214///     assert_eq!(&[1, 2, 3, 4, 5, 6], &values[..]);
215/// }
216/// ```
217///
218/// Using the same future in multiple `select!` expressions can be done by passing
219/// a reference to the future. Doing so requires the future to be [`Unpin`]. A
220/// future can be made [`Unpin`] by either using [`Box::pin`] or stack pinning.
221///
222/// [`Unpin`]: std::marker::Unpin
223/// [`Box::pin`]: std::boxed::Box::pin
224///
225/// Here, a stream is consumed for at most 1 second.
226///
227/// ```
228/// use tokio_stream::{self as stream, StreamExt};
229/// use tokio::time::{self, Duration};
230///
231/// #[tokio::main]
232/// async fn main() {
233///     let mut stream = stream::iter(vec![1, 2, 3]);
234///     let sleep = time::sleep(Duration::from_secs(1));
235///     tokio::pin!(sleep);
236///
237///     loop {
238///         tokio::select! {
239///             maybe_v = stream.next() => {
240///                 if let Some(v) = maybe_v {
241///                     println!("got = {}", v);
242///                 } else {
243///                     break;
244///                 }
245///             }
246///             _ = &mut sleep => {
247///                 println!("timeout");
248///                 break;
249///             }
250///         }
251///     }
252/// }
253/// ```
254///
255/// Joining two values using `select!`.
256///
257/// ```
258/// use tokio::sync::oneshot;
259///
260/// #[tokio::main]
261/// async fn main() {
262///     let (tx1, mut rx1) = oneshot::channel();
263///     let (tx2, mut rx2) = oneshot::channel();
264///
265///     tokio::spawn(async move {
266///         tx1.send("first").unwrap();
267///     });
268///
269///     tokio::spawn(async move {
270///         tx2.send("second").unwrap();
271///     });
272///
273///     let mut a = None;
274///     let mut b = None;
275///
276///     while a.is_none() || b.is_none() {
277///         tokio::select! {
278///             v1 = (&mut rx1), if a.is_none() => a = Some(v1.unwrap()),
279///             v2 = (&mut rx2), if b.is_none() => b = Some(v2.unwrap()),
280///         }
281///     }
282///
283///     let res = (a.unwrap(), b.unwrap());
284///
285///     assert_eq!(res.0, "first");
286///     assert_eq!(res.1, "second");
287/// }
288/// ```
289///
290/// Using the `biased;` mode to control polling order.
291///
292/// ```
293/// #[tokio::main]
294/// async fn main() {
295///     let mut count = 0u8;
296///
297///     loop {
298///         tokio::select! {
299///             // If you run this example without `biased;`, the polling order is
300///             // pseudo-random, and the assertions on the value of count will
301///             // (probably) fail.
302///             biased;
303///
304///             _ = async {}, if count < 1 => {
305///                 count += 1;
306///                 assert_eq!(count, 1);
307///             }
308///             _ = async {}, if count < 2 => {
309///                 count += 1;
310///                 assert_eq!(count, 2);
311///             }
312///             _ = async {}, if count < 3 => {
313///                 count += 1;
314///                 assert_eq!(count, 3);
315///             }
316///             _ = async {}, if count < 4 => {
317///                 count += 1;
318///                 assert_eq!(count, 4);
319///             }
320///
321///             else => {
322///                 break;
323///             }
324///         };
325///     }
326/// }
327/// ```
328///
329/// ## Avoid racy `if` preconditions
330///
331/// Given that `if` preconditions are used to disable `select!` branches, some
332/// caution must be used to avoid missing values.
333///
334/// For example, here is **incorrect** usage of `sleep` with `if`. The objective
335/// is to repeatedly run an asynchronous task for up to 50 milliseconds.
336/// However, there is a potential for the `sleep` completion to be missed.
337///
338/// ```no_run,should_panic
339/// use tokio::time::{self, Duration};
340///
341/// async fn some_async_work() {
342///     // do work
343/// }
344///
345/// #[tokio::main]
346/// async fn main() {
347///     let sleep = time::sleep(Duration::from_millis(50));
348///     tokio::pin!(sleep);
349///
350///     while !sleep.is_elapsed() {
351///         tokio::select! {
352///             _ = &mut sleep, if !sleep.is_elapsed() => {
353///                 println!("operation timed out");
354///             }
355///             _ = some_async_work() => {
356///                 println!("operation completed");
357///             }
358///         }
359///     }
360///
361///     panic!("This example shows how not to do it!");
362/// }
363/// ```
364///
365/// In the above example, `sleep.is_elapsed()` may return `true` even if
366/// `sleep.poll()` never returned `Ready`. This opens up a potential race
367/// condition where `sleep` expires between the `while !sleep.is_elapsed()`
368/// check and the call to `select!` resulting in the `some_async_work()` call to
369/// run uninterrupted despite the sleep having elapsed.
370///
371/// One way to write the above example without the race would be:
372///
373/// ```
374/// use tokio::time::{self, Duration};
375///
376/// async fn some_async_work() {
377/// # time::sleep(Duration::from_millis(10)).await;
378///     // do work
379/// }
380///
381/// #[tokio::main]
382/// async fn main() {
383///     let sleep = time::sleep(Duration::from_millis(50));
384///     tokio::pin!(sleep);
385///
386///     loop {
387///         tokio::select! {
388///             _ = &mut sleep => {
389///                 println!("operation timed out");
390///                 break;
391///             }
392///             _ = some_async_work() => {
393///                 println!("operation completed");
394///             }
395///         }
396///     }
397/// }
398/// ```
399#[macro_export]
400#[cfg_attr(docsrs, doc(cfg(feature = "macros")))]
401macro_rules! select {
402    // Uses a declarative macro to do **most** of the work. While it is possible
403    // to implement fully with a declarative macro, a procedural macro is used
404    // to enable improved error messages.
405    //
406    // The macro is structured as a tt-muncher. All branches are processed and
407    // normalized. Once the input is normalized, it is passed to the top-most
408    // rule. When entering the macro, `@{ }` is inserted at the front. This is
409    // used to collect the normalized input.
410    //
411    // The macro only recurses once per branch. This allows using `select!`
412    // without requiring the user to increase the recursion limit.
413
414    // All input is normalized, now transform.
415    (@ {
416        // The index of the future to poll first (in bias mode), or the RNG
417        // expression to use to pick a future to poll first.
418        start=$start:expr;
419
420        // One `_` for each branch in the `select!` macro. Passing this to
421        // `count!` converts $skip to an integer.
422        ( $($count:tt)* )
423
424        // Normalized select branches. `( $skip )` is a set of `_` characters.
425        // There is one `_` for each select branch **before** this one. Given
426        // that all input futures are stored in a tuple, $skip is useful for
427        // generating a pattern to reference the future for the current branch.
428        // $skip is also used as an argument to `count!`, returning the index of
429        // the current select branch.
430        $( ( $($skip:tt)* ) $bind:pat = $fut:expr, if $c:expr => $handle:expr, )+
431
432        // Fallback expression used when all select branches have been disabled.
433        ; $else:expr
434
435    }) => {{
436        // Enter a context where stable "function-like" proc macros can be used.
437        //
438        // This module is defined within a scope and should not leak out of this
439        // macro.
440        #[doc(hidden)]
441        mod __tokio_select_util {
442            // Generate an enum with one variant per select branch
443            $crate::select_priv_declare_output_enum!( ( $($count)* ) );
444        }
445
446        // `tokio::macros::support` is a public, but doc(hidden) module
447        // including a re-export of all types needed by this macro.
448        use $crate::macros::support::Future;
449        use $crate::macros::support::Pin;
450        use $crate::macros::support::Poll::{Ready, Pending};
451
452        const BRANCHES: u32 = $crate::count!( $($count)* );
453
454        let mut disabled: __tokio_select_util::Mask = Default::default();
455
456        // First, invoke all the pre-conditions. For any that return true,
457        // set the appropriate bit in `disabled`.
458        $(
459            if !$c {
460                let mask: __tokio_select_util::Mask = 1 << $crate::count!( $($skip)* );
461                disabled |= mask;
462            }
463        )*
464
465        // Create a scope to separate polling from handling the output. This
466        // adds borrow checker flexibility when using the macro.
467        let mut output = {
468            // Safety: Nothing must be moved out of `futures`. This is to
469            // satisfy the requirement of `Pin::new_unchecked` called below.
470            //
471            // We can't use the `pin!` macro for this because `futures` is a
472            // tuple and the standard library provides no way to pin-project to
473            // the fields of a tuple.
474            let mut futures = ( $( $fut , )+ );
475
476            // This assignment makes sure that the `poll_fn` closure only has a
477            // reference to the futures, instead of taking ownership of them.
478            // This mitigates the issue described in
479            // <https://internals.rust-lang.org/t/surprising-soundness-trouble-around-pollfn/17484>
480            let mut futures = &mut futures;
481
482            $crate::macros::support::poll_fn(|cx| {
483                // Track if any branch returns pending. If no branch completes
484                // **or** returns pending, this implies that all branches are
485                // disabled.
486                let mut is_pending = false;
487
488                // Choose a starting index to begin polling the futures at. In
489                // practice, this will either be a pseudo-randomly generated
490                // number by default, or the constant 0 if `biased;` is
491                // supplied.
492                let start = $start;
493
494                for i in 0..BRANCHES {
495                    let branch;
496                    #[allow(clippy::modulo_one)]
497                    {
498                        branch = (start + i) % BRANCHES;
499                    }
500                    match branch {
501                        $(
502                            #[allow(unreachable_code)]
503                            $crate::count!( $($skip)* ) => {
504                                // First, if the future has previously been
505                                // disabled, do not poll it again. This is done
506                                // by checking the associated bit in the
507                                // `disabled` bit field.
508                                let mask = 1 << branch;
509
510                                if disabled & mask == mask {
511                                    // The future has been disabled.
512                                    continue;
513                                }
514
515                                // Extract the future for this branch from the
516                                // tuple
517                                let ( $($skip,)* fut, .. ) = &mut *futures;
518
519                                // Safety: future is stored on the stack above
520                                // and never moved.
521                                let mut fut = unsafe { Pin::new_unchecked(fut) };
522
523                                // Try polling it
524                                let out = match Future::poll(fut, cx) {
525                                    Ready(out) => out,
526                                    Pending => {
527                                        // Track that at least one future is
528                                        // still pending and continue polling.
529                                        is_pending = true;
530                                        continue;
531                                    }
532                                };
533
534                                // Disable the future from future polling.
535                                disabled |= mask;
536
537                                // The future returned a value, check if matches
538                                // the specified pattern.
539                                #[allow(unused_variables)]
540                                #[allow(unused_mut)]
541                                match &out {
542                                    $crate::select_priv_clean_pattern!($bind) => {}
543                                    _ => continue,
544                                }
545
546                                // The select is complete, return the value
547                                return Ready($crate::select_variant!(__tokio_select_util::Out, ($($skip)*))(out));
548                            }
549                        )*
550                        _ => unreachable!("reaching this means there probably is an off by one bug"),
551                    }
552                }
553
554                if is_pending {
555                    Pending
556                } else {
557                    // All branches have been disabled.
558                    Ready(__tokio_select_util::Out::Disabled)
559                }
560            }).await
561        };
562
563        match output {
564            $(
565                $crate::select_variant!(__tokio_select_util::Out, ($($skip)*) ($bind)) => $handle,
566            )*
567            __tokio_select_util::Out::Disabled => $else,
568            _ => unreachable!("failed to match bind"),
569        }
570    }};
571
572    // ==== Normalize =====
573
574    // These rules match a single `select!` branch and normalize it for
575    // processing by the first rule.
576
577    (@ { start=$start:expr; $($t:tt)* } ) => {
578        // No `else` branch
579        $crate::select!(@{ start=$start; $($t)*; panic!("all branches are disabled and there is no else branch") })
580    };
581    (@ { start=$start:expr; $($t:tt)* } else => $else:expr $(,)?) => {
582        $crate::select!(@{ start=$start; $($t)*; $else })
583    };
584    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:block, $($r:tt)* ) => {
585        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, } $($r)*)
586    };
587    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:block, $($r:tt)* ) => {
588        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, } $($r)*)
589    };
590    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:block $($r:tt)* ) => {
591        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, } $($r)*)
592    };
593    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:block $($r:tt)* ) => {
594        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, } $($r)*)
595    };
596    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:expr ) => {
597        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, })
598    };
599    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:expr ) => {
600        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, })
601    };
602    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:expr, $($r:tt)* ) => {
603        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, } $($r)*)
604    };
605    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:expr, $($r:tt)* ) => {
606        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, } $($r)*)
607    };
608
609    // ===== Entry point =====
610
611    ($(biased;)? else => $else:expr $(,)? ) => {{
612        $else
613    }};
614
615    (biased; $p:pat = $($t:tt)* ) => {
616        $crate::select!(@{ start=0; () } $p = $($t)*)
617    };
618
619    ( $p:pat = $($t:tt)* ) => {
620        // Randomly generate a starting point. This makes `select!` a bit more
621        // fair and avoids always polling the first future.
622        $crate::select!(@{ start={ $crate::macros::support::thread_rng_n(BRANCHES) }; () } $p = $($t)*)
623    };
624
625    () => {
626        compile_error!("select! requires at least one branch.")
627    };
628}
629
630// And here... we manually list out matches for up to 64 branches... I'm not
631// happy about it either, but this is how we manage to use a declarative macro!
632
633#[macro_export]
634#[doc(hidden)]
635macro_rules! count {
636    () => {
637        0
638    };
639    (_) => {
640        1
641    };
642    (_ _) => {
643        2
644    };
645    (_ _ _) => {
646        3
647    };
648    (_ _ _ _) => {
649        4
650    };
651    (_ _ _ _ _) => {
652        5
653    };
654    (_ _ _ _ _ _) => {
655        6
656    };
657    (_ _ _ _ _ _ _) => {
658        7
659    };
660    (_ _ _ _ _ _ _ _) => {
661        8
662    };
663    (_ _ _ _ _ _ _ _ _) => {
664        9
665    };
666    (_ _ _ _ _ _ _ _ _ _) => {
667        10
668    };
669    (_ _ _ _ _ _ _ _ _ _ _) => {
670        11
671    };
672    (_ _ _ _ _ _ _ _ _ _ _ _) => {
673        12
674    };
675    (_ _ _ _ _ _ _ _ _ _ _ _ _) => {
676        13
677    };
678    (_ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
679        14
680    };
681    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
682        15
683    };
684    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
685        16
686    };
687    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
688        17
689    };
690    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
691        18
692    };
693    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
694        19
695    };
696    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
697        20
698    };
699    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
700        21
701    };
702    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
703        22
704    };
705    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
706        23
707    };
708    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
709        24
710    };
711    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
712        25
713    };
714    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
715        26
716    };
717    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
718        27
719    };
720    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
721        28
722    };
723    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
724        29
725    };
726    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
727        30
728    };
729    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
730        31
731    };
732    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
733        32
734    };
735    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
736        33
737    };
738    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
739        34
740    };
741    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
742        35
743    };
744    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
745        36
746    };
747    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
748        37
749    };
750    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
751        38
752    };
753    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
754        39
755    };
756    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
757        40
758    };
759    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
760        41
761    };
762    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
763        42
764    };
765    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
766        43
767    };
768    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
769        44
770    };
771    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
772        45
773    };
774    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
775        46
776    };
777    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
778        47
779    };
780    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
781        48
782    };
783    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
784        49
785    };
786    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
787        50
788    };
789    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
790        51
791    };
792    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
793        52
794    };
795    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
796        53
797    };
798    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
799        54
800    };
801    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
802        55
803    };
804    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
805        56
806    };
807    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
808        57
809    };
810    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
811        58
812    };
813    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
814        59
815    };
816    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
817        60
818    };
819    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
820        61
821    };
822    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
823        62
824    };
825    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
826        63
827    };
828    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
829        64
830    };
831}
832
833#[macro_export]
834#[doc(hidden)]
835macro_rules! select_variant {
836    ($($p:ident)::*, () $($t:tt)*) => {
837        $($p)::*::_0 $($t)*
838    };
839    ($($p:ident)::*, (_) $($t:tt)*) => {
840        $($p)::*::_1 $($t)*
841    };
842    ($($p:ident)::*, (_ _) $($t:tt)*) => {
843        $($p)::*::_2 $($t)*
844    };
845    ($($p:ident)::*, (_ _ _) $($t:tt)*) => {
846        $($p)::*::_3 $($t)*
847    };
848    ($($p:ident)::*, (_ _ _ _) $($t:tt)*) => {
849        $($p)::*::_4 $($t)*
850    };
851    ($($p:ident)::*, (_ _ _ _ _) $($t:tt)*) => {
852        $($p)::*::_5 $($t)*
853    };
854    ($($p:ident)::*, (_ _ _ _ _ _) $($t:tt)*) => {
855        $($p)::*::_6 $($t)*
856    };
857    ($($p:ident)::*, (_ _ _ _ _ _ _) $($t:tt)*) => {
858        $($p)::*::_7 $($t)*
859    };
860    ($($p:ident)::*, (_ _ _ _ _ _ _ _) $($t:tt)*) => {
861        $($p)::*::_8 $($t)*
862    };
863    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _) $($t:tt)*) => {
864        $($p)::*::_9 $($t)*
865    };
866    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
867        $($p)::*::_10 $($t)*
868    };
869    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
870        $($p)::*::_11 $($t)*
871    };
872    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
873        $($p)::*::_12 $($t)*
874    };
875    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
876        $($p)::*::_13 $($t)*
877    };
878    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
879        $($p)::*::_14 $($t)*
880    };
881    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
882        $($p)::*::_15 $($t)*
883    };
884    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
885        $($p)::*::_16 $($t)*
886    };
887    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
888        $($p)::*::_17 $($t)*
889    };
890    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
891        $($p)::*::_18 $($t)*
892    };
893    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
894        $($p)::*::_19 $($t)*
895    };
896    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
897        $($p)::*::_20 $($t)*
898    };
899    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
900        $($p)::*::_21 $($t)*
901    };
902    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
903        $($p)::*::_22 $($t)*
904    };
905    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
906        $($p)::*::_23 $($t)*
907    };
908    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
909        $($p)::*::_24 $($t)*
910    };
911    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
912        $($p)::*::_25 $($t)*
913    };
914    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
915        $($p)::*::_26 $($t)*
916    };
917    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
918        $($p)::*::_27 $($t)*
919    };
920    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
921        $($p)::*::_28 $($t)*
922    };
923    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
924        $($p)::*::_29 $($t)*
925    };
926    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
927        $($p)::*::_30 $($t)*
928    };
929    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
930        $($p)::*::_31 $($t)*
931    };
932    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
933        $($p)::*::_32 $($t)*
934    };
935    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
936        $($p)::*::_33 $($t)*
937    };
938    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
939        $($p)::*::_34 $($t)*
940    };
941    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
942        $($p)::*::_35 $($t)*
943    };
944    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
945        $($p)::*::_36 $($t)*
946    };
947    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
948        $($p)::*::_37 $($t)*
949    };
950    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
951        $($p)::*::_38 $($t)*
952    };
953    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
954        $($p)::*::_39 $($t)*
955    };
956    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
957        $($p)::*::_40 $($t)*
958    };
959    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
960        $($p)::*::_41 $($t)*
961    };
962    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
963        $($p)::*::_42 $($t)*
964    };
965    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
966        $($p)::*::_43 $($t)*
967    };
968    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
969        $($p)::*::_44 $($t)*
970    };
971    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
972        $($p)::*::_45 $($t)*
973    };
974    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
975        $($p)::*::_46 $($t)*
976    };
977    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
978        $($p)::*::_47 $($t)*
979    };
980    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
981        $($p)::*::_48 $($t)*
982    };
983    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
984        $($p)::*::_49 $($t)*
985    };
986    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
987        $($p)::*::_50 $($t)*
988    };
989    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
990        $($p)::*::_51 $($t)*
991    };
992    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
993        $($p)::*::_52 $($t)*
994    };
995    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
996        $($p)::*::_53 $($t)*
997    };
998    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
999        $($p)::*::_54 $($t)*
1000    };
1001    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1002        $($p)::*::_55 $($t)*
1003    };
1004    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1005        $($p)::*::_56 $($t)*
1006    };
1007    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1008        $($p)::*::_57 $($t)*
1009    };
1010    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1011        $($p)::*::_58 $($t)*
1012    };
1013    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1014        $($p)::*::_59 $($t)*
1015    };
1016    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1017        $($p)::*::_60 $($t)*
1018    };
1019    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1020        $($p)::*::_61 $($t)*
1021    };
1022    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1023        $($p)::*::_62 $($t)*
1024    };
1025    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1026        $($p)::*::_63 $($t)*
1027    };
1028}