blob: be858952791c47ede9fadb2b1520431ec3a5e42d [file] [log] [blame]
/*
* This define will disable the ability for expressions to have comments.
* Expressions that have comments when parsed with a build that has this
* option, will result in a compilation failure.
*/
// #define exprtk_disable_comments
/*
* This define will disable the loop-wise 'break' and 'continue'
* capabilities. Any expression that contains those keywords will result
* in a compilation failure.
*/
#define exprtk_disable_break_continue
/*
* This define will disable the short-circuit '&' (and) and '|' (or)
* operators
*/
#define exprtk_disable_sc_andor
/*
* This define will disable all enhanced features such as strength
* reduction and special function optimisations and expression specific
* type instantiations. This feature will reduce compilation times and
* binary sizes but will also result in massive performance degradation
* of expression evaluations.
*/
#define exprtk_disable_enhanced_features
/*
* This define will disable all string processing capabilities. Any
* expression that contains a string or string related syntax will result
* in a compilation failure.
*/
#define exprtk_disable_string_capabilities
#define exprtk_disable_rtl_io_file
#define exprtk_disable_return_statement
#define exprtk_disable_rtl_io
#define exprtk_disable_superscalar_unroll
/* include main exprtk header library */
#include <exprtk.hpp>
#include <cmath>
#include <limits>
#include <numeric>
/* For floating types. (float, double, long double et al) */
template <typename T>
struct FuncMaxIgnoreNaN : public exprtk::ivararg_function<T>
{
FuncMaxIgnoreNaN()
{
exprtk::set_min_num_args(*this, 2);
exprtk::set_max_num_args(*this, 255);
}
inline T operator()(const std::vector<T>& argList)
{
return std::reduce(std::begin(argList), std::end(argList),
std::numeric_limits<double>::quiet_NaN(),
[](auto a, auto b) {
if (std::isnan(b))
{
return a;
}
if (std::isnan(a))
{
return b;
}
return std::max(a, b);
});
}
};
template <typename T>
struct FuncSumIgnoreNaN : public exprtk::ivararg_function<T>
{
inline T operator()(const std::vector<T>& argList)
{
return std::reduce(std::begin(argList), std::end(argList),
std::numeric_limits<double>::quiet_NaN(),
[](auto a, auto b) {
if (std::isnan(b))
{
return a;
}
if (std::isnan(a))
{
return b;
}
return a + b;
});
}
};
template <typename T>
struct FuncIfNan : public exprtk::ifunction<T>
{
using exprtk::ifunction<T>::operator();
FuncIfNan() : exprtk::ifunction<T>(2) {}
inline T operator()(const T& arg1, const T& arg2)
{
if (std::isnan(arg1))
{
return arg2;
}
else
{
return arg1;
}
}
};