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

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

namespace fidl {
namespace internal {

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

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
