# nz [![github]](https://github.com/noelhorvath/nz) [![crates.io]](https://crates.io/crates/nz/0.4.1) [![docs.rs]](https://docs.rs/nz/0.4.1/nz) [![rust-ci]](https://github.com/noelhorvath/nz/actions?query=branch%3A0.4.1) [![msrv]](https://releases.rs/docs/1.79.0/) ![unsafety] [![license]](#license) [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&logo=github [crates.io]: https://img.shields.io/badge/crates.io-0.4.1-orange?style=for-the-badge&logo=rust [docs.rs]: https://img.shields.io/docsrs/nz/0.4.1?style=for-the-badge&logo=docs.rs [rust-ci]: https://img.shields.io/github/actions/workflow/status/noelhorvath/nz/check.yml?branch=0.4.1&style=for-the-badge&logo=github [msrv]: https://img.shields.io/badge/MSRV-1.79.0-F21D1D?style=for-the-badge&logo=rust [unsafety]: https://img.shields.io/badge/unsafe-forbidden-brightgreen?style=for-the-badge&logo=rust [license]: https://img.shields.io/badge/License-MIT_OR_Zlib_OR_APACHE_2.0-blue?style=for-the-badge ## Table of contents * [Description](#description) * [Disclaimer](#disclaimer) * [Changelog](#changelog) * [Features](#features) * [Macros](#macros) * [Usage](#usage) * [License](#license) ## Description The `nz` crate provides a collection of macros that simplify the creation of the [`NonZero`] type. With these macros, you can easily generate constants of the generic type using literals, constant values or expressions at compiletime. [`NonZero`]: https://doc.rust-lang.org/1.79.0/core/num/struct.NonZero.html ## Changelog All changes to `nz` crate are documented in [CHANGELOG.md](changelog.md). ## Features * No unsafe code * No dependencies * `no_std` compatible * Supports every type that implements [`ZeroablePrimitive`] * Compile-time evaluation [`ZeroablePrimitive`]: https://doc.rust-lang.org/1.79.0/core/num/trait.ZeroablePrimitive.html ## Macros | Type | Macro | |------|-------| | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroI8.html) | [`nz::i8!`](https://docs.rs/nz/0.4.1/nz/macro.i8.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroI16.html) | [`nz::i16!`](https://docs.rs/nz/0.4.1/nz/macro.i16.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroI32.html) | [`nz::i32!`](https://docs.rs/nz/0.4.1/nz/macro.i32.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroI16.html) | [`nz::i64!`](https://docs.rs/nz/0.4.1/nz/macro.i64.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroI128.html) | [`nz::i128!`](https://docs.rs/nz/0.4.1/nz/macro.i128.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroIsize.html) | [`nz::isize!`](https://docs.rs/nz/0.4.1/nz/macro.isize.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroU8.html) | [`nz::u8!`](https://docs.rs/nz/0.4.1/nz/macro.u8.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroU16.html) | [`nz::u16!`](https://docs.rs/nz/0.4.1/nz/macro.u16.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroU32.html) | [`nz::u32!`](https://docs.rs/nz/0.4.1/nz/macro.u32.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroU64.html) | [`nz::u64!`](https://docs.rs/nz/0.4.1/nz/macro.u64.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroU128.html) | [`nz::u128!`](https://docs.rs/nz/0.4.1/nz/macro.u128.html) | | [`NonZero`](https://doc.rust-lang.org/1.79.0/core/num/type.NonZeroUsize.html) | [`nz::usize!`](https://docs.rs/nz/0.4.1/nz/macro.usize.html) | ## Usage ```rust use std::num::NonZero; // A `NonZero` type can be constructed from different types of // arguments with the matching `nz` macro. // Such argument can be an integer literal, const NZ_MIN: NonZero = nz::u8!(1); let nz_two = nz::u8!(2); // a constant value, const NZ_MAX: NonZero = nz::u8!(u8::MAX); const SIX: u8 = 6; let six = nz::u8!(SIX); // or even a constant expression. const RES: NonZero = 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: NonZero = nz::u8!({ 3 + 7 } - nz_two.get()); ``` ## License This library is distributed under the terms of either of the following licenses at your option: - [MIT License](http://opensource.org/licenses/MIT) - [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) - [Zlib License](https://www.zlib.net/zlib_license.html)