Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(381)

Side by Side Diff: mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl

Issue 1618963006: Mojo C++ bindings: support enum validation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 {#--- 1 {#---
2 Macro for enum definition, and the declaration of associated functions. 2 Macro for enum definition, and the declaration of associated functions.
3 `is_static` is relevant if this enum declaration is defined within a class, in
4 which case associated functions need to be static.
5 ---#} 3 ---#}
6 {%- macro enum_decl(enum, is_static=false) %} 4 {%- macro enum_decl(enum) %}
7 enum class {{enum.name}} : int32_t { 5 enum class {{enum.name}} : int32_t {
8 {%- for field in enum.fields %} 6 {%- for field in enum.fields %}
9 {%- if field.value %} 7 {%- if field.value %}
10 {{field.name}} = {{field.value|expression_to_text}}, 8 {{field.name}} = {{field.value|expression_to_text}},
11 {%- else %} 9 {%- else %}
12 {{field.name}}, 10 {{field.name}},
13 {%- endif %} 11 {%- endif %}
14 {%- endfor %} 12 {%- endfor %}
15 }; 13 };
16 {{is_valid_enum_decl(enum, is_static)}}
17 {%- endmacro %} 14 {%- endmacro %}
18 15
19 {#--- macros for the declaration & definitions of enum-associated functions. 16 {%- macro enum_data_decl(enum) %}
20 Namely: 17 struct {{enum.name}}_Data {
21 * {enum_name}_IsValidValue: returns true if the given enum has a valid value 18 public:
22 for this generated version of enum. 19 // Used to identify Mojom Enum Data Classes.
20 typedef void MojomEnumDataType;
21
22 static bool const kIsExtensible = {% if enum.extensible %}true{% else %}false{ % endif %};
23
24 static bool IsKnownValue(int32_t value) {
25 switch (value) {
26 {%- for enum_field in enum.fields|groupby('numeric_value') %}
27 case {{enum_field[0]}}:
28 {%- endfor %}
29 return true;
30 }
31 return false;
32 }
33
34 int32_t value;
35 };
36 {%- endmacro %}
37
38 {#--- macros for enum-associated functions. Namely:
39 * operator<<(): outputs the given enum value.
40 * IsKnownEnumValue(): returns true if the given enum value exists in this
41 generated version of enum.
23 ---#} 42 ---#}
24 43
25 {%- macro is_valid_enum_decl(enum, is_static=false) %}
26 {% if is_static %}static {% endif -%}
27 bool {{enum.name}}_IsValidValue({{enum.name}} value);
28 {%- endmacro %}
29
30 {%- macro enum_stream_operator(enum) %} 44 {%- macro enum_stream_operator(enum) %}
31 inline std::ostream& operator<<(std::ostream& os, {{enum|get_name_for_kind}} val ue) { 45 inline std::ostream& operator<<(std::ostream& os, {{enum|get_name_for_kind}} val ue) {
32 switch(value) { 46 switch(value) {
33 {%- for _, values in enum.fields|groupby('numeric_value') %} 47 {%- for _, values in enum.fields|groupby('numeric_value') %}
34 case {{enum|get_name_for_kind}}::{{values[0].name}}: 48 case {{enum|get_name_for_kind}}::{{values[0].name}}:
35 return os << "{{enum|get_name_for_kind}}:: 49 return os << "{{enum|get_name_for_kind}}::
36 {%- if values|length > 1 -%} 50 {%- if values|length > 1 -%}
37 {{'{'}} 51 {{'{'}}
38 {%- endif -%} 52 {%- endif -%}
39 {{values|map(attribute='name')|join(', ')}} 53 {{values|map(attribute='name')|join(', ')}}
40 {%- if values|length > 1 -%} 54 {%- if values|length > 1 -%}
41 {{'}'}} 55 {{'}'}}
42 {%- endif -%} 56 {%- endif -%}
43 "; 57 ";
44 {%- endfor %} 58 {%- endfor %}
45 default: 59 default:
46 return os << "Unknown {{enum|get_name_for_kind}} value: " << static_cast<i nt32_t>(value); 60 return os << "Unknown {{enum|get_name_for_kind}} value: " << static_cast<i nt32_t>(value);
47 } 61 }
48 } 62 }
49 {%- endmacro %} 63 {%- endmacro %}
50 64
51 {%- macro is_valid_enum_def(enum, class_name = '') %} 65 {%- macro is_known_enum_value(enum) %}
52 {% if class_name != '' -%} 66 inline bool IsKnownEnumValue({{enum|get_name_for_kind}} value) {
53 // static 67 return {{enum|get_qualified_name_for_kind(internal=True)}}::IsKnownValue(
54 bool {{class_name}}:: 68 static_cast<int32_t>(value));
55 {%- else -%}
56 {{"bool "}}
57 {%- endif -%}
58 {{enum.name}}_IsValidValue({{enum.name}} value) {
59 switch (static_cast<int32_t>(value)) {
60 {%- for enum_field in enum.fields|groupby('numeric_value') %}
61 case {{enum_field[0]}}:
62 {%- endfor %}
63 return true;
64 }
65 return false;
66 } 69 }
67 {%- endmacro %} 70 {%- endmacro %}
OLDNEW
« no previous file with comments | « mojo/public/js/validation_unittests.js ('k') | mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698