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