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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.handlesintypes/cpp/markers.h>
#include <fidl/test.handlesintypes/cpp/natural_types.h>
#include <fidl/test.handlesintypes/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.handlesintypes/cpp/natural_messaging.h>
#include <fidl/test.handlesintypes/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 NaturalTypeForWireType<::test_handlesintypes::wire::ObjType> {
  using type = ::test_handlesintypes::ObjType;
};
template <>
struct WireTypeForNaturalType<::test_handlesintypes::ObjType> {
  using type = ::test_handlesintypes::wire::ObjType;
};

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_handlesintypes::wire::HandlesInTypes> {
  using type = ::test_handlesintypes::HandlesInTypes;
};
template <>
struct WireTypeForNaturalType<::test_handlesintypes::HandlesInTypes> {
  using type = ::test_handlesintypes::wire::HandlesInTypes;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_handlesintypes::wire::EmptyResourceStruct> {
  using type = ::test_handlesintypes::EmptyResourceStruct;
};
template <>
struct WireTypeForNaturalType<::test_handlesintypes::EmptyResourceStruct> {
  using type = ::test_handlesintypes::wire::EmptyResourceStruct;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_handlesintypes::wire::TableWithHandle> {
  using type = ::test_handlesintypes::TableWithHandle;
};
template <>
struct WireTypeForNaturalType<::test_handlesintypes::TableWithHandle> {
  using type = ::test_handlesintypes::wire::TableWithHandle;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_handlesintypes::wire::EmptyResourceTable> {
  using type = ::test_handlesintypes::EmptyResourceTable;
};
template <>
struct WireTypeForNaturalType<::test_handlesintypes::EmptyResourceTable> {
  using type = ::test_handlesintypes::wire::EmptyResourceTable;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

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

template <>
struct NaturalTypeForWireType<::test_handlesintypes::wire::UnionWithHandle> {
  using type = ::test_handlesintypes::UnionWithHandle;
};
template <>
struct WireTypeForNaturalType<::test_handlesintypes::UnionWithHandle> {
  using type = ::test_handlesintypes::wire::UnionWithHandle;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

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

template <>
struct NaturalTypeForWireType<::test_handlesintypes::wire::EmptyResourceUnion> {
  using type = ::test_handlesintypes::EmptyResourceUnion;
};
template <>
struct WireTypeForNaturalType<::test_handlesintypes::EmptyResourceUnion> {
  using type = ::test_handlesintypes::wire::EmptyResourceUnion;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
