class Expression {
public:
virtual int Evaluate() const = 0;
virtual std::string ToString() const = 0;
virtual ~Expression() {}
};
using ExpressionPtr = std::shared_ptr<Expression>;
class Const_ : public Expression {
public:
Const_(int v) {
val = v;
}
int Evaluate() const override {
return val;
}
std::string ToString() const override {
return std::to_string(val);
}
private:
int val;
};
class Sum_ : public Expression {
public:
Sum_(ExpressionPtr l, ExpressionPtr r) {
left = l;
right = r;
}
int Evaluate() const override {
return left->Evaluate() + right->Evaluate();
}
std::string ToString() const override {
return left->ToString() + " + " + right->ToString();
}
private:
ExpressionPtr left;
ExpressionPtr right;
};
class Product_ : public Expression {
public:
Product_(ExpressionPtr l, ExpressionPtr r) {
left = l;
right = r;
}
int Evaluate() const override {
return left->Evaluate() * right->Evaluate();
}
std::string ToString() const override {
return left->ToString() + " * " + right->ToString();
}
private:
ExpressionPtr left;
ExpressionPtr right;
};
ExpressionPtr Const(int value) {
return std::make_shared<Const_>(value);
}
ExpressionPtr Sum(ExpressionPtr a, ExpressionPtr b) {
return std::make_shared<Sum_>(a, b);
}
ExpressionPtr Product(ExpressionPtr a, ExpressionPtr b) {
return std::make_shared<Product_>(a, b);
}