160b26363Sopenharmony_ciuse pin_utils::{unsafe_pinned, unsafe_unpinned, pin_mut}; 260b26363Sopenharmony_ciuse std::pin::Pin; 360b26363Sopenharmony_ciuse std::marker::Unpin; 460b26363Sopenharmony_ci 560b26363Sopenharmony_cistruct Foo<T1, T2> { 660b26363Sopenharmony_ci field1: T1, 760b26363Sopenharmony_ci field2: T2, 860b26363Sopenharmony_ci} 960b26363Sopenharmony_ci 1060b26363Sopenharmony_ciimpl<T1, T2> Foo<T1, T2> { 1160b26363Sopenharmony_ci unsafe_pinned!(field1: T1); 1260b26363Sopenharmony_ci unsafe_unpinned!(field2: T2); 1360b26363Sopenharmony_ci} 1460b26363Sopenharmony_ci 1560b26363Sopenharmony_ciimpl<T1: Unpin, T2> Unpin for Foo<T1, T2> {} // Conditional Unpin impl 1660b26363Sopenharmony_ci 1760b26363Sopenharmony_ci#[test] 1860b26363Sopenharmony_cifn projection() { 1960b26363Sopenharmony_ci let foo = Foo { field1: 1, field2: 2 }; 2060b26363Sopenharmony_ci pin_mut!(foo); 2160b26363Sopenharmony_ci 2260b26363Sopenharmony_ci let x1: Pin<&mut i32> = foo.as_mut().field1(); 2360b26363Sopenharmony_ci assert_eq!(*x1, 1); 2460b26363Sopenharmony_ci 2560b26363Sopenharmony_ci let x2: &mut i32 = foo.as_mut().field2(); 2660b26363Sopenharmony_ci assert_eq!(*x2, 2); 2760b26363Sopenharmony_ci} 28