The nz
crate provides a collection of macros that simplify the creation
of non-zero integers implemented in core::num
. With these macros, you can easily generate constants of all the NonZero-
prefixed types using literals, constant values or expressions at compile time.
All changes to nz
crate are documented in changelog.md.
- No unsafe code
- No dependencies
no_std
compatible- Supports all non-zero types in
core::num
- Compile-time evaluation
use core::num::NonZeroU8;
// A `NonZero*` type can be constructed by different types of
// arguments when using the matching `nz` macro.
// Such argument can be an integer literal,
const NZ_MIN: NonZeroU8 = nz::u8!(1);
let nz_two = nz::u8!(2);
// a constant value,
const NZ_MAX: NonZeroU8 = nz::u8!(u8::MAX);
const SIX: u8 = 6;
let six = nz::u8!(SIX);
// or even a constant expression.
const RES: NonZeroU8 = nz::u8!({ 3 + 7 } - NZ_MIN.get());
let res = nz::u8!((NZ_MIN.get() & NZ_MAX.get()) + 7);
let five = nz::u8!({ const FIVE: u8 = 5; FIVE });
// However, a non-constant expression results in a compile-time error.
// const __ERR: NonZeroU8 = nz::u8!({ 3 + 7 } - nz_two.get());
Declarative macro is not hygienic when it comes to items.
As a result, if the outermost constant item _NZ_INTERNAL_NUM_VALUE_1_
is referenced in the macro argument, a cyclic dependency error occurs as
shown in the below examples.
const __ERR: NonZeroI8 = nz::i8!(_NZ_INTERNAL_NUM_VALUE_1_ + 0x2C);
const _ERR: NonZeroI8 = {
const _NZ_INTERNAL_NUM_VALUE_1_: i8 = _NZ_INTERNAL_NUM_VALUE_1_ + 0x2C;
{
/* rest of the expanded code */
}
};
This library is distributed under the terms of either of the following licenses at your option: