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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.union/cpp/markers.h>
#include <fidl/test.union/cpp/natural_types.h>
#include <fidl/test.union/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.union/cpp/natural_messaging.h>
#include <fidl/test.union/cpp/wire_messaging.h>

#endif  // __Fuchsia__
#include <lib/fidl/cpp/wire_natural_conversions.h>

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

namespace fidl {
namespace internal {

template <>
struct WireNaturalConversionTraits<::test_union::wire::Pizza, ::test_union::Pizza> {
  static ::test_union::Pizza ToNatural(::test_union::wire::Pizza src);
  static ::test_union::wire::Pizza ToWire(fidl::AnyArena& arena, ::test_union::Pizza src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::Pizza> {
  using type = ::test_union::Pizza;
};
template <>
struct WireTypeForNaturalType<::test_union::Pizza> {
  using type = ::test_union::wire::Pizza;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::Pasta, ::test_union::Pasta> {
  static ::test_union::Pasta ToNatural(::test_union::wire::Pasta src);
  static ::test_union::wire::Pasta ToWire(fidl::AnyArena& arena, ::test_union::Pasta src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::Pasta> {
  using type = ::test_union::Pasta;
};
template <>
struct WireTypeForNaturalType<::test_union::Pasta> {
  using type = ::test_union::wire::Pasta;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::NullableUnionStruct, ::test_union::NullableUnionStruct> {
  static ::test_union::NullableUnionStruct ToNatural(::test_union::wire::NullableUnionStruct src);
  static ::test_union::wire::NullableUnionStruct ToWire(fidl::AnyArena& arena, ::test_union::NullableUnionStruct src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::NullableUnionStruct> {
  using type = ::test_union::NullableUnionStruct;
};
template <>
struct WireTypeForNaturalType<::test_union::NullableUnionStruct> {
  using type = ::test_union::wire::NullableUnionStruct;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::Empty, ::test_union::Empty> {
  static ::test_union::Empty ToNatural(::test_union::wire::Empty src);
  static ::test_union::wire::Empty ToWire(fidl::AnyArena& arena, ::test_union::Empty src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::Empty> {
  using type = ::test_union::Empty;
};
template <>
struct WireTypeForNaturalType<::test_union::Empty> {
  using type = ::test_union::wire::Empty;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse, ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse> {
  static ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse ToNatural(::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse src);
  static ::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse ToWire(fidl::AnyArena& arena, ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse> {
  using type = ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse;
};
template <>
struct WireTypeForNaturalType<::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse> {
  using type = ::test_union::wire::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse, ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse> {
  static ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse ToNatural(::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse src);
  static ::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse ToWire(fidl::AnyArena& arena, ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse> {
  using type = ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse;
};
template <>
struct WireTypeForNaturalType<::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse> {
  using type = ::test_union::wire::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::StructWithNullableUnion, ::test_union::StructWithNullableUnion> {
  static ::test_union::StructWithNullableUnion ToNatural(::test_union::wire::StructWithNullableUnion src);
  static ::test_union::wire::StructWithNullableUnion ToWire(fidl::AnyArena& arena, ::test_union::StructWithNullableUnion src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::StructWithNullableUnion> {
  using type = ::test_union::StructWithNullableUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::StructWithNullableUnion> {
  using type = ::test_union::wire::StructWithNullableUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::UnionSandwich, ::test_union::UnionSandwich> {
  static ::test_union::UnionSandwich ToNatural(::test_union::wire::UnionSandwich src);
  static ::test_union::wire::UnionSandwich ToWire(fidl::AnyArena& arena, ::test_union::UnionSandwich src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::UnionSandwich> {
  using type = ::test_union::UnionSandwich;
};
template <>
struct WireTypeForNaturalType<::test_union::UnionSandwich> {
  using type = ::test_union::wire::UnionSandwich;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::PizzaOrPasta, ::test_union::PizzaOrPasta> {
  static ::test_union::PizzaOrPasta ToNatural(::test_union::wire::PizzaOrPasta src);
  static ::test_union::wire::PizzaOrPasta ToWire(fidl::AnyArena& arena, ::test_union::PizzaOrPasta src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::PizzaOrPasta>, std::unique_ptr<::test_union::PizzaOrPasta>> {
  static std::unique_ptr<::test_union::PizzaOrPasta> ToNatural(::fidl::WireOptional<::test_union::wire::PizzaOrPasta> src);
  static ::fidl::WireOptional<::test_union::wire::PizzaOrPasta> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::PizzaOrPasta> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::PizzaOrPasta> {
  using type = ::test_union::PizzaOrPasta;
};
template <>
struct WireTypeForNaturalType<::test_union::PizzaOrPasta> {
  using type = ::test_union::wire::PizzaOrPasta;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::ExplicitPizzaOrPasta, ::test_union::ExplicitPizzaOrPasta> {
  static ::test_union::ExplicitPizzaOrPasta ToNatural(::test_union::wire::ExplicitPizzaOrPasta src);
  static ::test_union::wire::ExplicitPizzaOrPasta ToWire(fidl::AnyArena& arena, ::test_union::ExplicitPizzaOrPasta src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::ExplicitPizzaOrPasta>, std::unique_ptr<::test_union::ExplicitPizzaOrPasta>> {
  static std::unique_ptr<::test_union::ExplicitPizzaOrPasta> ToNatural(::fidl::WireOptional<::test_union::wire::ExplicitPizzaOrPasta> src);
  static ::fidl::WireOptional<::test_union::wire::ExplicitPizzaOrPasta> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitPizzaOrPasta> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::ExplicitPizzaOrPasta> {
  using type = ::test_union::ExplicitPizzaOrPasta;
};
template <>
struct WireTypeForNaturalType<::test_union::ExplicitPizzaOrPasta> {
  using type = ::test_union::wire::ExplicitPizzaOrPasta;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::FlexiblePizzaOrPasta, ::test_union::FlexiblePizzaOrPasta> {
  static ::test_union::FlexiblePizzaOrPasta ToNatural(::test_union::wire::FlexiblePizzaOrPasta src);
  static ::test_union::wire::FlexiblePizzaOrPasta ToWire(fidl::AnyArena& arena, ::test_union::FlexiblePizzaOrPasta src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::FlexiblePizzaOrPasta>, std::unique_ptr<::test_union::FlexiblePizzaOrPasta>> {
  static std::unique_ptr<::test_union::FlexiblePizzaOrPasta> ToNatural(::fidl::WireOptional<::test_union::wire::FlexiblePizzaOrPasta> src);
  static ::fidl::WireOptional<::test_union::wire::FlexiblePizzaOrPasta> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::FlexiblePizzaOrPasta> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::FlexiblePizzaOrPasta> {
  using type = ::test_union::FlexiblePizzaOrPasta;
};
template <>
struct WireTypeForNaturalType<::test_union::FlexiblePizzaOrPasta> {
  using type = ::test_union::wire::FlexiblePizzaOrPasta;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::StrictPizzaOrPasta, ::test_union::StrictPizzaOrPasta> {
  static ::test_union::StrictPizzaOrPasta ToNatural(::test_union::wire::StrictPizzaOrPasta src);
  static ::test_union::wire::StrictPizzaOrPasta ToWire(fidl::AnyArena& arena, ::test_union::StrictPizzaOrPasta src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::StrictPizzaOrPasta>, std::unique_ptr<::test_union::StrictPizzaOrPasta>> {
  static std::unique_ptr<::test_union::StrictPizzaOrPasta> ToNatural(::fidl::WireOptional<::test_union::wire::StrictPizzaOrPasta> src);
  static ::fidl::WireOptional<::test_union::wire::StrictPizzaOrPasta> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictPizzaOrPasta> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::StrictPizzaOrPasta> {
  using type = ::test_union::StrictPizzaOrPasta;
};
template <>
struct WireTypeForNaturalType<::test_union::StrictPizzaOrPasta> {
  using type = ::test_union::wire::StrictPizzaOrPasta;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::Union, ::test_union::Union> {
  static ::test_union::Union ToNatural(::test_union::wire::Union src);
  static ::test_union::wire::Union ToWire(fidl::AnyArena& arena, ::test_union::Union src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::Union>, std::unique_ptr<::test_union::Union>> {
  static std::unique_ptr<::test_union::Union> ToNatural(::fidl::WireOptional<::test_union::wire::Union> src);
  static ::fidl::WireOptional<::test_union::wire::Union> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::Union> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::Union> {
  using type = ::test_union::Union;
};
template <>
struct WireTypeForNaturalType<::test_union::Union> {
  using type = ::test_union::wire::Union;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::FlexibleUnion, ::test_union::FlexibleUnion> {
  static ::test_union::FlexibleUnion ToNatural(::test_union::wire::FlexibleUnion src);
  static ::test_union::wire::FlexibleUnion ToWire(fidl::AnyArena& arena, ::test_union::FlexibleUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::FlexibleUnion>, std::unique_ptr<::test_union::FlexibleUnion>> {
  static std::unique_ptr<::test_union::FlexibleUnion> ToNatural(::fidl::WireOptional<::test_union::wire::FlexibleUnion> src);
  static ::fidl::WireOptional<::test_union::wire::FlexibleUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::FlexibleUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::FlexibleUnion> {
  using type = ::test_union::FlexibleUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::FlexibleUnion> {
  using type = ::test_union::wire::FlexibleUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::StrictUnion, ::test_union::StrictUnion> {
  static ::test_union::StrictUnion ToNatural(::test_union::wire::StrictUnion src);
  static ::test_union::wire::StrictUnion ToWire(fidl::AnyArena& arena, ::test_union::StrictUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::StrictUnion>, std::unique_ptr<::test_union::StrictUnion>> {
  static std::unique_ptr<::test_union::StrictUnion> ToNatural(::fidl::WireOptional<::test_union::wire::StrictUnion> src);
  static ::fidl::WireOptional<::test_union::wire::StrictUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::StrictUnion> {
  using type = ::test_union::StrictUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::StrictUnion> {
  using type = ::test_union::wire::StrictUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::FieldCollision, ::test_union::FieldCollision> {
  static ::test_union::FieldCollision ToNatural(::test_union::wire::FieldCollision src);
  static ::test_union::wire::FieldCollision ToWire(fidl::AnyArena& arena, ::test_union::FieldCollision src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::FieldCollision>, std::unique_ptr<::test_union::FieldCollision>> {
  static std::unique_ptr<::test_union::FieldCollision> ToNatural(::fidl::WireOptional<::test_union::wire::FieldCollision> src);
  static ::fidl::WireOptional<::test_union::wire::FieldCollision> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::FieldCollision> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::FieldCollision> {
  using type = ::test_union::FieldCollision;
};
template <>
struct WireTypeForNaturalType<::test_union::FieldCollision> {
  using type = ::test_union::wire::FieldCollision;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::ExplicitUnion, ::test_union::ExplicitUnion> {
  static ::test_union::ExplicitUnion ToNatural(::test_union::wire::ExplicitUnion src);
  static ::test_union::wire::ExplicitUnion ToWire(fidl::AnyArena& arena, ::test_union::ExplicitUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::ExplicitUnion>, std::unique_ptr<::test_union::ExplicitUnion>> {
  static std::unique_ptr<::test_union::ExplicitUnion> ToNatural(::fidl::WireOptional<::test_union::wire::ExplicitUnion> src);
  static ::fidl::WireOptional<::test_union::wire::ExplicitUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::ExplicitUnion> {
  using type = ::test_union::ExplicitUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::ExplicitUnion> {
  using type = ::test_union::wire::ExplicitUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::ReverseOrdinalUnion, ::test_union::ReverseOrdinalUnion> {
  static ::test_union::ReverseOrdinalUnion ToNatural(::test_union::wire::ReverseOrdinalUnion src);
  static ::test_union::wire::ReverseOrdinalUnion ToWire(fidl::AnyArena& arena, ::test_union::ReverseOrdinalUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::ReverseOrdinalUnion>, std::unique_ptr<::test_union::ReverseOrdinalUnion>> {
  static std::unique_ptr<::test_union::ReverseOrdinalUnion> ToNatural(::fidl::WireOptional<::test_union::wire::ReverseOrdinalUnion> src);
  static ::fidl::WireOptional<::test_union::wire::ReverseOrdinalUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ReverseOrdinalUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::ReverseOrdinalUnion> {
  using type = ::test_union::ReverseOrdinalUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::ReverseOrdinalUnion> {
  using type = ::test_union::wire::ReverseOrdinalUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::FlexibleFoo, ::test_union::FlexibleFoo> {
  static ::test_union::FlexibleFoo ToNatural(::test_union::wire::FlexibleFoo src);
  static ::test_union::wire::FlexibleFoo ToWire(fidl::AnyArena& arena, ::test_union::FlexibleFoo src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::FlexibleFoo>, std::unique_ptr<::test_union::FlexibleFoo>> {
  static std::unique_ptr<::test_union::FlexibleFoo> ToNatural(::fidl::WireOptional<::test_union::wire::FlexibleFoo> src);
  static ::fidl::WireOptional<::test_union::wire::FlexibleFoo> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::FlexibleFoo> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::FlexibleFoo> {
  using type = ::test_union::FlexibleFoo;
};
template <>
struct WireTypeForNaturalType<::test_union::FlexibleFoo> {
  using type = ::test_union::wire::FlexibleFoo;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::StrictFoo, ::test_union::StrictFoo> {
  static ::test_union::StrictFoo ToNatural(::test_union::wire::StrictFoo src);
  static ::test_union::wire::StrictFoo ToWire(fidl::AnyArena& arena, ::test_union::StrictFoo src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::StrictFoo>, std::unique_ptr<::test_union::StrictFoo>> {
  static std::unique_ptr<::test_union::StrictFoo> ToNatural(::fidl::WireOptional<::test_union::wire::StrictFoo> src);
  static ::fidl::WireOptional<::test_union::wire::StrictFoo> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictFoo> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::StrictFoo> {
  using type = ::test_union::StrictFoo;
};
template <>
struct WireTypeForNaturalType<::test_union::StrictFoo> {
  using type = ::test_union::wire::StrictFoo;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::ExplicitFoo, ::test_union::ExplicitFoo> {
  static ::test_union::ExplicitFoo ToNatural(::test_union::wire::ExplicitFoo src);
  static ::test_union::wire::ExplicitFoo ToWire(fidl::AnyArena& arena, ::test_union::ExplicitFoo src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::ExplicitFoo>, std::unique_ptr<::test_union::ExplicitFoo>> {
  static std::unique_ptr<::test_union::ExplicitFoo> ToNatural(::fidl::WireOptional<::test_union::wire::ExplicitFoo> src);
  static ::fidl::WireOptional<::test_union::wire::ExplicitFoo> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitFoo> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::ExplicitFoo> {
  using type = ::test_union::ExplicitFoo;
};
template <>
struct WireTypeForNaturalType<::test_union::ExplicitFoo> {
  using type = ::test_union::wire::ExplicitFoo;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::ExplicitStrictFoo, ::test_union::ExplicitStrictFoo> {
  static ::test_union::ExplicitStrictFoo ToNatural(::test_union::wire::ExplicitStrictFoo src);
  static ::test_union::wire::ExplicitStrictFoo ToWire(fidl::AnyArena& arena, ::test_union::ExplicitStrictFoo src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::ExplicitStrictFoo>, std::unique_ptr<::test_union::ExplicitStrictFoo>> {
  static std::unique_ptr<::test_union::ExplicitStrictFoo> ToNatural(::fidl::WireOptional<::test_union::wire::ExplicitStrictFoo> src);
  static ::fidl::WireOptional<::test_union::wire::ExplicitStrictFoo> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitStrictFoo> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::ExplicitStrictFoo> {
  using type = ::test_union::ExplicitStrictFoo;
};
template <>
struct WireTypeForNaturalType<::test_union::ExplicitStrictFoo> {
  using type = ::test_union::wire::ExplicitStrictFoo;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::OlderSimpleUnion, ::test_union::OlderSimpleUnion> {
  static ::test_union::OlderSimpleUnion ToNatural(::test_union::wire::OlderSimpleUnion src);
  static ::test_union::wire::OlderSimpleUnion ToWire(fidl::AnyArena& arena, ::test_union::OlderSimpleUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::OlderSimpleUnion>, std::unique_ptr<::test_union::OlderSimpleUnion>> {
  static std::unique_ptr<::test_union::OlderSimpleUnion> ToNatural(::fidl::WireOptional<::test_union::wire::OlderSimpleUnion> src);
  static ::fidl::WireOptional<::test_union::wire::OlderSimpleUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::OlderSimpleUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::OlderSimpleUnion> {
  using type = ::test_union::OlderSimpleUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::OlderSimpleUnion> {
  using type = ::test_union::wire::OlderSimpleUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::NewerSimpleUnion, ::test_union::NewerSimpleUnion> {
  static ::test_union::NewerSimpleUnion ToNatural(::test_union::wire::NewerSimpleUnion src);
  static ::test_union::wire::NewerSimpleUnion ToWire(fidl::AnyArena& arena, ::test_union::NewerSimpleUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::NewerSimpleUnion>, std::unique_ptr<::test_union::NewerSimpleUnion>> {
  static std::unique_ptr<::test_union::NewerSimpleUnion> ToNatural(::fidl::WireOptional<::test_union::wire::NewerSimpleUnion> src);
  static ::fidl::WireOptional<::test_union::wire::NewerSimpleUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::NewerSimpleUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::NewerSimpleUnion> {
  using type = ::test_union::NewerSimpleUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::NewerSimpleUnion> {
  using type = ::test_union::wire::NewerSimpleUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::StrictSimpleUnion, ::test_union::StrictSimpleUnion> {
  static ::test_union::StrictSimpleUnion ToNatural(::test_union::wire::StrictSimpleUnion src);
  static ::test_union::wire::StrictSimpleUnion ToWire(fidl::AnyArena& arena, ::test_union::StrictSimpleUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::StrictSimpleUnion>, std::unique_ptr<::test_union::StrictSimpleUnion>> {
  static std::unique_ptr<::test_union::StrictSimpleUnion> ToNatural(::fidl::WireOptional<::test_union::wire::StrictSimpleUnion> src);
  static ::fidl::WireOptional<::test_union::wire::StrictSimpleUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictSimpleUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::StrictSimpleUnion> {
  using type = ::test_union::StrictSimpleUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::StrictSimpleUnion> {
  using type = ::test_union::wire::StrictSimpleUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::UnionContainingEmptyStruct, ::test_union::UnionContainingEmptyStruct> {
  static ::test_union::UnionContainingEmptyStruct ToNatural(::test_union::wire::UnionContainingEmptyStruct src);
  static ::test_union::wire::UnionContainingEmptyStruct ToWire(fidl::AnyArena& arena, ::test_union::UnionContainingEmptyStruct src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::UnionContainingEmptyStruct>, std::unique_ptr<::test_union::UnionContainingEmptyStruct>> {
  static std::unique_ptr<::test_union::UnionContainingEmptyStruct> ToNatural(::fidl::WireOptional<::test_union::wire::UnionContainingEmptyStruct> src);
  static ::fidl::WireOptional<::test_union::wire::UnionContainingEmptyStruct> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::UnionContainingEmptyStruct> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::UnionContainingEmptyStruct> {
  using type = ::test_union::UnionContainingEmptyStruct;
};
template <>
struct WireTypeForNaturalType<::test_union::UnionContainingEmptyStruct> {
  using type = ::test_union::wire::UnionContainingEmptyStruct;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::StrictBoundedUnion, ::test_union::StrictBoundedUnion> {
  static ::test_union::StrictBoundedUnion ToNatural(::test_union::wire::StrictBoundedUnion src);
  static ::test_union::wire::StrictBoundedUnion ToWire(fidl::AnyArena& arena, ::test_union::StrictBoundedUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::StrictBoundedUnion>, std::unique_ptr<::test_union::StrictBoundedUnion>> {
  static std::unique_ptr<::test_union::StrictBoundedUnion> ToNatural(::fidl::WireOptional<::test_union::wire::StrictBoundedUnion> src);
  static ::fidl::WireOptional<::test_union::wire::StrictBoundedUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::StrictBoundedUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::StrictBoundedUnion> {
  using type = ::test_union::StrictBoundedUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::StrictBoundedUnion> {
  using type = ::test_union::wire::StrictBoundedUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::ExplicitFlexibleUnion, ::test_union::ExplicitFlexibleUnion> {
  static ::test_union::ExplicitFlexibleUnion ToNatural(::test_union::wire::ExplicitFlexibleUnion src);
  static ::test_union::wire::ExplicitFlexibleUnion ToWire(fidl::AnyArena& arena, ::test_union::ExplicitFlexibleUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::ExplicitFlexibleUnion>, std::unique_ptr<::test_union::ExplicitFlexibleUnion>> {
  static std::unique_ptr<::test_union::ExplicitFlexibleUnion> ToNatural(::fidl::WireOptional<::test_union::wire::ExplicitFlexibleUnion> src);
  static ::fidl::WireOptional<::test_union::wire::ExplicitFlexibleUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::ExplicitFlexibleUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::ExplicitFlexibleUnion> {
  using type = ::test_union::ExplicitFlexibleUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::ExplicitFlexibleUnion> {
  using type = ::test_union::wire::ExplicitFlexibleUnion;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::UnionWithAttributes, ::test_union::UnionWithAttributes> {
  static ::test_union::UnionWithAttributes ToNatural(::test_union::wire::UnionWithAttributes src);
  static ::test_union::wire::UnionWithAttributes ToWire(fidl::AnyArena& arena, ::test_union::UnionWithAttributes src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::UnionWithAttributes>, std::unique_ptr<::test_union::UnionWithAttributes>> {
  static std::unique_ptr<::test_union::UnionWithAttributes> ToNatural(::fidl::WireOptional<::test_union::wire::UnionWithAttributes> src);
  static ::fidl::WireOptional<::test_union::wire::UnionWithAttributes> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::UnionWithAttributes> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::UnionWithAttributes> {
  using type = ::test_union::UnionWithAttributes;
};
template <>
struct WireTypeForNaturalType<::test_union::UnionWithAttributes> {
  using type = ::test_union::wire::UnionWithAttributes;
};

template <>
struct WireNaturalConversionTraits<::test_union::wire::EmptyFlexibleUnion, ::test_union::EmptyFlexibleUnion> {
  static ::test_union::EmptyFlexibleUnion ToNatural(::test_union::wire::EmptyFlexibleUnion src);
  static ::test_union::wire::EmptyFlexibleUnion ToWire(fidl::AnyArena& arena, ::test_union::EmptyFlexibleUnion src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_union::wire::EmptyFlexibleUnion>, std::unique_ptr<::test_union::EmptyFlexibleUnion>> {
  static std::unique_ptr<::test_union::EmptyFlexibleUnion> ToNatural(::fidl::WireOptional<::test_union::wire::EmptyFlexibleUnion> src);
  static ::fidl::WireOptional<::test_union::wire::EmptyFlexibleUnion> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_union::EmptyFlexibleUnion> src);
};

template <>
struct NaturalTypeForWireType<::test_union::wire::EmptyFlexibleUnion> {
  using type = ::test_union::EmptyFlexibleUnion;
};
template <>
struct WireTypeForNaturalType<::test_union::EmptyFlexibleUnion> {
  using type = ::test_union::wire::EmptyFlexibleUnion;
};

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>, ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>> {
  static ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> ToNatural(::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> src);
  static ::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>> {
  using type = ::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>> {
  using type = ::fidl::WireResponse<::test_union::TestProtocol::StrictUnionHenceResponseMayBeStackAllocated>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>, ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>> {
  static ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> ToNatural(::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> src);
  static ::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>> {
  using type = ::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>> {
  using type = ::fidl::WireResponse<::test_union::TestProtocol::FlexibleUnionHenceResponseMustBeHeapAllocated>;
};

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
