#include "NumericEvalValue.hpp" NumericEvalValue *NumericEvalValue::operator+(NumericEvalValue *b) { 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()); } } } NumericEvalValue *NumericEvalValue::operator-(NumericEvalValue *b) { 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()); } } } NumericEvalValue *NumericEvalValue::operator*(NumericEvalValue *b) { 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()); } } } NumericEvalValue *NumericEvalValue::operator/(NumericEvalValue *b) { 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()); } } } 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(); } } 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()); } } }