]> granicus.if.org Git - icinga2/commitdiff
Implement operator - for arrays.
authorGunnar Beutner <gunnar@beutner.name>
Wed, 2 Apr 2014 15:39:36 +0000 (17:39 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 2 Apr 2014 15:39:36 +0000 (17:39 +0200)
Fixes #5923

lib/base/value-operators.cpp

index eb507fbac795d0015dfa17b4502ff2ab021a68e3..049c74ee6e4e5e5ad360930a561acc5e053be8ab 100644 (file)
@@ -21,7 +21,9 @@
 #include "base/array.h"
 #include "base/logger_fwd.h"
 #include "base/utility.h"
+#include "base/objectlock.h"
 #include <cJSON.h>
+#include <boost/foreach.hpp>
 #include <boost/lexical_cast.hpp>
 
 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<double>(lhs) - static_cast<double>(rhs);
-       else
+       else if ((lhs.IsObjectType<Array>() || lhs.IsEmpty()) && (rhs.IsObjectType<Array>() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) {
+               if (lhs.IsEmpty())
+                       return make_shared<Array>();
+
+               Array::Ptr result = make_shared<Array>();
+               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() + "'"));
 }