2019-05-24 17:14:30 +00:00
|
|
|
|
|
|
|
#include "NumericEvalValue.hpp"
|
|
|
|
|
2019-06-17 16:35:12 +00:00
|
|
|
namespace Porygon::Evaluation {
|
2019-09-07 08:57:09 +00:00
|
|
|
EvalValue *NumericEvalValue::BinaryOperation(Binder::BoundBinaryOperation operation, const EvalValue *b) const {
|
|
|
|
auto right = dynamic_cast<const NumericEvalValue*>(b);
|
|
|
|
if (_isFloat){
|
|
|
|
double v1 = std::get<double >(_floatValue);
|
|
|
|
if (right->_isFloat){
|
|
|
|
double v2 =std::get<double >(right->_floatValue);
|
|
|
|
switch (operation){
|
|
|
|
|
|
|
|
case Binder::BoundBinaryOperation::Addition: return new NumericEvalValue(v1 + v2);
|
|
|
|
case Binder::BoundBinaryOperation::Subtraction: return new NumericEvalValue(v1 - v2);
|
|
|
|
case Binder::BoundBinaryOperation::Multiplication: return new NumericEvalValue(v1 * v2);
|
|
|
|
case Binder::BoundBinaryOperation::Division: return new NumericEvalValue(v1 / v2);
|
|
|
|
case Binder::BoundBinaryOperation::Equality: return new BooleanEvalValue(v1 == v2);
|
|
|
|
case Binder::BoundBinaryOperation::Inequality: return new BooleanEvalValue(v1 != v2);
|
|
|
|
case Binder::BoundBinaryOperation::LessThan: return new BooleanEvalValue(v1 < v2);
|
|
|
|
case Binder::BoundBinaryOperation::LessThanEquals: return new BooleanEvalValue(v1 <= v2);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThan: return new BooleanEvalValue(v1 > v2);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThanEquals: return new BooleanEvalValue(v1 >= v2);
|
|
|
|
default: throw exception();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
int64_t v2 = std::get<int64_t >(right->_intValue);
|
|
|
|
switch (operation){
|
|
|
|
|
|
|
|
case Binder::BoundBinaryOperation::Addition: return new NumericEvalValue(v1 + v2);
|
|
|
|
case Binder::BoundBinaryOperation::Subtraction: return new NumericEvalValue(v1 - v2);
|
|
|
|
case Binder::BoundBinaryOperation::Multiplication: return new NumericEvalValue(v1 * v2);
|
|
|
|
case Binder::BoundBinaryOperation::Division: return new NumericEvalValue(v1 / v2);
|
|
|
|
case Binder::BoundBinaryOperation::Equality: return new BooleanEvalValue(v1 == v2);
|
|
|
|
case Binder::BoundBinaryOperation::Inequality: return new BooleanEvalValue(v1 != v2);
|
|
|
|
case Binder::BoundBinaryOperation::LessThan: return new BooleanEvalValue(v1 < v2);
|
|
|
|
case Binder::BoundBinaryOperation::LessThanEquals: return new BooleanEvalValue(v1 <= v2);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThan: return new BooleanEvalValue(v1 > v2);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThanEquals: return new BooleanEvalValue(v1 >= v2);
|
|
|
|
default: throw exception();
|
|
|
|
}
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
2019-05-25 10:51:39 +00:00
|
|
|
}
|
2019-09-07 08:57:09 +00:00
|
|
|
else{
|
|
|
|
int64_t v1 = std::get<int64_t >(_intValue);
|
|
|
|
if (right->_isFloat){
|
|
|
|
double v2 =std::get<double>(right->_floatValue);;
|
|
|
|
switch (operation){
|
2019-05-24 17:14:30 +00:00
|
|
|
|
2019-09-07 08:57:09 +00:00
|
|
|
case Binder::BoundBinaryOperation::Addition: return new NumericEvalValue(v1 + v2);
|
|
|
|
case Binder::BoundBinaryOperation::Subtraction: return new NumericEvalValue(v1 - v2);
|
|
|
|
case Binder::BoundBinaryOperation::Multiplication: return new NumericEvalValue(v1 * v2);
|
|
|
|
case Binder::BoundBinaryOperation::Division: return new NumericEvalValue(v1 / v2);
|
|
|
|
case Binder::BoundBinaryOperation::Equality: return new BooleanEvalValue(v1 == v2);
|
|
|
|
case Binder::BoundBinaryOperation::Inequality: return new BooleanEvalValue(v1 != v2);
|
|
|
|
case Binder::BoundBinaryOperation::LessThan: return new BooleanEvalValue(v1 < v2);
|
|
|
|
case Binder::BoundBinaryOperation::LessThanEquals: return new BooleanEvalValue(v1 <= v2);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThan: return new BooleanEvalValue(v1 > v2);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThanEquals: return new BooleanEvalValue(v1 >= v2);
|
|
|
|
default: throw exception();
|
|
|
|
}
|
|
|
|
} else{
|
|
|
|
int64_t v2 = std::get<int64_t >(right->_intValue);
|
|
|
|
switch (operation){
|
|
|
|
|
|
|
|
case Binder::BoundBinaryOperation::Addition: return new NumericEvalValue(v1 + v2);
|
|
|
|
case Binder::BoundBinaryOperation::Subtraction: return new NumericEvalValue(v1 - v2);
|
|
|
|
case Binder::BoundBinaryOperation::Multiplication: return new NumericEvalValue(v1 * v2);
|
|
|
|
case Binder::BoundBinaryOperation::Division: return new NumericEvalValue(v1 / v2);
|
|
|
|
case Binder::BoundBinaryOperation::Equality: return new BooleanEvalValue(v1 == v2);
|
|
|
|
case Binder::BoundBinaryOperation::Inequality: return new BooleanEvalValue(v1 != v2);
|
|
|
|
case Binder::BoundBinaryOperation::LessThan: return new BooleanEvalValue(v1 < v2);
|
|
|
|
case Binder::BoundBinaryOperation::LessThanEquals: return new BooleanEvalValue(v1 <= v2);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThan: return new BooleanEvalValue(v1 > v2);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThanEquals: return new BooleanEvalValue(v1 >= v2);
|
|
|
|
default: throw exception();
|
|
|
|
}
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
2019-05-25 10:51:39 +00:00
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
|
2019-09-07 08:57:09 +00:00
|
|
|
EvalValue *NumericEvalValue::Cast(shared_ptr<const ScriptType> castType) const {
|
|
|
|
if (castType->GetClass() == TypeClass::Number){
|
|
|
|
auto num = static_pointer_cast<const NumericScriptType>(castType);
|
2019-09-14 09:44:43 +00:00
|
|
|
if (num->IsFloat() && !this->_isFloat){
|
|
|
|
return new NumericEvalValue(static_cast<double>(std::get<int64_t >(_intValue)));
|
|
|
|
}
|
|
|
|
else if(!num->IsFloat() && this->_isFloat){
|
|
|
|
return new NumericEvalValue(static_cast<int64_t>(std::get<double >(_floatValue)));
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
2019-05-25 10:51:39 +00:00
|
|
|
}
|
2019-09-07 08:57:09 +00:00
|
|
|
return EvalValue::Cast(castType);
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
|
2019-09-07 08:57:09 +00:00
|
|
|
EvalValue *NumericEvalValue::Clone() const {
|
|
|
|
if (_isFloat)
|
|
|
|
return new NumericEvalValue(std::get<double >(_floatValue));
|
|
|
|
return new NumericEvalValue(std::get<int64_t >(_intValue));
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t NumericEvalValue::GetHashCode() const {
|
|
|
|
if (_isFloat)
|
|
|
|
return std::get<double >(_floatValue);
|
|
|
|
return std::get<int64_t >(_intValue);;
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
2019-05-25 11:57:43 +00:00
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
bool NumericEvalValue::operator==(const EvalValue *b) const {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (b->GetTypeClass() != TypeClass::Number)
|
|
|
|
return false;
|
2019-09-07 08:57:09 +00:00
|
|
|
auto right = dynamic_cast<const NumericEvalValue*>(b);
|
|
|
|
if (_isFloat != right->_isFloat)
|
2019-06-17 16:35:12 +00:00
|
|
|
return false;
|
2019-09-07 08:57:09 +00:00
|
|
|
if (_isFloat){
|
|
|
|
return _floatValue == right->_floatValue;
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
2019-09-07 08:57:09 +00:00
|
|
|
return _intValue == right->_intValue;
|
2019-05-25 11:57:43 +00:00
|
|
|
}
|
2019-06-08 13:38:08 +00:00
|
|
|
|
2019-09-07 08:57:09 +00:00
|
|
|
int64_t NumericEvalValue::EvaluateInteger() const {
|
|
|
|
return std::get<int64_t >(_intValue);;
|
2019-06-08 13:38:08 +00:00
|
|
|
}
|
|
|
|
|
2019-09-07 08:57:09 +00:00
|
|
|
double NumericEvalValue::EvaluateFloat() const {
|
|
|
|
if (!_isFloat)
|
|
|
|
return std::get<int64_t >(_intValue);
|
|
|
|
return std::get<double>(_floatValue);
|
2019-06-08 13:38:08 +00:00
|
|
|
}
|
|
|
|
|
2019-09-07 08:57:09 +00:00
|
|
|
u16string NumericEvalValue::EvaluateString() const {
|
|
|
|
if (_isFloat){
|
|
|
|
return Utilities::StringUtils::FloatToString(std::get<double >(_floatValue));
|
2019-07-27 15:59:42 +00:00
|
|
|
}
|
2019-09-07 08:57:09 +00:00
|
|
|
return Utilities::StringUtils::IntToString(std::get<int64_t >(_intValue));
|
2019-07-27 15:59:42 +00:00
|
|
|
}
|
2019-08-18 11:17:53 +00:00
|
|
|
|
2019-09-07 08:57:09 +00:00
|
|
|
EvalValue *NumericEvalValue::UnaryOperation(Binder::BoundUnaryOperation operation) const {
|
|
|
|
if (_isFloat){
|
|
|
|
return new NumericEvalValue(- std::get<double >(_floatValue));
|
2019-08-18 11:17:53 +00:00
|
|
|
}
|
2019-09-07 08:57:09 +00:00
|
|
|
return new NumericEvalValue(- std::get<int64_t >(_intValue));
|
2019-08-18 11:17:53 +00:00
|
|
|
}
|
|
|
|
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|