Loading src/PredicateAnd.h +28 −1 Original line number Diff line number Diff line Loading @@ -33,9 +33,36 @@ public: template<typename T> bool isTrue(String name, T val) { VectorStringType names{name}; typename Vector<T>::Type values{val}; SizeType n = vPredicateSimple_.size(); for (SizeType i = 0; i < n; ++i) if (!vPredicateSimple_[i].isTrue(name, val)) return false; if (!vPredicateSimple_[i].isTrue(names, values)) return false; return true; } template<typename T> bool isTrue(String name1, T val1, String name2, T val2) { VectorStringType names{name1, name2}; typename Vector<T>::Type values{val1, val2}; SizeType n = vPredicateSimple_.size(); for (SizeType i = 0; i < n; ++i) if (!vPredicateSimple_[i].isTrue(names, values)) return false; return true; } template<typename T> bool isTrue(String name1, T val1, String name2, T val2, String name3, T val3, String name4, T val4) { VectorStringType names{name1, name2, name3, name4}; typename Vector<T>::Type values{val1, val2, val3, val4}; SizeType n = vPredicateSimple_.size(); for (SizeType i = 0; i < n; ++i) if (!vPredicateSimple_[i].isTrue(names, values)) return false; return true; } Loading src/PredicateAwesome.h +13 −5 Original line number Diff line number Diff line Loading @@ -87,7 +87,11 @@ public: template<typename T1, typename T2> bool isTrue(String name1, T1 val1, String name2, T2 val2) { return (isTrue(name1, val1) && isTrue(name2, val2)); if (pred_ == "") return false; SizeType n = predicateAnd_.size(); for (SizeType i = 0; i < n; ++i) if (predicateAnd_[i].isTrue(name1, val1, name2, val2)) return true; return false; } template<typename T1, typename T2> Loading @@ -96,10 +100,14 @@ public: String name3, T1 val3, String name4, T2 val4) { return (isTrue(name1, val1) && isTrue(name2, val2) && isTrue(name3, val3) && isTrue(name4, val4)); if (pred_ == "") return false; SizeType n = predicateAnd_.size(); for (SizeType i = 0; i < n; ++i) if (predicateAnd_[i].isTrue(name1, val1, name2, val2, name3, val3, name4, val4)) return true; return false; } static void replaceAll(String& str, const String& from, const String& to) Loading src/PredicateSimple.h +36 −17 Original line number Diff line number Diff line Loading @@ -56,12 +56,12 @@ public: err("Left or right expression is empty\n"); } template<typename T> bool isTrue(String name, T val) template<typename SomeVectorType> bool isTrue(const VectorStringType& names, const SomeVectorType& vals) { T lv = getValue(lhs_, name, val); T rv = getValue(rhs_, name, val); typedef typename SomeVectorType::value_type SomeValueType; SomeValueType lv = getValue(lhs_, names, vals); SomeValueType rv = getValue(rhs_, names, vals); return compareOnOp(lv, op_, rv); } Loading Loading @@ -98,32 +98,51 @@ private: return 0; } template<typename T> static T getValue(String hs, String name, T val) template<typename SomeVectorType> static typename SomeVectorType::value_type getValue(String hs, const VectorStringType& names, const SomeVectorType& vals) { String numericHs = replaceVariable(hs, name, val); String numericHs = replaceVariables(hs, names, vals); VectorStringType tokens; split(tokens, numericHs, "|"); typedef ExpressionCalculator<T> ExpressionCalculatorType; typedef ExpressionCalculator<typename SomeVectorType::value_type> ExpressionCalculatorType; ExpressionCalculatorType expressionCalculator(tokens); return expressionCalculator(); } template<typename SomeVectorType> static String replaceVariables(String hs, const VectorStringType& names, const SomeVectorType& vals) { const SizeType n = names.size(); assert(n == vals.size()); String buffer = hs; for (SizeType i = 0; i < n; ++i) { buffer = replaceVariable(buffer, names[i], vals[i]); } return buffer; } template<typename T> static String replaceVariable(String hs, String name, T val) { String buffer; const SizeType n = hs.length(); for (SizeType i = 0; i < n; ++i) { if (hs[i] == name[0]) buffer += ttos(val); else buffer += hs[i]; const String valString = ttos(val); const SizeType nameLength = name.length(); while (true) { size_t index = hs.find(name); if (index == String::npos) return hs; String part1 = (index == 0) ? "" : hs.substr(0, index); String part2 = hs.substr(index + nameLength, hs.length() - nameLength - index); hs = part1 + valString + part2; } return buffer; return hs; } static VectorStringType ops_; Loading Loading
src/PredicateAnd.h +28 −1 Original line number Diff line number Diff line Loading @@ -33,9 +33,36 @@ public: template<typename T> bool isTrue(String name, T val) { VectorStringType names{name}; typename Vector<T>::Type values{val}; SizeType n = vPredicateSimple_.size(); for (SizeType i = 0; i < n; ++i) if (!vPredicateSimple_[i].isTrue(name, val)) return false; if (!vPredicateSimple_[i].isTrue(names, values)) return false; return true; } template<typename T> bool isTrue(String name1, T val1, String name2, T val2) { VectorStringType names{name1, name2}; typename Vector<T>::Type values{val1, val2}; SizeType n = vPredicateSimple_.size(); for (SizeType i = 0; i < n; ++i) if (!vPredicateSimple_[i].isTrue(names, values)) return false; return true; } template<typename T> bool isTrue(String name1, T val1, String name2, T val2, String name3, T val3, String name4, T val4) { VectorStringType names{name1, name2, name3, name4}; typename Vector<T>::Type values{val1, val2, val3, val4}; SizeType n = vPredicateSimple_.size(); for (SizeType i = 0; i < n; ++i) if (!vPredicateSimple_[i].isTrue(names, values)) return false; return true; } Loading
src/PredicateAwesome.h +13 −5 Original line number Diff line number Diff line Loading @@ -87,7 +87,11 @@ public: template<typename T1, typename T2> bool isTrue(String name1, T1 val1, String name2, T2 val2) { return (isTrue(name1, val1) && isTrue(name2, val2)); if (pred_ == "") return false; SizeType n = predicateAnd_.size(); for (SizeType i = 0; i < n; ++i) if (predicateAnd_[i].isTrue(name1, val1, name2, val2)) return true; return false; } template<typename T1, typename T2> Loading @@ -96,10 +100,14 @@ public: String name3, T1 val3, String name4, T2 val4) { return (isTrue(name1, val1) && isTrue(name2, val2) && isTrue(name3, val3) && isTrue(name4, val4)); if (pred_ == "") return false; SizeType n = predicateAnd_.size(); for (SizeType i = 0; i < n; ++i) if (predicateAnd_[i].isTrue(name1, val1, name2, val2, name3, val3, name4, val4)) return true; return false; } static void replaceAll(String& str, const String& from, const String& to) Loading
src/PredicateSimple.h +36 −17 Original line number Diff line number Diff line Loading @@ -56,12 +56,12 @@ public: err("Left or right expression is empty\n"); } template<typename T> bool isTrue(String name, T val) template<typename SomeVectorType> bool isTrue(const VectorStringType& names, const SomeVectorType& vals) { T lv = getValue(lhs_, name, val); T rv = getValue(rhs_, name, val); typedef typename SomeVectorType::value_type SomeValueType; SomeValueType lv = getValue(lhs_, names, vals); SomeValueType rv = getValue(rhs_, names, vals); return compareOnOp(lv, op_, rv); } Loading Loading @@ -98,32 +98,51 @@ private: return 0; } template<typename T> static T getValue(String hs, String name, T val) template<typename SomeVectorType> static typename SomeVectorType::value_type getValue(String hs, const VectorStringType& names, const SomeVectorType& vals) { String numericHs = replaceVariable(hs, name, val); String numericHs = replaceVariables(hs, names, vals); VectorStringType tokens; split(tokens, numericHs, "|"); typedef ExpressionCalculator<T> ExpressionCalculatorType; typedef ExpressionCalculator<typename SomeVectorType::value_type> ExpressionCalculatorType; ExpressionCalculatorType expressionCalculator(tokens); return expressionCalculator(); } template<typename SomeVectorType> static String replaceVariables(String hs, const VectorStringType& names, const SomeVectorType& vals) { const SizeType n = names.size(); assert(n == vals.size()); String buffer = hs; for (SizeType i = 0; i < n; ++i) { buffer = replaceVariable(buffer, names[i], vals[i]); } return buffer; } template<typename T> static String replaceVariable(String hs, String name, T val) { String buffer; const SizeType n = hs.length(); for (SizeType i = 0; i < n; ++i) { if (hs[i] == name[0]) buffer += ttos(val); else buffer += hs[i]; const String valString = ttos(val); const SizeType nameLength = name.length(); while (true) { size_t index = hs.find(name); if (index == String::npos) return hs; String part1 = (index == 0) ? "" : hs.substr(0, index); String part2 = hs.substr(index + nameLength, hs.length() - nameLength - index); hs = part1 + valString + part2; } return buffer; return hs; } static VectorStringType ops_; Loading