// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#include <fidl/test.union/cpp/type_conversions.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace fidl {
namespace internal {

::test_union::Pizza WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToNatural(::test_union::wire::Pizza src) {
  return ::test_union::Pizza(WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToNatural(std::move(src.toppings)));
}
::test_union::wire::Pizza WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToWire(fidl::AnyArena& arena, ::test_union::Pizza src) {
  return ::test_union::wire::Pizza{
      .toppings = WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToWire(arena, std::move(src.toppings())),
  };
}

::test_union::Pasta WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToNatural(::test_union::wire::Pasta src) {
  return ::test_union::Pasta(WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.sauce)));
}
::test_union::wire::Pasta WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToWire(fidl::AnyArena& arena, ::test_union::Pasta src) {
  return ::test_union::wire::Pasta{
      .sauce = WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.sauce())),
  };
}

::test_union::NullableUnionStruct WireNaturalConversionTraits<::test_union::wire::NullableUnionStruct, ::test_union::NullableUnionStruct>::ToNatural(::test_union::wire::NullableUnionStruct src) {
  return ::test_union::NullableUnionStruct(WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::Union>, ::fidl::Box<::test_union::Union>>::ToNatural(std::move(src.the_union)));
}
::test_union::wire::NullableUnionStruct WireNaturalConversionTraits<::test_union::wire::NullableUnionStruct, ::test_union::NullableUnionStruct>::ToWire(fidl::AnyArena& arena, ::test_union::NullableUnionStruct src) {
  return ::test_union::wire::NullableUnionStruct{
      .the_union = WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::Union>, ::fidl::Box<::test_union::Union>>::ToWire(arena, std::move(src.the_union())),
  };
}

::test_union::Empty WireNaturalConversionTraits<::test_union::wire::Empty, ::test_union::Empty>::ToNatural(::test_union::wire::Empty src) {
  return ::test_union::Empty(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_union::wire::Empty WireNaturalConversionTraits<::test_union::wire::Empty, ::test_union::Empty>::ToWire(fidl::AnyArena& arena, ::test_union::Empty src) {
  return ::test_union::wire::Empty{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}

::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse WireNaturalConversionTraits<::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse, ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse>::ToNatural(::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse src) {
  return ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse(WireNaturalConversionTraits<::test_union::wire::StrictBoundedUnion, ::test_union::StrictBoundedUnion>::ToNatural(std::move(src.xu)));
}
::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse WireNaturalConversionTraits<::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse, ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse>::ToWire(fidl::AnyArena& arena, ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse src) {
  return ::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse{
      .xu = WireNaturalConversionTraits<::test_union::wire::StrictBoundedUnion, ::test_union::StrictBoundedUnion>::ToWire(arena, std::move(src.xu())),
  };
}

::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse WireNaturalConversionTraits<::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse, ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse>::ToNatural(::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse src) {
  return ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse(WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, ::test_union::OlderSimpleUnion>::ToNatural(std::move(src.xu)));
}
::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse WireNaturalConversionTraits<::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse, ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse>::ToWire(fidl::AnyArena& arena, ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse src) {
  return ::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse{
      .xu = WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, ::test_union::OlderSimpleUnion>::ToWire(arena, std::move(src.xu())),
  };
}

::test_union::StructWithNullableUnion WireNaturalConversionTraits<::test_union::wire::StructWithNullableUnion, ::test_union::StructWithNullableUnion>::ToNatural(::test_union::wire::StructWithNullableUnion src) {
  return ::test_union::StructWithNullableUnion(WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::OlderSimpleUnion>, ::fidl::Box<::test_union::OlderSimpleUnion>>::ToNatural(std::move(src.x1)));
}
::test_union::wire::StructWithNullableUnion WireNaturalConversionTraits<::test_union::wire::StructWithNullableUnion, ::test_union::StructWithNullableUnion>::ToWire(fidl::AnyArena& arena, ::test_union::StructWithNullableUnion src) {
  return ::test_union::wire::StructWithNullableUnion{
      .x1 = WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::OlderSimpleUnion>, ::fidl::Box<::test_union::OlderSimpleUnion>>::ToWire(arena, std::move(src.x1())),
  };
}

::test_union::UnionSandwich WireNaturalConversionTraits<::test_union::wire::UnionSandwich, ::test_union::UnionSandwich>::ToNatural(::test_union::wire::UnionSandwich src) {
  return ::test_union::UnionSandwich{{
      .a = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.a)),
      .u = WireNaturalConversionTraits<::test_union::wire::ExplicitFlexibleUnion, ::test_union::ExplicitFlexibleUnion>::ToNatural(std::move(src.u)),
      .b = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.b)),
  }};
}
::test_union::wire::UnionSandwich WireNaturalConversionTraits<::test_union::wire::UnionSandwich, ::test_union::UnionSandwich>::ToWire(fidl::AnyArena& arena, ::test_union::UnionSandwich src) {
  return ::test_union::wire::UnionSandwich{
      .a = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.a())),
      .u = WireNaturalConversionTraits<::test_union::wire::ExplicitFlexibleUnion, ::test_union::ExplicitFlexibleUnion>::ToWire(arena, std::move(src.u())),
      .b = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.b())),
  };
}

::test_union::PizzaOrPasta WireNaturalConversionTraits<::test_union::wire::PizzaOrPasta, ::test_union::PizzaOrPasta>::ToNatural(::test_union::wire::PizzaOrPasta src) {
  switch (src.Which()) {
    case ::test_union::wire::PizzaOrPasta::Tag::kPizza:
      return ::test_union::PizzaOrPasta::WithPizza(
          WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToNatural(std::move(src.pizza())));
    case ::test_union::wire::PizzaOrPasta::Tag::kPasta:
      return ::test_union::PizzaOrPasta::WithPasta(
          WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToNatural(std::move(src.pasta())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::PizzaOrPasta WireNaturalConversionTraits<::test_union::wire::PizzaOrPasta, ::test_union::PizzaOrPasta>::ToWire(fidl::AnyArena& arena, ::test_union::PizzaOrPasta src) {
  switch (src.Which()) {
    case ::test_union::PizzaOrPasta::Tag::kPizza:
      return ::test_union::wire::PizzaOrPasta::WithPizza(arena,
                                                         WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToWire(arena, std::move(src.pizza().value())));
    case ::test_union::PizzaOrPasta::Tag::kPasta:
      return ::test_union::wire::PizzaOrPasta::WithPasta(arena,
                                                         WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToWire(arena, std::move(src.pasta().value())));
  }
}

::test_union::ExplicitPizzaOrPasta WireNaturalConversionTraits<::test_union::wire::ExplicitPizzaOrPasta, ::test_union::ExplicitPizzaOrPasta>::ToNatural(::test_union::wire::ExplicitPizzaOrPasta src) {
  switch (src.Which()) {
    case ::test_union::wire::ExplicitPizzaOrPasta::Tag::kPizza:
      return ::test_union::ExplicitPizzaOrPasta::WithPizza(
          WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToNatural(std::move(src.pizza())));
    case ::test_union::wire::ExplicitPizzaOrPasta::Tag::kPasta:
      return ::test_union::ExplicitPizzaOrPasta::WithPasta(
          WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToNatural(std::move(src.pasta())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::ExplicitPizzaOrPasta WireNaturalConversionTraits<::test_union::wire::ExplicitPizzaOrPasta, ::test_union::ExplicitPizzaOrPasta>::ToWire(fidl::AnyArena& arena, ::test_union::ExplicitPizzaOrPasta src) {
  switch (src.Which()) {
    case ::test_union::ExplicitPizzaOrPasta::Tag::kPizza:
      return ::test_union::wire::ExplicitPizzaOrPasta::WithPizza(arena,
                                                                 WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToWire(arena, std::move(src.pizza().value())));
    case ::test_union::ExplicitPizzaOrPasta::Tag::kPasta:
      return ::test_union::wire::ExplicitPizzaOrPasta::WithPasta(arena,
                                                                 WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToWire(arena, std::move(src.pasta().value())));
  }
}

::test_union::FlexiblePizzaOrPasta WireNaturalConversionTraits<::test_union::wire::FlexiblePizzaOrPasta, ::test_union::FlexiblePizzaOrPasta>::ToNatural(::test_union::wire::FlexiblePizzaOrPasta src) {
  switch (src.Which()) {
    case ::test_union::wire::FlexiblePizzaOrPasta::Tag::kPizza:
      return ::test_union::FlexiblePizzaOrPasta::WithPizza(
          WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToNatural(std::move(src.pizza())));
    case ::test_union::wire::FlexiblePizzaOrPasta::Tag::kPasta:
      return ::test_union::FlexiblePizzaOrPasta::WithPasta(
          WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToNatural(std::move(src.pasta())));
    default:
      return ::test_union::FlexiblePizzaOrPasta(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::FlexiblePizzaOrPasta WireNaturalConversionTraits<::test_union::wire::FlexiblePizzaOrPasta, ::test_union::FlexiblePizzaOrPasta>::ToWire(fidl::AnyArena& arena, ::test_union::FlexiblePizzaOrPasta src) {
  switch (src.Which()) {
    case ::test_union::FlexiblePizzaOrPasta::Tag::kPizza:
      return ::test_union::wire::FlexiblePizzaOrPasta::WithPizza(arena,
                                                                 WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToWire(arena, std::move(src.pizza().value())));
    case ::test_union::FlexiblePizzaOrPasta::Tag::kPasta:
      return ::test_union::wire::FlexiblePizzaOrPasta::WithPasta(arena,
                                                                 WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToWire(arena, std::move(src.pasta().value())));
    default:
      return ::test_union::wire::FlexiblePizzaOrPasta();
  }
}

::test_union::StrictPizzaOrPasta WireNaturalConversionTraits<::test_union::wire::StrictPizzaOrPasta, ::test_union::StrictPizzaOrPasta>::ToNatural(::test_union::wire::StrictPizzaOrPasta src) {
  switch (src.Which()) {
    case ::test_union::wire::StrictPizzaOrPasta::Tag::kPizza:
      return ::test_union::StrictPizzaOrPasta::WithPizza(
          WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToNatural(std::move(src.pizza())));
    case ::test_union::wire::StrictPizzaOrPasta::Tag::kPasta:
      return ::test_union::StrictPizzaOrPasta::WithPasta(
          WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToNatural(std::move(src.pasta())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::StrictPizzaOrPasta WireNaturalConversionTraits<::test_union::wire::StrictPizzaOrPasta, ::test_union::StrictPizzaOrPasta>::ToWire(fidl::AnyArena& arena, ::test_union::StrictPizzaOrPasta src) {
  switch (src.Which()) {
    case ::test_union::StrictPizzaOrPasta::Tag::kPizza:
      return ::test_union::wire::StrictPizzaOrPasta::WithPizza(arena,
                                                               WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza>::ToWire(arena, std::move(src.pizza().value())));
    case ::test_union::StrictPizzaOrPasta::Tag::kPasta:
      return ::test_union::wire::StrictPizzaOrPasta::WithPasta(arena,
                                                               WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta>::ToWire(arena, std::move(src.pasta().value())));
  }
}

::test_union::Union WireNaturalConversionTraits<::test_union::wire::Union, ::test_union::Union>::ToNatural(::test_union::wire::Union src) {
  switch (src.Which()) {
    case ::test_union::wire::Union::Tag::kPrimitive:
      return ::test_union::Union::WithPrimitive(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.primitive())));
    case ::test_union::wire::Union::Tag::kStringNeedsConstructor:
      return ::test_union::Union::WithStringNeedsConstructor(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.string_needs_constructor())));
    case ::test_union::wire::Union::Tag::kVectorStringAlsoNeedsConstructor:
      return ::test_union::Union::WithVectorStringAlsoNeedsConstructor(
          WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToNatural(std::move(src.vector_string_also_needs_constructor())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::Union WireNaturalConversionTraits<::test_union::wire::Union, ::test_union::Union>::ToWire(fidl::AnyArena& arena, ::test_union::Union src) {
  switch (src.Which()) {
    case ::test_union::Union::Tag::kPrimitive:
      return ::test_union::wire::Union::WithPrimitive(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.primitive().value())));
    case ::test_union::Union::Tag::kStringNeedsConstructor:
      return ::test_union::wire::Union::WithStringNeedsConstructor(arena,
                                                                   WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.string_needs_constructor().value())));
    case ::test_union::Union::Tag::kVectorStringAlsoNeedsConstructor:
      return ::test_union::wire::Union::WithVectorStringAlsoNeedsConstructor(arena,
                                                                             WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToWire(arena, std::move(src.vector_string_also_needs_constructor().value())));
  }
}

::test_union::FlexibleUnion WireNaturalConversionTraits<::test_union::wire::FlexibleUnion, ::test_union::FlexibleUnion>::ToNatural(::test_union::wire::FlexibleUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::FlexibleUnion::Tag::kPrimitive:
      return ::test_union::FlexibleUnion::WithPrimitive(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.primitive())));
    case ::test_union::wire::FlexibleUnion::Tag::kStringNeedsConstructor:
      return ::test_union::FlexibleUnion::WithStringNeedsConstructor(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.string_needs_constructor())));
    case ::test_union::wire::FlexibleUnion::Tag::kVectorStringAlsoNeedsConstructor:
      return ::test_union::FlexibleUnion::WithVectorStringAlsoNeedsConstructor(
          WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToNatural(std::move(src.vector_string_also_needs_constructor())));
    default:
      return ::test_union::FlexibleUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::FlexibleUnion WireNaturalConversionTraits<::test_union::wire::FlexibleUnion, ::test_union::FlexibleUnion>::ToWire(fidl::AnyArena& arena, ::test_union::FlexibleUnion src) {
  switch (src.Which()) {
    case ::test_union::FlexibleUnion::Tag::kPrimitive:
      return ::test_union::wire::FlexibleUnion::WithPrimitive(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.primitive().value())));
    case ::test_union::FlexibleUnion::Tag::kStringNeedsConstructor:
      return ::test_union::wire::FlexibleUnion::WithStringNeedsConstructor(arena,
                                                                           WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.string_needs_constructor().value())));
    case ::test_union::FlexibleUnion::Tag::kVectorStringAlsoNeedsConstructor:
      return ::test_union::wire::FlexibleUnion::WithVectorStringAlsoNeedsConstructor(arena,
                                                                                     WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToWire(arena, std::move(src.vector_string_also_needs_constructor().value())));
    default:
      return ::test_union::wire::FlexibleUnion();
  }
}

::test_union::StrictUnion WireNaturalConversionTraits<::test_union::wire::StrictUnion, ::test_union::StrictUnion>::ToNatural(::test_union::wire::StrictUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::StrictUnion::Tag::kPrimitive:
      return ::test_union::StrictUnion::WithPrimitive(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.primitive())));
    case ::test_union::wire::StrictUnion::Tag::kStringNeedsConstructor:
      return ::test_union::StrictUnion::WithStringNeedsConstructor(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.string_needs_constructor())));
    case ::test_union::wire::StrictUnion::Tag::kVectorStringAlsoNeedsConstructor:
      return ::test_union::StrictUnion::WithVectorStringAlsoNeedsConstructor(
          WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToNatural(std::move(src.vector_string_also_needs_constructor())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::StrictUnion WireNaturalConversionTraits<::test_union::wire::StrictUnion, ::test_union::StrictUnion>::ToWire(fidl::AnyArena& arena, ::test_union::StrictUnion src) {
  switch (src.Which()) {
    case ::test_union::StrictUnion::Tag::kPrimitive:
      return ::test_union::wire::StrictUnion::WithPrimitive(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.primitive().value())));
    case ::test_union::StrictUnion::Tag::kStringNeedsConstructor:
      return ::test_union::wire::StrictUnion::WithStringNeedsConstructor(arena,
                                                                         WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.string_needs_constructor().value())));
    case ::test_union::StrictUnion::Tag::kVectorStringAlsoNeedsConstructor:
      return ::test_union::wire::StrictUnion::WithVectorStringAlsoNeedsConstructor(arena,
                                                                                   WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToWire(arena, std::move(src.vector_string_also_needs_constructor().value())));
  }
}

::test_union::FieldCollision WireNaturalConversionTraits<::test_union::wire::FieldCollision, ::test_union::FieldCollision>::ToNatural(::test_union::wire::FieldCollision src) {
  switch (src.Which()) {
    case ::test_union::wire::FieldCollision::Tag::kFieldCollisionTag:
      return ::test_union::FieldCollision::WithFieldCollisionTag(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.field_collision_tag())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::FieldCollision WireNaturalConversionTraits<::test_union::wire::FieldCollision, ::test_union::FieldCollision>::ToWire(fidl::AnyArena& arena, ::test_union::FieldCollision src) {
  switch (src.Which()) {
    case ::test_union::FieldCollision::Tag::kFieldCollisionTag:
      return ::test_union::wire::FieldCollision::WithFieldCollisionTag(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.field_collision_tag().value())));
  }
}

::test_union::ExplicitUnion WireNaturalConversionTraits<::test_union::wire::ExplicitUnion, ::test_union::ExplicitUnion>::ToNatural(::test_union::wire::ExplicitUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::ExplicitUnion::Tag::kPrimitive:
      return ::test_union::ExplicitUnion::WithPrimitive(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.primitive())));
    case ::test_union::wire::ExplicitUnion::Tag::kStringNeedsConstructor:
      return ::test_union::ExplicitUnion::WithStringNeedsConstructor(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.string_needs_constructor())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::ExplicitUnion WireNaturalConversionTraits<::test_union::wire::ExplicitUnion, ::test_union::ExplicitUnion>::ToWire(fidl::AnyArena& arena, ::test_union::ExplicitUnion src) {
  switch (src.Which()) {
    case ::test_union::ExplicitUnion::Tag::kPrimitive:
      return ::test_union::wire::ExplicitUnion::WithPrimitive(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.primitive().value())));
    case ::test_union::ExplicitUnion::Tag::kStringNeedsConstructor:
      return ::test_union::wire::ExplicitUnion::WithStringNeedsConstructor(arena,
                                                                           WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.string_needs_constructor().value())));
  }
}

::test_union::ReverseOrdinalUnion WireNaturalConversionTraits<::test_union::wire::ReverseOrdinalUnion, ::test_union::ReverseOrdinalUnion>::ToNatural(::test_union::wire::ReverseOrdinalUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::ReverseOrdinalUnion::Tag::kFirst:
      return ::test_union::ReverseOrdinalUnion::WithFirst(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.first())));
    case ::test_union::wire::ReverseOrdinalUnion::Tag::kSecond:
      return ::test_union::ReverseOrdinalUnion::WithSecond(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.second())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::ReverseOrdinalUnion WireNaturalConversionTraits<::test_union::wire::ReverseOrdinalUnion, ::test_union::ReverseOrdinalUnion>::ToWire(fidl::AnyArena& arena, ::test_union::ReverseOrdinalUnion src) {
  switch (src.Which()) {
    case ::test_union::ReverseOrdinalUnion::Tag::kFirst:
      return ::test_union::wire::ReverseOrdinalUnion::WithFirst(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.first().value())));
    case ::test_union::ReverseOrdinalUnion::Tag::kSecond:
      return ::test_union::wire::ReverseOrdinalUnion::WithSecond(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.second().value())));
  }
}

::test_union::FlexibleFoo WireNaturalConversionTraits<::test_union::wire::FlexibleFoo, ::test_union::FlexibleFoo>::ToNatural(::test_union::wire::FlexibleFoo src) {
  switch (src.Which()) {
    case ::test_union::wire::FlexibleFoo::Tag::kS:
      return ::test_union::FlexibleFoo::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    case ::test_union::wire::FlexibleFoo::Tag::kI:
      return ::test_union::FlexibleFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.i())));
    default:
      return ::test_union::FlexibleFoo(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::FlexibleFoo WireNaturalConversionTraits<::test_union::wire::FlexibleFoo, ::test_union::FlexibleFoo>::ToWire(fidl::AnyArena& arena, ::test_union::FlexibleFoo src) {
  switch (src.Which()) {
    case ::test_union::FlexibleFoo::Tag::kS:
      return ::test_union::wire::FlexibleFoo::WithS(arena,
                                                    WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
    case ::test_union::FlexibleFoo::Tag::kI:
      return ::test_union::wire::FlexibleFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.i().value())));
    default:
      return ::test_union::wire::FlexibleFoo();
  }
}

::test_union::StrictFoo WireNaturalConversionTraits<::test_union::wire::StrictFoo, ::test_union::StrictFoo>::ToNatural(::test_union::wire::StrictFoo src) {
  switch (src.Which()) {
    case ::test_union::wire::StrictFoo::Tag::kS:
      return ::test_union::StrictFoo::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    case ::test_union::wire::StrictFoo::Tag::kI:
      return ::test_union::StrictFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.i())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::StrictFoo WireNaturalConversionTraits<::test_union::wire::StrictFoo, ::test_union::StrictFoo>::ToWire(fidl::AnyArena& arena, ::test_union::StrictFoo src) {
  switch (src.Which()) {
    case ::test_union::StrictFoo::Tag::kS:
      return ::test_union::wire::StrictFoo::WithS(arena,
                                                  WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
    case ::test_union::StrictFoo::Tag::kI:
      return ::test_union::wire::StrictFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.i().value())));
  }
}

::test_union::ExplicitFoo WireNaturalConversionTraits<::test_union::wire::ExplicitFoo, ::test_union::ExplicitFoo>::ToNatural(::test_union::wire::ExplicitFoo src) {
  switch (src.Which()) {
    case ::test_union::wire::ExplicitFoo::Tag::kI:
      return ::test_union::ExplicitFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.i())));
    case ::test_union::wire::ExplicitFoo::Tag::kS:
      return ::test_union::ExplicitFoo::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    default:
      return ::test_union::ExplicitFoo(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::ExplicitFoo WireNaturalConversionTraits<::test_union::wire::ExplicitFoo, ::test_union::ExplicitFoo>::ToWire(fidl::AnyArena& arena, ::test_union::ExplicitFoo src) {
  switch (src.Which()) {
    case ::test_union::ExplicitFoo::Tag::kI:
      return ::test_union::wire::ExplicitFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.i().value())));
    case ::test_union::ExplicitFoo::Tag::kS:
      return ::test_union::wire::ExplicitFoo::WithS(arena,
                                                    WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
    default:
      return ::test_union::wire::ExplicitFoo();
  }
}

::test_union::ExplicitStrictFoo WireNaturalConversionTraits<::test_union::wire::ExplicitStrictFoo, ::test_union::ExplicitStrictFoo>::ToNatural(::test_union::wire::ExplicitStrictFoo src) {
  switch (src.Which()) {
    case ::test_union::wire::ExplicitStrictFoo::Tag::kI:
      return ::test_union::ExplicitStrictFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.i())));
    case ::test_union::wire::ExplicitStrictFoo::Tag::kS:
      return ::test_union::ExplicitStrictFoo::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::ExplicitStrictFoo WireNaturalConversionTraits<::test_union::wire::ExplicitStrictFoo, ::test_union::ExplicitStrictFoo>::ToWire(fidl::AnyArena& arena, ::test_union::ExplicitStrictFoo src) {
  switch (src.Which()) {
    case ::test_union::ExplicitStrictFoo::Tag::kI:
      return ::test_union::wire::ExplicitStrictFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.i().value())));
    case ::test_union::ExplicitStrictFoo::Tag::kS:
      return ::test_union::wire::ExplicitStrictFoo::WithS(arena,
                                                          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
  }
}

::test_union::OlderSimpleUnion WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, ::test_union::OlderSimpleUnion>::ToNatural(::test_union::wire::OlderSimpleUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::OlderSimpleUnion::Tag::kI:
      return ::test_union::OlderSimpleUnion::WithI(
          WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.i())));
    case ::test_union::wire::OlderSimpleUnion::Tag::kF:
      return ::test_union::OlderSimpleUnion::WithF(
          WireNaturalConversionTraits<float, float>::ToNatural(std::move(src.f())));
    default:
      return ::test_union::OlderSimpleUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::OlderSimpleUnion WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, ::test_union::OlderSimpleUnion>::ToWire(fidl::AnyArena& arena, ::test_union::OlderSimpleUnion src) {
  switch (src.Which()) {
    case ::test_union::OlderSimpleUnion::Tag::kI:
      return ::test_union::wire::OlderSimpleUnion::WithI(arena,
                                                         WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.i().value())));
    case ::test_union::OlderSimpleUnion::Tag::kF:
      return ::test_union::wire::OlderSimpleUnion::WithF(
          WireNaturalConversionTraits<float, float>::ToWire(arena, std::move(src.f().value())));
    default:
      return ::test_union::wire::OlderSimpleUnion();
  }
}

::test_union::NewerSimpleUnion WireNaturalConversionTraits<::test_union::wire::NewerSimpleUnion, ::test_union::NewerSimpleUnion>::ToNatural(::test_union::wire::NewerSimpleUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::NewerSimpleUnion::Tag::kI:
      return ::test_union::NewerSimpleUnion::WithI(
          WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.i())));
    case ::test_union::wire::NewerSimpleUnion::Tag::kS:
      return ::test_union::NewerSimpleUnion::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    case ::test_union::wire::NewerSimpleUnion::Tag::kV:
      return ::test_union::NewerSimpleUnion::WithV(
          WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToNatural(std::move(src.v())));
    default:
      return ::test_union::NewerSimpleUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::NewerSimpleUnion WireNaturalConversionTraits<::test_union::wire::NewerSimpleUnion, ::test_union::NewerSimpleUnion>::ToWire(fidl::AnyArena& arena, ::test_union::NewerSimpleUnion src) {
  switch (src.Which()) {
    case ::test_union::NewerSimpleUnion::Tag::kI:
      return ::test_union::wire::NewerSimpleUnion::WithI(arena,
                                                         WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.i().value())));
    case ::test_union::NewerSimpleUnion::Tag::kS:
      return ::test_union::wire::NewerSimpleUnion::WithS(arena,
                                                         WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
    case ::test_union::NewerSimpleUnion::Tag::kV:
      return ::test_union::wire::NewerSimpleUnion::WithV(arena,
                                                         WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToWire(arena, std::move(src.v().value())));
    default:
      return ::test_union::wire::NewerSimpleUnion();
  }
}

::test_union::StrictSimpleUnion WireNaturalConversionTraits<::test_union::wire::StrictSimpleUnion, ::test_union::StrictSimpleUnion>::ToNatural(::test_union::wire::StrictSimpleUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::StrictSimpleUnion::Tag::kI:
      return ::test_union::StrictSimpleUnion::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.i())));
    case ::test_union::wire::StrictSimpleUnion::Tag::kF:
      return ::test_union::StrictSimpleUnion::WithF(
          WireNaturalConversionTraits<float, float>::ToNatural(std::move(src.f())));
    case ::test_union::wire::StrictSimpleUnion::Tag::kS:
      return ::test_union::StrictSimpleUnion::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::StrictSimpleUnion WireNaturalConversionTraits<::test_union::wire::StrictSimpleUnion, ::test_union::StrictSimpleUnion>::ToWire(fidl::AnyArena& arena, ::test_union::StrictSimpleUnion src) {
  switch (src.Which()) {
    case ::test_union::StrictSimpleUnion::Tag::kI:
      return ::test_union::wire::StrictSimpleUnion::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.i().value())));
    case ::test_union::StrictSimpleUnion::Tag::kF:
      return ::test_union::wire::StrictSimpleUnion::WithF(
          WireNaturalConversionTraits<float, float>::ToWire(arena, std::move(src.f().value())));
    case ::test_union::StrictSimpleUnion::Tag::kS:
      return ::test_union::wire::StrictSimpleUnion::WithS(arena,
                                                          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
  }
}

::test_union::UnionContainingEmptyStruct WireNaturalConversionTraits<::test_union::wire::UnionContainingEmptyStruct, ::test_union::UnionContainingEmptyStruct>::ToNatural(::test_union::wire::UnionContainingEmptyStruct src) {
  switch (src.Which()) {
    case ::test_union::wire::UnionContainingEmptyStruct::Tag::kEmpty:
      return ::test_union::UnionContainingEmptyStruct::WithEmpty(
          WireNaturalConversionTraits<::test_union::wire::Empty, ::test_union::Empty>::ToNatural(std::move(src.empty())));
    default:
      return ::test_union::UnionContainingEmptyStruct(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::UnionContainingEmptyStruct WireNaturalConversionTraits<::test_union::wire::UnionContainingEmptyStruct, ::test_union::UnionContainingEmptyStruct>::ToWire(fidl::AnyArena& arena, ::test_union::UnionContainingEmptyStruct src) {
  switch (src.Which()) {
    case ::test_union::UnionContainingEmptyStruct::Tag::kEmpty:
      return ::test_union::wire::UnionContainingEmptyStruct::WithEmpty(
          WireNaturalConversionTraits<::test_union::wire::Empty, ::test_union::Empty>::ToWire(arena, std::move(src.empty().value())));
    default:
      return ::test_union::wire::UnionContainingEmptyStruct();
  }
}

::test_union::StrictBoundedUnion WireNaturalConversionTraits<::test_union::wire::StrictBoundedUnion, ::test_union::StrictBoundedUnion>::ToNatural(::test_union::wire::StrictBoundedUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::StrictBoundedUnion::Tag::kV:
      return ::test_union::StrictBoundedUnion::WithV(
          WireNaturalConversionTraits<::fidl::VectorView<uint8_t>, ::std::vector<uint8_t>>::ToNatural(std::move(src.v())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_union::wire::StrictBoundedUnion WireNaturalConversionTraits<::test_union::wire::StrictBoundedUnion, ::test_union::StrictBoundedUnion>::ToWire(fidl::AnyArena& arena, ::test_union::StrictBoundedUnion src) {
  switch (src.Which()) {
    case ::test_union::StrictBoundedUnion::Tag::kV:
      return ::test_union::wire::StrictBoundedUnion::WithV(arena,
                                                           WireNaturalConversionTraits<::fidl::VectorView<uint8_t>, ::std::vector<uint8_t>>::ToWire(arena, std::move(src.v().value())));
  }
}

::test_union::ExplicitFlexibleUnion WireNaturalConversionTraits<::test_union::wire::ExplicitFlexibleUnion, ::test_union::ExplicitFlexibleUnion>::ToNatural(::test_union::wire::ExplicitFlexibleUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::ExplicitFlexibleUnion::Tag::kI:
      return ::test_union::ExplicitFlexibleUnion::WithI(
          WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.i())));
    case ::test_union::wire::ExplicitFlexibleUnion::Tag::kF:
      return ::test_union::ExplicitFlexibleUnion::WithF(
          WireNaturalConversionTraits<float, float>::ToNatural(std::move(src.f())));
    default:
      return ::test_union::ExplicitFlexibleUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::ExplicitFlexibleUnion WireNaturalConversionTraits<::test_union::wire::ExplicitFlexibleUnion, ::test_union::ExplicitFlexibleUnion>::ToWire(fidl::AnyArena& arena, ::test_union::ExplicitFlexibleUnion src) {
  switch (src.Which()) {
    case ::test_union::ExplicitFlexibleUnion::Tag::kI:
      return ::test_union::wire::ExplicitFlexibleUnion::WithI(arena,
                                                              WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.i().value())));
    case ::test_union::ExplicitFlexibleUnion::Tag::kF:
      return ::test_union::wire::ExplicitFlexibleUnion::WithF(
          WireNaturalConversionTraits<float, float>::ToWire(arena, std::move(src.f().value())));
    default:
      return ::test_union::wire::ExplicitFlexibleUnion();
  }
}

::test_union::UnionWithAttributes WireNaturalConversionTraits<::test_union::wire::UnionWithAttributes, ::test_union::UnionWithAttributes>::ToNatural(::test_union::wire::UnionWithAttributes src) {
  switch (src.Which()) {
    case ::test_union::wire::UnionWithAttributes::Tag::kX:
      return ::test_union::UnionWithAttributes::WithX(
          WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.x())));
    default:
      return ::test_union::UnionWithAttributes(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::UnionWithAttributes WireNaturalConversionTraits<::test_union::wire::UnionWithAttributes, ::test_union::UnionWithAttributes>::ToWire(fidl::AnyArena& arena, ::test_union::UnionWithAttributes src) {
  switch (src.Which()) {
    case ::test_union::UnionWithAttributes::Tag::kX:
      return ::test_union::wire::UnionWithAttributes::WithX(arena,
                                                            WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.x().value())));
    default:
      return ::test_union::wire::UnionWithAttributes();
  }
}

::test_union::EmptyFlexibleUnion WireNaturalConversionTraits<::test_union::wire::EmptyFlexibleUnion, ::test_union::EmptyFlexibleUnion>::ToNatural(::test_union::wire::EmptyFlexibleUnion src) {
  switch (src.Which()) {
    default:
      return ::test_union::EmptyFlexibleUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_union::wire::EmptyFlexibleUnion WireNaturalConversionTraits<::test_union::wire::EmptyFlexibleUnion, ::test_union::EmptyFlexibleUnion>::ToWire(fidl::AnyArena& arena, ::test_union::EmptyFlexibleUnion src) {
  switch (src.Which()) {
    default:
      return ::test_union::wire::EmptyFlexibleUnion();
  }
}

#ifdef __Fuchsia__

::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> WireNaturalConversionTraits<::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>, ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>>::ToNatural(::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> src) {
  return ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>(
      WireNaturalConversionTraits<::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse, ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> WireNaturalConversionTraits<::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>, ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> src) {
  return ::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>(
      WireNaturalConversionTraits<::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse, ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> WireNaturalConversionTraits<::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>, ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>>::ToNatural(::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> src) {
  return ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>(
      WireNaturalConversionTraits<::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse, ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> WireNaturalConversionTraits<::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>, ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> src) {
  return ::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>(
      WireNaturalConversionTraits<::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse, ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse>::ToWire(arena, std::move(src)));
}

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
