From 5a512341d94d93525349f44f9db9862bd147a3ad Mon Sep 17 00:00:00 2001 From: Arash Partow Date: Mon, 10 Oct 2016 13:20:38 +1100 Subject: [PATCH] C++ Mathematical Expression Library (ExprTk) https://www.partow.net/programming/exprtk/index.html --- exprtk.hpp | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ exprtk_test.cpp | 3 +++ 2 files changed, 56 insertions(+) diff --git a/exprtk.hpp b/exprtk.hpp index fea517e..95d76f4 100644 --- a/exprtk.hpp +++ b/exprtk.hpp @@ -36479,6 +36479,56 @@ namespace exprtk } }; + template + class axpbz : public exprtk::igeneric_function + { + public: + + typedef typename exprtk::igeneric_function igfun_t; + typedef typename igfun_t::parameter_list_t parameter_list_t; + typedef typename igfun_t::generic_type generic_type; + typedef typename generic_type::scalar_view scalar_t; + typedef typename generic_type::vector_view vector_t; + + using exprtk::igeneric_function::operator(); + + axpbz() + : exprtk::igeneric_function("TVTV|TVTVTT") + /* + z <- ax + b + Overloads: + 0. TVTV - a, x(vector), b, z(vector) + 1. TVTVTT - a, x(vector), b, z(vector), r0, r1 + */ + {} + + inline T operator()(const std::size_t& ps_index, parameter_list_t parameters) + { + vector_t x(parameters[1]); + vector_t z(parameters[3]); + + std::size_t r0 = 0; + std::size_t r1 = x.size() - 1; + + if ((1 == ps_index) && !details::load_vector_range::process(parameters,r0,r1,4,5)) + return std::numeric_limits::quiet_NaN(); + else if (details::invalid_range(x,r0,r1)) + return std::numeric_limits::quiet_NaN(); + else if (details::invalid_range(z,r0,r1)) + return std::numeric_limits::quiet_NaN(); + + const T a = scalar_t(parameters[0])(); + const T b = scalar_t(parameters[2])(); + + for (std::size_t i = r0; i <= r1; ++i) + { + z[i] = a * x[i] + b; + } + + return T(1); + } + }; + template class dot : public exprtk::igeneric_function { @@ -36595,6 +36645,7 @@ namespace exprtk axpby b1_axpby; axpyz b1_axpyz; axpbyz b1_axpbyz; + axpbz b1_axpbz; dot dt; dotk dtk; @@ -36636,6 +36687,8 @@ namespace exprtk return false; else if (!symtab.add_function("axpbyz",b1_axpbyz)) return false; + else if (!symtab.add_function("axpbz" ,b1_axpbz)) + return false; else if (!symtab.add_function("dot" ,dt)) return false; else if (!symtab.add_function("dotk" ,dtk)) diff --git a/exprtk_test.cpp b/exprtk_test.cpp index d3d62a6..733a0bf 100644 --- a/exprtk_test.cpp +++ b/exprtk_test.cpp @@ -6536,12 +6536,14 @@ inline bool run_test18() "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] := {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] := {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[]", @@ -6552,6 +6554,7 @@ inline bool run_test18() " 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[]", + " var a := 2; var b := 3; var x[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a*x+b; axpbz(a,x,b,z); sum(z == r) == z[]", }; const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);