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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

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

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

::test_typesinprotocols::Basic WireNaturalConversionTraits<::test_typesinprotocols::wire::Basic, ::test_typesinprotocols::Basic>::ToNatural(::test_typesinprotocols::wire::Basic src) {
  return ::test_typesinprotocols::Basic{{
      .uint8 = WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.uint8)),
      .uint16 = WireNaturalConversionTraits<uint16_t, uint16_t>::ToNatural(std::move(src.uint16)),
      .uint32 = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.uint32)),
      .uint64 = WireNaturalConversionTraits<uint64_t, uint64_t>::ToNatural(std::move(src.uint64)),
      .int8 = WireNaturalConversionTraits<int8_t, int8_t>::ToNatural(std::move(src.int8)),
      .int16 = WireNaturalConversionTraits<int16_t, int16_t>::ToNatural(std::move(src.int16)),
      .int32 = WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.int32)),
      .int64 = WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.int64)),
      .float32 = WireNaturalConversionTraits<float, float>::ToNatural(std::move(src.float32)),
      .float64 = WireNaturalConversionTraits<double, double>::ToNatural(std::move(src.float64)),
      .string = WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.string)),
      .opt_string = WireNaturalConversionTraits<::fidl::StringView, ::std::optional<::std::string>>::ToNatural(std::move(src.opt_string)),
  }};
}
::test_typesinprotocols::wire::Basic WireNaturalConversionTraits<::test_typesinprotocols::wire::Basic, ::test_typesinprotocols::Basic>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::Basic src) {
  return ::test_typesinprotocols::wire::Basic{
      .uint8 = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.uint8())),
      .uint16 = WireNaturalConversionTraits<uint16_t, uint16_t>::ToWire(arena, std::move(src.uint16())),
      .uint32 = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.uint32())),
      .uint64 = WireNaturalConversionTraits<uint64_t, uint64_t>::ToWire(arena, std::move(src.uint64())),
      .int8 = WireNaturalConversionTraits<int8_t, int8_t>::ToWire(arena, std::move(src.int8())),
      .int16 = WireNaturalConversionTraits<int16_t, int16_t>::ToWire(arena, std::move(src.int16())),
      .int32 = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.int32())),
      .int64 = WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.int64())),
      .float32 = WireNaturalConversionTraits<float, float>::ToWire(arena, std::move(src.float32())),
      .float64 = WireNaturalConversionTraits<double, double>::ToWire(arena, std::move(src.float64())),
      .string = WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.string())),
      .opt_string = WireNaturalConversionTraits<::fidl::StringView, ::std::optional<::std::string>>::ToWire(arena, std::move(src.opt_string())),
  };
}

::test_typesinprotocols::Compound WireNaturalConversionTraits<::test_typesinprotocols::wire::Compound, ::test_typesinprotocols::Compound>::ToNatural(::test_typesinprotocols::wire::Compound src) {
  return ::test_typesinprotocols::Compound{{
      .bits = WireNaturalConversionTraits<::test_typesinprotocols::wire::Bits, ::test_typesinprotocols::Bits>::ToNatural(std::move(src.bits)),
      .enum_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::Enum, ::test_typesinprotocols::Enum>::ToNatural(std::move(src.enum_)),
      .struct_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::Struct, ::test_typesinprotocols::Struct>::ToNatural(std::move(src.struct_)),
      .table = WireNaturalConversionTraits<::test_typesinprotocols::wire::Table, ::test_typesinprotocols::Table>::ToNatural(std::move(src.table)),
      .union_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::Union, ::test_typesinprotocols::Union>::ToNatural(std::move(src.union_)),
      .opt_struct = WireNaturalConversionTraits<::fidl::ObjectView<::test_typesinprotocols::wire::Struct>, ::fidl::Box<::test_typesinprotocols::Struct>>::ToNatural(std::move(src.opt_struct)),
      .opt_union = WireNaturalConversionTraits<::fidl::WireOptional<::test_typesinprotocols::wire::Union>, ::fidl::Box<::test_typesinprotocols::Union>>::ToNatural(std::move(src.opt_union)),
  }};
}
::test_typesinprotocols::wire::Compound WireNaturalConversionTraits<::test_typesinprotocols::wire::Compound, ::test_typesinprotocols::Compound>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::Compound src) {
  return ::test_typesinprotocols::wire::Compound{
      .bits = WireNaturalConversionTraits<::test_typesinprotocols::wire::Bits, ::test_typesinprotocols::Bits>::ToWire(arena, std::move(src.bits())),
      .enum_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::Enum, ::test_typesinprotocols::Enum>::ToWire(arena, std::move(src.enum_())),
      .struct_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::Struct, ::test_typesinprotocols::Struct>::ToWire(arena, std::move(src.struct_())),
      .table = WireNaturalConversionTraits<::test_typesinprotocols::wire::Table, ::test_typesinprotocols::Table>::ToWire(arena, std::move(src.table())),
      .union_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::Union, ::test_typesinprotocols::Union>::ToWire(arena, std::move(src.union_())),
      .opt_struct = WireNaturalConversionTraits<::fidl::ObjectView<::test_typesinprotocols::wire::Struct>, ::fidl::Box<::test_typesinprotocols::Struct>>::ToWire(arena, std::move(src.opt_struct())),
      .opt_union = WireNaturalConversionTraits<::fidl::WireOptional<::test_typesinprotocols::wire::Union>, ::fidl::Box<::test_typesinprotocols::Union>>::ToWire(arena, std::move(src.opt_union())),
  };
}

::test_typesinprotocols::ArrayBasic WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayBasic, ::test_typesinprotocols::ArrayBasic>::ToNatural(::test_typesinprotocols::wire::ArrayBasic src) {
  return ::test_typesinprotocols::ArrayBasic{{
      .array_uint8 = WireNaturalConversionTraits<::fidl::Array<uint8_t, 5>, ::std::array<uint8_t, 5>>::ToNatural(std::move(src.array_uint8)),
      .array_uint16 = WireNaturalConversionTraits<::fidl::Array<uint16_t, 5>, ::std::array<uint16_t, 5>>::ToNatural(std::move(src.array_uint16)),
      .array_uint32 = WireNaturalConversionTraits<::fidl::Array<uint32_t, 5>, ::std::array<uint32_t, 5>>::ToNatural(std::move(src.array_uint32)),
      .array_uint64 = WireNaturalConversionTraits<::fidl::Array<uint64_t, 5>, ::std::array<uint64_t, 5>>::ToNatural(std::move(src.array_uint64)),
      .array_int8 = WireNaturalConversionTraits<::fidl::Array<int8_t, 5>, ::std::array<int8_t, 5>>::ToNatural(std::move(src.array_int8)),
      .array_int16 = WireNaturalConversionTraits<::fidl::Array<int16_t, 5>, ::std::array<int16_t, 5>>::ToNatural(std::move(src.array_int16)),
      .array_int32 = WireNaturalConversionTraits<::fidl::Array<int32_t, 5>, ::std::array<int32_t, 5>>::ToNatural(std::move(src.array_int32)),
      .array_int64 = WireNaturalConversionTraits<::fidl::Array<int64_t, 5>, ::std::array<int64_t, 5>>::ToNatural(std::move(src.array_int64)),
      .array_float32 = WireNaturalConversionTraits<::fidl::Array<float, 5>, ::std::array<float, 5>>::ToNatural(std::move(src.array_float32)),
      .array_float64 = WireNaturalConversionTraits<::fidl::Array<double, 5>, ::std::array<double, 5>>::ToNatural(std::move(src.array_float64)),
      .array_string = WireNaturalConversionTraits<::fidl::Array<::fidl::StringView, 5>, ::std::array<::std::string, 5>>::ToNatural(std::move(src.array_string)),
      .array_opt_string = WireNaturalConversionTraits<::fidl::Array<::fidl::StringView, 5>, ::std::array<::std::optional<::std::string>, 5>>::ToNatural(std::move(src.array_opt_string)),
  }};
}
::test_typesinprotocols::wire::ArrayBasic WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayBasic, ::test_typesinprotocols::ArrayBasic>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ArrayBasic src) {
  return ::test_typesinprotocols::wire::ArrayBasic{
      .array_uint8 = WireNaturalConversionTraits<::fidl::Array<uint8_t, 5>, ::std::array<uint8_t, 5>>::ToWire(arena, std::move(src.array_uint8())),
      .array_uint16 = WireNaturalConversionTraits<::fidl::Array<uint16_t, 5>, ::std::array<uint16_t, 5>>::ToWire(arena, std::move(src.array_uint16())),
      .array_uint32 = WireNaturalConversionTraits<::fidl::Array<uint32_t, 5>, ::std::array<uint32_t, 5>>::ToWire(arena, std::move(src.array_uint32())),
      .array_uint64 = WireNaturalConversionTraits<::fidl::Array<uint64_t, 5>, ::std::array<uint64_t, 5>>::ToWire(arena, std::move(src.array_uint64())),
      .array_int8 = WireNaturalConversionTraits<::fidl::Array<int8_t, 5>, ::std::array<int8_t, 5>>::ToWire(arena, std::move(src.array_int8())),
      .array_int16 = WireNaturalConversionTraits<::fidl::Array<int16_t, 5>, ::std::array<int16_t, 5>>::ToWire(arena, std::move(src.array_int16())),
      .array_int32 = WireNaturalConversionTraits<::fidl::Array<int32_t, 5>, ::std::array<int32_t, 5>>::ToWire(arena, std::move(src.array_int32())),
      .array_int64 = WireNaturalConversionTraits<::fidl::Array<int64_t, 5>, ::std::array<int64_t, 5>>::ToWire(arena, std::move(src.array_int64())),
      .array_float32 = WireNaturalConversionTraits<::fidl::Array<float, 5>, ::std::array<float, 5>>::ToWire(arena, std::move(src.array_float32())),
      .array_float64 = WireNaturalConversionTraits<::fidl::Array<double, 5>, ::std::array<double, 5>>::ToWire(arena, std::move(src.array_float64())),
      .array_string = WireNaturalConversionTraits<::fidl::Array<::fidl::StringView, 5>, ::std::array<::std::string, 5>>::ToWire(arena, std::move(src.array_string())),
      .array_opt_string = WireNaturalConversionTraits<::fidl::Array<::fidl::StringView, 5>, ::std::array<::std::optional<::std::string>, 5>>::ToWire(arena, std::move(src.array_opt_string())),
  };
}

::test_typesinprotocols::ArrayCompound WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayCompound, ::test_typesinprotocols::ArrayCompound>::ToNatural(::test_typesinprotocols::wire::ArrayCompound src) {
  return ::test_typesinprotocols::ArrayCompound{{
      .array_bits = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Bits, 5>, ::std::array<::test_typesinprotocols::Bits, 5>>::ToNatural(std::move(src.array_bits)),
      .array_enum = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Enum, 5>, ::std::array<::test_typesinprotocols::Enum, 5>>::ToNatural(std::move(src.array_enum)),
      .array_struct = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Struct, 5>, ::std::array<::test_typesinprotocols::Struct, 5>>::ToNatural(std::move(src.array_struct)),
      .array_table = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Table, 5>, ::std::array<::test_typesinprotocols::Table, 5>>::ToNatural(std::move(src.array_table)),
      .array_union = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Union, 5>, ::std::array<::test_typesinprotocols::Union, 5>>::ToNatural(std::move(src.array_union)),
      .array_opt_struct = WireNaturalConversionTraits<::fidl::Array<::fidl::ObjectView<::test_typesinprotocols::wire::Struct>, 5>, ::std::array<::fidl::Box<::test_typesinprotocols::Struct>, 5>>::ToNatural(std::move(src.array_opt_struct)),
      .array_opt_union = WireNaturalConversionTraits<::fidl::Array<::fidl::WireOptional<::test_typesinprotocols::wire::Union>, 5>, ::std::array<::fidl::Box<::test_typesinprotocols::Union>, 5>>::ToNatural(std::move(src.array_opt_union)),
  }};
}
::test_typesinprotocols::wire::ArrayCompound WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayCompound, ::test_typesinprotocols::ArrayCompound>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ArrayCompound src) {
  return ::test_typesinprotocols::wire::ArrayCompound{
      .array_bits = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Bits, 5>, ::std::array<::test_typesinprotocols::Bits, 5>>::ToWire(arena, std::move(src.array_bits())),
      .array_enum = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Enum, 5>, ::std::array<::test_typesinprotocols::Enum, 5>>::ToWire(arena, std::move(src.array_enum())),
      .array_struct = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Struct, 5>, ::std::array<::test_typesinprotocols::Struct, 5>>::ToWire(arena, std::move(src.array_struct())),
      .array_table = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Table, 5>, ::std::array<::test_typesinprotocols::Table, 5>>::ToWire(arena, std::move(src.array_table())),
      .array_union = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::Union, 5>, ::std::array<::test_typesinprotocols::Union, 5>>::ToWire(arena, std::move(src.array_union())),
      .array_opt_struct = WireNaturalConversionTraits<::fidl::Array<::fidl::ObjectView<::test_typesinprotocols::wire::Struct>, 5>, ::std::array<::fidl::Box<::test_typesinprotocols::Struct>, 5>>::ToWire(arena, std::move(src.array_opt_struct())),
      .array_opt_union = WireNaturalConversionTraits<::fidl::Array<::fidl::WireOptional<::test_typesinprotocols::wire::Union>, 5>, ::std::array<::fidl::Box<::test_typesinprotocols::Union>, 5>>::ToWire(arena, std::move(src.array_opt_union())),
  };
}

::test_typesinprotocols::VectorBasic WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorBasic, ::test_typesinprotocols::VectorBasic>::ToNatural(::test_typesinprotocols::wire::VectorBasic src) {
  return ::test_typesinprotocols::VectorBasic{{
      .vector_uint8 = WireNaturalConversionTraits<::fidl::VectorView<uint8_t>, ::std::vector<uint8_t>>::ToNatural(std::move(src.vector_uint8)),
      .vector_uint16 = WireNaturalConversionTraits<::fidl::VectorView<uint16_t>, ::std::vector<uint16_t>>::ToNatural(std::move(src.vector_uint16)),
      .vector_uint32 = WireNaturalConversionTraits<::fidl::VectorView<uint32_t>, ::std::vector<uint32_t>>::ToNatural(std::move(src.vector_uint32)),
      .vector_uint64 = WireNaturalConversionTraits<::fidl::VectorView<uint64_t>, ::std::vector<uint64_t>>::ToNatural(std::move(src.vector_uint64)),
      .vector_int8 = WireNaturalConversionTraits<::fidl::VectorView<int8_t>, ::std::vector<int8_t>>::ToNatural(std::move(src.vector_int8)),
      .vector_int16 = WireNaturalConversionTraits<::fidl::VectorView<int16_t>, ::std::vector<int16_t>>::ToNatural(std::move(src.vector_int16)),
      .vector_int32 = WireNaturalConversionTraits<::fidl::VectorView<int32_t>, ::std::vector<int32_t>>::ToNatural(std::move(src.vector_int32)),
      .vector_int64 = WireNaturalConversionTraits<::fidl::VectorView<int64_t>, ::std::vector<int64_t>>::ToNatural(std::move(src.vector_int64)),
      .vector_float32 = WireNaturalConversionTraits<::fidl::VectorView<float>, ::std::vector<float>>::ToNatural(std::move(src.vector_float32)),
      .vector_float64 = WireNaturalConversionTraits<::fidl::VectorView<double>, ::std::vector<double>>::ToNatural(std::move(src.vector_float64)),
      .vector_string = WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToNatural(std::move(src.vector_string)),
      .vector_opt_string = WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::optional<::std::string>>>::ToNatural(std::move(src.vector_opt_string)),
  }};
}
::test_typesinprotocols::wire::VectorBasic WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorBasic, ::test_typesinprotocols::VectorBasic>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::VectorBasic src) {
  return ::test_typesinprotocols::wire::VectorBasic{
      .vector_uint8 = WireNaturalConversionTraits<::fidl::VectorView<uint8_t>, ::std::vector<uint8_t>>::ToWire(arena, std::move(src.vector_uint8())),
      .vector_uint16 = WireNaturalConversionTraits<::fidl::VectorView<uint16_t>, ::std::vector<uint16_t>>::ToWire(arena, std::move(src.vector_uint16())),
      .vector_uint32 = WireNaturalConversionTraits<::fidl::VectorView<uint32_t>, ::std::vector<uint32_t>>::ToWire(arena, std::move(src.vector_uint32())),
      .vector_uint64 = WireNaturalConversionTraits<::fidl::VectorView<uint64_t>, ::std::vector<uint64_t>>::ToWire(arena, std::move(src.vector_uint64())),
      .vector_int8 = WireNaturalConversionTraits<::fidl::VectorView<int8_t>, ::std::vector<int8_t>>::ToWire(arena, std::move(src.vector_int8())),
      .vector_int16 = WireNaturalConversionTraits<::fidl::VectorView<int16_t>, ::std::vector<int16_t>>::ToWire(arena, std::move(src.vector_int16())),
      .vector_int32 = WireNaturalConversionTraits<::fidl::VectorView<int32_t>, ::std::vector<int32_t>>::ToWire(arena, std::move(src.vector_int32())),
      .vector_int64 = WireNaturalConversionTraits<::fidl::VectorView<int64_t>, ::std::vector<int64_t>>::ToWire(arena, std::move(src.vector_int64())),
      .vector_float32 = WireNaturalConversionTraits<::fidl::VectorView<float>, ::std::vector<float>>::ToWire(arena, std::move(src.vector_float32())),
      .vector_float64 = WireNaturalConversionTraits<::fidl::VectorView<double>, ::std::vector<double>>::ToWire(arena, std::move(src.vector_float64())),
      .vector_string = WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::string>>::ToWire(arena, std::move(src.vector_string())),
      .vector_opt_string = WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::vector<::std::optional<::std::string>>>::ToWire(arena, std::move(src.vector_opt_string())),
  };
}

::test_typesinprotocols::VectorCompound WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorCompound, ::test_typesinprotocols::VectorCompound>::ToNatural(::test_typesinprotocols::wire::VectorCompound src) {
  return ::test_typesinprotocols::VectorCompound{{
      .vector_bits = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Bits>, ::std::vector<::test_typesinprotocols::Bits>>::ToNatural(std::move(src.vector_bits)),
      .vector_enum = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Enum>, ::std::vector<::test_typesinprotocols::Enum>>::ToNatural(std::move(src.vector_enum)),
      .vector_struct = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Struct>, ::std::vector<::test_typesinprotocols::Struct>>::ToNatural(std::move(src.vector_struct)),
      .vector_table = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Table>, ::std::vector<::test_typesinprotocols::Table>>::ToNatural(std::move(src.vector_table)),
      .vector_union = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Union>, ::std::vector<::test_typesinprotocols::Union>>::ToNatural(std::move(src.vector_union)),
      .vector_opt_struct = WireNaturalConversionTraits<::fidl::VectorView<::fidl::ObjectView<::test_typesinprotocols::wire::Struct>>, ::std::vector<::fidl::Box<::test_typesinprotocols::Struct>>>::ToNatural(std::move(src.vector_opt_struct)),
      .vector_opt_union = WireNaturalConversionTraits<::fidl::VectorView<::fidl::WireOptional<::test_typesinprotocols::wire::Union>>, ::std::vector<::fidl::Box<::test_typesinprotocols::Union>>>::ToNatural(std::move(src.vector_opt_union)),
  }};
}
::test_typesinprotocols::wire::VectorCompound WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorCompound, ::test_typesinprotocols::VectorCompound>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::VectorCompound src) {
  return ::test_typesinprotocols::wire::VectorCompound{
      .vector_bits = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Bits>, ::std::vector<::test_typesinprotocols::Bits>>::ToWire(arena, std::move(src.vector_bits())),
      .vector_enum = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Enum>, ::std::vector<::test_typesinprotocols::Enum>>::ToWire(arena, std::move(src.vector_enum())),
      .vector_struct = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Struct>, ::std::vector<::test_typesinprotocols::Struct>>::ToWire(arena, std::move(src.vector_struct())),
      .vector_table = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Table>, ::std::vector<::test_typesinprotocols::Table>>::ToWire(arena, std::move(src.vector_table())),
      .vector_union = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Union>, ::std::vector<::test_typesinprotocols::Union>>::ToWire(arena, std::move(src.vector_union())),
      .vector_opt_struct = WireNaturalConversionTraits<::fidl::VectorView<::fidl::ObjectView<::test_typesinprotocols::wire::Struct>>, ::std::vector<::fidl::Box<::test_typesinprotocols::Struct>>>::ToWire(arena, std::move(src.vector_opt_struct())),
      .vector_opt_union = WireNaturalConversionTraits<::fidl::VectorView<::fidl::WireOptional<::test_typesinprotocols::wire::Union>>, ::std::vector<::fidl::Box<::test_typesinprotocols::Union>>>::ToWire(arena, std::move(src.vector_opt_union())),
  };
}

::test_typesinprotocols::VectorOptional WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorOptional, ::test_typesinprotocols::VectorOptional>::ToNatural(::test_typesinprotocols::wire::VectorOptional src) {
  return ::test_typesinprotocols::VectorOptional{{
      .opt_vector_uint8 = WireNaturalConversionTraits<::fidl::VectorView<uint8_t>, ::std::optional<::std::vector<uint8_t>>>::ToNatural(std::move(src.opt_vector_uint8)),
      .opt_vector_string = WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::optional<::std::vector<::std::string>>>::ToNatural(std::move(src.opt_vector_string)),
      .opt_vector_struct = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Struct>, ::std::optional<::std::vector<::test_typesinprotocols::Struct>>>::ToNatural(std::move(src.opt_vector_struct)),
      .opt_vector_opt_struct = WireNaturalConversionTraits<::fidl::VectorView<::fidl::ObjectView<::test_typesinprotocols::wire::Struct>>, ::std::optional<::std::vector<::fidl::Box<::test_typesinprotocols::Struct>>>>::ToNatural(std::move(src.opt_vector_opt_struct)),
  }};
}
::test_typesinprotocols::wire::VectorOptional WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorOptional, ::test_typesinprotocols::VectorOptional>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::VectorOptional src) {
  return ::test_typesinprotocols::wire::VectorOptional{
      .opt_vector_uint8 = WireNaturalConversionTraits<::fidl::VectorView<uint8_t>, ::std::optional<::std::vector<uint8_t>>>::ToWire(arena, std::move(src.opt_vector_uint8())),
      .opt_vector_string = WireNaturalConversionTraits<::fidl::VectorView<::fidl::StringView>, ::std::optional<::std::vector<::std::string>>>::ToWire(arena, std::move(src.opt_vector_string())),
      .opt_vector_struct = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::Struct>, ::std::optional<::std::vector<::test_typesinprotocols::Struct>>>::ToWire(arena, std::move(src.opt_vector_struct())),
      .opt_vector_opt_struct = WireNaturalConversionTraits<::fidl::VectorView<::fidl::ObjectView<::test_typesinprotocols::wire::Struct>>, ::std::optional<::std::vector<::fidl::Box<::test_typesinprotocols::Struct>>>>::ToWire(arena, std::move(src.opt_vector_opt_struct())),
  };
}

::test_typesinprotocols::ArrayVectorNested WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayVectorNested, ::test_typesinprotocols::ArrayVectorNested>::ToNatural(::test_typesinprotocols::wire::ArrayVectorNested src) {
  return ::test_typesinprotocols::ArrayVectorNested{{
      .array_array_uint8 = WireNaturalConversionTraits<::fidl::Array<::fidl::Array<uint8_t, 5>, 5>, ::std::array<::std::array<uint8_t, 5>, 5>>::ToNatural(std::move(src.array_array_uint8)),
      .array_vector_uint8 = WireNaturalConversionTraits<::fidl::Array<::fidl::VectorView<uint8_t>, 5>, ::std::array<::std::vector<uint8_t>, 5>>::ToNatural(std::move(src.array_vector_uint8)),
      .vector_array_uint8 = WireNaturalConversionTraits<::fidl::VectorView<::fidl::Array<uint8_t, 5>>, ::std::vector<::std::array<uint8_t, 5>>>::ToNatural(std::move(src.vector_array_uint8)),
      .vector_vector_uint8 = WireNaturalConversionTraits<::fidl::VectorView<::fidl::VectorView<uint8_t>>, ::std::vector<::std::vector<uint8_t>>>::ToNatural(std::move(src.vector_vector_uint8)),
  }};
}
::test_typesinprotocols::wire::ArrayVectorNested WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayVectorNested, ::test_typesinprotocols::ArrayVectorNested>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ArrayVectorNested src) {
  return ::test_typesinprotocols::wire::ArrayVectorNested{
      .array_array_uint8 = WireNaturalConversionTraits<::fidl::Array<::fidl::Array<uint8_t, 5>, 5>, ::std::array<::std::array<uint8_t, 5>, 5>>::ToWire(arena, std::move(src.array_array_uint8())),
      .array_vector_uint8 = WireNaturalConversionTraits<::fidl::Array<::fidl::VectorView<uint8_t>, 5>, ::std::array<::std::vector<uint8_t>, 5>>::ToWire(arena, std::move(src.array_vector_uint8())),
      .vector_array_uint8 = WireNaturalConversionTraits<::fidl::VectorView<::fidl::Array<uint8_t, 5>>, ::std::vector<::std::array<uint8_t, 5>>>::ToWire(arena, std::move(src.vector_array_uint8())),
      .vector_vector_uint8 = WireNaturalConversionTraits<::fidl::VectorView<::fidl::VectorView<uint8_t>>, ::std::vector<::std::vector<uint8_t>>>::ToWire(arena, std::move(src.vector_vector_uint8())),
  };
}

#ifdef __Fuchsia__

::test_typesinprotocols::Resource WireNaturalConversionTraits<::test_typesinprotocols::wire::Resource, ::test_typesinprotocols::Resource>::ToNatural(::test_typesinprotocols::wire::Resource src) {
  return ::test_typesinprotocols::Resource{{
      .handle = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToNatural(std::move(src.handle)),
      .vmo = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToNatural(std::move(src.vmo)),
      .client_end = WireNaturalConversionTraits<::fidl::ClientEnd<::test_typesinprotocols::Protocol>, ::fidl::ClientEnd<::test_typesinprotocols::Protocol>>::ToNatural(std::move(src.client_end)),
      .server_end = WireNaturalConversionTraits<::fidl::ServerEnd<::test_typesinprotocols::Protocol>, ::fidl::ServerEnd<::test_typesinprotocols::Protocol>>::ToNatural(std::move(src.server_end)),
      .struct_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceStruct, ::test_typesinprotocols::ResourceStruct>::ToNatural(std::move(src.struct_)),
      .table = WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceTable, ::test_typesinprotocols::ResourceTable>::ToNatural(std::move(src.table)),
      .union_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceUnion, ::test_typesinprotocols::ResourceUnion>::ToNatural(std::move(src.union_)),
      .opt_handle = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToNatural(std::move(src.opt_handle)),
      .opt_vmo = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToNatural(std::move(src.opt_vmo)),
      .opt_client_end = WireNaturalConversionTraits<::fidl::ClientEnd<::test_typesinprotocols::Protocol>, ::fidl::ClientEnd<::test_typesinprotocols::Protocol>>::ToNatural(std::move(src.opt_client_end)),
      .opt_server_end = WireNaturalConversionTraits<::fidl::ServerEnd<::test_typesinprotocols::Protocol>, ::fidl::ServerEnd<::test_typesinprotocols::Protocol>>::ToNatural(std::move(src.opt_server_end)),
      .opt_struct = WireNaturalConversionTraits<::fidl::ObjectView<::test_typesinprotocols::wire::ResourceStruct>, ::fidl::Box<::test_typesinprotocols::ResourceStruct>>::ToNatural(std::move(src.opt_struct)),
      .opt_union = WireNaturalConversionTraits<::fidl::WireOptional<::test_typesinprotocols::wire::ResourceUnion>, ::fidl::Box<::test_typesinprotocols::ResourceUnion>>::ToNatural(std::move(src.opt_union)),
      .array_handle = WireNaturalConversionTraits<::fidl::Array<::zx::handle, 5>, ::std::array<::zx::handle, 5>>::ToNatural(std::move(src.array_handle)),
      .array_vmo = WireNaturalConversionTraits<::fidl::Array<::zx::vmo, 5>, ::std::array<::zx::vmo, 5>>::ToNatural(std::move(src.array_vmo)),
      .array_client_end = WireNaturalConversionTraits<::fidl::Array<::fidl::ClientEnd<::test_typesinprotocols::Protocol>, 5>, ::std::array<::fidl::ClientEnd<::test_typesinprotocols::Protocol>, 5>>::ToNatural(std::move(src.array_client_end)),
      .array_server_end = WireNaturalConversionTraits<::fidl::Array<::fidl::ServerEnd<::test_typesinprotocols::Protocol>, 5>, ::std::array<::fidl::ServerEnd<::test_typesinprotocols::Protocol>, 5>>::ToNatural(std::move(src.array_server_end)),
      .array_struct = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::ResourceStruct, 5>, ::std::array<::test_typesinprotocols::ResourceStruct, 5>>::ToNatural(std::move(src.array_struct)),
      .array_table = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::ResourceTable, 5>, ::std::array<::test_typesinprotocols::ResourceTable, 5>>::ToNatural(std::move(src.array_table)),
      .array_union = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::ResourceUnion, 5>, ::std::array<::test_typesinprotocols::ResourceUnion, 5>>::ToNatural(std::move(src.array_union)),
      .vector_handle = WireNaturalConversionTraits<::fidl::VectorView<::zx::handle>, ::std::vector<::zx::handle>>::ToNatural(std::move(src.vector_handle)),
      .vector_vmo = WireNaturalConversionTraits<::fidl::VectorView<::zx::vmo>, ::std::vector<::zx::vmo>>::ToNatural(std::move(src.vector_vmo)),
      .vector_client_end = WireNaturalConversionTraits<::fidl::VectorView<::fidl::ClientEnd<::test_typesinprotocols::Protocol>>, ::std::vector<::fidl::ClientEnd<::test_typesinprotocols::Protocol>>>::ToNatural(std::move(src.vector_client_end)),
      .vector_server_end = WireNaturalConversionTraits<::fidl::VectorView<::fidl::ServerEnd<::test_typesinprotocols::Protocol>>, ::std::vector<::fidl::ServerEnd<::test_typesinprotocols::Protocol>>>::ToNatural(std::move(src.vector_server_end)),
      .vector_struct = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::ResourceStruct>, ::std::vector<::test_typesinprotocols::ResourceStruct>>::ToNatural(std::move(src.vector_struct)),
      .vector_table = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::ResourceTable>, ::std::vector<::test_typesinprotocols::ResourceTable>>::ToNatural(std::move(src.vector_table)),
      .vector_union = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::ResourceUnion>, ::std::vector<::test_typesinprotocols::ResourceUnion>>::ToNatural(std::move(src.vector_union)),
  }};
}
::test_typesinprotocols::wire::Resource WireNaturalConversionTraits<::test_typesinprotocols::wire::Resource, ::test_typesinprotocols::Resource>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::Resource src) {
  return ::test_typesinprotocols::wire::Resource{
      .handle = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToWire(arena, std::move(src.handle())),
      .vmo = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToWire(arena, std::move(src.vmo())),
      .client_end = WireNaturalConversionTraits<::fidl::ClientEnd<::test_typesinprotocols::Protocol>, ::fidl::ClientEnd<::test_typesinprotocols::Protocol>>::ToWire(arena, std::move(src.client_end())),
      .server_end = WireNaturalConversionTraits<::fidl::ServerEnd<::test_typesinprotocols::Protocol>, ::fidl::ServerEnd<::test_typesinprotocols::Protocol>>::ToWire(arena, std::move(src.server_end())),
      .struct_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceStruct, ::test_typesinprotocols::ResourceStruct>::ToWire(arena, std::move(src.struct_())),
      .table = WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceTable, ::test_typesinprotocols::ResourceTable>::ToWire(arena, std::move(src.table())),
      .union_ = WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceUnion, ::test_typesinprotocols::ResourceUnion>::ToWire(arena, std::move(src.union_())),
      .opt_handle = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToWire(arena, std::move(src.opt_handle())),
      .opt_vmo = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToWire(arena, std::move(src.opt_vmo())),
      .opt_client_end = WireNaturalConversionTraits<::fidl::ClientEnd<::test_typesinprotocols::Protocol>, ::fidl::ClientEnd<::test_typesinprotocols::Protocol>>::ToWire(arena, std::move(src.opt_client_end())),
      .opt_server_end = WireNaturalConversionTraits<::fidl::ServerEnd<::test_typesinprotocols::Protocol>, ::fidl::ServerEnd<::test_typesinprotocols::Protocol>>::ToWire(arena, std::move(src.opt_server_end())),
      .opt_struct = WireNaturalConversionTraits<::fidl::ObjectView<::test_typesinprotocols::wire::ResourceStruct>, ::fidl::Box<::test_typesinprotocols::ResourceStruct>>::ToWire(arena, std::move(src.opt_struct())),
      .opt_union = WireNaturalConversionTraits<::fidl::WireOptional<::test_typesinprotocols::wire::ResourceUnion>, ::fidl::Box<::test_typesinprotocols::ResourceUnion>>::ToWire(arena, std::move(src.opt_union())),
      .array_handle = WireNaturalConversionTraits<::fidl::Array<::zx::handle, 5>, ::std::array<::zx::handle, 5>>::ToWire(arena, std::move(src.array_handle())),
      .array_vmo = WireNaturalConversionTraits<::fidl::Array<::zx::vmo, 5>, ::std::array<::zx::vmo, 5>>::ToWire(arena, std::move(src.array_vmo())),
      .array_client_end = WireNaturalConversionTraits<::fidl::Array<::fidl::ClientEnd<::test_typesinprotocols::Protocol>, 5>, ::std::array<::fidl::ClientEnd<::test_typesinprotocols::Protocol>, 5>>::ToWire(arena, std::move(src.array_client_end())),
      .array_server_end = WireNaturalConversionTraits<::fidl::Array<::fidl::ServerEnd<::test_typesinprotocols::Protocol>, 5>, ::std::array<::fidl::ServerEnd<::test_typesinprotocols::Protocol>, 5>>::ToWire(arena, std::move(src.array_server_end())),
      .array_struct = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::ResourceStruct, 5>, ::std::array<::test_typesinprotocols::ResourceStruct, 5>>::ToWire(arena, std::move(src.array_struct())),
      .array_table = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::ResourceTable, 5>, ::std::array<::test_typesinprotocols::ResourceTable, 5>>::ToWire(arena, std::move(src.array_table())),
      .array_union = WireNaturalConversionTraits<::fidl::Array<::test_typesinprotocols::wire::ResourceUnion, 5>, ::std::array<::test_typesinprotocols::ResourceUnion, 5>>::ToWire(arena, std::move(src.array_union())),
      .vector_handle = WireNaturalConversionTraits<::fidl::VectorView<::zx::handle>, ::std::vector<::zx::handle>>::ToWire(arena, std::move(src.vector_handle())),
      .vector_vmo = WireNaturalConversionTraits<::fidl::VectorView<::zx::vmo>, ::std::vector<::zx::vmo>>::ToWire(arena, std::move(src.vector_vmo())),
      .vector_client_end = WireNaturalConversionTraits<::fidl::VectorView<::fidl::ClientEnd<::test_typesinprotocols::Protocol>>, ::std::vector<::fidl::ClientEnd<::test_typesinprotocols::Protocol>>>::ToWire(arena, std::move(src.vector_client_end())),
      .vector_server_end = WireNaturalConversionTraits<::fidl::VectorView<::fidl::ServerEnd<::test_typesinprotocols::Protocol>>, ::std::vector<::fidl::ServerEnd<::test_typesinprotocols::Protocol>>>::ToWire(arena, std::move(src.vector_server_end())),
      .vector_struct = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::ResourceStruct>, ::std::vector<::test_typesinprotocols::ResourceStruct>>::ToWire(arena, std::move(src.vector_struct())),
      .vector_table = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::ResourceTable>, ::std::vector<::test_typesinprotocols::ResourceTable>>::ToWire(arena, std::move(src.vector_table())),
      .vector_union = WireNaturalConversionTraits<::fidl::VectorView<::test_typesinprotocols::wire::ResourceUnion>, ::std::vector<::test_typesinprotocols::ResourceUnion>>::ToWire(arena, std::move(src.vector_union())),
  };
}

#endif  // __Fuchsia__

::test_typesinprotocols::Table WireNaturalConversionTraits<::test_typesinprotocols::wire::Table, ::test_typesinprotocols::Table>::ToNatural(::test_typesinprotocols::wire::Table src) {
  ::test_typesinprotocols::Table dst;

  return dst;
}
::test_typesinprotocols::wire::Table WireNaturalConversionTraits<::test_typesinprotocols::wire::Table, ::test_typesinprotocols::Table>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::Table src) {
  auto builder = ::test_typesinprotocols::wire::Table::Builder(arena);
  return builder.Build();
}

#ifdef __Fuchsia__

::test_typesinprotocols::ResourceTable WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceTable, ::test_typesinprotocols::ResourceTable>::ToNatural(::test_typesinprotocols::wire::ResourceTable src) {
  ::test_typesinprotocols::ResourceTable dst;

  return dst;
}
::test_typesinprotocols::wire::ResourceTable WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceTable, ::test_typesinprotocols::ResourceTable>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ResourceTable src) {
  auto builder = ::test_typesinprotocols::wire::ResourceTable::Builder(arena);
  return builder.Build();
}

#endif  // __Fuchsia__

::test_typesinprotocols::Union WireNaturalConversionTraits<::test_typesinprotocols::wire::Union, ::test_typesinprotocols::Union>::ToNatural(::test_typesinprotocols::wire::Union src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::Union::Tag::kB:
      return ::test_typesinprotocols::Union::WithB(
          WireNaturalConversionTraits<bool, bool>::ToNatural(std::move(src.b())));
    default:
      return ::test_typesinprotocols::Union(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_typesinprotocols::wire::Union WireNaturalConversionTraits<::test_typesinprotocols::wire::Union, ::test_typesinprotocols::Union>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::Union src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::Union::Tag::kB:
      return ::test_typesinprotocols::wire::Union::WithB(
          WireNaturalConversionTraits<bool, bool>::ToWire(arena, std::move(src.b().value())));
    default:
      return ::test_typesinprotocols::wire::Union();
  }
}

#ifdef __Fuchsia__

::test_typesinprotocols::ResourceUnion WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceUnion, ::test_typesinprotocols::ResourceUnion>::ToNatural(::test_typesinprotocols::wire::ResourceUnion src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ResourceUnion::Tag::kB:
      return ::test_typesinprotocols::ResourceUnion::WithB(
          WireNaturalConversionTraits<bool, bool>::ToNatural(std::move(src.b())));
    default:
      return ::test_typesinprotocols::ResourceUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_typesinprotocols::wire::ResourceUnion WireNaturalConversionTraits<::test_typesinprotocols::wire::ResourceUnion, ::test_typesinprotocols::ResourceUnion>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ResourceUnion src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ResourceUnion::Tag::kB:
      return ::test_typesinprotocols::wire::ResourceUnion::WithB(
          WireNaturalConversionTraits<bool, bool>::ToWire(arena, std::move(src.b().value())));
    default:
      return ::test_typesinprotocols::wire::ResourceUnion();
  }
}

#endif  // __Fuchsia__

::test_typesinprotocols::ProtocolErrorBasicResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorBasicResult, ::test_typesinprotocols::ProtocolErrorBasicResult>::ToNatural(::test_typesinprotocols::wire::ProtocolErrorBasicResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ProtocolErrorBasicResult::Tag::kResponse:
      return ::test_typesinprotocols::ProtocolErrorBasicResult::WithResponse(
          WireNaturalConversionTraits<::test_typesinprotocols::wire::Basic, ::test_typesinprotocols::Basic>::ToNatural(std::move(src.response())));
    case ::test_typesinprotocols::wire::ProtocolErrorBasicResult::Tag::kErr:
      return ::test_typesinprotocols::ProtocolErrorBasicResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_typesinprotocols::wire::ProtocolErrorBasicResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorBasicResult, ::test_typesinprotocols::ProtocolErrorBasicResult>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ProtocolErrorBasicResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ProtocolErrorBasicResult::Tag::kResponse:
      return ::test_typesinprotocols::wire::ProtocolErrorBasicResult::WithResponse(arena,
                                                                                   WireNaturalConversionTraits<::test_typesinprotocols::wire::Basic, ::test_typesinprotocols::Basic>::ToWire(arena, std::move(src.response().value())));
    case ::test_typesinprotocols::ProtocolErrorBasicResult::Tag::kErr:
      return ::test_typesinprotocols::wire::ProtocolErrorBasicResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

::test_typesinprotocols::ProtocolErrorCompoundResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorCompoundResult, ::test_typesinprotocols::ProtocolErrorCompoundResult>::ToNatural(::test_typesinprotocols::wire::ProtocolErrorCompoundResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ProtocolErrorCompoundResult::Tag::kResponse:
      return ::test_typesinprotocols::ProtocolErrorCompoundResult::WithResponse(
          WireNaturalConversionTraits<::test_typesinprotocols::wire::Compound, ::test_typesinprotocols::Compound>::ToNatural(std::move(src.response())));
    case ::test_typesinprotocols::wire::ProtocolErrorCompoundResult::Tag::kErr:
      return ::test_typesinprotocols::ProtocolErrorCompoundResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_typesinprotocols::wire::ProtocolErrorCompoundResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorCompoundResult, ::test_typesinprotocols::ProtocolErrorCompoundResult>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ProtocolErrorCompoundResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ProtocolErrorCompoundResult::Tag::kResponse:
      return ::test_typesinprotocols::wire::ProtocolErrorCompoundResult::WithResponse(arena,
                                                                                      WireNaturalConversionTraits<::test_typesinprotocols::wire::Compound, ::test_typesinprotocols::Compound>::ToWire(arena, std::move(src.response().value())));
    case ::test_typesinprotocols::ProtocolErrorCompoundResult::Tag::kErr:
      return ::test_typesinprotocols::wire::ProtocolErrorCompoundResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

::test_typesinprotocols::ProtocolErrorArrayBasicResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult, ::test_typesinprotocols::ProtocolErrorArrayBasicResult>::ToNatural(::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult::Tag::kResponse:
      return ::test_typesinprotocols::ProtocolErrorArrayBasicResult::WithResponse(
          WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayBasic, ::test_typesinprotocols::ArrayBasic>::ToNatural(std::move(src.response())));
    case ::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult::Tag::kErr:
      return ::test_typesinprotocols::ProtocolErrorArrayBasicResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult, ::test_typesinprotocols::ProtocolErrorArrayBasicResult>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ProtocolErrorArrayBasicResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ProtocolErrorArrayBasicResult::Tag::kResponse:
      return ::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult::WithResponse(arena,
                                                                                        WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayBasic, ::test_typesinprotocols::ArrayBasic>::ToWire(arena, std::move(src.response().value())));
    case ::test_typesinprotocols::ProtocolErrorArrayBasicResult::Tag::kErr:
      return ::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

::test_typesinprotocols::ProtocolErrorArrayCompoundResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult, ::test_typesinprotocols::ProtocolErrorArrayCompoundResult>::ToNatural(::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult::Tag::kResponse:
      return ::test_typesinprotocols::ProtocolErrorArrayCompoundResult::WithResponse(
          WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayCompound, ::test_typesinprotocols::ArrayCompound>::ToNatural(std::move(src.response())));
    case ::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult::Tag::kErr:
      return ::test_typesinprotocols::ProtocolErrorArrayCompoundResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult, ::test_typesinprotocols::ProtocolErrorArrayCompoundResult>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ProtocolErrorArrayCompoundResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ProtocolErrorArrayCompoundResult::Tag::kResponse:
      return ::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult::WithResponse(arena,
                                                                                           WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayCompound, ::test_typesinprotocols::ArrayCompound>::ToWire(arena, std::move(src.response().value())));
    case ::test_typesinprotocols::ProtocolErrorArrayCompoundResult::Tag::kErr:
      return ::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

::test_typesinprotocols::ProtocolErrorVectorBasicResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult, ::test_typesinprotocols::ProtocolErrorVectorBasicResult>::ToNatural(::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult::Tag::kResponse:
      return ::test_typesinprotocols::ProtocolErrorVectorBasicResult::WithResponse(
          WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorBasic, ::test_typesinprotocols::VectorBasic>::ToNatural(std::move(src.response())));
    case ::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult::Tag::kErr:
      return ::test_typesinprotocols::ProtocolErrorVectorBasicResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult, ::test_typesinprotocols::ProtocolErrorVectorBasicResult>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ProtocolErrorVectorBasicResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ProtocolErrorVectorBasicResult::Tag::kResponse:
      return ::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult::WithResponse(arena,
                                                                                         WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorBasic, ::test_typesinprotocols::VectorBasic>::ToWire(arena, std::move(src.response().value())));
    case ::test_typesinprotocols::ProtocolErrorVectorBasicResult::Tag::kErr:
      return ::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

::test_typesinprotocols::ProtocolErrorVectorCompoundResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult, ::test_typesinprotocols::ProtocolErrorVectorCompoundResult>::ToNatural(::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult::Tag::kResponse:
      return ::test_typesinprotocols::ProtocolErrorVectorCompoundResult::WithResponse(
          WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorCompound, ::test_typesinprotocols::VectorCompound>::ToNatural(std::move(src.response())));
    case ::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult::Tag::kErr:
      return ::test_typesinprotocols::ProtocolErrorVectorCompoundResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult, ::test_typesinprotocols::ProtocolErrorVectorCompoundResult>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ProtocolErrorVectorCompoundResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ProtocolErrorVectorCompoundResult::Tag::kResponse:
      return ::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult::WithResponse(arena,
                                                                                            WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorCompound, ::test_typesinprotocols::VectorCompound>::ToWire(arena, std::move(src.response().value())));
    case ::test_typesinprotocols::ProtocolErrorVectorCompoundResult::Tag::kErr:
      return ::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

::test_typesinprotocols::ProtocolErrorVectorOptionalResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult, ::test_typesinprotocols::ProtocolErrorVectorOptionalResult>::ToNatural(::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult::Tag::kResponse:
      return ::test_typesinprotocols::ProtocolErrorVectorOptionalResult::WithResponse(
          WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorOptional, ::test_typesinprotocols::VectorOptional>::ToNatural(std::move(src.response())));
    case ::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult::Tag::kErr:
      return ::test_typesinprotocols::ProtocolErrorVectorOptionalResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult, ::test_typesinprotocols::ProtocolErrorVectorOptionalResult>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ProtocolErrorVectorOptionalResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ProtocolErrorVectorOptionalResult::Tag::kResponse:
      return ::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult::WithResponse(arena,
                                                                                            WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorOptional, ::test_typesinprotocols::VectorOptional>::ToWire(arena, std::move(src.response().value())));
    case ::test_typesinprotocols::ProtocolErrorVectorOptionalResult::Tag::kErr:
      return ::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult, ::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult>::ToNatural(::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult::Tag::kResponse:
      return ::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult::WithResponse(
          WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayVectorNested, ::test_typesinprotocols::ArrayVectorNested>::ToNatural(std::move(src.response())));
    case ::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult::Tag::kErr:
      return ::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult, ::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult::Tag::kResponse:
      return ::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult::WithResponse(arena,
                                                                                               WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayVectorNested, ::test_typesinprotocols::ArrayVectorNested>::ToWire(arena, std::move(src.response().value())));
    case ::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult::Tag::kErr:
      return ::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

#ifdef __Fuchsia__

::test_typesinprotocols::ProtocolErrorResourceResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorResourceResult, ::test_typesinprotocols::ProtocolErrorResourceResult>::ToNatural(::test_typesinprotocols::wire::ProtocolErrorResourceResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::wire::ProtocolErrorResourceResult::Tag::kResponse:
      return ::test_typesinprotocols::ProtocolErrorResourceResult::WithResponse(
          WireNaturalConversionTraits<::test_typesinprotocols::wire::Resource, ::test_typesinprotocols::Resource>::ToNatural(std::move(src.response())));
    case ::test_typesinprotocols::wire::ProtocolErrorResourceResult::Tag::kErr:
      return ::test_typesinprotocols::ProtocolErrorResourceResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_typesinprotocols::wire::ProtocolErrorResourceResult WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorResourceResult, ::test_typesinprotocols::ProtocolErrorResourceResult>::ToWire(fidl::AnyArena& arena, ::test_typesinprotocols::ProtocolErrorResourceResult src) {
  switch (src.Which()) {
    case ::test_typesinprotocols::ProtocolErrorResourceResult::Tag::kResponse:
      return ::test_typesinprotocols::wire::ProtocolErrorResourceResult::WithResponse(arena,
                                                                                      WireNaturalConversionTraits<::test_typesinprotocols::wire::Resource, ::test_typesinprotocols::Resource>::ToWire(arena, std::move(src.response().value())));
    case ::test_typesinprotocols::ProtocolErrorResourceResult::Tag::kErr:
      return ::test_typesinprotocols::wire::ProtocolErrorResourceResult::WithErr(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.err().value())));
  }
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

::fidl::Response<::test_typesinprotocols::Protocol::TwoWayBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayBasic>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayBasic> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::Basic, ::test_typesinprotocols::Basic>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayBasic>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayBasic> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::Basic, ::test_typesinprotocols::Basic>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::ErrorBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorBasic>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorBasic> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::ErrorBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorBasicResult, ::fit::result<uint32_t, ::test_typesinprotocols::Basic>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorBasic>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorBasic> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorBasicResult, ::fit::result<uint32_t, ::test_typesinprotocols::Basic>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::TwoWayCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayCompound>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayCompound> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::Compound, ::test_typesinprotocols::Compound>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayCompound>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayCompound> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::Compound, ::test_typesinprotocols::Compound>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::ErrorCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorCompound>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorCompound> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::ErrorCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorCompoundResult, ::fit::result<uint32_t, ::test_typesinprotocols::Compound>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorCompound>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorCompound> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorCompoundResult, ::fit::result<uint32_t, ::test_typesinprotocols::Compound>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayBasic>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayBasic> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayBasic, ::test_typesinprotocols::ArrayBasic>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayBasic>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayBasic> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayBasic, ::test_typesinprotocols::ArrayBasic>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayBasic>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayBasic> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult, ::fit::result<uint32_t, ::test_typesinprotocols::ArrayBasic>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayBasic>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayBasic> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayBasicResult, ::fit::result<uint32_t, ::test_typesinprotocols::ArrayBasic>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayCompound>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayCompound> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayCompound, ::test_typesinprotocols::ArrayCompound>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayCompound>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayCompound> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayCompound, ::test_typesinprotocols::ArrayCompound>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayCompound>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayCompound> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult, ::fit::result<uint32_t, ::test_typesinprotocols::ArrayCompound>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayCompound>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayCompound> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayCompoundResult, ::fit::result<uint32_t, ::test_typesinprotocols::ArrayCompound>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorBasic>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorBasic> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorBasic, ::test_typesinprotocols::VectorBasic>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorBasic>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorBasic> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorBasic, ::test_typesinprotocols::VectorBasic>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorBasic>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorBasic> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult, ::fit::result<uint32_t, ::test_typesinprotocols::VectorBasic>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorBasic> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorBasic>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorBasic>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorBasic> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorBasic>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorBasicResult, ::fit::result<uint32_t, ::test_typesinprotocols::VectorBasic>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorCompound>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorCompound> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorCompound, ::test_typesinprotocols::VectorCompound>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorCompound>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorCompound> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorCompound, ::test_typesinprotocols::VectorCompound>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorCompound>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorCompound> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult, ::fit::result<uint32_t, ::test_typesinprotocols::VectorCompound>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorCompound> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorCompound>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorCompound>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorCompound> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorCompound>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorCompoundResult, ::fit::result<uint32_t, ::test_typesinprotocols::VectorCompound>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorOptional> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorOptional>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorOptional>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorOptional> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorOptional>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorOptional, ::test_typesinprotocols::VectorOptional>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorOptional> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorOptional>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorOptional>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayVectorOptional> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayVectorOptional>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::VectorOptional, ::test_typesinprotocols::VectorOptional>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorOptional> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorOptional>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorOptional>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorOptional> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorOptional>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult, ::fit::result<uint32_t, ::test_typesinprotocols::VectorOptional>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorOptional> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorOptional>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorOptional>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorVectorOptional> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorVectorOptional>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorVectorOptionalResult, ::fit::result<uint32_t, ::test_typesinprotocols::VectorOptional>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayVectorNested, ::test_typesinprotocols::ArrayVectorNested>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayArrayVectorNested>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ArrayVectorNested, ::test_typesinprotocols::ArrayVectorNested>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayVectorNested> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayVectorNested>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayVectorNested>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayVectorNested> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayVectorNested>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult, ::fit::result<uint32_t, ::test_typesinprotocols::ArrayVectorNested>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayVectorNested> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayVectorNested>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayVectorNested>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorArrayVectorNested> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorArrayVectorNested>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorArrayVectorNestedResult, ::fit::result<uint32_t, ::test_typesinprotocols::ArrayVectorNested>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::TwoWayResource> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayResource>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayResource>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayResource> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayResource>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::Resource, ::test_typesinprotocols::Resource>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayResource> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayResource>, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayResource>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::TwoWayResource> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::TwoWayResource>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::Resource, ::test_typesinprotocols::Resource>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_typesinprotocols::Protocol::ErrorResource> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorResource>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorResource>>::ToNatural(::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorResource> src) {
  return ::fidl::Response<::test_typesinprotocols::Protocol::ErrorResource>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorResourceResult, ::fit::result<uint32_t, ::test_typesinprotocols::Resource>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorResource> WireNaturalConversionTraits<::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorResource>, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorResource>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_typesinprotocols::Protocol::ErrorResource> src) {
  return ::fidl::WireResponse<::test_typesinprotocols::Protocol::ErrorResource>(
      WireNaturalConversionTraits<::test_typesinprotocols::wire::ProtocolErrorResourceResult, ::fit::result<uint32_t, ::test_typesinprotocols::Resource>>::ToWire(arena, std::move(src)));
}

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
