diff --git a/src/__internal.rs b/src/__internal.rs index e54d90a4..7d8ab219 100644 --- a/src/__internal.rs +++ b/src/__internal.rs @@ -58,36 +58,6 @@ impl PhantomInvariantLifetime<'_> { } } -/// Module-internal type implementing `PinInit` and `Init`. -/// -/// It is unsafe to create this type, since the closure needs to fulfill the same safety -/// requirement as the `__pinned_init`/`__init` functions. -pub(crate) struct InitClosure(pub(crate) F, pub(crate) PhantomInvariant<(E, T)>); - -// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the -// `__init` invariants. -unsafe impl Init for InitClosure -where - F: FnOnce(*mut T) -> Result<(), E>, -{ - #[inline] - unsafe fn __init(self, slot: *mut T) -> Result<(), E> { - (self.0)(slot) - } -} - -// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the -// `__pinned_init` invariants. -unsafe impl PinInit for InitClosure -where - F: FnOnce(*mut T) -> Result<(), E>, -{ - #[inline] - unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), E> { - (self.0)(slot) - } -} - /// Token type to signify successful initialization. /// /// Can only be constructed via the unsafe [`Self::new`] function. The initializer macros use this diff --git a/src/lib.rs b/src/lib.rs index 4098c65d..4061cbca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1092,6 +1092,36 @@ where } } +/// Implement `PinInit` and `Init` for closures. +/// +/// It is unsafe to create this type, since the closure needs to fulfill the same safety +/// requirement as the `__pinned_init`/`__init` functions. +struct InitClosure(F, __internal::PhantomInvariant); + +// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the +// `__init` invariants. +unsafe impl Init for InitClosure +where + F: FnOnce(*mut T) -> Result<(), E>, +{ + #[inline] + unsafe fn __init(self, slot: *mut T) -> Result<(), E> { + (self.0)(slot) + } +} + +// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the +// `__pinned_init` invariants. +unsafe impl PinInit for InitClosure +where + F: FnOnce(*mut T) -> Result<(), E>, +{ + #[inline] + unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), E> { + (self.0)(slot) + } +} + /// Creates a new [`PinInit`] from the given closure. /// /// # Safety @@ -1108,7 +1138,7 @@ where pub const unsafe fn pin_init_from_closure( f: impl FnOnce(*mut T) -> Result<(), E>, ) -> impl PinInit { - __internal::InitClosure(f, __internal::PhantomInvariant::new()) + InitClosure(f, __internal::PhantomInvariant::new()) } /// Creates a new [`Init`] from the given closure. @@ -1127,7 +1157,7 @@ pub const unsafe fn pin_init_from_closure( pub const unsafe fn init_from_closure( f: impl FnOnce(*mut T) -> Result<(), E>, ) -> impl Init { - __internal::InitClosure(f, __internal::PhantomInvariant::new()) + InitClosure(f, __internal::PhantomInvariant::new()) } /// Changes the to be initialized type.