| // static |
| {{union.name}}Ptr {{union.name}}::New() { |
| return {{union.name}}Ptr(base::in_place); |
| } |
| |
| {{union.name}}::{{union.name}}() { |
| // TODO(azani): Implement default values here when/if we support them. |
| // TODO(azani): Set to UNKNOWN when unknown is implemented. |
| SetActive(static_cast<Tag>(0)); |
| } |
| |
| {{union.name}}::~{{union.name}}() { |
| DestroyActive(); |
| } |
| |
| {% for field in union.fields %} |
| void {{union.name}}::set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{field.name}}) { |
| SwitchActive(Tag::{{field.name|upper}}); |
| {% if field.kind|is_string_kind %} |
| *(data_.{{field.name}}) = {{field.name}}; |
| {% elif field.kind|is_object_kind or |
| field.kind|is_any_handle_or_interface_kind %} |
| *(data_.{{field.name}}) = std::move({{field.name}}); |
| {%- else %} |
| data_.{{field.name}} = {{field.name}}; |
| {%- endif %} |
| } |
| {%- endfor %} |
| |
| void {{union.name}}::SwitchActive(Tag new_active) { |
| if (new_active == tag_) { |
| return; |
| } |
| |
| DestroyActive(); |
| SetActive(new_active); |
| } |
| |
| void {{union.name}}::SetActive(Tag new_active) { |
| switch (new_active) { |
| {% for field in union.fields %} |
| case Tag::{{field.name|upper}}: |
| {% if field.kind|is_object_kind or |
| field.kind|is_any_handle_or_interface_kind %} |
| data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}(); |
| {%- endif %} |
| break; |
| {%- endfor %} |
| } |
| |
| tag_ = new_active; |
| } |
| |
| void {{union.name}}::DestroyActive() { |
| switch (tag_) { |
| {% for field in union.fields %} |
| case Tag::{{field.name|upper}}: |
| {% if field.kind|is_object_kind or |
| field.kind|is_any_handle_or_interface_kind %} |
| delete data_.{{field.name}}; |
| {%- endif %} |
| break; |
| {%- endfor %} |
| } |
| } |
| |
| {%- if union|is_hashable %} |
| size_t {{union.name}}::Hash(size_t seed) const { |
| seed = mojo::internal::HashCombine(seed, static_cast<uint32_t>(tag_)); |
| switch (tag_) { |
| {% for field in union.fields %} |
| case Tag::{{field.name|upper}}: |
| {%- if for_blink %} |
| return mojo::internal::WTFHash(seed, data_.{{field.name}}); |
| {%- else %} |
| return mojo::internal::Hash(seed, data_.{{field.name}}); |
| {%- endif %} |
| {%- endfor %} |
| default: |
| NOTREACHED(); |
| return seed; |
| } |
| } |
| |
| {%- endif %} |