danwi 0.4.2

Zero-cost dimensional analysis library with SI units, compile-time checking, and no_std support
Documentation
use danwi::{Quantity, dimension::Energy, kind::Torque, prelude::*};

type TorqueQ = Quantity<f64, Energy, Torque>;

#[test]
fn same_kind_arithmetic() {
    let t: TorqueQ = (50.0.N() * 0.4.m()).cast_kind();
    assert_eq!(t + t, (40.0.J()).cast_kind());
    assert_eq!(t - t, (0.0.J()).cast_kind());
    assert_eq!(-t, (-20.0.J()).cast_kind());
    assert!(t > (10.0.J()).cast_kind());
}

#[test]
fn scalar_ops_preserve_kind() {
    let t: TorqueQ = (20.0.J()).cast_kind();
    let doubled: TorqueQ = t * 2.0;
    assert_eq!(doubled, 2.0 * t);
    assert_eq!(doubled / 2.0, t);
}

#[test]
fn cast_and_erase() {
    let t: TorqueQ = (20.0.J()).cast_kind();
    assert_eq!(t.value(), 20.0);
    assert_eq!(t.erase_kind(), 20.0.J());

    // erased values multiply again
    let power = t.erase_kind() / 2.0.s();
    assert_eq!(power, 10.0.W());
}

#[test]
fn custom_kinds_via_macro() {
    mod my {
        danwi::kinds! {
            Activity;
        }
    }

    let decay: Quantity<f64, danwi::dimension::Frequency, my::Activity> = (37.0.kHz()).cast_kind();
    assert_eq!((decay + decay).value(), 74_000.0);
}

#[test]
fn kinded_quantities_stay_transparent() {
    assert_eq!(core::mem::size_of::<TorqueQ>(), core::mem::size_of::<f64>());
}