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