// 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.inheritancewithrecursivedecl/cpp/common_types.h>
#include <fidl/test.inheritancewithrecursivedecl/cpp/markers.h>

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

namespace test_inheritancewithrecursivedecl {

namespace wire {

struct ParentFirstRequest;

struct ChildSecondRequest;

#ifdef __Fuchsia__

struct ParentFirstRequest {
  ::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent> request = {};

  void _CloseHandles();
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

struct ChildSecondRequest {
  ::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent> request = {};

  void _CloseHandles();
};

#endif  // __Fuchsia__

}  // namespace wire
}  // namespace test_inheritancewithrecursivedecl
namespace fidl {

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

template <>
struct TypeTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest> {
  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_inheritancewithrecursivedecl::wire::ParentFirstRequest> : public std::true_type {};
template <>
struct IsWire<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest> : public std::true_type {};
template <>
struct IsStruct<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest>);
static_assert(offsetof(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest, request) == 0);
static_assert(sizeof(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest) == TypeTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest>::kPrimarySize);

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

  static void Encode(
      internal::WireEncoder* encoder, ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest));
    } else {
      internal::WireCodingTraits<::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Encode(encoder, &value->request, 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_inheritancewithrecursivedecl::Parent>, 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_inheritancewithrecursivedecl::wire::ChildSecondRequest> : public std::true_type {};

template <>
struct TypeTraits<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest> {
  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_inheritancewithrecursivedecl::wire::ChildSecondRequest> : public std::true_type {};
template <>
struct IsWire<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest> : public std::true_type {};
template <>
struct IsStruct<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest>);
static_assert(offsetof(::test_inheritancewithrecursivedecl::wire::ChildSecondRequest, request) == 0);
static_assert(sizeof(::test_inheritancewithrecursivedecl::wire::ChildSecondRequest) == TypeTraits<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest>::kPrimarySize);

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

  static void Encode(
      internal::WireEncoder* encoder, ::test_inheritancewithrecursivedecl::wire::ChildSecondRequest* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_inheritancewithrecursivedecl::wire::ChildSecondRequest));
    } else {
      internal::WireCodingTraits<::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Encode(encoder, &value->request, 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_inheritancewithrecursivedecl::Parent>, 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
