Messages in this thread | ![/](/images/icornerl.gif) | | Date | Thu, 30 Mar 2023 16:37:01 +0200 | Subject | Re: [PATCH v3 06/13] rust: init/sync: add `InPlaceInit` trait to pin-initialize smart pointers | From | Alice Ryhl <> |
| |
On 3/30/23 00:33, y86-dev@protonmail.com wrote: > From: Benno Lossin <y86-dev@protonmail.com> > > The `InPlaceInit` trait that provides two functions, for initializing > using `PinInit<T, E>` and `Init<T>`. It is implemented by `Arc<T>`, > `UniqueArc<T>` and `Box<T>`. > > Signed-off-by: Benno Lossin <y86-dev@protonmail.com> > --- > > +/// Smart pointer that can initialize memory in-place. > +pub trait InPlaceInit<T>: Sized { > + /// Use the given initializer to in-place initialize a `T`. > + /// > + /// If `T: !Unpin` it will not be able to move afterwards. > + fn pin_init<E>(init: impl PinInit<T, E>) -> error::Result<Pin<Self>> > + where > + Error: From<E>; > + > + /// Use the given initializer to in-place initialize a `T`. > + fn init<E>(init: impl Init<T, E>) -> error::Result<Self> > + where > + Error: From<E>; > +}
This definition is potentially rather limiting, because it can only be used with error types that can be converted into a `kernel::Error`. What do you think of this alternative?
pub trait InPlaceInit<T>: Sized { fn pin_init<E>(init: impl PinInit<T, E>) -> Result<Pin<Self>, E> where E: From<AllocError>;
fn init<E>(init: impl Init<T, E>) -> Result<Self, E> where E: From<AllocError>; }
| ![\](/images/icornerr.gif) |