2019-05-24 17:14:30 +00:00
|
|
|
|
|
|
|
#include "NumericEvalValue.hpp"
|
|
|
|
|
2019-06-17 16:35:12 +00:00
|
|
|
namespace Porygon::Evaluation {
|
2019-07-25 15:23:54 +00:00
|
|
|
shared_ptr<const NumericEvalValue> NumericEvalValue::operator+(const shared_ptr<const NumericEvalValue> &b) const {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat()) {
|
|
|
|
if (b->IsFloat()) {
|
|
|
|
return make_shared<FloatEvalValue>(this->GetFloatValue() + b->GetFloatValue());
|
|
|
|
} else {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<FloatEvalValue>(this->GetFloatValue() + (double) b->GetIntegerValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()) {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<FloatEvalValue>((double) this->GetIntegerValue() + b->GetFloatValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
} else {
|
|
|
|
return make_shared<IntegerEvalValue>(this->GetIntegerValue() + b->GetIntegerValue());
|
|
|
|
}
|
2019-05-25 10:51:39 +00:00
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
shared_ptr<const NumericEvalValue> NumericEvalValue::operator-(const shared_ptr<const NumericEvalValue> &b) const {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat()) {
|
|
|
|
if (b->IsFloat()) {
|
|
|
|
return make_shared<FloatEvalValue>(this->GetFloatValue() - b->GetFloatValue());
|
|
|
|
} else {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<FloatEvalValue>(this->GetFloatValue() - (double) b->GetIntegerValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()) {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<FloatEvalValue>((double) this->GetIntegerValue() - b->GetFloatValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
} else {
|
|
|
|
return make_shared<IntegerEvalValue>(this->GetIntegerValue() - b->GetIntegerValue());
|
|
|
|
}
|
2019-05-25 10:51:39 +00:00
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
shared_ptr<const NumericEvalValue> NumericEvalValue::operator*(const shared_ptr<const NumericEvalValue> &b) const {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat()) {
|
|
|
|
if (b->IsFloat()) {
|
|
|
|
return make_shared<FloatEvalValue>(this->GetFloatValue() * b->GetFloatValue());
|
|
|
|
} else {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<FloatEvalValue>(this->GetFloatValue() * (double) b->GetIntegerValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()) {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<FloatEvalValue>((double) this->GetIntegerValue() * b->GetFloatValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
} else {
|
|
|
|
return make_shared<IntegerEvalValue>(this->GetIntegerValue() * b->GetIntegerValue());
|
|
|
|
}
|
2019-05-25 10:51:39 +00:00
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
shared_ptr<const NumericEvalValue> NumericEvalValue::operator/(const shared_ptr<const NumericEvalValue> &b) const {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat()) {
|
|
|
|
if (b->IsFloat()) {
|
|
|
|
return make_shared<FloatEvalValue>(this->GetFloatValue() / b->GetFloatValue());
|
|
|
|
} else {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<FloatEvalValue>(this->GetFloatValue() / (double) b->GetIntegerValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()) {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<FloatEvalValue>((double) this->GetIntegerValue() / b->GetFloatValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
} else {
|
|
|
|
return make_shared<IntegerEvalValue>(this->GetIntegerValue() / b->GetIntegerValue());
|
|
|
|
}
|
2019-05-25 10:51:39 +00:00
|
|
|
}
|
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-07-25 15:23:54 +00:00
|
|
|
auto numVal = dynamic_cast<const NumericEvalValue*>(b);
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat() != numVal->IsFloat())
|
|
|
|
return false;
|
2019-05-25 11:57:43 +00:00
|
|
|
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat()) {
|
|
|
|
return this->EvaluateFloat() == numVal->EvaluateFloat();
|
|
|
|
} else {
|
|
|
|
return this->EvaluateInteger() == numVal->EvaluateInteger();
|
|
|
|
}
|
2019-05-25 11:57:43 +00:00
|
|
|
}
|
2019-06-08 13:38:08 +00:00
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
shared_ptr<const BooleanEvalValue> NumericEvalValue::operator<(const shared_ptr<const NumericEvalValue> &b) const {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat()) {
|
|
|
|
if (b->IsFloat()) {
|
|
|
|
return make_shared<BooleanEvalValue>(this->GetFloatValue() < b->GetFloatValue());
|
|
|
|
} else {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<BooleanEvalValue>(this->GetFloatValue() < (double) b->GetIntegerValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()) {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<BooleanEvalValue>((double) this->GetIntegerValue() < b->GetFloatValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
} else {
|
|
|
|
return make_shared<BooleanEvalValue>(this->GetIntegerValue() < b->GetIntegerValue());
|
|
|
|
}
|
2019-06-08 13:38:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
shared_ptr<const BooleanEvalValue> NumericEvalValue::operator<=(const shared_ptr<const NumericEvalValue> &b) const {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat()) {
|
|
|
|
if (b->IsFloat()) {
|
|
|
|
return make_shared<BooleanEvalValue>(this->GetFloatValue() <= b->GetFloatValue());
|
|
|
|
} else {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<BooleanEvalValue>(this->GetFloatValue() <=(double) b->GetIntegerValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()) {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<BooleanEvalValue>((double) this->GetIntegerValue() <= b->GetFloatValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
} else {
|
|
|
|
return make_shared<BooleanEvalValue>(this->GetIntegerValue() <= b->GetIntegerValue());
|
|
|
|
}
|
2019-06-08 13:38:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
shared_ptr<const BooleanEvalValue> NumericEvalValue::operator>(const shared_ptr<const NumericEvalValue> &b) const {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat()) {
|
|
|
|
if (b->IsFloat()) {
|
|
|
|
return make_shared<BooleanEvalValue>(this->GetFloatValue() > b->GetFloatValue());
|
|
|
|
} else {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<BooleanEvalValue>(this->GetFloatValue() > (double) b->GetIntegerValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()) {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<BooleanEvalValue>((double) this->GetIntegerValue() > b->GetFloatValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
} else {
|
|
|
|
return make_shared<BooleanEvalValue>(this->GetIntegerValue() > b->GetIntegerValue());
|
|
|
|
}
|
2019-06-08 13:38:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-25 15:23:54 +00:00
|
|
|
shared_ptr<const BooleanEvalValue> NumericEvalValue::operator>=(const shared_ptr<const NumericEvalValue> &b) const {
|
2019-06-17 16:35:12 +00:00
|
|
|
if (this->IsFloat()) {
|
|
|
|
if (b->IsFloat()) {
|
|
|
|
return make_shared<BooleanEvalValue>(this->GetFloatValue() >= b->GetFloatValue());
|
|
|
|
} else {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<BooleanEvalValue>(this->GetFloatValue() >= (double) b->GetIntegerValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()) {
|
2019-07-25 15:23:54 +00:00
|
|
|
return make_shared<BooleanEvalValue>((double) this->GetIntegerValue() >= b->GetFloatValue());
|
2019-06-17 16:35:12 +00:00
|
|
|
} else {
|
|
|
|
return make_shared<BooleanEvalValue>(this->GetIntegerValue() >= b->GetIntegerValue());
|
|
|
|
}
|
2019-06-08 13:38:08 +00:00
|
|
|
}
|
|
|
|
}
|
2019-07-27 15:59:42 +00:00
|
|
|
|
|
|
|
EvalValue *IntegerEvalValue::BinaryOperation(Binder::BoundBinaryOperation operation, const EvalValue *b) const {
|
|
|
|
auto right = dynamic_cast<const NumericEvalValue*>(b);
|
|
|
|
if (right->IsFloat()){
|
|
|
|
auto rightVal = right->EvaluateFloat();
|
|
|
|
switch (operation){
|
|
|
|
case Binder::BoundBinaryOperation::Addition: return new FloatEvalValue((double)_value + rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::Subtraction: return new FloatEvalValue((double)_value - rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::Multiplication: return new FloatEvalValue((double)_value * rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::Division: return new FloatEvalValue((double)_value / rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::LessThan: return new BooleanEvalValue((double)_value < rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::LessThanEquals: return new BooleanEvalValue((double)_value <= rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThan: return new BooleanEvalValue((double)_value > rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThanEquals: return new BooleanEvalValue((double)_value >= rightVal);
|
|
|
|
default:
|
|
|
|
throw;
|
|
|
|
}
|
|
|
|
} else{
|
|
|
|
auto rightVal = right->EvaluateInteger();
|
|
|
|
switch (operation){
|
|
|
|
case Binder::BoundBinaryOperation::Addition: return new IntegerEvalValue(_value + rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::Subtraction: return new IntegerEvalValue(_value - rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::Multiplication: return new IntegerEvalValue(_value * rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::Division: return new IntegerEvalValue(_value / rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::LessThan: return new BooleanEvalValue(_value < rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::LessThanEquals: return new BooleanEvalValue(_value <= rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThan: return new BooleanEvalValue(_value > rightVal);
|
|
|
|
case Binder::BoundBinaryOperation::GreaterThanEquals: return new BooleanEvalValue(_value >= rightVal);
|
|
|
|
default:
|
|
|
|
throw;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-06-17 16:35:12 +00:00
|
|
|
}
|