*/
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."));
}
}
return value;
}
+
+/**
+ * Returns the type of the value.
+ *
+ * @returns The type.
+ */
+ValueType Value::GetType(void) const
+{
+ return static_cast<ValueType>(m_Value.which());
+}
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.
*
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;
};