Skip to content

[rust] Extensions to the Box type

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

glandium/boxext

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

57 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

boxext

Extensions to the Box type

This crate provides extra initializer methods for Box, working around the current (as of writing) shortcomings from Box::new:

  • Since Rust 1.12, constructs such as Box::new([0; 4096]) first create a temporary object on the stack before copying it into the newly allocated space (e.g. issue #50047).

  • Constructs such as Box::new(some_function_call()) first get the result from the function call on the stack before copying it into the newly allocated space.

Both can be worked around with some contortion but with caveats. This crate provides helpers doing those contortions for you, but can't deal with the caveats. Those caveats are essentially the same as why the unstable placement features were removed in nightly 1.27, namely that there are no guarantees that things will actually happen in place (and they don't in debug builds).

The crates adds the following helper methods to the Box type:

Examples

extern crate boxext;
use boxext::BoxExt;

struct Foo(usize, usize);

impl Foo {
    fn new(a: usize, b: usize) -> Self {
        Foo(a, b)
   }
}

impl Default for Foo {
    fn default() -> Self {
        Foo::new(0, 1)
    }
}

fn main() {
    // equivalent to `Box::new(Foo(1, 2))`
    let buf = Box::new_with(|| Foo(1, 2));

    // equivalent to `Box::new(Foo::new(2, 3))`
    let buf = Box::new_with(|| Foo::new(2, 3));

    // equivalent to `Box::new(Foo::default())`
    let buf = Box::new_with(Foo::default);

    // equivalent to `Box::new([0usize; 64])`
    let buf: Box<[usize; 64]> = Box::new_zeroed();
}

Features

  • std (enabled by default): Uses libstd. Can be disabled to allow use with no_std code, in which case allocator_api needs to be enabled.

  • allocator_api: Add similar helpers to the Box type from the allocator_api crate.

License: Apache-2.0/MIT

About

[rust] Extensions to the Box type

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Packages

No packages published

Languages