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