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; $p:pat = $($t:tt)* ) => {
612 $crate::select!(@{ start=0; () } $p = $($t)*)
613 };
614
615 ( $p:pat = $($t:tt)* ) => {
616 // Randomly generate a starting point. This makes `select!` a bit more
617 // fair and avoids always polling the first future.
618 $crate::select!(@{ start={ $crate::macros::support::thread_rng_n(BRANCHES) }; () } $p = $($t)*)
619 };
620 () => {
621 compile_error!("select! requires at least one branch.")
622 };
623}
624
625// And here... we manually list out matches for up to 64 branches... I'm not
626// happy about it either, but this is how we manage to use a declarative macro!
627
628#[macro_export]
629#[doc(hidden)]
630macro_rules! count {
631 () => {
632 0
633 };
634 (_) => {
635 1
636 };
637 (_ _) => {
638 2
639 };
640 (_ _ _) => {
641 3
642 };
643 (_ _ _ _) => {
644 4
645 };
646 (_ _ _ _ _) => {
647 5
648 };
649 (_ _ _ _ _ _) => {
650 6
651 };
652 (_ _ _ _ _ _ _) => {
653 7
654 };
655 (_ _ _ _ _ _ _ _) => {
656 8
657 };
658 (_ _ _ _ _ _ _ _ _) => {
659 9
660 };
661 (_ _ _ _ _ _ _ _ _ _) => {
662 10
663 };
664 (_ _ _ _ _ _ _ _ _ _ _) => {
665 11
666 };
667 (_ _ _ _ _ _ _ _ _ _ _ _) => {
668 12
669 };
670 (_ _ _ _ _ _ _ _ _ _ _ _ _) => {
671 13
672 };
673 (_ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
674 14
675 };
676 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
677 15
678 };
679 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
680 16
681 };
682 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
683 17
684 };
685 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
686 18
687 };
688 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
689 19
690 };
691 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
692 20
693 };
694 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
695 21
696 };
697 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
698 22
699 };
700 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
701 23
702 };
703 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
704 24
705 };
706 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
707 25
708 };
709 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
710 26
711 };
712 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
713 27
714 };
715 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
716 28
717 };
718 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
719 29
720 };
721 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
722 30
723 };
724 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
725 31
726 };
727 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
728 32
729 };
730 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
731 33
732 };
733 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
734 34
735 };
736 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
737 35
738 };
739 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
740 36
741 };
742 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
743 37
744 };
745 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
746 38
747 };
748 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
749 39
750 };
751 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
752 40
753 };
754 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
755 41
756 };
757 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
758 42
759 };
760 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
761 43
762 };
763 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
764 44
765 };
766 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
767 45
768 };
769 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
770 46
771 };
772 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
773 47
774 };
775 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
776 48
777 };
778 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
779 49
780 };
781 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
782 50
783 };
784 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
785 51
786 };
787 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
788 52
789 };
790 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
791 53
792 };
793 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
794 54
795 };
796 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
797 55
798 };
799 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
800 56
801 };
802 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
803 57
804 };
805 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
806 58
807 };
808 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
809 59
810 };
811 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
812 60
813 };
814 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
815 61
816 };
817 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
818 62
819 };
820 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
821 63
822 };
823 (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
824 64
825 };
826}
827
828#[macro_export]
829#[doc(hidden)]
830macro_rules! select_variant {
831 ($($p:ident)::*, () $($t:tt)*) => {
832 $($p)::*::_0 $($t)*
833 };
834 ($($p:ident)::*, (_) $($t:tt)*) => {
835 $($p)::*::_1 $($t)*
836 };
837 ($($p:ident)::*, (_ _) $($t:tt)*) => {
838 $($p)::*::_2 $($t)*
839 };
840 ($($p:ident)::*, (_ _ _) $($t:tt)*) => {
841 $($p)::*::_3 $($t)*
842 };
843 ($($p:ident)::*, (_ _ _ _) $($t:tt)*) => {
844 $($p)::*::_4 $($t)*
845 };
846 ($($p:ident)::*, (_ _ _ _ _) $($t:tt)*) => {
847 $($p)::*::_5 $($t)*
848 };
849 ($($p:ident)::*, (_ _ _ _ _ _) $($t:tt)*) => {
850 $($p)::*::_6 $($t)*
851 };
852 ($($p:ident)::*, (_ _ _ _ _ _ _) $($t:tt)*) => {
853 $($p)::*::_7 $($t)*
854 };
855 ($($p:ident)::*, (_ _ _ _ _ _ _ _) $($t:tt)*) => {
856 $($p)::*::_8 $($t)*
857 };
858 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _) $($t:tt)*) => {
859 $($p)::*::_9 $($t)*
860 };
861 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
862 $($p)::*::_10 $($t)*
863 };
864 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
865 $($p)::*::_11 $($t)*
866 };
867 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
868 $($p)::*::_12 $($t)*
869 };
870 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
871 $($p)::*::_13 $($t)*
872 };
873 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
874 $($p)::*::_14 $($t)*
875 };
876 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
877 $($p)::*::_15 $($t)*
878 };
879 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
880 $($p)::*::_16 $($t)*
881 };
882 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
883 $($p)::*::_17 $($t)*
884 };
885 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
886 $($p)::*::_18 $($t)*
887 };
888 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
889 $($p)::*::_19 $($t)*
890 };
891 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
892 $($p)::*::_20 $($t)*
893 };
894 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
895 $($p)::*::_21 $($t)*
896 };
897 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
898 $($p)::*::_22 $($t)*
899 };
900 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
901 $($p)::*::_23 $($t)*
902 };
903 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
904 $($p)::*::_24 $($t)*
905 };
906 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
907 $($p)::*::_25 $($t)*
908 };
909 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
910 $($p)::*::_26 $($t)*
911 };
912 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
913 $($p)::*::_27 $($t)*
914 };
915 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
916 $($p)::*::_28 $($t)*
917 };
918 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
919 $($p)::*::_29 $($t)*
920 };
921 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
922 $($p)::*::_30 $($t)*
923 };
924 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
925 $($p)::*::_31 $($t)*
926 };
927 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
928 $($p)::*::_32 $($t)*
929 };
930 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
931 $($p)::*::_33 $($t)*
932 };
933 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
934 $($p)::*::_34 $($t)*
935 };
936 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
937 $($p)::*::_35 $($t)*
938 };
939 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
940 $($p)::*::_36 $($t)*
941 };
942 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
943 $($p)::*::_37 $($t)*
944 };
945 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
946 $($p)::*::_38 $($t)*
947 };
948 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
949 $($p)::*::_39 $($t)*
950 };
951 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
952 $($p)::*::_40 $($t)*
953 };
954 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
955 $($p)::*::_41 $($t)*
956 };
957 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
958 $($p)::*::_42 $($t)*
959 };
960 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
961 $($p)::*::_43 $($t)*
962 };
963 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
964 $($p)::*::_44 $($t)*
965 };
966 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
967 $($p)::*::_45 $($t)*
968 };
969 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
970 $($p)::*::_46 $($t)*
971 };
972 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
973 $($p)::*::_47 $($t)*
974 };
975 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
976 $($p)::*::_48 $($t)*
977 };
978 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
979 $($p)::*::_49 $($t)*
980 };
981 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
982 $($p)::*::_50 $($t)*
983 };
984 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
985 $($p)::*::_51 $($t)*
986 };
987 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
988 $($p)::*::_52 $($t)*
989 };
990 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
991 $($p)::*::_53 $($t)*
992 };
993 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
994 $($p)::*::_54 $($t)*
995 };
996 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
997 $($p)::*::_55 $($t)*
998 };
999 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1000 $($p)::*::_56 $($t)*
1001 };
1002 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1003 $($p)::*::_57 $($t)*
1004 };
1005 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1006 $($p)::*::_58 $($t)*
1007 };
1008 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1009 $($p)::*::_59 $($t)*
1010 };
1011 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1012 $($p)::*::_60 $($t)*
1013 };
1014 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1015 $($p)::*::_61 $($t)*
1016 };
1017 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1018 $($p)::*::_62 $($t)*
1019 };
1020 ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1021 $($p)::*::_63 $($t)*
1022 };
1023}
1024