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

#pragma once

#include <fidl/test.inheritance/cpp/markers.h>
#include <fidl/test.inheritance/cpp/natural_types.h>
#include <fidl/test.inheritance/cpp/wire_messaging.h>
#include <lib/fidl/cpp/channel.h>
#include <lib/fidl/cpp/client.h>
#include <lib/fidl/cpp/internal/thenable.h>
#include <lib/fidl/cpp/natural_types.h>
#include <lib/fidl/cpp/unified_messaging.h>

namespace fidl {}  // namespace fidl
template <>
struct ::fidl::internal::NaturalMethodTypes<::test_inheritance::Super::Foo> {
  using Completer = fidl::Completer<
      ::fidl::internal::NaturalCompleterBase<::test_inheritance::Super::Foo>>;

  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_inheritance::Super::Foo>&)>;

  static constexpr bool HasApplicationError = false;

  static constexpr bool IsAbsentBody = false;
};
namespace test_inheritance {
__LOCAL extern "C" const fidl_type_t test_inheritance_SuperFooRequestTable;
__LOCAL extern "C" const fidl_type_t test_inheritance_SuperFooTopResponseTable;

#ifdef __Fuchsia__
}  // namespace test_inheritance

template <>
class ::fidl::Response<::test_inheritance::Super::Foo> final
    : public ::test_inheritance::SuperFooTopResponse {
 public:
  using ::test_inheritance::SuperFooTopResponse::SuperFooTopResponse;
  Response(::test_inheritance::SuperFooTopResponse v)
      : SuperFooTopResponse(std::move(v)) {}
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Response<::test_inheritance::Super::Foo>>
    final {
 public:
  static constexpr bool kHasPayload = true;
  using Payload = ::test_inheritance::SuperFooTopResponse;
};
namespace test_inheritance {}  // namespace test_inheritance
template <>
class ::fidl::Result<::test_inheritance::Super::Foo> final
    : public ::fitx::result<::fidl::Error,
                            ::test_inheritance::SuperFooTopResponse> {
 public:
  using ::fitx::result<::fidl::Error,
                       ::test_inheritance::SuperFooTopResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::internal::NaturalClientImpl<::test_inheritance::Super> final
    : public ::fidl::internal::NaturalClientBase {
 public:
  using NaturalClientBase::NaturalClientBase;
  ::fidl::internal::NaturalThenable<::test_inheritance::Super::Foo> Foo(
      ::fidl::Request<::test_inheritance::Super::Foo> request) const;
};
namespace test_inheritance {
#endif  // __Fuchsia__

}  // namespace test_inheritance
#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalEventHandlerInterface<
    ::test_inheritance::Super> {
 public:
  NaturalEventHandlerInterface() = default;
  virtual ~NaturalEventHandlerInterface() = default;
};

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

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

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

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

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

#ifdef __Fuchsia__

template <>
class ::fidl::Request<::test_inheritance::Super::Foo> final
    : public ::test_inheritance::SuperFooRequest {
 public:
  using ::test_inheritance::SuperFooRequest::SuperFooRequest;
  Request(::test_inheritance::SuperFooRequest v)
      : ::test_inheritance::SuperFooRequest(std::move(v)) {}
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Request<::test_inheritance::Super::Foo>>
    final {
 public:
  static constexpr bool kHasPayload = true;
  using Payload = ::test_inheritance::SuperFooRequest;
};
#endif  // __Fuchsia__

template <>
class ::fidl::internal::NaturalCompleterBase<::test_inheritance::Super::Foo>
    : public ::fidl::CompleterBase {
 public:
  void Reply(::fidl::Response<::test_inheritance::Super::Foo>&& response);

 protected:
  using ::fidl::CompleterBase::CompleterBase;
};

template <>
class ::fidl::Server<::test_inheritance::Super>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  Server() = default;
  virtual ~Server() = default;

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

  using FooRequest = ::fidl::Request<::test_inheritance::Super::Foo>;
  using FooCompleter =
      ::fidl::internal::NaturalCompleter<::test_inheritance::Super::Foo>;

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

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::NaturalServerDispatcher<::test_inheritance::Super>
    final {
  NaturalServerDispatcher() = delete;
  static void Dispatch(::fidl::Server<::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::internal::NaturalMethodTypes<::test_inheritance::Sub::Foo> {
  using Completer = fidl::Completer<
      ::fidl::internal::NaturalCompleterBase<::test_inheritance::Sub::Foo>>;

  using ResultCallback =
      ::fit::callback<void(::fidl::Result<::test_inheritance::Sub::Foo>&)>;

  static constexpr bool HasApplicationError = false;

  static constexpr bool IsAbsentBody = false;
};

#ifdef __Fuchsia__

template <>
class ::fidl::Response<::test_inheritance::Sub::Foo> final
    : public ::test_inheritance::SuperFooTopResponse {
 public:
  using ::test_inheritance::SuperFooTopResponse::SuperFooTopResponse;
  Response(::test_inheritance::SuperFooTopResponse v)
      : SuperFooTopResponse(std::move(v)) {}
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Response<::test_inheritance::Sub::Foo>>
    final {
 public:
  static constexpr bool kHasPayload = true;
  using Payload = ::test_inheritance::SuperFooTopResponse;
};
template <>
class ::fidl::Result<::test_inheritance::Sub::Foo> final
    : public ::fitx::result<::fidl::Error,
                            ::test_inheritance::SuperFooTopResponse> {
 public:
  using ::fitx::result<::fidl::Error,
                       ::test_inheritance::SuperFooTopResponse>::result;

 protected:
  Result() = default;
};

template <>
class ::fidl::internal::NaturalClientImpl<::test_inheritance::Sub> final
    : public ::fidl::internal::NaturalClientBase {
 public:
  using NaturalClientBase::NaturalClientBase;
  ::fidl::internal::NaturalThenable<::test_inheritance::Sub::Foo> Foo(
      ::fidl::Request<::test_inheritance::Sub::Foo> request) const;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::NaturalEventHandlerInterface<::test_inheritance::Sub> {
 public:
  NaturalEventHandlerInterface() = default;
  virtual ~NaturalEventHandlerInterface() = default;
};

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

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

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

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

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

#ifdef __Fuchsia__

template <>
class ::fidl::Request<::test_inheritance::Sub::Foo> final
    : public ::test_inheritance::SuperFooRequest {
 public:
  using ::test_inheritance::SuperFooRequest::SuperFooRequest;
  Request(::test_inheritance::SuperFooRequest v)
      : ::test_inheritance::SuperFooRequest(std::move(v)) {}
};

template <>
struct ::fidl::internal::MessageTraits<
    ::fidl::Request<::test_inheritance::Sub::Foo>>
    final {
 public:
  static constexpr bool kHasPayload = true;
  using Payload = ::test_inheritance::SuperFooRequest;
};
#endif  // __Fuchsia__

template <>
class ::fidl::internal::NaturalCompleterBase<::test_inheritance::Sub::Foo>
    : public ::fidl::CompleterBase {
 public:
  void Reply(::fidl::Response<::test_inheritance::Sub::Foo>&& response);

 protected:
  using ::fidl::CompleterBase::CompleterBase;
};

template <>
class ::fidl::Server<::test_inheritance::Sub>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  Server() = default;
  virtual ~Server() = default;

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

  using FooRequest = ::fidl::Request<::test_inheritance::Sub::Foo>;
  using FooCompleter =
      ::fidl::internal::NaturalCompleter<::test_inheritance::Sub::Foo>;

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

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::NaturalServerDispatcher<::test_inheritance::Sub>
    final {
  NaturalServerDispatcher() = delete;
  static void Dispatch(::fidl::Server<::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__
