| Index: mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
|
| diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
|
| index b9e416a9f49c7a4b0400846dfec7500cd613aa08..c9bde5860846abbd01df93128e6926fb4debe179 100644
|
| --- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
|
| +++ b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
|
| @@ -1,13 +1,35 @@
|
| -// static
|
| -{{union.name}}Ptr {{union.name}}::New() {
|
| - return {{union.name}}Ptr(base::in_place);
|
| +{{union.name}}::{{union.name}}() : {{union.name}}(Tag::{{union.fields.0.name|upper}}) {
|
| }
|
|
|
| -{{union.name}}::{{union.name}}() {
|
| - // TODO(azani): Implement default values here when/if we support them.
|
| - // TODO(azani): Set to UNKNOWN when unknown is implemented.
|
| - SetActive(static_cast<Tag>(0));
|
| +{{union.name}}::{{union.name}}(Tag tag) : tag_(tag) {
|
| + switch(tag) {
|
| +{% for field in union.fields %}
|
| + case Tag::{{field.name|upper}}:
|
| +{%- if field.kind|is_string_kind or field.kind|is_object_kind or
|
| + field.kind|is_any_handle_or_interface_kind %}
|
| + data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}();
|
| +{%- else %}
|
| + data_.{{field.name}} = {};
|
| +{%- endif %}
|
| + break;
|
| +{%- endfor %}
|
| + }
|
| +}
|
| +
|
| +{% for field in union.fields %}
|
| +{{union.name}}::{{union.name}}(
|
| + {{union.name}}::TagTypes_::{{field.name|under_to_camel}},
|
| + {{field.kind|cpp_wrapper_param_type}} in) {
|
| + set_{{field.name}}(std::move(in));
|
| +}
|
| +{%- if field.kind|is_object_kind %}
|
| +{{union.name}}::{{union.name}}(
|
| + {{union.name}}::TagTypes_::{{field.name|under_to_camel}}) {
|
| + tag_ = Tag::{{field.name|upper}};
|
| + data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}();
|
| }
|
| +{%- endif %}
|
| +{%- endfor %}
|
|
|
| {{union.name}}::~{{union.name}}() {
|
| DestroyActive();
|
| @@ -15,42 +37,25 @@
|
|
|
| {% for field in union.fields %}
|
| void {{union.name}}::set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{field.name}}) {
|
| - SwitchActive(Tag::{{field.name|upper}});
|
| -{% if field.kind|is_string_kind %}
|
| - *(data_.{{field.name}}) = {{field.name}};
|
| -{% elif field.kind|is_object_kind or
|
| +{%- if field.kind|is_string_kind or field.kind|is_object_kind or
|
| field.kind|is_any_handle_or_interface_kind %}
|
| - *(data_.{{field.name}}) = std::move({{field.name}});
|
| + if (tag_ == Tag::{{field.name|upper}}) {
|
| + *(data_.{{field.name}}) = std::move({{field.name}});
|
| + } else {
|
| + DestroyActive();
|
| + tag_ = Tag::{{field.name|upper}};
|
| + data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}(std::move({{field.name}}));
|
| + }
|
| {%- else %}
|
| + if (tag_ != Tag::{{field.name|upper}}) {
|
| + DestroyActive();
|
| + tag_ = Tag::{{field.name|upper}};
|
| + }
|
| data_.{{field.name}} = {{field.name}};
|
| {%- endif %}
|
| }
|
| {%- endfor %}
|
|
|
| -void {{union.name}}::SwitchActive(Tag new_active) {
|
| - if (new_active == tag_) {
|
| - return;
|
| - }
|
| -
|
| - DestroyActive();
|
| - SetActive(new_active);
|
| -}
|
| -
|
| -void {{union.name}}::SetActive(Tag new_active) {
|
| - switch (new_active) {
|
| -{% for field in union.fields %}
|
| - case Tag::{{field.name|upper}}:
|
| -{% if field.kind|is_object_kind or
|
| - field.kind|is_any_handle_or_interface_kind %}
|
| - data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}();
|
| -{%- endif %}
|
| - break;
|
| -{%- endfor %}
|
| - }
|
| -
|
| - tag_ = new_active;
|
| -}
|
| -
|
| void {{union.name}}::DestroyActive() {
|
| switch (tag_) {
|
| {% for field in union.fields %}
|
| @@ -81,5 +86,8 @@ size_t {{union.name}}::Hash(size_t seed) const {
|
| return seed;
|
| }
|
| }
|
| -
|
| {%- endif %}
|
| +
|
| +{%- for field in union.fields %}
|
| +constexpr {{union.name}}::TagTypes_::{{field.name|under_to_camel}} {{union.name}}::{{field.name}};
|
| +{%- endfor %}
|
|
|