From: Gunnar Beutner Date: Wed, 2 Apr 2014 15:39:36 +0000 (+0200) Subject: Implement operator - for arrays. X-Git-Tag: v0.0.10~234 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5c72e529037003867bafd75c048f9db7e8bd874c;p=icinga2 Implement operator - for arrays. Fixes #5923 --- diff --git a/lib/base/value-operators.cpp b/lib/base/value-operators.cpp index eb507fbac..049c74ee6 100644 --- a/lib/base/value-operators.cpp +++ b/lib/base/value-operators.cpp @@ -21,7 +21,9 @@ #include "base/array.h" #include "base/logger_fwd.h" #include "base/utility.h" +#include "base/objectlock.h" #include +#include #include using namespace icinga; @@ -244,7 +246,33 @@ Value icinga::operator-(const Value& lhs, const Value& rhs) { if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) return static_cast(lhs) - static_cast(rhs); - else + else if ((lhs.IsObjectType() || lhs.IsEmpty()) && (rhs.IsObjectType() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) { + if (lhs.IsEmpty()) + return make_shared(); + + Array::Ptr result = make_shared(); + Array::Ptr left = lhs; + Array::Ptr right = rhs; + + ObjectLock olock(left); + BOOST_FOREACH(const Value& lv, left) { + bool found = false; + ObjectLock xlock(right); + BOOST_FOREACH(const Value& rv, right) { + if (lv == rv) { + found = true; + break; + } + } + + if (found) + continue; + + result->Add(lv); + } + + return result; + } else BOOST_THROW_EXCEPTION(std::invalid_argument("Operator - cannot be applied to values of type '" + lhs.GetTypeName() + "' and '" + rhs.GetTypeName() + "'")); }