diff --git a/src/storage/expressions/BooleanConstantExpression.cpp b/src/storage/expressions/BooleanConstantExpression.cpp index 8c40b02af..b9fa340b0 100644 --- a/src/storage/expressions/BooleanConstantExpression.cpp +++ b/src/storage/expressions/BooleanConstantExpression.cpp @@ -2,8 +2,31 @@ namespace storm { namespace expressions { - BooleanConstantExpression::BooleanConstantExpression(std::string const& constantName) : ConstantExpression(ReturnType::bool_, constantName) { + BooleanConstantExpression::BooleanConstantExpression(std::string const& constantName) : ConstantExpression(ExpressionReturnType::bool_, constantName) { // Intentionally left empty. } + + BooleanConstantExpression::BooleanConstantExpression(BooleanConstantExpression const& other) : ConstantExpression(other) { + // Intentionally left empty. + } + + BooleanConstantExpression& BooleanConstantExpression::operator=(BooleanConstantExpression const& other) { + if (this != &other) { + ConstantExpression::operator=(other); + } + return *this; + } + + bool BooleanConstantExpression::evaluateAsBool(Valuation const& valuation) const { + return valuation.getBooleanValue(this->getConstantName()); + } + + std::unique_ptr BooleanConstantExpression::clone() const { + return std::unique_ptr(new BooleanConstantExpression(*this)); + } + + void BooleanConstantExpression::accept(ExpressionVisitor* visitor) const { + visitor->visit(this); + } } } \ No newline at end of file diff --git a/src/storage/expressions/BooleanConstantExpression.h b/src/storage/expressions/BooleanConstantExpression.h index c337f01c0..1ff4a157a 100644 --- a/src/storage/expressions/BooleanConstantExpression.h +++ b/src/storage/expressions/BooleanConstantExpression.h @@ -7,8 +7,27 @@ namespace storm { namespace expressions { class BooleanConstantExpression : public ConstantExpression { public: + /*! + * Creates a boolean constant expression with the given return type and constant name. + * + * @param returnType The return type of the expression. + * @param constantName The name of the boolean constant associated with this expression. + */ BooleanConstantExpression(std::string const& constantName); + + // Provide custom versions of copy construction and assignment. + BooleanConstantExpression(BooleanConstantExpression const& other); + BooleanConstantExpression& operator=(BooleanConstantExpression const& other); + + // Create default variants of move construction/assignment and virtual destructor. + BooleanConstantExpression(BooleanConstantExpression&&) = default; + BooleanConstantExpression& operator=(BooleanConstantExpression&&) = default; virtual ~BooleanConstantExpression() = default; + + // Override base class methods. + virtual bool evaluateAsBool(Valuation const& valuation) const; + virtual std::unique_ptr clone() const; + virtual void accept(ExpressionVisitor* visitor) const; }; } } diff --git a/src/storage/expressions/ConstantExpression.cpp b/src/storage/expressions/ConstantExpression.cpp index d6cbce747..9fcef7338 100644 --- a/src/storage/expressions/ConstantExpression.cpp +++ b/src/storage/expressions/ConstantExpression.cpp @@ -2,10 +2,46 @@ namespace storm { namespace expressions { - ConstantExpression::ConstantExpression(ReturnType returnType, std::string const& constantName) : BaseExpression(returnType), constantName(constantName) { + ConstantExpression::ConstantExpression(ExpressionReturnType returnType, std::string const& constantName) : BaseExpression(returnType), constantName(constantName) { // Intentionally left empty. } + ConstantExpression::ConstantExpression(ConstantExpression const& other) : BaseExpression(other), constantName(other.getConstantName()) { + // Intentionally left empty. + } + + ConstantExpression& ConstantExpression::operator=(ConstantExpression const& other) { + if (this != &other) { + BaseExpression::operator=(other); + this->constantName = other.getConstantName(); + } + return *this; + } + + bool ConstantExpression::isConstant() const { + return false; + } + + bool ConstantExpression::isTrue() const { + return false; + } + + bool ConstantExpression::isFalse() const { + return false; + } + + std::set ConstantExpression::getVariables() const { + return std::set(); + } + + std::set ConstantExpression::getConstants() const { + return {this->getConstantName()}; + } + + std::unique_ptr ConstantExpression::simplify() const { + return this->clone(); + } + std::string const& ConstantExpression::getConstantName() const { return this->constantName; } diff --git a/src/storage/expressions/ConstantExpression.h b/src/storage/expressions/ConstantExpression.h index 08fb80321..8049c12cd 100644 --- a/src/storage/expressions/ConstantExpression.h +++ b/src/storage/expressions/ConstantExpression.h @@ -6,12 +6,41 @@ namespace storm { namespace expressions { class ConstantExpression : public BaseExpression { + public: + /*! + * Creates a constant expression with the given return type and constant name. + * + * @param returnType The return type of the expression. + * @param constantName The name of the constant associated with this expression. + */ ConstantExpression(ExpressionReturnType returnType, std::string const& constantName); + + // Provide custom versions of copy construction and assignment. + ConstantExpression(ConstantExpression const& other); + ConstantExpression& operator=(ConstantExpression const& other); + + // Create default variants of move construction/assignment and virtual destructor. + ConstantExpression(ConstantExpression&&) = default; + ConstantExpression& operator=(ConstantExpression&&) = default; virtual ~ConstantExpression() = default; + // Override base class methods. + virtual bool isConstant() const override; + virtual bool isTrue() const override; + virtual bool isFalse() const override; + virtual std::set getVariables() const override; + virtual std::set getConstants() const override; + virtual std::unique_ptr simplify() const override; + + /*! + * Retrieves the name of the constant. + * + * @return The name of the constant. + */ std::string const& getConstantName() const; private: + // The name of the constant. std::string constantName; }; } diff --git a/src/storage/expressions/ExpressionVisitor.h b/src/storage/expressions/ExpressionVisitor.h index 59bb99ac1..94898e1a2 100644 --- a/src/storage/expressions/ExpressionVisitor.h +++ b/src/storage/expressions/ExpressionVisitor.h @@ -4,6 +4,7 @@ #include "src/storage/expressions/BinaryNumericalFunctionExpression.h" #include "src/storage/expressions/BinaryBooleanFunctionExpression.h" #include "src/storage/expressions/BinaryRelationExpression.h" +#include "src/storage/expressions/BooleanConstantExpression.h" namespace storm { namespace expressions { @@ -11,6 +12,7 @@ namespace storm { virtual void visit(BinaryBooleanFunctionExpression const* expression) = 0; virtual void visit(BinaryNumericalFunctionExpression const* expression) = 0; virtual void visit(BinaryRelationExpression const* expression) = 0; + virtual void visit(BooleanConstantExpression const* expression) = 0; }; } }