Coverage Report

Created: 2025-02-25 06:39

/rust/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.43.0/src/macros/select.rs
Line
Count
Source (jump to first uncovered line)
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
0
            $crate::macros::support::poll_fn(|cx| {
516
0
                // Track if any branch returns pending. If no branch completes
517
0
                // **or** returns pending, this implies that all branches are
518
0
                // disabled.
519
0
                let mut is_pending = false;
520
0
521
0
                // Choose a starting index to begin polling the futures at. In
522
0
                // practice, this will either be a pseudo-randomly generated
523
0
                // number by default, or the constant 0 if `biased;` is
524
0
                // supplied.
525
0
                let start = $start;
526
527
0
                for i in 0..BRANCHES {
528
                    let branch;
529
                    #[allow(clippy::modulo_one)]
530
0
                    {
531
0
                        branch = (start + i) % BRANCHES;
532
0
                    }
533
0
                    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
0
                                let mask = 1 << branch;
542
0
543
0
                                if disabled & mask == mask {
544
                                    // The future has been disabled.
545
0
                                    continue;
546
0
                                }
547
0
548
0
                                // Extract the future for this branch from the
549
0
                                // tuple
550
0
                                let ( $($skip,)* fut, .. ) = &mut *futures;
551
0
552
0
                                // Safety: future is stored on the stack above
553
0
                                // and never moved.
554
0
                                let mut fut = unsafe { Pin::new_unchecked(fut) };
555
556
                                // Try polling it
557
0
                                let out = match Future::poll(fut, cx) {
558
0
                                    Ready(out) => out,
559
                                    Pending => {
560
                                        // Track that at least one future is
561
                                        // still pending and continue polling.
562
0
                                        is_pending = true;
563
0
                                        continue;
564
                                    }
565
                                };
566
567
                                // Disable the future from future polling.
568
0
                                disabled |= mask;
569
0
570
0
                                // The future returned a value, check if matches
571
0
                                // the specified pattern.
572
0
                                #[allow(unused_variables)]
573
0
                                #[allow(unused_mut)]
574
0
                                match &out {
575
0
                                    $crate::select_priv_clean_pattern!($bind) => {}
576
0
                                    _ => continue,
577
0
                                }
578
0
579
0
                                // The select is complete, return the value
580
0
                                return Ready($crate::select_variant!(__tokio_select_util::Out, ($($skip)*))(out));
581
                            }
582
                        )*
583
0
                        _ => unreachable!("reaching this means there probably is an off by one bug"),
584
                    }
585
                }
586
587
0
                if is_pending {
588
0
                    Pending
589
                } else {
590
                    // All branches have been disabled.
591
0
                    Ready(__tokio_select_util::Out::Disabled)
592
                }
593
            }).await
Unexecuted instantiation: ztunnel::signal::imp::shutdown::{closure#0}::{closure#0}
Unexecuted instantiation: <ztunnel::xds::client::AdsClient>::run_internal::{closure#0}::{closure#6}
Unexecuted instantiation: <ztunnel::inpod::protocol::WorkloadStreamProcessor>::read_message::{closure#0}::{closure#1}
Unexecuted instantiation: <pingora_pool::connection::ConnectionPool<ztunnel::proxy::pool::ConnClient>>::idle_timeout::{closure#0}::{closure#0}
Unexecuted instantiation: <ztunnel::proxy::inbound::Inbound>::serve_connect::{closure#0}::{closure#5}
Unexecuted instantiation: <ztunnel::proxy::outbound::Outbound>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#1}
Unexecuted instantiation: <ztunnel::proxy::connection_manager::PolicyWatcher>::run::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::proxy::h2::client::drive_connection::<tokio_rustls::client::TlsStream<tokio::net::tcp::stream::TcpStream>, bytes::bytes::Bytes>::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::proxy::h2::server::serve_connection::<<ztunnel::proxy::inbound::Inbound>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::inbound::Inbound>::serve_connect::{closure#0}>>::{closure#0}::{closure#2}
Unexecuted instantiation: ztunnel::proxy::h2::server::serve_connection::<<ztunnel::proxy::inbound::Inbound>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::inbound::Inbound>::serve_connect::{closure#0}>>::{closure#0}::{closure#5}
Unexecuted instantiation: <ztunnel::inpod::workloadmanager::WorkloadProxyManager>::run_internal::{closure#0}::{closure#1}
Unexecuted instantiation: <ztunnel::identity::manager::Worker>::run::{closure#0}::{closure#1}
Unexecuted instantiation: <ztunnel::identity::manager::SecretManager>::wait::{closure#0}::{closure#0}
Unexecuted instantiation: <ztunnel::dns::server::Server>::run::{closure#0}::{closure#0}
Unexecuted instantiation: <ztunnel::state::DemandProxyState>::wait_for_workload::{closure#0}::{closure#2}
Unexecuted instantiation: <ztunnel::proxy::inbound_passthrough::InboundPassthrough>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#1}
Unexecuted instantiation: <ztunnel::proxy::inbound_passthrough::InboundPassthrough>::proxy_inbound_plaintext::{closure#0}::{closure#1}
Unexecuted instantiation: <ztunnel::proxy::socks5::Socks5>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#1}
Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::inbound_passthrough::InboundPassthrough>::run::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::inbound_passthrough::InboundPassthrough>::run::{closure#0}::{closure#0}::{closure#0}>, ()>::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::socks5::Socks5>::run::{closure#0}::{closure#0}, <ztunnel::proxy::socks5::Socks5>::run::{closure#0}::{closure#0}::{closure#0}, ()>::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::inbound::Inbound>::run::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::inbound::Inbound>::run::{closure#0}::{closure#0}::{closure#0}>, ()>::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::outbound::Outbound>::run::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::outbound::Outbound>::run::{closure#0}::{closure#0}::{closure#0}>, ()>::{closure#0}::{closure#0}
Unexecuted instantiation: <hickory_server::server::server_future::ServerFuture<ztunnel::dns::handler::Handler>>::register_socket::{closure#0}::{closure#1}
Unexecuted instantiation: <hickory_server::server::server_future::ServerFuture<ztunnel::dns::handler::Handler>>::register_listener::{closure#0}::{closure#1}
Unexecuted instantiation: <pingora_pool::connection::ConnectionPool<_>>::idle_poll::<_>::{closure#0}::{closure#0}
Unexecuted instantiation: <pingora_pool::connection::ConnectionPool<_>>::idle_timeout::{closure#0}::{closure#0}
Unexecuted instantiation: <hickory_server::server::server_future::ServerFuture<_>>::register_socket::{closure#0}::{closure#1}
Unexecuted instantiation: <hickory_server::server::server_future::ServerFuture<_>>::register_listener::{closure#0}::{closure#1}
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
}