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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.inheritancewithrecursivedecl/cpp/markers.h>
#include <fidl/test.inheritancewithrecursivedecl/cpp/wire_types.h>
#include <lib/fidl/cpp/wire/wire_messaging.h>

#ifdef __Fuchsia__

#include <lib/fidl/cpp/wire/client.h>
#include <lib/fidl/cpp/wire/connect_service.h>
#include <lib/fidl/cpp/wire/server.h>
#include <lib/fidl/cpp/wire/service_handler.h>
#include <lib/fidl/cpp/wire/sync_call.h>
#include <lib/fidl/cpp/wire/unknown_interaction_handler.h>

#endif  // __Fuchsia__

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

namespace test_inheritancewithrecursivedecl {

class Parent;

class Child;

}  // namespace test_inheritancewithrecursivedecl

template <>
struct ::fidl::internal::WireOrdinal<::test_inheritancewithrecursivedecl::Parent::First> final {
  static constexpr uint64_t value = 3973163707930985819lu;
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<::test_inheritancewithrecursivedecl::Parent::First> {
  static constexpr bool HasRequestPayload = true;
  using Request = ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest;

  using Completer = fidl::Completer<>;
};

#endif  // __Fuchsia__

namespace test_inheritancewithrecursivedecl {

}  // namespace test_inheritancewithrecursivedecl

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<::test_inheritancewithrecursivedecl::Parent> {
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<::test_inheritancewithrecursivedecl::Parent> final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(::fidl::WireServer<::test_inheritancewithrecursivedecl::Parent>* impl, ::fidl::IncomingHeaderAndMessage& msg,
                                            internal::MessageStorageViewBase* storage_view,
                                            ::fidl::Transaction* txn);
  static void Dispatch(::fidl::WireServer<::test_inheritancewithrecursivedecl::Parent>* impl, ::fidl::IncomingHeaderAndMessage&& msg,
                       internal::MessageStorageViewBase* storage_view,
                       ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
  static constexpr const ::fidl::internal::UnknownMethodHandlerEntry& unknown_method_handler_entry_ =
      ::fidl::internal::UnknownMethodHandlerEntry::kClosedProtocolHandlerEntry;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest body;
  explicit TransactionalRequest(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request)
      : body(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest{std::move(request)}) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  void _CloseHandles() {
    body._CloseHandles();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__

namespace fidl {

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>> : public std::true_type {};
template <>
struct IsResource<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>> : public std::true_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>> {
  static constexpr uint32_t kMaxNumHandles = 1;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>) == TypeTraits<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest) == TypeTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest>::kPrimarySize);
static_assert(offsetof(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest, request) == 0);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace fidl

template <>
struct ::fidl::internal::IncomingEventsHandleStorage<::test_inheritancewithrecursivedecl::Parent> final : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingEventsHandleStorage<::test_inheritancewithrecursivedecl::Parent>> {
 public:
  static constexpr uint32_t kNumHandles = 0;

  ::std::array<zx_handle_t, kNumHandles> handles_;
  ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
};

template <>
struct ::fidl::internal::IncomingEventsStorage<::test_inheritancewithrecursivedecl::Parent> final : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingEventsStorage<::test_inheritancewithrecursivedecl::Parent>> {
 public:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
  ::fidl::internal::IncomingEventsHandleStorage<::test_inheritancewithrecursivedecl::Parent> handles_storage_;
};

template <>
class [[nodiscard]] ::fidl::WireResult<::test_inheritancewithrecursivedecl::Parent::First> final : public ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Parent::First> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Parent> client,
      ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>* request);

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Parent::First>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};

template <>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_inheritancewithrecursivedecl::Parent::First> final : public ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Parent::First> {
 public:
  explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Parent> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First>* request);
  explicit WireUnownedResult(
      ::fit::result<::fidl::Error>&& decoded,
      ::fidl::internal::MessageStorageViewBase* storage_view) : ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Parent::First>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Parent::First>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};

template <>
class ::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Parent> : public ::fidl::internal::BaseEventHandlerInterface {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

template <>
class ::fidl::WireAsyncEventHandler<::test_inheritancewithrecursivedecl::Parent>
    : public ::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Parent>, public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
};

template <>
class ::fidl::WireSyncEventHandler<::test_inheritancewithrecursivedecl::Parent>
    : public ::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Parent>, public ::fidl::internal::SyncEventHandler {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the corresponding virtual
  // method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Parent> client_end);
};

template <>
class ::fidl::internal::WireEventDispatcher<::test_inheritancewithrecursivedecl::Parent> final : public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Parent>> {
 public:
  explicit WireEventDispatcher(::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Parent>* event_handler)
      : IncomingEventDispatcher(event_handler) {}
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a |::fidl::ClientEnd<::test_inheritancewithrecursivedecl::Parent>|,
// avoiding setting up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<::test_inheritancewithrecursivedecl::Parent> final : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::WireSyncClientImpl<::test_inheritancewithrecursivedecl::Parent>> {
 public:
  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus
  First(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request) {
    ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First> _request{std::move(request)};
    return ::fidl::WireResult<::test_inheritancewithrecursivedecl::Parent::First>(_client_end(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Parent> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Parent>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<::test_inheritancewithrecursivedecl::Parent> final : public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireSyncBufferClientImpl<::test_inheritancewithrecursivedecl::Parent>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
  ::fidl::OneWayStatus
  First(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request) {
    ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Parent::First> _request{std::move(request)};
    return ::fidl::WireUnownedResult<::test_inheritancewithrecursivedecl::Parent::First>(_client_end(), _allocator(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Parent> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Parent>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |::fidl::ClientEnd<::test_inheritancewithrecursivedecl::Parent>|
// and |::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>|).
template <>
class ::fidl::WireServer<::test_inheritancewithrecursivedecl::Parent> : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_inheritancewithrecursivedecl::Parent;

  using Handler = fidl::ProtocolHandler<::test_inheritancewithrecursivedecl::Parent>;

  using FirstCompleter = ::fidl::internal::WireCompleter<::test_inheritancewithrecursivedecl::Parent::First>;
  using FirstRequestView = ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest*;

  virtual void First(
      ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest* request,
      FirstCompleter::Sync& completer) = 0;

  // |bind_handler| returns a handler that binds incoming connections to this
  // server implementation.
  //
  // The returned handler borrows the server instance.
  // The server must outlive the provided |dispatcher|. Only after
  // the dispatcher is shutdown will it be safe to destroy the servers.
  // The server should not be moved.
  Handler bind_handler(async_dispatcher_t* dispatcher) {
    return [impl = this, dispatcher = dispatcher](::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent> request) {
      (void)::fidl::BindServer(dispatcher, std::move(request), impl);
    };
  }

 private:
  void dispatch_message(
      ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::MessageStorageViewBase* storage_view) final;
};
namespace fidl {

#endif  // __Fuchsia__

}  // namespace fidl

template <>
struct ::fidl::internal::WireOrdinal<::test_inheritancewithrecursivedecl::Child::First> final {
  static constexpr uint64_t value = 3973163707930985819lu;
};

template <>
struct ::fidl::internal::WireOrdinal<::test_inheritancewithrecursivedecl::Child::Second> final {
  static constexpr uint64_t value = 2545123272820824165lu;
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<::test_inheritancewithrecursivedecl::Child::First> {
  static constexpr bool HasRequestPayload = true;
  using Request = ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest;

  using Completer = fidl::Completer<>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<::test_inheritancewithrecursivedecl::Child::Second> {
  static constexpr bool HasRequestPayload = true;
  using Request = ::test_inheritancewithrecursivedecl::wire::ChildSecondRequest;

  using Completer = fidl::Completer<>;
};

#endif  // __Fuchsia__

namespace test_inheritancewithrecursivedecl {

}  // namespace test_inheritancewithrecursivedecl

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<::test_inheritancewithrecursivedecl::Child> {
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<::test_inheritancewithrecursivedecl::Child> final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(::fidl::WireServer<::test_inheritancewithrecursivedecl::Child>* impl, ::fidl::IncomingHeaderAndMessage& msg,
                                            internal::MessageStorageViewBase* storage_view,
                                            ::fidl::Transaction* txn);
  static void Dispatch(::fidl::WireServer<::test_inheritancewithrecursivedecl::Child>* impl, ::fidl::IncomingHeaderAndMessage&& msg,
                       internal::MessageStorageViewBase* storage_view,
                       ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
  static constexpr const ::fidl::internal::UnknownMethodHandlerEntry& unknown_method_handler_entry_ =
      ::fidl::internal::UnknownMethodHandlerEntry::kClosedProtocolHandlerEntry;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest body;
  explicit TransactionalRequest(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request)
      : body(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest{std::move(request)}) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  void _CloseHandles() {
    body._CloseHandles();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::test_inheritancewithrecursivedecl::wire::ChildSecondRequest body;
  explicit TransactionalRequest(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request)
      : body(::test_inheritancewithrecursivedecl::wire::ChildSecondRequest{std::move(request)}) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  void _CloseHandles() {
    body._CloseHandles();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 4 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest, WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, &value->body, position + sizeof(fidl_message_header_t), recursion_depth);
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    WireCodingTraits<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__

namespace fidl {

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>> : public std::true_type {};
template <>
struct IsResource<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>> : public std::true_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>> {
  static constexpr uint32_t kMaxNumHandles = 1;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>) == TypeTraits<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest) == TypeTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest>::kPrimarySize);
static_assert(offsetof(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest, request) == 0);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>> : public std::true_type {};
template <>
struct IsResource<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>> : public std::true_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>> {
  static constexpr uint32_t kMaxNumHandles = 1;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>) == TypeTraits<::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_inheritancewithrecursivedecl::wire::ChildSecondRequest) == TypeTraits<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest>::kPrimarySize);
static_assert(offsetof(::test_inheritancewithrecursivedecl::wire::ChildSecondRequest, request) == 0);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace fidl

template <>
struct ::fidl::internal::IncomingEventsHandleStorage<::test_inheritancewithrecursivedecl::Child> final : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingEventsHandleStorage<::test_inheritancewithrecursivedecl::Child>> {
 public:
  static constexpr uint32_t kNumHandles = 0;

  ::std::array<zx_handle_t, kNumHandles> handles_;
  ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
};

template <>
struct ::fidl::internal::IncomingEventsStorage<::test_inheritancewithrecursivedecl::Child> final : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingEventsStorage<::test_inheritancewithrecursivedecl::Child>> {
 public:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
  ::fidl::internal::IncomingEventsHandleStorage<::test_inheritancewithrecursivedecl::Child> handles_storage_;
};

template <>
class [[nodiscard]] ::fidl::WireResult<::test_inheritancewithrecursivedecl::Child::First> final : public ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::First> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Child> client,
      ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>* request);

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::First>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};

template <>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_inheritancewithrecursivedecl::Child::First> final : public ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::First> {
 public:
  explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Child> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First>* request);
  explicit WireUnownedResult(
      ::fit::result<::fidl::Error>&& decoded,
      ::fidl::internal::MessageStorageViewBase* storage_view) : ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::First>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::First>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};

template <>
class [[nodiscard]] ::fidl::WireResult<::test_inheritancewithrecursivedecl::Child::Second> final : public ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::Second> {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Child> client,
      ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>* request);

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::Second>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;
};

template <>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_inheritancewithrecursivedecl::Child::Second> final : public ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::Second> {
 public:
  explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Child> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second>* request);
  explicit WireUnownedResult(
      ::fit::result<::fidl::Error>&& decoded,
      ::fidl::internal::MessageStorageViewBase* storage_view) : ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::Second>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_inheritancewithrecursivedecl::Child::Second>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};

template <>
class ::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Child> : public ::fidl::internal::BaseEventHandlerInterface {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

template <>
class ::fidl::WireAsyncEventHandler<::test_inheritancewithrecursivedecl::Child>
    : public ::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Child>, public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
};

template <>
class ::fidl::WireSyncEventHandler<::test_inheritancewithrecursivedecl::Child>
    : public ::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Child>, public ::fidl::internal::SyncEventHandler {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the corresponding virtual
  // method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Child> client_end);
};

template <>
class ::fidl::internal::WireEventDispatcher<::test_inheritancewithrecursivedecl::Child> final : public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Child>> {
 public:
  explicit WireEventDispatcher(::fidl::internal::WireEventHandlerInterface<::test_inheritancewithrecursivedecl::Child>* event_handler)
      : IncomingEventDispatcher(event_handler) {}
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a |::fidl::ClientEnd<::test_inheritancewithrecursivedecl::Child>|,
// avoiding setting up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<::test_inheritancewithrecursivedecl::Child> final : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::WireSyncClientImpl<::test_inheritancewithrecursivedecl::Child>> {
 public:
  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus
  First(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request) {
    ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First> _request{std::move(request)};
    return ::fidl::WireResult<::test_inheritancewithrecursivedecl::Child::First>(_client_end(), &_request);
  }

  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus
  Second(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request) {
    ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second> _request{std::move(request)};
    return ::fidl::WireResult<::test_inheritancewithrecursivedecl::Child::Second>(_client_end(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Child> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Child>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<::test_inheritancewithrecursivedecl::Child> final : public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireSyncBufferClientImpl<::test_inheritancewithrecursivedecl::Child>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
  ::fidl::OneWayStatus
  First(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request) {
    ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::First> _request{std::move(request)};
    return ::fidl::WireUnownedResult<::test_inheritancewithrecursivedecl::Child::First>(_client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
  ::fidl::OneWayStatus
  Second(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request) {
    ::fidl::internal::TransactionalRequest<::test_inheritancewithrecursivedecl::Child::Second> _request{std::move(request)};
    return ::fidl::WireUnownedResult<::test_inheritancewithrecursivedecl::Child::Second>(_client_end(), _allocator(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Child> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_inheritancewithrecursivedecl::Child>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |::fidl::ClientEnd<::test_inheritancewithrecursivedecl::Child>|
// and |::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Child>|).
template <>
class ::fidl::WireServer<::test_inheritancewithrecursivedecl::Child> : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_inheritancewithrecursivedecl::Child;

  using Handler = fidl::ProtocolHandler<::test_inheritancewithrecursivedecl::Child>;

  using FirstCompleter = ::fidl::internal::WireCompleter<::test_inheritancewithrecursivedecl::Child::First>;
  using FirstRequestView = ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest*;

  virtual void First(
      ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest* request,
      FirstCompleter::Sync& completer) = 0;

  using SecondCompleter = ::fidl::internal::WireCompleter<::test_inheritancewithrecursivedecl::Child::Second>;
  using SecondRequestView = ::test_inheritancewithrecursivedecl::wire::ChildSecondRequest*;

  virtual void Second(
      ::test_inheritancewithrecursivedecl::wire::ChildSecondRequest* request,
      SecondCompleter::Sync& completer) = 0;

  // |bind_handler| returns a handler that binds incoming connections to this
  // server implementation.
  //
  // The returned handler borrows the server instance.
  // The server must outlive the provided |dispatcher|. Only after
  // the dispatcher is shutdown will it be safe to destroy the servers.
  // The server should not be moved.
  Handler bind_handler(async_dispatcher_t* dispatcher) {
    return [impl = this, dispatcher = dispatcher](::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Child> request) {
      (void)::fidl::BindServer(dispatcher, std::move(request), impl);
    };
  }

 private:
  void dispatch_message(
      ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::MessageStorageViewBase* storage_view) final;
};
namespace fidl {

#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace fidl

template <>
class ::fidl::internal::WireWeakOnewayClientImpl<::test_inheritancewithrecursivedecl::Parent> : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;

  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus First(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request);
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<::test_inheritancewithrecursivedecl::Parent> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_inheritancewithrecursivedecl::Parent> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_inheritancewithrecursivedecl::Parent> : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;

  // Caller provides the backing storage for FIDL message.
  ::fidl::OneWayStatus First(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request);
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<::test_inheritancewithrecursivedecl::Parent> final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_inheritancewithrecursivedecl::Parent> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<::test_inheritancewithrecursivedecl::Parent> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_inheritancewithrecursivedecl::Parent> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};
namespace fidl {

#endif  // __Fuchsia__

}  // namespace fidl

#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<::test_inheritancewithrecursivedecl::Parent> : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<::test_inheritancewithrecursivedecl::Parent> : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<::test_inheritancewithrecursivedecl::Parent>
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::WireEventSender<::test_inheritancewithrecursivedecl::Parent>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<::test_inheritancewithrecursivedecl::Parent>
    : public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireBufferEventSender<::test_inheritancewithrecursivedecl::Parent>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::WireWeakOnewayClientImpl<::test_inheritancewithrecursivedecl::Child> : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;

  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus First(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request);

  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus Second(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request);
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<::test_inheritancewithrecursivedecl::Child> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_inheritancewithrecursivedecl::Child> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_inheritancewithrecursivedecl::Child> : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;

  // Caller provides the backing storage for FIDL message.
  ::fidl::OneWayStatus First(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request);

  // Caller provides the backing storage for FIDL message.
  ::fidl::OneWayStatus Second(::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>&& request);
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<::test_inheritancewithrecursivedecl::Child> final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_inheritancewithrecursivedecl::Child> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<::test_inheritancewithrecursivedecl::Child> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_inheritancewithrecursivedecl::Child> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<::test_inheritancewithrecursivedecl::Child> : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<::test_inheritancewithrecursivedecl::Child> : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<::test_inheritancewithrecursivedecl::Child>
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::WireEventSender<::test_inheritancewithrecursivedecl::Child>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<::test_inheritancewithrecursivedecl::Child>
    : public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireBufferEventSender<::test_inheritancewithrecursivedecl::Child>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};

#endif  // __Fuchsia__

#pragma clang diagnostic pop
