@@ -349,6 +349,18 @@ where
349
349
// around pinning.
350
350
unsafe { Pin :: new_unchecked ( pointer) }
351
351
}
352
+
353
+ /// Unwraps this `Pin<P>` returning the underlying pointer.
354
+ ///
355
+ /// This requires that the data inside this `Pin` is [`Unpin`] so that we
356
+ /// can ignore the pinning invariants when unwrapping it.
357
+ ///
358
+ /// [`Unpin`]: ../../std/marker/trait.Unpin.html
359
+ #[ unstable( feature = "pin_into_inner" , issue = "60245" ) ]
360
+ #[ inline( always) ]
361
+ pub fn into_inner ( pin : Pin < P > ) -> P {
362
+ pin. pointer
363
+ }
352
364
}
353
365
354
366
impl < P : Deref > Pin < P > {
@@ -434,6 +446,28 @@ impl<P: Deref> Pin<P> {
434
446
pub fn as_ref ( self : & Pin < P > ) -> Pin < & P :: Target > {
435
447
unsafe { Pin :: new_unchecked ( & * self . pointer ) }
436
448
}
449
+
450
+ /// Unwraps this `Pin<P>` returning the underlying pointer.
451
+ ///
452
+ /// # Safety
453
+ ///
454
+ /// This function is unsafe. You must guarantee that you will continue to
455
+ /// treat the pointer `P` as pinned after you call this function, so that
456
+ /// the invariants on the `Pin` type can be upheld. If the code using the
457
+ /// resulting `P` does not continue to maintain the pinning invariants that
458
+ /// is a violation of the API contract and may lead to undefined behavior in
459
+ /// later (safe) operations.
460
+ ///
461
+ /// If the underlying data is [`Unpin`], [`Pin::into_inner`] should be used
462
+ /// instead.
463
+ ///
464
+ /// [`Unpin`]: ../../std/marker/trait.Unpin.html
465
+ /// [`Pin::into_inner`]: #method.into_inner
466
+ #[ unstable( feature = "pin_into_inner" , issue = "60245" ) ]
467
+ #[ inline( always) ]
468
+ pub unsafe fn into_inner_unchecked ( pin : Pin < P > ) -> P {
469
+ pin. pointer
470
+ }
437
471
}
438
472
439
473
impl < P : DerefMut > Pin < P > {
0 commit comments