C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
b04aa28e59
commit
ef91ad59e9
|
@ -19539,11 +19539,16 @@ namespace exprtk
|
|||
{
|
||||
if (is_variable_node(expression_list[i]))
|
||||
continue;
|
||||
else if (is_return_node(expression_list[i]))
|
||||
else if (
|
||||
is_return_node (expression_list[i]) ||
|
||||
is_break_node (expression_list[i]) ||
|
||||
is_continue_node(expression_list[i])
|
||||
)
|
||||
{
|
||||
tmp_expression_list.push_back(expression_list[i]);
|
||||
|
||||
// Remove all subexpressions after first encountered return node.
|
||||
// Remove all subexpressions after first short-circuit
|
||||
// node has been encountered.
|
||||
|
||||
for (std::size_t j = i + 1; j < expression_list.size(); ++j)
|
||||
{
|
||||
|
|
|
@ -29,6 +29,7 @@ void trig_function()
|
|||
typedef exprtk::parser<T> parser_t;
|
||||
|
||||
std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";
|
||||
|
||||
T x;
|
||||
|
||||
symbol_table_t symbol_table;
|
||||
|
|
|
@ -3955,11 +3955,30 @@ inline bool run_test10()
|
|||
"12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
|
||||
"12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
|
||||
"12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
|
||||
"12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })"
|
||||
"12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
|
||||
|
||||
"21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; i += 1;"
|
||||
"i += 2; i += 3; }; })",
|
||||
|
||||
"21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; return "
|
||||
"[i * 8]; i += 1; i += 2; i += 3; }; })",
|
||||
|
||||
"2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; i += 1; i += 2;"
|
||||
"i += 3; } else i; }",
|
||||
|
||||
"2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; return [i * 8];"
|
||||
"i += 1; i += 2; i += 3; } else i; }",
|
||||
|
||||
"7 == (for (var i := 0; i < 10; i += 1) { ~{break[7]; continue; i += i} })",
|
||||
"0 == (for (var i := 0; i < 10; i += 1) { ~{break[i]; continue; i += i} })",
|
||||
"0 == (for (var i := 0; i < 10; i += 1) { ~{continue; break[7]; i += i} })",
|
||||
"1 == (for (var i := 0; i < 10; i += 1) { ~{break[i += 1]; continue; i += i} })"
|
||||
};
|
||||
|
||||
const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
|
||||
|
||||
static const std::size_t rounds = 20;
|
||||
|
||||
exprtk::symbol_table<T> symbol_table;
|
||||
|
||||
T zero = T(0);
|
||||
|
@ -3970,7 +3989,7 @@ inline bool run_test10()
|
|||
|
||||
bool failed = false;
|
||||
|
||||
for (std::size_t r = 0; r < 10; ++r)
|
||||
for (std::size_t r = 0; r < rounds; ++r)
|
||||
{
|
||||
for (std::size_t i = 0; i < expression_list_size; ++i)
|
||||
{
|
||||
|
@ -3982,7 +4001,7 @@ inline bool run_test10()
|
|||
|
||||
if (!parser.compile(expression_list[i],expression))
|
||||
{
|
||||
printf("run_test10() - swaps Error: %s Expression: %s\n",
|
||||
printf("run_test10() - swaps[1] Error: %s Expression: %s\n",
|
||||
parser.error().c_str(),
|
||||
expression_list[i].c_str());
|
||||
|
||||
|
@ -3995,7 +4014,44 @@ inline bool run_test10()
|
|||
|
||||
if (T(1) != result)
|
||||
{
|
||||
printf("run_test10() - swaps evaluation error Expression: %s\n",
|
||||
printf("run_test10() - swaps[1] evaluation error Expression: %s\n",
|
||||
expression_list[i].c_str());
|
||||
|
||||
failed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (failed)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// reuse parser
|
||||
for (std::size_t r = 0; r < rounds; ++r)
|
||||
{
|
||||
exprtk::parser<T> parser;
|
||||
|
||||
for (std::size_t i = 0; i < expression_list_size; ++i)
|
||||
{
|
||||
expression_t expression;
|
||||
expression.register_symbol_table(symbol_table);
|
||||
|
||||
if (!parser.compile(expression_list[i],expression))
|
||||
{
|
||||
printf("run_test10() - swaps[2] Error: %s Expression: %s\n",
|
||||
parser.error().c_str(),
|
||||
expression_list[i].c_str());
|
||||
|
||||
failed = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
T result = expression.value();
|
||||
|
||||
if (T(1) != result)
|
||||
{
|
||||
printf("run_test10() - swaps[2] evaluation error Expression: %s\n",
|
||||
expression_list[i].c_str());
|
||||
|
||||
failed = true;
|
||||
|
|
Loading…
Reference in New Issue