// 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 %}
