macro_rules! assert_pinned {
($ty:ty, $field:ident, $field_ty:ty, inline) => { ... };
($ty:ty, $field:ident, $field_ty:ty) => { ... };
}Expand description
Asserts that a field on a struct using #[pin_data] is marked with #[pin] ie. that it is
structurally pinned.
§Example
This will succeed:
use pin_init::{pin_data, assert_pinned};
#[pin_data]
struct MyStruct {
#[pin]
some_field: u64,
}
assert_pinned!(MyStruct, some_field, u64);This will fail:
ⓘ
use pin_init::{pin_data, assert_pinned};
#[pin_data]
struct MyStruct {
some_field: u64,
}
assert_pinned!(MyStruct, some_field, u64);Some uses of the macro may trigger the can't use generic parameters from outer item error. To
work around this, you may pass the inline parameter to the macro. The inline parameter can
only be used when the macro is invoked from a function body.
use pin_init::{pin_data, assert_pinned};
#[pin_data]
struct Foo<T> {
#[pin]
elem: T,
}
impl<T> Foo<T> {
fn project(self: Pin<&mut Self>) -> Pin<&mut T> {
assert_pinned!(Foo<T>, elem, T, inline);
// SAFETY: The field is structurally pinned.
unsafe { self.map_unchecked_mut(|me| &mut me.elem) }
}
}