#ifndef STORM_STORAGE_EXPRESSIONS_EXPRESSIONVISITOR_H_
#define STORM_STORAGE_EXPRESSIONS_EXPRESSIONVISITOR_H_

#include <boost/any.hpp>
#include <boost/none.hpp>

namespace storm {
    namespace expressions {
        // Forward-declare all expression classes.
        class IfThenElseExpression;
        class BinaryBooleanFunctionExpression;
        class BinaryNumericalFunctionExpression;
        class BinaryRelationExpression;
        class VariableExpression;
        class UnaryBooleanFunctionExpression;
        class UnaryNumericalFunctionExpression;
        class BooleanLiteralExpression;
        class IntegerLiteralExpression;
        class RationalLiteralExpression;
        
        class ExpressionVisitor {
        public:
            virtual ~ExpressionVisitor() = default;

            virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) = 0;
            virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) = 0;
            virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) = 0;
            virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) = 0;
            virtual boost::any visit(VariableExpression const& expression, boost::any const& data) = 0;
            virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) = 0;
            virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) = 0;
            virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) = 0;
            virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) = 0;
            virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) = 0;
        };
    }
}

#endif /* STORM_STORAGE_EXPRESSIONS_EXPRESSIONVISITOR_H_ */