Chromium Code Reviews| 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..46d8e20a4ae527c285e59065d06e98612a47c5ab 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,12 +1,11 @@ |
| -// static |
| -{{union.name}}Ptr {{union.name}}::New() { |
| - return {{union.name}}Ptr(base::in_place); |
| -} |
| - |
| -{{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)); |
| +{%- set default_field = union.fields.0 %} |
| +{{union.name}}::{{union.name}}() : tag_(Tag::{{default_field.name|upper}}) { |
| +{%- if default_field.kind|is_string_kind or default_field.kind|is_object_kind or |
|
yzshen1
2017/04/09 23:32:31
nit: is_object_kind includes is_string_kind, so it
Sam McNally
2017/04/10 00:31:31
Done.
|
| + default_field.kind|is_any_handle_or_interface_kind %} |
| + data_.{{default_field.name}} = new {{default_field.kind|cpp_wrapper_type}}; |
| +{%- else %} |
| + data_.{{default_field.name}} = {{default_field.kind|cpp_wrapper_type}}(); |
| +{%- endif %} |
| } |
| {{union.name}}::~{{union.name}}() { |
| @@ -14,43 +13,28 @@ |
| } |
| {% 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 |
| +void {{union.name}}::set_{{field.name}}( |
| + {{field.kind|cpp_wrapper_param_type}} {{field.name}}) { |
| +{%- 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 +65,4 @@ size_t {{union.name}}::Hash(size_t seed) const { |
| return seed; |
| } |
| } |
| - |
| {%- endif %} |