]> granicus.if.org Git - icinga2/commitdiff
Implement comparison operators for operands of different types.
authorGunnar Beutner <gunnar.beutner@netways.de>
Sat, 22 Mar 2014 07:40:35 +0000 (08:40 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Sat, 22 Mar 2014 07:40:35 +0000 (08:40 +0100)
Refs #5846

lib/base/value-operators.cpp

index e5bccd933f56678ba9faf40be94123597988d9bb..234b27b77f886f22817981824a21ff328b3c999e 100644 (file)
@@ -440,6 +440,8 @@ Value icinga::operator<(const Value& lhs, const Value& rhs)
                return static_cast<String>(lhs) < static_cast<String>(rhs);
        else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty()))
                return static_cast<int>(lhs) < static_cast<int>(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<String>(lhs) > static_cast<String>(rhs);
        else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty()))
                return static_cast<int>(lhs) > static_cast<int>(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<String>(lhs) <= static_cast<String>(rhs);
        else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty()))
                return static_cast<int>(lhs) <= static_cast<int>(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<String>(lhs) >= static_cast<String>(rhs);
        else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty()))
                return static_cast<int>(lhs) >= static_cast<int>(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() + "'"));
 }