Value operator/(const Value& v1, const Value& v2) { boost::scoped_ptr<NumericPairBase> nbp(promoteNumeric(v1, v2)); if (nbp) return nbp->div(); return Value(); }
bool operator>=(const Value& v1, const Value& v2) { boost::scoped_ptr<NumericPairBase> nbp(promoteNumeric(v1, v2)); if (nbp) return nbp->ge(); return false; }
bool operator>(Value v1, Value v2) { promoteNumeric(v1, v2); switch (v1.type) { case Value::T_EXACT: return v1.i > v2.i; case Value::T_INEXACT: return v1.x > v2.x; default: break; } return false; }
Value operator/(Value v1, Value v2) { promoteNumeric(v1, v2); switch (v1.type) { case Value::T_EXACT: return v1.i / v2.i; case Value::T_INEXACT: return v1.x / v2.x; default: break; } return Value(); }
bool operator!=(const Value& v1, const Value& v2) { boost::scoped_ptr<NumericPairBase> nbp(promoteNumeric(v1, v2)); if (nbp) return nbp->ne(); if (v1.type != v2.type) return false; switch (v1.type) { case Value::T_BOOL: return v1.b != v2.b; case Value::T_STRING: return *v1.s != *v2.s; default: // Cannot ever get here return false; } }
bool operator!=(Value v1, Value v2) { promoteNumeric(v1, v2); if (!sameType(v1,v2)) return false; switch (v1.type) { case Value::T_BOOL: return v1.b != v2.b; case Value::T_STRING: return *v1.s != *v2.s; case Value::T_EXACT: return v1.i != v2.i; case Value::T_INEXACT: return v1.x != v2.x; default: return false; } }