Expand description
A crate for safe and ergonomic pin-projection.
§Usage
Add this to your Cargo.toml
:
[dependencies]
pin-project = "1"
§Examples
#[pin_project]
attribute creates projection types
covering all the fields of struct or enum.
use std::pin::Pin;
use pin_project::pin_project;
#[pin_project]
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
impl<T, U> Struct<T, U> {
fn method(self: Pin<&mut Self>) {
let this = self.project();
let _: Pin<&mut T> = this.pinned; // Pinned reference to the field
let _: &mut U = this.unpinned; // Normal reference to the field
}
}
code like this will be generated
To use #[pin_project]
on enums, you need to name the projection type
returned from the method.
use std::pin::Pin;
use pin_project::pin_project;
#[pin_project(project = EnumProj)]
enum Enum<T, U> {
Pinned(#[pin] T),
Unpinned(U),
}
impl<T, U> Enum<T, U> {
fn method(self: Pin<&mut Self>) {
match self.project() {
EnumProj::Pinned(x) => {
let _: Pin<&mut T> = x;
}
EnumProj::Unpinned(y) => {
let _: &mut U = y;
}
}
}
}
code like this will be generated
See #[pin_project]
attribute for more details, and
see examples directory for more examples and generated code.
§Related Projects
- pin-project-lite: A lightweight version of pin-project written with declarative macros.
Traits§
- A trait used for custom implementations of
Unpin
.
Attribute Macros§
- An attribute that creates projection types covering all the fields of struct or enum.
- An attribute used for custom implementations of [
Drop
].