#include "NumericEvalValue.hpp" namespace Porygon::Evaluation { 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 = dynamic_cast(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()); } } } }