Skip to main content

diffsol_c/
solve_macros.rs

1// macro to generate all the trait methods for accessing ic_options
2#[macro_export]
3macro_rules! generate_trait_ic_option_accessors {
4    ($($field:ident : $type:ty),*) => {
5        $(
6            paste! {
7                fn [<set_ic_ $field>](&mut self, value: $type);
8                fn [<ic_ $field>](&self) -> $type;
9            }
10        )*
11    };
12}
13
14// macro to generate all the trait methods for accessing ode_options
15#[macro_export]
16macro_rules! generate_trait_ode_option_accessors {
17    ($($field:ident : $type:ty),*) => {
18        $(
19            paste! {
20                fn [<set_ode_ $field>](&mut self, value: $type);
21                fn [<ode_ $field>](&self) -> $type;
22            }
23        )*
24    };
25}
26
27// helper macros to convert f64 to/from M::T when needed
28#[macro_export]
29macro_rules! option_value_to_store {
30    ($value:expr, f64) => {
31        M::T::from_f64($value).unwrap()
32    };
33    ($value:expr, $type:ty) => {
34        $value
35    };
36}
37
38#[macro_export]
39macro_rules! option_value_from_store {
40    ($value:expr, f64) => {
41        $value.to_f64().unwrap()
42    };
43    ($value:expr, $type:ty) => {
44        $value
45    };
46}
47
48// generic accessor generator to reduce duplication between ic/ode variants
49#[macro_export]
50macro_rules! generate_option_accessors {
51    ($store:ident, $prefix:ident; $($field:ident : $type:ty),* $(,)?) => {
52        $(
53            paste! {
54                fn [<set_ $prefix _ $field>](&mut self, value: $type) {
55                    self.problem.$store.$field = option_value_to_store!(value, $type);
56                }
57
58                fn [<$prefix _ $field>](&self) -> $type {
59                    option_value_from_store!(self.problem.$store.$field, $type)
60                }
61            }
62        )*
63    };
64}
65
66// macro to generate all the setters and getters for ic_options
67#[macro_export]
68macro_rules! generate_ic_option_accessors {
69    ($($field:ident : $type:ty),* $(,)?) => {
70        generate_option_accessors! { ic_options, ic; $($field : $type),* }
71    };
72}
73
74// macro to generate all the setters and getters for ode_options
75#[macro_export]
76macro_rules! generate_ode_option_accessors {
77    ($($field:ident : $type:ty),* $(,)?) => {
78        generate_option_accessors! { ode_options, ode; $($field : $type),* }
79    };
80}