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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // static 1 {%- set default_field = union.fields.0 %}
2 {{union.name}}Ptr {{union.name}}::New() { 2 {{union.name}}::{{union.name}}() : tag_(Tag::{{default_field.name|upper}}) {
3 return {{union.name}}Ptr(base::in_place); 3 {%- 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.
4 } 4 default_field.kind|is_any_handle_or_interface_kind %}
5 5 data_.{{default_field.name}} = new {{default_field.kind|cpp_wrapper_type}};
6 {{union.name}}::{{union.name}}() { 6 {%- else %}
7 // TODO(azani): Implement default values here when/if we support them. 7 data_.{{default_field.name}} = {{default_field.kind|cpp_wrapper_type}}();
8 // TODO(azani): Set to UNKNOWN when unknown is implemented. 8 {%- endif %}
9 SetActive(static_cast<Tag>(0));
10 } 9 }
11 10
12 {{union.name}}::~{{union.name}}() { 11 {{union.name}}::~{{union.name}}() {
13 DestroyActive(); 12 DestroyActive();
14 } 13 }
15 14
16 {% for field in union.fields %} 15 {% for field in union.fields %}
17 void {{union.name}}::set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{ field.name}}) { 16 void {{union.name}}::set_{{field.name}}(
18 SwitchActive(Tag::{{field.name|upper}}); 17 {{field.kind|cpp_wrapper_param_type}} {{field.name}}) {
19 {% if field.kind|is_string_kind %} 18 {%- if field.kind|is_string_kind or field.kind|is_object_kind or
20 *(data_.{{field.name}}) = {{field.name}};
21 {% elif field.kind|is_object_kind or
22 field.kind|is_any_handle_or_interface_kind %} 19 field.kind|is_any_handle_or_interface_kind %}
23 *(data_.{{field.name}}) = std::move({{field.name}}); 20 if (tag_ == Tag::{{field.name|upper}}) {
21 *(data_.{{field.name}}) = std::move({{field.name}});
22 } else {
23 DestroyActive();
24 tag_ = Tag::{{field.name|upper}};
25 data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}(
26 std::move({{field.name}}));
27 }
24 {%- else %} 28 {%- else %}
29 if (tag_ != Tag::{{field.name|upper}}) {
30 DestroyActive();
31 tag_ = Tag::{{field.name|upper}};
32 }
25 data_.{{field.name}} = {{field.name}}; 33 data_.{{field.name}} = {{field.name}};
26 {%- endif %} 34 {%- endif %}
27 } 35 }
28 {%- endfor %} 36 {%- endfor %}
29 37
30 void {{union.name}}::SwitchActive(Tag new_active) {
31 if (new_active == tag_) {
32 return;
33 }
34
35 DestroyActive();
36 SetActive(new_active);
37 }
38
39 void {{union.name}}::SetActive(Tag new_active) {
40 switch (new_active) {
41 {% for field in union.fields %}
42 case Tag::{{field.name|upper}}:
43 {% if field.kind|is_object_kind or
44 field.kind|is_any_handle_or_interface_kind %}
45 data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}();
46 {%- endif %}
47 break;
48 {%- endfor %}
49 }
50
51 tag_ = new_active;
52 }
53
54 void {{union.name}}::DestroyActive() { 38 void {{union.name}}::DestroyActive() {
55 switch (tag_) { 39 switch (tag_) {
56 {% for field in union.fields %} 40 {% for field in union.fields %}
57 case Tag::{{field.name|upper}}: 41 case Tag::{{field.name|upper}}:
58 {% if field.kind|is_object_kind or 42 {% if field.kind|is_object_kind or
59 field.kind|is_any_handle_or_interface_kind %} 43 field.kind|is_any_handle_or_interface_kind %}
60 delete data_.{{field.name}}; 44 delete data_.{{field.name}};
61 {%- endif %} 45 {%- endif %}
62 break; 46 break;
63 {%- endfor %} 47 {%- endfor %}
(...skipping 10 matching lines...) Expand all
74 return mojo::internal::WTFHash(seed, data_.{{field.name}}); 58 return mojo::internal::WTFHash(seed, data_.{{field.name}});
75 {%- else %} 59 {%- else %}
76 return mojo::internal::Hash(seed, data_.{{field.name}}); 60 return mojo::internal::Hash(seed, data_.{{field.name}});
77 {%- endif %} 61 {%- endif %}
78 {%- endfor %} 62 {%- endfor %}
79 default: 63 default:
80 NOTREACHED(); 64 NOTREACHED();
81 return seed; 65 return seed;
82 } 66 }
83 } 67 }
84
85 {%- endif %} 68 {%- endif %}
OLDNEW
« 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