2019-05-24 17:14:30 +00:00
|
|
|
|
|
|
|
#include "NumericEvalValue.hpp"
|
|
|
|
|
|
|
|
NumericEvalValue *NumericEvalValue::operator+(NumericEvalValue *b) {
|
2019-05-25 10:51:39 +00:00
|
|
|
if (this->IsFloat()){
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new FloatEvalValue(this->GetFloatValue() + b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new FloatEvalValue(this->GetFloatValue() + b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new FloatEvalValue(this->GetIntegerValue() + b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new IntegerEvalValue(this->GetIntegerValue() + b->GetIntegerValue());
|
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NumericEvalValue *NumericEvalValue::operator-(NumericEvalValue *b) {
|
2019-05-25 10:51:39 +00:00
|
|
|
if (this->IsFloat()){
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new FloatEvalValue(this->GetFloatValue() - b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new FloatEvalValue(this->GetFloatValue() - b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new FloatEvalValue(this->GetIntegerValue() - b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new IntegerEvalValue(this->GetIntegerValue() - b->GetIntegerValue());
|
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NumericEvalValue *NumericEvalValue::operator*(NumericEvalValue *b) {
|
2019-05-25 10:51:39 +00:00
|
|
|
if (this->IsFloat()){
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new FloatEvalValue(this->GetFloatValue() * b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new FloatEvalValue(this->GetFloatValue() * b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new FloatEvalValue(this->GetIntegerValue() * b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new IntegerEvalValue(this->GetIntegerValue() * b->GetIntegerValue());
|
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NumericEvalValue *NumericEvalValue::operator/(NumericEvalValue *b) {
|
2019-05-25 10:51:39 +00:00
|
|
|
if (this->IsFloat()){
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new FloatEvalValue(this->GetFloatValue() / b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new FloatEvalValue(this->GetFloatValue() / b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new FloatEvalValue(this->GetIntegerValue() / b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new IntegerEvalValue(this->GetIntegerValue() / b->GetIntegerValue());
|
|
|
|
}
|
2019-05-24 17:14:30 +00:00
|
|
|
}
|
|
|
|
}
|
2019-05-25 11:57:43 +00:00
|
|
|
|
|
|
|
bool NumericEvalValue::operator==(EvalValue *b) {
|
|
|
|
if (b->GetType()->GetClass() != TypeClass::Number)
|
|
|
|
return false;
|
|
|
|
auto numVal = (NumericEvalValue*)b;
|
|
|
|
if (this->IsFloat() != numVal->IsFloat())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (this->IsFloat()){
|
|
|
|
return this->EvaluateFloat() == numVal->EvaluateFloat();
|
|
|
|
} else{
|
|
|
|
return this->EvaluateInteger() == numVal->EvaluateInteger();
|
|
|
|
}
|
|
|
|
}
|
2019-06-08 13:38:08 +00:00
|
|
|
|
|
|
|
BooleanEvalValue *NumericEvalValue::operator<(NumericEvalValue *b) {
|
|
|
|
if (this->IsFloat()){
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new BooleanEvalValue(this->GetFloatValue() < b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new BooleanEvalValue(this->GetFloatValue() < b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new BooleanEvalValue(this->GetIntegerValue() < b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new BooleanEvalValue(this->GetIntegerValue() < b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BooleanEvalValue *NumericEvalValue::operator<=(NumericEvalValue *b) {
|
|
|
|
if (this->IsFloat()){
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new BooleanEvalValue(this->GetFloatValue() <= b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new BooleanEvalValue(this->GetFloatValue() <= b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new BooleanEvalValue(this->GetIntegerValue() <= b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new BooleanEvalValue(this->GetIntegerValue() <= b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BooleanEvalValue *NumericEvalValue::operator>(NumericEvalValue *b) {
|
|
|
|
if (this->IsFloat()){
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new BooleanEvalValue(this->GetFloatValue() > b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new BooleanEvalValue(this->GetFloatValue() > b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new BooleanEvalValue(this->GetIntegerValue() > b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new BooleanEvalValue(this->GetIntegerValue() > b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BooleanEvalValue *NumericEvalValue::operator>=(NumericEvalValue *b) {
|
|
|
|
if (this->IsFloat()){
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new BooleanEvalValue(this->GetFloatValue() >= b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new BooleanEvalValue(this->GetFloatValue() >= b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (b->IsFloat()){
|
|
|
|
return new BooleanEvalValue(this->GetIntegerValue() >= b->GetFloatValue());
|
|
|
|
} else{
|
|
|
|
return new BooleanEvalValue(this->GetIntegerValue() >= b->GetIntegerValue());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|