Coverage Report

Created: 2024-05-20 06:38

/rust/registry/src/index.crates.io-6f17d22bba15001f/pin-project-lite-0.2.9/src/lib.rs
Line
Count
Source (jump to first uncovered line)
1
//! A lightweight version of [pin-project] written with declarative macros.
2
//!
3
//! # Examples
4
//!
5
//! [`pin_project!`] macro creates a projection type covering all the fields of struct.
6
//!
7
//! ```rust
8
//! use std::pin::Pin;
9
//!
10
//! use pin_project_lite::pin_project;
11
//!
12
//! pin_project! {
13
//!     struct Struct<T, U> {
14
//!         #[pin]
15
//!         pinned: T,
16
//!         unpinned: U,
17
//!     }
18
//! }
19
//!
20
//! impl<T, U> Struct<T, U> {
21
//!     fn method(self: Pin<&mut Self>) {
22
//!         let this = self.project();
23
//!         let _: Pin<&mut T> = this.pinned; // Pinned reference to the field
24
//!         let _: &mut U = this.unpinned; // Normal reference to the field
25
//!     }
26
//! }
27
//! ```
28
//!
29
//! To use [`pin_project!`] on enums, you need to name the projection type
30
//! returned from the method.
31
//!
32
//! ```rust
33
//! use std::pin::Pin;
34
//!
35
//! use pin_project_lite::pin_project;
36
//!
37
//! pin_project! {
38
//!     #[project = EnumProj]
39
//!     enum Enum<T, U> {
40
//!         Variant { #[pin] pinned: T, unpinned: U },
41
//!     }
42
//! }
43
//!
44
//! impl<T, U> Enum<T, U> {
45
//!     fn method(self: Pin<&mut Self>) {
46
//!         match self.project() {
47
//!             EnumProj::Variant { pinned, unpinned } => {
48
//!                 let _: Pin<&mut T> = pinned;
49
//!                 let _: &mut U = unpinned;
50
//!             }
51
//!         }
52
//!     }
53
//! }
54
//! ```
55
//!
56
//! # [pin-project] vs pin-project-lite
57
//!
58
//! Here are some similarities and differences compared to [pin-project].
59
//!
60
//! ## Similar: Safety
61
//!
62
//! pin-project-lite guarantees safety in much the same way as [pin-project].
63
//! Both are completely safe unless you write other unsafe code.
64
//!
65
//! ## Different: Minimal design
66
//!
67
//! This library does not tackle as expansive of a range of use cases as
68
//! [pin-project] does. If your use case is not already covered, please use
69
//! [pin-project].
70
//!
71
//! ## Different: No proc-macro related dependencies
72
//!
73
//! This is the **only** reason to use this crate. However, **if you already
74
//! have proc-macro related dependencies in your crate's dependency graph, there
75
//! is no benefit from using this crate.** (Note: There is almost no difference
76
//! in the amount of code generated between [pin-project] and pin-project-lite.)
77
//!
78
//! ## Different: No useful error messages
79
//!
80
//! This macro does not handle any invalid input. So error messages are not to
81
//! be useful in most cases. If you do need useful error messages, then upon
82
//! error you can pass the same input to [pin-project] to receive a helpful
83
//! description of the compile error.
84
//!
85
//! ## Different: No support for custom Unpin implementation
86
//!
87
//! pin-project supports this by [`UnsafeUnpin`][unsafe-unpin] and [`!Unpin`][not-unpin].
88
//!
89
//! ## Different: No support for tuple structs and tuple variants
90
//!
91
//! pin-project supports this.
92
//!
93
//! [not-unpin]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#unpin
94
//! [pin-project]: https://github.com/taiki-e/pin-project
95
//! [unsafe-unpin]: https://docs.rs/pin-project/1/pin_project/attr.pin_project.html#unsafeunpin
96
97
#![no_std]
98
#![doc(test(
99
    no_crate_inject,
100
    attr(
101
        deny(warnings, rust_2018_idioms, single_use_lifetimes),
102
        allow(dead_code, unused_variables)
103
    )
104
))]
105
#![warn(rust_2018_idioms, single_use_lifetimes, unreachable_pub)]
106
#![warn(clippy::default_trait_access, clippy::wildcard_imports)]
107
108
/// A macro that creates a projection type covering all the fields of struct.
109
///
110
/// This macro creates a projection type according to the following rules:
111
///
112
/// - For the field that uses `#[pin]` attribute, makes the pinned reference to the field.
113
/// - For the other fields, makes the unpinned reference to the field.
114
///
115
/// And the following methods are implemented on the original type:
116
///
117
/// ```rust
118
/// # use std::pin::Pin;
119
/// # type Projection<'a> = &'a ();
120
/// # type ProjectionRef<'a> = &'a ();
121
/// # trait Dox {
122
/// fn project(self: Pin<&mut Self>) -> Projection<'_>;
123
/// fn project_ref(self: Pin<&Self>) -> ProjectionRef<'_>;
124
/// # }
125
/// ```
126
///
127
/// By passing an attribute with the same name as the method to the macro,
128
/// you can name the projection type returned from the method. This allows you
129
/// to use pattern matching on the projected types.
130
///
131
/// ```rust
132
/// # use pin_project_lite::pin_project;
133
/// # use std::pin::Pin;
134
/// pin_project! {
135
///     #[project = EnumProj]
136
///     enum Enum<T> {
137
///         Variant { #[pin] field: T },
138
///     }
139
/// }
140
///
141
/// impl<T> Enum<T> {
142
///     fn method(self: Pin<&mut Self>) {
143
///         let this: EnumProj<'_, T> = self.project();
144
///         match this {
145
///             EnumProj::Variant { field } => {
146
///                 let _: Pin<&mut T> = field;
147
///             }
148
///         }
149
///     }
150
/// }
151
/// ```
152
///
153
/// By passing the `#[project_replace = MyProjReplace]` attribute you may create an additional
154
/// method which allows the contents of `Pin<&mut Self>` to be replaced while simultaneously moving
155
/// out all unpinned fields in `Self`.
156
///
157
/// ```rust
158
/// # use std::pin::Pin;
159
/// # type MyProjReplace = ();
160
/// # trait Dox {
161
/// fn project_replace(self: Pin<&mut Self>, replacement: Self) -> MyProjReplace;
162
/// # }
163
/// ```
164
///
165
/// Also, note that the projection types returned by `project` and `project_ref` have
166
/// an additional lifetime at the beginning of generics.
167
///
168
/// ```text
169
/// let this: EnumProj<'_, T> = self.project();
170
///                    ^^
171
/// ```
172
///
173
/// The visibility of the projected types and projection methods is based on the
174
/// original type. However, if the visibility of the original type is `pub`, the
175
/// visibility of the projected types and the projection methods is downgraded
176
/// to `pub(crate)`.
177
///
178
/// # Safety
179
///
180
/// `pin_project!` macro guarantees safety in much the same way as [pin-project] crate.
181
/// Both are completely safe unless you write other unsafe code.
182
///
183
/// See [pin-project] crate for more details.
184
///
185
/// # Examples
186
///
187
/// ```rust
188
/// use std::pin::Pin;
189
///
190
/// use pin_project_lite::pin_project;
191
///
192
/// pin_project! {
193
///     struct Struct<T, U> {
194
///         #[pin]
195
///         pinned: T,
196
///         unpinned: U,
197
///     }
198
/// }
199
///
200
/// impl<T, U> Struct<T, U> {
201
///     fn method(self: Pin<&mut Self>) {
202
///         let this = self.project();
203
///         let _: Pin<&mut T> = this.pinned; // Pinned reference to the field
204
///         let _: &mut U = this.unpinned; // Normal reference to the field
205
///     }
206
/// }
207
/// ```
208
///
209
/// To use `pin_project!` on enums, you need to name the projection type
210
/// returned from the method.
211
///
212
/// ```rust
213
/// use std::pin::Pin;
214
///
215
/// use pin_project_lite::pin_project;
216
///
217
/// pin_project! {
218
///     #[project = EnumProj]
219
///     enum Enum<T> {
220
///         Struct {
221
///             #[pin]
222
///             field: T,
223
///         },
224
///         Unit,
225
///     }
226
/// }
227
///
228
/// impl<T> Enum<T> {
229
///     fn method(self: Pin<&mut Self>) {
230
///         match self.project() {
231
///             EnumProj::Struct { field } => {
232
///                 let _: Pin<&mut T> = field;
233
///             }
234
///             EnumProj::Unit => {}
235
///         }
236
///     }
237
/// }
238
/// ```
239
///
240
/// If you want to call the `project()` method multiple times or later use the
241
/// original [`Pin`] type, it needs to use [`.as_mut()`][`Pin::as_mut`] to avoid
242
/// consuming the [`Pin`].
243
///
244
/// ```rust
245
/// use std::pin::Pin;
246
///
247
/// use pin_project_lite::pin_project;
248
///
249
/// pin_project! {
250
///     struct Struct<T> {
251
///         #[pin]
252
///         field: T,
253
///     }
254
/// }
255
///
256
/// impl<T> Struct<T> {
257
///     fn call_project_twice(mut self: Pin<&mut Self>) {
258
///         // `project` consumes `self`, so reborrow the `Pin<&mut Self>` via `as_mut`.
259
///         self.as_mut().project();
260
///         self.as_mut().project();
261
///     }
262
/// }
263
/// ```
264
///
265
/// # `!Unpin`
266
///
267
/// If you want to ensure that [`Unpin`] is not implemented, use `#[pin]`
268
/// attribute for a [`PhantomPinned`] field.
269
///
270
/// ```rust
271
/// use std::marker::PhantomPinned;
272
///
273
/// use pin_project_lite::pin_project;
274
///
275
/// pin_project! {
276
///     struct Struct<T> {
277
///         field: T,
278
///         #[pin] // <------ This `#[pin]` is required to make `Struct` to `!Unpin`.
279
///         _pin: PhantomPinned,
280
///     }
281
/// }
282
/// ```
283
///
284
/// Note that using [`PhantomPinned`] without `#[pin]` attribute has no effect.
285
///
286
/// [`PhantomPinned`]: core::marker::PhantomPinned
287
/// [`Pin::as_mut`]: core::pin::Pin::as_mut
288
/// [`Pin`]: core::pin::Pin
289
/// [pin-project]: https://github.com/taiki-e/pin-project
290
#[macro_export]
291
macro_rules! pin_project {
292
    ($($tt:tt)*) => {
293
        $crate::__pin_project_internal! {
294
            [][][][]
295
            $($tt)*
296
        }
297
    };
298
}
299
300
// limitations:
301
// - no support for tuple structs and tuple variant (wontfix).
302
// - no support for multiple trait/lifetime bounds.
303
// - no support for `Self` in where clauses. (wontfix)
304
// - no support for overlapping lifetime names. (wontfix)
305
// - no interoperability with other field attributes.
306
// - no useful error messages. (wontfix)
307
// etc...
308
309
#[doc(hidden)]
310
#[macro_export]
311
macro_rules! __pin_project_expand {
312
    (
313
        [$($proj_mut_ident:ident)?]
314
        [$($proj_ref_ident:ident)?]
315
        [$($proj_replace_ident:ident)?]
316
        [$proj_vis:vis]
317
        [$(#[$attrs:meta])* $vis:vis $struct_ty_ident:ident $ident:ident]
318
        [$($def_generics:tt)*]
319
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
320
        {
321
            $($body_data:tt)*
322
        }
323
        $(impl $($pinned_drop:tt)*)?
324
    ) => {
325
        $crate::__pin_project_reconstruct! {
326
            [$(#[$attrs])* $vis $struct_ty_ident $ident]
327
            [$($def_generics)*] [$($impl_generics)*]
328
            [$($ty_generics)*] [$(where $($where_clause)*)?]
329
            {
330
                $($body_data)*
331
            }
332
        }
333
334
        $crate::__pin_project_make_proj_ty! {
335
            [$($proj_mut_ident)?]
336
            [$proj_vis $struct_ty_ident $ident]
337
            [__pin_project_make_proj_field_mut]
338
            [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
339
            {
340
                $($body_data)*
341
            }
342
        }
343
        $crate::__pin_project_make_proj_ty! {
344
            [$($proj_ref_ident)?]
345
            [$proj_vis $struct_ty_ident $ident]
346
            [__pin_project_make_proj_field_ref]
347
            [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
348
            {
349
                $($body_data)*
350
            }
351
        }
352
        $crate::__pin_project_make_proj_replace_ty! {
353
            [$($proj_replace_ident)?]
354
            [$proj_vis $struct_ty_ident]
355
            [__pin_project_make_proj_field_replace]
356
            [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
357
            {
358
                $($body_data)*
359
            }
360
        }
361
362
        $crate::__pin_project_constant! {
363
            [$(#[$attrs])* $vis $struct_ty_ident $ident]
364
            [$($proj_mut_ident)?] [$($proj_ref_ident)?] [$($proj_replace_ident)?]
365
            [$proj_vis]
366
            [$($def_generics)*] [$($impl_generics)*]
367
            [$($ty_generics)*] [$(where $($where_clause)*)?]
368
            {
369
                $($body_data)*
370
            }
371
            $(impl $($pinned_drop)*)?
372
        }
373
    };
374
}
375
376
#[doc(hidden)]
377
#[macro_export]
378
macro_rules! __pin_project_constant {
379
    (
380
        [$(#[$attrs:meta])* $vis:vis struct $ident:ident]
381
        [$($proj_mut_ident:ident)?] [$($proj_ref_ident:ident)?] [$($proj_replace_ident:ident)?]
382
        [$proj_vis:vis]
383
        [$($def_generics:tt)*]
384
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
385
        {
386
            $(
387
                $(#[$pin:ident])?
388
                $field_vis:vis $field:ident: $field_ty:ty
389
            ),+ $(,)?
390
        }
391
        $(impl $($pinned_drop:tt)*)?
392
    ) => {
393
        #[allow(explicit_outlives_requirements)] // https://github.com/rust-lang/rust/issues/60993
394
        #[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
395
        // This lint warns of `clippy::*` generated by external macros.
396
        // We allow this lint for compatibility with older compilers.
397
        #[allow(clippy::unknown_clippy_lints)]
398
        #[allow(clippy::redundant_pub_crate)] // This lint warns `pub(crate)` field in private struct.
399
        #[allow(clippy::used_underscore_binding)]
400
        const _: () = {
401
            $crate::__pin_project_make_proj_ty! {
402
                [$($proj_mut_ident)? Projection]
403
                [$proj_vis struct $ident]
404
                [__pin_project_make_proj_field_mut]
405
                [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
406
                {
407
                    $(
408
                        $(#[$pin])?
409
                        $field_vis $field: $field_ty
410
                    ),+
411
                }
412
            }
413
            $crate::__pin_project_make_proj_ty! {
414
                [$($proj_ref_ident)? ProjectionRef]
415
                [$proj_vis struct $ident]
416
                [__pin_project_make_proj_field_ref]
417
                [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
418
                {
419
                    $(
420
                        $(#[$pin])?
421
                        $field_vis $field: $field_ty
422
                    ),+
423
                }
424
            }
425
426
            impl <$($impl_generics)*> $ident <$($ty_generics)*>
427
            $(where
428
                $($where_clause)*)?
429
            {
430
                $crate::__pin_project_struct_make_proj_method! {
431
                    [$($proj_mut_ident)? Projection]
432
                    [$proj_vis]
433
                    [project get_unchecked_mut mut]
434
                    [$($ty_generics)*]
435
                    {
436
                        $(
437
                            $(#[$pin])?
438
                            $field_vis $field
439
                        ),+
440
                    }
441
                }
442
                $crate::__pin_project_struct_make_proj_method! {
443
                    [$($proj_ref_ident)? ProjectionRef]
444
                    [$proj_vis]
445
                    [project_ref get_ref]
446
                    [$($ty_generics)*]
447
                    {
448
                        $(
449
                            $(#[$pin])?
450
                            $field_vis $field
451
                        ),+
452
                    }
453
                }
454
                $crate::__pin_project_struct_make_proj_replace_method! {
455
                    [$($proj_replace_ident)?]
456
                    [$proj_vis]
457
                    [ProjectionReplace]
458
                    [$($ty_generics)*]
459
                    {
460
                        $(
461
                            $(#[$pin])?
462
                            $field_vis $field
463
                        ),+
464
                    }
465
                }
466
            }
467
468
            $crate::__pin_project_make_unpin_impl! {
469
                [$vis $ident]
470
                [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
471
                $(
472
                    $field: $crate::__pin_project_make_unpin_bound!(
473
                        $(#[$pin])? $field_ty
474
                    )
475
                ),+
476
            }
477
478
            $crate::__pin_project_make_drop_impl! {
479
                [$ident]
480
                [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
481
                $(impl $($pinned_drop)*)?
482
            }
483
484
            // Ensure that it's impossible to use pin projections on a #[repr(packed)] struct.
485
            //
486
            // Taking a reference to a packed field is UB, and applying
487
            // `#[forbid(unaligned_references)]` makes sure that doing this is a hard error.
488
            //
489
            // If the struct ends up having #[repr(packed)] applied somehow,
490
            // this will generate an (unfriendly) error message. Under all reasonable
491
            // circumstances, we'll detect the #[repr(packed)] attribute, and generate
492
            // a much nicer error above.
493
            //
494
            // See https://github.com/taiki-e/pin-project/pull/34 for more details.
495
            //
496
            // Note:
497
            // - Lint-based tricks aren't perfect, but they're much better than nothing:
498
            //   https://github.com/taiki-e/pin-project-lite/issues/26
499
            //
500
            // - Enable both unaligned_references and safe_packed_borrows lints
501
            //   because unaligned_references lint does not exist in older compilers:
502
            //   https://github.com/taiki-e/pin-project-lite/pull/55
503
            //   https://github.com/rust-lang/rust/pull/82525
504
            #[forbid(unaligned_references, safe_packed_borrows)]
505
0
            fn __assert_not_repr_packed <$($impl_generics)*> (this: &$ident <$($ty_generics)*>)
506
0
            $(where
507
0
                $($where_clause)*)?
508
0
            {
509
0
                $(
510
0
                    let _ = &this.$field;
511
0
                )+
512
0
            }
Unexecuted instantiation: futures_util::stream::stream::cycle::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::sink::err_into::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::unfold::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::io::lines::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::try_join::_::__assert_not_repr_packed::<_, _, _, _>
Unexecuted instantiation: futures_util::future::future::catch_unwind::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::scan::_::__assert_not_repr_packed::<_, _, _, _>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::io::buf_writer::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::peek::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::flatten_unordered::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::io::buf_reader::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::poll_immediate::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::flatten::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::try_stream::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::sink::buffer::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::count::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::try_join::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::peek::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::ready_chunks::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::io::copy::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::filter_map::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::future::future::remote_handle::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::try_chunks::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::join::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::fold::_::__assert_not_repr_packed::<_, _, _, _>
Unexecuted instantiation: futures_util::io::take::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::take::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::try_join::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::peek::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::io::copy_buf::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::sink::with_flat_map::_::__assert_not_repr_packed::<_, _, _, _, _>
Unexecuted instantiation: futures_util::stream::try_stream::try_collect::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::futures_ordered::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::peek::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::join::_::__assert_not_repr_packed::<_, _, _, _, _>
Unexecuted instantiation: futures_util::stream::stream::peek::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::zip::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::sink::with::_::__assert_not_repr_packed::<_, _, _, _, _>
Unexecuted instantiation: futures_util::future::try_join::_::__assert_not_repr_packed::<_, _, _, _, _>
Unexecuted instantiation: futures_util::stream::stream::for_each::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::chunks::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::into_stream::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::sink::map_err::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::catch_unwind::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::fuse::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::try_for_each_concurrent::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::try_stream::try_filter_map::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::once::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::future::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::try_future::into_future::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::io::into_sink::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::option::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::enumerate::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::sink::unfold::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::select_with_strategy::_::__assert_not_repr_packed::<_, _, _, _>
Unexecuted instantiation: futures_util::stream::poll_immediate::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::try_for_each::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::any::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::try_stream::or_else::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::forward::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::collect::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::future::fuse::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::take_while::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::future::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::and_then::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::take_until::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::io::line_writer::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::future::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::future::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::then::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::abortable::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::for_each_concurrent::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::try_stream::try_fold::_::__assert_not_repr_packed::<_, _, _, _>
Unexecuted instantiation: futures_util::stream::try_stream::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::select::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::try_stream::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::all::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::try_stream::try_concat::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::join::_::__assert_not_repr_packed::<_, _, _, _>
Unexecuted instantiation: futures_util::io::chain::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::sink::fanout::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::try_stream::try_unfold::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::unzip::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::io::copy_buf_abortable::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::skip::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::concat::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::map::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::chain::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::join::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::future::future::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::buffer_unordered::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::try_skip_while::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::stream::flatten_unordered::_::__assert_not_repr_packed::<_, _>
Unexecuted instantiation: futures_util::stream::try_stream::try_buffered::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::future::try_future::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::try_flatten_unordered::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::try_take_while::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::filter::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::try_stream::try_filter::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::try_flatten::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::try_buffer_unordered::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::into_async_read::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::future::future::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::try_stream::try_flatten_unordered::_::__assert_not_repr_packed::<_>
Unexecuted instantiation: futures_util::stream::stream::skip_while::_::__assert_not_repr_packed::<_, _, _>
Unexecuted instantiation: futures_util::stream::stream::buffered::_::__assert_not_repr_packed::<_>
513
        };
514
    };
515
    (
516
        [$(#[$attrs:meta])* $vis:vis enum $ident:ident]
517
        [$($proj_mut_ident:ident)?] [$($proj_ref_ident:ident)?] [$($proj_replace_ident:ident)?]
518
        [$proj_vis:vis]
519
        [$($def_generics:tt)*]
520
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
521
        {
522
            $(
523
                $(#[$variant_attrs:meta])*
524
                $variant:ident $({
525
                    $(
526
                        $(#[$pin:ident])?
527
                        $field:ident: $field_ty:ty
528
                    ),+ $(,)?
529
                })?
530
            ),+ $(,)?
531
        }
532
        $(impl $($pinned_drop:tt)*)?
533
    ) => {
534
        #[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
535
        // This lint warns of `clippy::*` generated by external macros.
536
        // We allow this lint for compatibility with older compilers.
537
        #[allow(clippy::unknown_clippy_lints)]
538
        #[allow(clippy::used_underscore_binding)]
539
        const _: () = {
540
            impl <$($impl_generics)*> $ident <$($ty_generics)*>
541
            $(where
542
                $($where_clause)*)?
543
            {
544
                $crate::__pin_project_enum_make_proj_method! {
545
                    [$($proj_mut_ident)?]
546
                    [$proj_vis]
547
                    [project get_unchecked_mut mut]
548
                    [$($ty_generics)*]
549
                    {
550
                        $(
551
                            $variant $({
552
                                $(
553
                                    $(#[$pin])?
554
                                    $field
555
                                ),+
556
                            })?
557
                        ),+
558
                    }
559
                }
560
                $crate::__pin_project_enum_make_proj_method! {
561
                    [$($proj_ref_ident)?]
562
                    [$proj_vis]
563
                    [project_ref get_ref]
564
                    [$($ty_generics)*]
565
                    {
566
                        $(
567
                            $variant $({
568
                                $(
569
                                    $(#[$pin])?
570
                                    $field
571
                                ),+
572
                            })?
573
                        ),+
574
                    }
575
                }
576
                $crate::__pin_project_enum_make_proj_replace_method! {
577
                    [$($proj_replace_ident)?]
578
                    [$proj_vis]
579
                    [$($ty_generics)*]
580
                    {
581
                        $(
582
                            $variant $({
583
                                $(
584
                                    $(#[$pin])?
585
                                    $field
586
                                ),+
587
                            })?
588
                        ),+
589
                    }
590
                }
591
            }
592
593
            $crate::__pin_project_make_unpin_impl! {
594
                [$vis $ident]
595
                [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
596
                $(
597
                    $variant: ($(
598
                        $(
599
                            $crate::__pin_project_make_unpin_bound!(
600
                                $(#[$pin])? $field_ty
601
                            )
602
                        ),+
603
                    )?)
604
                ),+
605
            }
606
607
            $crate::__pin_project_make_drop_impl! {
608
                [$ident]
609
                [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
610
                $(impl $($pinned_drop)*)?
611
            }
612
613
            // We don't need to check for '#[repr(packed)]',
614
            // since it does not apply to enums.
615
        };
616
    };
617
}
618
619
#[doc(hidden)]
620
#[macro_export]
621
macro_rules! __pin_project_reconstruct {
622
    (
623
        [$(#[$attrs:meta])* $vis:vis struct $ident:ident]
624
        [$($def_generics:tt)*] [$($impl_generics:tt)*]
625
        [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
626
        {
627
            $(
628
                $(#[$pin:ident])?
629
                $field_vis:vis $field:ident: $field_ty:ty
630
            ),+ $(,)?
631
        }
632
    ) => {
633
        $(#[$attrs])*
634
        $vis struct $ident $($def_generics)*
635
        $(where
636
            $($where_clause)*)?
637
        {
638
            $(
639
                $field_vis $field: $field_ty
640
            ),+
641
        }
642
    };
643
    (
644
        [$(#[$attrs:meta])* $vis:vis enum $ident:ident]
645
        [$($def_generics:tt)*] [$($impl_generics:tt)*]
646
        [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
647
        {
648
            $(
649
                $(#[$variant_attrs:meta])*
650
                $variant:ident $({
651
                    $(
652
                        $(#[$pin:ident])?
653
                        $field:ident: $field_ty:ty
654
                    ),+ $(,)?
655
                })?
656
            ),+ $(,)?
657
        }
658
    ) => {
659
        $(#[$attrs])*
660
        $vis enum $ident $($def_generics)*
661
        $(where
662
            $($where_clause)*)?
663
        {
664
            $(
665
                $(#[$variant_attrs])*
666
                $variant $({
667
                    $(
668
                        $field: $field_ty
669
                    ),+
670
                })?
671
            ),+
672
        }
673
    };
674
}
675
676
#[doc(hidden)]
677
#[macro_export]
678
macro_rules! __pin_project_make_proj_ty {
679
    ([] $($field:tt)*) => {};
680
    (
681
        [$proj_ty_ident:ident $default_ident:ident]
682
        [$proj_vis:vis struct $ident:ident]
683
        $($field:tt)*
684
    ) => {};
685
    (
686
        [$proj_ty_ident:ident]
687
        [$proj_vis:vis struct $ident:ident]
688
        [$__pin_project_make_proj_field:ident]
689
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
690
        {
691
            $(
692
                $(#[$pin:ident])?
693
                $field_vis:vis $field:ident: $field_ty:ty
694
            ),+ $(,)?
695
        }
696
    ) => {
697
        $crate::__pin_project_make_proj_ty_body! {
698
            [$proj_ty_ident]
699
            [$proj_vis struct $ident]
700
            [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
701
            [
702
                $(
703
                    $field_vis $field: $crate::$__pin_project_make_proj_field!(
704
                        $(#[$pin])? $field_ty
705
                    )
706
                ),+
707
            ]
708
        }
709
    };
710
    (
711
        [$proj_ty_ident:ident]
712
        [$proj_vis:vis enum $ident:ident]
713
        [$__pin_project_make_proj_field:ident]
714
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
715
        {
716
            $(
717
                $(#[$variant_attrs:meta])*
718
                $variant:ident $({
719
                    $(
720
                        $(#[$pin:ident])?
721
                        $field:ident: $field_ty:ty
722
                    ),+ $(,)?
723
                })?
724
            ),+ $(,)?
725
        }
726
    ) => {
727
        $crate::__pin_project_make_proj_ty_body! {
728
            [$proj_ty_ident]
729
            [$proj_vis enum $ident]
730
            [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
731
            [
732
                $(
733
                    $variant $({
734
                        $(
735
                            $field: $crate::$__pin_project_make_proj_field!(
736
                                $(#[$pin])? $field_ty
737
                            )
738
                        ),+
739
                    })?
740
                ),+
741
            ]
742
        }
743
    };
744
}
745
746
#[doc(hidden)]
747
#[macro_export]
748
macro_rules! __pin_project_make_proj_ty_body {
749
    (
750
        [$proj_ty_ident:ident]
751
        [$proj_vis:vis $struct_ty_ident:ident $ident:ident]
752
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
753
        [$($body_data:tt)+]
754
    ) => {
755
        #[allow(dead_code)] // This lint warns unused fields/variants.
756
        #[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
757
        // This lint warns of `clippy::*` generated by external macros.
758
        // We allow this lint for compatibility with older compilers.
759
        #[allow(clippy::unknown_clippy_lints)]
760
        #[allow(clippy::mut_mut)] // This lint warns `&mut &mut <ty>`. (only needed for project)
761
        #[allow(clippy::redundant_pub_crate)] // This lint warns `pub(crate)` field in private struct.
762
        #[allow(clippy::ref_option_ref)] // This lint warns `&Option<&<ty>>`. (only needed for project_ref)
763
        #[allow(clippy::type_repetition_in_bounds)] // https://github.com/rust-lang/rust-clippy/issues/4326
764
        $proj_vis $struct_ty_ident $proj_ty_ident <'__pin, $($impl_generics)*>
765
        where
766
            $ident <$($ty_generics)*>: '__pin
767
            $(, $($where_clause)*)?
768
        {
769
            $($body_data)+
770
        }
771
    };
772
}
773
774
#[doc(hidden)]
775
#[macro_export]
776
macro_rules! __pin_project_make_proj_replace_ty {
777
    ([] $($field:tt)*) => {};
778
    (
779
        [$proj_ty_ident:ident]
780
        [$proj_vis:vis struct]
781
        [$__pin_project_make_proj_field:ident]
782
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
783
        {
784
            $(
785
                $(#[$pin:ident])?
786
                $field_vis:vis $field:ident: $field_ty:ty
787
            ),+ $(,)?
788
        }
789
    ) => {
790
        $crate::__pin_project_make_proj_replace_ty_body! {
791
            [$proj_ty_ident]
792
            [$proj_vis struct]
793
            [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
794
            [
795
                $(
796
                    $field_vis $field: $crate::$__pin_project_make_proj_field!(
797
                        $(#[$pin])? $field_ty
798
                    )
799
                ),+
800
            ]
801
        }
802
    };
803
    (
804
        [$proj_ty_ident:ident]
805
        [$proj_vis:vis enum]
806
        [$__pin_project_make_proj_field:ident]
807
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
808
        {
809
            $(
810
                $(#[$variant_attrs:meta])*
811
                $variant:ident $({
812
                    $(
813
                        $(#[$pin:ident])?
814
                        $field:ident: $field_ty:ty
815
                    ),+ $(,)?
816
                })?
817
            ),+ $(,)?
818
        }
819
    ) => {
820
        $crate::__pin_project_make_proj_replace_ty_body! {
821
            [$proj_ty_ident]
822
            [$proj_vis enum]
823
            [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?]
824
            [
825
                $(
826
                    $variant $({
827
                        $(
828
                            $field: $crate::$__pin_project_make_proj_field!(
829
                                $(#[$pin])? $field_ty
830
                            )
831
                        ),+
832
                    })?
833
                ),+
834
            ]
835
        }
836
    };
837
}
838
839
#[doc(hidden)]
840
#[macro_export]
841
macro_rules! __pin_project_make_proj_replace_ty_body {
842
    (
843
        [$proj_ty_ident:ident]
844
        [$proj_vis:vis $struct_ty_ident:ident]
845
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
846
        [$($body_data:tt)+]
847
    ) => {
848
        #[allow(dead_code)] // This lint warns unused fields/variants.
849
        #[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
850
        #[allow(clippy::mut_mut)] // This lint warns `&mut &mut <ty>`. (only needed for project)
851
        #[allow(clippy::redundant_pub_crate)] // This lint warns `pub(crate)` field in private struct.
852
        #[allow(clippy::type_repetition_in_bounds)] // https://github.com/rust-lang/rust-clippy/issues/4326
853
        $proj_vis $struct_ty_ident $proj_ty_ident <$($impl_generics)*>
854
        where
855
            $($($where_clause)*)?
856
        {
857
            $($body_data)+
858
        }
859
    };
860
}
861
862
#[doc(hidden)]
863
#[macro_export]
864
macro_rules! __pin_project_make_proj_replace_block {
865
    (
866
        [$($proj_path:tt)+]
867
        {
868
            $(
869
                $(#[$pin:ident])?
870
                $field_vis:vis $field:ident
871
            ),+
872
        }
873
    ) => {
874
        let result = $($proj_path)* {
875
            $(
876
                $field: $crate::__pin_project_make_replace_field_proj!(
877
                    $(#[$pin])? $field
878
                )
879
            ),+
880
        };
881
882
        {
883
            ( $(
884
                $crate::__pin_project_make_unsafe_drop_in_place_guard!(
885
                    $(#[$pin])? $field
886
                ),
887
            )* );
888
        }
889
890
        result
891
    };
892
    ([$($proj_path:tt)+]) => { $($proj_path)* };
893
}
894
895
#[doc(hidden)]
896
#[macro_export]
897
macro_rules! __pin_project_struct_make_proj_method {
898
    ([] $($variant:tt)*) => {};
899
    (
900
        [$proj_ty_ident:ident $_ignored_default_arg:ident]
901
        [$proj_vis:vis]
902
        [$method_ident:ident $get_method:ident $($mut:ident)?]
903
        [$($ty_generics:tt)*]
904
        $($variant:tt)*
905
    ) => {
906
        $crate::__pin_project_struct_make_proj_method! {
907
            [$proj_ty_ident]
908
            [$proj_vis]
909
            [$method_ident $get_method $($mut)?]
910
            [$($ty_generics)*]
911
            $($variant)*
912
        }
913
    };
914
    (
915
        [$proj_ty_ident:ident]
916
        [$proj_vis:vis]
917
        [$method_ident:ident $get_method:ident $($mut:ident)?]
918
        [$($ty_generics:tt)*]
919
        {
920
            $(
921
                $(#[$pin:ident])?
922
                $field_vis:vis $field:ident
923
            ),+
924
        }
925
    ) => {
926
0
        $proj_vis fn $method_ident<'__pin>(
927
0
            self: $crate::__private::Pin<&'__pin $($mut)? Self>,
928
0
        ) -> $proj_ty_ident <'__pin, $($ty_generics)*> {
929
0
            unsafe {
930
0
                let Self { $($field),* } = self.$get_method();
931
0
                $proj_ty_ident {
932
0
                    $(
933
0
                        $field: $crate::__pin_project_make_unsafe_field_proj!(
934
0
                            $(#[$pin])? $field
935
0
                        )
936
0
                    ),+
937
0
                }
938
0
            }
939
0
        }
Unexecuted instantiation: <futures_util::io::buf_writer::BufWriter<_>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::FlattenSink<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::peek::Peekable<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::unfold::Unfold<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::into_async_read::IntoAsyncRead<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::Inspect<_, _>>::project
Unexecuted instantiation: <futures_util::future::future::fuse::Fuse<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::FlatMapUnordered<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::any::Any<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::flatten::Flatten<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::buffered::Buffered<_>>::project_ref
Unexecuted instantiation: <futures_util::future::try_join::TryJoin3<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::map::Map<_, _>>::project
Unexecuted instantiation: <futures_util::future::join::Join4<_, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::filter::Filter<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::unzip::Unzip<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::fold::Fold<_, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::future::IntoStream<_>>::project_ref
Unexecuted instantiation: <futures_util::future::future::Map<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::zip::Zip<_, _>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::TryFlatten<_, _>>::project
Unexecuted instantiation: <futures_util::future::future::remote_handle::Remote<_>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::MapErr<_, _>>::project_ref
Unexecuted instantiation: <futures_util::sink::map_err::SinkMapErr<_, _>>::project_ref
Unexecuted instantiation: <futures_util::future::future::Then<_, _, _>>::project
Unexecuted instantiation: <futures_util::io::chain::Chain<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::take_while::TakeWhile<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_unfold::TryUnfold<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::fold::Fold<_, _, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::all::All<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::InspectOk<_, _>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::AndThen<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_for_each::TryForEach<_, _, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::TryFlattenStream<_>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::or_else::OrElse<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_filter::TryFilter<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::select_with_strategy::SelectWithStrategy<_, _, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::unzip::Unzip<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::skip::Skip<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::then::Then<_, _, _>>::project
Unexecuted instantiation: <futures_util::sink::err_into::SinkErrInto<_, _, _>>::project
Unexecuted instantiation: <futures_util::sink::fanout::Fanout<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_take_while::TryTakeWhile<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::io::lines::Lines<_>>::project
Unexecuted instantiation: <futures_util::io::buf_writer::BufWriter<_>>::project
Unexecuted instantiation: <futures_util::future::future::Map<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::InspectErr<_, _>>::project
Unexecuted instantiation: <futures_util::io::copy_buf_abortable::CopyBufAbortable<_, _>>::project_ref
Unexecuted instantiation: <futures_util::future::future::MapInto<_, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::MapOk<_, _>>::project
Unexecuted instantiation: <futures_util::stream::futures_ordered::OrderWrapper<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::catch_unwind::CatchUnwind<_>>::project
Unexecuted instantiation: <futures_util::sink::with_flat_map::WithFlatMap<_, _, _, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::peek::NextIfEq<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::peek::NextIfEq<_, _>>::project
Unexecuted instantiation: <futures_util::io::into_sink::IntoSink<_, _>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::UnwrapOrElse<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::flatten_unordered::PollStreamFut<_>>::project
Unexecuted instantiation: <futures_util::sink::buffer::Buffer<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::cycle::Cycle<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::buffer_unordered::BufferUnordered<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::and_then::AndThen<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::ErrInto<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_for_each::TryForEach<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::Flatten<_>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::UnwrapOrElse<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_fold::TryFold<_, _, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_flatten_unordered::TryFlattenUnordered<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::concat::Concat<_>>::project
Unexecuted instantiation: <futures_util::sink::with::With<_, _, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::sink::fanout::Fanout<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::into_stream::IntoStream<_>>::project_ref
Unexecuted instantiation: <futures_util::future::option::OptionFuture<_>>::project
Unexecuted instantiation: <futures_util::future::join::Join<_, _>>::project_ref
Unexecuted instantiation: <futures_util::future::future::fuse::Fuse<_>>::project
Unexecuted instantiation: <futures_util::future::option::OptionFuture<_>>::project_ref
Unexecuted instantiation: <futures_util::future::future::UnitError<_>>::project_ref
Unexecuted instantiation: <futures_util::abortable::Abortable<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::enumerate::Enumerate<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::buffered::Buffered<_>>::project
Unexecuted instantiation: <futures_util::future::try_future::InspectErr<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::ErrInto<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::for_each::ForEach<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::io::buf_reader::BufReader<_>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::MapOk<_, _>>::project
Unexecuted instantiation: <futures_util::sink::unfold::Unfold<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_for_each_concurrent::TryForEachConcurrent<_, _, _>>::project
Unexecuted instantiation: <futures_util::future::future::IntoStream<_>>::project
Unexecuted instantiation: <futures_util::sink::with::With<_, _, _, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::concat::Concat<_>>::project_ref
Unexecuted instantiation: <futures_util::io::take::Take<_>>::project
Unexecuted instantiation: <futures_util::future::try_future::into_future::IntoFuture<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::ready_chunks::ReadyChunks<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::all::All<_, _, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::MapOkOrElse<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_buffered::TryBuffered<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::select::Select<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_buffer_unordered::TryBufferUnordered<_>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::TryFlattenErr<_, _>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::ErrInto<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::collect::Collect<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::fuse::Fuse<_>>::project_ref
Unexecuted instantiation: <futures_util::future::future::remote_handle::Remote<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_chunks::TryChunks<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::count::Count<_>>::project_ref
Unexecuted instantiation: <futures_util::io::copy::Copy<_, _>>::project
Unexecuted instantiation: <futures_util::future::join::Join<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::Inspect<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_skip_while::TrySkipWhile<_, _, _>>::project
Unexecuted instantiation: <futures_util::io::copy_buf::CopyBuf<_, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::MapErr<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::then::Then<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::poll_immediate::PollImmediate<_>>::project
Unexecuted instantiation: <futures_util::stream::select::Select<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_buffered::TryBuffered<_>>::project
Unexecuted instantiation: <futures_util::io::copy_buf_abortable::CopyBufAbortable<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::Forward<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::flatten_unordered::PollStreamFut<_>>::project_ref
Unexecuted instantiation: <futures_util::future::future::Inspect<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_chunks::TryChunks<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::buffer_unordered::BufferUnordered<_>>::project
Unexecuted instantiation: <futures_util::future::try_future::MapErr<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::forward::Forward<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::future::FlattenStream<_>>::project_ref
Unexecuted instantiation: <futures_util::abortable::Abortable<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::FlatMapUnordered<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::peek::PeekMut<_>>::project
Unexecuted instantiation: <futures_util::sink::unfold::Unfold<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::io::copy::Copy<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::filter::Filter<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::future::catch_unwind::CatchUnwind<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::FlatMap<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::TryFlattenErr<_, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::FlattenSink<_, _>>::project_ref
Unexecuted instantiation: <futures_util::io::into_sink::IntoSink<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::take_until::TakeUntil<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_collect::TryCollect<_, _>>::project_ref
Unexecuted instantiation: <futures_util::future::try_join::TryJoin3<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::FlatMap<_, _, _>>::project
Unexecuted instantiation: <futures_util::sink::buffer::Buffer<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::peek::Peek<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::take_while::TakeWhile<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::InspectErr<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_filter_map::TryFilterMap<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::scan::Scan<_, _, _, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::ErrInto<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::collect::Collect<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::forward::Forward<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_unfold::TryUnfold<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::take::Take<_>>::project_ref
Unexecuted instantiation: <futures_util::future::join::Join4<_, _, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::chunks::Chunks<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::select_with_strategy::SelectWithStrategy<_, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::take::Take<_>>::project
Unexecuted instantiation: <futures_util::io::line_writer::LineWriter<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::peek::Peekable<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::enumerate::Enumerate<_>>::project
Unexecuted instantiation: <futures_util::future::join::Join5<_, _, _, _, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::InspectOk<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::fuse::Fuse<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::take_until::TakeUntil<_, _>>::project_ref
Unexecuted instantiation: <futures_util::io::take::Take<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::once::Once<_>>::project
Unexecuted instantiation: <futures_util::future::try_join::TryJoin4<_, _, _, _>>::project
Unexecuted instantiation: <futures_util::future::join::Join5<_, _, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::skip::Skip<_>>::project
Unexecuted instantiation: <futures_util::future::future::NeverError<_>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::or_else::OrElse<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_filter::TryFilter<_, _, _>>::project
Unexecuted instantiation: <futures_util::future::future::Inspect<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_flatten_unordered::NestedTryStreamIntoEitherTryStream<_>>::project
Unexecuted instantiation: <futures_util::stream::poll_immediate::PollImmediate<_>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_flatten::TryFlatten<_>>::project_ref
Unexecuted instantiation: <futures_util::future::try_join::TryJoin5<_, _, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::future::FlattenStream<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::peek::PeekMut<_>>::project_ref
Unexecuted instantiation: <futures_util::future::future::Flatten<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::MapErr<_, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::OrElse<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::futures_ordered::OrderWrapper<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::count::Count<_>>::project
Unexecuted instantiation: <futures_util::future::try_future::TryFlattenStream<_>>::project_ref
Unexecuted instantiation: <futures_util::sink::err_into::SinkErrInto<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::zip::Zip<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::for_each_concurrent::ForEachConcurrent<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::io::copy_buf::CopyBuf<_, _>>::project_ref
Unexecuted instantiation: <futures_util::io::buf_reader::BufReader<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_fold::TryFold<_, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::InspectOk<_, _>>::project
Unexecuted instantiation: <futures_util::io::line_writer::LineWriter<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::ready_chunks::ReadyChunks<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_flatten_unordered::TryFlattenUnordered<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::chunks::Chunks<_>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::and_then::AndThen<_, _, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::TryFlatten<_, _>>::project_ref
Unexecuted instantiation: <futures_util::future::try_join::TryJoin4<_, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::sink::map_err::SinkMapErr<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::into_async_read::IntoAsyncRead<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::cycle::Cycle<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::peek::NextIf<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::chain::Chain<_, _>>::project
Unexecuted instantiation: <futures_util::future::poll_immediate::PollImmediate<_>>::project_ref
Unexecuted instantiation: <futures_util::future::future::MapInto<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::for_each_concurrent::ForEachConcurrent<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::peek::Peek<_>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::MapOkOrElse<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::skip_while::SkipWhile<_, _, _>>::project
Unexecuted instantiation: <futures_util::future::join::Join3<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::scan::Scan<_, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::Flatten<_>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_filter_map::TryFilterMap<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::map::Map<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::into_stream::IntoStream<_>>::project
Unexecuted instantiation: <futures_util::future::future::UnitError<_>>::project
Unexecuted instantiation: <futures_util::future::try_join::TryJoin5<_, _, _, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_flatten::TryFlatten<_>>::project
Unexecuted instantiation: <futures_util::future::try_future::InspectOk<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_buffer_unordered::TryBufferUnordered<_>>::project
Unexecuted instantiation: <futures_util::stream::stream::for_each::ForEach<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::flatten_unordered::FlattenUnorderedWithFlowController<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::peek::NextIf<_, _>>::project
Unexecuted instantiation: <futures_util::future::future::Then<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::chain::Chain<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::flatten::Flatten<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_skip_while::TrySkipWhile<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::filter_map::FilterMap<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::future::catch_unwind::CatchUnwind<_>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::InspectErr<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::unfold::Unfold<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_take_while::TryTakeWhile<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::flatten_unordered::FlattenUnorderedWithFlowController<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::MapOk<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::once::Once<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_collect::TryCollect<_, _>>::project
Unexecuted instantiation: <futures_util::io::chain::Chain<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::filter_map::FilterMap<_, _, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_for_each_concurrent::TryForEachConcurrent<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::any::Any<_, _, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::OrElse<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::Forward<_, _>>::project
Unexecuted instantiation: <futures_util::stream::stream::skip_while::SkipWhile<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::future::NeverError<_>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::into_future::IntoFuture<_>>::project_ref
Unexecuted instantiation: <futures_util::io::lines::Lines<_>>::project_ref
Unexecuted instantiation: <futures_util::future::try_join::TryJoin<_, _>>::project
Unexecuted instantiation: <futures_util::stream::try_stream::try_flatten_unordered::NestedTryStreamIntoEitherTryStream<_>>::project_ref
Unexecuted instantiation: <futures_util::stream::stream::catch_unwind::CatchUnwind<_>>::project_ref
Unexecuted instantiation: <futures_util::future::future::Flatten<_>>::project
Unexecuted instantiation: <futures_util::future::try_future::OkInto<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_concat::TryConcat<_>>::project_ref
Unexecuted instantiation: <futures_util::future::try_join::TryJoin<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::try_stream::try_concat::TryConcat<_>>::project
Unexecuted instantiation: <futures_util::future::try_future::AndThen<_, _, _>>::project_ref
Unexecuted instantiation: <futures_util::sink::with_flat_map::WithFlatMap<_, _, _, _, _>>::project_ref
Unexecuted instantiation: <futures_util::future::try_future::MapOk<_, _>>::project_ref
Unexecuted instantiation: <futures_util::stream::poll_immediate::PollImmediate<_>>::project_ref
Unexecuted instantiation: <futures_util::future::join::Join3<_, _, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::OkInto<_, _>>::project
940
    };
941
}
942
943
#[doc(hidden)]
944
#[macro_export]
945
macro_rules! __pin_project_struct_make_proj_replace_method {
946
    ([] $($field:tt)*) => {};
947
    (
948
        [$proj_ty_ident:ident]
949
        [$proj_vis:vis]
950
        [$_proj_ty_ident:ident]
951
        [$($ty_generics:tt)*]
952
        {
953
            $(
954
                $(#[$pin:ident])?
955
                $field_vis:vis $field:ident
956
            ),+
957
        }
958
    ) => {
959
        $proj_vis fn project_replace(
960
            self: $crate::__private::Pin<&mut Self>,
961
            replacement: Self,
962
        ) -> $proj_ty_ident <$($ty_generics)*> {
963
            unsafe {
964
                let __self_ptr: *mut Self = self.get_unchecked_mut();
965
966
                // Destructors will run in reverse order, so next create a guard to overwrite
967
                // `self` with the replacement value without calling destructors.
968
                let __guard = $crate::__private::UnsafeOverwriteGuard::new(__self_ptr, replacement);
969
970
                let Self { $($field),* } = &mut *__self_ptr;
971
972
                $crate::__pin_project_make_proj_replace_block! {
973
                    [$proj_ty_ident]
974
                    {
975
                        $(
976
                            $(#[$pin])?
977
                            $field
978
                        ),+
979
                    }
980
                }
981
            }
982
        }
983
    };
984
}
985
986
#[doc(hidden)]
987
#[macro_export]
988
macro_rules! __pin_project_enum_make_proj_method {
989
    ([] $($variant:tt)*) => {};
990
    (
991
        [$proj_ty_ident:ident]
992
        [$proj_vis:vis]
993
        [$method_ident:ident $get_method:ident $($mut:ident)?]
994
        [$($ty_generics:tt)*]
995
        {
996
            $(
997
                $variant:ident $({
998
                    $(
999
                        $(#[$pin:ident])?
1000
                        $field:ident
1001
                    ),+
1002
                })?
1003
            ),+
1004
        }
1005
    ) => {
1006
0
        $proj_vis fn $method_ident<'__pin>(
1007
0
            self: $crate::__private::Pin<&'__pin $($mut)? Self>,
1008
0
        ) -> $proj_ty_ident <'__pin, $($ty_generics)*> {
1009
0
            unsafe {
1010
0
                match self.$get_method() {
1011
                    $(
1012
0
                        Self::$variant $({
1013
0
                            $($field),+
1014
                        })? => {
1015
0
                            $proj_ty_ident::$variant $({
1016
                                $(
1017
0
                                    $field: $crate::__pin_project_make_unsafe_field_proj!(
1018
0
                                        $(#[$pin])? $field
1019
0
                                    )
1020
                                ),+
1021
                            })?
1022
                        }
1023
                    ),+
1024
                }
1025
            }
1026
0
        }
Unexecuted instantiation: <futures_util::unfold_state::UnfoldState<_, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::try_flatten::TryFlatten<_, _>>::project
Unexecuted instantiation: <futures_util::future::try_future::try_flatten_err::TryFlattenErr<_, _>>::project
Unexecuted instantiation: <futures_util::future::future::map::Map<_, _>>::project
Unexecuted instantiation: <futures_util::future::future::flatten::Flatten<_, _>>::project
1027
    };
1028
}
1029
1030
#[doc(hidden)]
1031
#[macro_export]
1032
macro_rules! __pin_project_enum_make_proj_replace_method {
1033
    ([] $($field:tt)*) => {};
1034
    (
1035
        [$proj_ty_ident:ident]
1036
        [$proj_vis:vis]
1037
        [$($ty_generics:tt)*]
1038
        {
1039
            $(
1040
                $variant:ident $({
1041
                    $(
1042
                        $(#[$pin:ident])?
1043
                        $field:ident
1044
                    ),+
1045
                })?
1046
            ),+
1047
        }
1048
    ) => {
1049
0
        $proj_vis fn project_replace(
1050
0
            self: $crate::__private::Pin<&mut Self>,
1051
0
            replacement: Self,
1052
0
        ) -> $proj_ty_ident <$($ty_generics)*> {
1053
0
            unsafe {
1054
0
                let __self_ptr: *mut Self = self.get_unchecked_mut();
1055
0
1056
0
                // Destructors will run in reverse order, so next create a guard to overwrite
1057
0
                // `self` with the replacement value without calling destructors.
1058
0
                let __guard = $crate::__private::UnsafeOverwriteGuard::new(__self_ptr, replacement);
1059
0
1060
0
                match &mut *__self_ptr {
1061
                    $(
1062
0
                        Self::$variant $({
1063
0
                            $($field),+
1064
                        })? => {
1065
                            $crate::__pin_project_make_proj_replace_block! {
1066
0
                                [$proj_ty_ident :: $variant]
1067
                                $({
1068
                                    $(
1069
                                        $(#[$pin])?
1070
                                        $field
1071
                                    ),+
1072
                                })?
1073
                            }
1074
                        }
1075
                    ),+
1076
                }
1077
            }
1078
0
        }
Unexecuted instantiation: <futures_util::unfold_state::UnfoldState<_, _>>::project_replace
Unexecuted instantiation: <futures_util::future::future::map::Map<_, _>>::project_replace
1079
    };
1080
}
1081
1082
#[doc(hidden)]
1083
#[macro_export]
1084
macro_rules! __pin_project_make_unpin_impl {
1085
    (
1086
        [$vis:vis $ident:ident]
1087
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
1088
        $($field:tt)*
1089
    ) => {
1090
        // Automatically create the appropriate conditional `Unpin` implementation.
1091
        //
1092
        // Basically this is equivalent to the following code:
1093
        // ```rust
1094
        // impl<T, U> Unpin for Struct<T, U> where T: Unpin {}
1095
        // ```
1096
        //
1097
        // However, if struct is public and there is a private type field,
1098
        // this would cause an E0446 (private type in public interface).
1099
        //
1100
        // When RFC 2145 is implemented (rust-lang/rust#48054),
1101
        // this will become a lint, rather then a hard error.
1102
        //
1103
        // As a workaround for this, we generate a new struct, containing all of the pinned
1104
        // fields from our #[pin_project] type. This struct is declared within
1105
        // a function, which makes it impossible to be named by user code.
1106
        // This guarantees that it will use the default auto-trait impl for Unpin -
1107
        // that is, it will implement Unpin iff all of its fields implement Unpin.
1108
        // This type can be safely declared as 'public', satisfying the privacy
1109
        // checker without actually allowing user code to access it.
1110
        //
1111
        // This allows users to apply the #[pin_project] attribute to types
1112
        // regardless of the privacy of the types of their fields.
1113
        //
1114
        // See also https://github.com/taiki-e/pin-project/pull/53.
1115
        #[allow(non_snake_case)]
1116
        $vis struct __Origin <'__pin, $($impl_generics)*>
1117
        $(where
1118
            $($where_clause)*)?
1119
        {
1120
            __dummy_lifetime: $crate::__private::PhantomData<&'__pin ()>,
1121
            $($field)*
1122
        }
1123
        impl <'__pin, $($impl_generics)*> $crate::__private::Unpin for $ident <$($ty_generics)*>
1124
        where
1125
            __Origin <'__pin, $($ty_generics)*>: $crate::__private::Unpin
1126
            $(, $($where_clause)*)?
1127
        {
1128
        }
1129
    };
1130
}
1131
1132
#[doc(hidden)]
1133
#[macro_export]
1134
macro_rules! __pin_project_make_drop_impl {
1135
    (
1136
        [$_ident:ident]
1137
        [$($_impl_generics:tt)*] [$($_ty_generics:tt)*] [$(where $($_where_clause:tt)*)?]
1138
        impl $(<
1139
            $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)?
1140
            $( $generics:ident
1141
                $(: $generics_bound:path)?
1142
                $(: ?$generics_unsized_bound:path)?
1143
                $(: $generics_lifetime_bound:lifetime)?
1144
            ),*
1145
        >)? PinnedDrop for $self_ty:ty
1146
        $(where
1147
            $( $where_clause_ty:ty
1148
                $(: $where_clause_bound:path)?
1149
                $(: ?$where_clause_unsized_bound:path)?
1150
                $(: $where_clause_lifetime_bound:lifetime)?
1151
            ),* $(,)?
1152
        )?
1153
        {
1154
            fn drop($($arg:ident)+: Pin<&mut Self>) {
1155
                $($tt:tt)*
1156
            }
1157
        }
1158
    ) => {
1159
        impl $(<
1160
            $( $lifetime $(: $lifetime_bound)? ,)*
1161
            $( $generics
1162
                $(: $generics_bound)?
1163
                $(: ?$generics_unsized_bound)?
1164
                $(: $generics_lifetime_bound)?
1165
            ),*
1166
        >)? $crate::__private::Drop for $self_ty
1167
        $(where
1168
            $( $where_clause_ty
1169
                $(: $where_clause_bound)?
1170
                $(: ?$where_clause_unsized_bound)?
1171
                $(: $where_clause_lifetime_bound)?
1172
            ),*
1173
        )?
1174
        {
1175
            fn drop(&mut self) {
1176
                // Implementing `__DropInner::__drop_inner` is safe, but calling it is not safe.
1177
                // This is because destructors can be called multiple times in safe code and
1178
                // [double dropping is unsound](https://github.com/rust-lang/rust/pull/62360).
1179
                //
1180
                // `__drop_inner` is defined as a safe method, but this is fine since
1181
                // `__drop_inner` is not accessible by the users and we call `__drop_inner` only
1182
                // once.
1183
                //
1184
                // Users can implement [`Drop`] safely using `pin_project!` and can drop a
1185
                // type that implements `PinnedDrop` using the [`drop`] function safely.
1186
                fn __drop_inner $(<
1187
                    $( $lifetime $(: $lifetime_bound)? ,)*
1188
                    $( $generics
1189
                        $(: $generics_bound)?
1190
                        $(: ?$generics_unsized_bound)?
1191
                        $(: $generics_lifetime_bound)?
1192
                    ),*
1193
                >)? (
1194
                    $($arg)+: $crate::__private::Pin<&mut $self_ty>,
1195
                )
1196
                $(where
1197
                    $( $where_clause_ty
1198
                        $(: $where_clause_bound)?
1199
                        $(: ?$where_clause_unsized_bound)?
1200
                        $(: $where_clause_lifetime_bound)?
1201
                    ),*
1202
                )?
1203
                {
1204
                    // A dummy `__drop_inner` function to prevent users call outer `__drop_inner`.
1205
                    fn __drop_inner() {}
1206
                    $($tt)*
1207
                }
1208
1209
                // Safety - we're in 'drop', so we know that 'self' will
1210
                // never move again.
1211
                let pinned_self: $crate::__private::Pin<&mut Self>
1212
                    = unsafe { $crate::__private::Pin::new_unchecked(self) };
1213
                // We call `__drop_inner` only once. Since `__DropInner::__drop_inner`
1214
                // is not accessible by the users, it is never called again.
1215
                __drop_inner(pinned_self);
1216
            }
1217
        }
1218
    };
1219
    (
1220
        [$ident:ident]
1221
        [$($impl_generics:tt)*] [$($ty_generics:tt)*] [$(where $($where_clause:tt)*)?]
1222
    ) => {
1223
        // Ensure that struct does not implement `Drop`.
1224
        //
1225
        // There are two possible cases:
1226
        // 1. The user type does not implement Drop. In this case,
1227
        // the first blanked impl will not apply to it. This code
1228
        // will compile, as there is only one impl of MustNotImplDrop for the user type
1229
        // 2. The user type does impl Drop. This will make the blanket impl applicable,
1230
        // which will then conflict with the explicit MustNotImplDrop impl below.
1231
        // This will result in a compilation error, which is exactly what we want.
1232
        trait MustNotImplDrop {}
1233
        #[allow(clippy::drop_bounds, drop_bounds)]
1234
        impl<T: $crate::__private::Drop> MustNotImplDrop for T {}
1235
        impl <$($impl_generics)*> MustNotImplDrop for $ident <$($ty_generics)*>
1236
        $(where
1237
            $($where_clause)*)?
1238
        {
1239
        }
1240
    };
1241
}
1242
1243
#[doc(hidden)]
1244
#[macro_export]
1245
macro_rules! __pin_project_make_unpin_bound {
1246
    (#[pin] $field_ty:ty) => {
1247
        $field_ty
1248
    };
1249
    ($field_ty:ty) => {
1250
        $crate::__private::AlwaysUnpin<$field_ty>
1251
    };
1252
}
1253
1254
#[doc(hidden)]
1255
#[macro_export]
1256
macro_rules! __pin_project_make_unsafe_field_proj {
1257
    (#[pin] $field:ident) => {
1258
        $crate::__private::Pin::new_unchecked($field)
1259
    };
1260
    ($field:ident) => {
1261
        $field
1262
    };
1263
}
1264
1265
#[doc(hidden)]
1266
#[macro_export]
1267
macro_rules! __pin_project_make_replace_field_proj {
1268
    (#[pin] $field:ident) => {
1269
        $crate::__private::PhantomData
1270
    };
1271
    ($field:ident) => {
1272
        $crate::__private::ptr::read($field)
1273
    };
1274
}
1275
1276
#[doc(hidden)]
1277
#[macro_export]
1278
macro_rules! __pin_project_make_unsafe_drop_in_place_guard {
1279
    (#[pin] $field:ident) => {
1280
        $crate::__private::UnsafeDropInPlaceGuard::new($field)
1281
    };
1282
    ($field:ident) => {
1283
        ()
1284
    };
1285
}
1286
1287
#[doc(hidden)]
1288
#[macro_export]
1289
macro_rules! __pin_project_make_proj_field_mut {
1290
    (#[pin] $field_ty:ty) => {
1291
        $crate::__private::Pin<&'__pin mut ($field_ty)>
1292
    };
1293
    ($field_ty:ty) => {
1294
        &'__pin mut ($field_ty)
1295
    };
1296
}
1297
1298
#[doc(hidden)]
1299
#[macro_export]
1300
macro_rules! __pin_project_make_proj_field_ref {
1301
    (#[pin] $field_ty:ty) => {
1302
        $crate::__private::Pin<&'__pin ($field_ty)>
1303
    };
1304
    ($field_ty:ty) => {
1305
        &'__pin ($field_ty)
1306
    };
1307
}
1308
1309
#[doc(hidden)]
1310
#[macro_export]
1311
macro_rules! __pin_project_make_proj_field_replace {
1312
    (#[pin] $field_ty:ty) => {
1313
        $crate::__private::PhantomData<$field_ty>
1314
    };
1315
    ($field_ty:ty) => {
1316
        $field_ty
1317
    };
1318
}
1319
1320
#[doc(hidden)]
1321
#[macro_export]
1322
macro_rules! __pin_project_internal {
1323
    // parsing proj_mut_ident
1324
    (
1325
        []
1326
        [$($proj_ref_ident:ident)?]
1327
        [$($proj_replace_ident:ident)?]
1328
        [$($attrs:tt)*]
1329
1330
        #[project = $proj_mut_ident:ident]
1331
        $($tt:tt)*
1332
    ) => {
1333
        $crate::__pin_project_internal! {
1334
            [$proj_mut_ident]
1335
            [$($proj_ref_ident)?]
1336
            [$($proj_replace_ident)?]
1337
            [$($attrs)*]
1338
            $($tt)*
1339
        }
1340
    };
1341
    // parsing proj_ref_ident
1342
    (
1343
        [$($proj_mut_ident:ident)?]
1344
        []
1345
        [$($proj_replace_ident:ident)?]
1346
        [$($attrs:tt)*]
1347
1348
        #[project_ref = $proj_ref_ident:ident]
1349
        $($tt:tt)*
1350
    ) => {
1351
        $crate::__pin_project_internal! {
1352
            [$($proj_mut_ident)?]
1353
            [$proj_ref_ident]
1354
            [$($proj_replace_ident)?]
1355
            [$($attrs)*]
1356
            $($tt)*
1357
        }
1358
    };
1359
    // parsing proj_replace_ident
1360
    (
1361
        [$($proj_mut_ident:ident)?]
1362
        [$($proj_ref_ident:ident)?]
1363
        []
1364
        [$($attrs:tt)*]
1365
1366
        #[project_replace = $proj_replace_ident:ident]
1367
        $($tt:tt)*
1368
    ) => {
1369
        $crate::__pin_project_internal! {
1370
            [$($proj_mut_ident)?]
1371
            [$($proj_ref_ident)?]
1372
            [$proj_replace_ident]
1373
            [$($attrs)*]
1374
            $($tt)*
1375
        }
1376
    };
1377
    // this is actually part of a recursive step that picks off a single non-`pin_project_lite` attribute
1378
    // there could be more to parse
1379
    (
1380
        [$($proj_mut_ident:ident)?]
1381
        [$($proj_ref_ident:ident)?]
1382
        [$($proj_replace_ident:ident)?]
1383
        [$($attrs:tt)*]
1384
1385
        #[$($attr:tt)*]
1386
        $($tt:tt)*
1387
    ) => {
1388
        $crate::__pin_project_internal! {
1389
            [$($proj_mut_ident)?]
1390
            [$($proj_ref_ident)?]
1391
            [$($proj_replace_ident)?]
1392
            [$($attrs)* #[$($attr)*]]
1393
            $($tt)*
1394
        }
1395
    };
1396
    // now determine visibility
1397
    // if public, downgrade
1398
    (
1399
        [$($proj_mut_ident:ident)?]
1400
        [$($proj_ref_ident:ident)?]
1401
        [$($proj_replace_ident:ident)?]
1402
        [$($attrs:tt)*]
1403
        pub $struct_ty_ident:ident $ident:ident
1404
        $($tt:tt)*
1405
    ) => {
1406
        $crate::__pin_project_parse_generics! {
1407
            [$($proj_mut_ident)?]
1408
            [$($proj_ref_ident)?]
1409
            [$($proj_replace_ident)?]
1410
            [$($attrs)*]
1411
            [pub $struct_ty_ident $ident pub(crate)]
1412
            $($tt)*
1413
        }
1414
    };
1415
    (
1416
        [$($proj_mut_ident:ident)?]
1417
        [$($proj_ref_ident:ident)?]
1418
        [$($proj_replace_ident:ident)?]
1419
        [$($attrs:tt)*]
1420
        $vis:vis $struct_ty_ident:ident $ident:ident
1421
        $($tt:tt)*
1422
    ) => {
1423
        $crate::__pin_project_parse_generics! {
1424
            [$($proj_mut_ident)?]
1425
            [$($proj_ref_ident)?]
1426
            [$($proj_replace_ident)?]
1427
            [$($attrs)*]
1428
            [$vis $struct_ty_ident $ident $vis]
1429
            $($tt)*
1430
        }
1431
    };
1432
}
1433
1434
#[doc(hidden)]
1435
#[macro_export]
1436
macro_rules! __pin_project_parse_generics {
1437
    (
1438
        [$($proj_mut_ident:ident)?]
1439
        [$($proj_ref_ident:ident)?]
1440
        [$($proj_replace_ident:ident)?]
1441
        [$($attrs:tt)*]
1442
        [$vis:vis $struct_ty_ident:ident $ident:ident $proj_ty_vis:vis]
1443
        $(<
1444
            $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)?
1445
            $( $generics:ident
1446
                $(: $generics_bound:path)?
1447
                $(: ?$generics_unsized_bound:path)?
1448
                $(: $generics_lifetime_bound:lifetime)?
1449
                $(= $generics_default:ty)?
1450
            ),* $(,)?
1451
        >)?
1452
        $(where
1453
            $( $where_clause_ty:ty
1454
                $(: $where_clause_bound:path)?
1455
                $(: ?$where_clause_unsized_bound:path)?
1456
                $(: $where_clause_lifetime_bound:lifetime)?
1457
            ),* $(,)?
1458
        )?
1459
        {
1460
            $($body_data:tt)*
1461
        }
1462
        $(impl $($pinned_drop:tt)*)?
1463
    ) => {
1464
        $crate::__pin_project_expand! {
1465
            [$($proj_mut_ident)?]
1466
            [$($proj_ref_ident)?]
1467
            [$($proj_replace_ident)?]
1468
            [$proj_ty_vis]
1469
            [$($attrs)* $vis $struct_ty_ident $ident]
1470
            [$(<
1471
                $( $lifetime $(: $lifetime_bound)? ,)*
1472
                $( $generics
1473
                    $(: $generics_bound)?
1474
                    $(: ?$generics_unsized_bound)?
1475
                    $(: $generics_lifetime_bound)?
1476
                    $(= $generics_default)?
1477
                ),*
1478
            >)?]
1479
            [$(
1480
                $( $lifetime $(: $lifetime_bound)? ,)*
1481
                $( $generics
1482
                    $(: $generics_bound)?
1483
                    $(: ?$generics_unsized_bound)?
1484
                    $(: $generics_lifetime_bound)?
1485
                ),*
1486
            )?]
1487
            [$( $( $lifetime ,)* $( $generics ),* )?]
1488
            [$(where $( $where_clause_ty
1489
                $(: $where_clause_bound)?
1490
                $(: ?$where_clause_unsized_bound)?
1491
                $(: $where_clause_lifetime_bound)?
1492
            ),* )?]
1493
            {
1494
                $($body_data)*
1495
            }
1496
            $(impl $($pinned_drop)*)?
1497
        }
1498
    };
1499
}
1500
1501
#[doc(hidden)]
1502
pub mod __private {
1503
    use core::mem::ManuallyDrop;
1504
    #[doc(hidden)]
1505
    pub use core::{
1506
        marker::{PhantomData, Unpin},
1507
        ops::Drop,
1508
        pin::Pin,
1509
        ptr,
1510
    };
1511
1512
    // This is an internal helper struct used by `pin_project!`.
1513
    #[doc(hidden)]
1514
    pub struct AlwaysUnpin<T: ?Sized>(PhantomData<T>);
1515
1516
    impl<T: ?Sized> Unpin for AlwaysUnpin<T> {}
1517
1518
    // This is an internal helper used to ensure a value is dropped.
1519
    #[doc(hidden)]
1520
    pub struct UnsafeDropInPlaceGuard<T: ?Sized>(*mut T);
1521
1522
    impl<T: ?Sized> UnsafeDropInPlaceGuard<T> {
1523
        #[doc(hidden)]
1524
0
        pub unsafe fn new(ptr: *mut T) -> Self {
1525
0
            Self(ptr)
1526
0
        }
1527
    }
1528
1529
    impl<T: ?Sized> Drop for UnsafeDropInPlaceGuard<T> {
1530
0
        fn drop(&mut self) {
1531
0
            unsafe {
1532
0
                ptr::drop_in_place(self.0);
1533
0
            }
1534
0
        }
1535
    }
1536
1537
    // This is an internal helper used to ensure a value is overwritten without
1538
    // its destructor being called.
1539
    #[doc(hidden)]
1540
    pub struct UnsafeOverwriteGuard<T> {
1541
        target: *mut T,
1542
        value: ManuallyDrop<T>,
1543
    }
1544
1545
    impl<T> UnsafeOverwriteGuard<T> {
1546
        #[doc(hidden)]
1547
0
        pub unsafe fn new(target: *mut T, value: T) -> Self {
1548
0
            Self { target, value: ManuallyDrop::new(value) }
1549
0
        }
1550
    }
1551
1552
    impl<T> Drop for UnsafeOverwriteGuard<T> {
1553
0
        fn drop(&mut self) {
1554
0
            unsafe {
1555
0
                ptr::write(self.target, ptr::read(&*self.value));
1556
0
            }
1557
0
        }
1558
    }
1559
}