276 lines
7.1 KiB
Rust
276 lines
7.1 KiB
Rust
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
|
|
// default #[pin_project], PinnedDrop, project_replace, !Unpin, and UnsafeUnpin without UnsafeUnpin impl are completely safe.
|
|
|
|
/// Testing default struct.
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[::pin_project::pin_project]
|
|
#[derive(Debug)]
|
|
pub struct DefaultStruct<T, U> {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pub pinned: T,
|
|
/// Unpinned field.
|
|
pub unpinned: U,
|
|
}
|
|
|
|
/// Testing named struct.
|
|
#[::pin_project::pin_project(
|
|
project = DefaultStructNamedProj,
|
|
project_ref = DefaultStructNamedProjRef,
|
|
)]
|
|
#[derive(Debug)]
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
pub struct DefaultStructNamed<T, U> {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pub pinned: T,
|
|
/// Unpinned field.
|
|
pub unpinned: U,
|
|
}
|
|
|
|
/// Testing default tuple struct.
|
|
#[::pin_project::pin_project]
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[derive(Debug)]
|
|
pub struct DefaultTupleStruct<T, U>(#[pin] pub T, pub U);
|
|
|
|
/// Testing named tuple struct.
|
|
#[::pin_project::pin_project(
|
|
project = DefaultTupleStructNamedProj,
|
|
project_ref = DefaultTupleStructNamedProjRef,
|
|
)]
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[derive(Debug)]
|
|
pub struct DefaultTupleStructNamed<T, U>(#[pin] pub T, pub U);
|
|
|
|
/// Testing enum.
|
|
#[allow(clippy::exhaustive_enums)] // for the type itself
|
|
#[::pin_project::pin_project(
|
|
project = DefaultEnumProj,
|
|
project_ref = DefaultEnumProjRef,
|
|
)]
|
|
#[derive(Debug)]
|
|
pub enum DefaultEnum<T, U> {
|
|
/// Struct variant.
|
|
Struct {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pinned: T,
|
|
/// Unpinned field.
|
|
unpinned: U,
|
|
},
|
|
/// Tuple variant.
|
|
Tuple(#[pin] T, U),
|
|
/// Unit variant.
|
|
Unit,
|
|
}
|
|
|
|
/// Testing pinned drop struct.
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[::pin_project::pin_project(PinnedDrop)]
|
|
#[derive(Debug)]
|
|
pub struct PinnedDropStruct<T, U> {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pub pinned: T,
|
|
/// Unpinned field.
|
|
pub unpinned: U,
|
|
}
|
|
|
|
#[::pin_project::pinned_drop]
|
|
impl<T, U> PinnedDrop for PinnedDropStruct<T, U> {
|
|
#[allow(clippy::absolute_paths)]
|
|
fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
|
|
}
|
|
|
|
/// Testing pinned drop tuple struct.
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[::pin_project::pin_project(PinnedDrop)]
|
|
#[derive(Debug)]
|
|
pub struct PinnedDropTupleStruct<T, U>(#[pin] pub T, pub U);
|
|
|
|
#[::pin_project::pinned_drop]
|
|
impl<T, U> PinnedDrop for PinnedDropTupleStruct<T, U> {
|
|
#[allow(clippy::absolute_paths)]
|
|
fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
|
|
}
|
|
|
|
/// Testing pinned drop enum.
|
|
#[allow(clippy::absolute_paths, clippy::exhaustive_enums)] // for the type itself
|
|
#[::pin_project::pin_project(
|
|
PinnedDrop,
|
|
project = PinnedDropEnumProj,
|
|
project_ref = PinnedDropEnumProjRef,
|
|
)]
|
|
#[derive(Debug)]
|
|
pub enum PinnedDropEnum<T: ::pin_project::__private::Unpin, U> {
|
|
/// Struct variant.
|
|
Struct {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pinned: T,
|
|
/// Unpinned field.
|
|
unpinned: U,
|
|
},
|
|
/// Tuple variant.
|
|
Tuple(#[pin] T, U),
|
|
/// Unit variant.
|
|
Unit,
|
|
}
|
|
|
|
#[::pin_project::pinned_drop]
|
|
#[allow(clippy::absolute_paths)]
|
|
impl<T: ::pin_project::__private::Unpin, U> PinnedDrop for PinnedDropEnum<T, U> {
|
|
fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
|
|
}
|
|
|
|
/// Testing default struct with replace.
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[::pin_project::pin_project(project_replace)]
|
|
#[derive(Debug)]
|
|
pub struct ReplaceStruct<T, U> {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pub pinned: T,
|
|
/// Unpinned field.
|
|
pub unpinned: U,
|
|
}
|
|
|
|
/// Testing named struct with replace.
|
|
#[::pin_project::pin_project(
|
|
project = ReplaceStructNamedProj,
|
|
project_ref = ReplaceStructNamedProjRef,
|
|
project_replace = ReplaceStructNamedProjOwn,
|
|
)]
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[derive(Debug)]
|
|
pub struct ReplaceStructNamed<T, U> {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pub pinned: T,
|
|
/// Unpinned field.
|
|
pub unpinned: U,
|
|
}
|
|
|
|
/// Testing default struct with replace.
|
|
#[::pin_project::pin_project(project_replace)]
|
|
#[derive(Debug)]
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
pub struct ReplaceTupleStruct<T, U>(#[pin] pub T, pub U);
|
|
|
|
/// Testing named struct with replace.
|
|
#[::pin_project::pin_project(
|
|
project = ReplaceTupleStructNamedProj,
|
|
project_ref = ReplaceTupleStructNamedProjRef,
|
|
project_replace = ReplaceTupleStructNamedProjOwn,
|
|
)]
|
|
#[derive(Debug)]
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
pub struct ReplaceTupleStructNamed<T, U>(#[pin] pub T, pub U);
|
|
|
|
/// Testing enum with replace.
|
|
#[allow(clippy::exhaustive_enums)] // for the type itself
|
|
#[::pin_project::pin_project(
|
|
project = ReplaceEnumProj,
|
|
project_ref = ReplaceEnumProjRef,
|
|
project_replace = ReplaceEnumProjOwn,
|
|
)]
|
|
#[derive(Debug)]
|
|
pub enum ReplaceEnum<T, U> {
|
|
/// Struct variant.
|
|
Struct {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pinned: T,
|
|
/// Unpinned field.
|
|
unpinned: U,
|
|
},
|
|
/// Tuple variant.
|
|
Tuple(#[pin] T, U),
|
|
/// Unit variant.
|
|
Unit,
|
|
}
|
|
|
|
/// Testing struct with unsafe `Unpin`.
|
|
#[::pin_project::pin_project(UnsafeUnpin)]
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[derive(Debug)]
|
|
pub struct UnsafeUnpinStruct<T, U> {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pub pinned: T,
|
|
/// Unpinned field.
|
|
pub unpinned: U,
|
|
}
|
|
|
|
/// Testing tuple struct with unsafe `Unpin`.
|
|
#[::pin_project::pin_project(UnsafeUnpin)]
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[derive(Debug)]
|
|
pub struct UnsafeUnpinTupleStruct<T, U>(#[pin] pub T, pub U);
|
|
|
|
/// Testing enum unsafe `Unpin`.
|
|
#[allow(clippy::exhaustive_enums)] // for the type itself
|
|
#[::pin_project::pin_project(
|
|
UnsafeUnpin,
|
|
project = UnsafeUnpinEnumProj,
|
|
project_ref = UnsafeUnpinEnumProjRef,
|
|
)]
|
|
#[derive(Debug)]
|
|
pub enum UnsafeUnpinEnum<T, U> {
|
|
/// Struct variant.
|
|
Struct {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pinned: T,
|
|
/// Unpinned field.
|
|
unpinned: U,
|
|
},
|
|
/// Tuple variant.
|
|
Tuple(#[pin] T, U),
|
|
/// Unit variant.
|
|
Unit,
|
|
}
|
|
|
|
/// Testing struct with `!Unpin`.
|
|
#[::pin_project::pin_project(!Unpin)]
|
|
#[derive(Debug)]
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
pub struct NotUnpinStruct<T, U> {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pub pinned: T,
|
|
/// Unpinned field.
|
|
pub unpinned: U,
|
|
}
|
|
|
|
/// Testing tuple struct with `!Unpin`.
|
|
#[allow(clippy::exhaustive_structs)] // for the type itself
|
|
#[::pin_project::pin_project(!Unpin)]
|
|
#[derive(Debug)]
|
|
pub struct NotUnpinTupleStruct<T, U>(#[pin] pub T, pub U);
|
|
|
|
/// Testing enum with `!Unpin`.
|
|
#[allow(clippy::exhaustive_enums)] // for the type itself
|
|
#[::pin_project::pin_project(
|
|
!Unpin,
|
|
project = NotUnpinEnumProj,
|
|
project_ref = NotUnpinEnumProjRef,
|
|
)]
|
|
#[derive(Debug)]
|
|
pub enum NotUnpinEnum<T, U> {
|
|
/// Struct variant.
|
|
Struct {
|
|
/// Pinned field.
|
|
#[pin]
|
|
pinned: T,
|
|
/// Unpinned field.
|
|
unpinned: U,
|
|
},
|
|
/// Tuple variant.
|
|
Tuple(#[pin] T, U),
|
|
/// Unit variant.
|
|
Unit,
|
|
}
|