C++ Mathematical Expression Library (ExprTk) https://www.partow.net/programming/exprtk/index.html

This commit is contained in:
Arash Partow 2016-10-10 12:17:33 +11:00
parent a3becad0e0
commit 365ddd29d6
3 changed files with 1149 additions and 0 deletions

1016
exprtk.hpp

File diff suppressed because it is too large Load Diff

View File

@ -6462,6 +6462,133 @@ inline bool run_test18()
return false;
}
{
bool failure = false;
typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t;
exprtk::rtl::vecops::package<T> vecops_pkg;
symbol_table_t symbol_table;
symbol_table.add_package(vecops_pkg);
std::string expr_str_list[] =
{
"var v[9] := {1,2,3,4,5,6,7,8,9}; all_true(v) == true" ,
"var v[6] := {-1,-2,-3,-4,-5,-6}; all_true(v) == true" ,
"var v[8] := {1,2,3,0,0,0,0,0}; all_true(v) == false",
"var v[8] := {-1,-2,-3,0,0,0,0,0}; all_true(v) == false",
"var v[9] := {0,0,0,0,0,0,0,0,0}; all_true(v + 1) == true",
"var v[9] := {0,0,0,0,0,0,0,0,0}; all_false(v) == true" ,
"var v[9] := {0,0,0,0,0,1,2,3,4}; all_false(v) == false" ,
"var v[8] := {0,0,0,0,0,-1,-2,-3}; all_false(v) == false" ,
"var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
"var v[9] := {0,0,0,0,0,0,0,0,1}; any_true(v) == true" ,
"var v[9] := {0,0,0,0,1,0,0,0,0}; any_true(v) == true" ,
"var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v) == false" ,
"var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v + 1) == true",
"var v[9] := {1,1,1,1,1,1,1,1,0}; any_false(v) == true" ,
"var v[9] := {1,1,1,1,0,1,1,1,1}; any_false(v) == true" ,
"var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v) == false" ,
"var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
"var v[9] := {0,0,0,0,0,0,0,0,0}; count(v) == 0" ,
"var v[9] := {0,0,0,0,0,0,0,0,1}; count(v) == 1" ,
"var v[9] := {0,0,0,0,0,0,0,2,1}; count(v) == 2" ,
"var v[9] := {0,0,0,0,0,0,3,2,1}; count(v) == 3" ,
"var v[9] := {0,0,0,0,0,0,0,0,0}; count(v + 1) == v[]",
"var v[9] := {1,1,1,1,1,1,1,1,1}; count(v - 1) == 0",
"var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,r); sum(v == r) == v[]",
"var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,0,8,r,0,8); sum(r) == 45",
"var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,1,7,r,1,7); sum(r) == 35",
"var v[9] := {1,2,3,4,5,6,7,8,9}; var r[5] := [0]; copy(v,0,4,r,0,4); sum(r) == 15",
"var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; rol(v,3); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; ror(v,3); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; rol(v,2); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; ror(v,2); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,2,5}; rol(v,1,1,3); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {1,4,2,3,5}; ror(v,1,1,3); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,0,0}; shftl(v,2); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {5,0,0,0,0}; shftl(v,4); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftl(v,5); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {0,0,1,2,3}; shftr(v,2); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,1}; shftr(v,4); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftr(v,5); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,0,5}; shftl(v,1,1,3); sum(v == r) == v[]",
"var v[5] := {1,2,3,4,5}; var r[5] := {1,0,2,3,5}; shftr(v,1,1,3); sum(v == r) == v[]",
"var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
"var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
"var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
"var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
"var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
"var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
"var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
"var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',1,3); sum(v == r) == v[]",
"var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',0,2); sum(v == r) == v[]",
"var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',2,4); sum(v == r) == v[]",
"var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
"var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
"var v[5] := {1,4,2,3,5}; var r[5] := {1,4,3,2,5}; sort(v,'descending',1,3); sum(v == r) == v[]",
"var v[5] := {3,1,2,4,5}; var r[5] := {3,2,1,4,5}; sort(v,'descending',0,2); sum(v == r) == v[]",
"var v[5] := {1,2,5,3,4}; var r[5] := {1,2,5,4,3}; sort(v,'descending',2,4); sum(v == r) == v[]",
" var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a*x+y; axpy(a,x,y); sum(y == r) == y[]",
" var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a*x+b*y; axpby(a,x,b,y); sum(y == r) == y[]",
" var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a*x+y; axpyz(a,x,y,z); sum(z == r) == z[]",
" var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a*x+b*y; axpbyz(a,x,b,y,z); sum(z == r) == z[]",
};
const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
parser_t parser;
for (std::size_t i = 0; i < expr_str_list_size; ++i)
{
expression_t expression;
expression.register_symbol_table(symbol_table);
if (!parser.compile(expr_str_list[i], expression))
{
printf("run_test18() - Error: %s Expression: %s\n",
parser.error().c_str(),
expr_str_list[i].c_str());
failure = true;
continue;
}
T result = expression.value();
if (result != T(1))
{
printf("run_test18() - Error in evaluation! (10) Expression: %s\n",
expr_str_list[i].c_str());
failure = true;
}
}
if (failure)
return false;
}
return true;
}

View File

@ -3028,6 +3028,12 @@ This define will disable the file I/O RTL package features. When
present, any attempts to register the file I/O package with a given
symbol table will fail causing a compilation error.
(9) exprtk_disable_rtl_vecops
This define will disable the extended vector operations RTL package
features. When present, any attempts to register the vector operations
package with a given symbol table will fail causing a compilation
error.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[23 - FILES]