#include "src/storage/expressions/IntegerLiteralExpression.h"

#include "ExpressionVisitor.h"
#include "src/storage/expressions/ExpressionManager.h"

namespace storm {
    namespace expressions {
        IntegerLiteralExpression::IntegerLiteralExpression(ExpressionManager const& manager, int_fast64_t value) : BaseExpression(manager, manager.getIntegerType()), value(value) {
            // Intentionally left empty.
        }
        
        int_fast64_t IntegerLiteralExpression::evaluateAsInt(Valuation const* valuation) const {
            return this->getValue();
        }
        
        double IntegerLiteralExpression::evaluateAsDouble(Valuation const* valuation) const {
            return static_cast<double>(this->evaluateAsInt(valuation));
        }
        
        bool IntegerLiteralExpression::isLiteral() const {
            return true;
		}

        void IntegerLiteralExpression::gatherVariables(std::set<storm::expressions::Variable>& variables) const {
			return;
		}

        std::shared_ptr<BaseExpression const> IntegerLiteralExpression::simplify() const {
            return this->shared_from_this();
        }
        
        boost::any IntegerLiteralExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const {
            return visitor.visit(*this, data);
        }
        
        int_fast64_t IntegerLiteralExpression::getValue() const {
            return this->value;
        }
        
        void IntegerLiteralExpression::printToStream(std::ostream& stream) const {
            stream << this->getValue();
        }
    }
}