/*
 * BinaryFunctionExpression.h
 *
 *  Created on: 03.01.2013
 *      Author: chris
 */

#ifndef BINARYFUNCTIONEXPRESSION_H_
#define BINARYFUNCTIONEXPRESSION_H_

#include "src/ir/expressions/BaseExpression.h"

namespace storm {

namespace ir {

namespace expressions {

class BinaryNumericalFunctionExpression : public BaseExpression {
public:
	BaseExpression* left;
	BaseExpression* right;
	enum FunctorType {PLUS, MINUS, TIMES, DIVIDE} functor;

	BinaryNumericalFunctionExpression(BaseExpression* left, BaseExpression* right, FunctorType functor) {
		this->left = left;
		this->right = right;
		this->functor = functor;
	}

	virtual ~BinaryNumericalFunctionExpression() {

	}

	virtual std::string toString() const {
		std::string result = left->toString();
		switch (functor) {
		case PLUS: result += " + "; break;
		case MINUS: result += " - "; break;
		case TIMES: result += " * "; break;
		case DIVIDE: result += " / "; break;
		}
		result += right->toString();

		return result;
	}

};

}

}

}

BOOST_FUSION_ADAPT_STRUCT(
    storm::ir::expressions::BinaryNumericalFunctionExpression,
    (storm::ir::expressions::BaseExpression*, left)
    (storm::ir::expressions::BaseExpression*, right)
    (storm::ir::expressions::BinaryNumericalFunctionExpression::FunctorType, functor)
)

#endif /* BINARYFUNCTIONEXPRESSION_H_ */