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

Unified Diff: mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl

Issue 2694843003: Add field-initializing factory static methods to generated mojo unions. (Closed)
Patch Set: Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..2ad7b6f9605db579b9489bf188f4bbd2cbb8634f 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_object_kind or
+ 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_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 %}
« no previous file with comments | « mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698