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 %} |