1 unstable release
Uses new Rust 2024
0.1.0 | May 9, 2025 |
---|
#657 in Math
132 downloads per month
7KB
non-zero
A macro for creating constant non-zero integers (with type inference).
There are multiple crates that address the issue of initialising non-zero integers.
However, most of them lack type inference.
This is why I created non_zero!
.
It uses const
blocks to evaluate the literals at compile time whilst achieving type inference.
The definition is essentially this:
macro_rules! non_zero {
($n:expr) => {
const {
NonZero::new($n).unwrap()
}
};
}
Some things of note:
$n:expr
allows for any expression to be passed to the macro, so long as it is evaluable in aconst
context.- The
const
block is discussed above. NonZero
is thestd
generic non-zero type to which allNonZero***
are aliased. The generic argument can be inferred, not only from$n
but also from the macro's usage..unwrap()
inside theconst
block will cause a compile-time error, not a runtime one.
The above implementation is somewhat simplified;
the real definition produces prettier errors than unwrap
and is more hygienic.
Naming
This crate uses the same name as std
does for its types.
Namely, with a hyphen between "non" and "zero".
In snake_case
the hyphen becomes an underscore and in PascalCase
it creates a word break.