| 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 |