diff --git a/misc/codegen/templates/cpp_classes_h.mustache b/misc/codegen/templates/cpp_classes_h.mustache index 4f9d862370b..3b87dbd6b79 100644 --- a/misc/codegen/templates/cpp_classes_h.mustache +++ b/misc/codegen/templates/cpp_classes_h.mustache @@ -42,34 +42,12 @@ struct {{name}}{{#has_bases}} : {{#bases}}{{^first}}, {{/first}}{{ref.name}}{{/b {{/final}} template void forEachLabel(F f) { - {{#final}} - f("id", -1, id); - {{/final}} - {{#bases}} - {{ref.name}}::forEachLabel(f); - {{/bases}} - {{#fields}} - {{#is_label}} - {{#is_repeated}} - for (auto i = 0u; i < {{field_name}}.size(); ++i) { - {{#is_optional}} - if ({{field_name}}[i]) f("{{field_name}}", i, *{{field_name}}[i]); - {{/is_optional}} - {{^is_optional}} - f("{{field_name}}", i, {{field_name}}[i]); - {{/is_optional}} - } - {{/is_repeated}} - {{^is_repeated}} - {{#is_optional}} - if ({{field_name}}) f("{{field_name}}", -1, *{{field_name}}); - {{/is_optional}} - {{^is_optional}} - f("{{field_name}}", -1, {{field_name}}); - {{/is_optional}} - {{/is_repeated}} - {{/is_label}} - {{/fields}} + {{>cpp_for_each_label_body}} + } + + template + void forEachLabel(F f) const { + {{>cpp_for_each_label_body}} } protected: diff --git a/misc/codegen/templates/cpp_for_each_label_body.mustache b/misc/codegen/templates/cpp_for_each_label_body.mustache new file mode 100644 index 00000000000..43e00cbd8d0 --- /dev/null +++ b/misc/codegen/templates/cpp_for_each_label_body.mustache @@ -0,0 +1,28 @@ +{{#final}} +f("id", -1, id); +{{/final}} +{{#bases}} +{{ref.name}}::forEachLabel(f); +{{/bases}} +{{#fields}} +{{#is_label}} +{{#is_repeated}} +for (auto i = 0u; i < {{field_name}}.size(); ++i) { + {{#is_optional}} + if ({{field_name}}[i]) f("{{field_name}}", i, *{{field_name}}[i]); + {{/is_optional}} + {{^is_optional}} + f("{{field_name}}", i, {{field_name}}[i]); + {{/is_optional}} +} +{{/is_repeated}} +{{^is_repeated}} +{{#is_optional}} +if ({{field_name}}) f("{{field_name}}", -1, *{{field_name}}); +{{/is_optional}} +{{^is_optional}} +f("{{field_name}}", -1, {{field_name}}); +{{/is_optional}} +{{/is_repeated}} +{{/is_label}} +{{/fields}} diff --git a/misc/codegen/templates/trap_traps_h.mustache b/misc/codegen/templates/trap_traps_h.mustache index 3892edebfb7..cec32a4eccd 100644 --- a/misc/codegen/templates/trap_traps_h.mustache +++ b/misc/codegen/templates/trap_traps_h.mustache @@ -23,11 +23,12 @@ struct {{name}}Trap { template void forEachLabel(F f) { - {{#fields}} - {{#is_label}} - f("{{field_name}}", -1, {{field_name}}); - {{/is_label}} - {{/fields}} + {{>cpp_for_each_label_body}} + } + + template + void forEachLabel(F f) const { + {{>cpp_for_each_label_body}} } };