Skip to content

SLUCHABLUB/non-zero

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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 a const context.
  • The const block is discussed above.
  • NonZero is the std generic non-zero type to which all NonZero*** are aliased. The generic argument can be inferred, not only from $n but also from the macro's usage.
  • .unwrap() inside the const 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.

About

A macro for creating non-zero integers (with type inference).

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages