Commit fc399e89 authored by Alvarez, Gonzalo's avatar Alvarez, Gonzalo
Browse files

PredicateAwesome bug fix

parent c62398b1
Loading
Loading
Loading
Loading
+28 −1
Original line number Diff line number Diff line
@@ -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;
	}

+13 −5
Original line number Diff line number Diff line
@@ -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>
@@ -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)
+36 −17
Original line number Diff line number Diff line
@@ -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);
	}

@@ -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_;