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

// fidl_experiment = output_index_json

#pragma once

#include <lib/fidl/cpp/wire/array.h>
#include <lib/fidl/cpp/wire/envelope.h>
#include <lib/fidl/cpp/wire/internal/framework_err.h>
#include <lib/fidl/cpp/wire/message.h>
#include <lib/fidl/cpp/wire/message_storage.h>
#include <lib/fidl/cpp/wire/object_view.h>
#include <lib/fidl/cpp/wire/string_view.h>
#include <lib/fidl/cpp/wire/traits.h>
#include <lib/fidl/cpp/wire/wire_types.h>
#include <lib/stdcompat/optional.h>

#include <cinttypes>
#ifdef __Fuchsia__
#include <lib/zx/channel.h>

#endif  // __Fuchsia__

#include <fidl/test.protocolrequest/cpp/common_types.h>
#include <fidl/test.protocolrequest/cpp/markers.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace test_protocolrequest {

namespace wire {

struct ParentGetChildResponse;

struct ParentGetChildRequestResponse;

struct ParentTakeChildRequest;

struct ParentTakeChildRequestRequest;

#ifdef __Fuchsia__

struct ParentGetChildResponse {
  ::fidl::ClientEnd<::test_protocolrequest::Child> c = {};

  void _CloseHandles();
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

struct ParentGetChildRequestResponse {
  ::fidl::ServerEnd<::test_protocolrequest::Child> r = {};

  void _CloseHandles();
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

struct ParentTakeChildRequest {
  ::fidl::ClientEnd<::test_protocolrequest::Child> c = {};

  void _CloseHandles();
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

struct ParentTakeChildRequestRequest {
  ::fidl::ServerEnd<::test_protocolrequest::Child> r = {};

  void _CloseHandles();
};

#endif  // __Fuchsia__

}  // namespace wire
}  // namespace test_protocolrequest
namespace fidl {

#ifdef __Fuchsia__
template <>
struct IsResource<::test_protocolrequest::wire::ParentGetChildResponse> : public std::true_type {};

template <>
struct TypeTraits<::test_protocolrequest::wire::ParentGetChildResponse> {
  static constexpr uint32_t kMaxNumHandles = 1;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 4;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<::test_protocolrequest::wire::ParentGetChildResponse> : public std::true_type {};
template <>
struct IsWire<::test_protocolrequest::wire::ParentGetChildResponse> : public std::true_type {};
template <>
struct IsStruct<::test_protocolrequest::wire::ParentGetChildResponse> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_protocolrequest::wire::ParentGetChildResponse>);
static_assert(offsetof(::test_protocolrequest::wire::ParentGetChildResponse, c) == 0);
static_assert(sizeof(::test_protocolrequest::wire::ParentGetChildResponse) == TypeTraits<::test_protocolrequest::wire::ParentGetChildResponse>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_protocolrequest::wire::ParentGetChildResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<::fidl::ClientEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>());
  static constexpr bool kHasPadding = false;
  using Base = WireStructCodingTraitsBase<::test_protocolrequest::wire::ParentGetChildResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_protocolrequest::wire::ParentGetChildResponse* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_protocolrequest::wire::ParentGetChildResponse));
    } else {
      internal::WireCodingTraits<::fidl::ClientEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Encode(encoder, &value->c, position + 0, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<::fidl::ClientEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
    }
  }
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsResource<::test_protocolrequest::wire::ParentGetChildRequestResponse> : public std::true_type {};

template <>
struct TypeTraits<::test_protocolrequest::wire::ParentGetChildRequestResponse> {
  static constexpr uint32_t kMaxNumHandles = 1;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 4;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<::test_protocolrequest::wire::ParentGetChildRequestResponse> : public std::true_type {};
template <>
struct IsWire<::test_protocolrequest::wire::ParentGetChildRequestResponse> : public std::true_type {};
template <>
struct IsStruct<::test_protocolrequest::wire::ParentGetChildRequestResponse> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_protocolrequest::wire::ParentGetChildRequestResponse>);
static_assert(offsetof(::test_protocolrequest::wire::ParentGetChildRequestResponse, r) == 0);
static_assert(sizeof(::test_protocolrequest::wire::ParentGetChildRequestResponse) == TypeTraits<::test_protocolrequest::wire::ParentGetChildRequestResponse>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_protocolrequest::wire::ParentGetChildRequestResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<::fidl::ServerEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>());
  static constexpr bool kHasPadding = false;
  using Base = WireStructCodingTraitsBase<::test_protocolrequest::wire::ParentGetChildRequestResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_protocolrequest::wire::ParentGetChildRequestResponse* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_protocolrequest::wire::ParentGetChildRequestResponse));
    } else {
      internal::WireCodingTraits<::fidl::ServerEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Encode(encoder, &value->r, position + 0, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<::fidl::ServerEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
    }
  }
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsResource<::test_protocolrequest::wire::ParentTakeChildRequest> : public std::true_type {};

template <>
struct TypeTraits<::test_protocolrequest::wire::ParentTakeChildRequest> {
  static constexpr uint32_t kMaxNumHandles = 1;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 4;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<::test_protocolrequest::wire::ParentTakeChildRequest> : public std::true_type {};
template <>
struct IsWire<::test_protocolrequest::wire::ParentTakeChildRequest> : public std::true_type {};
template <>
struct IsStruct<::test_protocolrequest::wire::ParentTakeChildRequest> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_protocolrequest::wire::ParentTakeChildRequest>);
static_assert(offsetof(::test_protocolrequest::wire::ParentTakeChildRequest, c) == 0);
static_assert(sizeof(::test_protocolrequest::wire::ParentTakeChildRequest) == TypeTraits<::test_protocolrequest::wire::ParentTakeChildRequest>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_protocolrequest::wire::ParentTakeChildRequest, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<::fidl::ClientEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>());
  static constexpr bool kHasPadding = false;
  using Base = WireStructCodingTraitsBase<::test_protocolrequest::wire::ParentTakeChildRequest, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_protocolrequest::wire::ParentTakeChildRequest* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_protocolrequest::wire::ParentTakeChildRequest));
    } else {
      internal::WireCodingTraits<::fidl::ClientEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Encode(encoder, &value->c, position + 0, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<::fidl::ClientEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
    }
  }
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsResource<::test_protocolrequest::wire::ParentTakeChildRequestRequest> : public std::true_type {};

template <>
struct TypeTraits<::test_protocolrequest::wire::ParentTakeChildRequestRequest> {
  static constexpr uint32_t kMaxNumHandles = 1;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 4;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<::test_protocolrequest::wire::ParentTakeChildRequestRequest> : public std::true_type {};
template <>
struct IsWire<::test_protocolrequest::wire::ParentTakeChildRequestRequest> : public std::true_type {};
template <>
struct IsStruct<::test_protocolrequest::wire::ParentTakeChildRequestRequest> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_protocolrequest::wire::ParentTakeChildRequestRequest>);
static_assert(offsetof(::test_protocolrequest::wire::ParentTakeChildRequestRequest, r) == 0);
static_assert(sizeof(::test_protocolrequest::wire::ParentTakeChildRequestRequest) == TypeTraits<::test_protocolrequest::wire::ParentTakeChildRequestRequest>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_protocolrequest::wire::ParentTakeChildRequestRequest, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<::fidl::ServerEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>());
  static constexpr bool kHasPadding = false;
  using Base = WireStructCodingTraitsBase<::test_protocolrequest::wire::ParentTakeChildRequestRequest, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_protocolrequest::wire::ParentTakeChildRequestRequest* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_protocolrequest::wire::ParentTakeChildRequestRequest));
    } else {
      internal::WireCodingTraits<::fidl::ServerEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Encode(encoder, &value->r, position + 0, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<::fidl::ServerEnd<::test_protocolrequest::Child>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
    }
  }
};

#endif  // __Fuchsia__

#pragma clang diagnostic pop

}  // namespace fidl
