#include "NumericEvalValue.hpp" const shared_ptr NumericEvalValue::operator+(const shared_ptr& b) const { if (this->IsFloat()){ if (b->IsFloat()){ return make_shared(this->GetFloatValue() + b->GetFloatValue()); } else{ return make_shared(this->GetFloatValue() + b->GetIntegerValue()); } } else { if (b->IsFloat()){ return make_shared(this->GetIntegerValue() + b->GetFloatValue()); } else{ return make_shared(this->GetIntegerValue() + b->GetIntegerValue()); } } } const shared_ptr NumericEvalValue::operator-(const shared_ptr& b) const { if (this->IsFloat()){ if (b->IsFloat()){ return make_shared(this->GetFloatValue() - b->GetFloatValue()); } else{ return make_shared(this->GetFloatValue() - b->GetIntegerValue()); } } else { if (b->IsFloat()){ return make_shared(this->GetIntegerValue() - b->GetFloatValue()); } else{ return make_shared(this->GetIntegerValue() - b->GetIntegerValue()); } } } const shared_ptr NumericEvalValue::operator*(const shared_ptr& b) const { if (this->IsFloat()){ if (b->IsFloat()){ return make_shared(this->GetFloatValue() * b->GetFloatValue()); } else{ return make_shared(this->GetFloatValue() * b->GetIntegerValue()); } } else { if (b->IsFloat()){ return make_shared(this->GetIntegerValue() * b->GetFloatValue()); } else{ return make_shared(this->GetIntegerValue() * b->GetIntegerValue()); } } } const shared_ptr NumericEvalValue::operator/(const shared_ptr& b) const { if (this->IsFloat()){ if (b->IsFloat()){ return make_shared(this->GetFloatValue() / b->GetFloatValue()); } else{ return make_shared(this->GetFloatValue() / b->GetIntegerValue()); } } else { if (b->IsFloat()){ return make_shared(this->GetIntegerValue() / b->GetFloatValue()); } else{ return make_shared(this->GetIntegerValue() / b->GetIntegerValue()); } } } const bool NumericEvalValue::operator==(EvalValue *b) const { if (b->GetTypeClass() != 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(); } } const shared_ptr NumericEvalValue::operator<(const shared_ptr& b) const { if (this->IsFloat()){ if (b->IsFloat()){ return make_shared(this->GetFloatValue() < b->GetFloatValue()); } else{ return make_shared(this->GetFloatValue() < b->GetIntegerValue()); } } else { if (b->IsFloat()){ return make_shared(this->GetIntegerValue() < b->GetFloatValue()); } else{ return make_shared(this->GetIntegerValue() < b->GetIntegerValue()); } } } const shared_ptr NumericEvalValue::operator<=(const shared_ptr& b) const { if (this->IsFloat()){ if (b->IsFloat()){ return make_shared(this->GetFloatValue() <= b->GetFloatValue()); } else{ return make_shared(this->GetFloatValue() <= b->GetIntegerValue()); } } else { if (b->IsFloat()){ return make_shared(this->GetIntegerValue() <= b->GetFloatValue()); } else{ return make_shared(this->GetIntegerValue() <= b->GetIntegerValue()); } } } const shared_ptr NumericEvalValue::operator>(const shared_ptr& b) const { if (this->IsFloat()){ if (b->IsFloat()){ return make_shared(this->GetFloatValue() > b->GetFloatValue()); } else{ return make_shared(this->GetFloatValue() > b->GetIntegerValue()); } } else { if (b->IsFloat()){ return make_shared(this->GetIntegerValue() > b->GetFloatValue()); } else{ return make_shared(this->GetIntegerValue() > b->GetIntegerValue()); } } } const shared_ptr NumericEvalValue::operator>=(const shared_ptr& b) const { if (this->IsFloat()){ if (b->IsFloat()){ return make_shared(this->GetFloatValue() >= b->GetFloatValue()); } else{ return make_shared(this->GetFloatValue() >= b->GetIntegerValue()); } } else { if (b->IsFloat()){ return make_shared(this->GetIntegerValue() >= b->GetFloatValue()); } else{ return make_shared(this->GetIntegerValue() >= b->GetIntegerValue()); } } }