[icinga-checkins] icinga.org: icinga2/master: Implement += operator for arrays.

git at icinga.org git at icinga.org
Mon Mar 18 12:55:47 CET 2013


Module: icinga2
Branch: master
Commit: 9e1f48049e98616d7acffe30c41a7dfc8652a4ee
URL:    https://git.icinga.org/?p=icinga2.git;a=commit;h=9e1f48049e98616d7acffe30c41a7dfc8652a4ee

Author: Gunnar Beutner <gunnar.beutner at netways.de>
Date:   Mon Mar 18 12:55:32 2013 +0100

Implement += operator for arrays.

---

 lib/config/expression.cpp |   46 ++++++++++++++++++++++++++++++--------------
 1 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp
index e5d7af7..2a86607 100644
--- a/lib/config/expression.cpp
+++ b/lib/config/expression.cpp
@@ -20,6 +20,7 @@
 #include "config/expression.h"
 #include "config/expressionlist.h"
 #include "base/objectlock.h"
+#include "base/array.h"
 #include <sstream>
 #include <boost/tuple/tuple.hpp>
 #include <boost/smart_ptr/make_shared.hpp>
@@ -39,15 +40,20 @@ void Expression::Execute(const Dictionary::Ptr& dictionary) const
 
 	ExpressionList::Ptr valueExprl;
 	Dictionary::Ptr valueDict;
+	Array::Ptr valueArray;
 	if (m_Value.IsObjectType<ExpressionList>())
 		valueExprl = m_Value;
 
 	if (m_Value.IsObjectType<Dictionary>())
 		valueDict = m_Value;
 
+	if (m_Value.IsObjectType<Array>())
+		valueArray = m_Value;
+
 	newValue = m_Value;
 
 	Dictionary::Ptr dict;
+	Array::Ptr array;
 
 	switch (m_Operator) {
 		case OperatorExecute:
@@ -73,24 +79,20 @@ void Expression::Execute(const Dictionary::Ptr& dictionary) const
 			if (oldValue.IsObjectType<Dictionary>())
 				dict = oldValue;
 
-			if (!dict) {
-				if (!oldValue.IsEmpty()) {
-					std::ostringstream message;
-					message << "Wrong argument types for"
-					    " += (non-dictionary and"
-					    " dictionary) ("
-					        << m_DebugInfo << ")";
-					BOOST_THROW_EXCEPTION(std::invalid_argument(message.str()));
-				}
-
-				dict = boost::make_shared<Dictionary>();
-			}
-
-			newValue = dict;
+			if (oldValue.IsObjectType<Array>())
+				array = oldValue;
 
 			if (valueExprl) {
+				if (!dict)
+					dict = boost::make_shared<Dictionary>();
+
 				valueExprl->Execute(dict);
+
+				newValue = dict;
 			} else if (valueDict) {
+				if (!dict)
+					dict = boost::make_shared<Dictionary>();
+
 				ObjectLock olock(valueDict);
 
 				String key;
@@ -98,9 +100,23 @@ void Expression::Execute(const Dictionary::Ptr& dictionary) const
 				BOOST_FOREACH(boost::tie(key, value), valueDict) {
 					dict->Set(key, value);
 				}
+
+				newValue = dict;
+			} else if (valueArray) {
+				if (!array)
+					array = boost::make_shared<Array>();
+
+
+				ObjectLock olock(valueArray);
+
+				BOOST_FOREACH(const Value& value, valueArray) {
+					array->Add(value);
+				}
+
+				newValue = array;
 			} else {
 				std::ostringstream message;
-				message << "+= only works for dictionaries ("
+				message << "+= only works for dictionaries and arrays ("
 					<< m_DebugInfo << ")";
 				BOOST_THROW_EXCEPTION(std::invalid_argument(message.str()));
 			}





More information about the icinga-checkins mailing list