A small macro crate providing safe, easy, and fully zero-cost way to construct constant or literal instances of the NonZero*
types from core::num
.
-
Crate fully supports
no_std
. -
All
NonZero
types are supported:core::num::NonZeroUsize
via thenonzero_lit::usize!
macro.core::num::NonZeroIsize
via thenonzero_lit::isize!
macro.core::num::NonZeroU128
via thenonzero_lit::u128!
macro.core::num::NonZeroI128
via thenonzero_lit::i128!
macro.core::num::NonZeroU64
via thenonzero_lit::u64!
macro.core::num::NonZeroI64
via thenonzero_lit::i64!
macro.core::num::NonZeroU32
via thenonzero_lit::u32!
macro.core::num::NonZeroI32
via thenonzero_lit::i32!
macro.core::num::NonZeroU16
via thenonzero_lit::u16!
macro.core::num::NonZeroI16
via thenonzero_lit::i16!
macro.core::num::NonZeroU8
via thenonzero_lit::u8!
macro.core::num::NonZeroI8
via thenonzero_lit::i8!
macro.
-
Fully zero cost, even for debug builds — we always evaluate the constant as a
const
, even when the result is used as part of a non-const expression. -
Input to the macros can be arbitrary constant expressions. This includes
const fn
calls, which would be more difficult to verify the result as non-zero by hand. -
Misuse (trying to make a
NonZero$Int
with a zero value) is always detected at compile time, even when the macro is not being used to initialize a constant. -
No unsafe code.
Add this to your Cargo.toml:
[dependencies]
nonzero_lit = "0.1"
let x = nonzero_lit::i32!(4);
assert_eq!(x.get(), 4);
const FERRIS: core::num::NonZeroU32 = nonzero_lit::u32!(0xf34415);
assert_eq!(FERRIS.get(), 0xf34415);
use core::num::NonZeroU64;
const MASK: NonZeroU64 = nonzero_lit::u64!(0xffff_00ff_00ff_0f0f);
const MASKEE: NonZeroU64 = nonzero_lit::u64!(0xaabb_ccdd_eeff_1122);
const MASKED: NonZeroU64 = nonzero_lit::u64!(MASK.get() & MASKEE.get());
assert_eq!(MASKED.get(), 0xaabb_00dd_00ff_0102_u64);
Public domain, as explained here. If that's unacceptable, it's also available under either the Apache-2.0 or MIT licenses, at your option.