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

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

namespace fidl {
namespace internal {

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

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

::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::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse WireNaturalConversionTraits<::test_union::wire::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse, ::test_union::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse>::ToNatural(::test_union::wire::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse src) {
  return ::test_union::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse(WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, ::test_union::OlderSimpleUnion>::ToNatural(std::move(src.xu)));
}
::test_union::wire::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse WireNaturalConversionTraits<::test_union::wire::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse, ::test_union::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse>::ToWire(fidl::AnyArena& arena, ::test_union::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse src) {
  return ::test_union::wire::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse{
      .xu = WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, ::test_union::OlderSimpleUnion>::ToWire(arena, std::move(src.xu())),
  };
}

::test_union::NullableUnionStruct WireNaturalConversionTraits<::test_union::wire::NullableUnionStruct, ::test_union::NullableUnionStruct>::ToNatural(::test_union::wire::NullableUnionStruct src) {
  return ::test_union::NullableUnionStruct(WireNaturalConversionTraits<::test_union::wire::Union, ::std::unique_ptr<::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<::test_union::wire::Union, ::std::unique_ptr<::test_union::Union>>::ToWire(arena, std::move(src.the_union())),
  };
}

::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::ExplicitXUnion, ::test_union::ExplicitXUnion>::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::ExplicitXUnion, ::test_union::ExplicitXUnion>::ToWire(arena, std::move(src.u())),
      .b = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.b())),
  };
}

::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::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();
  }
}
::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();
  }
}

std::unique_ptr<::test_union::UnionWithAttributes> WireNaturalConversionTraits<::test_union::wire::UnionWithAttributes, std::unique_ptr<::test_union::UnionWithAttributes>>::ToNatural(::test_union::wire::UnionWithAttributes src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::UnionWithAttributes>(WireNaturalConversionTraits<::test_union::wire::UnionWithAttributes, ::test_union::UnionWithAttributes>::ToNatural(std::move(src)));
}
::test_union::wire::UnionWithAttributes WireNaturalConversionTraits<::test_union::wire::UnionWithAttributes, std::unique_ptr<::test_union::UnionWithAttributes>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::UnionWithAttributes> src) {
  if (!src) {
    return ::test_union::wire::UnionWithAttributes();
  }
  return WireNaturalConversionTraits<::test_union::wire::UnionWithAttributes, ::test_union::UnionWithAttributes>::ToWire(arena, std::move(*src));
}

::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())));
  }
}

std::unique_ptr<::test_union::Union> WireNaturalConversionTraits<::test_union::wire::Union, std::unique_ptr<::test_union::Union>>::ToNatural(::test_union::wire::Union src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::Union>(WireNaturalConversionTraits<::test_union::wire::Union, ::test_union::Union>::ToNatural(std::move(src)));
}
::test_union::wire::Union WireNaturalConversionTraits<::test_union::wire::Union, std::unique_ptr<::test_union::Union>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::Union> src) {
  if (!src) {
    return ::test_union::wire::Union();
  }
  return WireNaturalConversionTraits<::test_union::wire::Union, ::test_union::Union>::ToWire(arena, std::move(*src));
}

::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())));
  }
}

std::unique_ptr<::test_union::StrictUnion> WireNaturalConversionTraits<::test_union::wire::StrictUnion, std::unique_ptr<::test_union::StrictUnion>>::ToNatural(::test_union::wire::StrictUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::StrictUnion>(WireNaturalConversionTraits<::test_union::wire::StrictUnion, ::test_union::StrictUnion>::ToNatural(std::move(src)));
}
::test_union::wire::StrictUnion WireNaturalConversionTraits<::test_union::wire::StrictUnion, std::unique_ptr<::test_union::StrictUnion>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictUnion> src) {
  if (!src) {
    return ::test_union::wire::StrictUnion();
  }
  return WireNaturalConversionTraits<::test_union::wire::StrictUnion, ::test_union::StrictUnion>::ToWire(arena, std::move(*src));
}

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

std::unique_ptr<::test_union::StrictSimpleXUnion> WireNaturalConversionTraits<::test_union::wire::StrictSimpleXUnion, std::unique_ptr<::test_union::StrictSimpleXUnion>>::ToNatural(::test_union::wire::StrictSimpleXUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::StrictSimpleXUnion>(WireNaturalConversionTraits<::test_union::wire::StrictSimpleXUnion, ::test_union::StrictSimpleXUnion>::ToNatural(std::move(src)));
}
::test_union::wire::StrictSimpleXUnion WireNaturalConversionTraits<::test_union::wire::StrictSimpleXUnion, std::unique_ptr<::test_union::StrictSimpleXUnion>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictSimpleXUnion> src) {
  if (!src) {
    return ::test_union::wire::StrictSimpleXUnion();
  }
  return WireNaturalConversionTraits<::test_union::wire::StrictSimpleXUnion, ::test_union::StrictSimpleXUnion>::ToWire(arena, std::move(*src));
}

::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())));
  }
}

std::unique_ptr<::test_union::StrictFoo> WireNaturalConversionTraits<::test_union::wire::StrictFoo, std::unique_ptr<::test_union::StrictFoo>>::ToNatural(::test_union::wire::StrictFoo src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::StrictFoo>(WireNaturalConversionTraits<::test_union::wire::StrictFoo, ::test_union::StrictFoo>::ToNatural(std::move(src)));
}
::test_union::wire::StrictFoo WireNaturalConversionTraits<::test_union::wire::StrictFoo, std::unique_ptr<::test_union::StrictFoo>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictFoo> src) {
  if (!src) {
    return ::test_union::wire::StrictFoo();
  }
  return WireNaturalConversionTraits<::test_union::wire::StrictFoo, ::test_union::StrictFoo>::ToWire(arena, std::move(*src));
}

::test_union::StrictBoundedXUnion WireNaturalConversionTraits<::test_union::wire::StrictBoundedXUnion, ::test_union::StrictBoundedXUnion>::ToNatural(::test_union::wire::StrictBoundedXUnion src) {
  switch (src.Which()) {
    case ::test_union::wire::StrictBoundedXUnion::Tag::kV:
      return ::test_union::StrictBoundedXUnion::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::StrictBoundedXUnion WireNaturalConversionTraits<::test_union::wire::StrictBoundedXUnion, ::test_union::StrictBoundedXUnion>::ToWire(fidl::AnyArena& arena, ::test_union::StrictBoundedXUnion src) {
  switch (src.Which()) {
    case ::test_union::StrictBoundedXUnion::Tag::kV:
      return ::test_union::wire::StrictBoundedXUnion::WithV(arena,
                                                            WireNaturalConversionTraits<::fidl::VectorView<uint8_t>, ::std::vector<uint8_t>>::ToWire(arena, std::move(src.v().value())));
  }
}

std::unique_ptr<::test_union::StrictBoundedXUnion> WireNaturalConversionTraits<::test_union::wire::StrictBoundedXUnion, std::unique_ptr<::test_union::StrictBoundedXUnion>>::ToNatural(::test_union::wire::StrictBoundedXUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::StrictBoundedXUnion>(WireNaturalConversionTraits<::test_union::wire::StrictBoundedXUnion, ::test_union::StrictBoundedXUnion>::ToNatural(std::move(src)));
}
::test_union::wire::StrictBoundedXUnion WireNaturalConversionTraits<::test_union::wire::StrictBoundedXUnion, std::unique_ptr<::test_union::StrictBoundedXUnion>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictBoundedXUnion> src) {
  if (!src) {
    return ::test_union::wire::StrictBoundedXUnion();
  }
  return WireNaturalConversionTraits<::test_union::wire::StrictBoundedXUnion, ::test_union::StrictBoundedXUnion>::ToWire(arena, std::move(*src));
}

::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::kSecond:
      return ::test_union::ReverseOrdinalUnion::WithSecond(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.second())));
    case ::test_union::wire::ReverseOrdinalUnion::Tag::kFirst:
      return ::test_union::ReverseOrdinalUnion::WithFirst(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.first())));
    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::kSecond:
      return ::test_union::wire::ReverseOrdinalUnion::WithSecond(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.second().value())));
    case ::test_union::ReverseOrdinalUnion::Tag::kFirst:
      return ::test_union::wire::ReverseOrdinalUnion::WithFirst(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.first().value())));
  }
}

std::unique_ptr<::test_union::ReverseOrdinalUnion> WireNaturalConversionTraits<::test_union::wire::ReverseOrdinalUnion, std::unique_ptr<::test_union::ReverseOrdinalUnion>>::ToNatural(::test_union::wire::ReverseOrdinalUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::ReverseOrdinalUnion>(WireNaturalConversionTraits<::test_union::wire::ReverseOrdinalUnion, ::test_union::ReverseOrdinalUnion>::ToNatural(std::move(src)));
}
::test_union::wire::ReverseOrdinalUnion WireNaturalConversionTraits<::test_union::wire::ReverseOrdinalUnion, std::unique_ptr<::test_union::ReverseOrdinalUnion>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ReverseOrdinalUnion> src) {
  if (!src) {
    return ::test_union::wire::ReverseOrdinalUnion();
  }
  return WireNaturalConversionTraits<::test_union::wire::ReverseOrdinalUnion, ::test_union::ReverseOrdinalUnion>::ToWire(arena, std::move(*src));
}

::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())));
  }
}

std::unique_ptr<::test_union::StrictPizzaOrPasta> WireNaturalConversionTraits<::test_union::wire::StrictPizzaOrPasta, std::unique_ptr<::test_union::StrictPizzaOrPasta>>::ToNatural(::test_union::wire::StrictPizzaOrPasta src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::StrictPizzaOrPasta>(WireNaturalConversionTraits<::test_union::wire::StrictPizzaOrPasta, ::test_union::StrictPizzaOrPasta>::ToNatural(std::move(src)));
}
::test_union::wire::StrictPizzaOrPasta WireNaturalConversionTraits<::test_union::wire::StrictPizzaOrPasta, std::unique_ptr<::test_union::StrictPizzaOrPasta>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictPizzaOrPasta> src) {
  if (!src) {
    return ::test_union::wire::StrictPizzaOrPasta();
  }
  return WireNaturalConversionTraits<::test_union::wire::StrictPizzaOrPasta, ::test_union::StrictPizzaOrPasta>::ToWire(arena, std::move(*src));
}

::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())));
  }
}

std::unique_ptr<::test_union::PizzaOrPasta> WireNaturalConversionTraits<::test_union::wire::PizzaOrPasta, std::unique_ptr<::test_union::PizzaOrPasta>>::ToNatural(::test_union::wire::PizzaOrPasta src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::PizzaOrPasta>(WireNaturalConversionTraits<::test_union::wire::PizzaOrPasta, ::test_union::PizzaOrPasta>::ToNatural(std::move(src)));
}
::test_union::wire::PizzaOrPasta WireNaturalConversionTraits<::test_union::wire::PizzaOrPasta, std::unique_ptr<::test_union::PizzaOrPasta>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::PizzaOrPasta> src) {
  if (!src) {
    return ::test_union::wire::PizzaOrPasta();
  }
  return WireNaturalConversionTraits<::test_union::wire::PizzaOrPasta, ::test_union::PizzaOrPasta>::ToWire(arena, std::move(*src));
}

::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();
  }
}
::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();
  }
}

std::unique_ptr<::test_union::FlexiblePizzaOrPasta> WireNaturalConversionTraits<::test_union::wire::FlexiblePizzaOrPasta, std::unique_ptr<::test_union::FlexiblePizzaOrPasta>>::ToNatural(::test_union::wire::FlexiblePizzaOrPasta src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::FlexiblePizzaOrPasta>(WireNaturalConversionTraits<::test_union::wire::FlexiblePizzaOrPasta, ::test_union::FlexiblePizzaOrPasta>::ToNatural(std::move(src)));
}
::test_union::wire::FlexiblePizzaOrPasta WireNaturalConversionTraits<::test_union::wire::FlexiblePizzaOrPasta, std::unique_ptr<::test_union::FlexiblePizzaOrPasta>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::FlexiblePizzaOrPasta> src) {
  if (!src) {
    return ::test_union::wire::FlexiblePizzaOrPasta();
  }
  return WireNaturalConversionTraits<::test_union::wire::FlexiblePizzaOrPasta, ::test_union::FlexiblePizzaOrPasta>::ToWire(arena, std::move(*src));
}

::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())));
  }
}

std::unique_ptr<::test_union::ExplicitPizzaOrPasta> WireNaturalConversionTraits<::test_union::wire::ExplicitPizzaOrPasta, std::unique_ptr<::test_union::ExplicitPizzaOrPasta>>::ToNatural(::test_union::wire::ExplicitPizzaOrPasta src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::ExplicitPizzaOrPasta>(WireNaturalConversionTraits<::test_union::wire::ExplicitPizzaOrPasta, ::test_union::ExplicitPizzaOrPasta>::ToNatural(std::move(src)));
}
::test_union::wire::ExplicitPizzaOrPasta WireNaturalConversionTraits<::test_union::wire::ExplicitPizzaOrPasta, std::unique_ptr<::test_union::ExplicitPizzaOrPasta>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitPizzaOrPasta> src) {
  if (!src) {
    return ::test_union::wire::ExplicitPizzaOrPasta();
  }
  return WireNaturalConversionTraits<::test_union::wire::ExplicitPizzaOrPasta, ::test_union::ExplicitPizzaOrPasta>::ToWire(arena, std::move(*src));
}

::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();
  }
}
::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();
  }
}

std::unique_ptr<::test_union::OlderSimpleUnion> WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, std::unique_ptr<::test_union::OlderSimpleUnion>>::ToNatural(::test_union::wire::OlderSimpleUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::OlderSimpleUnion>(WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, ::test_union::OlderSimpleUnion>::ToNatural(std::move(src)));
}
::test_union::wire::OlderSimpleUnion WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, std::unique_ptr<::test_union::OlderSimpleUnion>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::OlderSimpleUnion> src) {
  if (!src) {
    return ::test_union::wire::OlderSimpleUnion();
  }
  return WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, ::test_union::OlderSimpleUnion>::ToWire(arena, std::move(*src));
}

::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();
  }
}
::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();
  }
}

std::unique_ptr<::test_union::NewerSimpleUnion> WireNaturalConversionTraits<::test_union::wire::NewerSimpleUnion, std::unique_ptr<::test_union::NewerSimpleUnion>>::ToNatural(::test_union::wire::NewerSimpleUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::NewerSimpleUnion>(WireNaturalConversionTraits<::test_union::wire::NewerSimpleUnion, ::test_union::NewerSimpleUnion>::ToNatural(std::move(src)));
}
::test_union::wire::NewerSimpleUnion WireNaturalConversionTraits<::test_union::wire::NewerSimpleUnion, std::unique_ptr<::test_union::NewerSimpleUnion>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::NewerSimpleUnion> src) {
  if (!src) {
    return ::test_union::wire::NewerSimpleUnion();
  }
  return WireNaturalConversionTraits<::test_union::wire::NewerSimpleUnion, ::test_union::NewerSimpleUnion>::ToWire(arena, std::move(*src));
}

::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();
  }
}
::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();
  }
}

std::unique_ptr<::test_union::FlexibleUnion> WireNaturalConversionTraits<::test_union::wire::FlexibleUnion, std::unique_ptr<::test_union::FlexibleUnion>>::ToNatural(::test_union::wire::FlexibleUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::FlexibleUnion>(WireNaturalConversionTraits<::test_union::wire::FlexibleUnion, ::test_union::FlexibleUnion>::ToNatural(std::move(src)));
}
::test_union::wire::FlexibleUnion WireNaturalConversionTraits<::test_union::wire::FlexibleUnion, std::unique_ptr<::test_union::FlexibleUnion>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::FlexibleUnion> src) {
  if (!src) {
    return ::test_union::wire::FlexibleUnion();
  }
  return WireNaturalConversionTraits<::test_union::wire::FlexibleUnion, ::test_union::FlexibleUnion>::ToWire(arena, std::move(*src));
}

::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();
  }
}
::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();
  }
}

std::unique_ptr<::test_union::FlexibleFoo> WireNaturalConversionTraits<::test_union::wire::FlexibleFoo, std::unique_ptr<::test_union::FlexibleFoo>>::ToNatural(::test_union::wire::FlexibleFoo src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::FlexibleFoo>(WireNaturalConversionTraits<::test_union::wire::FlexibleFoo, ::test_union::FlexibleFoo>::ToNatural(std::move(src)));
}
::test_union::wire::FlexibleFoo WireNaturalConversionTraits<::test_union::wire::FlexibleFoo, std::unique_ptr<::test_union::FlexibleFoo>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::FlexibleFoo> src) {
  if (!src) {
    return ::test_union::wire::FlexibleFoo();
  }
  return WireNaturalConversionTraits<::test_union::wire::FlexibleFoo, ::test_union::FlexibleFoo>::ToWire(arena, std::move(*src));
}

::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())));
  }
}

std::unique_ptr<::test_union::FieldCollision> WireNaturalConversionTraits<::test_union::wire::FieldCollision, std::unique_ptr<::test_union::FieldCollision>>::ToNatural(::test_union::wire::FieldCollision src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::FieldCollision>(WireNaturalConversionTraits<::test_union::wire::FieldCollision, ::test_union::FieldCollision>::ToNatural(std::move(src)));
}
::test_union::wire::FieldCollision WireNaturalConversionTraits<::test_union::wire::FieldCollision, std::unique_ptr<::test_union::FieldCollision>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::FieldCollision> src) {
  if (!src) {
    return ::test_union::wire::FieldCollision();
  }
  return WireNaturalConversionTraits<::test_union::wire::FieldCollision, ::test_union::FieldCollision>::ToWire(arena, std::move(*src));
}

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

std::unique_ptr<::test_union::ExplicitXUnion> WireNaturalConversionTraits<::test_union::wire::ExplicitXUnion, std::unique_ptr<::test_union::ExplicitXUnion>>::ToNatural(::test_union::wire::ExplicitXUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::ExplicitXUnion>(WireNaturalConversionTraits<::test_union::wire::ExplicitXUnion, ::test_union::ExplicitXUnion>::ToNatural(std::move(src)));
}
::test_union::wire::ExplicitXUnion WireNaturalConversionTraits<::test_union::wire::ExplicitXUnion, std::unique_ptr<::test_union::ExplicitXUnion>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitXUnion> src) {
  if (!src) {
    return ::test_union::wire::ExplicitXUnion();
  }
  return WireNaturalConversionTraits<::test_union::wire::ExplicitXUnion, ::test_union::ExplicitXUnion>::ToWire(arena, std::move(*src));
}

::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())));
  }
}

std::unique_ptr<::test_union::ExplicitUnion> WireNaturalConversionTraits<::test_union::wire::ExplicitUnion, std::unique_ptr<::test_union::ExplicitUnion>>::ToNatural(::test_union::wire::ExplicitUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::ExplicitUnion>(WireNaturalConversionTraits<::test_union::wire::ExplicitUnion, ::test_union::ExplicitUnion>::ToNatural(std::move(src)));
}
::test_union::wire::ExplicitUnion WireNaturalConversionTraits<::test_union::wire::ExplicitUnion, std::unique_ptr<::test_union::ExplicitUnion>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitUnion> src) {
  if (!src) {
    return ::test_union::wire::ExplicitUnion();
  }
  return WireNaturalConversionTraits<::test_union::wire::ExplicitUnion, ::test_union::ExplicitUnion>::ToWire(arena, std::move(*src));
}

::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::kS:
      return ::test_union::ExplicitStrictFoo::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    case ::test_union::wire::ExplicitStrictFoo::Tag::kI:
      return ::test_union::ExplicitStrictFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.i())));
    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::kS:
      return ::test_union::wire::ExplicitStrictFoo::WithS(arena,
                                                          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
    case ::test_union::ExplicitStrictFoo::Tag::kI:
      return ::test_union::wire::ExplicitStrictFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.i().value())));
  }
}

std::unique_ptr<::test_union::ExplicitStrictFoo> WireNaturalConversionTraits<::test_union::wire::ExplicitStrictFoo, std::unique_ptr<::test_union::ExplicitStrictFoo>>::ToNatural(::test_union::wire::ExplicitStrictFoo src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::ExplicitStrictFoo>(WireNaturalConversionTraits<::test_union::wire::ExplicitStrictFoo, ::test_union::ExplicitStrictFoo>::ToNatural(std::move(src)));
}
::test_union::wire::ExplicitStrictFoo WireNaturalConversionTraits<::test_union::wire::ExplicitStrictFoo, std::unique_ptr<::test_union::ExplicitStrictFoo>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitStrictFoo> src) {
  if (!src) {
    return ::test_union::wire::ExplicitStrictFoo();
  }
  return WireNaturalConversionTraits<::test_union::wire::ExplicitStrictFoo, ::test_union::ExplicitStrictFoo>::ToWire(arena, std::move(*src));
}

::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::kS:
      return ::test_union::ExplicitFoo::WithS(
          WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.s())));
    case ::test_union::wire::ExplicitFoo::Tag::kI:
      return ::test_union::ExplicitFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.i())));
    default:
      return ::test_union::ExplicitFoo();
  }
}
::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::kS:
      return ::test_union::wire::ExplicitFoo::WithS(arena,
                                                    WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s().value())));
    case ::test_union::ExplicitFoo::Tag::kI:
      return ::test_union::wire::ExplicitFoo::WithI(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.i().value())));
    default:
      return ::test_union::wire::ExplicitFoo();
  }
}

std::unique_ptr<::test_union::ExplicitFoo> WireNaturalConversionTraits<::test_union::wire::ExplicitFoo, std::unique_ptr<::test_union::ExplicitFoo>>::ToNatural(::test_union::wire::ExplicitFoo src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::ExplicitFoo>(WireNaturalConversionTraits<::test_union::wire::ExplicitFoo, ::test_union::ExplicitFoo>::ToNatural(std::move(src)));
}
::test_union::wire::ExplicitFoo WireNaturalConversionTraits<::test_union::wire::ExplicitFoo, std::unique_ptr<::test_union::ExplicitFoo>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitFoo> src) {
  if (!src) {
    return ::test_union::wire::ExplicitFoo();
  }
  return WireNaturalConversionTraits<::test_union::wire::ExplicitFoo, ::test_union::ExplicitFoo>::ToWire(arena, std::move(*src));
}

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

std::unique_ptr<::test_union::XUnionContainingEmptyStruct> WireNaturalConversionTraits<::test_union::wire::XUnionContainingEmptyStruct, std::unique_ptr<::test_union::XUnionContainingEmptyStruct>>::ToNatural(::test_union::wire::XUnionContainingEmptyStruct src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_union::XUnionContainingEmptyStruct>(WireNaturalConversionTraits<::test_union::wire::XUnionContainingEmptyStruct, ::test_union::XUnionContainingEmptyStruct>::ToNatural(std::move(src)));
}
::test_union::wire::XUnionContainingEmptyStruct WireNaturalConversionTraits<::test_union::wire::XUnionContainingEmptyStruct, std::unique_ptr<::test_union::XUnionContainingEmptyStruct>>::ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::XUnionContainingEmptyStruct> src) {
  if (!src) {
    return ::test_union::wire::XUnionContainingEmptyStruct();
  }
  return WireNaturalConversionTraits<::test_union::wire::XUnionContainingEmptyStruct, ::test_union::XUnionContainingEmptyStruct>::ToWire(arena, std::move(*src));
}

#ifdef __Fuchsia__

::fidl::Request<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated> WireNaturalConversionTraits<::fidl::WireRequest<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>, ::fidl::Request<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>::ToNatural(::fidl::WireRequest<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated> src) {
  return ::fidl::Request<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>();
}
::fidl::WireRequest<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated> WireNaturalConversionTraits<::fidl::WireRequest<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>, ::fidl::Request<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>::ToWire(fidl::AnyArena& arena, ::fidl::Request<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated> src) {
  return ::fidl::WireRequest<::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>();
}

::fidl::Request<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated> WireNaturalConversionTraits<::fidl::WireRequest<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>, ::fidl::Request<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>::ToNatural(::fidl::WireRequest<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated> src) {
  return ::fidl::Request<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>();
}
::fidl::WireRequest<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated> WireNaturalConversionTraits<::fidl::WireRequest<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>, ::fidl::Request<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>::ToWire(fidl::AnyArena& arena, ::fidl::Request<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated> src) {
  return ::fidl::WireRequest<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>();
}

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

::fidl::Response<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated> WireNaturalConversionTraits<::fidl::WireResponse<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>, ::fidl::Response<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>::ToNatural(::fidl::WireResponse<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated> src) {
  return ::fidl::Response<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>(
      WireNaturalConversionTraits<::test_union::wire::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse, ::test_union::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated> WireNaturalConversionTraits<::fidl::WireResponse<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>, ::fidl::Response<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated> src) {
  return ::fidl::WireResponse<::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>(
      WireNaturalConversionTraits<::test_union::wire::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse, ::test_union::TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse>::ToWire(arena, std::move(src)));
}
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
