fastsim_core/
macros.rs

1#[macro_export]
2macro_rules! eff_test_body {
3    ($component:ident, $eff_max:expr, $eff_min:expr, $eff_range:expr) => {
4        assert!(almost_eq($component.get_eff_max(), $eff_max, None));
5        assert!(almost_eq($component.get_eff_min(), $eff_min, None));
6        assert!(almost_eq($component.get_eff_range(), $eff_range, None));
7
8        $component.set_eff_max(0.9).unwrap();
9        assert!(almost_eq($component.get_eff_max(), 0.9, None));
10        assert!(almost_eq(
11            $component.get_eff_min(),
12            $eff_min * 0.9 / $eff_max,
13            None
14        ));
15        assert!(almost_eq(
16            $component.get_eff_range(),
17            $eff_range * 0.9 / $eff_max,
18            None
19        ));
20
21        $component.set_eff_range(0.2).unwrap();
22        assert!(almost_eq($component.get_eff_max(), 0.9, None));
23        assert!(almost_eq($component.get_eff_min(), 0.7, None));
24        assert!(almost_eq($component.get_eff_range(), 0.2, None));
25
26        $component.set_eff_range(0.98).unwrap();
27        assert!(almost_eq($component.get_eff_max(), 0.98, None));
28        assert!(almost_eq($component.get_eff_min(), 0.0, None));
29        assert!(almost_eq($component.get_eff_range(), 0.98, None));
30    };
31}
32
33#[macro_export]
34macro_rules! make_uom_cmp_fn {
35    ($name:ident) => {
36        paste! {
37            /// # Arguments
38            /// - `val1`: LHS
39            /// - `val2`: RHS
40            /// - `epsilon`: error threshold, defaults to [crate::utils::COMP_EPSILON]
41            pub fn [<$name _uom>]<D, U>(
42                val1: &uom::si::Quantity<D, U, f64>,
43                val2: &uom::si::Quantity<D, U, f64>,
44                epsilon: Option<f64>,
45            ) -> bool
46            where
47                D: uom::si::Dimension + ?Sized,
48                U: uom::si::Units<f64> + ?Sized,
49            {
50                $name(val1.value, val2.value, epsilon)
51            }
52        }
53    };
54}
55
56#[macro_export]
57/// Generates a String similar to output of `dbg` but without printing
58macro_rules! format_dbg {
59    ($dbg_expr:expr) => {
60        format!(
61            "[{}:{}] {}: {:?}",
62            file!(),
63            line!(),
64            stringify!($dbg_expr),
65            $dbg_expr
66        )
67    };
68    () => {
69        format!("[{}:{}]", file!(), line!())
70    };
71}
72
73#[macro_export]
74/// Makes it so that optional parameters get set in the `Init::init` call
75macro_rules! init_opt_default {
76    ($obj:ident, $fieldname:ident, $def_val:expr) => {
77        $obj.$fieldname = $obj.$fieldname.or(Some($def_val));
78    };
79}
80
81#[macro_export]
82/// Times the duration whatever gets passed in
83macro_rules! timer {
84    ($code_block:expr) => {
85        #[cfg(feature = "timer")]
86        let now_and_then = Instant::now();
87        $code_block;
88        #[cfg(feature = "timer")]
89        println!(
90            "{}\nElapsed time: {} μs",
91            format_dbg!(),
92            now_and_then.elapsed().as_micros()
93        );
94    };
95}