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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.nullable/cpp/markers.h>
#include <fidl/test.nullable/cpp/natural_types.h>
#include <fidl/test.nullable/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.nullable/cpp/natural_messaging.h>
#include <fidl/test.nullable/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_nullable::wire::StructWithNullableString, ::test_nullable::StructWithNullableString> {
  static ::test_nullable::StructWithNullableString ToNatural(::test_nullable::wire::StructWithNullableString src);
  static ::test_nullable::wire::StructWithNullableString ToWire(fidl::AnyArena& arena, ::test_nullable::StructWithNullableString src);
};

template <>
struct NaturalTypeForWireType<::test_nullable::wire::StructWithNullableString> {
  using type = ::test_nullable::StructWithNullableString;
};
template <>
struct WireTypeForNaturalType<::test_nullable::StructWithNullableString> {
  using type = ::test_nullable::wire::StructWithNullableString;
};

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

template <>
struct NaturalTypeForWireType<::test_nullable::wire::StructWithNullableVector> {
  using type = ::test_nullable::StructWithNullableVector;
};
template <>
struct WireTypeForNaturalType<::test_nullable::StructWithNullableVector> {
  using type = ::test_nullable::wire::StructWithNullableVector;
};

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_nullable::wire::StructWithNullableHandle> {
  using type = ::test_nullable::StructWithNullableHandle;
};
template <>
struct WireTypeForNaturalType<::test_nullable::StructWithNullableHandle> {
  using type = ::test_nullable::wire::StructWithNullableHandle;
};

#endif  // __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_nullable::wire::SimpleProtocolAddRequest> {
  using type = ::test_nullable::SimpleProtocolAddRequest;
};
template <>
struct WireTypeForNaturalType<::test_nullable::SimpleProtocolAddRequest> {
  using type = ::test_nullable::wire::SimpleProtocolAddRequest;
};

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

template <>
struct NaturalTypeForWireType<::test_nullable::wire::SimpleProtocolAddResponse> {
  using type = ::test_nullable::SimpleProtocolAddResponse;
};
template <>
struct WireTypeForNaturalType<::test_nullable::SimpleProtocolAddResponse> {
  using type = ::test_nullable::wire::SimpleProtocolAddResponse;
};

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_nullable::wire::StructWithNullableProtocol> {
  using type = ::test_nullable::StructWithNullableProtocol;
};
template <>
struct WireTypeForNaturalType<::test_nullable::StructWithNullableProtocol> {
  using type = ::test_nullable::wire::StructWithNullableProtocol;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_nullable::wire::StructWithNullableRequest> {
  using type = ::test_nullable::StructWithNullableRequest;
};
template <>
struct WireTypeForNaturalType<::test_nullable::StructWithNullableRequest> {
  using type = ::test_nullable::wire::StructWithNullableRequest;
};

#endif  // __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_nullable::wire::Int32Wrapper> {
  using type = ::test_nullable::Int32Wrapper;
};
template <>
struct WireTypeForNaturalType<::test_nullable::Int32Wrapper> {
  using type = ::test_nullable::wire::Int32Wrapper;
};

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

template <>
struct NaturalTypeForWireType<::test_nullable::wire::StructWithNullableStruct> {
  using type = ::test_nullable::StructWithNullableStruct;
};
template <>
struct WireTypeForNaturalType<::test_nullable::StructWithNullableStruct> {
  using type = ::test_nullable::wire::StructWithNullableStruct;
};

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

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

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

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

template <>
struct NaturalTypeForWireType<::test_nullable::wire::SimpleUnion> {
  using type = ::test_nullable::SimpleUnion;
};
template <>
struct WireTypeForNaturalType<::test_nullable::SimpleUnion> {
  using type = ::test_nullable::wire::SimpleUnion;
};

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_nullable::SimpleProtocol::Add>, ::fidl::Response<::test_nullable::SimpleProtocol::Add>> {
  static ::fidl::Response<::test_nullable::SimpleProtocol::Add> ToNatural(::fidl::WireResponse<::test_nullable::SimpleProtocol::Add> src);
  static ::fidl::WireResponse<::test_nullable::SimpleProtocol::Add> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_nullable::SimpleProtocol::Add> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_nullable::SimpleProtocol::Add>> {
  using type = ::fidl::Response<::test_nullable::SimpleProtocol::Add>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_nullable::SimpleProtocol::Add>> {
  using type = ::fidl::WireResponse<::test_nullable::SimpleProtocol::Add>;
};

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
