#allocator-api #fallback #allocator #unstable #standard #polyfill #stable

no-std allocator-fallback

Minimal fallback for the standard library’s allocator API

9 releases

0.1.8 Dec 20, 2022
0.1.7 Dec 18, 2022
0.1.6 Nov 11, 2022
0.1.5 Aug 27, 2022
0.1.1 Apr 29, 2022

#165 in No standard library


Used in 2 crates

Apache-2.0

18KB
160 lines

allocator-fallback

This crate provides a minimal fallback for the standard library’s allocator API, which is currently unstable.

Usage

Because allocator-fallback can be configured to re-export the real unstable allocator API (see Crate features), users of this crate must make sure they conditionally enable #![feature(allocator_api)] in preparation for this occurrence; otherwise, compilation errors may occur. This is the case even for crates that never directly enable allocator-fallback’s allocator_api feature, because a different crate that also depends on allocator-fallback could enable it.

To accomplish this, in Cargo.toml, duplicate your dependency on allocator-fallback in the [build-dependencies] section. For example:

[dependencies]
allocator-fallback = "0.1.7"

[build-dependencies]
allocator-fallback = "0.1.7"

Then, add a build script (build.rs) with the following contents:[^1]

fn main() {
   if allocator_fallback::HAS_ALLOCATOR_API {
       println!("cargo:rustc-cfg=has_allocator_api");
   }
   println!("cargo:rerun-if-changed=build.rs");
}

Finally, at the top of your crate root (likely lib.rs or main.rs), add the following:

#![cfg_attr(has_allocator_api, feature(allocator_api))]

Use as an optional dependency

The instructions above will not work if allocator-fallback is declared as an optional dependency. In this case, adjust the instructions as follows:

Duplicate the dependency on allocator-fallback in [build-dependencies] as before, keeping optional = true in both occurrences. For example:

[dependencies.allocator-fallback]
version = "0.1.7"
optional = true

[build-dependencies.allocator-fallback]
version = "0.1.7"
optional = true

Then, use the following as the contents of your build script (build.rs) instead:[^1]

fn main() {
   #[cfg(feature = "allocator-fallback")]
   if allocator_fallback::HAS_ALLOCATOR_API {
       println!("cargo:rustc-cfg=has_allocator_api");
   }
   println!("cargo:rerun-if-changed=build.rs");
}

Finally, as before, add the following to the top of your crate root:

#![cfg_attr(has_allocator_api, feature(allocator_api))]

[^1]: These build script code snippets have been released to the public domain using the CC0 1.0 Universal Public Domain Dedication.

Crate features

If the crate feature allocator_api is enabled, this crate will simply re-export the real allocator API in the standard library. Of course, this requires Rust nightly.

If the crate feature std is enabled (the default), the crate will use std; otherwise, it will be no_std. Using std allows AllocError to implement std::error::Error.

No runtime deps