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

#pragma once

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

namespace fidl {
namespace internal {

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<
    ::test_protocolrequest::wire::ParentTakeChildRequestRequest> {
  using type = ::test_protocolrequest::ParentTakeChildRequestRequest;
};
template <>
struct WireTypeForNaturalType<
    ::test_protocolrequest::ParentTakeChildRequestRequest> {
  using type = ::test_protocolrequest::wire::ParentTakeChildRequestRequest;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<
    ::test_protocolrequest::wire::ParentTakeChildRequest> {
  using type = ::test_protocolrequest::ParentTakeChildRequest;
};
template <>
struct WireTypeForNaturalType<::test_protocolrequest::ParentTakeChildRequest> {
  using type = ::test_protocolrequest::wire::ParentTakeChildRequest;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<
    ::test_protocolrequest::wire::ParentGetChildTopResponse> {
  using type = ::test_protocolrequest::ParentGetChildTopResponse;
};
template <>
struct WireTypeForNaturalType<
    ::test_protocolrequest::ParentGetChildTopResponse> {
  using type = ::test_protocolrequest::wire::ParentGetChildTopResponse;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<
    ::test_protocolrequest::wire::ParentGetChildRequestTopResponse> {
  using type = ::test_protocolrequest::ParentGetChildRequestTopResponse;
};
template <>
struct WireTypeForNaturalType<
    ::test_protocolrequest::ParentGetChildRequestTopResponse> {
  using type = ::test_protocolrequest::wire::ParentGetChildRequestTopResponse;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_protocolrequest::Parent::GetChild>,
    ::fidl::Request<::test_protocolrequest::Parent::GetChild>> {
  static ::fidl::Request<::test_protocolrequest::Parent::GetChild> ToNatural(
      ::fidl::WireRequest<::test_protocolrequest::Parent::GetChild> src);
  static ::fidl::WireRequest<::test_protocolrequest::Parent::GetChild> ToWire(
      fidl::AnyArena& arena,
      ::fidl::Request<::test_protocolrequest::Parent::GetChild> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireRequest<::test_protocolrequest::Parent::GetChild>> {
  using type = ::fidl::Request<::test_protocolrequest::Parent::GetChild>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Request<::test_protocolrequest::Parent::GetChild>> {
  using type = ::fidl::WireRequest<::test_protocolrequest::Parent::GetChild>;
};

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_protocolrequest::Parent::GetChildRequest>,
    ::fidl::Request<::test_protocolrequest::Parent::GetChildRequest>> {
  static ::fidl::Request<::test_protocolrequest::Parent::GetChildRequest>
  ToNatural(
      ::fidl::WireRequest<::test_protocolrequest::Parent::GetChildRequest> src);
  static ::fidl::WireRequest<::test_protocolrequest::Parent::GetChildRequest>
  ToWire(fidl::AnyArena& arena,
         ::fidl::Request<::test_protocolrequest::Parent::GetChildRequest> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireRequest<::test_protocolrequest::Parent::GetChildRequest>> {
  using type = ::fidl::Request<::test_protocolrequest::Parent::GetChildRequest>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Request<::test_protocolrequest::Parent::GetChildRequest>> {
  using type =
      ::fidl::WireRequest<::test_protocolrequest::Parent::GetChildRequest>;
};

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChild>,
    ::fidl::Request<::test_protocolrequest::Parent::TakeChild>> {
  static ::fidl::Request<::test_protocolrequest::Parent::TakeChild> ToNatural(
      ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChild> src);
  static ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChild> ToWire(
      fidl::AnyArena& arena,
      ::fidl::Request<::test_protocolrequest::Parent::TakeChild> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChild>> {
  using type = ::fidl::Request<::test_protocolrequest::Parent::TakeChild>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Request<::test_protocolrequest::Parent::TakeChild>> {
  using type = ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChild>;
};

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChildRequest>,
    ::fidl::Request<::test_protocolrequest::Parent::TakeChildRequest>> {
  static ::fidl::Request<::test_protocolrequest::Parent::TakeChildRequest>
  ToNatural(
      ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChildRequest>
          src);
  static ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChildRequest>
  ToWire(fidl::AnyArena& arena,
         ::fidl::Request<::test_protocolrequest::Parent::TakeChildRequest> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChildRequest>> {
  using type =
      ::fidl::Request<::test_protocolrequest::Parent::TakeChildRequest>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Request<::test_protocolrequest::Parent::TakeChildRequest>> {
  using type =
      ::fidl::WireRequest<::test_protocolrequest::Parent::TakeChildRequest>;
};

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_protocolrequest::Parent::GetChild>,
    ::fidl::Response<::test_protocolrequest::Parent::GetChild>> {
  static ::fidl::Response<::test_protocolrequest::Parent::GetChild> ToNatural(
      ::fidl::WireResponse<::test_protocolrequest::Parent::GetChild> src);
  static ::fidl::WireResponse<::test_protocolrequest::Parent::GetChild> ToWire(
      fidl::AnyArena& arena,
      ::fidl::Response<::test_protocolrequest::Parent::GetChild> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireResponse<::test_protocolrequest::Parent::GetChild>> {
  using type = ::fidl::Response<::test_protocolrequest::Parent::GetChild>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Response<::test_protocolrequest::Parent::GetChild>> {
  using type = ::fidl::WireResponse<::test_protocolrequest::Parent::GetChild>;
};

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_protocolrequest::Parent::GetChildRequest>,
    ::fidl::Response<::test_protocolrequest::Parent::GetChildRequest>> {
  static ::fidl::Response<::test_protocolrequest::Parent::GetChildRequest>
  ToNatural(
      ::fidl::WireResponse<::test_protocolrequest::Parent::GetChildRequest>
          src);
  static ::fidl::WireResponse<::test_protocolrequest::Parent::GetChildRequest>
  ToWire(fidl::AnyArena& arena,
         ::fidl::Response<::test_protocolrequest::Parent::GetChildRequest> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireResponse<::test_protocolrequest::Parent::GetChildRequest>> {
  using type =
      ::fidl::Response<::test_protocolrequest::Parent::GetChildRequest>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Response<::test_protocolrequest::Parent::GetChildRequest>> {
  using type =
      ::fidl::WireResponse<::test_protocolrequest::Parent::GetChildRequest>;
};
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
