#const #attributes #macro #static #compiler-version #proc-macro

macro no-std const_fn

A lightweight attribute for easy generation of const functions with conditional compilations

22 releases

0.4.10 Apr 21, 2024
0.4.9 Jan 3, 2022
0.4.8 May 19, 2021
0.4.6 Mar 27, 2021
0.1.2 Dec 27, 2018

#1178 in Rust patterns

Download history 123568/week @ 2024-02-06 116905/week @ 2024-02-13 105575/week @ 2024-02-20 123179/week @ 2024-02-27 123821/week @ 2024-03-05 126849/week @ 2024-03-12 121112/week @ 2024-03-19 126999/week @ 2024-03-26 122707/week @ 2024-04-02 114756/week @ 2024-04-09 113806/week @ 2024-04-16 116819/week @ 2024-04-23 115979/week @ 2024-04-30 113994/week @ 2024-05-07 128528/week @ 2024-05-14 125416/week @ 2024-05-21

502,992 downloads per month
Used in 1,073 crates (9 directly)

Apache-2.0 OR MIT

29KB
486 lines

#[const_fn]

crates.io docs.rs license msrv github actions

A lightweight attribute for easy generation of const functions with conditional compilations.

Usage

Add this to your Cargo.toml:

[dependencies]
const_fn = "0.4"

Examples

use const_fn::const_fn;

// function is `const` on specified version and later compiler (including beta, nightly, and dev build)
#[const_fn("1.36")]
pub const fn version() {
    /* ... */
}

// function is `const` on nightly compiler (including dev build)
#[const_fn(nightly)]
pub const fn nightly() {
    /* ... */
}

// function is `const` if `cfg(...)` is true
#[const_fn(cfg(...))]
pub const fn cfg() {
    /* ... */
}

// function is `const` if `cfg(feature = "...")` is true
#[const_fn(feature = "...")]
pub const fn feature() {
    /* ... */
}

Use this crate as an optional dependency

If no arguments are passed, const_fn will always make the function const.

Therefore, you can use const_fn as an optional dependency by combination with cfg_attr.

// function is `const` if `cfg(feature = "...")` is true
#[cfg_attr(feature = "...", const_fn::const_fn)]
pub fn optional() {
    /* ... */
}

Alternatives

This crate is proc-macro, but is very lightweight, and has no dependencies.

You can manually define declarative macros with similar functionality (see if_rust_version), or you can define the same function twice with different cfg. (Note: the former approach requires more macros to be defined depending on the number of version requirements, the latter approach requires more functions to be maintained manually)

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

No runtime deps