#ifndef PORYGONLANG_NUMERICEVALVALUE_HPP #define PORYGONLANG_NUMERICEVALVALUE_HPP #include #include #include "EvalValue.hpp" #include "../../Utilities/StringUtils.hpp" namespace Porygon::Evaluation { class NumericEvalValue : public EvalValue { std::variant _intValue, _floatValue; bool _isFloat; public: explicit NumericEvalValue(int64_t i) : _intValue(i), _isFloat(false) {} explicit NumericEvalValue(int32_t i) : _intValue(static_cast(i)), _isFloat(false) {} explicit NumericEvalValue(double d) : _floatValue(d), _isFloat(true) {} explicit NumericEvalValue(float f) : _floatValue(f), _isFloat(true) {} [[nodiscard]] virtual bool IsFloat() const{ return _isFloat; } [[nodiscard]] inline TypeClass GetTypeClass() const final { return TypeClass::Number; } bool operator==(const EvalValue *b) const final; bool operator!=(const EvalValue *b) const override { return !operator==(b); } [[nodiscard]] EvalValue *Clone() const override; [[nodiscard]] size_t GetHashCode() const override; [[nodiscard]] EvalValue* Cast(shared_ptr castType) const final; [[nodiscard]] int64_t EvaluateInteger() const override; [[nodiscard]] double EvaluateFloat() const override; [[nodiscard]] u16string EvaluateString() const override; [[nodiscard]] EvalValue *BinaryOperation(Binder::BoundBinaryOperation operation, const EvalValue *b) const final; [[nodiscard]] EvalValue *UnaryOperation(Binder::BoundUnaryOperation operation) const override; }; } #endif //PORYGONLANG_NUMERICEVALVALUE_HPP