OLD | NEW |
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 Loading... |
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 %} |
OLD | NEW |