#ifndef MAX_EXPRESSION_HPP #define MAX_EXPRESSION_HPP #include #include "Expression.hpp" #include "EquationSystem.hpp" #include "IdSet.hpp" template struct MaxStrategy { virtual ~MaxStrategy() { } virtual unsigned int get(const MaxExpression& e) const = 0; }; template struct ConcreteMaxStrategy : public MaxStrategy { ConcreteMaxStrategy(const EquationSystem& system) : _system(system), _strategy(system.maxExpressionCount(), 0) { } unsigned int get(const MaxExpression& e) const { return _strategy[e]; } unsigned int set(const MaxExpression& e, unsigned int i) { _strategy[e] = i; return i; } void print(std::ostream& cout) const { for (unsigned int i = 0, length = _system.maxExpressionCount(); i < length; ++i) { auto expr = _system.maxExpression(i); unsigned int subExpression = get(expr); cout << expr << " --[" << subExpression << "]-> " << *expr.arguments()[subExpression] << std::endl; } } private: const EquationSystem& _system; IdMap,unsigned int> _strategy; }; template std::ostream& operator<<(std::ostream& cout, const ConcreteMaxStrategy& strat) { strat.print(cout); return cout; } #endif