Crates.io | fixed-macro |
lib.rs | fixed-macro |
version | 1.2.0 |
source | src |
created_at | 2020-10-18 21:04:16.221369 |
updated_at | 2022-10-16 22:52:49.692462 |
description | Macros for creating fixed-point constants for types in the `fixed` crate. |
homepage | |
repository | https://github.com/aldanor/fixed-macro |
max_upload_size | |
id | 302444 |
size | 28,756 |
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
form I<i>F<f>
or U<i>F<f>
, matching one of the type aliases provided in
fixed::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 in fixed_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);