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