3 releases

0.1.2 Dec 2, 2024
0.1.1 Oct 24, 2024
0.1.0 Oct 24, 2024

#615 in Data structures

Download history 235/week @ 2024-10-21 20/week @ 2024-10-28 170/week @ 2024-12-02 24/week @ 2024-12-09

194 downloads per month

MIT/Apache

14KB
191 lines

Stable, no_std-compatible, fallible heap allocation for [Box].

Basic usage is as follows:

match trybox::new(1) {
    Ok(heaped) => {
        let _: Box<i32> = heaped;
    }
    Err(ErrorWith(stacked)) => {
        let _: i32 = stacked; // failed object is returned on the stack
    },
}

You may drop the object after allocation failure instead, choosing to e.g propogate or wrap the Error.

fn fallible<T>(x: T) -> Result<Box<T>, Box<dyn std::error::Error + Send + Sync>> {
    Ok(trybox::or_drop(x)?)
}

Care has been taken to optimize the size of Error down to a single usize:

assert_eq!(size_of::<trybox::Error>(), size_of::<usize>());

And to provide ergonomic error messages:

memory allocation of 4 bytes (for type i32) failed
memory allocation of 2.44 kibibytes (for type [u8; 2500]) failed

Conversions to std::io::Error and std::io::ErrorKind::OutOfMemory are provided when the "std" feature is enabled:

fn fallible<T>(x: T) -> std::io::Result<Box<T>> {
    Ok(trybox::or_drop(x)?)
}

Comparison with other crates

No runtime deps