]> granicus.if.org Git - icinga2/commitdiff
Implemented Value::GetType().
authorGunnar Beutner <gunnar.beutner@netways.de>
Fri, 15 Feb 2013 13:39:26 +0000 (14:39 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Fri, 15 Feb 2013 13:39:26 +0000 (14:39 +0100)
lib/base/value.cpp
lib/base/value.h

index 53578fe82a4df0bcbab450eaec6a9b23c05e4b44..60a85294820a6ef16e478832699addf632def254 100644 (file)
@@ -109,24 +109,27 @@ String Value::Serialize(void) const
  */
 cJSON *Value::ToJson(void) const
 {
-       if (m_Value.type() == typeid(long)) {
-               return cJSON_CreateNumber(boost::get<long>(m_Value));
-       } else if (m_Value.type() == typeid(double)) {
-               return cJSON_CreateNumber(boost::get<double>(m_Value));
-       } else if (m_Value.type() == typeid(String)) {
-               return cJSON_CreateString(boost::get<String>(m_Value).CStr());
-       } else if (m_Value.type() == typeid(Object::Ptr)) {
-               if (IsObjectType<Dictionary>()) {
-                       Dictionary::Ptr dictionary = *this;
-                       return dictionary->ToJson();
-               } else {
-                       Logger::Write(LogDebug, "base", "Ignoring unknown object while converting variant to JSON.");
+       switch (GetType()) {
+               case ValueNumber:
+                       return cJSON_CreateNumber(boost::get<double>(m_Value));
+
+               case ValueString:
+                       return cJSON_CreateString(boost::get<String>(m_Value).CStr());
+
+               case ValueObject:
+                       if (IsObjectType<Dictionary>()) {
+                               Dictionary::Ptr dictionary = *this;
+                               return dictionary->ToJson();
+                       } else {
+                               Logger::Write(LogDebug, "base", "Ignoring unknown object while converting variant to JSON.");
+                               return cJSON_CreateNull();
+                       }
+
+               case ValueEmpty:
                        return cJSON_CreateNull();
-               }
-       } else if (m_Value.type() == typeid(boost::blank)) {
-               return cJSON_CreateNull();
-       } else {
-               BOOST_THROW_EXCEPTION(runtime_error("Invalid variant type."));
+
+               default:
+                       BOOST_THROW_EXCEPTION(runtime_error("Invalid variant type."));
        }
 }
 
@@ -148,3 +151,13 @@ Value Value::Deserialize(const String& jsonString)
 
        return value;
 }
+
+/**
+ * Returns the type of the value.
+ *
+ * @returns The type.
+ */
+ValueType Value::GetType(void) const
+{
+       return static_cast<ValueType>(m_Value.which());
+}
index b6623d871333178288383a006e353a01e54d7cd1..45ece754fcfd604c2841ed6a914a9f700e01681a 100644 (file)
@@ -25,6 +25,19 @@ struct cJSON;
 namespace icinga
 {
 
+/**
+ * The type of a Value.
+ *
+ * @ingroup base
+ */
+enum ValueType
+{
+       ValueEmpty = 0,
+       ValueNumber = 1,
+       ValueString = 2,
+       ValueObject = 3
+};
+
 /**
  * A type that can hold an arbitrary value.
  *
@@ -127,6 +140,8 @@ public:
        String Serialize(void) const;
        static Value Deserialize(const String& jsonString);
 
+       ValueType GetType(void) const;
+
 private:
        mutable boost::variant<boost::blank, double, String, Object::Ptr> m_Value;
 };