9 changed files with 228 additions and 8 deletions
			
			
		- 
					31src/exceptions/ExceptionMacros.h
 - 
					23src/storage/expressions/BaseExpression.cpp
 - 
					43src/storage/expressions/BaseExpression.h
 - 
					7src/storage/expressions/Expression.cpp
 - 
					8src/storage/expressions/Expression.h
 - 
					17src/storage/expressions/SubstitutionVisitor.cpp
 - 
					4src/storage/expressions/SubstitutionVisitor.h
 - 
					56src/storage/expressions/VariableExpression.cpp
 - 
					47src/storage/expressions/VariableExpression.h
 
@ -0,0 +1,31 @@ | 
				
			|||
#ifndef STORM_EXCEPTIONS_EXCEPTIONMACROS_H_ | 
				
			|||
#define STORM_EXCEPTIONS_EXCEPTIONMACROS_H_ | 
				
			|||
 | 
				
			|||
#include <cassert> | 
				
			|||
 | 
				
			|||
#include "log4cplus/logger.h" | 
				
			|||
#include "log4cplus/loggingmacros.h" | 
				
			|||
 | 
				
			|||
extern log4cplus::Logger logger; | 
				
			|||
 | 
				
			|||
#ifndef NDEBUG | 
				
			|||
#define LOG_ASSERT(cond, message)               \ | 
				
			|||
{                                               \ | 
				
			|||
    if (!(cond)) {                              \ | 
				
			|||
        LOG4CPLUS_ERROR(logger, message);       \ | 
				
			|||
        assert(cond);                           \ | 
				
			|||
    }                                           \ | 
				
			|||
} while (false) | 
				
			|||
#define LOG_THROW(cond, exception, message)     \ | 
				
			|||
{                                               \ | 
				
			|||
    if (!(cond)) {                              \ | 
				
			|||
        LOG4CPLUS_ERROR(logger, message);       \ | 
				
			|||
        throw exception() << message;           \ | 
				
			|||
    }                                           \ | 
				
			|||
} while (false) | 
				
			|||
#else | 
				
			|||
#define LOG_ASSERT(cond, message) /* empty */ | 
				
			|||
#define LOG_THROW(cond, exception, message) /* empty */ | 
				
			|||
#endif | 
				
			|||
 | 
				
			|||
#endif /* STORM_EXCEPTIONS_EXCEPTIONMACROS_H_ */ | 
				
			|||
@ -0,0 +1,23 @@ | 
				
			|||
#include "src/storage/expressions/BaseExpression.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace expressions { | 
				
			|||
        BaseExpression::BaseExpression() : returnType(undefined) { | 
				
			|||
            // Intentionally left empty.
 | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        BaseExpression::BaseExpression(ExpressionReturnType returnType) : returnType(returnType) { | 
				
			|||
            // Intentionally left empty.
 | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        ExpressionReturnType BaseExpression::getReturnType() const { | 
				
			|||
            return this->returnType; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        void BaseExpression::checkType(ExpressionReturnType actualType, ExpressionReturnType expectedType, std::string const& errorMessage) const { | 
				
			|||
            if (actualType != expectedType) { | 
				
			|||
                throw storm::exceptions::InvalidArgumentException() << errorMessage; | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,17 @@ | 
				
			|||
#include <map>
 | 
				
			|||
#include <unordered_map>
 | 
				
			|||
 | 
				
			|||
#include "src/storage/expressions/SubstitutionVisitor.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace expressions  { | 
				
			|||
        template<template<typename... Arguments> class MapType> | 
				
			|||
        Expression SubstitutionVisitor::substitute(BaseExpression const* expression, MapType<std::string, Expression> const& identifierToExpressionMap) { | 
				
			|||
            return Expression(); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        // Explicitly instantiate substitute with map and unordered_map.
 | 
				
			|||
        template Expression SubstitutionVisitor::substitute<std::map>(BaseExpression const* expression, std::map<std::string, Expression> const& identifierToExpressionMap); | 
				
			|||
        template Expression SubstitutionVisitor::substitute<std::unordered_map>(BaseExpression const* expression, std::unordered_map<std::string, Expression> const& identifierToExpressionMap); | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,56 @@ | 
				
			|||
#include "src/storage/expressions/VariableExpression.h"
 | 
				
			|||
#include "src/exceptions/ExceptionMacros.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace expressions { | 
				
			|||
        VariableExpression::VariableExpression(ExpressionReturnType returnType, std::string const& variableName) : BaseExpression(returnType), variableName(variableName) { | 
				
			|||
            // Intentionally left empty.
 | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        std::string const& VariableExpression::getVariableName() const { | 
				
			|||
            return this->variableName; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        int_fast64_t VariableExpression::evaluateAsInt(Valuation const& evaluation) const { | 
				
			|||
            LOG_ASSERT((this->getReturnType() == ExpressionReturnType::int_), "Cannot evaluate expression as integer: return type is not an integer."); | 
				
			|||
            return evaluation.getIntegerValue(this->getVariableName()); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        bool VariableExpression::evaluateAsBool(Valuation const& evaluation) const { | 
				
			|||
            LOG_ASSERT((this->getReturnType() == ExpressionReturnType::bool_), "Cannot evaluate expression as integer: return type is not an integer."); | 
				
			|||
            return evaluation.getBooleanValue(this->getVariableName()); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        double VariableExpression::evaluateAsDouble(Valuation const& evaluation) const { | 
				
			|||
            LOG_ASSERT((this->getReturnType() == ExpressionReturnType::double_), "Cannot evaluate expression as integer: return type is not an integer."); | 
				
			|||
            return evaluation.getDoubleValue(this->getVariableName()); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        std::unique_ptr<BaseExpression> VariableExpression::operator+(BaseExpression const& other) const { | 
				
			|||
            // FIXME
 | 
				
			|||
            return nullptr; | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        std::unique_ptr<BaseExpression> operator-(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> operator-() const; | 
				
			|||
        std::unique_ptr<BaseExpression> operator*(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> operator/(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> operator&(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> operator|(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> operator~() const; | 
				
			|||
         | 
				
			|||
        std::unique_ptr<BaseExpression> equals(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> notEquals(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> greater(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> greaterOrEqual(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> less(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> lessOrEqual(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> minimum(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> maximum(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> mod(BaseExpression const& other) const; | 
				
			|||
        std::unique_ptr<BaseExpression> floor() const; | 
				
			|||
        std::unique_ptr<BaseExpression> ceil() const; | 
				
			|||
         | 
				
			|||
        void visit(ExpressionVisitor* visitor) const; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,47 @@ | 
				
			|||
#ifndef STORM_STORAGE_EXPRESSIONS_VARIABLEEXPRESSION_H_ | 
				
			|||
#define STORM_STORAGE_EXPRESSIONS_VARIABLEEXPRESSION_H_ | 
				
			|||
 | 
				
			|||
#include "src/storage/expressions/BaseExpression.h" | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace expressions { | 
				
			|||
        class VariableExpression : public BaseExpression { | 
				
			|||
            VariableExpression(ExpressionReturnType returnType, std::string const& variableName); | 
				
			|||
            virtual ~VariableExpression() = default; | 
				
			|||
             | 
				
			|||
            std::string const& getVariableName() const; | 
				
			|||
             | 
				
			|||
            virtual int_fast64_t evaluateAsInt(Valuation const& evaluation) const; | 
				
			|||
            virtual bool evaluateAsBool(Valuation const& evaluation) const; | 
				
			|||
            virtual double evaluateAsDouble(Valuation const& evaluation) const; | 
				
			|||
             | 
				
			|||
            virtual std::unique_ptr<BaseExpression> operator+(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> operator-(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> operator-() const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> operator*(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> operator/(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> operator&(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> operator|(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> operator~() const; | 
				
			|||
             | 
				
			|||
            virtual std::unique_ptr<BaseExpression> equals(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> notEquals(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> greater(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> greaterOrEqual(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> less(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> lessOrEqual(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> minimum(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> maximum(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> mod(BaseExpression const& other) const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> floor() const; | 
				
			|||
            virtual std::unique_ptr<BaseExpression> ceil() const; | 
				
			|||
             | 
				
			|||
            virtual void visit(ExpressionVisitor* visitor) const; | 
				
			|||
             | 
				
			|||
        private: | 
				
			|||
            std::string variableName; | 
				
			|||
        }; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
#endif /* STORM_STORAGE_EXPRESSIONS_VARIABLEEXPRESSION_H_ */ | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue