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