#ifndef MAX_STRATEGY_HPP #define MAX_STRATEGY_HPP #include "Expression.hpp" #include "VariableAssignment.hpp" template struct MaxStrategy { MaxStrategy(unsigned int length) : _length(length), _assignment(new unsigned int[length]) { } virtual ~MaxStrategy() { delete[] _assignment; } const unsigned int& operator[] (const MaxExpression x) const { if (x.id() < 0 || x.id() >= _length) { throw "Array out of bounds"; } return _assignment[x.id()]; } unsigned int& operator[] (const MaxExpression& x) { if (x.id() < 0 || x.id() >= _length) { throw "Array out of bounds"; } return _assignment[x.id()]; } T operator() (const Expression& expr, const VariableAssignment& rho) const { const MaxExpression* max = dynamic_cast*>(&expr); if (max == NULL) { return expr(rho); } else { return (*expr.arguments()[_assignment[max->id()]])(rho); } } private: unsigned int _length; unsigned int* _assignment; }; #endif