static const char *extract_value(const value& val) { return val.string_value().c_str(); }
static type_name extract_value(const value& val) { return extract; } \ static value create_value(const type_name& x) { return construct; } \ }; #define DEFINE_VALUE_TYPE_REF(type_name, req_type, extract, construct) \ template <> struct value_type_info<type_name> { \ static bool can_convert_from(const value& val) { return val.type() == req_type; } \ static const type_name& extract_value(const value& val) { return extract; } \ static value create_value(const type_name& x) { return construct; } \ }; DEFINE_VALUE_TYPE (double, value_type::number_type, val.number_value(), value(x)) DEFINE_VALUE_TYPE (int, value_type::number_type, val.number_value(), value((double)x)) DEFINE_VALUE_TYPE (float, value_type::number_type, val.number_value(), value((double)x)) DEFINE_VALUE_TYPE (bool, value_type::bool_type, val.bool_value(), value(x)) DEFINE_VALUE_TYPE_REF(std::string, value_type::string_type, val.string_value(), value(x)) DEFINE_VALUE_TYPE_REF(value_vector_type, value_type::vector_type, val.vector_value(), value(x)) DEFINE_VALUE_TYPE_REF(group, value_type::group_type, val.group_value(), value(x)) #undef DEFINE_VALUE_TYPE #undef DEFINE_VALUE_TYPE_REF #define LIGHTCONF_BEGIN_ENUM(enumname) \ template <> struct value_type_info<enumname> { \ static const std::map<enumname, std::string> names; \ static bool can_convert_from(const value& val) { \ if (val.type() != value_type::string_type) return false; \ for (auto kv : names) { if (kv.second == val.string_value()) return true; } \ return false; \ } \ static enumname extract_value(const value& val) { \