https://github.com/taiki-e/const_fn
A lightweight attribute for easy generation of const functions with conditional compilations.
https://github.com/taiki-e/const_fn
no-std proc-macro rust
Last synced: 10 months ago
JSON representation
A lightweight attribute for easy generation of const functions with conditional compilations.
- Host: GitHub
- URL: https://github.com/taiki-e/const_fn
- Owner: taiki-e
- License: apache-2.0
- Created: 2018-12-25T19:58:23.000Z (about 7 years ago)
- Default Branch: main
- Last Pushed: 2025-03-20T17:56:55.000Z (11 months ago)
- Last Synced: 2025-03-31T17:08:24.284Z (11 months ago)
- Topics: no-std, proc-macro, rust
- Language: Rust
- Homepage: https://docs.rs/const_fn
- Size: 383 KB
- Stars: 27
- Watchers: 3
- Forks: 2
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# \#\[const_fn\]
[](https://crates.io/crates/const_fn)
[](https://docs.rs/const_fn)
[](#license)
[](https://www.rust-lang.org)
[](https://github.com/taiki-e/const_fn/actions)
A lightweight attribute for easy generation of const functions with conditional
compilations.
## Usage
Add this to your `Cargo.toml`:
```toml
[dependencies]
const_fn = "0.4"
```
## Examples
```rust
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`.
```rust
// 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`](https://github.com/ogoffart/if_rust_version#examples)),
or [you can define the same function twice with different cfg](https://github.com/crossbeam-rs/crossbeam/blob/0b6ea5f69fde8768c1cfac0d3601e0b4325d7997/crossbeam-epoch/src/atomic.rs#L340-L372).
(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](LICENSE-APACHE) or
[MIT license](LICENSE-MIT) 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.