From 0392927ab33dd73b02a46bd837eda3c00ea6a1b6 Mon Sep 17 00:00:00 2001 From: Arash Partow Date: Wed, 12 Nov 2014 07:01:09 +1100 Subject: [PATCH] C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html --- exprtk.hpp | 16 ++++++++-------- readme.txt | 18 +++++++++++++++++- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/exprtk.hpp b/exprtk.hpp index 69c660b..5668285 100644 --- a/exprtk.hpp +++ b/exprtk.hpp @@ -5080,8 +5080,10 @@ namespace exprtk { if (1 != (arg_list.size() & 1)) return; + arg_list_.resize(arg_list.size()); delete_branch_.resize(arg_list.size()); + for (std::size_t i = 0; i < arg_list.size(); ++i) { if (arg_list[i]) @@ -5114,22 +5116,20 @@ namespace exprtk { if (!arg_list_.empty()) { - if (1 != (arg_list_.size() & 1)) - { - return std::numeric_limits::quiet_NaN(); - } + const std::size_t upper_bound = (arg_list_.size() - 1); - for (std::size_t i = 0; i < arg_list_.size() / 2; ++i) + for (std::size_t i = 0; i < upper_bound; i += 2) { - expression_ptr condition = arg_list_[(2 * i) ]; - expression_ptr consequent = arg_list_[(2 * i) + 1]; + expression_ptr condition = arg_list_[i ]; + expression_ptr consequent = arg_list_[i + 1]; + if (is_true(condition)) { return consequent->value(); } } - return arg_list_.back()->value(); + return arg_list_[upper_bound]->value(); } else return std::numeric_limits::quiet_NaN(); diff --git a/readme.txt b/readme.txt index f8fe32c..0335971 100644 --- a/readme.txt +++ b/readme.txt @@ -1252,7 +1252,23 @@ into account when using Exprtk: 8. null != null --> false 9. null != x --> false - (27) Every ExprTk statement is a "value returning" expression. Unlike + (27) The following is a list of reserved words and symbols used by + ExprTk. Attempting to add a variable or custom function to a + symbol table using any of the reserved words will result in + a failure. + + abs, acos, acosh, and, asin, asinh, atan, atan2, atanh, avg, + break, case, ceil, clamp, continue, cosh, cos, cot, csc, + default, deg2grad, deg2rad, else, equal, erfc, erf, exp, + expm1, false, floor, for, frac, grad2deg, hypot, iclamp, if, + ilike, in, inrange, in, like, log, log10, log1p, log2, logn, + mand, max, min, mod, mor, mul, nand, ncdf, nor, not, + not_equal, not, null, or, pow, rad2deg, repeat, root, + roundn, round, sec, sgn, shl, shr, sinc, sinh, sin, sqrt, + sum, swap, switch, tanh, tan, true, trunc, until, var, + while, xnor, xor, xor + + (28) Every ExprTk statement is a "value returning" expression. Unlike some languages that limit the types of expressions that can be performed in certain situations, in ExprTk any valid expression can be used in any "value consuming" context. Eg: