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

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

Powered by Google App Engine
This is Rietveld 408576698