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

#include <fidl/test.inheritance/cpp/wire_messaging.h>

#include <memory>

namespace test_inheritance {
[[maybe_unused]] constexpr uint64_t ksuper_foo_Ordinal = 7540745593380780216lu;

[[maybe_unused]] constexpr ::fidl::MessageDynamicFlags ksuper_foo_DynamicFlags =
    ::fidl::MessageDynamicFlags::kStrictMethod;

extern "C" const fidl_type_t test_inheritance_SuperFooRequestTable;

extern "C" const fidl_type_t test_inheritance_SuperFooTopResponseTable;
#ifdef __Fuchsia__
}  // namespace test_inheritance
::fidl::WireResult<::test_inheritance::Super::Foo>::WireResult(
    ::fidl::UnownedClientEnd<::test_inheritance::Super> client,
    ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>*
        request) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>>(
      client.handle(), bytes_.data(), static_cast<uint32_t>(bytes_.size()));
  SetStatus(outgoing);
}

::fidl::WireResult<::test_inheritance::Super::Foo>::WireResult(
    ::fidl::UnownedClientEnd<::test_inheritance::Super> client,
    ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>*
        request,
    zx_time_t deadline) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>>(
      client.handle(), bytes_.data(), static_cast<uint32_t>(bytes_.size()),
      fidl::CallOptions{.deadline = deadline});
  SetStatus(outgoing);
}
namespace test_inheritance {
#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace test_inheritance
::fidl::WireUnownedResult<::test_inheritance::Super::Foo>::WireUnownedResult(
    ::fidl::UnownedClientEnd<::test_inheritance::Super> client_end,
    ::fidl::internal::AnyBufferAllocator& allocator,
    ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>*
        request) {
  constexpr uint32_t buffer_size = ::fidl::SyncClientMethodBufferSizeInChannel<
      ::test_inheritance::Super::Foo>();
  ::fitx::result<::fidl::Error, ::fidl::BufferSpan> allocation =
      allocator.TryAllocate(buffer_size);
  if (!allocation.is_ok()) {
    ::fidl::Status::operator=(allocation.error_value());
    return;
  }
  uint8_t* buffer = allocation->data;
  constexpr uint32_t request_byte_capacity = ::fidl::MaxSizeInChannel<
      ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>,
      ::fidl::MessageDirection::kSending>();
  uint8_t* request_bytes = buffer;
  static_assert(buffer_size > request_byte_capacity);
  uint32_t response_byte_capacity = buffer_size - request_byte_capacity;
  uint8_t* response_bytes = &buffer[request_byte_capacity];

  ::fidl::unstable::UnownedEncodedMessage<
      ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>>
      request_message(request_bytes, request_byte_capacity, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>>(
      client_end.handle(), response_bytes, response_byte_capacity);
  bytes_ = response_bytes;
  ::fidl::Status::operator=(outgoing);
}
namespace test_inheritance {
#endif  // __Fuchsia__

}  // namespace test_inheritance
#ifdef __Fuchsia__

::fidl::internal::WireThenable<::test_inheritance::Super::Foo>
fidl::internal::WireWeakAsyncClientImpl<::test_inheritance::Super>::Foo(
    ::fidl::StringView s) {
  ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>
      _request{s};
  return ::fidl::internal::WireThenable<::test_inheritance::Super::Foo>{
      _client_base(), ::fidl::WriteOptions{},
      ::fidl::internal::AllowUnownedInputRef{}, &_request};
}
::fidl::internal::WireBufferThenable<::test_inheritance::Super::Foo>
fidl::internal::WireWeakAsyncBufferClientImpl<::test_inheritance::Super>::Foo(
    ::fidl::StringView s) {
  constexpr uint32_t _buffer_size =
      ::fidl::AsyncClientMethodBufferSizeInChannel<
          ::test_inheritance::Super::Foo>();
  ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>
      _request{s};
  return ::fidl::internal::WireBufferThenable<::test_inheritance::Super::Foo>{
      _client_base(), ::fidl::WriteOptions{}, _allocator(), _buffer_size,
      &_request};
}

::fidl::WireResult<::test_inheritance::Super::Foo>
fidl::internal::WireWeakSyncClientImpl<::test_inheritance::Super>::Foo(
    ::fidl::StringView s) {
  return _client_base()->MakeSyncCallWith(
      [&](std::shared_ptr<::fidl::internal::AnyTransport> _transport) {
        ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>
            _request{s};
        return ::fidl::WireResult<::test_inheritance::Super::Foo>(
            ::fidl::UnownedClientEnd<::test_inheritance::Super>(
                _transport->get<::fidl::internal::ChannelTransport>()),
            &_request);
      });
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

::fidl::Status
fidl::WireSyncEventHandler<::test_inheritance::Super>::HandleOneEvent(
    ::fidl::UnownedClientEnd<::test_inheritance::Super> client_end) {
  zx_status_t status = client_end.channel()->wait_one(
      ZX_CHANNEL_READABLE | ZX_CHANNEL_PEER_CLOSED, ::zx::time::infinite(),
      nullptr);
  if (status != ZX_OK) {
    return ::fidl::Status::TransportError(
        status, ::fidl::internal::kErrorWaitOneFailed);
  }
  constexpr uint32_t kHandleAllocSize = ([]() constexpr {
    uint32_t x = 0;
    if (x > ZX_CHANNEL_MAX_MSG_HANDLES) {
      x = ZX_CHANNEL_MAX_MSG_HANDLES;
    }
    return x;
  })();
  static_assert(kHandleAllocSize <= ZX_CHANNEL_MAX_MSG_HANDLES);
  ::fidl::internal::InlineMessageBuffer<24> read_storage;
  std::array<zx_handle_t, kHandleAllocSize> read_handles;
  // TODO(fxbug.dev/85734) Remove this channel-specific allocation.
  std::array<fidl_channel_handle_metadata_t, kHandleAllocSize>
      read_handle_metadata;
  ::fidl::IncomingMessage msg = ::fidl::MessageRead(
      zx::unowned_channel(client_end.handle()), read_storage.view(),
      read_handles.data(), read_handle_metadata.data(), kHandleAllocSize,
      ReadOptions{.discardable = true});
  if (msg.status() == ZX_ERR_BUFFER_TOO_SMALL) {
    // Message size is unexpectedly larger than calculated.
    // This can only be due to a newer version of the protocol defining a new
    // event, whose size exceeds the maximum of known events in the current
    // protocol.
    return ::fidl::Status::UnexpectedMessage(
        ZX_ERR_BUFFER_TOO_SMALL,
        ::fidl::internal::kErrorSyncEventBufferTooSmall);
  }
  if (!msg.ok()) {
    return msg;
  }
  fidl_message_header_t* hdr = msg.header();
  switch (hdr->ordinal) {
    default: {
      return ::fidl::Status::UnknownOrdinal();
    }
  }
}

std::optional<::fidl::UnbindInfo>
fidl::internal::WireEventDispatcher<::test_inheritance::Super>::DispatchEvent(
    ::fidl::IncomingMessage& msg,
    ::fidl::internal::IncomingTransportContext transport_context) {
  switch (msg.header()->ordinal) {
    default:
      break;
  }
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::WireServerDispatcher<
    ::test_inheritance::Super>::entries_[] = {
    {
        ::test_inheritance::ksuper_foo_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fidl::unstable::DecodedMessage<
              ::fidl::internal::TransactionalRequest<
                  ::test_inheritance::Super::Foo>>
              decoded{std::move(msg)};
          if (unlikely(!decoded.ok())) {
            return decoded.status();
          }
          auto* primary = &decoded.PrimaryObject()->body;
          ::fidl::internal::WireCompleter<::test_inheritance::Super::Foo>::Sync
              completer(txn);
          reinterpret_cast<::fidl::WireServer<::test_inheritance::Super>*>(
              interface)
              ->Foo(primary, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::WireServerDispatcher<
    ::test_inheritance::Super>::entries_end_ = &entries_[1];

::fidl::DispatchResult
fidl::internal::WireServerDispatcher<::test_inheritance::Super>::TryDispatch(
    ::fidl::WireServer<::test_inheritance::Super>* impl,
    ::fidl::IncomingMessage& msg,
    internal::IncomingTransportContext transport_context,
    ::fidl::Transaction* txn) {
  return ::fidl::internal::TryDispatch(impl, msg, std::move(transport_context),
                                       txn, entries_, entries_end_);
}

void fidl::internal::WireServerDispatcher<::test_inheritance::Super>::Dispatch(
    ::fidl::WireServer<::test_inheritance::Super>* impl,
    ::fidl::IncomingMessage&& msg,
    internal::IncomingTransportContext transport_context,
    ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::WireServer<::test_inheritance::Super>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::WireServerDispatcher<::test_inheritance::Super>::Dispatch(
      this, std::move(msg), std::move(transport_context), txn);
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__
void fidl::internal::WireCompleterImpl<::test_inheritance::Super::Foo>::Reply(
    int64_t y) {
  ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>
      _response{y};
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>,
      ::fidl::internal::ChannelTransport>
      _response_message{::fidl::internal::AllowUnownedInputRef{}, &_response};
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}

void fidl::internal::WireBufferCompleterImpl<
    ::test_inheritance::Super::Foo>::Reply(int64_t y) {
  ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>
      _response{y};
  constexpr uint32_t _buffer_size =
      ::fidl::ServerReplyBufferSizeInChannel<::test_inheritance::Super::Foo>();
  ::fitx::result<::fidl::Error, ::fidl::BufferSpan> _allocation =
      _allocator().TryAllocate(_buffer_size);
  if (!_allocation.is_ok()) {
    ::fidl::OutgoingMessage _failure{_allocation.error_value()};
    return _core()->SendReply(&_failure,
                              ::fidl::internal::OutgoingTransportContext());
  }
  ::fidl::unstable::UnownedEncodedMessage<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>,
      ::fidl::internal::ChannelTransport>
      _response_message(_allocation->data, _buffer_size, &_response);
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}
#endif  // __Fuchsia__

void ::fidl::internal::TransactionalRequest<
    ::test_inheritance::Super::Foo>::_InitHeader() {
  ::fidl::InitTxnHeader(&header, 0, ::test_inheritance::ksuper_foo_Ordinal,
                        ::test_inheritance::ksuper_foo_DynamicFlags);
}

void ::fidl::internal::TransactionalResponse<
    ::test_inheritance::Super::Foo>::_InitHeader() {
  ::fidl::InitTxnHeader(&header, 0, ::test_inheritance::ksuper_foo_Ordinal,
                        ::test_inheritance::ksuper_foo_DynamicFlags);
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__

namespace test_inheritance {
[[maybe_unused]] constexpr uint64_t ksub_foo_Ordinal = 7540745593380780216lu;

[[maybe_unused]] constexpr ::fidl::MessageDynamicFlags ksub_foo_DynamicFlags =
    ::fidl::MessageDynamicFlags::kStrictMethod;

extern "C" const fidl_type_t test_inheritance_SuperFooRequestTable;

extern "C" const fidl_type_t test_inheritance_SuperFooTopResponseTable;
#ifdef __Fuchsia__
}  // namespace test_inheritance
::fidl::WireResult<::test_inheritance::Sub::Foo>::WireResult(
    ::fidl::UnownedClientEnd<::test_inheritance::Sub> client,
    ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>*
        request) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>>(
      client.handle(), bytes_.data(), static_cast<uint32_t>(bytes_.size()));
  SetStatus(outgoing);
}

::fidl::WireResult<::test_inheritance::Sub::Foo>::WireResult(
    ::fidl::UnownedClientEnd<::test_inheritance::Sub> client,
    ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>*
        request,
    zx_time_t deadline) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>,
      ::fidl::internal::ChannelTransport>
      request_message(::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>>(
      client.handle(), bytes_.data(), static_cast<uint32_t>(bytes_.size()),
      fidl::CallOptions{.deadline = deadline});
  SetStatus(outgoing);
}
namespace test_inheritance {
#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace test_inheritance
::fidl::WireUnownedResult<::test_inheritance::Sub::Foo>::WireUnownedResult(
    ::fidl::UnownedClientEnd<::test_inheritance::Sub> client_end,
    ::fidl::internal::AnyBufferAllocator& allocator,
    ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>*
        request) {
  constexpr uint32_t buffer_size = ::fidl::SyncClientMethodBufferSizeInChannel<
      ::test_inheritance::Sub::Foo>();
  ::fitx::result<::fidl::Error, ::fidl::BufferSpan> allocation =
      allocator.TryAllocate(buffer_size);
  if (!allocation.is_ok()) {
    ::fidl::Status::operator=(allocation.error_value());
    return;
  }
  uint8_t* buffer = allocation->data;
  constexpr uint32_t request_byte_capacity = ::fidl::MaxSizeInChannel<
      ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>,
      ::fidl::MessageDirection::kSending>();
  uint8_t* request_bytes = buffer;
  static_assert(buffer_size > request_byte_capacity);
  uint32_t response_byte_capacity = buffer_size - request_byte_capacity;
  uint8_t* response_bytes = &buffer[request_byte_capacity];

  ::fidl::unstable::UnownedEncodedMessage<
      ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>>
      request_message(request_bytes, request_byte_capacity, request);
  auto& outgoing = request_message.GetOutgoingMessage();
  outgoing.Call<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>>(
      client_end.handle(), response_bytes, response_byte_capacity);
  bytes_ = response_bytes;
  ::fidl::Status::operator=(outgoing);
}
namespace test_inheritance {
#endif  // __Fuchsia__

}  // namespace test_inheritance
#ifdef __Fuchsia__

::fidl::internal::WireThenable<::test_inheritance::Sub::Foo>
fidl::internal::WireWeakAsyncClientImpl<::test_inheritance::Sub>::Foo(
    ::fidl::StringView s) {
  ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo> _request{
      s};
  return ::fidl::internal::WireThenable<::test_inheritance::Sub::Foo>{
      _client_base(), ::fidl::WriteOptions{},
      ::fidl::internal::AllowUnownedInputRef{}, &_request};
}
::fidl::internal::WireBufferThenable<::test_inheritance::Sub::Foo>
fidl::internal::WireWeakAsyncBufferClientImpl<::test_inheritance::Sub>::Foo(
    ::fidl::StringView s) {
  constexpr uint32_t _buffer_size =
      ::fidl::AsyncClientMethodBufferSizeInChannel<
          ::test_inheritance::Sub::Foo>();
  ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo> _request{
      s};
  return ::fidl::internal::WireBufferThenable<::test_inheritance::Sub::Foo>{
      _client_base(), ::fidl::WriteOptions{}, _allocator(), _buffer_size,
      &_request};
}

::fidl::WireResult<::test_inheritance::Sub::Foo>
fidl::internal::WireWeakSyncClientImpl<::test_inheritance::Sub>::Foo(
    ::fidl::StringView s) {
  return _client_base()->MakeSyncCallWith(
      [&](std::shared_ptr<::fidl::internal::AnyTransport> _transport) {
        ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>
            _request{s};
        return ::fidl::WireResult<::test_inheritance::Sub::Foo>(
            ::fidl::UnownedClientEnd<::test_inheritance::Sub>(
                _transport->get<::fidl::internal::ChannelTransport>()),
            &_request);
      });
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

::fidl::Status
fidl::WireSyncEventHandler<::test_inheritance::Sub>::HandleOneEvent(
    ::fidl::UnownedClientEnd<::test_inheritance::Sub> client_end) {
  zx_status_t status = client_end.channel()->wait_one(
      ZX_CHANNEL_READABLE | ZX_CHANNEL_PEER_CLOSED, ::zx::time::infinite(),
      nullptr);
  if (status != ZX_OK) {
    return ::fidl::Status::TransportError(
        status, ::fidl::internal::kErrorWaitOneFailed);
  }
  constexpr uint32_t kHandleAllocSize = ([]() constexpr {
    uint32_t x = 0;
    if (x > ZX_CHANNEL_MAX_MSG_HANDLES) {
      x = ZX_CHANNEL_MAX_MSG_HANDLES;
    }
    return x;
  })();
  static_assert(kHandleAllocSize <= ZX_CHANNEL_MAX_MSG_HANDLES);
  ::fidl::internal::InlineMessageBuffer<24> read_storage;
  std::array<zx_handle_t, kHandleAllocSize> read_handles;
  // TODO(fxbug.dev/85734) Remove this channel-specific allocation.
  std::array<fidl_channel_handle_metadata_t, kHandleAllocSize>
      read_handle_metadata;
  ::fidl::IncomingMessage msg = ::fidl::MessageRead(
      zx::unowned_channel(client_end.handle()), read_storage.view(),
      read_handles.data(), read_handle_metadata.data(), kHandleAllocSize,
      ReadOptions{.discardable = true});
  if (msg.status() == ZX_ERR_BUFFER_TOO_SMALL) {
    // Message size is unexpectedly larger than calculated.
    // This can only be due to a newer version of the protocol defining a new
    // event, whose size exceeds the maximum of known events in the current
    // protocol.
    return ::fidl::Status::UnexpectedMessage(
        ZX_ERR_BUFFER_TOO_SMALL,
        ::fidl::internal::kErrorSyncEventBufferTooSmall);
  }
  if (!msg.ok()) {
    return msg;
  }
  fidl_message_header_t* hdr = msg.header();
  switch (hdr->ordinal) {
    default: {
      return ::fidl::Status::UnknownOrdinal();
    }
  }
}

std::optional<::fidl::UnbindInfo>
fidl::internal::WireEventDispatcher<::test_inheritance::Sub>::DispatchEvent(
    ::fidl::IncomingMessage& msg,
    ::fidl::internal::IncomingTransportContext transport_context) {
  switch (msg.header()->ordinal) {
    default:
      break;
  }
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::WireServerDispatcher<
    ::test_inheritance::Sub>::entries_[] = {
    {
        ::test_inheritance::ksub_foo_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fidl::unstable::DecodedMessage<
              ::fidl::internal::TransactionalRequest<
                  ::test_inheritance::Sub::Foo>>
              decoded{std::move(msg)};
          if (unlikely(!decoded.ok())) {
            return decoded.status();
          }
          auto* primary = &decoded.PrimaryObject()->body;
          ::fidl::internal::WireCompleter<::test_inheritance::Sub::Foo>::Sync
              completer(txn);
          reinterpret_cast<::fidl::WireServer<::test_inheritance::Sub>*>(
              interface)
              ->Foo(primary, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::WireServerDispatcher<
    ::test_inheritance::Sub>::entries_end_ = &entries_[1];

::fidl::DispatchResult
fidl::internal::WireServerDispatcher<::test_inheritance::Sub>::TryDispatch(
    ::fidl::WireServer<::test_inheritance::Sub>* impl,
    ::fidl::IncomingMessage& msg,
    internal::IncomingTransportContext transport_context,
    ::fidl::Transaction* txn) {
  return ::fidl::internal::TryDispatch(impl, msg, std::move(transport_context),
                                       txn, entries_, entries_end_);
}

void fidl::internal::WireServerDispatcher<::test_inheritance::Sub>::Dispatch(
    ::fidl::WireServer<::test_inheritance::Sub>* impl,
    ::fidl::IncomingMessage&& msg,
    internal::IncomingTransportContext transport_context,
    ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::WireServer<::test_inheritance::Sub>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::WireServerDispatcher<::test_inheritance::Sub>::Dispatch(
      this, std::move(msg), std::move(transport_context), txn);
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__
void fidl::internal::WireCompleterImpl<::test_inheritance::Sub::Foo>::Reply(
    int64_t y) {
  ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>
      _response{y};
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>,
      ::fidl::internal::ChannelTransport>
      _response_message{::fidl::internal::AllowUnownedInputRef{}, &_response};
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}

void fidl::internal::WireBufferCompleterImpl<
    ::test_inheritance::Sub::Foo>::Reply(int64_t y) {
  ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>
      _response{y};
  constexpr uint32_t _buffer_size =
      ::fidl::ServerReplyBufferSizeInChannel<::test_inheritance::Sub::Foo>();
  ::fitx::result<::fidl::Error, ::fidl::BufferSpan> _allocation =
      _allocator().TryAllocate(_buffer_size);
  if (!_allocation.is_ok()) {
    ::fidl::OutgoingMessage _failure{_allocation.error_value()};
    return _core()->SendReply(&_failure,
                              ::fidl::internal::OutgoingTransportContext());
  }
  ::fidl::unstable::UnownedEncodedMessage<
      ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>,
      ::fidl::internal::ChannelTransport>
      _response_message(_allocation->data, _buffer_size, &_response);
  return _core()->SendReply(&_response_message.GetOutgoingMessage(),
                            ::fidl::internal::OutgoingTransportContext());
}
#endif  // __Fuchsia__

void ::fidl::internal::TransactionalRequest<
    ::test_inheritance::Sub::Foo>::_InitHeader() {
  ::fidl::InitTxnHeader(&header, 0, ::test_inheritance::ksub_foo_Ordinal,
                        ::test_inheritance::ksub_foo_DynamicFlags);
}

void ::fidl::internal::TransactionalResponse<
    ::test_inheritance::Sub::Foo>::_InitHeader() {
  ::fidl::InitTxnHeader(&header, 0, ::test_inheritance::ksub_foo_Ordinal,
                        ::test_inheritance::ksub_foo_DynamicFlags);
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
