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

#pragma once

#include <fidl/test.driverhandle/cpp/markers.h>
#include <fidl/test.driverhandle/cpp/natural_types.h>
#include <fidl/test.driverhandle/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.driverhandle/cpp/natural_messaging.h>
#include <fidl/test.driverhandle/cpp/wire_messaging.h>
#endif  // __Fuchsia__
#include <lib/fidl/cpp/wire_natural_conversions.h>

namespace fidl {
namespace internal {

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<
    ::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest> {
  using type = ::test_driverhandle::HandlesInProtocolSendHandlesRequest;
};
template <>
struct WireTypeForNaturalType<
    ::test_driverhandle::HandlesInProtocolSendHandlesRequest> {
  using type = ::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_driverhandle::wire::ServerEndWrapper> {
  using type = ::test_driverhandle::ServerEndWrapper;
};
template <>
struct WireTypeForNaturalType<::test_driverhandle::ServerEndWrapper> {
  using type = ::test_driverhandle::wire::ServerEndWrapper;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_driverhandle::wire::ClientEndWrapper> {
  using type = ::test_driverhandle::ClientEndWrapper;
};
template <>
struct WireTypeForNaturalType<::test_driverhandle::ClientEndWrapper> {
  using type = ::test_driverhandle::wire::ClientEndWrapper;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::test_driverhandle::wire::T> {
  using type = ::test_driverhandle::T;
};
template <>
struct WireTypeForNaturalType<::test_driverhandle::T> {
  using type = ::test_driverhandle::wire::T;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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