/fixed-macro

Macros for creating fixed-point constants for types in the `fixed` crate.

Primary LanguageRustApache License 2.0Apache-2.0

fixed-macro

Build Latest Version Documentation Apache 2.0 MIT

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.45+.

Details

  • 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);

License

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.