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

#include "src/utility/constants.h"

namespace storm {
    namespace expressions {
        RationalLiteralExpression::RationalLiteralExpression(ExpressionManager const& manager, double value) : BaseExpression(manager, manager.getRationalType()), value(storm::utility::convertNumber<storm::RationalNumber>(value)) {
            // Intentionally left empty.
        }
        
        RationalLiteralExpression::RationalLiteralExpression(ExpressionManager const& manager, std::string const& valueAsString) : BaseExpression(manager, manager.getRationalType()), value(storm::utility::convertNumber<storm::RationalNumber>(valueAsString)) {
            // Intentionally left empty.
        }
        
        RationalLiteralExpression::RationalLiteralExpression(ExpressionManager const& manager, storm::RationalNumber const& value) : BaseExpression(manager, manager.getRationalType()), value(value) {
            // Intentionally left empty.
        }
        
        double RationalLiteralExpression::evaluateAsDouble(Valuation const* valuation) const {
            return this->getValueAsDouble();
        }
        
        bool RationalLiteralExpression::isLiteral() const {
            return true;
        }
        
        void RationalLiteralExpression::gatherVariables(std::set<storm::expressions::Variable>& variables) const {
            return;
		}
        
        std::shared_ptr<BaseExpression const> RationalLiteralExpression::simplify() const {
            return this->shared_from_this();
        }
        
        boost::any RationalLiteralExpression::accept(ExpressionVisitor& visitor, boost::any const& data) const {
            return visitor.visit(*this, data);
        }
        
        double RationalLiteralExpression::getValueAsDouble() const {
            return storm::utility::convertNumber<double>(this->value);
        }
        
        storm::RationalNumber RationalLiteralExpression::getValue() const {
            return this->value;
        }
        
        void RationalLiteralExpression::printToStream(std::ostream& stream) const {
            stream << this->getValue();
        }
    }
}