#ifndef PORYGONLANG_EVALVALUE_HPP #define PORYGONLANG_EVALVALUE_HPP #include "../../ScriptType.hpp" #include "../EvaluationException.hpp" #include #include #include class EvalValue{ public: EvalValue() = default; virtual ~EvalValue() = default; virtual std::shared_ptr GetType() = 0; virtual bool operator ==(EvalValue* b) = 0; virtual bool operator !=(EvalValue*b){ return ! (this->operator==(b)); } virtual shared_ptr Clone() = 0; virtual long EvaluateInteger(){ throw EvaluationException("Can't evaluate this EvalValue as integer."); } virtual double EvaluateFloat(){ throw EvaluationException("Can't evaluate this EvalValue as float."); } virtual bool EvaluateBool(){ throw EvaluationException("Can't evaluate this EvalValue as bool."); } virtual std::string EvaluateString(){ throw EvaluationException("Can't evaluate this EvalValue as string."); } }; class BooleanEvalValue : public EvalValue{ bool _value; std::shared_ptr _type; public: explicit BooleanEvalValue(bool val){ _value = val; _type = std::make_shared(TypeClass::Bool); } shared_ptr Clone() final{ return make_shared(_value); } std::shared_ptr GetType() final{ return _type; }; bool EvaluateBool() final{ return _value; } bool operator ==(EvalValue* b) final{ if (b->GetType()->GetClass() != TypeClass::Bool) return false; return this->EvaluateBool() == b->EvaluateBool(); }; std::string EvaluateString() final{ std::ostringstream strs; strs << _value; return strs.str(); } }; #endif //PORYGONLANG_EVALVALUE_HPP