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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.emptystruct/cpp/markers.h>
#include <fidl/test.emptystruct/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_emptystruct {

class EmptyProtocol;

}  // namespace test_emptystruct

template <>
struct ::fidl::internal::WireOrdinal<::test_emptystruct::EmptyProtocol::Send> final {
  static constexpr uint64_t value = 1378773277029173000lu;
};

template <>
struct ::fidl::internal::WireOrdinal<::test_emptystruct::EmptyProtocol::Receive> final {
  static constexpr uint64_t value = 2301564782476583487lu;
};

template <>
struct ::fidl::internal::WireOrdinal<::test_emptystruct::EmptyProtocol::SendAndReceive> final {
  static constexpr uint64_t value = 534401212734647530lu;
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<::test_emptystruct::EmptyProtocol::Send> {
  static constexpr bool HasRequestPayload = true;
  using Request = ::test_emptystruct::wire::EmptyProtocolSendRequest;

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<::test_emptystruct::EmptyProtocol::Receive> {
  static constexpr bool HasRequestPayload = true;
  using Request = ::test_emptystruct::wire::EmptyProtocolReceiveRequest;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<::test_emptystruct::EmptyProtocol::SendAndReceive> {
  static constexpr bool HasRequestPayload = true;
  using Request = ::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest;
  using Response = ::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse;

  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<::test_emptystruct::EmptyProtocol::SendAndReceive>>;
  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_emptystruct::EmptyProtocol::SendAndReceive,
      ::fidl::internal::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_emptystruct::EmptyProtocol::SendAndReceive,
      ::fidl::internal::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

namespace test_emptystruct {

}  // namespace test_emptystruct

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<::test_emptystruct::EmptyProtocol> {
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<::test_emptystruct::EmptyProtocol> final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(::fidl::WireServer<::test_emptystruct::EmptyProtocol>* impl, ::fidl::IncomingHeaderAndMessage& msg,
                                            internal::MessageStorageViewBase* storage_view,
                                            ::fidl::Transaction* txn);
  static void Dispatch(::fidl::WireServer<::test_emptystruct::EmptyProtocol>* 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_emptystruct::EmptyProtocol::Send> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::test_emptystruct::wire::EmptyProtocolSendRequest body;
  explicit TransactionalRequest(const ::test_emptystruct::wire::Empty& e)
      : body(::test_emptystruct::wire::EmptyProtocolSendRequest{e}) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 1 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_emptystruct::wire::EmptyProtocolSendRequest, 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_emptystruct::wire::EmptyProtocolSendRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct ::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive> body;

  explicit TransactionalEvent(const ::test_emptystruct::wire::Empty& e)
      : body{e} {
    _InitHeader();
  }

  TransactionalEvent() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public WireStructCodingTraitsBase<::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 1 + sizeof(fidl_message_header_t);

  static void Encode(
      internal::WireEncoder* encoder, ::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive>, 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<::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest body;
  explicit TransactionalRequest(const ::test_emptystruct::wire::Empty& e)
      : body(::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest{e}) {
    _InitHeader();
  }
  TransactionalRequest() {
    _InitHeader();
  }
  using ResponseType = ::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>;

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public WireStructCodingTraitsBase<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 1 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest, 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_emptystruct::wire::EmptyProtocolSendAndReceiveRequest, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

#endif  // __Fuchsia__

template <>
struct ::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive> final : public ::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse {
  explicit WireResponse(::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse base) : ::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse(std::move(base)) {}
  explicit WireResponse(const ::test_emptystruct::wire::Empty& e) : ::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse{.e = std::move(e)} {}
  WireResponse() = default;
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public WireStructCodingTraitsBase<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 1;

  static void Encode(
      internal::WireEncoder* encoder, ::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(
        encoder, value, position, recursion_depth);
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl::internal::WireCodingTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position, recursion_depth);
  }
};

template <>
struct ::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive> final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive> body;
  explicit TransactionalResponse(const ::test_emptystruct::wire::Empty& e)
      : body(::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>(e)) {
    _InitHeader();
  }
  TransactionalResponse() {
    _InitHeader();
  }

 private:
  void _InitHeader();
};

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public WireStructCodingTraitsBase<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 1 + sizeof(fidl_message_header_t);

  static void Encode(internal::WireEncoder* encoder, ::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    *position.As<fidl_message_header_t>() = value->header;
    WireCodingTraits<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, 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<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, WireCodingConstraintEmpty, IsRecursive>::Decode(
        decoder, position + sizeof(fidl_message_header_t), recursion_depth);
  }
};

namespace fidl {

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>> : public std::true_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(1 + 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_emptystruct::EmptyProtocol::Send>) == TypeTraits<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_emptystruct::wire::EmptyProtocolSendRequest) == TypeTraits<::test_emptystruct::wire::EmptyProtocolSendRequest>::kPrimarySize);
static_assert(offsetof(::test_emptystruct::wire::EmptyProtocolSendRequest, e) == 0);

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>> : public std::true_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(1 + 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::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>) == TypeTraits<::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<::test_emptystruct::EmptyProtocol::Receive>, body) == sizeof(fidl_message_header_t));

#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>> : public std::true_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(1 + 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_emptystruct::EmptyProtocol::SendAndReceive>) == TypeTraits<::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>, body) == sizeof(fidl_message_header_t));
static_assert(sizeof(::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest) == TypeTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest>::kPrimarySize);
static_assert(offsetof(::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest, e) == 0);

#endif  // __Fuchsia__

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> : public std::true_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = FIDL_ALIGN(1 + 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::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>) == TypeTraits<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, body) == sizeof(fidl_message_header_t));
template <>
struct TypeTraits<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> {
  static constexpr bool kHasServerToClientBody = true;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 1;
  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::kResponse;
};
static_assert(sizeof(::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>) == TypeTraits<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>>::kPrimarySize);
static_assert(offsetof(::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, e) == 0);
#ifdef __Fuchsia__
}  // namespace fidl

template <>
struct ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> final
    : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>>> {
  static constexpr uint32_t kNumHandles =
      fidl::internal::ClampedHandleCount<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, fidl::MessageDirection::kReceiving>();

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

template <>
struct ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> final
    : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>>> {
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
  ::fidl::internal::IncomingMessageHandleStorage<::fidl::internal::TransactionalResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> handles_storage_;
};
template <>
struct ::fidl::internal::IncomingEventsHandleStorage<::test_emptystruct::EmptyProtocol> final : public ::fidl::internal::ChannelHandleStorageBase<::fidl::internal::IncomingEventsHandleStorage<::test_emptystruct::EmptyProtocol>> {
 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_emptystruct::EmptyProtocol> final : public ::fidl::internal::ChannelMessageStorageBase<::fidl::internal::IncomingEventsStorage<::test_emptystruct::EmptyProtocol>> {
 public:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
  ::fidl::internal::IncomingEventsHandleStorage<::test_emptystruct::EmptyProtocol> handles_storage_;
};

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

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_emptystruct::EmptyProtocol::Send>(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_emptystruct::EmptyProtocol::Send> final : public ::fidl::BaseWireResult<::test_emptystruct::EmptyProtocol::Send> {
 public:
  explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_emptystruct::EmptyProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send>* request);
  explicit WireUnownedResult(
      ::fit::result<::fidl::Error>&& decoded,
      ::fidl::internal::MessageStorageViewBase* storage_view) : ::fidl::BaseWireResult<::test_emptystruct::EmptyProtocol::Send>(::fidl::internal::StatusFromResult(decoded)) {}

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_emptystruct::EmptyProtocol::Send>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};

template <>
struct ::fidl::internal::WireResultUnwrap<::test_emptystruct::EmptyProtocol::SendAndReceive> {
  using Type = ::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>;
};

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

  explicit WireResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_emptystruct::EmptyProtocol::SendAndReceive>(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult& operator=(WireResult&&) = delete;
  WireResult& operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
  ::fidl::DecodedValue<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> decoded_;
};

template <>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_emptystruct::EmptyProtocol::SendAndReceive> final : public ::fidl::BaseWireResult<::test_emptystruct::EmptyProtocol::SendAndReceive> {
 public:
  explicit WireUnownedResult(::fidl::UnownedClientEnd<::test_emptystruct::EmptyProtocol> client_end, ::fidl::internal::AnyBufferAllocator& allocator, ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive>* request);
  explicit WireUnownedResult(::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>* response)
      : ::fidl::BaseWireResult<::test_emptystruct::EmptyProtocol::SendAndReceive>(fidl::Status::Ok()), decoded_(response) {
    ExtractValueFromDecoded(decoded_.pointer());
  }

  explicit WireUnownedResult(
      ::fit::result<::fidl::Error, ::fidl::DecodedValue<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>>>&& decoded,
      ::fidl::internal::MessageStorageViewBase* storage_view) : ::fidl::BaseWireResult<::test_emptystruct::EmptyProtocol::SendAndReceive>(::fidl::internal::StatusFromResult(decoded)) {
    if (decoded.is_ok()) {
      decoded_ = std::move(decoded.value());
      ExtractValueFromDecoded(decoded_.pointer());
    }
  }

  explicit WireUnownedResult(const ::fidl::Status& result) : ::fidl::BaseWireResult<::test_emptystruct::EmptyProtocol::SendAndReceive>(result) {}
  WireUnownedResult(WireUnownedResult&&) = default;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult& operator=(WireUnownedResult&&) = default;
  WireUnownedResult& operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

 private:
  ::fidl::DecodedValue<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>> decoded_;
};

template <>
class ::fidl::internal::WireEventHandlerInterface<::test_emptystruct::EmptyProtocol> : public ::fidl::internal::BaseEventHandlerInterface {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
  virtual void Receive(::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive>* event) = 0;
};

template <>
class ::fidl::WireAsyncEventHandler<::test_emptystruct::EmptyProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<::test_emptystruct::EmptyProtocol>, public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
  void Receive(::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive>* event) override {}
};

template <>
class ::fidl::WireSyncEventHandler<::test_emptystruct::EmptyProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<::test_emptystruct::EmptyProtocol>, 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_emptystruct::EmptyProtocol> client_end);
};

template <>
class ::fidl::internal::WireEventDispatcher<::test_emptystruct::EmptyProtocol> final : public ::fidl::internal::IncomingEventDispatcher<::fidl::internal::WireEventHandlerInterface<::test_emptystruct::EmptyProtocol>> {
 public:
  explicit WireEventDispatcher(::fidl::internal::WireEventHandlerInterface<::test_emptystruct::EmptyProtocol>* event_handler)
      : IncomingEventDispatcher(event_handler) {}
  ::fidl::Status DispatchEvent(
      ::fidl::IncomingHeaderAndMessage& msg,
      ::fidl::internal::MessageStorageViewBase* storage_view) override;
};

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

  // Allocates 48 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::WireResult<::test_emptystruct::EmptyProtocol::SendAndReceive>
  SendAndReceive(const ::test_emptystruct::wire::Empty& e) {
    ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive> _request{e};
    return ::fidl::WireResult<::test_emptystruct::EmptyProtocol::SendAndReceive>(_client_end(), &_request);
  }

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

template <>
class ::fidl::internal::WireSyncBufferClientImpl<::test_emptystruct::EmptyProtocol> final : public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireSyncBufferClientImpl<::test_emptystruct::EmptyProtocol>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
  ::fidl::OneWayStatus
  Send(const ::test_emptystruct::wire::Empty& e) {
    ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::Send> _request{e};
    return ::fidl::WireUnownedResult<::test_emptystruct::EmptyProtocol::Send>(_client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to `.buffer()`.
  ::fidl::WireUnownedResult<::test_emptystruct::EmptyProtocol::SendAndReceive>
  SendAndReceive(const ::test_emptystruct::wire::Empty& e) {
    ::fidl::internal::TransactionalRequest<::test_emptystruct::EmptyProtocol::SendAndReceive> _request{e};
    return ::fidl::WireUnownedResult<::test_emptystruct::EmptyProtocol::SendAndReceive>(_client_end(), _allocator(), &_request);
  }

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

template <>
class ::fidl::internal::WireCompleterImpl<::test_emptystruct::EmptyProtocol::SendAndReceive> : public ::fidl::internal::CompleterImplBase<::test_emptystruct::EmptyProtocol::SendAndReceive> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(const ::test_emptystruct::wire::Empty& e);

 private:
  void MakeReply(const ::test_emptystruct::wire::Empty& e);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_emptystruct::EmptyProtocol::SendAndReceive> : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(const ::test_emptystruct::wire::Empty& e);

 private:
  void MakeReply(const ::test_emptystruct::wire::Empty& e);
};

template <>
class ::fidl::internal::WireCompleterBase<::test_emptystruct::EmptyProtocol::SendAndReceive> : public ::fidl::CompleterBase, public ::fidl::internal::WireCompleterImpl<::test_emptystruct::EmptyProtocol::SendAndReceive> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned, bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

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

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

  using Handler = fidl::ProtocolHandler<::test_emptystruct::EmptyProtocol>;

  using SendCompleter = ::fidl::internal::WireCompleter<::test_emptystruct::EmptyProtocol::Send>;
  using SendRequestView = ::test_emptystruct::wire::EmptyProtocolSendRequest*;

  virtual void Send(
      ::test_emptystruct::wire::EmptyProtocolSendRequest* request,
      SendCompleter::Sync& completer) = 0;

  using SendAndReceiveCompleter = ::fidl::internal::WireCompleter<::test_emptystruct::EmptyProtocol::SendAndReceive>;
  using SendAndReceiveRequestView = ::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest*;

  virtual void SendAndReceive(
      ::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest* request,
      SendAndReceiveCompleter::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_emptystruct::EmptyProtocol> 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_emptystruct::EmptyProtocol> : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;

  // Allocates 40 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::OneWayStatus Send(const ::test_emptystruct::wire::Empty& e);
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<::test_emptystruct::EmptyProtocol> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_emptystruct::EmptyProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  // Allocates 24 bytes of request buffer on the stack. The callback is stored on the heap.
  ::fidl::internal::WireThenable<::test_emptystruct::EmptyProtocol::SendAndReceive> SendAndReceive(const ::test_emptystruct::wire::Empty& e);
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_emptystruct::EmptyProtocol> : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;

  // Caller provides the backing storage for FIDL message.
  ::fidl::OneWayStatus Send(const ::test_emptystruct::wire::Empty& e);
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<::test_emptystruct::EmptyProtocol> final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_emptystruct::EmptyProtocol> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<::test_emptystruct::EmptyProtocol::SendAndReceive> SendAndReceive(const ::test_emptystruct::wire::Empty& e);
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<::test_emptystruct::EmptyProtocol> final : public ::fidl::internal::WireWeakOnewayClientImpl<::test_emptystruct::EmptyProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;

  // Allocates 48 bytes of message buffer on the stack. No heap allocation necessary.
  ::fidl::WireResult<::test_emptystruct::EmptyProtocol::SendAndReceive> SendAndReceive(const ::test_emptystruct::wire::Empty& e);
};
namespace fidl {

#endif  // __Fuchsia__

}  // namespace fidl

#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<::test_emptystruct::EmptyProtocol> : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;

  fidl::OneWayStatus Receive(const ::test_emptystruct::wire::Empty& e);
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<::test_emptystruct::EmptyProtocol> : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;

  fidl::OneWayStatus Receive(const ::test_emptystruct::wire::Empty& e);
};

template <>
class ::fidl::internal::WireEventSender<::test_emptystruct::EmptyProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<::fidl::internal::WireEventSender<::test_emptystruct::EmptyProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

  fidl::OneWayStatus Receive(const ::test_emptystruct::wire::Empty& e);
};

template <>
class ::fidl::internal::WireBufferEventSender<::test_emptystruct::EmptyProtocol>
    : public ::fidl::internal::SyncEndpointBufferVeneer<::fidl::internal::WireBufferEventSender<::test_emptystruct::EmptyProtocol>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;

  fidl::OneWayStatus Receive(const ::test_emptystruct::wire::Empty& e);
};

#endif  // __Fuchsia__

#pragma clang diagnostic pop
