/rust/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.43.0/src/macros/select.rs
Line | Count | Source (jump to first uncovered line) |
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 | 0 | $crate::macros::support::poll_fn(|cx| { |
516 | 0 | // Track if any branch returns pending. If no branch completes |
517 | 0 | // **or** returns pending, this implies that all branches are |
518 | 0 | // disabled. |
519 | 0 | let mut is_pending = false; |
520 | 0 |
|
521 | 0 | // Choose a starting index to begin polling the futures at. In |
522 | 0 | // practice, this will either be a pseudo-randomly generated |
523 | 0 | // number by default, or the constant 0 if `biased;` is |
524 | 0 | // supplied. |
525 | 0 | let start = $start; |
526 | | |
527 | 0 | for i in 0..BRANCHES { |
528 | | let branch; |
529 | | #[allow(clippy::modulo_one)] |
530 | 0 | { |
531 | 0 | branch = (start + i) % BRANCHES; |
532 | 0 | } |
533 | 0 | 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 | 0 | let mask = 1 << branch; |
542 | 0 |
|
543 | 0 | if disabled & mask == mask { |
544 | | // The future has been disabled. |
545 | 0 | continue; |
546 | 0 | } |
547 | 0 |
|
548 | 0 | // Extract the future for this branch from the |
549 | 0 | // tuple |
550 | 0 | let ( $($skip,)* fut, .. ) = &mut *futures; |
551 | 0 |
|
552 | 0 | // Safety: future is stored on the stack above |
553 | 0 | // and never moved. |
554 | 0 | let mut fut = unsafe { Pin::new_unchecked(fut) }; |
555 | | |
556 | | // Try polling it |
557 | 0 | let out = match Future::poll(fut, cx) { |
558 | 0 | Ready(out) => out, |
559 | | Pending => { |
560 | | // Track that at least one future is |
561 | | // still pending and continue polling. |
562 | 0 | is_pending = true; |
563 | 0 | continue; |
564 | | } |
565 | | }; |
566 | | |
567 | | // Disable the future from future polling. |
568 | 0 | disabled |= mask; |
569 | 0 |
|
570 | 0 | // The future returned a value, check if matches |
571 | 0 | // the specified pattern. |
572 | 0 | #[allow(unused_variables)] |
573 | 0 | #[allow(unused_mut)] |
574 | 0 | match &out { |
575 | 0 | $crate::select_priv_clean_pattern!($bind) => {} |
576 | 0 | _ => continue, |
577 | 0 | } |
578 | 0 |
|
579 | 0 | // The select is complete, return the value |
580 | 0 | return Ready($crate::select_variant!(__tokio_select_util::Out, ($($skip)*))(out)); |
581 | | } |
582 | | )* |
583 | 0 | _ => unreachable!("reaching this means there probably is an off by one bug"), |
584 | | } |
585 | | } |
586 | | |
587 | 0 | if is_pending { |
588 | 0 | Pending |
589 | | } else { |
590 | | // All branches have been disabled. |
591 | 0 | Ready(__tokio_select_util::Out::Disabled) |
592 | | } |
593 | | }).await Unexecuted instantiation: ztunnel::signal::imp::shutdown::{closure#0}::{closure#0} Unexecuted instantiation: <ztunnel::xds::client::AdsClient>::run_internal::{closure#0}::{closure#6} Unexecuted instantiation: <ztunnel::inpod::protocol::WorkloadStreamProcessor>::read_message::{closure#0}::{closure#1} Unexecuted instantiation: <pingora_pool::connection::ConnectionPool<ztunnel::proxy::pool::ConnClient>>::idle_timeout::{closure#0}::{closure#0} Unexecuted instantiation: <ztunnel::proxy::inbound::Inbound>::serve_connect::{closure#0}::{closure#5} Unexecuted instantiation: <ztunnel::proxy::outbound::Outbound>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#1} Unexecuted instantiation: <ztunnel::proxy::connection_manager::PolicyWatcher>::run::{closure#0}::{closure#0} Unexecuted instantiation: ztunnel::proxy::h2::client::drive_connection::<tokio_rustls::client::TlsStream<tokio::net::tcp::stream::TcpStream>, bytes::bytes::Bytes>::{closure#0}::{closure#0} Unexecuted instantiation: ztunnel::proxy::h2::server::serve_connection::<<ztunnel::proxy::inbound::Inbound>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::inbound::Inbound>::serve_connect::{closure#0}>>::{closure#0}::{closure#2} Unexecuted instantiation: ztunnel::proxy::h2::server::serve_connection::<<ztunnel::proxy::inbound::Inbound>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::inbound::Inbound>::serve_connect::{closure#0}>>::{closure#0}::{closure#5} Unexecuted instantiation: <ztunnel::inpod::workloadmanager::WorkloadProxyManager>::run_internal::{closure#0}::{closure#1} Unexecuted instantiation: <ztunnel::identity::manager::Worker>::run::{closure#0}::{closure#1} Unexecuted instantiation: <ztunnel::identity::manager::SecretManager>::wait::{closure#0}::{closure#0} Unexecuted instantiation: <ztunnel::dns::server::Server>::run::{closure#0}::{closure#0} Unexecuted instantiation: <ztunnel::state::DemandProxyState>::wait_for_workload::{closure#0}::{closure#2} Unexecuted instantiation: <ztunnel::proxy::inbound_passthrough::InboundPassthrough>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#1} Unexecuted instantiation: <ztunnel::proxy::inbound_passthrough::InboundPassthrough>::proxy_inbound_plaintext::{closure#0}::{closure#1} Unexecuted instantiation: <ztunnel::proxy::socks5::Socks5>::run::{closure#0}::{closure#0}::{closure#0}::{closure#0}::{closure#1} Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::inbound_passthrough::InboundPassthrough>::run::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::inbound_passthrough::InboundPassthrough>::run::{closure#0}::{closure#0}::{closure#0}>, ()>::{closure#0}::{closure#0} Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::socks5::Socks5>::run::{closure#0}::{closure#0}, <ztunnel::proxy::socks5::Socks5>::run::{closure#0}::{closure#0}::{closure#0}, ()>::{closure#0}::{closure#0} Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::inbound::Inbound>::run::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::inbound::Inbound>::run::{closure#0}::{closure#0}::{closure#0}>, ()>::{closure#0}::{closure#0} Unexecuted instantiation: ztunnel::drain::run_with_drain::<<ztunnel::proxy::outbound::Outbound>::run::{closure#0}::{closure#0}, tracing::instrument::Instrumented<<ztunnel::proxy::outbound::Outbound>::run::{closure#0}::{closure#0}::{closure#0}>, ()>::{closure#0}::{closure#0} Unexecuted instantiation: <hickory_server::server::server_future::ServerFuture<ztunnel::dns::handler::Handler>>::register_socket::{closure#0}::{closure#1} Unexecuted instantiation: <hickory_server::server::server_future::ServerFuture<ztunnel::dns::handler::Handler>>::register_listener::{closure#0}::{closure#1} Unexecuted instantiation: <pingora_pool::connection::ConnectionPool<_>>::idle_poll::<_>::{closure#0}::{closure#0} Unexecuted instantiation: <pingora_pool::connection::ConnectionPool<_>>::idle_timeout::{closure#0}::{closure#0} Unexecuted instantiation: <hickory_server::server::server_future::ServerFuture<_>>::register_socket::{closure#0}::{closure#1} Unexecuted instantiation: <hickory_server::server::server_future::ServerFuture<_>>::register_listener::{closure#0}::{closure#1} |
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 | | } |