From 9a8474e7a259fa5348658a651cd19af216749674 Mon Sep 17 00:00:00 2001 From: Arash Partow Date: Tue, 14 Aug 2018 21:29:36 +1000 Subject: [PATCH] C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html --- exprtk.hpp | 9 ++- exprtk_test.cpp | 154 ++++++++++++++++++++++++------------------------ 2 files changed, 86 insertions(+), 77 deletions(-) diff --git a/exprtk.hpp b/exprtk.hpp index 35c139c..da1e471 100644 --- a/exprtk.hpp +++ b/exprtk.hpp @@ -619,7 +619,14 @@ namespace exprtk return false; } - return (d_itr == data_end) && (p_itr == pattern_end); + if (d_itr != data_end) + return false; + else if (p_itr == pattern_end) + return true; + else if ((zero_or_more == *p_itr) || (zero_or_one == *p_itr)) + ++p_itr; + + return pattern_end == p_itr; } inline bool wc_match(const std::string& wild_card, diff --git a/exprtk_test.cpp b/exprtk_test.cpp index 5f664fc..29d70a0 100644 --- a/exprtk_test.cpp +++ b/exprtk_test.cpp @@ -2452,83 +2452,85 @@ inline bool run_test02() test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)), test_ab("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)), - test_ab("a like b", "abcd", "abcd", T(1.0)), - test_ab("a like b", "abcd", "abc*", T(1.0)), - test_ab("a like b", "abcd", "*bcd", T(1.0)), - test_ab("a like b", "abcd", "abc?", T(1.0)), - test_ab("a like b", "abcd", "?bcd", T(1.0)), - test_ab("a like b", "abcd", "ab?d", T(1.0)), - test_ab("a like b", "abcd", "ab*d", T(1.0)), - test_ab("a like b", "abcd", "a?cd", T(1.0)), - test_ab("a like b", "abcd", "a*cd", T(1.0)), - test_ab("a like b", "abcd", "a??d", T(1.0)), - test_ab("a like b", "abcd", "a*?d", T(1.0)), - test_ab("a like b", "abcd", "*bc*", T(1.0)), - test_ab("a like b", "abcd", "?bc?", T(1.0)), - test_ab("a like b", "abcd", "????", T(1.0)), - test_ab("a like b", "abcd", "a???", T(1.0)), - test_ab("a like b", "abcd", "ab??", T(1.0)), - test_ab("a like b", "abcd", "abc?", T(1.0)), - test_ab("a like b", "abcd", "???d", T(1.0)), - test_ab("a like b", "abcd", "??cd", T(1.0)), - test_ab("a like b", "abcd", "?bcd", T(1.0)), - test_ab("a like b", "abcd", "?b?d", T(1.0)), - test_ab("a like b", "abcd", "a?c?", T(1.0)), - test_ab("a like b", "abcd", "a??d", T(1.0)), - test_ab("a like b", "abcd", "?bc?", T(1.0)), - test_ab("a like b", "abcd", "ab**", T(1.0)), - test_ab("a like b", "abcd", "ab*?", T(1.0)), - test_ab("a like b", "abcd", "a***", T(1.0)), - test_ab("a like b", "abcd", "**cd", T(1.0)), - test_ab("a like b", "abcd", "*?cd", T(1.0)), - test_ab("a like b", "abcd", "***d", T(1.0)), - test_ab("a like b", "abcd", "*bc*", T(1.0)), - test_ab("a like b", "abcd", "*bc?", T(1.0)), - test_ab("a like b", "abcd", "*b??", T(1.0)), - test_ab("a like b", "abcd", "?bc*", T(1.0)), - test_ab("a like b", "abcd", "??c*", T(1.0)), - test_ab("a like b", "abcd", "*b?*", T(1.0)), - test_ab("a like b", "ab" , "a*" , T(1.0)), - test_ab("a like b", "ab" , "a?" , T(1.0)), + test_ab("a like b", "abcd", "abcd*", T(1.0)), + test_ab("a like b", "abcd", "abcd" , T(1.0)), + test_ab("a like b", "abcd", "abc*" , T(1.0)), + test_ab("a like b", "abcd", "*bcd" , T(1.0)), + test_ab("a like b", "abcd", "abc?" , T(1.0)), + test_ab("a like b", "abcd", "?bcd" , T(1.0)), + test_ab("a like b", "abcd", "ab?d" , T(1.0)), + test_ab("a like b", "abcd", "ab*d" , T(1.0)), + test_ab("a like b", "abcd", "a?cd" , T(1.0)), + test_ab("a like b", "abcd", "a*cd" , T(1.0)), + test_ab("a like b", "abcd", "a??d" , T(1.0)), + test_ab("a like b", "abcd", "a*?d" , T(1.0)), + test_ab("a like b", "abcd", "*bc*" , T(1.0)), + test_ab("a like b", "abcd", "?bc?" , T(1.0)), + test_ab("a like b", "abcd", "????" , T(1.0)), + test_ab("a like b", "abcd", "a???" , T(1.0)), + test_ab("a like b", "abcd", "ab??" , T(1.0)), + test_ab("a like b", "abcd", "abc?" , T(1.0)), + test_ab("a like b", "abcd", "???d" , T(1.0)), + test_ab("a like b", "abcd", "??cd" , T(1.0)), + test_ab("a like b", "abcd", "?bcd" , T(1.0)), + test_ab("a like b", "abcd", "?b?d" , T(1.0)), + test_ab("a like b", "abcd", "a?c?" , T(1.0)), + test_ab("a like b", "abcd", "a??d" , T(1.0)), + test_ab("a like b", "abcd", "?bc?" , T(1.0)), + test_ab("a like b", "abcd", "ab**" , T(1.0)), + test_ab("a like b", "abcd", "ab*?" , T(1.0)), + test_ab("a like b", "abcd", "a***" , T(1.0)), + test_ab("a like b", "abcd", "**cd" , T(1.0)), + test_ab("a like b", "abcd", "*?cd" , T(1.0)), + test_ab("a like b", "abcd", "***d" , T(1.0)), + test_ab("a like b", "abcd", "*bc*" , T(1.0)), + test_ab("a like b", "abcd", "*bc?" , T(1.0)), + test_ab("a like b", "abcd", "*b??" , T(1.0)), + test_ab("a like b", "abcd", "?bc*" , T(1.0)), + test_ab("a like b", "abcd", "??c*" , T(1.0)), + test_ab("a like b", "abcd", "*b?*" , T(1.0)), + test_ab("a like b", "ab" , "a*" , T(1.0)), + test_ab("a like b", "ab" , "a?" , T(1.0)), - test_ab("a ilike b", "aBcD", "abcd", T(1.0)), - test_ab("a ilike b", "aBcD", "abc*", T(1.0)), - test_ab("a ilike b", "aBcD", "*bcd", T(1.0)), - test_ab("a ilike b", "aBcD", "abc?", T(1.0)), - test_ab("a ilike b", "aBcD", "?bcd", T(1.0)), - test_ab("a ilike b", "aBcD", "ab?d", T(1.0)), - test_ab("a ilike b", "aBcD", "ab*d", T(1.0)), - test_ab("a ilike b", "aBcD", "a?cd", T(1.0)), - test_ab("a ilike b", "aBcD", "a*cd", T(1.0)), - test_ab("a ilike b", "aBcD", "a??d", T(1.0)), - test_ab("a ilike b", "aBcD", "a*?d", T(1.0)), - test_ab("a ilike b", "aBcD", "*bc*", T(1.0)), - test_ab("a ilike b", "aBcD", "?bc?", T(1.0)), - test_ab("a ilike b", "aBcD", "????", T(1.0)), - test_ab("a ilike b", "aBcD", "a???", T(1.0)), - test_ab("a ilike b", "aBcD", "ab??", T(1.0)), - test_ab("a ilike b", "aBcD", "abc?", T(1.0)), - test_ab("a ilike b", "aBcD", "???d", T(1.0)), - test_ab("a ilike b", "aBcD", "??cd", T(1.0)), - test_ab("a ilike b", "aBcD", "?bcd", T(1.0)), - test_ab("a ilike b", "aBcD", "?b?d", T(1.0)), - test_ab("a ilike b", "aBcD", "a?c?", T(1.0)), - test_ab("a ilike b", "aBcD", "a??d", T(1.0)), - test_ab("a ilike b", "aBcD", "?bc?", T(1.0)), - test_ab("a ilike b", "aBcD", "ab**", T(1.0)), - test_ab("a ilike b", "aBcD", "ab*?", T(1.0)), - test_ab("a ilike b", "aBcD", "a***", T(1.0)), - test_ab("a ilike b", "aBcD", "**cd", T(1.0)), - test_ab("a ilike b", "aBcD", "*?cd", T(1.0)), - test_ab("a ilike b", "aBcD", "***d", T(1.0)), - test_ab("a ilike b", "aBcD", "*bc*", T(1.0)), - test_ab("a ilike b", "aBcD", "*bc?", T(1.0)), - test_ab("a ilike b", "aBcD", "*b??", T(1.0)), - test_ab("a ilike b", "aBcD", "?bc*", T(1.0)), - test_ab("a ilike b", "aBcD", "??c*", T(1.0)), - test_ab("a ilike b", "aBcD", "*b?*", T(1.0)), - test_ab("a ilike b", "aB" , "a*" , T(1.0)), - test_ab("a ilike b", "aB" , "a?" , T(1.0)) + test_ab("a ilike b", "aBcD", "abcd*", T(1.0)), + test_ab("a ilike b", "aBcD", "abcd" , T(1.0)), + test_ab("a ilike b", "aBcD", "abc*" , T(1.0)), + test_ab("a ilike b", "aBcD", "*bcd" , T(1.0)), + test_ab("a ilike b", "aBcD", "abc?" , T(1.0)), + test_ab("a ilike b", "aBcD", "?bcd" , T(1.0)), + test_ab("a ilike b", "aBcD", "ab?d" , T(1.0)), + test_ab("a ilike b", "aBcD", "ab*d" , T(1.0)), + test_ab("a ilike b", "aBcD", "a?cd" , T(1.0)), + test_ab("a ilike b", "aBcD", "a*cd" , T(1.0)), + test_ab("a ilike b", "aBcD", "a??d" , T(1.0)), + test_ab("a ilike b", "aBcD", "a*?d" , T(1.0)), + test_ab("a ilike b", "aBcD", "*bc*" , T(1.0)), + test_ab("a ilike b", "aBcD", "?bc?" , T(1.0)), + test_ab("a ilike b", "aBcD", "????" , T(1.0)), + test_ab("a ilike b", "aBcD", "a???" , T(1.0)), + test_ab("a ilike b", "aBcD", "ab??" , T(1.0)), + test_ab("a ilike b", "aBcD", "abc?" , T(1.0)), + test_ab("a ilike b", "aBcD", "???d" , T(1.0)), + test_ab("a ilike b", "aBcD", "??cd" , T(1.0)), + test_ab("a ilike b", "aBcD", "?bcd" , T(1.0)), + test_ab("a ilike b", "aBcD", "?b?d" , T(1.0)), + test_ab("a ilike b", "aBcD", "a?c?" , T(1.0)), + test_ab("a ilike b", "aBcD", "a??d" , T(1.0)), + test_ab("a ilike b", "aBcD", "?bc?" , T(1.0)), + test_ab("a ilike b", "aBcD", "ab**" , T(1.0)), + test_ab("a ilike b", "aBcD", "ab*?" , T(1.0)), + test_ab("a ilike b", "aBcD", "a***" , T(1.0)), + test_ab("a ilike b", "aBcD", "**cd" , T(1.0)), + test_ab("a ilike b", "aBcD", "*?cd" , T(1.0)), + test_ab("a ilike b", "aBcD", "***d" , T(1.0)), + test_ab("a ilike b", "aBcD", "*bc*" , T(1.0)), + test_ab("a ilike b", "aBcD", "*bc?" , T(1.0)), + test_ab("a ilike b", "aBcD", "*b??" , T(1.0)), + test_ab("a ilike b", "aBcD", "?bc*" , T(1.0)), + test_ab("a ilike b", "aBcD", "??c*" , T(1.0)), + test_ab("a ilike b", "aBcD", "*b?*" , T(1.0)), + test_ab("a ilike b", "aB" , "a*" , T(1.0)), + test_ab("a ilike b", "aB" , "a?" , T(1.0)) }; static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_ab);