/*
 * 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;
        }
    }
};
