Coverage Report

Created: 2026-02-14 06:16

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.2/src/macros/select.rs
Line
Count
Source
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
        /// # Alternatives from the Ecosystem
402
        ///
403
        /// The `select!` macro is a powerful tool for managing multiple asynchronous
404
        /// branches, enabling tasks to run concurrently within the same thread. However,
405
        /// its use can introduce challenges, particularly around cancellation safety, which
406
        /// can lead to subtle and hard-to-debug errors. For many use cases, ecosystem
407
        /// alternatives may be preferable as they mitigate these concerns by offering
408
        /// clearer syntax, more predictable control flow, and reducing the need to manually
409
        /// handle issues like fuse semantics or cancellation safety.
410
        ///
411
        /// ## Merging Streams
412
        ///
413
        /// For cases where `loop { select! { ... } }` is used to poll multiple tasks,
414
        /// stream merging offers a concise alternative, inherently handle cancellation-safe
415
        /// processing, removing the risk of data loss. Libraries such as [`tokio_stream`],
416
        /// [`futures::stream`] and [`futures_concurrency`] provide tools for merging
417
        /// streams and handling their outputs sequentially.
418
        ///
419
        /// [`tokio_stream`]: https://docs.rs/tokio-stream/latest/tokio_stream/
420
        /// [`futures::stream`]: https://docs.rs/futures/latest/futures/stream/
421
        /// [`futures_concurrency`]: https://docs.rs/futures-concurrency/latest/futures_concurrency/
422
        ///
423
        /// ### Example with `select!`
424
        ///
425
        /// ```
426
        /// struct File;
427
        /// struct Channel;
428
        /// struct Socket;
429
        ///
430
        /// impl Socket {
431
        ///     async fn read_packet(&mut self) -> Vec<u8> {
432
        ///         vec![]
433
        ///     }
434
        /// }
435
        ///
436
        /// async fn read_send(_file: &mut File, _channel: &mut Channel) {
437
        ///     // do work that is not cancel safe
438
        /// }
439
        ///
440
        /// #[tokio::main]
441
        /// async fn main() {
442
        ///     // open our IO types
443
        ///     let mut file = File;
444
        ///     let mut channel = Channel;
445
        ///     let mut socket = Socket;
446
        ///
447
        ///     loop {
448
        ///         tokio::select! {
449
        ///             _ = read_send(&mut file, &mut channel) => { /* ... */ },
450
        ///             _data = socket.read_packet() => { /* ... */ }
451
        ///             _ = futures::future::ready(()) => break
452
        ///         }
453
        ///     }
454
        /// }
455
        ///
456
        /// ```
457
        ///
458
        /// ### Moving to `merge`
459
        ///
460
        /// By using merge, you can unify multiple asynchronous tasks into a single stream,
461
        /// eliminating the need to manage tasks manually and reducing the risk of
462
        /// unintended behavior like data loss.
463
        ///
464
        /// ```
465
        /// use std::pin::pin;
466
        ///
467
        /// use futures::stream::unfold;
468
        /// use tokio_stream::StreamExt;
469
        ///
470
        /// struct File;
471
        /// struct Channel;
472
        /// struct Socket;
473
        ///
474
        /// impl Socket {
475
        ///     async fn read_packet(&mut self) -> Vec<u8> {
476
        ///         vec![]
477
        ///     }
478
        /// }
479
        ///
480
        /// async fn read_send(_file: &mut File, _channel: &mut Channel) {
481
        ///     // do work that is not cancel safe
482
        /// }
483
        ///
484
        /// enum Message {
485
        ///     Stop,
486
        ///     Sent,
487
        ///     Data(Vec<u8>),
488
        /// }
489
        ///
490
        /// #[tokio::main]
491
        /// async fn main() {
492
        ///     // open our IO types
493
        ///     let file = File;
494
        ///     let channel = Channel;
495
        ///     let socket = Socket;
496
        ///
497
        ///     let a = unfold((file, channel), |(mut file, mut channel)| async {
498
        ///         read_send(&mut file, &mut channel).await;
499
        ///         Some((Message::Sent, (file, channel)))
500
        ///     });
501
        ///     let b = unfold(socket, |mut socket| async {
502
        ///         let data = socket.read_packet().await;
503
        ///         Some((Message::Data(data), socket))
504
        ///     });
505
        ///     let c = tokio_stream::iter([Message::Stop]);
506
        ///
507
        ///     let mut s = pin!(a.merge(b).merge(c));
508
        ///     while let Some(msg) = s.next().await {
509
        ///         match msg {
510
        ///             Message::Data(_data) => { /* ... */ }
511
        ///             Message::Sent => continue,
512
        ///             Message::Stop => break,
513
        ///         }
514
        ///     }
515
        /// }
516
        /// ```
517
        ///
518
        /// ## Racing Futures
519
        ///
520
        /// If you need to wait for the first completion among several asynchronous tasks,
521
        /// ecosystem utilities such as
522
        /// [`futures`](https://docs.rs/futures/latest/futures/),
523
        /// [`futures-lite`](https://docs.rs/futures-lite/latest/futures_lite/) or
524
        /// [`futures-concurrency`](https://docs.rs/futures-concurrency/latest/futures_concurrency/)
525
        /// provide streamlined syntax for racing futures:
526
        ///
527
        /// - [`futures_concurrency::future::Race`](https://docs.rs/futures-concurrency/latest/futures_concurrency/future/trait.Race.html)
528
        /// - [`futures::select`](https://docs.rs/futures/latest/futures/macro.select.html)
529
        /// - [`futures::stream::select_all`](https://docs.rs/futures/latest/futures/stream/select_all/index.html) (for streams)
530
        /// - [`futures_lite::future::or`](https://docs.rs/futures-lite/latest/futures_lite/future/fn.or.html)
531
        /// - [`futures_lite::future::race`](https://docs.rs/futures-lite/latest/futures_lite/future/fn.race.html)
532
        ///
533
        /// ```
534
        /// use futures_concurrency::future::Race;
535
        ///
536
        /// #[tokio::main]
537
        /// async fn main() {
538
        ///     let task_a = async { Ok("ok") };
539
        ///     let task_b = async { Err("error") };
540
        ///     let result = (task_a, task_b).race().await;
541
        ///
542
        ///     match result {
543
        ///         Ok(output) => println!("First task completed with: {output}"),
544
        ///         Err(err) => eprintln!("Error occurred: {err}"),
545
        ///     }
546
        /// }
547
        /// ```
548
        #[macro_export]
549
        #[cfg_attr(docsrs, doc(cfg(feature = "macros")))]
550
        $select
551
    };
552
}
553
554
#[cfg(doc)]
555
doc! {macro_rules! select {
556
    {
557
        $(
558
            biased;
559
        )?
560
        $(
561
            $bind:pat = $fut:expr $(, if $cond:expr)? => $handler:expr,
562
        )*
563
        $(
564
            else => $els:expr $(,)?
565
        )?
566
    } => {
567
        unimplemented!()
568
    };
569
}}
570
571
#[cfg(not(doc))]
572
doc! {macro_rules! select {
573
    // Uses a declarative macro to do **most** of the work. While it is possible
574
    // to implement fully with a declarative macro, a procedural macro is used
575
    // to enable improved error messages.
576
    //
577
    // The macro is structured as a tt-muncher. All branches are processed and
578
    // normalized. Once the input is normalized, it is passed to the top-most
579
    // rule. When entering the macro, `@{ }` is inserted at the front. This is
580
    // used to collect the normalized input.
581
    //
582
    // The macro only recurses once per branch. This allows using `select!`
583
    // without requiring the user to increase the recursion limit.
584
585
    // All input is normalized, now transform.
586
    (@ {
587
        // The index of the future to poll first (in bias mode), or the RNG
588
        // expression to use to pick a future to poll first.
589
        start=$start:expr;
590
591
        // One `_` for each branch in the `select!` macro. Passing this to
592
        // `count!` converts $skip to an integer.
593
        ( $($count:tt)* )
594
595
        // Normalized select branches. `( $skip )` is a set of `_` characters.
596
        // There is one `_` for each select branch **before** this one. Given
597
        // that all input futures are stored in a tuple, $skip is useful for
598
        // generating a pattern to reference the future for the current branch.
599
        // $skip is also used as an argument to `count!`, returning the index of
600
        // the current select branch.
601
        $( ( $($skip:tt)* ) $bind:pat = $fut:expr, if $c:expr => $handle:expr, )+
602
603
        // Fallback expression used when all select branches have been disabled.
604
        ; $else:expr
605
606
    }) => {{
607
        // Enter a context where stable "function-like" proc macros can be used.
608
        //
609
        // This module is defined within a scope and should not leak out of this
610
        // macro.
611
        #[doc(hidden)]
612
        mod __tokio_select_util {
613
            // Generate an enum with one variant per select branch
614
            $crate::select_priv_declare_output_enum!( ( $($count)* ) );
615
        }
616
617
        // `tokio::macros::support` is a public, but doc(hidden) module
618
        // including a re-export of all types needed by this macro.
619
        use $crate::macros::support::Future;
620
        use $crate::macros::support::Pin;
621
        use $crate::macros::support::Poll::{Ready, Pending};
622
623
        const BRANCHES: u32 = $crate::count!( $($count)* );
624
625
        let mut disabled: __tokio_select_util::Mask = Default::default();
626
627
        // First, invoke all the pre-conditions. For any that return true,
628
        // set the appropriate bit in `disabled`.
629
        $(
630
            if !$c {
631
                let mask: __tokio_select_util::Mask = 1 << $crate::count!( $($skip)* );
632
                disabled |= mask;
633
            }
634
        )*
635
636
        // Create a scope to separate polling from handling the output. This
637
        // adds borrow checker flexibility when using the macro.
638
        let mut output = {
639
            // Store each future directly first (that is, without wrapping the future in a call to
640
            // `IntoFuture::into_future`). This allows the `$fut` expression to make use of
641
            // temporary lifetime extension.
642
            //
643
            // https://doc.rust-lang.org/1.58.1/reference/destructors.html#temporary-lifetime-extension
644
            let futures_init = ($( $fut, )+);
645
646
            // Safety: Nothing must be moved out of `futures`. This is to
647
            // satisfy the requirement of `Pin::new_unchecked` called below.
648
            //
649
            // We can't use the `pin!` macro for this because `futures` is a
650
            // tuple and the standard library provides no way to pin-project to
651
            // the fields of a tuple.
652
            let mut futures = ($( $crate::macros::support::IntoFuture::into_future(
653
                        $crate::count_field!( futures_init.$($skip)* )
654
            ),)+);
655
656
            // This assignment makes sure that the `poll_fn` closure only has a
657
            // reference to the futures, instead of taking ownership of them.
658
            // This mitigates the issue described in
659
            // <https://internals.rust-lang.org/t/surprising-soundness-trouble-around-pollfn/17484>
660
            let mut futures = &mut futures;
661
662
0
            $crate::macros::support::poll_fn(|cx| {
663
                // Return `Pending` when the task budget is depleted since budget-aware futures
664
                // are going to yield anyway and other futures will not cooperate.
665
0
                ::std::task::ready!($crate::macros::support::poll_budget_available(cx));
666
667
                // Track if any branch returns pending. If no branch completes
668
                // **or** returns pending, this implies that all branches are
669
                // disabled.
670
0
                let mut is_pending = false;
671
672
                // Choose a starting index to begin polling the futures at. In
673
                // practice, this will either be a pseudo-randomly generated
674
                // number by default, or the constant 0 if `biased;` is
675
                // supplied.
676
0
                let start = $start;
677
678
0
                for i in 0..BRANCHES {
679
                    let branch;
680
                    #[allow(clippy::modulo_one)]
681
0
                    {
682
0
                        branch = (start + i) % BRANCHES;
683
0
                    }
684
0
                    match branch {
685
                        $(
686
                            #[allow(unreachable_code)]
687
                            $crate::count!( $($skip)* ) => {
688
                                // First, if the future has previously been
689
                                // disabled, do not poll it again. This is done
690
                                // by checking the associated bit in the
691
                                // `disabled` bit field.
692
0
                                let mask = 1 << branch;
693
694
0
                                if disabled & mask == mask {
695
                                    // The future has been disabled.
696
0
                                    continue;
697
0
                                }
698
699
                                // Extract the future for this branch from the
700
                                // tuple
701
0
                                let ( $($skip,)* fut, .. ) = &mut *futures;
702
703
                                // Safety: future is stored on the stack above
704
                                // and never moved.
705
0
                                let mut fut = unsafe { Pin::new_unchecked(fut) };
706
707
                                // Try polling it
708
0
                                let out = match Future::poll(fut, cx) {
709
0
                                    Ready(out) => out,
710
                                    Pending => {
711
                                        // Track that at least one future is
712
                                        // still pending and continue polling.
713
0
                                        is_pending = true;
714
0
                                        continue;
715
                                    }
716
                                };
717
718
                                // Disable the future from future polling.
719
0
                                disabled |= mask;
720
721
                                // The future returned a value, check if matches
722
                                // the specified pattern.
723
                                #[allow(unused_variables)]
724
                                #[allow(unused_mut)]
725
0
                                match &out {
726
0
                                    $crate::select_priv_clean_pattern!($bind) => {}
727
0
                                    _ => continue,
728
                                }
729
730
                                // The select is complete, return the value
731
0
                                return Ready($crate::select_variant!(__tokio_select_util::Out, ($($skip)*))(out));
732
                            }
733
                        )*
734
0
                        _ => unreachable!("reaching this means there probably is an off by one bug"),
735
                    }
736
                }
737
738
0
                if is_pending {
739
0
                    Pending
740
                } else {
741
                    // All branches have been disabled.
742
0
                    Ready(__tokio_select_util::Out::Disabled)
743
                }
744
0
            }).await
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::state::DemandProxyState>::wait_for_workload::{closure#0}::{closure#2}
Unexecuted instantiation: <ztunnel::proxy::connection_manager::PolicyWatcher>::run::{closure#0}::{closure#0}
Unexecuted instantiation: <pingora_pool::connection::ConnectionPool<ztunnel::proxy::h2::client::H2ConnectClient>>::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: <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: <ztunnel::dns::server::Server>::run::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::proxy::h2::client::drive_connection::<tokio_rustls::client::TlsStream<ztunnel::proxy::h2::TokioH2Stream>, bytes::bytes::Bytes>::{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::identity::manager::Worker>::run::{closure#0}::{closure#1}
Unexecuted instantiation: <ztunnel::identity::manager::SecretManager>::wait::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::inbound_passthrough::InboundPassthrough>::run::{closure#0}::{closure#0}, ()>::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::socks5::Socks5>::run::{closure#0}::{closure#0}, ()>::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::inbound::Inbound>::run::{closure#0}::{closure#0}, ()>::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::outbound::Outbound>::run::{closure#0}::{closure#0}, ()>::{closure#0}::{closure#0}
Unexecuted instantiation: ztunnel::signal::imp::shutdown::{closure#0}::{closure#0}
Unexecuted instantiation: <ztunnel::proxy::socks5::Socks5>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#1}
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: <ztunnel::inpod::workloadmanager::WorkloadProxyManager>::run_internal::{closure#0}::{closure#1}
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: <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}
745
        };
746
747
        match output {
748
            $(
749
                $crate::select_variant!(__tokio_select_util::Out, ($($skip)*) ($bind)) => $handle,
750
            )*
751
            __tokio_select_util::Out::Disabled => $else,
752
            _ => unreachable!("failed to match bind"),
753
        }
754
    }};
755
756
    // ==== Normalize =====
757
758
    // These rules match a single `select!` branch and normalize it for
759
    // processing by the first rule.
760
761
    (@ { start=$start:expr; $($t:tt)* } ) => {
762
        // No `else` branch
763
        $crate::select!(@{ start=$start; $($t)*; panic!("all branches are disabled and there is no else branch") })
764
    };
765
    (@ { start=$start:expr; $($t:tt)* } else => $else:expr $(,)?) => {
766
        $crate::select!(@{ start=$start; $($t)*; $else })
767
    };
768
    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:block, $($r:tt)* ) => {
769
        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, } $($r)*)
770
    };
771
    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:block, $($r:tt)* ) => {
772
        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, } $($r)*)
773
    };
774
    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:block $($r:tt)* ) => {
775
        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, } $($r)*)
776
    };
777
    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:block $($r:tt)* ) => {
778
        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, } $($r)*)
779
    };
780
    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:expr ) => {
781
        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, })
782
    };
783
    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:expr ) => {
784
        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, })
785
    };
786
    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr, if $c:expr => $h:expr, $($r:tt)* ) => {
787
        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if $c => $h, } $($r)*)
788
    };
789
    (@ { start=$start:expr; ( $($s:tt)* ) $($t:tt)* } $p:pat = $f:expr => $h:expr, $($r:tt)* ) => {
790
        $crate::select!(@{ start=$start; ($($s)* _) $($t)* ($($s)*) $p = $f, if true => $h, } $($r)*)
791
    };
792
793
    // ===== Entry point =====
794
795
    ($(biased;)? else => $else:expr $(,)? ) => {{
796
        $else
797
    }};
798
799
    (biased; $p:pat = $($t:tt)* ) => {
800
        $crate::select!(@{ start=0; () } $p = $($t)*)
801
    };
802
803
    ( $p:pat = $($t:tt)* ) => {
804
        // Randomly generate a starting point. This makes `select!` a bit more
805
        // fair and avoids always polling the first future.
806
        $crate::select!(@{ start={ $crate::macros::support::thread_rng_n(BRANCHES) }; () } $p = $($t)*)
807
    };
808
809
    () => {
810
        compile_error!("select! requires at least one branch.")
811
    };
812
}}
813
814
// And here... we manually list out matches for up to 64 branches... I'm not
815
// happy about it either, but this is how we manage to use a declarative macro!
816
817
#[macro_export]
818
#[doc(hidden)]
819
macro_rules! count {
820
    () => {
821
        0
822
    };
823
    (_) => {
824
        1
825
    };
826
    (_ _) => {
827
        2
828
    };
829
    (_ _ _) => {
830
        3
831
    };
832
    (_ _ _ _) => {
833
        4
834
    };
835
    (_ _ _ _ _) => {
836
        5
837
    };
838
    (_ _ _ _ _ _) => {
839
        6
840
    };
841
    (_ _ _ _ _ _ _) => {
842
        7
843
    };
844
    (_ _ _ _ _ _ _ _) => {
845
        8
846
    };
847
    (_ _ _ _ _ _ _ _ _) => {
848
        9
849
    };
850
    (_ _ _ _ _ _ _ _ _ _) => {
851
        10
852
    };
853
    (_ _ _ _ _ _ _ _ _ _ _) => {
854
        11
855
    };
856
    (_ _ _ _ _ _ _ _ _ _ _ _) => {
857
        12
858
    };
859
    (_ _ _ _ _ _ _ _ _ _ _ _ _) => {
860
        13
861
    };
862
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
863
        14
864
    };
865
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
866
        15
867
    };
868
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
869
        16
870
    };
871
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
872
        17
873
    };
874
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
875
        18
876
    };
877
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
878
        19
879
    };
880
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
881
        20
882
    };
883
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
884
        21
885
    };
886
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
887
        22
888
    };
889
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
890
        23
891
    };
892
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
893
        24
894
    };
895
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
896
        25
897
    };
898
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
899
        26
900
    };
901
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
902
        27
903
    };
904
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
905
        28
906
    };
907
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
908
        29
909
    };
910
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
911
        30
912
    };
913
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
914
        31
915
    };
916
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
917
        32
918
    };
919
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
920
        33
921
    };
922
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
923
        34
924
    };
925
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
926
        35
927
    };
928
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
929
        36
930
    };
931
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
932
        37
933
    };
934
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
935
        38
936
    };
937
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
938
        39
939
    };
940
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
941
        40
942
    };
943
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
944
        41
945
    };
946
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
947
        42
948
    };
949
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
950
        43
951
    };
952
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
953
        44
954
    };
955
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
956
        45
957
    };
958
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
959
        46
960
    };
961
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
962
        47
963
    };
964
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
965
        48
966
    };
967
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
968
        49
969
    };
970
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
971
        50
972
    };
973
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
974
        51
975
    };
976
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
977
        52
978
    };
979
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
980
        53
981
    };
982
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
983
        54
984
    };
985
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
986
        55
987
    };
988
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
989
        56
990
    };
991
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
992
        57
993
    };
994
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
995
        58
996
    };
997
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
998
        59
999
    };
1000
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1001
        60
1002
    };
1003
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1004
        61
1005
    };
1006
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1007
        62
1008
    };
1009
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1010
        63
1011
    };
1012
    (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1013
        64
1014
    };
1015
}
1016
1017
#[macro_export]
1018
#[doc(hidden)]
1019
macro_rules! count_field {
1020
    ($var:ident. ) => {
1021
        $var.0
1022
    };
1023
    ($var:ident. _) => {
1024
        $var.1
1025
    };
1026
    ($var:ident. _ _) => {
1027
        $var.2
1028
    };
1029
    ($var:ident. _ _ _) => {
1030
        $var.3
1031
    };
1032
    ($var:ident. _ _ _ _) => {
1033
        $var.4
1034
    };
1035
    ($var:ident. _ _ _ _ _) => {
1036
        $var.5
1037
    };
1038
    ($var:ident. _ _ _ _ _ _) => {
1039
        $var.6
1040
    };
1041
    ($var:ident. _ _ _ _ _ _ _) => {
1042
        $var.7
1043
    };
1044
    ($var:ident. _ _ _ _ _ _ _ _) => {
1045
        $var.8
1046
    };
1047
    ($var:ident. _ _ _ _ _ _ _ _ _) => {
1048
        $var.9
1049
    };
1050
    ($var:ident. _ _ _ _ _ _ _ _ _ _) => {
1051
        $var.10
1052
    };
1053
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _) => {
1054
        $var.11
1055
    };
1056
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _) => {
1057
        $var.12
1058
    };
1059
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1060
        $var.13
1061
    };
1062
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1063
        $var.14
1064
    };
1065
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1066
        $var.15
1067
    };
1068
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1069
        $var.16
1070
    };
1071
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1072
        $var.17
1073
    };
1074
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1075
        $var.18
1076
    };
1077
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1078
        $var.19
1079
    };
1080
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1081
        $var.20
1082
    };
1083
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1084
        $var.21
1085
    };
1086
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1087
        $var.22
1088
    };
1089
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1090
        $var.23
1091
    };
1092
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1093
        $var.24
1094
    };
1095
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1096
        $var.25
1097
    };
1098
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1099
        $var.26
1100
    };
1101
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1102
        $var.27
1103
    };
1104
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1105
        $var.28
1106
    };
1107
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1108
        $var.29
1109
    };
1110
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1111
        $var.30
1112
    };
1113
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1114
        $var.31
1115
    };
1116
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1117
        $var.32
1118
    };
1119
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1120
        $var.33
1121
    };
1122
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1123
        $var.34
1124
    };
1125
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1126
        $var.35
1127
    };
1128
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1129
        $var.36
1130
    };
1131
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1132
        $var.37
1133
    };
1134
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1135
        $var.38
1136
    };
1137
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1138
        $var.39
1139
    };
1140
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1141
        $var.40
1142
    };
1143
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1144
        $var.41
1145
    };
1146
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1147
        $var.42
1148
    };
1149
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1150
        $var.43
1151
    };
1152
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1153
        $var.44
1154
    };
1155
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1156
        $var.45
1157
    };
1158
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1159
        $var.46
1160
    };
1161
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1162
        $var.47
1163
    };
1164
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1165
        $var.48
1166
    };
1167
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1168
        $var.49
1169
    };
1170
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1171
        $var.50
1172
    };
1173
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1174
        $var.51
1175
    };
1176
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1177
        $var.52
1178
    };
1179
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1180
        $var.53
1181
    };
1182
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1183
        $var.54
1184
    };
1185
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1186
        $var.55
1187
    };
1188
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1189
        $var.56
1190
    };
1191
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1192
        $var.57
1193
    };
1194
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1195
        $var.58
1196
    };
1197
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1198
        $var.59
1199
    };
1200
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1201
        $var.60
1202
    };
1203
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1204
        $var.61
1205
    };
1206
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1207
        $var.62
1208
    };
1209
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1210
        $var.63
1211
    };
1212
    ($var:ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1213
        $var.64
1214
    };
1215
}
1216
1217
#[macro_export]
1218
#[doc(hidden)]
1219
macro_rules! select_variant {
1220
    ($($p:ident)::*, () $($t:tt)*) => {
1221
        $($p)::*::_0 $($t)*
1222
    };
1223
    ($($p:ident)::*, (_) $($t:tt)*) => {
1224
        $($p)::*::_1 $($t)*
1225
    };
1226
    ($($p:ident)::*, (_ _) $($t:tt)*) => {
1227
        $($p)::*::_2 $($t)*
1228
    };
1229
    ($($p:ident)::*, (_ _ _) $($t:tt)*) => {
1230
        $($p)::*::_3 $($t)*
1231
    };
1232
    ($($p:ident)::*, (_ _ _ _) $($t:tt)*) => {
1233
        $($p)::*::_4 $($t)*
1234
    };
1235
    ($($p:ident)::*, (_ _ _ _ _) $($t:tt)*) => {
1236
        $($p)::*::_5 $($t)*
1237
    };
1238
    ($($p:ident)::*, (_ _ _ _ _ _) $($t:tt)*) => {
1239
        $($p)::*::_6 $($t)*
1240
    };
1241
    ($($p:ident)::*, (_ _ _ _ _ _ _) $($t:tt)*) => {
1242
        $($p)::*::_7 $($t)*
1243
    };
1244
    ($($p:ident)::*, (_ _ _ _ _ _ _ _) $($t:tt)*) => {
1245
        $($p)::*::_8 $($t)*
1246
    };
1247
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1248
        $($p)::*::_9 $($t)*
1249
    };
1250
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1251
        $($p)::*::_10 $($t)*
1252
    };
1253
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1254
        $($p)::*::_11 $($t)*
1255
    };
1256
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1257
        $($p)::*::_12 $($t)*
1258
    };
1259
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1260
        $($p)::*::_13 $($t)*
1261
    };
1262
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1263
        $($p)::*::_14 $($t)*
1264
    };
1265
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1266
        $($p)::*::_15 $($t)*
1267
    };
1268
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1269
        $($p)::*::_16 $($t)*
1270
    };
1271
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1272
        $($p)::*::_17 $($t)*
1273
    };
1274
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1275
        $($p)::*::_18 $($t)*
1276
    };
1277
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1278
        $($p)::*::_19 $($t)*
1279
    };
1280
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1281
        $($p)::*::_20 $($t)*
1282
    };
1283
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1284
        $($p)::*::_21 $($t)*
1285
    };
1286
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1287
        $($p)::*::_22 $($t)*
1288
    };
1289
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1290
        $($p)::*::_23 $($t)*
1291
    };
1292
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1293
        $($p)::*::_24 $($t)*
1294
    };
1295
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1296
        $($p)::*::_25 $($t)*
1297
    };
1298
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1299
        $($p)::*::_26 $($t)*
1300
    };
1301
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1302
        $($p)::*::_27 $($t)*
1303
    };
1304
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1305
        $($p)::*::_28 $($t)*
1306
    };
1307
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1308
        $($p)::*::_29 $($t)*
1309
    };
1310
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1311
        $($p)::*::_30 $($t)*
1312
    };
1313
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1314
        $($p)::*::_31 $($t)*
1315
    };
1316
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1317
        $($p)::*::_32 $($t)*
1318
    };
1319
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1320
        $($p)::*::_33 $($t)*
1321
    };
1322
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1323
        $($p)::*::_34 $($t)*
1324
    };
1325
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1326
        $($p)::*::_35 $($t)*
1327
    };
1328
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1329
        $($p)::*::_36 $($t)*
1330
    };
1331
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1332
        $($p)::*::_37 $($t)*
1333
    };
1334
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1335
        $($p)::*::_38 $($t)*
1336
    };
1337
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1338
        $($p)::*::_39 $($t)*
1339
    };
1340
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1341
        $($p)::*::_40 $($t)*
1342
    };
1343
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1344
        $($p)::*::_41 $($t)*
1345
    };
1346
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1347
        $($p)::*::_42 $($t)*
1348
    };
1349
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1350
        $($p)::*::_43 $($t)*
1351
    };
1352
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1353
        $($p)::*::_44 $($t)*
1354
    };
1355
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1356
        $($p)::*::_45 $($t)*
1357
    };
1358
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1359
        $($p)::*::_46 $($t)*
1360
    };
1361
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1362
        $($p)::*::_47 $($t)*
1363
    };
1364
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1365
        $($p)::*::_48 $($t)*
1366
    };
1367
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1368
        $($p)::*::_49 $($t)*
1369
    };
1370
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1371
        $($p)::*::_50 $($t)*
1372
    };
1373
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1374
        $($p)::*::_51 $($t)*
1375
    };
1376
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1377
        $($p)::*::_52 $($t)*
1378
    };
1379
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1380
        $($p)::*::_53 $($t)*
1381
    };
1382
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1383
        $($p)::*::_54 $($t)*
1384
    };
1385
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1386
        $($p)::*::_55 $($t)*
1387
    };
1388
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1389
        $($p)::*::_56 $($t)*
1390
    };
1391
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1392
        $($p)::*::_57 $($t)*
1393
    };
1394
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1395
        $($p)::*::_58 $($t)*
1396
    };
1397
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1398
        $($p)::*::_59 $($t)*
1399
    };
1400
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1401
        $($p)::*::_60 $($t)*
1402
    };
1403
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1404
        $($p)::*::_61 $($t)*
1405
    };
1406
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1407
        $($p)::*::_62 $($t)*
1408
    };
1409
    ($($p:ident)::*, (_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) $($t:tt)*) => {
1410
        $($p)::*::_63 $($t)*
1411
    };
1412
}