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