From 53fa7f0ce8e370c7b4a4d64a9cc8e3ad536b2a81 Mon Sep 17 00:00:00 2001 From: Arash Partow Date: Mon, 22 Aug 2016 09:57:59 +1000 Subject: [PATCH] C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html --- exprtk.hpp | 389 ++++++++++++++++++++++++------------------------ exprtk_test.cpp | 2 + readme.txt | 11 +- 3 files changed, 202 insertions(+), 200 deletions(-) diff --git a/exprtk.hpp b/exprtk.hpp index fca963e..33c681b 100644 --- a/exprtk.hpp +++ b/exprtk.hpp @@ -4734,6 +4734,11 @@ namespace exprtk return vector_size(); } + inline value_ptr data() const + { + return value_at(0); + } + protected: virtual value_ptr value_at(const std::size_t&) const = 0; @@ -4814,11 +4819,6 @@ namespace exprtk : vector_holder_base_(new(buffer)sequence_vector_impl(vec)) {} - template - vector_holder(std::deque& deq) - : vector_holder_base_(new(buffer)sequence_vector_impl(deq)) - {} - inline value_ptr operator[](const std::size_t& index) const { return (*vector_holder_base_)[index]; @@ -4829,6 +4829,11 @@ namespace exprtk return vector_holder_base_->size(); } + inline value_ptr data() const + { + return vector_holder_base_->data(); + } + private: mutable vector_holder_base* vector_holder_base_; @@ -6683,12 +6688,12 @@ namespace exprtk binary_node::branch_[0].first->value(); binary_node::branch_[1].first->value(); - vector_holder& vec0 = vec0_node_ptr_->ref(); - vector_holder& vec1 = vec1_node_ptr_->ref(); + T* vec0 = vec0_node_ptr_->ref().data(); + T* vec1 = vec1_node_ptr_->ref().data(); for (std::size_t i = 0; i < vec_size_; ++i) { - std::swap((*vec0[i]),(*vec1[i])); + std::swap(vec0[i],vec1[i]); } return vec1_node_ptr_->value(); @@ -8677,37 +8682,38 @@ namespace exprtk { if (vec_node_ptr_) { - vector_holder& vec_hldr = vec_node_ptr_->ref(); const T v = binary_node::branch_[1].first->value(); + T* vec = vec_node_ptr_->ref().data(); + loop_unroll::details lud(vec_size_); int i = 0; for (; i < lud.upper_bound; i += lud.batch_size) { - (*vec_hldr[i ]) = v; - (*vec_hldr[i + 1]) = v; - (*vec_hldr[i + 2]) = v; - (*vec_hldr[i + 3]) = v; + vec[i ] = v; + vec[i + 1] = v; + vec[i + 2] = v; + vec[i + 3] = v; #ifndef exprtk_disable_superscalar_unroll - (*vec_hldr[i + 4]) = v; - (*vec_hldr[i + 5]) = v; - (*vec_hldr[i + 6]) = v; - (*vec_hldr[i + 7]) = v; + vec[i + 4] = v; + vec[i + 5] = v; + vec[i + 6] = v; + vec[i + 7] = v; #endif } switch (lud.remainder) { #ifndef exprtk_disable_superscalar_unroll - case 7 : (*vec_hldr[i++]) = v; - case 6 : (*vec_hldr[i++]) = v; - case 5 : (*vec_hldr[i++]) = v; - case 4 : (*vec_hldr[i++]) = v; + case 7 : vec[i++] = v; + case 6 : vec[i++] = v; + case 5 : vec[i++] = v; + case 4 : vec[i++] = v; #endif - case 3 : (*vec_hldr[i++]) = v; - case 2 : (*vec_hldr[i++]) = v; - case 1 : (*vec_hldr[i++]) = v; + case 3 : vec[i++] = v; + case 2 : vec[i++] = v; + case 1 : vec[i++] = v; } return vec_node_ptr_->value(); @@ -8794,37 +8800,37 @@ namespace exprtk if (initialised_) { - vector_holder& vec0 = vec0_node_ptr_->ref(); - vector_holder& vec1 = vec1_node_ptr_->ref(); + T* vec0 = vec0_node_ptr_->ref().data(); + T* vec1 = vec1_node_ptr_->ref().data(); loop_unroll::details lud(vec_size_); int i = 0; for (; i < lud.upper_bound; i += lud.batch_size) { - (*vec0[i ]) = (*vec1[i ]); - (*vec0[i + 1]) = (*vec1[i + 1]); - (*vec0[i + 2]) = (*vec1[i + 2]); - (*vec0[i + 3]) = (*vec1[i + 3]); + vec0[i ] = vec1[i ]; + vec0[i + 1] = vec1[i + 1]; + vec0[i + 2] = vec1[i + 2]; + vec0[i + 3] = vec1[i + 3]; #ifndef exprtk_disable_superscalar_unroll - (*vec0[i + 4]) = (*vec1[i + 4]); - (*vec0[i + 5]) = (*vec1[i + 5]); - (*vec0[i + 6]) = (*vec1[i + 6]); - (*vec0[i + 7]) = (*vec1[i + 7]); + vec0[i + 4] = vec1[i + 4]; + vec0[i + 5] = vec1[i + 5]; + vec0[i + 6] = vec1[i + 6]; + vec0[i + 7] = vec1[i + 7]; #endif } switch (lud.remainder) { #ifndef exprtk_disable_superscalar_unroll - case 7 : { (*vec0[i]) = (*vec1[i]); ++i; } - case 6 : { (*vec0[i]) = (*vec1[i]); ++i; } - case 5 : { (*vec0[i]) = (*vec1[i]); ++i; } - case 4 : { (*vec0[i]) = (*vec1[i]); ++i; } + case 7 : { vec0[i] = vec1[i]; ++i; } + case 6 : { vec0[i] = vec1[i]; ++i; } + case 5 : { vec0[i] = vec1[i]; ++i; } + case 4 : { vec0[i] = vec1[i]; ++i; } #endif - case 3 : { (*vec0[i]) = (*vec1[i]); ++i; } - case 2 : { (*vec0[i]) = (*vec1[i]); ++i; } - case 1 : { (*vec0[i]) = (*vec1[i]); ++i; } + case 3 : { vec0[i] = vec1[i]; ++i; } + case 2 : { vec0[i] = vec1[i]; ++i; } + case 1 : { vec0[i] = vec1[i]; ++i; } } return vec0_node_ptr_->value(); @@ -8962,37 +8968,38 @@ namespace exprtk { if (vec_node_ptr_) { - vector_holder& vec_hldr = vec_node_ptr_->ref(); const T v = binary_node::branch_[1].first->value(); + T* vec = vec_node_ptr_->ref().data(); + loop_unroll::details lud(vec_size_); int i = 0; for (; i < lud.upper_bound; i += lud.batch_size) { - Operation::assign(*vec_hldr[i ],v); - Operation::assign(*vec_hldr[i + 1],v); - Operation::assign(*vec_hldr[i + 2],v); - Operation::assign(*vec_hldr[i + 3],v); + Operation::assign(vec[i ],v); + Operation::assign(vec[i + 1],v); + Operation::assign(vec[i + 2],v); + Operation::assign(vec[i + 3],v); #ifndef exprtk_disable_superscalar_unroll - Operation::assign(*vec_hldr[i + 4],v); - Operation::assign(*vec_hldr[i + 5],v); - Operation::assign(*vec_hldr[i + 6],v); - Operation::assign(*vec_hldr[i + 7],v); + Operation::assign(vec[i + 4],v); + Operation::assign(vec[i + 5],v); + Operation::assign(vec[i + 6],v); + Operation::assign(vec[i + 7],v); #endif } switch (lud.remainder) { #ifndef exprtk_disable_superscalar_unroll - case 7 : Operation::assign((*vec_hldr[i++]),v); - case 6 : Operation::assign((*vec_hldr[i++]),v); - case 5 : Operation::assign((*vec_hldr[i++]),v); - case 4 : Operation::assign((*vec_hldr[i++]),v); + case 7 : Operation::assign(vec[i++],v); + case 6 : Operation::assign(vec[i++],v); + case 5 : Operation::assign(vec[i++],v); + case 4 : Operation::assign(vec[i++],v); #endif - case 3 : Operation::assign((*vec_hldr[i++]),v); - case 2 : Operation::assign((*vec_hldr[i++]),v); - case 1 : Operation::assign((*vec_hldr[i++]),v); + case 3 : Operation::assign(vec[i++],v); + case 2 : Operation::assign(vec[i++],v); + case 1 : Operation::assign(vec[i++],v); } return vec_node_ptr_->value(); @@ -9080,14 +9087,14 @@ namespace exprtk binary_node::branch_[0].first->value(); binary_node::branch_[1].first->value(); - vector_holder& vec0 = vec0_node_ptr_->ref(); - vector_holder& vec1 = vec1_node_ptr_->ref(); + T* vec0 = vec0_node_ptr_->ref().data(); + T* vec1 = vec1_node_ptr_->ref().data(); loop_unroll::details lud(vec_size_); int i = 0; - #define exprtk_loop(N) \ - (*vec0[i + N]) = Operation::process((*vec0[i + N]),*vec1[i + N]); \ + #define exprtk_loop(N) \ + vec0[i + N] = Operation::process(vec0[i + N],vec1[i + N]); \ for (; i < lud.upper_bound; i += lud.batch_size) { @@ -9211,12 +9218,12 @@ namespace exprtk binary_node::branch_[0].first->value(); binary_node::branch_[1].first->value(); - vector_holder& vec0 = vec0_node_ptr_->ref(); - vector_holder& vec1 = vec1_node_ptr_->ref(); + T* vec0 = vec0_node_ptr_->ref().data(); + T* vec1 = vec1_node_ptr_->ref().data(); for (std::size_t i = 0; i < vec_size_; ++i) { - if (std::equal_to()(T(0),Operation::process(*vec0[i],*vec1[i]))) + if (std::equal_to()(T(0),Operation::process(vec0[i],vec1[i]))) { return T(0); } @@ -9299,11 +9306,11 @@ namespace exprtk binary_node::branch_[0].first->value(); T v = binary_node::branch_[1].first->value(); - vector_holder& vec_hldr = vec_node_ptr_->ref(); + T* vec = vec_node_ptr_->ref().data(); for (std::size_t i = 0; i < vec_size_; ++i) { - if (std::equal_to()(T(0),Operation::process(*vec_hldr[i],v))) + if (std::equal_to()(T(0),Operation::process(vec[i],v))) { return T(0); } @@ -9384,11 +9391,11 @@ namespace exprtk T v = binary_node::branch_[0].first->value(); binary_node::branch_[1].first->value(); - vector_holder& vec_hldr = vec_node_ptr_->ref(); + T* vec = vec_node_ptr_->ref().data(); for (std::size_t i = 0; i < vec_size_; ++i) { - if (std::equal_to()(T(0),Operation::process(v,*vec_hldr[i]))) + if (std::equal_to()(T(0),Operation::process(v,vec[i]))) { return T(0); } @@ -9504,15 +9511,15 @@ namespace exprtk binary_node::branch_[0].first->value(); binary_node::branch_[1].first->value(); - vector_holder& vec0 = vec0_node_ptr_->ref(); - vector_holder& vec1 = vec1_node_ptr_->ref(); - vector_holder& vec2 = *temp_; + T* vec0 = vec0_node_ptr_->ref().data(); + T* vec1 = vec1_node_ptr_->ref().data(); + T* vec2 = (*temp_).data(); loop_unroll::details lud(vec_size_); int i = 0; - #define exprtk_loop(N) \ - (*vec2[i + N]) = Operation::process((*vec0[i + N]),(*vec1[i + N])); \ + #define exprtk_loop(N) \ + vec2[i + N] = Operation::process(vec0[i + N],vec1[i + N]); \ for (; i < lud.upper_bound; i += lud.batch_size) { @@ -9539,7 +9546,7 @@ namespace exprtk #undef exprtk_loop - return *vec2[0]; + return vec2[0]; } else return std::numeric_limits::quiet_NaN(); @@ -9635,14 +9642,14 @@ namespace exprtk binary_node::branch_[0].first->value(); const T v = binary_node::branch_[1].first->value(); - vector_holder& vec0 = vec0_node_ptr_->ref(); - vector_holder& vec1 = *temp_; + T* vec0 = vec0_node_ptr_->ref().data(); + T* vec1 = (*temp_).data(); loop_unroll::details lud(vec_size_); int i = 0; - #define exprtk_loop(N) \ - (*vec1[i + N]) = Operation::process((*vec0[i + N]),v); \ + #define exprtk_loop(N) \ + vec1[i + N] = Operation::process(vec0[i + N],v); \ for (; i < lud.upper_bound; i += lud.batch_size) { @@ -9669,7 +9676,7 @@ namespace exprtk #undef exprtk_loop - return *vec1[0]; + return vec1[0]; } else return std::numeric_limits::quiet_NaN(); @@ -9763,14 +9770,14 @@ namespace exprtk const T v = binary_node::branch_[0].first->value(); binary_node::branch_[1].first->value(); - vector_holder& vec1 = vec1_node_ptr_->ref(); - vector_holder& vec2 = *temp_; + T* vec1 = vec1_node_ptr_->ref().data(); + T* vec2 = (*temp_).data(); loop_unroll::details lud(vec_size_); int i = 0; - #define exprtk_loop(N) \ - (*vec2[i + N]) = Operation::process(v,(*vec1[i + N])); \ + #define exprtk_loop(N) \ + vec2[i + N] = Operation::process(v,vec1[i + N]); \ for (; i < lud.upper_bound; i += lud.batch_size) { @@ -9797,7 +9804,7 @@ namespace exprtk #undef exprtk_loop - return *vec2[0]; + return vec2[0]; } else return std::numeric_limits::quiet_NaN(); @@ -9888,40 +9895,40 @@ namespace exprtk if (vec0_node_ptr_) { - vector_holder& vec0 = vec0_node_ptr_->ref(); - vector_holder& vec1 = *temp_; + T* vec0 = vec0_node_ptr_->ref().data(); + T* vec1 = (*temp_).data(); loop_unroll::details lud(vec_size_); int i = 0; for (; i < lud.upper_bound; i += lud.batch_size) { - (*vec1[i ]) = Operation::process((*vec0[i ])); - (*vec1[i + 1]) = Operation::process((*vec0[i + 1])); - (*vec1[i + 2]) = Operation::process((*vec0[i + 2])); - (*vec1[i + 3]) = Operation::process((*vec0[i + 3])); + vec1[i ] = Operation::process(vec0[i ]); + vec1[i + 1] = Operation::process(vec0[i + 1]); + vec1[i + 2] = Operation::process(vec0[i + 2]); + vec1[i + 3] = Operation::process(vec0[i + 3]); #ifndef exprtk_disable_superscalar_unroll - (*vec1[i + 4]) = Operation::process((*vec0[i + 4])); - (*vec1[i + 5]) = Operation::process((*vec0[i + 5])); - (*vec1[i + 6]) = Operation::process((*vec0[i + 6])); - (*vec1[i + 7]) = Operation::process((*vec0[i + 7])); + vec1[i + 4] = Operation::process(vec0[i + 4]); + vec1[i + 5] = Operation::process(vec0[i + 5]); + vec1[i + 6] = Operation::process(vec0[i + 6]); + vec1[i + 7] = Operation::process(vec0[i + 7]); #endif } switch (lud.remainder) { #ifndef exprtk_disable_superscalar_unroll - case 7 : { (*vec1[i]) = Operation::process((*vec0[i])); ++i; } - case 6 : { (*vec1[i]) = Operation::process((*vec0[i])); ++i; } - case 5 : { (*vec1[i]) = Operation::process((*vec0[i])); ++i; } - case 4 : { (*vec1[i]) = Operation::process((*vec0[i])); ++i; } + case 7 : { vec1[i] = Operation::process(vec0[i]); ++i; } + case 6 : { vec1[i] = Operation::process(vec0[i]); ++i; } + case 5 : { vec1[i] = Operation::process(vec0[i]); ++i; } + case 4 : { vec1[i] = Operation::process(vec0[i]); ++i; } #endif - case 3 : { (*vec1[i]) = Operation::process((*vec0[i])); ++i; } - case 2 : { (*vec1[i]) = Operation::process((*vec0[i])); ++i; } - case 1 : { (*vec1[i]) = Operation::process((*vec0[i])); ++i; } + case 3 : { vec1[i] = Operation::process(vec0[i]); ++i; } + case 2 : { vec1[i] = Operation::process(vec0[i]); ++i; } + case 1 : { vec1[i] = Operation::process(vec0[i]); ++i; } } - return *vec1[0]; + return vec1[0]; } else return std::numeric_limits::quiet_NaN(); @@ -11816,27 +11823,28 @@ namespace exprtk static inline T process(const ivector_ptr v) { - vector_holder& vec = v->vec()->ref(); + const T* vec = v->vec()->ref().data(); + const std::size_t vec_size = v->vec()->ref().size(); - loop_unroll::details lud(vec.size()); + loop_unroll::details lud(vec_size); int i = 0; - if (vec.size() <= static_cast(lud.batch_size)) + if (vec_size <= static_cast(lud.batch_size)) { T result = T(0); - switch (vec.size()) + switch (vec_size) { #ifndef exprtk_disable_superscalar_unroll - case 8 : result += (*vec[i++]); - case 7 : result += (*vec[i++]); - case 6 : result += (*vec[i++]); - case 5 : result += (*vec[i++]); + case 8 : result += vec[i++]; + case 7 : result += vec[i++]; + case 6 : result += vec[i++]; + case 5 : result += vec[i++]; #endif - case 4 : result += (*vec[i++]); - case 3 : result += (*vec[i++]); - case 2 : result += (*vec[i++]); - case 1 : result += (*vec[i++]); + case 4 : result += vec[i++]; + case 3 : result += vec[i++]; + case 2 : result += vec[i++]; + case 1 : result += vec[i++]; } return result; @@ -11846,29 +11854,29 @@ namespace exprtk for (; i < lud.upper_bound; i += lud.batch_size) { - r[0] += (*vec[i ]); - r[1] += (*vec[i + 1]); - r[2] += (*vec[i + 2]); - r[3] += (*vec[i + 3]); + r[0] += vec[i ]; + r[1] += vec[i + 1]; + r[2] += vec[i + 2]; + r[3] += vec[i + 3]; #ifndef exprtk_disable_superscalar_unroll - r[4] += (*vec[i + 4]); - r[5] += (*vec[i + 5]); - r[6] += (*vec[i + 6]); - r[7] += (*vec[i + 7]); + r[4] += vec[i + 4]; + r[5] += vec[i + 5]; + r[6] += vec[i + 6]; + r[7] += vec[i + 7]; #endif } switch (lud.remainder) { #ifndef exprtk_disable_superscalar_unroll - case 7 : r[0] += (*vec[i++]); - case 6 : r[0] += (*vec[i++]); - case 5 : r[0] += (*vec[i++]); - case 4 : r[0] += (*vec[i++]); + case 7 : r[0] += vec[i++]; + case 6 : r[0] += vec[i++]; + case 5 : r[0] += vec[i++]; + case 4 : r[0] += vec[i++]; #endif - case 3 : r[0] += (*vec[i++]); - case 2 : r[0] += (*vec[i++]); - case 1 : r[0] += (*vec[i++]); + case 3 : r[0] += vec[i++]; + case 2 : r[0] += vec[i++]; + case 1 : r[0] += vec[i++]; } return (r[0] + r[1] + r[2] + r[3]) @@ -11886,27 +11894,28 @@ namespace exprtk static inline T process(const ivector_ptr v) { - vector_holder& vec = v->vec()->ref(); + const T* vec = v->vec()->ref().data(); + const std::size_t vec_size = v->vec()->ref().size(); - loop_unroll::details lud(vec.size()); + loop_unroll::details lud(vec_size); int i = 0; - if (vec.size() <= static_cast(lud.batch_size)) + if (vec_size <= static_cast(lud.batch_size)) { T result = T(1); - switch (vec.size()) + switch (vec_size) { #ifndef exprtk_disable_superscalar_unroll - case 8 : result *= (*vec[i++]); - case 7 : result *= (*vec[i++]); - case 6 : result *= (*vec[i++]); - case 5 : result *= (*vec[i++]); + case 8 : result *= vec[i++]; + case 7 : result *= vec[i++]; + case 6 : result *= vec[i++]; + case 5 : result *= vec[i++]; #endif - case 4 : result *= (*vec[i++]); - case 3 : result *= (*vec[i++]); - case 2 : result *= (*vec[i++]); - case 1 : result *= (*vec[i++]); + case 4 : result *= vec[i++]; + case 3 : result *= vec[i++]; + case 2 : result *= vec[i++]; + case 1 : result *= vec[i++]; } return result; @@ -11916,29 +11925,29 @@ namespace exprtk for (; i < lud.upper_bound; i += lud.batch_size) { - r[0] *= (*vec[i ]); - r[1] *= (*vec[i + 1]); - r[2] *= (*vec[i + 2]); - r[3] *= (*vec[i + 3]); + r[0] *= (vec[i ]); + r[1] *= (vec[i + 1]); + r[2] *= (vec[i + 2]); + r[3] *= (vec[i + 3]); #ifndef exprtk_disable_superscalar_unroll - r[4] *= (*vec[i + 4]); - r[5] *= (*vec[i + 5]); - r[6] *= (*vec[i + 6]); - r[7] *= (*vec[i + 7]); + r[4] *= (vec[i + 4]); + r[5] *= (vec[i + 5]); + r[6] *= (vec[i + 6]); + r[7] *= (vec[i + 7]); #endif } switch (lud.remainder) { #ifndef exprtk_disable_superscalar_unroll - case 7 : r[0] *= (*vec[i++]); - case 6 : r[0] *= (*vec[i++]); - case 5 : r[0] *= (*vec[i++]); - case 4 : r[0] *= (*vec[i++]); + case 7 : r[0] *= (vec[i++]); + case 6 : r[0] *= (vec[i++]); + case 5 : r[0] *= (vec[i++]); + case 4 : r[0] *= (vec[i++]); #endif - case 3 : r[0] *= (*vec[i++]); - case 2 : r[0] *= (*vec[i++]); - case 1 : r[0] *= (*vec[i++]); + case 3 : r[0] *= (vec[i++]); + case 2 : r[0] *= (vec[i++]); + case 1 : r[0] *= (vec[i++]); } return (r[0] * r[1] * r[2] * r[3]) @@ -11956,41 +11965,42 @@ namespace exprtk static inline T process(const ivector_ptr v) { - vector_holder& vec = v->vec()->ref(); + const T* vec = v->vec()->ref().data(); + const std::size_t vec_size = v->vec()->ref().size(); T result = T(0); - loop_unroll::details lud(vec.size()); + loop_unroll::details lud(vec_size); int i = 0; for (; i < lud.upper_bound; i += lud.batch_size) { - result += (*vec[i]); - result += (*vec[i + 1]); - result += (*vec[i + 2]); - result += (*vec[i + 3]); + result += vec[i ]; + result += vec[i + 1]; + result += vec[i + 2]; + result += vec[i + 3]; #ifndef exprtk_disable_superscalar_unroll - result += (*vec[i + 4]); - result += (*vec[i + 5]); - result += (*vec[i + 6]); - result += (*vec[i + 7]); + result += vec[i + 4]; + result += vec[i + 5]; + result += vec[i + 6]; + result += vec[i + 7]; #endif } switch (lud.remainder) { #ifndef exprtk_disable_superscalar_unroll - case 7 : result += (*vec[i++]); - case 6 : result += (*vec[i++]); - case 5 : result += (*vec[i++]); - case 4 : result += (*vec[i++]); + case 7 : result += vec[i++]; + case 6 : result += vec[i++]; + case 5 : result += vec[i++]; + case 4 : result += vec[i++]; #endif - case 3 : result += (*vec[i++]); - case 2 : result += (*vec[i++]); - case 1 : result += (*vec[i++]); + case 3 : result += vec[i++]; + case 2 : result += vec[i++]; + case 1 : result += vec[i++]; } - return result / vec.size(); + return result / vec_size; } }; @@ -12001,13 +12011,14 @@ namespace exprtk static inline T process(const ivector_ptr v) { - vector_holder& vec = v->vec()->ref(); + const T* vec = v->vec()->ref().data(); + const std::size_t vec_size = v->vec()->ref().size(); - T result = (*vec[0]); + T result = vec[0]; - for (std::size_t i = 1; i < vec.size(); ++i) + for (std::size_t i = 1; i < vec_size; ++i) { - T v_i = (*vec[i]); + T v_i = vec[i]; if (v_i < result) result = v_i; @@ -12024,13 +12035,14 @@ namespace exprtk static inline T process(const ivector_ptr v) { - vector_holder& vec = v->vec()->ref(); + const T* vec = v->vec()->ref().data(); + const std::size_t vec_size = v->vec()->ref().size(); - T result = (*vec[0]); + T result = vec[0]; - for (std::size_t i = 1; i < vec.size(); ++i) + for (std::size_t i = 1; i < vec_size; ++i) { - T v_i = (*vec[i]); + T v_i = vec[i]; if (v_i > result) result = v_i; } @@ -15968,19 +15980,6 @@ namespace exprtk return local_data().vector_store.add(vector_name,v); } - template - inline bool add_vector(const std::string& vector_name, std::deque& v) - { - if (!valid()) - return false; - else if (!valid_symbol(vector_name)) - return false; - else if (symbol_exists(vector_name)) - return false; - else - return local_data().vector_store.add(vector_name,v); - } - inline bool remove_variable(const std::string& variable_name, const bool delete_node = true) { if (!valid()) diff --git a/exprtk_test.cpp b/exprtk_test.cpp index 7003572..994f681 100644 --- a/exprtk_test.cpp +++ b/exprtk_test.cpp @@ -4223,6 +4223,8 @@ inline bool run_test10() "var x[3] := {-1,-2,-3}; sum(abs(x) ) == 6", "var x[3] := {0.1,0.2,0.3}; sum(trunc(x)) == 0", + "var x[10^6]:=[2];var y[10^6]:=[3]; var s:=0;equal(for(var i:=0; i<10;i+=1){s+= sum(5 *(2x-y/3)) + i;},150000045.0)", + "var x := 2; (~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; " "j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } else " "break[i + j]; } } } + ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; " diff --git a/readme.txt b/readme.txt index b1c84d3..4e3ba87 100644 --- a/readme.txt +++ b/readme.txt @@ -622,11 +622,12 @@ double, MPFR et al). (2) Vector Type -The vector type is a fixed size sequence of scalar values. A vector -can be indexed resulting in a scalar value. Operations between a -vector and scalar will result in a vector with a size equal to that of -the original vector, whereas operations between vectors will result in -a vector of size equal to that of the smaller of the two. +The vector type is a fixed size sequence of contiguous scalar values. +A vector can be indexed resulting in a scalar value. Operations +between a vector and scalar will result in a vector with a size equal +to that of the original vector, whereas operations between vectors +will result in a vector of size equal to that of the smaller of the +two. (3) String Type