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
 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~