#include <iostream> 
#include "Variable.h"
#include "BinaryExpression.h"
#include "UnaryExpression.h"

using namespace std;  
 
class Double
	{
		ExpPtr _exp;
		
	public:
		Double (const ExpPtr &exp) :_exp(exp) {};
		Double () :_exp(new Variable()){};
		Double (double value) :_exp(new Variable(value)){};
		operator double ();
	ExpPtr & exp ();
	const ExpPtr & Double::exp()const {return _exp;}
	};

Double operator+(const Double & left, const Double & right)
{
	BinaryExpression * ADD = new BinaryExpression(PLUS,left.exp(),right.exp());

	ExpPtr temp(ADD);

	return Double(temp);
}

Double operator-(const Double & exp)
{
	UnaryExpression * SUB = new UnaryExpression(MINUS,exp.exp());

	ExpPtr temp = ExpPtr(SUB);

	return Double(temp);
}

Double operator*(const Double & left, const Double & right)
{
	BinaryExpression * MUL = new BinaryExpression(MULTIPLY,left.exp(),right.exp());

	ExpPtr temp = ExpPtr(MUL);

	return Double(temp);
}
Double:: operator double () {return _exp->value();}
