diff --git a/exprtk.hpp b/exprtk.hpp index 6043aa6..670eda9 100644 --- a/exprtk.hpp +++ b/exprtk.hpp @@ -586,55 +586,40 @@ namespace exprtk const typename std::iterator_traits::value_type& zero_or_more, const typename std::iterator_traits::value_type& zero_or_one) { - if (0 == std::distance(data_begin,data_end)) - { - return false; - } - Iterator d_itr = data_begin; Iterator p_itr = pattern_begin; - Iterator c_itr = data_begin; - Iterator m_itr = data_begin; - while ((data_end != d_itr) && (zero_or_more != (*p_itr))) + while ((p_itr != pattern_end) && (d_itr != data_end)) { - if ((!Compare::cmp((*p_itr),(*d_itr))) && (zero_or_one != (*p_itr))) + if (zero_or_more == *p_itr) { - return false; - } - - ++p_itr; - ++d_itr; - } - - while (data_end != d_itr) - { - if (zero_or_more == (*p_itr)) - { - if (pattern_end == (++p_itr)) + while ((p_itr != pattern_end) && (*p_itr == zero_or_more || *p_itr == zero_or_one)) { - return true; + ++p_itr; + } + + if (p_itr == pattern_end) + return true; + + const typename std::iterator_traits::value_type c = *(p_itr++); + + while ((d_itr != data_end) && !Compare::cmp(c,*d_itr)) + { + ++d_itr; } - m_itr = p_itr; - c_itr = d_itr; - ++c_itr; - } - else if ((Compare::cmp((*p_itr),(*d_itr))) || (zero_or_one == (*p_itr))) - { - ++p_itr; ++d_itr; } - else + else if ((*p_itr == zero_or_one) || Compare::cmp(*p_itr, *d_itr)) { - p_itr = m_itr; - d_itr = c_itr++; + ++d_itr; + ++p_itr; } + else + return false; } - while ((p_itr != pattern_end) && (zero_or_more == (*p_itr))) { ++p_itr; } - - return (p_itr == pattern_end); + return (d_itr == data_end) && (p_itr == pattern_end); } inline bool wc_match(const std::string& wild_card,