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

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

Powered by Google App Engine
This is Rietveld 408576698