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

#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>

namespace fidl {
namespace internal {

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;
};

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

#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__

#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::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::SimpleProtocolAddTopResponse,
    ::test_nullable::SimpleProtocolAddTopResponse> {
  static ::test_nullable::SimpleProtocolAddTopResponse ToNatural(
      ::test_nullable::wire::SimpleProtocolAddTopResponse src);
  static ::test_nullable::wire::SimpleProtocolAddTopResponse ToWire(
      fidl::AnyArena& arena, ::test_nullable::SimpleProtocolAddTopResponse src);
};

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

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::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::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<
    ::test_nullable::wire::SimpleUnion,
    std::unique_ptr<::test_nullable::SimpleUnion>> {
  static std::unique_ptr<::test_nullable::SimpleUnion> ToNatural(
      ::test_nullable::wire::SimpleUnion src);
  static ::test_nullable::wire::SimpleUnion ToWire(
      fidl::AnyArena& arena, std::unique_ptr<::test_nullable::SimpleUnion> src);
};

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

#ifdef __Fuchsia__

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

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

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__
}  // namespace internal
}  // namespace fidl
