Rustのpin_projectのマクロの展開後のコード
code:rs
use pin_project::pin_project;
use std::pin::Pin;
struct Struct<T, U> {
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:rs
use std::prelude::v1::*;
extern crate std;
use pin_project::pin_project;
use std::pin::Pin;
struct Struct<T, U> {
pinned: T,
unpinned: U,
}
struct __StructProjection<'pin, T, U> where Struct<T, U>: 'pin {
pinned: ::pin_project::__private::Pin<&'pin mut (T)>,
unpinned: &'pin mut (U),
}
struct __StructProjectionRef<'pin, T, U> where Struct<T, U>: 'pin {
pinned: ::pin_project::__private::Pin<&'pin (T)>,
unpinned: &'pin (U),
}
const _: () =
{
impl <T, U> Struct<T, U> {
fn project<'pin>(self:
::pin_project::__private::Pin<&'pin mut Self>)
-> __StructProjection<'pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_unchecked_mut();
__StructProjection{pinned:
::pin_project::__private::Pin::new_unchecked(pinned),
unpinned,}
}
}
fn project_ref<'pin>(self:
::pin_project::__private::Pin<&'pin Self>)
-> __StructProjectionRef<'pin, T, U> {
unsafe {
let Self { pinned, unpinned } = self.get_ref();
__StructProjectionRef{pinned:
::pin_project::__private::Pin::new_unchecked(pinned),
unpinned,}
}
}
}
struct __Struct<'pin, T, U> {
__pin_project_use_generics: ::pin_project::__private::AlwaysUnpin<'pin,
(::pin_project::__private::PhantomData<T>,
::pin_project::__private::PhantomData<U>)>,
__field0: T,
}
impl <'pin, T, U> ::pin_project::__private::Unpin for Struct<T, U>
where __Struct<'pin, T, U>: ::pin_project::__private::Unpin {
}
unsafe impl <T, U> ::pin_project::UnsafeUnpin for Struct<T, U> { }
trait StructMustNotImplDrop { }
impl <T: ::pin_project::__private::Drop> StructMustNotImplDrop for T {
}
impl <T, U> StructMustNotImplDrop for Struct<T, U> { }
impl <T, U> ::pin_project::__private::PinnedDrop for Struct<T, U> {
unsafe fn drop(self: ::pin_project::__private::Pin<&mut Self>) { }
}
fn __assert_not_repr_packed<T, U>(val: &Struct<T, U>) {
&val.pinned;
&val.unpinned;
}
};
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
}
}