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

This commit is contained in:
Arash Partow
2021-01-01 00:00:00 +00:00
committed by ArashPartow
parent 93a9f44f99
commit 17ba4d15e2
26 changed files with 4516 additions and 3259 deletions

View File

@ -6,6 +6,7 @@ jobs:
- image: gcc:6 - image: gcc:6
steps: steps:
- checkout - checkout
- run: c++ --version
- run: make all -j 2 - run: make all -j 2
- run: ./exprtk_test - run: ./exprtk_test
@ -14,6 +15,7 @@ jobs:
- image: gcc:7 - image: gcc:7
steps: steps:
- checkout - checkout
- run: c++ --version
- run: make all -j 2 - run: make all -j 2
- run: ./exprtk_test - run: ./exprtk_test
@ -22,6 +24,7 @@ jobs:
- image: gcc:latest - image: gcc:latest
steps: steps:
- checkout - checkout
- run: c++ --version
- run: make all -j 2 - run: make all -j 2
- run: ./exprtk_test - run: ./exprtk_test

View File

@ -2,7 +2,7 @@
# ************************************************************** # **************************************************************
# * C++ Mathematical Expression Toolkit Library * # * C++ Mathematical Expression Toolkit Library *
# * * # * *
# * Author: Arash Partow (1999-2020) * # * Author: Arash Partow (1999-2021) *
# * URL: http://www.partow.net/programming/exprtk/index.html * # * URL: http://www.partow.net/programming/exprtk/index.html *
# * * # * *
# * Copyright notice: * # * Copyright notice: *

6123
exprtk.hpp

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* ExprTk vs Native Benchmarks * * ExprTk vs Native Benchmarks *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -288,7 +288,7 @@ struct native
} }
}; };
void pgo_primer(); double pgo_primer();
void perform_file_based_benchmark(const std::string& file_name, const std::size_t& rounds = 100000); void perform_file_based_benchmark(const std::string& file_name, const std::size_t& rounds = 100000);
int main(int argc, char* argv[]) int main(int argc, char* argv[])
@ -359,7 +359,7 @@ int main(int argc, char* argv[])
return 0; return 0;
} }
void pgo_primer() double pgo_primer()
{ {
exprtk::pgo_primer<double>(); exprtk::pgo_primer<double>();
@ -394,6 +394,8 @@ void pgo_primer()
total += native<double>::func16(x,y); total += native<double>::func16(x,y);
} }
} }
return total;
} }
std::size_t load_expression_file(const std::string& file_name, std::deque<std::string>& expression_list) std::size_t load_expression_file(const std::string& file_name, std::deque<std::string>& expression_list)

View File

@ -8094,3 +8094,213 @@ equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((xx + 1) + (yy + 1
equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((1 + xx) + (1 + yy)) * 2; sum(xx) == 10^6},true) equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((1 + xx) + (1 + yy)) * 2; sum(xx) == 10^6},true)
equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((xx + 1) + (1 + yy)) * 2; sum(xx) == 10^6},true) equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((xx + 1) + (1 + yy)) * 2; sum(xx) == 10^6},true)
equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((1 + xx) + (yy + 1)) * 2; sum(xx) == 10^6},true) equal(~{var xx[10^5] := [-3]; var yy[10^5] := [-4]; xx := abs((1 + xx) + (yy + 1)) * 2; sum(xx) == 10^6},true)
equal('abcd' like 'abcd*' ,true )
equal('abcd' like 'abc*' ,true )
equal('abcd' like 'ab*' ,true )
equal('abcd' like 'a*' ,true )
equal('abcd' like 'abc?' ,true )
equal('a' like 'a*' ,true )
equal('ab' like 'a*' ,true )
equal('abcd' like 'abcd*' ,true )
equal('' like '' ,true )
equal('abcd' like 'abcd' ,true )
equal('abcd' like 'abc*' ,true )
equal('abcd' like '*bcd' ,true )
equal('abcd' like 'abc?' ,true )
equal('abcd' like '?bcd' ,true )
equal('abcd' like 'ab?d' ,true )
equal('abcd' like 'ab*d' ,true )
equal('abcd' like 'a?cd' ,true )
equal('abcd' like 'a*cd' ,true )
equal('abcd' like 'a??d' ,true )
equal('abcd' like 'a*?d' ,true )
equal('abcd' like '*bc*' ,true )
equal('abcd' like '?bc?' ,true )
equal('abcd' like '????' ,true )
equal('abcd' like 'a???' ,true )
equal('abcd' like 'ab??' ,true )
equal('abcd' like 'abc?' ,true )
equal('abcd' like '???d' ,true )
equal('abcd' like '??cd' ,true )
equal('abcd' like '?bcd' ,true )
equal('abcd' like '?b?d' ,true )
equal('abcd' like 'a?c?' ,true )
equal('abcd' like 'a??d' ,true )
equal('abcd' like '?bc?' ,true )
equal('abcd' like 'ab**' ,true )
equal('abcd' like 'ab*?' ,true )
equal('abcd' like 'a***' ,true )
equal('abcd' like '**cd' ,true )
equal('abcd' like '*?cd' ,true )
equal('abcd' like '***d' ,true )
equal('abcd' like '?*?d' ,true )
equal('abcd' like '?*?d' ,true )
equal('abcd' like '*bc*' ,true )
equal('abcd' like '*bc?' ,true )
equal('abcd' like '*b??' ,true )
equal('abcd' like '?bc*' ,true )
equal('abcd' like '??c*' ,true )
equal('abcd' like '*b?*' ,true )
equal('abcd' like '*b*d' ,true )
equal('abcd' like 'a*c*' ,true )
equal('abcd' like '?*cd' ,true )
equal('abcd' like 'ab?*' ,true )
equal('abcd' like 'ab*?' ,true )
equal('abcd' like 'a?*d' ,true )
equal('ab' like 'a*' ,true )
equal('ab' like 'a?' ,true )
equal('a' like 'a*' ,true )
equal('xalabcd' like '*abcd*' ,true )
equal('xablabcd' like '*abcd*' ,true )
equal('xabclabcd' like '*abcd*' ,true )
equal('aaaaa' like '*aa?' ,true )
equal('abcd' ilike 'abcd*' ,true )
equal('abcd' ilike 'abc*' ,true )
equal('abcd' ilike 'ab*' ,true )
equal('abcd' ilike 'a*' ,true )
equal('abcd' ilike 'abc?' ,true )
equal('a' ilike 'a*' ,true )
equal('ab' ilike 'a*' ,true )
equal('abcd' ilike 'abcd*' ,true )
equal('' ilike '' ,true )
equal('abcd' ilike 'abcd' ,true )
equal('abcd' ilike 'abc*' ,true )
equal('abcd' ilike '*bcd' ,true )
equal('abcd' ilike 'abc?' ,true )
equal('abcd' ilike '?bcd' ,true )
equal('abcd' ilike 'ab?d' ,true )
equal('abcd' ilike 'ab*d' ,true )
equal('abcd' ilike 'a?cd' ,true )
equal('abcd' ilike 'a*cd' ,true )
equal('abcd' ilike 'a??d' ,true )
equal('abcd' ilike 'a*?d' ,true )
equal('abcd' ilike '*bc*' ,true )
equal('abcd' ilike '?bc?' ,true )
equal('abcd' ilike '????' ,true )
equal('abcd' ilike 'a???' ,true )
equal('abcd' ilike 'ab??' ,true )
equal('abcd' ilike 'abc?' ,true )
equal('abcd' ilike '???d' ,true )
equal('abcd' ilike '??cd' ,true )
equal('abcd' ilike '?bcd' ,true )
equal('abcd' ilike '?b?d' ,true )
equal('abcd' ilike 'a?c?' ,true )
equal('abcd' ilike 'a??d' ,true )
equal('abcd' ilike '?bc?' ,true )
equal('abcd' ilike 'ab**' ,true )
equal('abcd' ilike 'ab*?' ,true )
equal('abcd' ilike 'a***' ,true )
equal('abcd' ilike '**cd' ,true )
equal('abcd' ilike '*?cd' ,true )
equal('abcd' ilike '***d' ,true )
equal('abcd' ilike '?*?d' ,true )
equal('abcd' ilike '?*?d' ,true )
equal('abcd' ilike '*bc*' ,true )
equal('abcd' ilike '*bc?' ,true )
equal('abcd' ilike '*b??' ,true )
equal('abcd' ilike '?bc*' ,true )
equal('abcd' ilike '??c*' ,true )
equal('abcd' ilike '*b?*' ,true )
equal('abcd' ilike '*b*d' ,true )
equal('abcd' ilike 'a*c*' ,true )
equal('abcd' ilike '?*cd' ,true )
equal('abcd' ilike 'ab?*' ,true )
equal('abcd' ilike 'ab*?' ,true )
equal('abcd' ilike 'a?*d' ,true )
equal('ab' ilike 'a*' ,true )
equal('ab' ilike 'a?' ,true )
equal('a' ilike 'a*' ,true )
equal('xalabcd' ilike '*abcd*',true )
equal('xablabcd' ilike '*abcd*',true )
equal('xabclabcd' ilike '*abcd*',true )
equal('aaaaa' ilike '*aa?' ,true )
equal('abcd' like 'abcd?' ,false)
equal('abcd' like 'abc??' ,false)
equal('abcd' like 'ab???' ,false)
equal('abcd' like 'a????' ,false)
equal('abcd' like '?????' ,false)
equal('a' like 'a?' ,false)
equal('abcd' like 'xyzw' ,false)
equal('abcd' like 'xyz' ,false)
equal('abc' like 'xyzw' ,false)
equal('abcd' like 'ab?' ,false)
equal('abcd' like 'a?' ,false)
equal('abcd' ilike 'abcd?' ,false)
equal('abcd' ilike 'abc??' ,false)
equal('abcd' ilike 'ab???' ,false)
equal('abcd' ilike 'a????' ,false)
equal('abcd' ilike '?????' ,false)
equal('a' ilike 'a?' ,false)
equal('abcd' ilike 'xyzw' ,false)
equal('abcd' ilike 'xyz' ,false)
equal('abc' ilike 'xyzw' ,false)
equal('abcd' ilike 'ab?' ,false)
equal('abcd' ilike 'a?' ,false)
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n < m) 'n < m'; else 'n >= m'; }; (s == 'n < m')})
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n > m) 'n <= m'; else 'n > m'; }; (s == 'n > m')})
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n < m) 'n < m'; else 'n >' + '= m'; }; (s == 'n < m')})
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n < m) 'n ' + '< m'; else 'n >= m'; }; (s == 'n < m')})
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n > m) 'n <= m'; else 'n ' + '> m'; }; (s == 'n > m')})
equal(true, ~{var s := ~{var n := 1; var m := 2; if (n > m) 'n <' + '= m'; else 'n > m'; }; (s == 'n > m')})
equal(true, ~{var s := ~{var n := 1; var m := 2; var r0 := 'n < m'; var r1 := 'n >= m'; if (n < m) r0; else r1; }; (s == 'n < m')})
equal(true, ~{var s := ~{var n := 1; var m := 2; var r0 := 'n < m'; var r1 := 'n >= m'; if (n < m) r0 + ''; else r1 + ''; }; (s == 'n < m')})
equal(true, ~{var s := ~{var n := 1; var m := 2; var r0 := 'n < m'; var r1 := 'n >= m'; if (n < m) '' + r0; else '' + r1; }; (s == 'n < m')})
equal(111,~{var n:=1; switch { case n > 0: 111; default: 222; }})
equal(222,~{var n:=0; switch { case n > 0: 111; default: 222; }})
equal(111,~{var n:=0; switch { case true : 111; default: 222; }})
equal(222,~{var n:=0; switch { case false: 111; default: 222; }})
equal(111,~{var n:=1; switch { default: 222; case n > 0: 111; }})
equal(222,~{var n:=0; switch { default: 222; case n > 0: 111; }})
equal(111,~{var n:=0; switch { default: 222; case true : 111; }})
equal(222,~{var n:=0; switch { default: 222; case false: 111; }})
equal(111,~{var n:=1; switch { case n == 1: 111; case n == 2: 222; default: 333; }})
equal(111,~{var n:=1; switch { case n == 1: 111; default: 333; case n == 2: 222; }})
equal(111,~{var n:=1; switch { default: 333; case n == 1: 111; case n == 2: 222; }})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0, v1) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0, v1) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; if (x_ < y_, v0, v1) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; if (x_ > y_, v0, v1) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; if (x_ < y_, v0 - v1, v1 - v0) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; if (x_ > y_, v0 - v1, v1 - v0) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0, v1) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0, v1) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; if (x_ < y_, v0, v1) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; if (x_ > y_, v0, v1) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; if (x_ < y_, v0 - v1, v1 - v0) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; if (x_ > y_, v0 - v1, v1 - v0) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0; else v1;) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0; else v1;) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; (if (x_ < y_) v0; else v1;) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; (if (x_ > y_) v0; else v1;) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; (if (x_ < y_) v0 - v1; else v1 - v0;) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; (if (x_ > y_) v0 - v1; else v1 - v0;) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0; else v1;) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0; else v1;) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; (if (x_ < y_) v0; else v1;) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; (if (x_ > y_) v0; else v1;) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; (if (x_ < y_) v0 - v1; else v1 - v0;) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; (if (x_ > y_) v0 - v1; else v1 - v0;) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; ((1 < 2) ? v0 : v1) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; ((1 > 2) ? v0 : v1) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; ((1 < 2) ? v0 - v1 : v1 - v0) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; ((1 > 2) ? v0 - v1 : v1 - v0) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; ((x_ < y_) ? v0 : v1) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; ((x_ > y_) ? v0 : v1) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; ((x_ < y_) ? v0 - v1 : v1 - v0) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x_ := 1; var y_ := 2; ((x_ > y_) ? v0 - v1 : v1 - v0) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; ((1 < 2) ? v0 : v1) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; ((1 > 2) ? v0 : v1) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; ((1 < 2) ? v0 - v1 : v1 - v0) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; ((1 > 2) ? v0 - v1 : v1 - v0) == (v1 - v0)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; ((x_ < y_) ? v0 : v1) == v0})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; ((x_ > y_) ? v0 : v1) == v1})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; ((x_ < y_) ? v0 - v1 : v1 - v0) == (v0 - v1)})
equal(true,~{var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x_ := 1; var y_ := 2; ((x_ > y_) ? v0 - v1 : v1 - v0) == (v1 - v0)})

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 1 * * Simple Example 1 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 2 * * Simple Example 2 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 3 * * Simple Example 3 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 4 * * Simple Example 4 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 5 * * Simple Example 5 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 6 * * Simple Example 6 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 7 * * Simple Example 7 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 8 * * Simple Example 8 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -28,7 +28,7 @@ void composite()
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t; typedef exprtk::parser<T> parser_t;
typedef exprtk::parser_error::type err_t; typedef exprtk::parser_error::type error_t;
typedef exprtk::function_compositor<T> compositor_t; typedef exprtk::function_compositor<T> compositor_t;
typedef typename compositor_t::function function_t; typedef typename compositor_t::function function_t;
@ -65,7 +65,7 @@ void composite()
for (std::size_t i = 0; i < parser.error_count(); ++i) for (std::size_t i = 0; i < parser.error_count(); ++i)
{ {
const err_t error = parser.get_error(i); const error_t error = parser.get_error(i);
printf("Error: %02d Position: %02d Type: [%14s] Msg: %s\tExpression: %s\n", printf("Error: %02d Position: %02d Type: [%14s] Msg: %s\tExpression: %s\n",
static_cast<unsigned int>(i), static_cast<unsigned int>(i),

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 9 * * Simple Example 9 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 10 * * Simple Example 10 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 11 * * Simple Example 11 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 12 * * Simple Example 12 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 13 * * Simple Example 13 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -69,15 +69,15 @@ void savitzky_golay_filter()
// Generate a signal with noise. // Generate a signal with noise.
for (T t = T(-5); t <= T(+5); t += T(10.0 / n)) for (T t = T(-5); t <= T(+5); t += T(10.0 / n))
{ {
T noise = T(0.5 * (rand() / (RAND_MAX + 1.0) - 0.5)); const T noise = T(0.5 * (rand() / (RAND_MAX + 1.0) - 0.5));
v_in.push_back(sin(2.0 * pi * t) + noise); v_in.push_back(sin(2.0 * pi * t) + noise);
} }
v_out.resize(v_in.size()); v_out.resize(v_in.size());
symbol_table_t symbol_table; symbol_table_t symbol_table;
symbol_table.add_vector("v_in" , v_in); symbol_table.add_vector("v_in" , v_in );
symbol_table.add_vector("v_out",v_out); symbol_table.add_vector("v_out", v_out);
expression_t expression; expression_t expression;
expression.register_symbol_table(symbol_table); expression.register_symbol_table(symbol_table);

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 14 * * Simple Example 14 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 15 * * Simple Example 15 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -67,7 +67,7 @@ void black_scholes_merton_model()
{ {
callput_flag = "call"; callput_flag = "call";
T bsm = expression.value(); const T bsm = expression.value();
printf("BSM(%s,%5.3f,%5.3f,%5.3f,%5.3f,%5.3f) = %10.6f\n", printf("BSM(%s,%5.3f,%5.3f,%5.3f,%5.3f,%5.3f) = %10.6f\n",
callput_flag.c_str(), callput_flag.c_str(),
@ -78,7 +78,7 @@ void black_scholes_merton_model()
{ {
callput_flag = "put"; callput_flag = "put";
T bsm = expression.value(); const T bsm = expression.value();
printf("BSM(%s,%5.3f,%5.3f,%5.3f,%5.3f,%5.3f) = %10.6f\n", printf("BSM(%s,%5.3f,%5.3f,%5.3f,%5.3f,%5.3f) = %10.6f\n",
callput_flag.c_str(), callput_flag.c_str(),

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 16 * * Simple Example 16 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -55,11 +55,11 @@ void linear_least_squares()
T rmse = T(0); T rmse = T(0);
symbol_table_t symbol_table; symbol_table_t symbol_table;
symbol_table.add_variable("alpha",alpha); symbol_table.add_variable("alpha", alpha);
symbol_table.add_variable("beta" ,beta ); symbol_table.add_variable("beta" , beta );
symbol_table.add_variable("rmse" ,rmse ); symbol_table.add_variable("rmse" , rmse );
symbol_table.add_vector ("x" ,x ); symbol_table.add_vector ("x" , x );
symbol_table.add_vector ("y" ,y ); symbol_table.add_vector ("y" , y );
expression_t expression; expression_t expression;
expression.register_symbol_table(symbol_table); expression.register_symbol_table(symbol_table);
@ -69,10 +69,10 @@ void linear_least_squares()
expression.value(); expression.value();
printf("alpha: %15.12f\n",alpha); printf("alpha: %15.12f\n", alpha);
printf("beta: %15.12f\n",beta ); printf("beta: %15.12f\n", beta );
printf("rmse: %15.12f\n",rmse ); printf("rmse: %15.12f\n", rmse );
printf("y = %15.12fx + %15.12f\n",beta,alpha); printf("y = %15.12fx + %15.12f\n", beta, alpha);
} }
int main() int main()

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 17 * * Simple Example 17 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 18 * * Simple Example 18 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Simple Example 19 * * Simple Example 19 *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -109,9 +109,9 @@ void vector_randu()
randu<T> randu; randu<T> randu;
symbol_table_t symbol_table; symbol_table_t symbol_table;
symbol_table.add_vector ("signal" , signal); symbol_table.add_vector ("signal" , signal );
symbol_table.add_function("println",println); symbol_table.add_function("println", println);
symbol_table.add_function("randu" , randu); symbol_table.add_function("randu" , randu );
expression_t expression; expression_t expression;
expression.register_symbol_table(symbol_table); expression.register_symbol_table(symbol_table);

View File

@ -3,7 +3,7 @@
* C++ Mathematical Expression Toolkit Library * * C++ Mathematical Expression Toolkit Library *
* * * *
* Examples and Unit-Tests * * Examples and Unit-Tests *
* Author: Arash Partow (1999-2020) * * Author: Arash Partow (1999-2021) *
* URL: http://www.partow.net/programming/exprtk/index.html * * URL: http://www.partow.net/programming/exprtk/index.html *
* * * *
* Copyright notice: * * Copyright notice: *
@ -358,6 +358,42 @@ static const test_t global_test_list[] =
test_t("( 7 - 2 )",+5.0), test_t("( 7 - 2 )",+5.0),
test_t("( 8 - 1 )",+7.0), test_t("( 8 - 1 )",+7.0),
test_t("( 9 - 0 )",+9.0), test_t("( 9 - 0 )",+9.0),
test_t("1 - -1" , 2.0),
test_t("1 --1" , 2.0),
test_t("1-- 1" , 2.0),
test_t("1--1" , 2.0),
test_t("1 -- -1", 0.0),
test_t("1 + -1" , 0.0),
test_t("1 +-1" , 0.0),
test_t("1+- 1" , 0.0),
test_t("1+-1" , 0.0),
test_t("1 +- -1", 2.0),
test_t("1 + +1" , 2.0),
test_t("1 ++1" , 2.0),
test_t("1 - -1 + 1" , 3.0),
test_t("1 --1 + 1" , 3.0),
test_t("1-- 1 + 1" , 3.0),
test_t("1--1 + 1" , 3.0),
test_t("1 -- -1 + 1", 1.0),
test_t("1 + -1 + 1" , 1.0),
test_t("1 +-1 + 1" , 1.0),
test_t("1+- 1 + 1" , 1.0),
test_t("1+-1 + 1" , 1.0),
test_t("1 +- -1 + 1", 3.0),
test_t("1 + +1 + 1" , 3.0),
test_t("1 ++1 + 1" , 3.0),
test_t("1 - -1 - 1" , 1.0),
test_t("1 --1 - 1" , 1.0),
test_t("1-- 1 - 1" , 1.0),
test_t("1--1 - 1" , 1.0),
test_t("1 -- -1 - 1", -1.0),
test_t("1 + -1 - 1" , -1.0),
test_t("1 +-1 - 1" , -1.0),
test_t("1+- 1 - 1" , -1.0),
test_t("1+-1 - 1" , -1.0),
test_t("1 +- -1 - 1", 1.0),
test_t("1 + +1 - 1" , 1.0),
test_t("1 ++1 - 1" , 1.0),
test_t("-(1+2)",-3.0), test_t("-(1+2)",-3.0),
test_t("+(1+2)",+3.0), test_t("+(1+2)",+3.0),
test_t("+(1-2)",-1.0), test_t("+(1-2)",-1.0),
@ -1162,14 +1198,14 @@ inline bool test_expression(const std::string& expression_string, const T& expec
return false; return false;
} }
T result = expression.value(); const T result = expression.value();
if (not_equal(result,expected_result)) if (not_equal(result,expected_result))
{ {
printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
expression_string.c_str(), expression_string.c_str(),
(double)expected_result, static_cast<double>(expected_result),
(double)result); static_cast<double>(result));
return false; return false;
} }
@ -1177,6 +1213,43 @@ inline bool test_expression(const std::string& expression_string, const T& expec
return true; return true;
} }
template <typename T>
struct edge_cases {};
template <>
struct edge_cases<float>
{
static inline std::vector<test_t> test_cases()
{
std::vector<test_t> cases;
cases.push_back(test_t(" 1.175494350822287508e-38", 1.175494350822287508e-38));
cases.push_back(test_t(" 3.402823466385288598e+38", 3.402823466385288598e+38));
cases.push_back(test_t("+1.175494350822287508e-38", +1.175494350822287508e-38));
cases.push_back(test_t("+3.402823466385288598e+38", +3.402823466385288598e+38));
cases.push_back(test_t("-1.175494350822287508e-38", -1.175494350822287508e-38));
cases.push_back(test_t("-3.402823466385288598e+38", -3.402823466385288598e+38));
return cases;
}
};
template <>
struct edge_cases<double>
{
static inline std::vector<test_t> test_cases()
{
std::vector<test_t> cases;
cases.push_back(test_t(" 2.2250738585072013831e-308", 2.2250738585072013831e-308));
cases.push_back(test_t(" 1.7976931348623157081e+308", 1.7976931348623157081e+308));
cases.push_back(test_t("+2.2250738585072013831e-308", +2.2250738585072013831e-308));
cases.push_back(test_t("+1.7976931348623157081e+308", +1.7976931348623157081e+308));
cases.push_back(test_t("-2.2250738585072013831e-308", -2.2250738585072013831e-308));
cases.push_back(test_t("-1.7976931348623157081e+308", -1.7976931348623157081e+308));
return cases;
}
};
template <typename T> template <typename T>
inline bool run_test00() inline bool run_test00()
{ {
@ -1198,6 +1271,25 @@ inline bool run_test00()
} }
} }
{
const std::vector<test_t> tests = edge_cases<T>::test_cases();
bool result = true;
for (std::size_t i = 0; i < tests.size(); ++i)
{
if (!test_expression<T>(tests[i].first,T(tests[i].second)))
{
result = false;
}
}
if (!result)
{
return false;
}
}
return true; return true;
} }
@ -1258,8 +1350,80 @@ inline bool run_test01()
test_xy<T>("(x + 1) + y" ,T(2.2),T(3.3),T(6.5 )), test_xy<T>("(x + 1) + y" ,T(2.2),T(3.3),T(6.5 )),
test_xy<T>("2 * x" ,T(2.2),T(0.0),T(4.4)), test_xy<T>("2 * x" ,T(2.2),T(0.0),T(4.4)),
test_xy<T>("x * 2" ,T(2.2),T(0.0),T(4.4)), test_xy<T>("x * 2" ,T(2.2),T(0.0),T(4.4)),
test_xy<T>("1.1 + x",T(2.2),T(0.0),T(3.3)), test_xy<T>("1.1 + x" ,T(2.2),T(0.0),T(3.3)),
test_xy<T>("x + 1.1",T(2.2),T(0.0),T(3.3)), test_xy<T>("x + 1.1" ,T(2.2),T(0.0),T(3.3)),
test_xy<T>("x - -1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x --1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x-- 1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x--1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x -- -1" ,T(1.0),T(0.0),T(0)),
test_xy<T>("x + -1 " ,T(1.0),T(0.0),T(0)),
test_xy<T>("x +-1 " ,T(1.0),T(0.0),T(0)),
test_xy<T>("x+- 1 " ,T(1.0),T(0.0),T(0)),
test_xy<T>("x+-1 " ,T(1.0),T(0.0),T(0)),
test_xy<T>("x +- -1" ,T(1.0),T(0.0),T(2)),
test_xy<T>("x + +1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("x ++1 " ,T(1.0),T(0.0),T(2)),
test_xy<T>("1 - -x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("1 --x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("1-- x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("1--x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("1 -- -x" ,T(1.0),T(0.0),T(0)),
test_xy<T>("1 + -x " ,T(1.0),T(0.0),T(0)),
test_xy<T>("1 +-x " ,T(1.0),T(0.0),T(0)),
test_xy<T>("1+- x " ,T(1.0),T(0.0),T(0)),
test_xy<T>("1+-x " ,T(1.0),T(0.0),T(0)),
test_xy<T>("1 +- -x" ,T(1.0),T(0.0),T(2)),
test_xy<T>("1 + +x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("1 ++x " ,T(1.0),T(0.0),T(2)),
test_xy<T>("(x - -1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(x --1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(x-- 1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(x--1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(x -- -1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x + -1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x +-1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x+- 1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x+-1 + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x +- -1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(x + +1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(x ++1 + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(1 - -x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(1 --x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(1-- x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(1--x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(1 -- -x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1 + -x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1 +-x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1+- x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1+-x + 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1 +- -x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(1 + +x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(1 ++x + 1)" ,T(1.0),T(0.0),T(3)),
test_xy<T>("(x - -1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x --1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x-- 1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x--1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x -- -1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(x + -1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(x +-1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(x+- 1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(x+-1 - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(x +- -1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x + +1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(x ++1 - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1 - -x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1 --x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1-- x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1--x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1 -- -x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(1 + -x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(1 +-x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(1+- x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(1+-x - 1)" ,T(1.0),T(0.0),T(-1)),
test_xy<T>("(1 +- -x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1 + +x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("(1 ++x - 1)" ,T(1.0),T(0.0),T(1)),
test_xy<T>("x * 1 == x" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x * 1 == x" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)),
@ -1268,10 +1432,10 @@ inline bool run_test01()
test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("x + 1 == 1 + x",T(2.0),T(3.0),T(1.0)), test_xy<T>("x + 1 == 1 + x" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("y + 1 == 1 + y",T(2.0),T(3.0),T(1.0)), test_xy<T>("y + 1 == 1 + y" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("x + y == y + x",T(2.0),T(3.0),T(1.0)), test_xy<T>("x + y == y + x" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("x * y == y * x",T(2.0),T(3.0),T(1.0)), test_xy<T>("x * y == y * x" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("x < y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x < y" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("y > x" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("y > x" ,T(2.0),T(3.0),T(1.0)),
test_xy<T>("x <= y" ,T(2.0),T(3.0),T(1.0)), test_xy<T>("x <= y" ,T(2.0),T(3.0),T(1.0)),
@ -1646,14 +1810,14 @@ inline bool run_test01()
} }
} }
T result = expression.value(); const T result = expression.value();
if (not_equal(result,test.result)) if (not_equal(result,test.result))
{ {
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
test.expr.c_str(), test.expr.c_str(),
(double)test.result, static_cast<double>(test.result),
(double)result); static_cast<double>(result));
loop_result = false; loop_result = false;
} }
@ -1758,14 +1922,14 @@ inline bool run_test01()
} }
} }
T result = expression.value(); const T result = expression.value();
if (not_equal(result,test.result)) if (not_equal(result,test.result))
{ {
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
test.expr.c_str(), test.expr.c_str(),
(double)test.result, static_cast<double>(test.result),
(double)result); static_cast<double>(result));
loop_result = false; loop_result = false;
} }
@ -1841,14 +2005,14 @@ inline bool run_test01()
} }
} }
T result = expression.value(); const T result = expression.value();
if (not_equal(result,T(1))) if (not_equal(result,T(1)))
{ {
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
expr_list[i].c_str(), expr_list[i].c_str(),
(double)1.0, static_cast<double>(1.0),
(double)result); static_cast<double>(result));
loop_result = false; loop_result = false;
} }
@ -1901,14 +2065,14 @@ inline bool run_test01()
} }
} }
T result = expression.value(); const T result = expression.value();
if (not_equal(result,T(1))) if (not_equal(result,T(1)))
{ {
printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
expr_list[i].c_str(), expr_list[i].c_str(),
(double)1.0, static_cast<double>(1.0),
(double)result); static_cast<double>(result));
loop_result = false; loop_result = false;
} }
} }
@ -2422,6 +2586,17 @@ inline bool run_test02()
test_ab<T>("var i := 0; a[0:i+3] <=> b[:]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)), test_ab<T>("var i := 0; a[0:i+3] <=> b[:]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
test_ab<T>("var i := 0; a[0:i+4] <=> b[:]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)), test_ab<T>("var i := 0; a[0:i+4] <=> b[:]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
test_ab<T>("var y:= 2; '01234567890'[y:] == a ", "234567890","" ,T(1.0)),
test_ab<T>("var y:= 2; '01234567890'[y:][y:] == a ", "4567890" ,"" ,T(1.0)),
test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:] == a ", "67890" ,"" ,T(1.0)),
test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:] == a ", "890" ,"" ,T(1.0)),
test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:][y:] == a", "0" ,"" ,T(1.0)),
test_ab<T>("var y:= 2; '0123456789'[y:] == a ", "23456789" ,"" ,T(1.0)),
test_ab<T>("var y:= 2; '0123456789'[y:][y:] == a ", "456789" ,"" ,T(1.0)),
test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:] == a ", "6789" ,"" ,T(1.0)),
test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:] == a ", "89" ,"" ,T(1.0)),
test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:][y:] == a ", "" ,"" ,T(1.0)),
test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] := y[:]; x == '0XXXX'", "","",T(1.0)), test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] := y[:]; x == '0XXXX'", "","",T(1.0)),
test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[:]; x == '01XXX'", "","",T(1.0)), test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[:]; x == '01XXX'", "","",T(1.0)),
test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[:]; x == '012XX'", "","",T(1.0)), test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[:]; x == '012XX'", "","",T(1.0)),
@ -2598,8 +2773,8 @@ inline bool run_test02()
printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t" printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t"
"a='%s'\tb='%s'\tc='%s'\n", "a='%s'\tb='%s'\tc='%s'\n",
test.expr.c_str(), test.expr.c_str(),
(double)test.result, static_cast<double>(test.result),
(double)expr_result, static_cast<double>(expr_result),
str_a.c_str(), str_a.c_str(),
str_b.c_str(), str_b.c_str(),
str_c.c_str()); str_c.c_str());
@ -3013,10 +3188,10 @@ inline bool run_test04()
{ {
printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n", printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n",
expression_string.c_str(), expression_string.c_str(),
(double)result1, static_cast<double>(result1),
(double)result2, static_cast<double>(result2),
(double)x, static_cast<double>(x),
(double)y); static_cast<double>(y));
return false; return false;
} }
@ -3083,10 +3258,10 @@ inline bool run_test05()
{ {
printf("run_test05() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\tIndex:%d\n", printf("run_test05() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\tIndex:%d\n",
expression_string.c_str(), expression_string.c_str(),
(double)real_result, static_cast<double>(real_result),
(double)result, static_cast<double>(result),
(double)x, static_cast<double>(x),
(double)y, static_cast<double>(y),
static_cast<unsigned int>(i)); static_cast<unsigned int>(i));
return false; return false;
@ -3140,8 +3315,8 @@ inline bool run_test06()
if (not_equal(total_area1,T(pi) / T(2),T(0.000001))) if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
{ {
printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n", printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
(double)(pi / T(2)), static_cast<double>(pi / T(2)),
(double)total_area1); static_cast<double>(total_area1));
return false; return false;
} }
@ -3192,9 +3367,9 @@ inline bool run_test07()
if (not_equal(deriv1_result1,deriv1_real_result,T(0.00001))) if (not_equal(deriv1_result1,deriv1_real_result,T(0.00001)))
{ {
printf("run_test07() - 1st Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test07() - 1st Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
(double)x, static_cast<double>(x),
(double)deriv1_real_result, static_cast<double>(deriv1_real_result),
(double)deriv1_result1); static_cast<double>(deriv1_result1));
return false; return false;
} }
@ -3214,9 +3389,9 @@ inline bool run_test07()
if (not_equal(deriv2_result1,deriv2_real_result,T(0.01))) if (not_equal(deriv2_result1,deriv2_real_result,T(0.01)))
{ {
printf("run_test07() - 2nd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test07() - 2nd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
(double)x, static_cast<double>(x),
(double)deriv2_real_result, static_cast<double>(deriv2_real_result),
(double)deriv2_result1); static_cast<double>(deriv2_result1));
return false; return false;
} }
@ -3236,9 +3411,9 @@ inline bool run_test07()
if (not_equal(deriv3_result1,deriv3_real_result,T(0.01))) if (not_equal(deriv3_result1,deriv3_real_result,T(0.01)))
{ {
printf("run_test07() - 3rd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n", printf("run_test07() - 3rd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
(double)x, static_cast<double>(x),
(double)deriv3_real_result, static_cast<double>(deriv3_real_result),
(double)deriv3_result1); static_cast<double>(deriv3_result1));
return false; return false;
} }
@ -3526,9 +3701,9 @@ inline bool run_test09()
const T pi = T(3.141592653589793238462643383279502); const T pi = T(3.141592653589793238462643383279502);
T result = expression.value(); const T result = expression.value();
T expected = T(4) * const T expected = T(4) *
( (
mf(sin(x*pi),y / T(2)) + mf(sin(x*pi),y / T(2)) +
mf(sin(x*pi),y / T(2)) + mf(sin(x*pi),y / T(2)) +
@ -3545,8 +3720,8 @@ inline bool run_test09()
if (not_equal(result,expected,T(0.0000001))) if (not_equal(result,expected,T(0.0000001)))
{ {
printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n", printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n",
(double)expected, static_cast<double>(expected),
(double)result); static_cast<double>(result));
return false; return false;
} }
@ -4311,6 +4486,78 @@ inline bool run_test10()
{ {
"var x; 1", "var x; 1",
"var x := 1; x", "var x := 1; x",
"var x:= 1; x - -1 == 2",
"var x:= 1; x --1 == 2",
"var x:= 1; x-- 1 == 2",
"var x:= 1; x--1 == 2",
"var x:= 1; x -- -1== 0",
"var x:= 1; x + -1 == 0",
"var x:= 1; x +-1 == 0",
"var x:= 1; x+- 1 == 0",
"var x:= 1; x+-1 == 0",
"var x:= 1; x +- -1== 2",
"var x:= 1; x + +1 == 2",
"var x:= 1; x ++1 == 2",
"var x:= 1; 1 - -x == 2",
"var x:= 1; 1 --x == 2",
"var x:= 1; 1-- x == 2",
"var x:= 1; 1--x == 2",
"var x:= 1; 1 -- -x== 0",
"var x:= 1; 1 + -x == 0",
"var x:= 1; 1 +-x == 0",
"var x:= 1; 1+- x == 0",
"var x:= 1; 1+-x == 0",
"var x:= 1; 1 +- -x== 2",
"var x:= 1; 1 + +x == 2",
"var x:= 1; 1 ++x == 2",
"var x:= 1; (x - -1 + 1) == 3",
"var x:= 1; (x --1 + 1) == 3",
"var x:= 1; (x-- 1 + 1) == 3",
"var x:= 1; (x--1 + 1) == 3",
"var x:= 1; (x -- -1 + 1) == 1",
"var x:= 1; (x + -1 + 1) == 1",
"var x:= 1; (x +-1 + 1) == 1",
"var x:= 1; (x+- 1 + 1) == 1",
"var x:= 1; (x+-1 + 1) == 1",
"var x:= 1; (x +- -1 + 1) == 3",
"var x:= 1; (x + +1 + 1) == 3",
"var x:= 1; (x ++1 + 1) == 3",
"var x:= 1; (1 - -x + 1) == 3",
"var x:= 1; (1 --x + 1) == 3",
"var x:= 1; (1-- x + 1) == 3",
"var x:= 1; (1--x + 1) == 3",
"var x:= 1; (1 -- -x + 1) == 1",
"var x:= 1; (1 + -x + 1) == 1",
"var x:= 1; (1 +-x + 1) == 1",
"var x:= 1; (1+- x + 1) == 1",
"var x:= 1; (1+-x + 1) == 1",
"var x:= 1; (1 +- -x + 1) == 3",
"var x:= 1; (1 + +x + 1) == 3",
"var x:= 1; (1 ++x + 1) == 3",
"var x:= 1; (x - -1 - 1) == 1",
"var x:= 1; (x --1 - 1) == 1",
"var x:= 1; (x-- 1 - 1) == 1",
"var x:= 1; (x--1 - 1) == 1",
"var x:= 1; (x -- -1 - 1) == -1",
"var x:= 1; (x + -1 - 1) == -1",
"var x:= 1; (x +-1 - 1) == -1",
"var x:= 1; (x+- 1 - 1) == -1",
"var x:= 1; (x+-1 - 1) == -1",
"var x:= 1; (x +- -1 - 1) == 1",
"var x:= 1; (x + +1 - 1) == 1",
"var x:= 1; (x ++1 - 1) == 1",
"var x:= 1; (1 - -x - 1) == 1",
"var x:= 1; (1 --x - 1) == 1",
"var x:= 1; (1-- x - 1) == 1",
"var x:= 1; (1--x - 1) == 1",
"var x:= 1; (1 -- -x - 1) == -1",
"var x:= 1; (1 + -x - 1) == -1",
"var x:= 1; (1 +-x - 1) == -1",
"var x:= 1; (1+- x - 1) == -1",
"var x:= 1; (1+-x - 1) == -1",
"var x:= 1; (1 +- -x - 1) == 1",
"var x:= 1; (1 + +x - 1) == 1",
"var x:= 1; (1 ++x - 1) == 1",
"var x := 1; var y := 2; 1", "var x := 1; var y := 2; 1",
"var x := 1; var y := 2; x", "var x := 1; var y := 2; x",
"var x:=6; var y:=4; x + -3 == 3", "var x:=6; var y:=4; x + -3 == 3",
@ -4623,7 +4870,43 @@ inline bool run_test10()
"var s := 'abc'; ~{1 + 2; 'abc' + s; s} == s ", "var s := 'abc'; ~{1 + 2; 'abc' + s; s} == s ",
"var s := 'abc'; ~{1 + 2; var x := 'ab'; x + 'c'} == s ", "var s := 'abc'; ~{1 + 2; var x := 'ab'; x + 'c'} == s ",
"var x[10^6] := null; var y[10^7] := null; 0 * (min(x) + min(y)) + x[] + y[] == 10^7 + 10^6" "var x[10^6] := null; var y[10^7] := null; 0 * (min(x) + min(y)) + x[] + y[] == 10^7 + 10^6",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0, v1) == v0",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0, v1) == v1",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x < y, v0, v1) == v0",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x > y, v0, v1) == v1",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x < y, v0 - v1, v1 - v0) == (v0 - v1)",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x > y, v0 - v1, v1 - v0) == (v1 - v0)",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0, v1) == v0",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0, v1) == v1",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x < y, v0, v1) == v0",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x > y, v0, v1) == v1",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x < y, v0 - v1, v1 - v0) == (v0 - v1)",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x > y, v0 - v1, v1 - v0) == (v1 - v0)",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0; else v1;) == v0",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0; else v1;) == v1",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x < y) v0; else v1;) == v0",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x > y) v0; else v1;) == v1",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x < y) v0 - v1; else v1 - v0;) == (v0 - v1)",
"var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x > y) v0 - v1; else v1 - v0;) == (v1 - v0)",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0; else v1;) == v0",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0; else v1;) == v1",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x < y) v0; else v1;) == v0",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x > y) v0; else v1;) == v1",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x < y) v0 - v1; else v1 - v0;) == (v0 - v1)",
"var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x > y) v0 - v1; else v1 - v0;) == (v1 - v0)",
}; };
const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string); const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
@ -4662,7 +4945,7 @@ inline bool run_test10()
} }
} }
T result = expression.value(); const T result = expression.value();
if (T(1) != result) if (T(1) != result)
{ {
@ -4699,7 +4982,7 @@ inline bool run_test10()
continue; continue;
} }
T result = expression.value(); const T result = expression.value();
if (T(1) != result) if (T(1) != result)
{ {
@ -5287,8 +5570,8 @@ inline bool run_test15()
if (not_equal(base_result,result)) if (not_equal(base_result,result))
{ {
printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n", printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
(double)base_result, static_cast<double>(base_result),
(double)result, static_cast<double>(result),
expr_str_list[i].c_str()); expr_str_list[i].c_str());
failure = true; failure = true;
@ -5917,6 +6200,96 @@ struct overload_func : exprtk::igeneric_function<T>
template <typename T> template <typename T>
inline bool run_test18() inline bool run_test18()
{ {
{
exprtk::symbol_table<T> symbol_table;
symbol_table.remove_variable("x",true);
symbol_table.remove_variable("x",false);
symbol_table.remove_stringvar("x");
symbol_table.remove_function("x");
symbol_table.remove_vararg_function("x");
symbol_table.remove_vector("x");
}
{
exprtk::symbol_table<T> symbol_table;
{
T x;
const bool result1 = symbol_table.add_variable("x", x);
const bool result2 = symbol_table.remove_variable("x");
const bool result3 = symbol_table.remove_variable("x");
if (!result1 || !result2 || result3)
{
printf("run_test18() - Failed sym_tab add/remove [1]\n");
}
}
{
std::string x;
const bool result1 = symbol_table.add_stringvar("x", x);
const bool result2 = symbol_table.remove_stringvar("x");
const bool result3 = symbol_table.remove_stringvar("x");
if (!result1 || !result2 || result3)
{
printf("run_test18() - Failed sym_tab add/remove [2]\n");
}
}
{
std::vector<T> x(10,T(0));
const bool result1 = symbol_table.add_vector("x", x);
const bool result2 = symbol_table.remove_vector("x");
const bool result3 = symbol_table.remove_vector("x");
if (!result1 || !result2 || result3)
{
printf("run_test18() - Failed sym_tab add/remove [3]\n");
}
}
{
myfunc<T> x;
const bool result1 = symbol_table.add_function("x", x);
const bool result2 = symbol_table.remove_function("x");
const bool result3 = symbol_table.remove_function("x");
if (!result1 || !result2 || result3)
{
printf("run_test18() - Failed sym_tab add/remove [4]\n");
}
}
{
va_func<T> x;
const bool result1 = symbol_table.add_function("x", x);
const bool result2 = symbol_table.remove_vararg_function("x");
const bool result3 = symbol_table.remove_vararg_function("x");
if (!result1 || !result2 || result3)
{
printf("run_test18() - Failed sym_tab add/remove [5]\n");
}
}
{
symbol_table.add_function("foo1",foo1);
symbol_table.add_function("foo2",foo2);
symbol_table.add_function("foo3",foo3);
symbol_table.add_function("foo4",foo4);
symbol_table.add_function("foo5",foo5);
symbol_table.add_function("foo6",foo6);
symbol_table.remove_function("foo1");
symbol_table.remove_function("foo2");
symbol_table.remove_function("foo3");
symbol_table.remove_function("foo4");
symbol_table.remove_function("foo5");
symbol_table.remove_function("foo6");
}
}
{ {
typedef exprtk::expression<T> expression_t; typedef exprtk::expression<T> expression_t;
@ -6448,7 +6821,7 @@ inline bool run_test18()
return false; return false;
} }
T result = expression.value(); const T result = expression.value();
if (result != T(1)) if (result != T(1))
{ {
@ -7041,7 +7414,7 @@ inline bool run_test18()
continue; continue;
} }
T result = expression.value(); const T result = expression.value();
if (result != T(1)) if (result != T(1))
{ {
@ -7564,7 +7937,7 @@ inline bool run_test19()
continue; continue;
} }
T result = expression.value(); const T result = expression.value();
if (result_list[i] != result) if (result_list[i] != result)
{ {
@ -8061,15 +8434,15 @@ inline bool run_test19()
{ {
x = static_cast<T>(i); x = static_cast<T>(i);
T result = expression.value(); const T result = expression.value();
if (not_equal(result,std::sqrt(x),T(0.0000001))) if (not_equal(result,std::sqrt(x),T(0.0000001)))
{ {
printf("run_test19() - Computation Error " printf("run_test19() - Computation Error "
"Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n", "Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n",
expression_str.c_str(), expression_str.c_str(),
(double)std::sqrt(x), static_cast<double>(std::sqrt(x)),
(double)result); static_cast<double>(result));
failure = true; failure = true;
} }
@ -8191,7 +8564,7 @@ inline bool run_test19()
sum += x; sum += x;
T result = expression.value(); const T result = expression.value();
if (result != sum) if (result != sum)
{ {

View File

@ -59,7 +59,7 @@ arithmetic operations, functions and processes:
(05) Functions: abs, avg, ceil, clamp, equal, erf, erfc, exp, (05) Functions: abs, avg, ceil, clamp, equal, erf, erfc, exp,
expm1, floor, frac, log, log10, log1p, log2, expm1, floor, frac, log, log10, log1p, log2,
logn, max, min, mul, ncdf, nequal, root, logn, max, min, mul, ncdf, not_equal, root,
round, roundn, sgn, sqrt, sum, swap, trunc round, roundn, sgn, sqrt, sum, swap, trunc
(06) Trigonometry: acos, acosh, asin, asinh, atan, atanh, atan2, (06) Trigonometry: acos, acosh, asin, asinh, atan, atanh, atan2,
@ -124,7 +124,7 @@ The most recent version of the C++ Mathematical Expression Toolkit
Library including all updates and tests can be found at the following Library including all updates and tests can be found at the following
locations: locations:
(a) Download: http://www.partow.net/programming/exprtk/index.html (a) Download: https://www.partow.net/programming/exprtk/index.html
(b) Repository: https://github.com/ArashPartow/exprtk (b) Repository: https://github.com/ArashPartow/exprtk
https://github.com/ArashPartow/exprtk-extras https://github.com/ArashPartow/exprtk-extras
@ -321,7 +321,7 @@ of C++ compilers:
+----------+---------------------------------------------------------+ +----------+---------------------------------------------------------+
| ncdf | Normal cumulative distribution function. (eg: ncdf(x)) | | ncdf | Normal cumulative distribution function. (eg: ncdf(x)) |
+----------+---------------------------------------------------------+ +----------+---------------------------------------------------------+
| nequal | Not-equal test between x and y using normalised epsilon | | not_equal| Not-equal test between x and y using normalised epsilon |
+----------+---------------------------------------------------------+ +----------+---------------------------------------------------------+
| pow | x to the power of y. (eg: pow(x,y) == x ^ y) | | pow | x to the power of y. (eg: pow(x,y) == x ^ y) |
+----------+---------------------------------------------------------+ +----------+---------------------------------------------------------+
@ -869,7 +869,7 @@ a false result due to one or more of the following reasons:
(2) Expression (2) Expression
A structure that holds an abstract syntax tree or AST for a specified A structure that holds an Abstract Syntax Tree or AST for a specified
expression and is used to evaluate said expression. Evaluation of the expression and is used to evaluate said expression. Evaluation of the
expression is accomplished by performing a post-order traversal of the expression is accomplished by performing a post-order traversal of the
AST. If a compiled Expression uses variables or user defined AST. If a compiled Expression uses variables or user defined
@ -1342,7 +1342,7 @@ noted:
Note: In example 6 from the above set, it is assumed the user defined Note: In example 6 from the above set, it is assumed the user defined
function foo has been registered as having a side_effect. By default function foo has been registered as having a side-effect. By default
all user defined functions are assumed to have side-effects, unless all user defined functions are assumed to have side-effects, unless
they are configured in their constructors to not have side-effects they are configured in their constructors to not have side-effects
using the 'disable_has_side_effects' free function. For more using the 'disable_has_side_effects' free function. For more
@ -3980,9 +3980,9 @@ Simpson's rule. The integrate function has two overloads, where the
variable of integration can either be passed as a reference or as a variable of integration can either be passed as a reference or as a
name in string form. Example usage of the function is as follows: name in string form. Example usage of the function is as follows:
typedef exprtk::parser<T> parser_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t;
std::string expression_string = "sqrt(1 - (x^2))"; std::string expression_string = "sqrt(1 - (x^2))";
@ -4015,9 +4015,9 @@ where the variable of differentiation can either be passed as a
reference or as a name in string form. Example usage of the derivative reference or as a name in string form. Example usage of the derivative
function is as follows: function is as follows:
typedef exprtk::parser<T> parser_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t;
std::string expression_string = "sqrt(1 - (x^2))"; std::string expression_string = "sqrt(1 - (x^2))";
@ -4054,9 +4054,9 @@ variable of differentiation can either be passed as a reference or as
a name in string form. Example usage of the second_derivative function a name in string form. Example usage of the second_derivative function
is as follows: is as follows:
typedef exprtk::parser<T> parser_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t;
std::string expression_string = "sqrt(1 - (x^2))"; std::string expression_string = "sqrt(1 - (x^2))";
@ -4093,9 +4093,9 @@ variable of differentiation can either be passed as a reference or as
a name in string form. Example usage of the third_derivative function a name in string form. Example usage of the third_derivative function
is as follows: is as follows:
typedef exprtk::parser<T> parser_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::symbol_table<T> symbol_table_t; typedef exprtk::symbol_table<T> symbol_table_t;
typedef exprtk::expression<T> expression_t;
typedef exprtk::parser<T> parser_t;
std::string expression_string = "sqrt(1 - (x^2))"; std::string expression_string = "sqrt(1 - (x^2))";
@ -4310,7 +4310,7 @@ into account when using ExprTk:
of that symbol-table, otherwise the result will be undefined of that symbol-table, otherwise the result will be undefined
behavior. behavior.
(10) Equal and Nequal are normalised-epsilon equality routines, (10) Equal and not_equal are normalised-epsilon equality routines,
which use epsilons of 0.0000000001 and 0.000001 for double and which use epsilons of 0.0000000001 and 0.000001 for double and
float types respectively. float types respectively.