if (yajl_gen_double(handle, static_cast<double>(value)) == yajl_gen_invalid_number)
yajl_gen_double(handle, 0);
+ break;
+ case ValueBoolean:
+ yajl_gen_bool(handle, value.ToBool());
+
break;
case ValueString:
str = value;
JsonContext *context = static_cast<JsonContext *>(ctx);
try {
- context->AddValue(value);
+ context->AddValue(static_cast<bool>(value));
} catch (...) {
context->SaveException();
return 0;
using namespace icinga;
REGISTER_BUILTIN_TYPE(Number);
+REGISTER_BUILTIN_TYPE(Boolean);
PrimitiveType::PrimitiveType(const String& name)
: m_Name(name)
return Type::GetByName("Object");
case ValueNumber:
return Type::GetByName("Number");
+ case ValueBoolean:
+ return Type::GetByName("Boolean");
case ValueString:
return Type::GetByName("String");
case ValueObject:
return boost::lexical_cast<std::string>(m_Value);
else
return boost::lexical_cast<std::string>((long)integral);
+ case ValueBoolean:
+ if (boost::get<bool>(m_Value))
+ return "true";
+ else
+ return "false";
case ValueString:
return boost::get<String>(m_Value);
case ValueObject:
{
if (IsNumber() && rhs.IsNumber())
return Get<double>() == rhs.Get<double>();
- else if ((IsNumber() || IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(IsEmpty() && rhs.IsEmpty()))
+ else if ((IsBoolean() || IsNumber() || IsEmpty()) && (rhs.IsBoolean() || rhs.IsNumber() || rhs.IsEmpty()) && !(IsEmpty() && rhs.IsEmpty()))
return static_cast<double>(*this) == static_cast<double>(rhs);
if (IsString() && rhs.IsString())
case ValueNumber:
return static_cast<bool>(boost::get<double>(m_Value));
+ case ValueBoolean:
+ return boost::get<bool>(m_Value);
+
case ValueString:
return !boost::get<String>(m_Value).IsEmpty();
return "Empty";
case ValueNumber:
return "Number";
+ case ValueBoolean:
+ return "Boolean";
case ValueString:
return "String";
case ValueObject:
{
ValueEmpty = 0,
ValueNumber = 1,
- ValueString = 2,
- ValueObject = 3
+ ValueBoolean = 2,
+ ValueString = 3,
+ ValueObject = 4
};
/**
: m_Value(value)
{ }
+ inline Value(bool value)
+ : m_Value(value)
+ { }
+
inline Value(const String& value)
: m_Value(value)
{ }
return (GetType() == ValueNumber);
}
+ /**
+ * Checks whether the variant is a boolean.
+ *
+ * @returns true if the variant is a boolean.
+ */
+ inline bool IsBoolean(void) const
+ {
+ return (GetType() == ValueBoolean);
+ }
+
/**
* Checks whether the variant is a string.
*
String GetTypeName(void) const;
private:
- boost::variant<boost::blank, double, String, Object::Ptr> m_Value;
+ boost::variant<boost::blank, double, bool, String, Object::Ptr> m_Value;
template<typename T>
const T& Get(void) const
include_recursive return T_INCLUDE_RECURSIVE;
library return T_LIBRARY;
null return T_NULL;
-true { yylval->num = 1; return T_NUMBER; }
-false { yylval->num = 0; return T_NUMBER; }
+true { yylval->boolean = 1; return T_BOOLEAN; }
+false { yylval->boolean = 0; return T_BOOLEAN; }
const return T_CONST;
local return T_LOCAL;
use return T_USE;
%union {
char *text;
double num;
+ bool boolean;
icinga::Expression *expr;
icinga::Value *variant;
CombinedSetOp csop;
%token <text> T_STRING
%token <text> T_STRING_ANGLE
%token <num> T_NUMBER
+%token <boolean> T_BOOLEAN
%token T_NULL
%token <text> T_IDENTIFIER
{
$$ = MakeLiteral($1);
}
+ | T_BOOLEAN
+ {
+ $$ = MakeLiteral($1);
+ }
| T_NULL
{
$$ = MakeLiteral();
}
} else {
if (m_Operator == "=") {
- if (value.GetType() == ValueNumber)
+ if (value.GetType() == ValueNumber || value.GetType() == ValueBoolean)
return (static_cast<double>(value) == Convert::ToDouble(m_Operand));
else
return (static_cast<String>(value) == m_Operand);
for (it = klass.Fields.begin(); it != klass.Fields.end(); it++) {
std::string ftype = it->Type;
- if (ftype == "bool" || ftype == "int" || ftype == "double")
+ if (ftype == "int" || ftype == "double")
ftype = "Number";
+ else if (ftype == "bool")
+ ftype = "Boolean";
if (ftype.find("::Ptr") != std::string::npos)
ftype = ftype.substr(0, ftype.size() - strlen("::Ptr"));