blob: b9e416a9f49c7a4b0400846dfec7500cd613aa08 [file] [log] [blame]
// 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 %}