C++ Mathematical Expression Library (ExprTk) https://www.partow.net/programming/exprtk/index.html
diff --git a/exprtk.hpp b/exprtk.hpp
index 1c06b1f..4ebf2a6 100644
--- a/exprtk.hpp
+++ b/exprtk.hpp
@@ -35695,37 +35695,9 @@
namespace exprtk
{
namespace rtl { namespace vecops {
- namespace details
+
+ namespace helper
{
- template <typename T>
- struct load_vector_range
- {
- typedef typename exprtk::igeneric_function<T> 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;
-
- static inline bool process(parameter_list_t& parameters,
- std::size_t& r0, std::size_t& r1,
- const std::size_t& r0_prmidx,
- const std::size_t& r1_prmidx)
- {
- if (r0_prmidx >= parameters.size())
- return false;
-
- if (r1_prmidx >= parameters.size())
- return false;
-
- if (!scalar_t(parameters[r0_prmidx]).to_uint(r0))
- return false;
-
- if (!scalar_t(parameters[r1_prmidx]).to_uint(r1))
- return false;
-
- return true;
- }
- };
-
template <typename Vector>
inline bool invalid_range(const Vector& v, const std::size_t r0, const std::size_t r1)
{
@@ -35740,6 +35712,40 @@
}
template <typename T>
+ struct load_vector_range
+ {
+ typedef typename exprtk::igeneric_function<T> 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;
+
+ static inline bool process(parameter_list_t& parameters,
+ std::size_t& r0, std::size_t& r1,
+ const std::size_t& r0_prmidx,
+ const std::size_t& r1_prmidx,
+ const std::size_t vec_idx = 0)
+ {
+ if (r0_prmidx >= parameters.size())
+ return false;
+
+ if (r1_prmidx >= parameters.size())
+ return false;
+
+ if (!scalar_t(parameters[r0_prmidx]).to_uint(r0))
+ return false;
+
+ if (!scalar_t(parameters[r1_prmidx]).to_uint(r1))
+ return false;
+
+ return !invalid_range(vector_t(parameters[vec_idx]),r0,r1);
+ }
+ };
+ }
+
+ namespace details
+ {
+ template <typename T>
inline void kahan_sum(T& sum, T& error, T v)
{
T x = v - error;
@@ -35778,9 +35784,7 @@
std::size_t r0 = 0;
std::size_t r1 = vec.size() - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,1,2))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,1,2,0))
return std::numeric_limits<T>::quiet_NaN();
for (std::size_t i = r0; i <= r1; ++i)
@@ -35823,9 +35827,7 @@
std::size_t r0 = 0;
std::size_t r1 = vec.size() - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,1,2))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,1,2,0))
return std::numeric_limits<T>::quiet_NaN();
for (std::size_t i = r0; i <= r1; ++i)
@@ -35868,9 +35870,7 @@
std::size_t r0 = 0;
std::size_t r1 = vec.size() - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,1,2))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,1,2,0))
return std::numeric_limits<T>::quiet_NaN();
for (std::size_t i = r0; i <= r1; ++i)
@@ -35913,9 +35913,7 @@
std::size_t r0 = 0;
std::size_t r1 = vec.size() - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,1,2))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,1,2,0))
return std::numeric_limits<T>::quiet_NaN();
for (std::size_t i = r0; i <= r1; ++i)
@@ -35958,9 +35956,7 @@
std::size_t r0 = 0;
std::size_t r1 = vec.size() - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,1,2))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,1,2,0))
return std::numeric_limits<T>::quiet_NaN();
std::size_t cnt = 0;
@@ -36007,13 +36003,9 @@
std::size_t yr0 = 0;
std::size_t yr1 = y.size() - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,xr0,xr1,1,2))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,xr0,xr1,1,2,0))
return T(0);
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,yr0,yr1,4,5))
- return T(0);
- else if (details::invalid_range(x,xr0,xr1))
- return T(0);
- else if (details::invalid_range(y,yr0,yr1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,yr0,yr1,4,5,3))
return T(0);
const std::size_t n = std::min(xr1 - xr0 + 1, yr1 - yr0 + 1);
@@ -36057,9 +36049,7 @@
if (!scalar_t(parameters[1]).to_uint(n))
return T(0);
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
- return T(0);
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,2,3,0))
return T(0);
std::size_t dist = r1 - r0 + 1;
@@ -36104,9 +36094,7 @@
if (!scalar_t(parameters[1]).to_uint(n))
return T(0);
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
- return T(0);
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,2,3,0))
return T(0);
std::size_t dist = r1 - r0 + 1;
@@ -36151,9 +36139,7 @@
if (!scalar_t(parameters[1]).to_uint(n))
return T(0);
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
- return T(0);
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,2,3,0))
return T(0);
std::size_t dist = r1 - r0 + 1;
@@ -36205,9 +36191,7 @@
if (!scalar_t(parameters[1]).to_uint(n))
return T(0);
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
- return T(0);
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,2,3,0))
return T(0);
std::size_t dist = r1 - r0 + 1;
@@ -36259,11 +36243,9 @@
std::size_t r0 = 0;
std::size_t r1 = vec.size() - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,1,2))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,1,2,0))
return T(0);
- if ((3 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
- return T(0);
- if (details::invalid_range(vec,r0,r1))
+ if ((3 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,2,3,0))
return T(0);
bool ascending = true;
@@ -36320,9 +36302,7 @@
if (!scalar_t(parameters[1]).to_uint(n))
return T(0);
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,2,3,0))
return std::numeric_limits<T>::quiet_NaN();
std::nth_element(vec.begin() + r0, vec.begin() + r0 + n , vec.begin() + r1 + 1);
@@ -36348,10 +36328,10 @@
: exprtk::igeneric_function<T>("VT|VTT|VTTT|VTTTT")
/*
Overloads:
- 0. VT - vector, increment
- 1. VT - vector, increment, base
- 2. VT - vector, increment, r0, r1
- 3. VT - vector, increment, base, r0, r1
+ 0. VT - vector, increment
+ 1. VTT - vector, increment, base
+ 2. VTTTT - vector, increment, r0, r1
+ 3. VTTTT - vector, increment, base, r0, r1
*/
{}
@@ -36365,12 +36345,9 @@
std::size_t r0 = 0;
std::size_t r1 = vec.size() - 1;
- if ((2 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
+ if ((2 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,2,3,0))
return std::numeric_limits<T>::quiet_NaN();
- else if ((3 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,3,4))
- return std::numeric_limits<T>::quiet_NaN();
-
- if (details::invalid_range(vec,r0,r1))
+ else if ((3 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,3,4,0))
return std::numeric_limits<T>::quiet_NaN();
else
{
@@ -36414,9 +36391,7 @@
std::size_t r0 = 0;
std::size_t r1 = vec.size() - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,1,2))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(vec,r0,r1))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,1,2,0))
return std::numeric_limits<T>::quiet_NaN();
T result = T(0);
@@ -36462,11 +36437,9 @@
std::size_t r0 = 0;
std::size_t r1 = std::min(x.size(),y.size()) - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,3,4))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,3,4,1))
return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(x,r0,r1))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(y,r0,r1))
+ else if (helper::invalid_range(y,r0,r1))
return std::numeric_limits<T>::quiet_NaN();
T a = scalar_t(parameters[0])();
@@ -36511,11 +36484,9 @@
std::size_t r0 = 0;
std::size_t r1 = std::min(x.size(),y.size()) - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,4,5))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,4,5,1))
return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(x,r0,r1))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(y,r0,r1))
+ else if (helper::invalid_range(y,r0,r1))
return std::numeric_limits<T>::quiet_NaN();
const T a = scalar_t(parameters[0])();
@@ -36562,13 +36533,11 @@
std::size_t r0 = 0;
std::size_t r1 = std::min(x.size(),y.size()) - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,3,4))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,3,4,1))
return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(x,r0,r1))
+ else if (helper::invalid_range(y,r0,r1))
return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(y,r0,r1))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(z,r0,r1))
+ else if (helper::invalid_range(z,r0,r1))
return std::numeric_limits<T>::quiet_NaN();
T a = scalar_t(parameters[0])();
@@ -36614,13 +36583,11 @@
std::size_t r0 = 0;
std::size_t r1 = std::min(x.size(),y.size()) - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,4,5))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,4,5,1))
return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(x,r0,r1))
+ else if (helper::invalid_range(y,r0,r1))
return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(y,r0,r1))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(z,r0,r1))
+ else if (helper::invalid_range(z,r0,r1))
return std::numeric_limits<T>::quiet_NaN();
const T a = scalar_t(parameters[0])();
@@ -36666,11 +36633,9 @@
std::size_t r0 = 0;
std::size_t r1 = x.size() - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,4,5))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,4,5,1))
return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(x,r0,r1))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(z,r0,r1))
+ else if (helper::invalid_range(z,r0,r1))
return std::numeric_limits<T>::quiet_NaN();
const T a = scalar_t(parameters[0])();
@@ -36715,11 +36680,9 @@
std::size_t r0 = 0;
std::size_t r1 = std::min(x.size(),y.size()) - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,2,3,0))
return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(x,r0,r1))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(y,r0,r1))
+ else if (helper::invalid_range(y,r0,r1))
return std::numeric_limits<T>::quiet_NaN();
T result = T(0);
@@ -36763,11 +36726,9 @@
std::size_t r0 = 0;
std::size_t r1 = std::min(x.size(),y.size()) - 1;
- if ((1 == ps_index) && !details::load_vector_range<T>::process(parameters,r0,r1,2,3))
+ if ((1 == ps_index) && !helper::load_vector_range<T>::process(parameters,r0,r1,2,3,0))
return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(x,r0,r1))
- return std::numeric_limits<T>::quiet_NaN();
- else if (details::invalid_range(y,r0,r1))
+ else if (helper::invalid_range(y,r0,r1))
return std::numeric_limits<T>::quiet_NaN();
T result = T(0);
diff --git a/readme.txt b/readme.txt
index 28cad05..0021bc4 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3145,6 +3145,7 @@
(20) exprtk_simple_example_16.cpp
(21) exprtk_simple_example_17.cpp
(22) exprtk_simple_example_18.cpp
+ (23) exprtk_simple_example_19.cpp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~