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

#pragma once

#include <fidl/test.inheritance/cpp/markers.h>
#include <fidl/test.inheritance/cpp/wire_types.h>
#include <lib/fidl/llcpp/wire_messaging.h>

#ifdef __Fuchsia__

#include <lib/fidl/llcpp/client.h>
#include <lib/fidl/llcpp/connect_service.h>
#include <lib/fidl/llcpp/server.h>
#include <lib/fidl/llcpp/service_handler_interface.h>
#include <lib/fidl/llcpp/sync_call.h>

#endif  // __Fuchsia__

namespace test_inheritance {
class Super;

class Sub;

__LOCAL extern "C" const fidl_type_t test_inheritance_SuperFooRequestTable;
__LOCAL extern "C" const fidl_type_t test_inheritance_SuperFooTopResponseTable;
}  // namespace test_inheritance
template <>
struct ::fidl::internal::WireOrdinal<::test_inheritance::Super::Foo> final {
  static constexpr uint64_t value = 7540745593380780216lu;
};

namespace test_inheritance {}  // namespace test_inheritance
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<::test_inheritance::Super> {};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<::test_inheritance::Super> final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_inheritance::Super>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(::fidl::WireServer<::test_inheritance::Super>* impl,
                       ::fidl::IncomingMessage&& msg,
                       internal::IncomingTransportContext transport_context,
                       ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

template <>
struct ::fidl::WireRequest<::test_inheritance::Super::Foo> final
    : public ::test_inheritance::wire::SuperFooRequest {
  explicit WireRequest(::test_inheritance::wire::SuperFooRequest base)
      : ::test_inheritance::wire::SuperFooRequest(std::move(base)) {}
  explicit WireRequest(::fidl::StringView s)
      : ::test_inheritance::wire::SuperFooRequest{.s = std::move(s)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<::test_inheritance::Super::Foo>;
};

template <>
struct ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_inheritance::Super::Foo> body;
  explicit TransactionalRequest(::fidl::StringView s)
      : body(::fidl::WireRequest<::test_inheritance::Super::Foo>(s)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType =
      ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<::test_inheritance::Super::Foo> final
    : public ::test_inheritance::wire::SuperFooTopResponse {
  explicit WireResponse(::test_inheritance::wire::SuperFooTopResponse base)
      : ::test_inheritance::wire::SuperFooTopResponse(std::move(base)) {}
  explicit WireResponse(int64_t y)
      : ::test_inheritance::wire::SuperFooTopResponse{.y = std::move(y)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_inheritance::Super::Foo> body;
  explicit TransactionalResponse(int64_t y)
      : body(::fidl::WireResponse<::test_inheritance::Super::Foo>(y)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<::test_inheritance::Super::Foo> {
  using Completer = fidl::Completer<
      ::fidl::internal::WireCompleterBase<::test_inheritance::Super::Foo>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_inheritance::Super::Foo,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_inheritance::Super::Foo>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_inheritance::Super::Foo,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_inheritance::Super::Foo>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

namespace fidl {

template <>
struct IsFidlType<
    ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<::test_inheritance::Super::Foo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_inheritance::Super::Foo>>
    : public std::false_type {};

template <>
struct TypeTraits<
    ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>> {
  static constexpr const fidl_type_t* kType =
      &::test_inheritance::test_inheritance_SuperFooRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 4294967295;
  static constexpr uint32_t kMaxOutOfLineV1 = 4294967295;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<
                     ::test_inheritance::Super::Foo>) ==
              TypeTraits<::fidl::internal::TransactionalRequest<
                  ::test_inheritance::Super::Foo>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<::test_inheritance::Super::Foo>> {
  static constexpr const fidl_type_t* kType =
      &::test_inheritance::test_inheritance_SuperFooRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 4294967295;
  static constexpr uint32_t kMaxOutOfLineV1 = 4294967295;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(sizeof(::fidl::WireRequest<::test_inheritance::Super::Foo>) ==
              TypeTraits<::fidl::WireRequest<::test_inheritance::Super::Foo>>::
                  kPrimarySize);
static_assert(offsetof(::fidl::WireRequest<::test_inheritance::Super::Foo>,
                       s) == 0);

template <>
struct IsFidlType<
    ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_inheritance::Super::Foo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_inheritance::Super::Foo>>
    : public std::false_type {};

template <>
struct TypeTraits<
    ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>> {
  static constexpr const fidl_type_t* kType =
      &::test_inheritance::test_inheritance_SuperFooTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 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_inheritance::Super::Foo>) ==
              TypeTraits<::fidl::internal::TransactionalResponse<
                  ::test_inheritance::Super::Foo>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<::test_inheritance::Super::Foo>> {
  static constexpr const fidl_type_t* kType =
      &::test_inheritance::test_inheritance_SuperFooTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 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_inheritance::Super::Foo>) ==
              TypeTraits<::fidl::WireResponse<::test_inheritance::Super::Foo>>::
                  kPrimarySize);
static_assert(offsetof(::fidl::WireResponse<::test_inheritance::Super::Foo>,
                       y) == 0);

}  // namespace fidl
namespace test_inheritance {
#ifdef __Fuchsia__
}  // namespace test_inheritance
template <>
class [[nodiscard]] ::fidl::WireResult<::test_inheritance::Super::Foo> final
    : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_inheritance::Super> client,
      ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_inheritance::Super> client,
      ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>*
          request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_inheritance::Super::Foo>* Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<
        ::fidl::WireResponse<::test_inheritance::Super::Foo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>* Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<
        const ::fidl::WireResponse<::test_inheritance::Super::Foo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>* Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<
        ::fidl::WireResponse<::test_inheritance::Super::Foo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>* Unwrap_NEW()
      const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<
        const ::fidl::WireResponse<::test_inheritance::Super::Foo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>& value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>& value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>& value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>& value_NEW()
      const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>* operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>* operator->()
      const {
    return &value();
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>& operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>& operator*()
      const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_inheritance::Super::Foo>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_inheritance::Super> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<::test_inheritance::Super::Foo>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_inheritance::Super::Foo>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_inheritance::Super::Foo>* Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_inheritance::Super::Foo>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>* Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_inheritance::Super::Foo>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>* Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_inheritance::Super::Foo>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>* Unwrap_NEW()
      const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_inheritance::Super::Foo>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>& value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>& value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>& value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>& value_NEW()
      const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>* operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>* operator->()
      const {
    return &value();
  }

  ::fidl::WireResponse<::test_inheritance::Super::Foo>& operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_inheritance::Super::Foo>& operator*()
      const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class ::fidl::internal::WireEventHandlerInterface<::test_inheritance::Super> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

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

template <>
class ::fidl::WireSyncEventHandler<::test_inheritance::Super>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_inheritance::Super> {
 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_inheritance::Super> client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<::test_inheritance::Super> final
    : public ::fidl::internal::IncomingEventDispatcher<
          ::fidl::WireAsyncEventHandler<::test_inheritance::Super>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<::test_inheritance::Super>* event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a |fidl::ClientEnd<::test_inheritance::Super>|,
// avoiding setting up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<::test_inheritance::Super> final
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireSyncClientImpl<::test_inheritance::Super>> {
 public:
  // Allocates 24 bytes of response buffer on the stack. Request is
  // heap-allocated.
  ::fidl::WireResult<::test_inheritance::Super::Foo> Foo(::fidl::StringView s) {
    ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>
        _request{s};
    return ::fidl::WireResult<::test_inheritance::Super::Foo>(_client_end(),
                                                              &_request);
  }

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

template <>
class ::fidl::internal::WireSyncBufferClientImpl<::test_inheritance::Super>
    final : public ::fidl::internal::SyncEndpointBufferVeneer<
                ::fidl::internal::WireSyncBufferClientImpl<
                    ::test_inheritance::Super>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_inheritance::Super::Foo> Foo(
      ::fidl::StringView s) {
    ::fidl::internal::TransactionalRequest<::test_inheritance::Super::Foo>
        _request{s};
    return ::fidl::WireUnownedResult<::test_inheritance::Super::Foo>(
        _client_end(), _allocator(), &_request);
  }

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

template <>
class ::fidl::internal::WireCompleterImpl<::test_inheritance::Super::Foo>
    : public ::fidl::internal::CompleterImplBase<
          ::test_inheritance::Super::Foo> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(int64_t y);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_inheritance::Super::Foo>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(int64_t y);
};

template <>
class ::fidl::internal::WireCompleterBase<::test_inheritance::Super::Foo>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_inheritance::Super::Foo> {
 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<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_inheritance::Super>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

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

  using FooCompleter =
      ::fidl::internal::WireCompleter<::test_inheritance::Super::Foo>;
  using FooRequestView =
      ::fidl::internal::WireRequestView<::test_inheritance::Super::Foo>;

  virtual void Foo(FooRequestView request, FooCompleter::Sync& completer) = 0;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace test_inheritance {
#endif  // __Fuchsia__

}  // namespace test_inheritance
template <>
struct ::fidl::internal::WireOrdinal<::test_inheritance::Sub::Foo> final {
  static constexpr uint64_t value = 7540745593380780216lu;
};

namespace test_inheritance {}  // namespace test_inheritance
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<::test_inheritance::Sub> {};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<::test_inheritance::Sub> final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_inheritance::Sub>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(::fidl::WireServer<::test_inheritance::Sub>* impl,
                       ::fidl::IncomingMessage&& msg,
                       internal::IncomingTransportContext transport_context,
                       ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

template <>
struct ::fidl::WireRequest<::test_inheritance::Sub::Foo> final
    : public ::test_inheritance::wire::SuperFooRequest {
  explicit WireRequest(::test_inheritance::wire::SuperFooRequest base)
      : ::test_inheritance::wire::SuperFooRequest(std::move(base)) {}
  explicit WireRequest(::fidl::StringView s)
      : ::test_inheritance::wire::SuperFooRequest{.s = std::move(s)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<::test_inheritance::Sub::Foo>;
};

template <>
struct ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_inheritance::Sub::Foo> body;
  explicit TransactionalRequest(::fidl::StringView s)
      : body(::fidl::WireRequest<::test_inheritance::Sub::Foo>(s)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType =
      ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<::test_inheritance::Sub::Foo> final
    : public ::test_inheritance::wire::SuperFooTopResponse {
  explicit WireResponse(::test_inheritance::wire::SuperFooTopResponse base)
      : ::test_inheritance::wire::SuperFooTopResponse(std::move(base)) {}
  explicit WireResponse(int64_t y)
      : ::test_inheritance::wire::SuperFooTopResponse{.y = std::move(y)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_inheritance::Sub::Foo> body;
  explicit TransactionalResponse(int64_t y)
      : body(::fidl::WireResponse<::test_inheritance::Sub::Foo>(y)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<::test_inheritance::Sub::Foo> {
  using Completer = fidl::Completer<
      ::fidl::internal::WireCompleterBase<::test_inheritance::Sub::Foo>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_inheritance::Sub::Foo,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_inheritance::Sub::Foo,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

namespace fidl {

template <>
struct IsFidlType<
    ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<::test_inheritance::Sub::Foo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_inheritance::Sub::Foo>>
    : public std::false_type {};

template <>
struct TypeTraits<
    ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>> {
  static constexpr const fidl_type_t* kType =
      &::test_inheritance::test_inheritance_SuperFooRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 4294967295;
  static constexpr uint32_t kMaxOutOfLineV1 = 4294967295;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(
        ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_inheritance::Sub::Foo>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<::test_inheritance::Sub::Foo>> {
  static constexpr const fidl_type_t* kType =
      &::test_inheritance::test_inheritance_SuperFooRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  static constexpr uint32_t kMaxOutOfLine = 4294967295;
  static constexpr uint32_t kMaxOutOfLineV1 = 4294967295;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(sizeof(::fidl::WireRequest<::test_inheritance::Sub::Foo>) ==
              TypeTraits<::fidl::WireRequest<::test_inheritance::Sub::Foo>>::
                  kPrimarySize);
static_assert(offsetof(::fidl::WireRequest<::test_inheritance::Sub::Foo>, s) ==
              0);

template <>
struct IsFidlType<
    ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<::test_inheritance::Sub::Foo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_inheritance::Sub::Foo>>
    : public std::false_type {};

template <>
struct TypeTraits<
    ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>> {
  static constexpr const fidl_type_t* kType =
      &::test_inheritance::test_inheritance_SuperFooTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 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_inheritance::Sub::Foo>) ==
              TypeTraits<::fidl::internal::TransactionalResponse<
                  ::test_inheritance::Sub::Foo>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<::test_inheritance::Sub::Foo>> {
  static constexpr const fidl_type_t* kType =
      &::test_inheritance::test_inheritance_SuperFooTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 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_inheritance::Sub::Foo>) ==
              TypeTraits<::fidl::WireResponse<::test_inheritance::Sub::Foo>>::
                  kPrimarySize);
static_assert(offsetof(::fidl::WireResponse<::test_inheritance::Sub::Foo>, y) ==
              0);

}  // namespace fidl
namespace test_inheritance {
#ifdef __Fuchsia__
}  // namespace test_inheritance
template <>
class [[nodiscard]] ::fidl::WireResult<::test_inheritance::Sub::Foo> final
    : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_inheritance::Sub> client,
      ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_inheritance::Sub> client,
      ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>*
          request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_inheritance::Sub::Foo>* Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<
        ::fidl::WireResponse<::test_inheritance::Sub::Foo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>* Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<
        const ::fidl::WireResponse<::test_inheritance::Sub::Foo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>* Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<
        ::fidl::WireResponse<::test_inheritance::Sub::Foo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>* Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<
        const ::fidl::WireResponse<::test_inheritance::Sub::Foo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>& value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>& value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>& value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>& value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>* operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>* operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>& operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>& operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<::test_inheritance::Sub::Foo>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_inheritance::Sub> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<::test_inheritance::Sub::Foo>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_inheritance::Sub::Foo>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_inheritance::Sub::Foo>* Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_inheritance::Sub::Foo>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>* Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_inheritance::Sub::Foo>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>* Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_inheritance::Sub::Foo>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>* Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_inheritance::Sub::Foo>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>& value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>& value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>& value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>& value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>* operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>* operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_inheritance::Sub::Foo>& operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_inheritance::Sub::Foo>& operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class ::fidl::internal::WireEventHandlerInterface<::test_inheritance::Sub> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

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

template <>
class ::fidl::WireSyncEventHandler<::test_inheritance::Sub>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_inheritance::Sub> {
 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_inheritance::Sub> client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<::test_inheritance::Sub> final
    : public ::fidl::internal::IncomingEventDispatcher<
          ::fidl::WireAsyncEventHandler<::test_inheritance::Sub>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<::test_inheritance::Sub>* event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a |fidl::ClientEnd<::test_inheritance::Sub>|,
// avoiding setting up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<::test_inheritance::Sub> final
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireSyncClientImpl<::test_inheritance::Sub>> {
 public:
  // Allocates 24 bytes of response buffer on the stack. Request is
  // heap-allocated.
  ::fidl::WireResult<::test_inheritance::Sub::Foo> Foo(::fidl::StringView s) {
    ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>
        _request{s};
    return ::fidl::WireResult<::test_inheritance::Sub::Foo>(_client_end(),
                                                            &_request);
  }

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

template <>
class ::fidl::internal::WireSyncBufferClientImpl<::test_inheritance::Sub> final
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireSyncBufferClientImpl<::test_inheritance::Sub>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_inheritance::Sub::Foo> Foo(
      ::fidl::StringView s) {
    ::fidl::internal::TransactionalRequest<::test_inheritance::Sub::Foo>
        _request{s};
    return ::fidl::WireUnownedResult<::test_inheritance::Sub::Foo>(
        _client_end(), _allocator(), &_request);
  }

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

template <>
class ::fidl::internal::WireCompleterImpl<::test_inheritance::Sub::Foo>
    : public ::fidl::internal::CompleterImplBase<::test_inheritance::Sub::Foo> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(int64_t y);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<::test_inheritance::Sub::Foo>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(int64_t y);
};

template <>
class ::fidl::internal::WireCompleterBase<::test_inheritance::Sub::Foo>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<::test_inheritance::Sub::Foo> {
 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<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_inheritance::Sub>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

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

  using FooCompleter =
      ::fidl::internal::WireCompleter<::test_inheritance::Sub::Foo>;
  using FooRequestView =
      ::fidl::internal::WireRequestView<::test_inheritance::Sub::Foo>;

  virtual void Foo(FooRequestView request, FooCompleter::Sync& completer) = 0;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace test_inheritance {
#endif  // __Fuchsia__

}  // namespace test_inheritance
namespace fidl {

#ifdef __Fuchsia__
}  // namespace fidl
template <>
class ::fidl::internal::WireWeakOnewayClientImpl<::test_inheritance::Super>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<::test_inheritance::Super> final
    : public ::fidl::internal::WireWeakOnewayClientImpl<
          ::test_inheritance::Super> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  // The request and callback are allocated on the heap.
  ::fidl::internal::WireThenable<::test_inheritance::Super::Foo> Foo(
      ::fidl::StringView s);
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<
    ::test_inheritance::Super> : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<::test_inheritance::Super>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_inheritance::Super> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<::test_inheritance::Super::Foo> Foo(
      ::fidl::StringView s);
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<::test_inheritance::Super> final
    : public ::fidl::internal::WireWeakOnewayClientImpl<
          ::test_inheritance::Super> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;

  // Allocates 24 bytes of response buffer on the stack. Request is
  // heap-allocated.
  ::fidl::WireResult<::test_inheritance::Super::Foo> Foo(::fidl::StringView s);
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<::test_inheritance::Super>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<::test_inheritance::Super>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<::test_inheritance::Super>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<::test_inheritance::Super>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<::test_inheritance::Super>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<::test_inheritance::Super>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::WireWeakOnewayClientImpl<::test_inheritance::Sub>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<::test_inheritance::Sub> final
    : public ::fidl::internal::WireWeakOnewayClientImpl<
          ::test_inheritance::Sub> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  // The request and callback are allocated on the heap.
  ::fidl::internal::WireThenable<::test_inheritance::Sub::Foo> Foo(
      ::fidl::StringView s);
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<::test_inheritance::Sub>
    : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<::test_inheritance::Sub>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_inheritance::Sub> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<::test_inheritance::Sub::Foo> Foo(
      ::fidl::StringView s);
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<::test_inheritance::Sub> final
    : public ::fidl::internal::WireWeakOnewayClientImpl<
          ::test_inheritance::Sub> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;

  // Allocates 24 bytes of response buffer on the stack. Request is
  // heap-allocated.
  ::fidl::WireResult<::test_inheritance::Sub::Foo> Foo(::fidl::StringView s);
};
#endif  // __Fuchsia__

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

template <>
class ::fidl::internal::WireWeakBufferEventSender<::test_inheritance::Sub>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<::test_inheritance::Sub>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<::test_inheritance::Sub>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<::test_inheritance::Sub>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<::test_inheritance::Sub>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};
#endif  // __Fuchsia__
