blob: a68275d17055f60b694b65a7122b266de0866bc5 [file] [log] [blame]
{#---
Macro for enum definition, and the declaration of associated functions.
`is_static` is relevant if this enum declaration is defined within a class, in
which case associated functions need to be static.
---#}
{%- macro enum_decl(enum, is_static=false) %}
enum class {{enum.name}} : int32_t {
{%- for field in enum.fields %}
{%- if field.value %}
{{field.name}} = {{field.value|expression_to_text}},
{%- else %}
{{field.name}},
{%- endif %}
{%- endfor %}
};
{{is_valid_enum_decl(enum, is_static)}}
{%- endmacro %}
{#--- macros for the declaration & definitions of enum-associated functions.
Namely:
* {enum_name}_IsValidValue: returns true if the given enum has a valid value
for this generated version of enum.
---#}
{%- macro is_valid_enum_decl(enum, is_static=false) %}
{% if is_static %}static {% endif -%}
bool {{enum.name}}_IsValidValue({{enum.name}} value);
{%- endmacro %}
{%- macro is_valid_enum_def(enum, class_name = '') %}
{% if class_name != '' -%}
// static
bool {{class_name}}::
{%- else -%}
{{"bool "}}
{%- endif -%}
{{enum.name}}_IsValidValue({{enum.name}} value) {
switch (static_cast<int32_t>(value)) {
{%- for enum_field in enum.fields|groupby('numeric_value') %}
case {{enum_field[0]}}:
{%- endfor %}
return true;
}
return false;
}
{%- endmacro %}
{%- macro global_enum_operators_decl(enum, class_name = '') %}
{% if class_name != '' -%}
std::ostream& operator<<(std::ostream& stream,
const {{class_name}}::{{enum.name}}& val);
{%- else -%}
std::ostream& operator<<(std::ostream& stream, const {{enum.name}}& val);
{%- endif -%}
{%- endmacro %}
{%- macro global_enum_operators_def(enum, class_name = '') %}
{% if class_name != '' -%}
std::ostream& operator<<(std::ostream& stream,
const {{class_name}}::{{enum.name}}& val) {
return (stream << static_cast<int32_t>(val));
}
{%- else -%}
std::ostream& operator<<(std::ostream& stream, const {{enum.name}}& val) {
return (stream << static_cast<int32_t>(val));
}
{%- endif -%}
{%- endmacro %}