This library provides fixed!
, a proc-macro that allows
easily creating fixed-point constants for all of the fixed-point types provided in
fixed
crate.
[dependencies]
fixed-macro = "1.1"
Compiler support: rustc 1.61+.
-
The syntax of the macro is as follows:
fixed!(<value>: <type>)
where
<value>
is an integer literal or a float literal, and<type>
is either of the formI<i>F<f>
orU<i>F<f>
, matching one of the type aliases provided infixed::types
. Note in particular that<value>
has to be a literal and not an arbitrary arithmetic expression, and that<type>
is considered a special identifier, so that it doesn't have to be imported first. -
Create a fixed-point constant which is parsed at compile time (the same syntax for int and float literals is supported as in Rust itself, including underscores and scientific notation):
use fixed_macro::fixed; use fixed::types::U8F8; let x1 = fixed!(-1.23: I32F32); // float literal (note, the type is not in scope) const X2: U8F8 = fixed!(1.2: U8F8); // can be used to initialize const values let x3 = fixed!(123: U8F8); // decimal integers work as well let x4 = fixed!(0x7B: U8F8); // and hex/oct/bin integers too let x5 = fixed!(1_234.567_890: I32F32); // underscores are ignored, same as in rustc let x7 = fixed!(0.12e+01: U8F8); // scientific notation is also supported
-
For each type alias from
fixed::types
, there is a macro with a matching name infixed_macro::types
which you can use without specifying the type name:use fixed_macro::types::I16F48; let a1 = I16F48!(-1.23);
Both the macro and the type can happily coexist in the same scope:
use fixed::types::I16F48; use fixed_macro::types::I16F48; const B1: I16F48 = I16F48!(1.23e-2);
You can choose to import both under different (or same) user-defined names:
use fixed::types::{I16F48 as Decimal}; use fixed_macro::types::{I16F48 as dec}; let c1 = dec!(12_345); const C2: Decimal = dec!(-0.123_456);
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.