18325e1ecSAlex Crichton use crate::error::OutOfMemory;
2233f1875SNick Fitzgerald 
3233f1875SNick Fitzgerald /// Helper function to invoke `<T as TryNew>::try_new`.
4233f1875SNick Fitzgerald ///
5233f1875SNick Fitzgerald /// # Example
6233f1875SNick Fitzgerald ///
7233f1875SNick Fitzgerald /// ```
8233f1875SNick Fitzgerald /// # use wasmtime_internal_core::alloc::*;
98325e1ecSAlex Crichton /// # use wasmtime_internal_core::error::Result;
10233f1875SNick Fitzgerald /// # fn _foo() -> Result<()> {
11233f1875SNick Fitzgerald /// let boxed = try_new::<Box<u32>>(36)?;
12233f1875SNick Fitzgerald /// assert_eq!(*boxed, 36);
13233f1875SNick Fitzgerald /// # Ok(())
14233f1875SNick Fitzgerald /// # }
15233f1875SNick Fitzgerald /// ```
16233f1875SNick Fitzgerald #[inline]
try_new<T>(value: T::Value) -> Result<T, OutOfMemory> where T: TryNew,17233f1875SNick Fitzgerald pub fn try_new<T>(value: T::Value) -> Result<T, OutOfMemory>
18233f1875SNick Fitzgerald where
19233f1875SNick Fitzgerald     T: TryNew,
20233f1875SNick Fitzgerald {
21233f1875SNick Fitzgerald     TryNew::try_new(value)
22233f1875SNick Fitzgerald }
23233f1875SNick Fitzgerald 
24233f1875SNick Fitzgerald /// Extension trait providing fallible allocation for types like `Arc<T>` and
25*bc4582c3SAlex Crichton /// `Box<T>`.
26233f1875SNick Fitzgerald pub trait TryNew {
27233f1875SNick Fitzgerald     /// The inner `T` type that is getting wrapped into an `Arc<T>` or `Box<T>`.
28233f1875SNick Fitzgerald     type Value;
29233f1875SNick Fitzgerald 
30233f1875SNick Fitzgerald     /// Allocate a new `Self`, returning `Err(OutOfMemory)` on allocation
31233f1875SNick Fitzgerald     /// failure.
try_new(value: Self::Value) -> Result<Self, OutOfMemory> where Self: Sized32233f1875SNick Fitzgerald     fn try_new(value: Self::Value) -> Result<Self, OutOfMemory>
33233f1875SNick Fitzgerald     where
34233f1875SNick Fitzgerald         Self: Sized;
35233f1875SNick Fitzgerald }
36