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