From 3afad7a96db9847449a07be8de098cfa2a106003 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sat, 22 Mar 2014 08:40:35 +0100 Subject: [PATCH] Implement comparison operators for operands of different types. Refs #5846 --- lib/base/value-operators.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/base/value-operators.cpp b/lib/base/value-operators.cpp index e5bccd933..234b27b77 100644 --- a/lib/base/value-operators.cpp +++ b/lib/base/value-operators.cpp @@ -440,6 +440,8 @@ Value icinga::operator<(const Value& lhs, const Value& rhs) return static_cast(lhs) < static_cast(rhs); else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) return static_cast(lhs) < static_cast(rhs); + else if (lhs.GetTypeName() != rhs.GetTypeName()) + return lhs.GetTypeName() < rhs.GetTypeName(); else BOOST_THROW_EXCEPTION(std::invalid_argument("Operator < cannot be applied to values of type '" + lhs.GetTypeName() + "' and '" + rhs.GetTypeName() + "'")); } @@ -470,6 +472,8 @@ Value icinga::operator>(const Value& lhs, const Value& rhs) return static_cast(lhs) > static_cast(rhs); else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) return static_cast(lhs) > static_cast(rhs); + else if (lhs.GetTypeName() != rhs.GetTypeName()) + return lhs.GetTypeName() > rhs.GetTypeName(); else BOOST_THROW_EXCEPTION(std::invalid_argument("Operator > cannot be applied to values of type '" + lhs.GetTypeName() + "' and '" + rhs.GetTypeName() + "'")); } @@ -500,6 +504,8 @@ Value icinga::operator<=(const Value& lhs, const Value& rhs) return static_cast(lhs) <= static_cast(rhs); else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) return static_cast(lhs) <= static_cast(rhs); + else if (lhs.GetTypeName() != rhs.GetTypeName()) + return lhs.GetTypeName() <= rhs.GetTypeName(); else BOOST_THROW_EXCEPTION(std::invalid_argument("Operator <= cannot be applied to values of type '" + lhs.GetTypeName() + "' and '" + rhs.GetTypeName() + "'")); } @@ -530,6 +536,8 @@ Value icinga::operator>=(const Value& lhs, const Value& rhs) return static_cast(lhs) >= static_cast(rhs); else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) return static_cast(lhs) >= static_cast(rhs); + else if (lhs.GetTypeName() != rhs.GetTypeName()) + return lhs.GetTypeName() >= rhs.GetTypeName(); else BOOST_THROW_EXCEPTION(std::invalid_argument("Operator >= cannot be applied to values of type '" + lhs.GetTypeName() + "' and '" + rhs.GetTypeName() + "'")); } -- 2.50.0