nz
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.
Changelog
All changes to nz crate are documented in changelog.md.
Features
- No unsafe code
- No dependencies
no_stdcompatible- Supports all non-zero types in
core::num - Compile-time evaluation
Macros
Usage
use 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 = u8!;
let nz_two = u8!;
// a constant value,
const NZ_MAX: NonZeroU8 = u8!;
const SIX: u8 = 6;
let six = u8!;
// or even a constant expression.
const RES: NonZeroU8 = u8!;
let res = u8!;
let five = u8!;
// However, a non-constant expression results in a compile-time error.
// const __ERR: NonZeroU8 = nz::u8!({ 3 + 7 } - nz_two.get());
Limitations
Declarative macro hygiene
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.
Non-expanded
const __ERR: NonZeroI8 = i8!;
Expanded
const _ERR: NonZeroI8 = ;
License
This library is distributed under the terms of either of the following licenses at your option: