2019-05-24 17:14:30 +00:00
|
|
|
|
|
|
|
#ifndef PORYGONLANG_NUMERICEVALVALUE_HPP
|
|
|
|
#define PORYGONLANG_NUMERICEVALVALUE_HPP
|
|
|
|
|
2019-05-25 14:15:20 +00:00
|
|
|
#include <sstream>
|
2019-05-24 17:14:30 +00:00
|
|
|
#include "EvalValue.hpp"
|
|
|
|
|
|
|
|
class NumericEvalValue : public EvalValue{
|
|
|
|
|
|
|
|
virtual long GetIntegerValue() = 0;
|
|
|
|
virtual double GetFloatValue() = 0;
|
|
|
|
|
|
|
|
public:
|
|
|
|
virtual const bool IsFloat() = 0;
|
2019-06-13 14:26:10 +00:00
|
|
|
|
|
|
|
const TypeClass GetTypeClass() final{
|
|
|
|
return TypeClass ::Number;
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
NumericEvalValue* operator +(NumericEvalValue* b);
|
|
|
|
NumericEvalValue* operator -(NumericEvalValue* b);
|
|
|
|
NumericEvalValue* operator *(NumericEvalValue* b);
|
|
|
|
NumericEvalValue* operator /(NumericEvalValue* b);
|
2019-06-08 13:38:08 +00:00
|
|
|
BooleanEvalValue* operator <(NumericEvalValue* b);
|
|
|
|
BooleanEvalValue* operator <=(NumericEvalValue* b);
|
|
|
|
BooleanEvalValue* operator >(NumericEvalValue* b);
|
|
|
|
BooleanEvalValue* operator >=(NumericEvalValue* b);
|
2019-05-25 11:57:43 +00:00
|
|
|
bool operator ==(EvalValue* b) final;
|
2019-05-24 17:14:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class IntegerEvalValue : public NumericEvalValue{
|
|
|
|
long _value;
|
|
|
|
long GetIntegerValue() final{return _value;}
|
|
|
|
double GetFloatValue() final{ throw EvaluationException("Attempting to retrieve float from int eval value."); }
|
|
|
|
public:
|
|
|
|
explicit IntegerEvalValue(long value){
|
|
|
|
_value = value;
|
|
|
|
}
|
|
|
|
const bool IsFloat() final{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-06-14 15:12:27 +00:00
|
|
|
long EvaluateInteger() const final{
|
2019-05-24 17:14:30 +00:00
|
|
|
return _value;
|
|
|
|
}
|
2019-05-25 14:15:20 +00:00
|
|
|
|
2019-06-01 19:38:39 +00:00
|
|
|
shared_ptr<EvalValue> Clone() final{
|
|
|
|
return make_shared<IntegerEvalValue>(_value);
|
2019-05-30 13:23:48 +00:00
|
|
|
}
|
2019-06-09 18:15:09 +00:00
|
|
|
|
|
|
|
std::size_t GetHashCode() final{
|
|
|
|
return std::hash<long>{}(_value);
|
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class FloatEvalValue : public NumericEvalValue{
|
|
|
|
double _value;
|
|
|
|
long GetIntegerValue() final{ throw EvaluationException("Attempting to retrieve float from int eval value."); }
|
|
|
|
double GetFloatValue() final{return _value;}
|
|
|
|
public:
|
|
|
|
explicit FloatEvalValue(double value){
|
|
|
|
_value = value;
|
|
|
|
}
|
|
|
|
const bool IsFloat() final{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2019-06-14 15:12:27 +00:00
|
|
|
double EvaluateFloat() const final{
|
2019-05-24 17:14:30 +00:00
|
|
|
return _value;
|
|
|
|
}
|
2019-05-25 14:15:20 +00:00
|
|
|
|
2019-06-01 19:38:39 +00:00
|
|
|
shared_ptr<EvalValue> Clone() final{
|
|
|
|
return make_shared<FloatEvalValue>(_value);
|
2019-05-30 13:23:48 +00:00
|
|
|
}
|
2019-06-09 18:15:09 +00:00
|
|
|
|
|
|
|
std::size_t GetHashCode() final{
|
|
|
|
return std::hash<double >{}(_value);
|
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif //PORYGONLANG_NUMERICEVALVALUE_HPP
|