xref: /openbmc/phosphor-virtual-sensor/src/exprtkTools.hpp (revision 6272a39308bf6c1945edabf54891157c8079165a)
1*6272a393SAlexander Hansen /*
2*6272a393SAlexander Hansen  * This define will disable the ability for expressions to have comments.
3*6272a393SAlexander Hansen  * Expressions that have comments when parsed with a build that has this
4*6272a393SAlexander Hansen  * option, will result in a compilation failure.
5*6272a393SAlexander Hansen  */
6*6272a393SAlexander Hansen // #define exprtk_disable_comments
7*6272a393SAlexander Hansen /*
8*6272a393SAlexander Hansen  * This define will disable the loop-wise 'break' and 'continue'
9*6272a393SAlexander Hansen  * capabilities. Any expression that contains those keywords will result
10*6272a393SAlexander Hansen  * in a compilation failure.
11*6272a393SAlexander Hansen  */
12*6272a393SAlexander Hansen #define exprtk_disable_break_continue
13*6272a393SAlexander Hansen /*
14*6272a393SAlexander Hansen  * This define will disable the short-circuit '&' (and) and '|' (or)
15*6272a393SAlexander Hansen  * operators
16*6272a393SAlexander Hansen  */
17*6272a393SAlexander Hansen #define exprtk_disable_sc_andor
18*6272a393SAlexander Hansen /*
19*6272a393SAlexander Hansen  * This define will disable all enhanced features such as strength
20*6272a393SAlexander Hansen  * reduction and special function optimisations and expression specific
21*6272a393SAlexander Hansen  * type instantiations. This feature will reduce compilation times and
22*6272a393SAlexander Hansen  * binary sizes but will also result in massive performance degradation
23*6272a393SAlexander Hansen  * of expression evaluations.
24*6272a393SAlexander Hansen  */
25*6272a393SAlexander Hansen #define exprtk_disable_enhanced_features
26*6272a393SAlexander Hansen /*
27*6272a393SAlexander Hansen  * This define will disable all string processing capabilities. Any
28*6272a393SAlexander Hansen  * expression that contains a string or string related syntax will result
29*6272a393SAlexander Hansen  * in a compilation failure.
30*6272a393SAlexander Hansen  */
31*6272a393SAlexander Hansen #define exprtk_disable_string_capabilities
32*6272a393SAlexander Hansen 
33*6272a393SAlexander Hansen #define exprtk_disable_rtl_io_file
34*6272a393SAlexander Hansen #define exprtk_disable_return_statement
35*6272a393SAlexander Hansen #define exprtk_disable_rtl_io
36*6272a393SAlexander Hansen #define exprtk_disable_superscalar_unroll
37*6272a393SAlexander Hansen 
38*6272a393SAlexander Hansen /* include main exprtk header library */
39*6272a393SAlexander Hansen #include <exprtk.hpp>
40*6272a393SAlexander Hansen 
41*6272a393SAlexander Hansen #include <cmath>
42*6272a393SAlexander Hansen #include <limits>
43*6272a393SAlexander Hansen #include <numeric>
44*6272a393SAlexander Hansen 
45*6272a393SAlexander Hansen /* For floating types. (float, double, long double et al) */
46*6272a393SAlexander Hansen template <typename T>
47*6272a393SAlexander Hansen struct FuncMaxIgnoreNaN : public exprtk::ivararg_function<T>
48*6272a393SAlexander Hansen {
FuncMaxIgnoreNaNFuncMaxIgnoreNaN49*6272a393SAlexander Hansen     FuncMaxIgnoreNaN()
50*6272a393SAlexander Hansen     {
51*6272a393SAlexander Hansen         exprtk::set_min_num_args(*this, 2);
52*6272a393SAlexander Hansen         exprtk::set_max_num_args(*this, 255);
53*6272a393SAlexander Hansen     }
54*6272a393SAlexander Hansen 
operator ()FuncMaxIgnoreNaN55*6272a393SAlexander Hansen     inline T operator()(const std::vector<T>& argList)
56*6272a393SAlexander Hansen     {
57*6272a393SAlexander Hansen         return std::reduce(std::begin(argList), std::end(argList),
58*6272a393SAlexander Hansen                            std::numeric_limits<double>::quiet_NaN(),
59*6272a393SAlexander Hansen                            [](auto a, auto b) {
60*6272a393SAlexander Hansen                                if (std::isnan(b))
61*6272a393SAlexander Hansen                                {
62*6272a393SAlexander Hansen                                    return a;
63*6272a393SAlexander Hansen                                }
64*6272a393SAlexander Hansen                                if (std::isnan(a))
65*6272a393SAlexander Hansen                                {
66*6272a393SAlexander Hansen                                    return b;
67*6272a393SAlexander Hansen                                }
68*6272a393SAlexander Hansen                                return std::max(a, b);
69*6272a393SAlexander Hansen                            });
70*6272a393SAlexander Hansen     }
71*6272a393SAlexander Hansen };
72*6272a393SAlexander Hansen 
73*6272a393SAlexander Hansen template <typename T>
74*6272a393SAlexander Hansen struct FuncSumIgnoreNaN : public exprtk::ivararg_function<T>
75*6272a393SAlexander Hansen {
operator ()FuncSumIgnoreNaN76*6272a393SAlexander Hansen     inline T operator()(const std::vector<T>& argList)
77*6272a393SAlexander Hansen     {
78*6272a393SAlexander Hansen         return std::reduce(std::begin(argList), std::end(argList),
79*6272a393SAlexander Hansen                            std::numeric_limits<double>::quiet_NaN(),
80*6272a393SAlexander Hansen                            [](auto a, auto b) {
81*6272a393SAlexander Hansen                                if (std::isnan(b))
82*6272a393SAlexander Hansen                                {
83*6272a393SAlexander Hansen                                    return a;
84*6272a393SAlexander Hansen                                }
85*6272a393SAlexander Hansen                                if (std::isnan(a))
86*6272a393SAlexander Hansen                                {
87*6272a393SAlexander Hansen                                    return b;
88*6272a393SAlexander Hansen                                }
89*6272a393SAlexander Hansen                                return a + b;
90*6272a393SAlexander Hansen                            });
91*6272a393SAlexander Hansen     }
92*6272a393SAlexander Hansen };
93*6272a393SAlexander Hansen 
94*6272a393SAlexander Hansen template <typename T>
95*6272a393SAlexander Hansen struct FuncIfNan : public exprtk::ifunction<T>
96*6272a393SAlexander Hansen {
97*6272a393SAlexander Hansen     using exprtk::ifunction<T>::operator();
98*6272a393SAlexander Hansen 
FuncIfNanFuncIfNan99*6272a393SAlexander Hansen     FuncIfNan() : exprtk::ifunction<T>(2) {}
100*6272a393SAlexander Hansen 
operator ()FuncIfNan101*6272a393SAlexander Hansen     inline T operator()(const T& arg1, const T& arg2)
102*6272a393SAlexander Hansen     {
103*6272a393SAlexander Hansen         if (std::isnan(arg1))
104*6272a393SAlexander Hansen         {
105*6272a393SAlexander Hansen             return arg2;
106*6272a393SAlexander Hansen         }
107*6272a393SAlexander Hansen         else
108*6272a393SAlexander Hansen         {
109*6272a393SAlexander Hansen             return arg1;
110*6272a393SAlexander Hansen         }
111*6272a393SAlexander Hansen     }
112*6272a393SAlexander Hansen };
113