#ifndef STORM_STORAGE_EXPRESSIONS_BASEEXPRESSION_H_ #define STORM_STORAGE_EXPRESSIONS_BASEEXPRESSION_H_ #include "src/storage/expressions/Valuation.h" #include "src/storage/expressions/ExpressionVisitor.h" #include "src/exceptions/InvalidArgumentException.h" namespace storm { namespace expressions { /*! * Each node in an expression tree has a uniquely defined type from this enum. */ enum ExpressionReturnType {undefined, bool_, int_, double_}; class BaseExpression { public: BaseExpression(); BaseExpression(ExpressionReturnType returnType); virtual ~BaseExpression() = default; ExpressionReturnType getReturnType() const; virtual int_fast64_t evaluateAsInt(Valuation const& evaluation) const = 0; virtual bool evaluateAsBool(Valuation const& evaluation) const = 0; virtual double evaluateAsDouble(Valuation const& evaluation) const = 0; virtual std::unique_ptr operator+(BaseExpression const& other) const = 0; virtual std::unique_ptr operator-(BaseExpression const& other) const = 0; virtual std::unique_ptr operator-() const = 0; virtual std::unique_ptr operator*(BaseExpression const& other) const = 0; virtual std::unique_ptr operator/(BaseExpression const& other) const = 0; virtual std::unique_ptr operator&(BaseExpression const& other) const = 0; virtual std::unique_ptr operator|(BaseExpression const& other) const = 0; virtual std::unique_ptr operator~() const = 0; virtual std::unique_ptr equals(BaseExpression const& other) const = 0; virtual std::unique_ptr notEquals(BaseExpression const& other) const = 0; virtual std::unique_ptr greater(BaseExpression const& other) const = 0; virtual std::unique_ptr greaterOrEqual(BaseExpression const& other) const = 0; virtual std::unique_ptr less(BaseExpression const& other) const = 0; virtual std::unique_ptr lessOrEqual(BaseExpression const& other) const = 0; virtual std::unique_ptr minimum(BaseExpression const& other) const = 0; virtual std::unique_ptr maximum(BaseExpression const& other) const = 0; virtual std::unique_ptr mod(BaseExpression const& other) const = 0; virtual std::unique_ptr floor() const = 0; virtual std::unique_ptr ceil() const = 0; virtual void visit(ExpressionVisitor* visitor) const = 0; protected: void checkType(ExpressionReturnType actualType, ExpressionReturnType expectedType, std::string const& errorMessage) const; private: ExpressionReturnType returnType; }; } } #endif /* STORM_STORAGE_EXPRESSIONS_BASEEXPRESSION_H_ */